Dokumentation [visa] [redigera] [historik] [rensa sidcachen]


p = {}

local wikidata = require('Modul:Wikidata2').formatStatementsFromLua
local aux = require('Modul:Ortsfakta/Aux').aux

function lankod2lan(lankod)
local lan = ''
if lankod == '01' then lan = 'Stockholm'
	elseif lankod == '03' then lan = 'Uppsala'
	elseif lankod == '04' then lan = 'Södermanland'
	elseif lankod == '05' then lan = 'Östergötland'
	elseif lankod == '06' then lan = 'Jönköping'
	elseif lankod == '07' then lan = 'Kronoberg'
	elseif lankod == '08' then lan = 'Kalmar'
	elseif lankod == '09' then lan = 'Gotland'
	elseif lankod == '10' then lan = 'Blekinge'	
    elseif lankod == '12' then lan = 'Skåne'
    elseif lankod == '13' then lan = 'Halland'
	elseif lankod == '14' then lan = 'Västra Götaland'
	elseif lankod == '17' then lan = 'Värmland'
	elseif lankod == '18' then lan = 'Örebro'
	elseif lankod == '19' then lan = 'Västmanland'
	elseif lankod == '20' then lan = 'Dalarna'
	elseif lankod == '21' then lan = 'Gävleborg'
	elseif lankod == '22' then lan = 'Västernorrland'
	elseif lankod == '23' then lan = 'Jämtland'
	elseif lankod == '24' then lan = 'Västerbotten'
	elseif lankod == '25' then lan = 'Norrbotten'
	else lan = ''
end
return lan
end

function lankod(frame) -- hämtar länskod från i första hand det län och i andra hand den kommun som objektet ingår i
	local           INOM_ADMINISTRATIVT_OMRADE = 'P131'
	local INOM_NUVARANDE_ADMINISTRATIVT_OMRADE = 'P3842'
	local                         SVERIGES_LAN = 'Q200547'
	local                    SVERIGES_KOMMUNER = 'Q127448'
	local                              LANSKOD = 'P507'
	local                  KOMMUNKOD_I_SVERIGE = 'P525'
	local t = {}

	t = wikidata({entityId=frame.args.item, property=INOM_NUVARANDE_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_LAN,raw='ja'}) -- hämta län som objektet ingår i 
	if t and t[1] then 
    	return wikidata({property=LANSKOD,noref='ja',nolink='ja',entityId=t[1].item}) -- returnera länskoden 
	end
	t = wikidata({entityId=frame.args.item, property=INOM_NUVARANDE_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_KOMMUNER,raw='ja'}) -- hämta kommun om län ej var angivet
	if t and t[1] then
		k = wikidata({property=KOMMUNKOD_I_SVERIGE,noref='ja',nolink='ja',entityId=t[1].item,avoidqualifier='P582'})
		if k then 
			return mw.ustring.sub(k,1,2) -- returnera de två första siffrorna i kommunkoden	
		end
	end	
	
	t = wikidata({entityId=frame.args.item, property=INOM_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_LAN,raw='ja'}) -- hämta län som objektet ingår i 
	if t and t[1] then 
    	return wikidata({property=LANSKOD,noref='ja',nolink='ja',entityId=t[1].item}) -- returnera länskoden 
	end
	t = wikidata({entityId=frame.args.item, property=INOM_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_KOMMUNER,raw='ja'}) -- hämta kommun om län ej var angivet
	if t and t[1] then
		k = wikidata({property=KOMMUNKOD_I_SVERIGE,noref='ja',nolink='ja',entityId=t[1].item,avoidqualifier='P582'})
		if k then
			return mw.ustring.sub(k,1,2) -- returnera de två första siffrorna i kommunkoden	
		end
	end
	return ''
 end

function p.positionskartnamn(frame) -- kartbild för länet som objektet tillhör. används av till exempel mallen "Ortsfakta Sverige WD"
   return mw.getCurrentFrame():preprocess('{{Kartposition Sverige '..lankod2lan(lankod(frame))..'|bild}}')
end 

function p.positionskarta(frame) -- kartlokalisering (Geolocator) för länet som objektet tillhör. används av till exempel mallen "Ortsfakta Sverige WD"
	return lankod2lan(lankod(frame))
end

function rat(data, precision)
	local s = {}
	if not data then 
		return s
	end
	s.lat_dec = math.abs(data.latitude)
	s.long_dec = math.abs(data.longitude)
	if data.latitude > 0 then
		s.lat_NS = 'N'
	else
		s.lat_NS = 'S'
	end
	if data.longitude > 0 then
		s.long_EW = 'E'
	else
		s.long_EW = 'W'
	end
	local frac = 0
	local prec = data.precision
	if precision == 'grad' then
		prec = 1
	end
	if precision == 'minut' then
		prec = 0.016666666666667
	end	
	if precision == 'sekund' then
	   	prec = 0.00027777777777778
	end
	if prec < (data.precision or 0) then
	-- TODO, här kan man varna för att den begärda precisionen är "finare" än precisionen som finns i Wikidata	
	-- TODO2, hur bäst ta hänsyn till siffror utan precision?
	end
	
	if prec == 1 then
		s.lat_g, frac = math.modf(math.abs(data.latitude) + 0.5)
		s.long_g, frac = math.modf(math.abs(data.longitude) + 0.5)
	else 
		if prec == 0.016666666666667 then
			s.lat_g, frac = math.modf(math.abs(data.latitude))
			s.lat_m, frac = math.modf(frac * 60 + 0.5)
			if s.lat_m>=60 then
			   s.lat_m = 0
			   s.lat_g = s.lat_g + 1
			end 
			s.long_g, frac = math.modf(math.abs(data.longitude))
			s.long_m, frac = math.modf(frac * 60 + 0.5)
			if s.long_m>=60 then
			   s.long_m = 0
			   s.long_g = s.long_g + 1
			end
		else 
			if prec == 0.00027777777777778 then
				s.lat_g, frac = math.modf(math.abs(data.latitude))
				s.lat_m, frac = math.modf(frac * 60)
				s.lat_s, frac = math.modf(frac * 60 + 0.5)
				if s.lat_s >= 60 then
					s.lat_s = 0
					s.lat_m = s.lat_m + 1
				end
				if s.lat_m >= 60 then
					s.lat_m = 0
					s.lat_g = s.lat_g + 1
				end
				s.long_g, frac = math.modf(math.abs(data.longitude))
				s.long_m, frac = math.modf(frac * 60)
				s.long_s, frac = math.modf(frac * 60 + 0.5)
				if s.long_s >= 60 then
					s.long_s = 0
					s.long_m = s.long_m + 1
				end
			    if s.long_m >= 60 then
			    	s.long_m = 0
			    	s.long_g = s.long_g + 1
			    end
			else
				if prec == 0.000027777777777778 then
					s.lat_g, frac = math.modf(math.abs(data.latitude))
					s.lat_m, frac = math.modf(frac * 60)
					s.lat_s, frac = math.modf(frac * 600 + 0.5)/10
					if s.lat_s >= 60 then
						s.lat_s = 0
						s.lat_m = s.lat_m + 1
					end
					if s.lat_m >= 60 then
						s.lat_m = 0 
						s.lat_g = s.lat_g + 1 
					end
					s.long_g, frac = math.modf(math.abs(data.longitude))
					s.long_m, frac = math.modf(frac * 60)
					s.long_s, frac = math.modf(frac * 600 + 0.5)/10
					if s.long_s >= 60 then
						s.long_s = 0
						s.long_m = s.long_m + 1
					end
					if s.long_m >= 60 then
						s.long_m = 0
						s.long_g = s.long_g + 1
					end
				else
					s.lat_g = math.abs(data.latitude)
					s.long_g = math.abs(data.longitude)
				end
			end
		end
	end
	return s
end

function p.data(frame)
	return data(frame.args)
end

function data(args)
	if args[1] == 'ref' then
		if not args.index then
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518'})
			if data then
				return data[1].ref
			else
				return nil
			end
		else
			local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw ='true'})
			if not vilken or #vilken == 0 then
				return nil
			end
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', rank = 'valid', preferqualifiervalue = vilken[1].item, modifyqualifiertime = 'Y'})
			if not data or #data == 0 then
				return nil
			end
			return data[1].ref
		end
	end
	if args[1] == 'year' then
		if not args.index then
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518', noref='true', modifyqualifiertime = 'Y'})
			if data then
				return data[1].datum
			else
				return nil
			end
		else
			local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true'})
			if not vilken or #vilken == 0 then
				return nil
			end
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', noref='true', rank = 'valid', preferqualifiervalue = vilken[1].item, modifyqualifiertime = 'Y'})
			if not data or #data == 0 then
				return nil
			end
			return data[1].datum
		end
	end
	if args[1] == 'number' then
		if not args.index then
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518', noref='true'})
			if not data then 
				return nil
			end
			local data2 = tostring(data[1].amount)
			if string.sub(data2, 1, 1) == '+' then
				return string.sub(data2, 2)
			else
				return data2
			end
		else
			local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true'})
			if not vilken or #vilken == 0 then
				return nil
			end
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', noref='true', rank = 'valid', preferqualifiervalue = vilken[1].item})
			if not data or #data == 0 then
				return nil
			end
			local data2 = tostring(data[1].amount)
			if string.sub(data2, 1, 1) == '+' then
				return string.sub(data2, 2)
			else
				return data2
			end
		end
	end
	if args[1] == 'unit' then
		if not args.index then
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518', noref='true'})
			if data and #data > 0 then
				return data[1].unit
			else
				return nil
			end
		else
			local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true'})
			if not vilken or #vilken == 0 then
				return nil
			end
			local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', noref='true', rank = 'valid', preferqualifiervalue = vilken[1].item})
			if not data or #data == 0 then
				return nil
			end
			return data[1].unit
		end
	end
	if args[1] == 'plats' then
		local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true', nolink = 'true'})
		if vilken and #vilken > 0 then
			return vilken[1].value
		end
	end
	if args[1] == 'kommun' then
		if tonumber(args.limit) and tonumber(args.limit) > 0 then
			if (wikidata({entityId = args.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ, numberofclaims = 'true'}) or 0) > tonumber(args.limit) then
				return nil
			end
		end
		local s = {}
		local data = wikidata({entityId = args.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index})
		return data
	end
	if args[1] == 'bild' then
		local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'en'})
		if data and #data >0 then 
			data = data[1]
			if data then 
				return data.value
			end
		end

	end
	if args[1] == 'bild2' then
		local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'en'})
		if #data > 1 then 
			data = data[2]
			if data then 
				return data.value
			end
		end

	end
	if args[1] == 'bildtext' then
		local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'sv'})
		if #data > 0 then
			data = data[1]
			if data then
				return data.bildtext
			end
		end
	
	end
	if args[1] == 'bildtext2' then
		local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'sv'})
		if #data > 1 then
			data = data[2]
			if data then
				return data.bildtext
			end
		end
	
	end
	return nil
end

function p.data2(frame)
	local args = frame.args
	local q = data(args)
	local index = tonumber(args.index)
	if q and q ~= '' then
		return q
	end
	local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true', nolink = 'true'})
	local s = {}
	local s2 = ''
	if qw and #qw > 0 then
		for i, j in pairs( qw ) do
			args.item = j.item
			local s1 = 1
			repeat
				args.index = tostring(s1)
				s1 = s1 + 1
				local a = data(args)
				if a and a ~= '' then
					local f = false
					for i2, j2 in pairs(s) do
						if a == j2 then
							f = true
						end
					end
					if not f then
						table.insert(s, a)
					end
				end
			until not a or a == ''
		end
		return s[index]
	end
end
	
		
function p.coord(frame)
	local args = frame.args
	local data = wikidata({entityId = args.item, property = 'P625', raw = 'true', noref='true', enbarten = 'true', nogeodataparser = 'true'})
	if not data or #data == 0 then 
		return nil
	end
	local s = rat(data[1], args.precision or '')
	local a = s.lat_g .. '°'
	if s.lat_m then 
		a = a .. s.lat_m .. '′'
	end
	if s.lat_s then
		a = a .. s.lat_s .. '″'
	end
	a = a .. s.lat_NS
	local a = a .. ',' .. s.long_g .. '°'
	if s.long_m then 
		a = a .. s.long_m .. '′'
	end
	if s.long_s then
		a = a .. s.long_s .. '″'
	end
	a = a .. s.long_EW
	if not args[1] then 
		return a
	end
	return s[args[1]]
end

function auto(args)
	local f = tonumber(data({ 'number', item = args.item, property = 'P1082', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
	local a = tonumber(data({ 'number', item = args.item, property = 'P2046', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
	if not f or not a then 
		return nil
	end
	if a == 0 then 
		return 'NaN'
	end
	local b = f/a
	if b > 100 then
		return math.modf(b+0.5)
	else 
		if b > 10 then
			return math.modf(b*10 + 0.5)/10
		else
			if b < 0.1 then
				return math.modf(b*10000 + 0.5)/10000
			else
				if b < 1 then
					return math.modf(b*1000 + 0.5)/1000
				end
			end
		end
	end		
	return math.modf(b*100 + 0.5)/100	
end

function p.auto(frame)
	local args = frame.args
	return auto(args)
end

function lan(args)
	local s = {}
	local data = wikidata({entityId = args.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ, raw = 'true'})
	if not data then
		return nil
	end
	for i, j in pairs(data) do
		local data2 = {}
		data2 = wikidata({entityId = j.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ2, raw = 'true', nolink = args.nolink})
		for i2, j2 in pairs(data2) do
			local traff = false
			for i3, j3 in pairs(s) do
				if j3 == j2.value then
					traff = true
				end
			end
			if not traff then
				table.insert(s, j2.value)
			end
		end
	end
	if args.index and tonumber(args.index) and tonumber(args.index) <= #s then
		return s[tonumber(args.index)]
	else
		return nil
	end
end

function p.lan(frame)
	local args = frame.args
	return lan(args)
end

function p.bestar(frame)
 	local args = frame.args
 	if args[1] == 'plats2' then
 		local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true', nolink = 'true'})
 		return aux(qw[1].item, qw[1].value) or '-'
 	elseif args[1] == 'auto' then
 		local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true'})
 		if not qw or #qw == 0 then 
 			return nil
 		end
 		return auto({item = qw[1].item})
 	elseif args[1] == 'annat' then
 		local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true'})
 		if not qw or #qw == 0 then 
 			return nil
 		end
		return wikidata({entityId = qw[1].item, property = args.property})
 	else
		local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true'})
		if not qw or #qw == 0 then
			return nil
		end
		return data({ args[1], item = qw[1].item, property = args.property})
	end
end

function p.autom(frame)
	local args = frame.args
	local f = tonumber(data({ 'number', item = args.item, property = 'P1082', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
	local a = tonumber(data({ 'number', item = args.item, property = 'P2046', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
	if not f or not a then 
		return nil
	end
	if a == 0 then 
		return 'NaN'
	end
	local b = f/a
	if b > 100 then
		return math.modf(b+0.5)
	else 
		if b > 10 then
			return math.modf(b*10 + 0.5)/10
		else
			if b < 0.1 then
				return math.modf(b*10000 + 0.5)/10000
			else
				if b < 1 then
					return math.modf(b*1000 + 0.5)/1000
				end
			end
		end
	end		
	return math.modf(b*100 + 0.5)/100	
end

function p.label(frame)
	local l = frame.args.label
	local qid = frame.args.item
	if not l or l == '' then
		if not qid or qid == '' then
			l = mw.wikibase.label()
		else
			l = mw.wikibase.label(qid)
		end
	end
	if not l then
		l = mw.title.getCurrentTitle().text
	end
	return l
end

function p.rat(data, precision)
	return rat(data, precision)
end

return p