Hoppa till innehållet

Modul:Wikidata2: Skillnad mellan sidversioner

Från Wikipedia
Innehåll som raderades Innehåll som lades till
Innocent bystander (Diskussion | Bidrag)
Ingen redigeringssammanfattning
Ainali (Diskussion | Bidrag)
testar med getLabel från meta: https://meta.wikimedia.org/w/index.php?title=Module:Wikidata&oldid=15954095
Rad 1 119: Rad 1 119:


return mw.wikibase.sitelink( id )
return mw.wikibase.sitelink( id )
end

-- Simple for simple templates like {{Q|}}}
function p.getLabel(frame)
local args = frame.args
local entity = args.entity
local lang = args.lang
if lang == '' then
lang = defaultlang
end

if string.sub(entity, 1, 10) == 'Property:P' then
entity = string.sub(entity, 10)
elseif (string.sub(entity, 1, 1) ~= 'P' and string.sub(entity, 1, 1) ~= 'Q') or (not tonumber(string.sub(entity, 2))) then
return i18n('invalid-id')
end

if not args.link or args.link == '' then -- by default: no link
args.link = '-'
end
if args.link == '-' then
return p._getLabel(entity, lang) or i18n('invalid-id')
else
return p.formatEntity(entity, args)
end
end
end



Versionen från 10 augusti 2017 kl. 19.37

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


Modulen används för att hämta formaterad data från Wikidata.

Huvudfunktion

Anrop

Exempel:

{{#invoke:Wikidata2|formatStatements|property=p17}}
{{#invoke:Wikidata2|formatStatements|property=P242|enbarten=ja|noref=ja}}}
{{#invoke:Wikidata2|formatStatements|property=P127|conjunction=<br/>|separator=<br/>|avoidqualifier=P582|noref=noimport}}}}
{{#invoke:Wikidata2|formatStatements|property=P276|sortbytime=inverted|conjunction=<br/>|separator=<br/>|avoidqualifier=P582}}}}

Parametrar

  • property = Obligatorisk parameter som beskriver vilken egenskap som ska hämtas. Exempel: property = P625.
    • om egenskapen anges som Pxxx/Pyyy/.../Pzzz traverseras alla P där alla utom det sista måste ge ett Wikidataobjekt. Observera att endast det första påståendet på varje "nivå" beaktas.
    • om egenskapen anges som Pxxx:Qrrr,Qsss,.../Pyyy:Qttt,Quuu,.../..../Pzzz görs en filtrering så att endast objekt med P31=något av de angivna Q... på respektive nivå beaktas. Använd parametern getonly, se nedan, för att filtrera på den sista nivån.
  • entityId = Det id-nummer den artikel har som du vill hämta egenskap från.
  • entity = Istället för att förse modulen med ett qid-nummer, kan man förse den med hela objektet. Denna parameter vill ha en tabell, varför den bara fungerar inom Lua.
  • enbarten = När bara ett värde ska hämtas. Tex för att hämta bild på heraldiskt vapen, och då inte få tillbaka alla objekt.
  • claimindex = Ger också bara ett värde, men det X:e i raden av befintliga värden.
  • numberofclaims = Om parametern ges ett värde returneras enbart antalet värden.
  • separator = När något annat än "," ska separera en lista på objekt. Tex separator=<br/> Se även conjunction
  • conjunction = Som ovan, men påverkar bara den sista separatorn i en lista av objekt. Default är och.
  • label = När man själv vill välja hur länken ska formateras. Tex [[Blekinge läns vapen|vapen]] fås av att ange label=vapen Den här parametern påverkar även enheter
    • koordlabel = När koordinater ligger i en bestämning, så styrs etiketten för länken genom koordlabel-parametern.
  • kortnamn = ger P1813 (kort namn) som etikett i de fall där det finns
  • labelformatter = ändrar etikett efter vad som anges i Modul:Wikidata2/Aux2. labelformatter = demonym ändrar tex USA till amerikan
  • labelgender = väljer etikett efter ett värde i det anropade objektet.
  • labelgenderproperty = vilken egenskap som det ska sökas i (default = P1549)
  • labelgenderlangpref = vilket språk man ska föredra (default = sv)
  • labelgenderqualifier = vilken bestämning man ska söka i (default = P518)
  • pattern = När man vill hämta en sträng och passa in den i ett mönster, exempelvis för att lägga in en kod av något slag istället för $1 i https://viaf.org/viaf/$1/.
    • pattern = auktoritetsdata är ett specialfall av ovanstående. Det "pattern" (eller mönster) som används, är då det som är angivet i P1630 (format för URL) för den berörda egenskapen.
    • pattern = auktoritetsdata2 kompletterar ovanstående och skapar en länk av typen [https://viaf.org/viaf/$1/ $1]
  • rank = Bestämmer vilken typ av påståenden som ska släppas igenom.
    • rank = all släpper igenom alla påståenden
    • rank = valid släpper igenom "preferred" och "normal", men inte "deprecated"
    • rank = best (default) släpper igenom "preferred", men om det inte finns släpps "normal" igenom
    • rank = preferred/normal/deprecated släpper igenom angiven rank, men ingen annan
  • avoidqualifier = Sorterar bort värden som är associerade med en viss egenskap i sin bestämning. Exempelvis avoidqualifier=P518 (berörd del) om man vill ha folkmängden för hela orten, inte bara de som är kvinnor eller den andel som bor i Haninge kommun.
  • avoidstringpattern = Sorterar bort värden av typen "string" som innehåller ett visst "pattern". Se Lua reference manual för detaljer om "pattern".
  • nolink = Något värde tar bort länkar, även länkar till enheter görs olänkade.
    • nounitlink = samma som ovan, men påverkar bara enheter.
  • noshortunit = enheter förkortas inte med ett värde i denna parameter, d.v.s kilometer förkortas inte till km, vilket annars är standard.
  • sortbytime = sorterar påståenden efter datum i bestämningar, detta system används med fördel tillsammans med parameter enbarten ovan
    • sortbytime = chronological sorterar påståenden i kronologisk ordning i bestämningar
    • sortbytime = inverted sorterar påståenden i omvänd kronologisk ordning i bestämningar
  • sortnotimeas = möjliggör sortering av tidsvärden som saknas. För närvarande stöds endast parametervärdet maxtime.
  • sortbyvalue = sorterar påståenden efter värde i bestämningar, detta system används med fördel tillsammans med parameter enbarten ovan
    • sortbyvalue = ascending sorterar påståenden i stigande ordning i bestämningar
    • sortbyvalue = descending sorterar påståenden i fallande ordning i bestämningar
  • sortingproperty = Ange vilken egenskap som ska stödas. Det går att lägga in en tabell i denna parameter, men då bara från en annan modul. Default är: 'P585','P571','P580','P569','P582','P570' i given ordning. Hittills stöds egenskaper med datatype = time eller med datatype = value där värdet går att konvertera till ett tal.
  • sortbyarbitrary = sorterar påståenden efter datum de objekt som länkas i de olika uttalandena, exempelvis födelsedag för en rad av "barn". Tillåtna värden är 'chronological' eller 'inverted'. Vilken egenskap som ska sökas anges med parameter 'sortingproperty ovan'.
  • langpref = I denna modul finns det ett filter som prioriterar påståenden som har bestämningen "språk = svenska". Ett värde på parameter langpref inaktiverar detta filter
  • noref = Ange ett värde i denna parameter om du inte är intresserad av att ta med själva källhänvisningen, utan bara datan.
    • noref = noimport Gör att källor av typen "importerad från (P143)" inte visas.
  • sources = basic lägger in ett krav att det ska finnas källor för att ett påstående ska kunna användas
    • sources = required diskvalificerar källor av typen "importerad från (P143)"
  • sourcelimit = N Tillåter max N antal källhänvisningar till ett påstående. Default är 3
  • norefrank = true En funktion som väljer bort "sämre" källor framför bättre är aktiv per default. Användandet av norefrank stänger av denna funktion.
  • versalisering = För att ange vilken versalisering utmatningen ska ha. Tillåtna värden är: lc/uc/lcfirst/ucfirst
    • firstversalisering = Samma som ovan, men påverkar bara det första i raden av värden
  • av = Hämtar P642 som bestämning och skriver ut värdet av det som "Borgmästare av Gävle" om ett objekt har värdet "Borgmästare" P642 (av) "Gävle"
  • avalt = Genom att ange ett annat värde här får man en annan preposition. avalt = i ger "Borgmästare i Gävle".
  • modifytime = fixar med datumformat
    • modifytime = longdate skriver datum på formatet "24 juni 2024", dvs ner till datumnivå när så tillåts
    • modifytime = longdatelink, som longdate men med länkning av datum (eller månad) och år, alltså "24 juni 2024", "juni 2024 eller "2024".
    • modifytime = Y skriver datum på formatet "2024", dvs endast årtal. Inledande nollor i årtalet tas bort.
    • modifytime = Ylink, som Y men med wikilänkning av årtalet, alltså "2024".
  • modifyqualifiertime = Som ovan, men påverkar bara bestämningar
  • gs=true skriver ut en markering (g.s.) efter datumet om det är angivet med julianska kalendern. gs=1704 markerar bara datum efter 1704. gs=always markerar alla julianska datum.
  • withdate = lägger till (24 juni 2024) till det källbelagda värdet. Hämtas från Egenskapen för tidpunkt.
    • withdate = komma gör så att datumet visas i normalstorlek åtskiljs från huvudvärdet av ett komma. Normalläget är att datum visas mindre och omsluts av parenteser.
    • withdate = only visar enbart datum från bestämningen P585, utan huvudvärdet.
  • dateonly = ger enbart tidpunkten för ett påstående, inte själva värdet.
  • withintervall = lägger till (24 juni 2024-1 juli 2024) till det källbelagda värdet. Hämtas från Egenskapen för startdatum och Egenskapen för slutdatum.
    • withintervall = gift ger att intervallet skrivs ut med ett g. framför.
  • withintervallformat = Y ger att endast årtalen för startdatum och slutdatum visas.
  • withmandatperiod = lägger till mandatperiod om den är angiven. Hämtas från Egenskapen för mandatperiod.
  • lowesttimeprecision = skapar ett filter så att tider som är angivna med en timePrecision i Wikidata som understiger värdet på denna parameter ignoreras. Kan till exempel användas om man inte vill visa datum med precisionen "århundrade" eller sämre där det är problem med hur sådana värden ska tolkas.
  • getsimpleproperty = För att hämta information från det länkade objektet. Denna funktion tillåter ingen iteration, utan går bara en nivå.
    • getproperty = Här anger du vilken egenskap du ska hämta med getsimpleproperty
    • getenbarten = Här anger du om en eller alla uttalanden ska hämtas med getsimpleproperty
    • getmodifytime = Här anger du vilket tidsformat getsimpleproperty ska hämta
    • getsomevalue = Här anger du vad som ska skrivas ut i stället för "unknown value" för något som hämtas med getsimpleproperty. Se även somevalue nedan.
    • getnovalue = Här anger du vad som ska skrivas ut i stället för "no value" för något som hämtas med getsimpleproperty. Se även novalue nedan.
    • getraw = Som "raw" nedan
    • Värdet från det länkade objektet kan formateras på följande sätt:
      • getsimpleproperty = parentes sätter värdet inom parentes.
      • getsimpleproperty = född som "parentes", fast texten skrivs med mindre stil och får ett litet "f." framför sig. Lämplig för att lägga till födelseår.
      • getsimpleproperty = avnågon lägger till "av" innan värdet. Lämplig för att ange upphov.
      • getsimpleproperty = 15px lägger till bildformatering med 15 pixlars bredd. Lämplig om man vill ha små flaggor eller dylikt.
      • getsimpleproperty = slepspenne som 15px, fast bilden läggs i en 50x20 pixlar stor ruta. Lämplig för släpspännen.
      • getsimpleproperty = only visar enbart det värde som hämtas från det länkade objektet, utan att visa objektet självt.
  • raw = är en parameter som kan användas från andra moduler. Den resulterar i att utmatningen kommer i en tabell.
  • novalue = En parameter som styr hur "novalue" på Wikidata ska presenteras här. Tomt värde ger 'nil' som resultat
  • somevalue = Som "novalue" ovan
  • relevans = Objekt som saknar en webbplatslänk till svwiki inte kommer att inkluderas.
  • prefix = Text läggs in före svaret
  • suffix = Text läggs in efter svaret
  • getonly = Ett Qid. Hämtar bara objekt som uppfyller vissa krav. P31 = Q127448 för Sveriges kommuner. Flera värden är möjliga, såsom Q127448,Q193556 för att få både svenska kommuner och landskap.
  • getonlyproperty = Om en annan egenskap än P31 efterfrågas
  • getonlyids = En lista med Qid. Hämtar bara objekt som har något av de Qid som finns i listan.
  • preferqualifier = Ett Pid. Hämtar endast påståenden som använder Pid som bestämning.
  • preferqualifiervalue = Specificerar vilket värde som passar till ovanstående. Stöder idag endast Qid.
  • typen = För parameter "type:" för anropet till GeoHack i koordinater. Default värde är landmark
    • koordtypen = dito, men för när koordinaterna ligger i en bestämning.
  • region = för parameter "region:" i anropet till Geohack i samma mall. Om parametern inte används, försöker modulen själv hitta en lämplig region med hjälp av Wikidata.
  • grav = Lägger in bestämningar för grav-id och koordinater till gravplatsen. grav=coordonly väljer att skriva ut bara koordinaterna.
  • wdlink = Lägger in en länk efter påståendet till det objekt där påståendet är angivet. Funktionen är inte tillgänglig i kombination med parametern raw
    • wdlink = sup Formaterar länken som WD
    • wdlink = sub Formaterar länken som WD
    • wdlink = small Formaterar länken som WD
  • wdlinklabel = väljer vilken text som ska skrivas ut i länken. Default är: WD
  • primary = väljer om en koordinat ska vara av typen "primary" enl mw:Extension:GeoData eller inte. Vilket ord som helst annat än primary = primary ger en secondary koordinat.
    • koordprimary = dito, men för bestämningar.
  • nogeodataparser = väljer bort mw:Extension:GeoData helt och hållet. Kan vara lämpligt i en test- eller projektsida.
  • convertunit = Ger matematisk konvertering av en enhet till en annan (exv cm -> km). Ange ett qid för den data du vill konvertera till! Data som inte går att konvertera hamnar i Wikidata:Påståenden som inte går att konvertera.
  • vardesiffror = När det saknas uppgift om precision i datan från WD, görs konverteringen med detta antal värdesiffror. Default = 3.
  • withoutunit = Skriver inte ut enheten. Fungerar både med och utan konvertering.
  • noformatera = Ger ingen formatering av siffrorna. De kommer ut råa, utan tusenavgränsare och med decimalpunkt isf komma.
  • norounding = Skippa avrundning av värden även om de har upperBound och lowerBound som annars medför avrundning.
  • redlink= Gör att objekt som inte är kopplade till svenska Wikipedia och som har etikett på svenska blir röda länkar. Om etiketten redan finns som uppslagsord läggs objektets Wikidata-ID (Q-numret) till som särskiljare.
  • relevantred= Som "redlink", fast en koll görs för att se om objektet är kopplat till något annat Wikimediaprojekt. Har objektet inga länkar alls till andra Wikimediaprojekt lämnas det olänkat. Denna kan användas i uppräkningar där vissa saker kan vara relevanta, medan andra inte är det. Denna variant drar lite mer resurser, så "redlink" är att föredra om man misstänker att egenskapen i regel ska länka allt.

Övriga funktioner

  • getEntityIdForCurrentPage - returnerar "id" (Q-numret) för den sida som anropet sker från.
  • getcoord - returnerar latitud eller longitud för angivet objekts (qid) geografiska koordinater (P625).
    Anrop: {{#invoke:Wikidata2|getcoord|qid=<qid>|what=<lat|long>}}
  • getcoordfromproperty - returnerar longitud eller latitud för en bestämning geografiska koordinater (P625) för en egenskap för ett angivet objekt.
    Anrop: {{#invoke:Wikidata2|getcoordfromproperty|qid=<qid>|property=<property>|what=<lat|long>}}
  • averagepropertyvalue> - returnerar medelvärdet av egenskap Pzzz för alla objekt Pyyy där Pyyy nås via en kedja av properties från huvudobjektet <qid> via Pwww, Pxxx och så vidare där endast det första värdet/objektet på varje nivå beaktas. Ingen hänsyn tas till påståendenas rang.
    Anrop: {{#invoke:Wikidata2|averagepropertyvalue|qid=<qid>|property=<Pwww/Pxxx/.../Pyyy/Pzzz>|avoidqualifier=<avoidqualifier>|what=<lat|long>}}. Parametern avoidqualifier kan användas för att utesluta värden på Pzzz med angiven bestämning. Pzzz måste ha datatypen "quantity" eller "globe-coordinate". Parametern what används endast om Pzzz har typen "globe-coordinate".
-- Den ordning fallback language hämtas, om svensk label saknas. Engelska först, därefter bokmål, danska, etc...
local fallback = {'en', 'nb', 'da', 'nn', 'de', 'fr', 'es', 'it', 'pt'}
local redundanta = {'viaf.org/viaf/', 'portal.dnb.de/', 'www.nndb.com/', 'catalogue.bnf.fr/ark'}
local formatera = require('Modul:Math')
local i18n = {
	["errors"] = {
		["property-param-not-provided"] = "Property parameter not provided.",
		["entity-not-found"] = "Entity not found.",
		["unknown-claim-type"] = "Unknown claim type.",
		["unknown-snak-type"] = "Unknown snak type.",
		["unknown-datatype"] = "Unknown datatype.",
		["unknown-entity-type"] = "Unknown entity type.",
		["unknown-value-module"] = "You must set both value-module and value-function parameters.",
		["value-module-not-found"] = "The module pointed by value-module not found.",
		["value-function-not-found"] = "The function pointed by value-function not found.",
		["non-convertible unit"] = "Denna enhet går inte att konvertera till den önskade"
	},
	["somevalue"] = "''unknown value''",
	["novalue"] = "''no value''"
}
local sortingproperties = {'P585','P571','P580','P569','P582','P570'}

function unithandle(unit, options)
	-- Kontrollerar om det finns någon förkortning för denna 'unit'
	local lab = options.label or formatStatements({property = 'P498', entityId = unit, enbarten = 'true', noref = 'true'})
	if not lab or lab == '' then
		lab = formatStatements({property = 'P558', entityId = unit, enbarten = 'true', langpref = options.langpref, noref = 'true'})
	end
	if lab and ( not options.nounitshort or options.nounitshort == '' ) then
		return formatEntityId( unit, {label = lab, nolink = (options.nounitlink or options.nolink) }).value
	else -- om det inte finns en förkortning
		return formatEntityId( unit, {nolink = options.nounitlink}).value
	end
end

function fallbackigen(options, alternativ)
	if alternativ and alternativ ~= '' then
		return alternativ
	end
	if options.entity and options.entity.labels then
		if options.entity.labels.sv then
			return options.entity.labels.sv.value
		else
			for k, v in pairs(fallback) do
				if options.entity.labels[v] then
					return options.entity.labels[v].value
				end
			end
		end
		for v, k in pairs(options.entity.labels) do
			return k.value
		end
	end
	return mw.title.getCurrentTitle().text
end	

function regionaux(entity)
	local w = formatStatements({property = 'P297', entity = entity, noref = 'true', raw = 'true', enbarten = 'true'})
	if w and #w > 0 then
		return w[1].value
	end
	w = formatStatements({property = 'P300', entity = entity, noref = 'true', raw = 'true', enbarten = 'true'})
	if w and #w > 0 then
		return w[1].value
	end
end

function regionaux2(entity)
	local w = formatStatements({property = 'P131', entity = entity, noref = 'true', raw = 'true', enbarten = 'true'})
	local w2 = formatStatements({property = 'P297', entity = entity, noref = 'true', raw = 'true', enbarten = 'true'})
	return w or w2
end

function regional(options, latitude)
	local i = 6
	local entity = options.entity
	local a = ''
	while i > 0 do
		local region = regionaux(entity)
		if region then
			return region
		end
		local v = regionaux2(entity)
		if v and #v > 0 then
			entity = mw.wikibase.getEntityObject( v[1].item )
		end
		i = i - 1
	end
	local w = formatStatements({property = 'P17', entity = options.entity, noref = 'true', raw = 'true', enbarten = true})
	if w and #w > 0 then
		w = formatStatements({property = 'P297', entityId = w[1].item, noref = 'true', raw = 'true', enbarten = true})
		if w and #w > 0 then
			return w[1].value
		end
	end
	if latitude and latitude < -65 then -- Antarktis
		return 'AQ'
	end
	return nil
end

function planeter(t)
	local px = {
		Q2 = 'earth',
		Q308 = 'mercury',
		Q313 = 'venus',
		Q405 = 'moon',
		Q111 = 'mars',
		Q7547 = 'phobos',
		Q7548 = 'deimos',
		Q596 = 'ceres',
		Q3030 = 'vesta',
		Q3169 = 'ganymede',
		Q3134 = 'callisto',
		Q3123 = 'io',
		Q3143 = 'europa',
		Q15034 = 'mimas',
		Q3303 = 'enceladus',
		Q15047 = 'tethys',
		Q15040 = 'dione',
		Q15050 = 'rhea',
		Q2565 = 'titan',
		Q15037 = 'hyperion',
		Q17958 = 'iapetus',
		Q17975 = 'phoebe',
		Q3352 = 'miranda',
		Q3343 = 'ariel',
		Q3338 = 'umbriel',
		Q3322 = 'titania',
		Q3332 = 'oberon',
		Q3359 = 'triton',
		Q339 = 'pluto',
	}
	return px[t] or 'earth'
end

function inlist(needle, haystack)
	-- Checks if an item is present amongst the values of a list
	for _, v in pairs(haystack) do
		if v == needle then
			return true
		end
  	return false
  	end
end

function koorder(data, options)
	if not data then
		return nil
	end
	local s = {}
	local planet = planeter(data.globe:match('Q%d+'))
	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
	if data.precision == nil then
		s.lat_g = math.abs(data.latitude)
		s.long_g = math.abs(data.longitude)
	elseif inlist(data.precision, {1, 0.1, 0.01, 0.001, 0.0001}) then
		s.lat_g, frac = math.modf(math.abs(data.latitude) / data.precision + 0.5) * data.precision
		s.long_g, frac = math.modf(math.abs(data.longitude) / data.precision + 0.5) * data.precision
	elseif data.precision > 0.0166 and data.precision < 0.0167 then
		s.lat_g, frac = math.modf(math.abs(data.latitude))
		s.lat_m, frac = math.modf(frac * 60 + 0.5)
		s.long_g, frac = math.modf(math.abs(data.longitude))
		s.long_m, frac = math.modf(frac * 60 + 0.5)
	elseif data.precision > 0.000277 and data.precision < 0.000278 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)
		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)
	elseif data.precision > 0.0000277 and data.precision < 0.0000278 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
		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
	elseif data.precision > 0.00000277 and data.precision < 0.00000278 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 * 6000 + 0.5)/100
		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 * 6000 + 0.5)/100
	else
		s.lat_g = math.abs(data.latitude)
		s.long_g = math.abs(data.longitude)
	end
	local params = s.lat_dec .. '_' .. s.lat_NS .. '_' .. s.long_dec .. '_' .. s.long_EW
	local typen = options.typen or 'landmark'
	local region = options.region
	local pagename = fallbackigen(options, options.pagename)

	if not region and planet == 'earth' then
		region = regional(options, data.latitude)
	end
	local magic = ''
	if not options.nogeodataparser or options.nogeodataparser == '' then
		local args = { data.latitude, data.longitude, globe = planet, type = typen, region = region, name = pagename }
		local primary = options.num == 1
		if options.primary and options.primary ~= '' then
			primary = options.primary == 'primary'
		end
		if primary then
			table.insert( args, 1, 'primary' )
		end
		magic = mw.getCurrentFrame():callParserFunction{
			name = '#coordinates',
			args = args
		}
	end
	if options.geodataparseronly and options.geodataparseronly ~= '' then
		return magic
	end
	pagename = string.gsub (pagename, "([^%w ])",
    	function (c) return string.format ("%%%02X", string.byte(c)) end) 
    pagename = string.gsub (pagename, " ", "+")
	local nn = '&title=' .. pagename
	if region then
		planet = planet .. '_region:' .. region
	end
	if not options.label then
		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
		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
		return magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '&params=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ' ' .. a .. ']'
	end
	if options.label ~= '' then
		return magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '&params=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ' ' .. options.label .. ']'
	else
		return magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '&params=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ']'
	end
end

function getonly(claims, options)
	local claims2 = {}
	for i, j in pairs(claims) do

		if j.mainsnak and j.mainsnak.snaktype == 'value' and j.mainsnak.datavalue and j.mainsnak.datavalue.value and j.mainsnak.datavalue.value.id then
			local t = j.mainsnak.datavalue.value.id
			local traff = false
			local t2 = formatStatements( {property = (options.getonlyproperty or "P31"), entityId = t, noref = 'true', raw = 'true' })
			if t2 and #t2 > 0 then
				for k, state in pairs( t2 ) do
					for j2, only in pairs(mw.text.split(options.getonly,',')) do
						if state.item == only then
							traff = true
						end
					end
				end
			end
			if traff then
				table.insert(claims2, j)
			end
		end
	end
	return claims2
end

function claimindex(claims, options)
	local claims2 = {}
	for j, index in pairs(mw.text.split(options.claimindex,',')) do
		if tonumber(index) and #claims >= tonumber(index) then
			table.insert(claims2, claims[tonumber(index)])
		end
	end
	return claims2
end

function preferqualifier(claims, options)
	local claims2 = {}
	for i, statement in pairs( claims ) do
		if statement.qualifiers and statement.qualifiers[options.preferqualifier:upper()] then
			if options.preferqualifiervalue and options.preferqualifiervalue ~= '' then
				local active = false
				for k, t in pairs(mw.text.split(options.preferqualifiervalue,',')) do
					for j, value in pairs(formatStatements({property=options.preferqualifier:upper(), raw = 'true'}, statement.qualifiers)) do
						if value.item == t and not active then
							table.insert( claims2, statement)
							active = true
						end
					end
				end
			else
				table.insert( claims2, statement)
			end
		end
	end
	return claims2
end

function versalisering(label, options)
	local versalisering = options.versalisering
	if options.firstversalisering and options.num == 1 then
		versalisering = options.firstversalisering
	end
	if not versalisering or versalisering == '' then
		return label
	end
	if versalisering == 'lcfirst' then
		return mw.getCurrentFrame():preprocess("{{lcfirst: " .. label .. " }}")
	elseif versalisering == 'ucfirst' then
		return mw.language.getContentLanguage():ucfirst( label )
	elseif versalisering == 'lc' then
		return mw.getCurrentFrame():preprocess("{{lc: " .. label .. " }}")
	elseif versalisering == 'uc' then
		return mw.getCurrentFrame():preprocess("{{uc: " .. label .. " }}")
	end
	return label
end
function getqualifierbysortingproperty(claim, sortingproperty)
	for k, v in pairs(sortingproperty) do
		if claim.qualifiers and claim.qualifiers[v] and claim.qualifiers[v][1].snaktype == 'value' then
			return claim.qualifiers[v][1].datavalue.value.time
		end
	end
	return nil
end

function getDate(claim, options)
	local sortingproperty = sortingproperties
	if type(options.sortingproperty) == 'table' then
		sortingproperty = options.sortingproperty
	elseif type(options.sortingproperty) == 'string' then
		sortingproperty = {options.sortingproperty}
	end
	return getqualifierbysortingproperty(claim, sortingproperty)
end

function getDateArb(claim, options)
	local sortingproperty = options.sortingproperty or 'P569'
	if claim.mainsnak.snaktype == 'value' then
		local item = getEntityIdFromValue( claim.mainsnak.datavalue.value )
		return formatStatements({property = sortingproperty, entityId = item, enbarten = 'ja', sortbytime = 'chronological', noref = 'ja'})
	end
end

function comparedates(a, b)
	if a and b then
		return a > b
	elseif a then
		return true
	end
end

function sortbyqualifier(claims, options)
	table.sort(claims, function(a, b)
		local timeA = getDate(a, options)
		local timeB = getDate(b, options)
		if options.sortbytime == 'inverted' then
			return comparedates(timeB, timeA)
		else
			return comparedates(timeA, timeB)
		end
	end)
	return claims
end

function sortbylanguage(claims, options)
	if claims[1].mainsnak.datatype ~= 'monolingualtext' then
		return claims
	end
	local a = {}
	for k, v in pairs(claims) do
		if v.mainsnak.datavalue.value.language == (options.langsort or 'sv') then
			table.insert(a, v)
		end
	end
	for k, v in pairs(claims) do
		if v.mainsnak.datavalue.value.language ~= (options.langsort or 'sv') then
			table.insert(a, v)
		end
	end
	return a
end

function sortbyarb(claims, options)
	table.sort(claims, function(a,b)
		local timeA = getDateArb(a, options)
		local timeB = getDateArb(b, options)
		if options.sortbyarbitrary == 'inverted' then
			return comparedates(timeB, timeA)
		else
			return comparedates(timeA, timeB)
		end
	end)
	return claims
end

function getLabelFromFallBack( id )
	local entity = {}
	if type(id) == 'table' then
		entity = id
		id = entity.id
	else
		entity = getEntityFromId( id )
	end
	if not entity.labels then
		return {value = '[[d:' .. id .. '|' .. id .. ']][[Kategori:Wikidatabaserade länkar som leder till sidor utan label]]', language = ''}
	end
	for k, v in pairs(fallback) do
		if entity.labels[v] then
			return {value = entity.labels[v].value, language = entity.labels[v].language}
		end
	end
	-- Om inget fallback-språk finns av de i variabeln ovan, så används det först definierade i objektet
	if entity.labels then
		for v, k in pairs(entity.labels) do
			return {value = k.value, language = k.language}
		end
	end
	return {value = '-', language = ''}
end

function getEntityFromId( id )
	if id and id ~= ''then
		return mw.wikibase.getEntityObject( id )
	else
		return mw.wikibase.getEntityObject()
	end
end

function getEntityIdFromValue( value )
	if value['entity-type'] == 'item' then
		return 'Q' .. value['numeric-id']
	elseif value['entity-type'] == 'property' then
		return 'P' .. value['numeric-id']
	else
		return formatError( 'unknown-entity-type' )
	end
end

function formatError( key )
	return '<span class="error">' .. i18n.errors[key] .. '</span>'
end

function formatStatements( options, ref )
	local formattedStatements = {}
	local claims = {}
	if not options.property then
		return formatError( 'property-param-not-provided' )
	end

	if type(ref) == 'table' then -- för de fall där funktionen anropas och alla claims redan finns i en tabell
		claims = ref[options.property] or {}
	else
		--Get entity
		local entity = nil
		
		if options.entity and type( options.entity ) == "table" then
			entity = options.entity
		else
			entity = getEntityFromId( options.entityId )
			options.entity = entity
		end

		if not entity then
			return '' --TODO error?
		end

		if not entity.claims or not entity.claims[options.property:upper()] then
			return '' --TODO error?
		end

		--Format statement and concat them cleanly
		if options.rank == 'best' or not options.rank then
			claims = entity:getBestStatements( options.property:upper() )
		elseif options.rank == 'valid' then
			for i, statement in pairs( entity.claims[options.property:upper()] ) do
				if statement.rank == 'preferred' then
					table.insert( claims, statement )
				end
			end
			for i, statement in pairs( entity.claims[options.property:upper()] ) do
				if statement.rank == 'normal' then
					table.insert( claims, statement )
				end
			end
		elseif options.rank == 'all' then
			for i, statement in pairs( entity.claims[options.property:upper()] ) do
				table.insert( claims, statement )
			end
		else
			for i, statement in pairs( entity.claims[options.property:upper()] ) do
				if statement.rank == options.rank then
					table.insert( claims, statement )
				end
			end
		end
		if options.avoidqualifier then
			local claims2 = {}
			for i, statement in pairs( claims ) do
				if not statement.qualifiers or not statement.qualifiers[options.avoidqualifier:upper()] then
					table.insert( claims2, statement)
				end
			end
			claims = claims2
		end
		if options.preferqualifier and options.preferqualifier ~= '' then
			claims = preferqualifier(claims, options)
		end

		--om det finns vissa statements som har en qualifier som säger "språk = svenska", ta bara med dessa
		--alternativt om det finns statements som har en qualifier som säger "skriptsystem == latinska alfabetet"
		if not options.langpref or options.langpref == '' then
			local claims2 = {}
			for i, statement in pairs( claims ) do
				if statement.qualifiers and statement.qualifiers.P407 then
					for k, v in pairs( statement.qualifiers.P407 ) do
						if v.snaktype == 'value' and v.datavalue.value['numeric-id'] == 9027 then -- Q9027 = 'svenska'
							table.insert( claims2, statement )
						end
					end
				elseif statement.qualifiers and statement.qualifiers.P282 then
					for k, v in pairs( statement.qualifiers.P282 ) do
						if v.snaktype == 'value' and v.datavalue.value['numeric-id'] == 8229 then -- Q8229 = 'latinska alfabetet'
							table.insert( claims2, statement )
						end
					end
				end
			end
			if #claims2 > 0 then
				claims = claims2
			end
		end
		if #claims > 1 then 
			claims = sortbylanguage(claims, options)
		end
		if options.sortbytime == 'chronological' or options.sortbytime == 'inverted' then
			claims = sortbyqualifier(claims, options)
		elseif options.sortbyarbitrary == 'chronological' or options.sortbyarbitrary == 'inverted' then
			claims = sortbyarb(claims, options)
		end
		if options.getonly and options.getonly ~= '' then
			claims = getonly(claims, options)
		end
	end

	if options.claimindex and #claims > 0 then
		claims = claimindex(claims, options)
	end
	if options.enbarten and options.enbarten ~= '' and #claims > 1 then
		claims = {claims[1]}
	end
	local statementsraw = {}
	if claims then
		for i, statement in pairs( claims ) do
			options.num = i
			local stat = formatStatement( statement, options )
			if stat then
				local s = stat.value
				local spostref = ''
				local d = stat.datum
				local tf = stat.tifr
				local pr = stat.pr
				local utgivort = stat.utgivort
				if s == '' then s = nil end
				if s then
					if d and options.withdate and options.withdate ~= '' then
						s = s .. mw.text.tag('small', {}, ' (' .. d .. ')')
					end
					if tf and options.withintervall and options.withintervall ~= '' then
						if options.withintervall == 'gift' then
							s = s .. mw.text.tag('br') .. mw.text.tag('small', {}, '(g. ' .. tf .. ')')
						else
							s = s .. mw.text.tag('small', {}, ' (' .. tf .. ')')
						end
					end
					if utgivort and options.withutgivort and options.withutgivort ~= '' then
						if options.withutgivort == 'parantes och small' then
							s = s .. ' ' .. mw.text.tag('small', {}, ' (' .. utgivort .. ')')
						else
							s = s .. ' ' .. utgivort
						end
					end
					if options.getsimpleproperty == 'född' and pr and pr ~= '' then
						s = s .. ' ' .. mw.text.tag('small', {}, '(f. ' .. pr .. ')')
					end
					if options.getsimpleproperty == 'parentes' and pr and pr ~= '' then
						s = s .. ' ' .. mw.text.tag('span', {}, '(' .. pr .. ')')
					end
					if options.getsimpleproperty == 'avnågon' and pr and pr ~= '' then
						s = s .. ' ' .. mw.text.tag('span', {}, ' av ' .. pr .. '')
					end
					if options.grav and options.grav ~= '' then
						if options.grav == 'coordonly' then
							if stat.koord then
								spostref = '<br/>' .. stat.koord
							end
						else
							if stat.gravid then
								spostref = '<br/>' .. stat.gravid
							end
							if stat.koord then
								spostref = spostref .. '<br/>' .. stat.koord
							end
						end
					end

					if type(ref) == 'table' then --Inte leta efter referenser om själva anropet görs från en referens
						table.insert( formattedStatements, s .. spostref )
					else
						local t = formatReferencesNew( statement, options)
						if t.flag then
							table.insert( formattedStatements, s .. t.value .. spostref)
							stat.ref = t.value
							stat.refraw = t.refraw
							stat.refquality = t.refquality
						else
							stat = nil
						end
					end
				end
				if stat then
					table.insert(statementsraw, stat)
				end
			end
		end
	end
	
		
	local tot = mw.text.listToText( formattedStatements, options.separator, options.conjunction )
	if tot == '' then tot = nil end
	if options.wdlink and options.wdlink ~= '' then
		local dlink = ''
		local wdlabel = 'WD'
		if options.wdlinklabel and options.wdlinklabel ~= '' then
			wdlabel = options.wdlinklabel
		end
		if options.entityId then
			dlink = options.entityId .. '#' .. options.property
		else
			dlink = 'Special:ItemByTitle/svwiki/' .. mw.getCurrentFrame():getParent():getTitle() .. '#' .. options.property
		end
		if options.wdlink == 'sub' then
			tot = tot .. ' ' .. mw.text.tag('sub', {}, '[[d:' .. dlink .. '|' .. wdlabel .. ']]')
		elseif options.wdlink == 'sup' then
			tot = tot .. ' ' .. mw.text.tag('sup', {}, '[[d:' .. dlink .. '|' .. wdlabel .. ']]')
		elseif options.wdlink == 'small' then
			tot = tot .. ' ' .. mw.text.tag('small', {}, '[[d:' .. dlink .. '|' .. wdlabel .. ']]')
		else
			tot = tot .. ' [[d:' .. dlink .. '|'.. wdlabel ..']]'
		end
	end
	if options.raw and options.raw ~= '' then
		return statementsraw
	end
	if options.numberofclaims and options.numberofclaims ~= '' then
		return #formattedStatements
	end
	return tot
end

function formatReferencesNew( statement, options)
	local limit = tonumber(options.sourcelimit) or 3
	local reference = {}
	local references = {}
	local quality = 0 -- ingen källa alls
	local flagga = false
	local limitcounter = 0
	local qualmax = 0
	local qual2 = 0
	if statement.references then
		local cite = require('Modul:Cite')
		for i, ref in pairs(statement.references) do
			local items, s = {}, nil
			qual2 = 100
			if ref.snaks then
				if ref.snaks.P248 then
					for j, prop in pairs(ref.snaks.P248) do
						table.insert(items, getEntityIdFromValue( prop.datavalue.value ))
					end
				end
				if quality < 10 and ref.snaks.P143 then
					quality = 10 -- kvalite (importerad från)
				end
				if quality < 100 and not ref.snaks.P143 then
					quality = 100 -- källa finns och den är (förhoppningsvis) bättre än "importerad från".
				end
				if (options.noref and options.noref ~= '' and options.noref ~= 'noimport') or (options.noref == 'noimport' and ref.snaks.P143) then
					--
				else
					s = cite.citeitem( items, ref.snaks, options )
					if s == '' or not s then
						s = 'Källangivelsen på Wikidata använder propertys som inte känns igen av Modul:Cite'
						qual2 = 10
					end
					if ref.snaks.P143 then
						qual2 = 25 -- importerad från
					end
					if s then
						for j, rr in pairs(redundanta) do
							if s:match(rr) then
								qual2 = 50
							end
						end
					end
				end
			end
			if s and s ~= '' then
				table.insert(reference, {value = s, name = ref.hash, qq = qual2})
			end
			if qual2 > qualmax then
				qualmax = qual2
			end
		end
		if (options.sources == 'required' and quality > 99) or  (options.sources == 'basic' and quality > 9) or (not options.sources or options.sources == '') then
			for i, ref in pairs(reference) do
				if limitcounter < limit then
					if options.norefrank and options.norefrank ~= '' then
						table.insert(references, mw.getCurrentFrame():extensionTag( 'ref', ref.value, {name = ref.name}))
						limitcounter = limitcounter + 1
					else
						if ref.qq >= qualmax then
							table.insert(references, mw.getCurrentFrame():extensionTag( 'ref', ref.value, {name = ref.name}))
							limitcounter = limitcounter + 1
						end
					end
				end
			end
			flagga = true
		else
			flagga = false
		end
	else
		if not options.sources or options.sources == '' then
			flagga = true
		end
	end
	return {value = table.concat(references), refquality = quality, refraw = reference, flag = flagga}
end

function formatStatement( statement, options )
	if statement.type == 'statement' then
		local s = formatSnak( statement.mainsnak, options )
		if statement.qualifiers then
			if statement.qualifiers.P585 then
				s.datum = formatStatements({property = "P585", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime}, statement.qualifiers)
			end
			if statement.qualifiers.P574 then
				s.dateoftaxpub = formatStatements({property = "P574", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime}, statement.qualifiers)
			end
			if statement.qualifiers.P625 then
				if s.item then
					local opt = options
					opt.entity = mw.wikibase.getEntityObject( s.item )
					local region = regional(opt)
					s.koord = formatStatements({property = "P625", enbarten = 'true', noref = 'true', label = options.koordlabel, typen = options.koordtypen, primary = options.koordprimary, pagename=options.koordpagename, geodataparseronly = options.geodataparseronly, region = region}, statement.qualifiers)
				else
					s.koord = formatStatements({property = "P625", enbarten = 'true', noref = 'true', label = options.koordlabel, typen = options.koordtypen, primary = options.koordprimary, pagename=options.koordpagename, geodataparseronly = options.geodataparseronly}, statement.qualifiers)
				end
			end
			if statement.qualifiers.P965 then
				s.gravid = formatStatements({property = "P965", noref = 'true'}, statement.qualifiers)
			end
			if statement.qualifiers.P405 then
				local auktorer = {}
				for i, j in pairs(statement.qualifiers.P405) do
					if j.snaktype == 'value' then
						local item = getEntityIdFromValue( j.datavalue.value )
						local auktorsnamn = formatStatements({property = "P428", entityId = item, noref = 'ja', enbarten = 'ja'})
						if auktorsnamn and auktorsnamn ~= '' then
							table.insert(auktorer, formatEntityId(item, {label = auktorsnamn}).value)
						else
							table.insert(auktorer, formatEntityId(item, {}).value)
						end
					end
				end
				s.auktor = mw.text.listToText(auktorer, ', ', ' & ')
			end
			if s and (statement.qualifiers.P580 or statement.qualifiers.P582) then
				local f = formatStatements({property = "P580", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime}, statement.qualifiers) or ''
				local t = formatStatements({property = "P582", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime}, statement.qualifiers) or ''
				s.tifr = f .. '–' .. t
			end
			if statement.qualifiers.P291 then
				s.utgivort = formatStatements({property = "P291", noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)
			end
			if statement.qualifiers.P2096 then
				s.bildtext = formatStatements({property = "P2096", noref = 'true', langpref = (options.langpref or 'sv')}, statement.qualifiers)
			end
			if s then
				if options.qual1 and options.qual1 ~= '' and statement.qualifiers[options.qual1] then
					s.qp1 = formatStatements({property = options.qual1, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)
				end
				if options.qual2 and options.qual2 ~= '' and statement.qualifiers[options.qual2] then
					s.qp2 = formatStatements({property = options.qual2, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)
				end
				if options.qual3 and options.qual3 ~= '' and statement.qualifiers[options.qual3] then
					s.qp3 = formatStatements({property = options.qual3, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)
				end
				if options.qual4 and options.qual4 ~= '' and statement.qualifiers[options.qual4] then
					s.qp4 = formatStatements({property = options.qual4, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)
				end
				if options.qual5 and options.qual5 ~= '' and statement.qualifiers[options.qual5] then
					s.qp5 = formatStatements({property = options.qual5, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)
				end
			end
		end
		return s
	elseif not statement.type then
		return formatSnak( statement, options )
	end
	return {value = formatError( 'unknown-claim-type' )}
end

function formatSnak( snak, options )
	if snak.snaktype == 'somevalue' then
		if options.somevalue then
			if options.somevalue == '' then
				return nil
			else
				return {value = options.somevalue}
			end
		end
		return {value = i18n['somevalue']}
	elseif snak.snaktype == 'novalue' then
		if options.novalue then
			if options.novalue == '' then
				return nil
			else
				return {value = options.novalue}
			end
		end
		return {value = i18n['novalue']}
	elseif snak.snaktype == 'value' then
		local s = formatDatavalue( snak.datavalue, options, snak.datatype )
		if s and options.prefix and options.prefix ~= '' then
			s.value = options.prefix .. s.value
		end
		if s and options.suffix and options.suffix ~= '' then
			s.value = s.value .. options.suffix
		end
		if s and s.item and options.getsimpleproperty and options.getsimpleproperty ~= '' and options.getproperty and options.getproperty ~= '' then
			local pr = formatStatements({property = options.getproperty, entityId = s.item, enbarten = options.getenbarten, noref = 'ja', modifytime = options.getmodifytime, raw = options.getraw})
			if pr then s.pr = pr end
		end
		return s
	else
		return {value = formatError( 'unknown-snak-type' )}
	end
end

function formatDatavalue( datavalue, options, datatype )
	--Use the customize handler if provided
	if options['value-module'] or options['value-function'] then
		if not options['value-module'] or not options['value-function'] then
			return {value = formatError( 'unknown-value-module' )}
		end
		local formatter = require ('Module:' .. options['value-module'])
		if not formatter then
			return {value = formatError( 'value-module-not-found' )}
		end
		local fun = formatter[options['value-function']]
		if not fun then
			return {value = formatError( 'value-function-not-found' )}
		end
		return {value = fun( datavalue.value, options )}
	end

	--Default formatters
	if datatype == 'wikibase-item' then
		local s = formatEntityId( getEntityIdFromValue( datavalue.value ), options )
		s.item = getEntityIdFromValue( datavalue.value )
		if options.relevans and options.relevans ~= '' then
			if not mw.wikibase.sitelink( s.item ) then
				return nil
			end
		end
		return s

	elseif datatype == 'string' or datatype == 'commonsMedia' or datatype == 'external-id' then
		if options.pattern and options.pattern ~= '' then
			if options.pattern == "auktoritetsdata" then
				local patter = formatStatements( {property = "P1630", entityId = options.property, enbarten = 'true', noref = 'true' })
				return {value = formatFromPattern( datavalue.value, {pattern = patter} )}
			elseif options.pattern == "auktoritetsdata2" then
				local patter = formatStatements( {property = "P1630", entityId = options.property, enbarten = 'true', noref = 'true' })
				return {value = '[' .. formatFromPattern( datavalue.value, {pattern = patter} ) .. ' ' .. datavalue.value .. ']' }
			else
				return {value = formatFromPattern( versalisering(datavalue.value, options), options )}
			end
		else
			return {value = versalisering(datavalue.value, options), label = datavalue.value}
		end

	elseif datatype == 'time' then
		local Time = require 'Module:Time'
		local tid = Time.newFromWikidataValue( datavalue.value ):toHtml()
		if options.modifytime == 'longdate' then
			local mall = ''
			if datavalue.value.precision >= 11 then
				mall = '{{#time:j F Y|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
				tid = mw.getCurrentFrame():preprocess(mall)
			elseif datavalue.value.precision == 10 then
				mall = '{{#time:F Y|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
				tid = mw.getCurrentFrame():preprocess(mall)
			elseif datavalue.value.precision == 9 then
				mall = '{{#time:Y|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
				tid = mw.getCurrentFrame():preprocess(mall)
			end
		elseif options.modifytime == 'longdatelink' then
			local mall = ''
			if datavalue.value.precision >= 11 then
				mall = '{{#time:[[j F]] [[Y]]|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
				tid = mw.getCurrentFrame():preprocess(mall)
			elseif datavalue.value.precision == 10 then
				mall = '{{#time:[[F]] [[Y]]|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
				tid = string.gsub(mw.getCurrentFrame():preprocess(mall),'mars','mars (månad)|mars')
			elseif datavalue.value.precision == 9 then
				mall = '{{#time:[[Y]]|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
				tid = mw.getCurrentFrame():preprocess(mall)
			end
		elseif options.modifytime == 'Y' then
			local mall = '{{#time:Y|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
			tid = mw.getCurrentFrame():preprocess(mall)
		elseif options.modifytime == 'Ylink' then
			local mall = '{{#time:[[Y]]|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'
			tid = mw.getCurrentFrame():preprocess(mall)
		end
		return {value = tid}

	elseif datatype == 'globe-coordinate' then
		return {value = koorder(datavalue.value, options), latitude = datavalue.value.latitude, longitude = datavalue.value.longitude, precision = datavalue.value.precision, globe = datavalue.value.globe:match('Q%d+')}

	elseif datatype == 'quantity' then
		local amount, unit, cat = datavalue.value.amount, datavalue.value.unit, nil
		local amountsi, unitsi, unitrawsi, numbersi, valuesi= nil, nil, nil, nil, nil
		local amountconv, numberconv, unitconv, unitrawconv, valueconv = nil, nil, nil, nil, nil
		
		if unit then
			unit = unit:match('Q%d+')
		end

		local number = formatera.newFromWikidataValue(datavalue.value)

		local unitraw = unit
		if unit then
			unit = unithandle(unit, options)			
			-- Kontrollera om det finns en SI-enhet för denna 'unit'
			if not options.antiloop then
				local a = formatStatements({property = 'P2370', entityId = unitraw, enbarten = 'true', noref = 'true', raw = 'true', antiloop = 'true'})
				if #a > 0 then
					amountsi = tostring(tonumber(amount) * tonumber(a[1].amount))
					unitsi = a[1].unit
					unitrawsi = a[1].unitraw
					local lang = mw.language.new( 'sv' )
					numbersi = lang:formatNum(tonumber(amountsi))
					valuesi = numbersi .. ' ' .. (unitsi or '')
					if options.convertunit and options.convertunit ~= '' and options.convertunit ~= unitraw  then
						local b = formatStatements({property = 'P2370', entityId = options.convertunit, enbarten = 'true', noref = 'true', raw = 'true', antiloop = 'true'})
						if #b > 0 and b[1].unitraw == a[1].unitraw then
							amountconv = tostring(tonumber(amount) * tonumber(a[1].amount) / tonumber(b[1].amount))
							unitrawconv = options.convertunit
							unitconv = unithandle(options.convertunit, options)
							local upperBoundconv, lowerBoundconv = nil, nil
							if datavalue.value.upperBound and datavalue.value.upperBound ~= amount then
								upperBoundconv = tostring(tonumber(datavalue.value.upperBound) * tonumber(a[1].upperBound) / tonumber(b[1].upperBound))
								lowerBoundconv = tostring(tonumber(datavalue.value.lowerBound) * tonumber(a[1].lowerBound) / tonumber(b[1].lowerBound))
								numberconv = formatera.newFromWikidataValue({amount = amountconv, upperBound = upperBoundconv, lowerBound = lowerBoundconv})
							else
								numberconv = formatera.avrunda({args = {varde = amountconv, vardesiffror = (options.vardesiffror or '3')}})
							end
							if options.withoutunit and options.withoutunit ~= '' then
								valueconv = numberconv
							else
								valueconv = numberconv .. ' ' .. (unitconv or '')
							end
							return {value = valueconv, amount = amountconv, upperBound = upperBoundconv, lowerBound = lowerBoundconv, unit = unitconv, unitraw = unitrawconv, valuesi = valuesi, amountsi = amountsi, unitrawsi = unitrawsi, unitsi = unitsi}
						end
						if options.convertunit ~= unitraw then
							return {value = number .. ' ' .. (unit or '') .. ' ' .. formatError( 'non-convertible unit') .. '[[Kategori:Wikidata:Påståenden som inte går att konvertera]]', amount = amount, upperBound = datavalue.value.upperBound, lowerBound = datavalue.value.lowerBound, unit = unit, unitraw = unitraw, cat = cat, valuesi = valuesi, amountsi = amountsi, unitrawsi = unitrawsi, unitsi = unitsi}	
						end
					end
				end
			end
		end
		if options.withoutunit and options.withoutunit ~= '' then
			return {value = number, amount = amount, upperBound = datavalue.value.upperBound, lowerBound = datavalue.value.lowerBound, unit = unit, unitraw = unitraw, valuesi = valuesi, amountsi = amountsi, unitrawsi = unitrawsi, unitsi = unitsi}
		else
			return {value = number .. ' ' .. (unit or ''), amount = amount, upperBound = datavalue.value.upperBound, lowerBound = datavalue.value.lowerBound, unit = unit, unitraw = unitraw, valuesi = valuesi, amountsi = amountsi, unitrawsi = unitrawsi, unitsi = unitsi}
		end

	elseif datatype == 'url' then
		if options.label and options.label ~= '' then
			return {value = '[' .. datavalue.value .. ' ' .. options.label .. ']'}
		else
			return {value = datavalue.value}
		end

	elseif datatype == 'monolingualtext' then
		local texten = versalisering(datavalue.value.text, options)
		if not options.langpref or options.langpref == '' then
			return {value = mw.text.tag('span', {title = mw.language.fetchLanguageName(datavalue.value.language, 'sv')}, texten), text = texten}
		else
			if options.langpref == datavalue.value.language then
				return {value = mw.text.tag('span', {title = mw.language.fetchLanguageName(datavalue.value.language, 'sv')}, texten), text = texten}
			end
		end
	else
		return {value = formatError( 'unknown-datatype' )}
	end
end

function formatEntityId( entityId, options )
	local label = options.label or mw.wikibase.label( entityId )
	if label == '' then
		label = mw.wikibase.label( entityId ) or nil
	end
	if options.labelformatter and options.labelformatter ~= '' then
		local formatter = require ('Module:Wikidata2/Aux2')
		local fun = formatter[options.labelformatter]
		if fun then
			label = fun(label, options)
		end
	end
	if options.labelgender and options.labelgender ~= '' then
		local labelgenus  = formatStatements({property=(options.labelgenderproperty or 'P1549'), entityId=entityId, langpref = (options.labelgenderlangpref or 'sv'), preferqualifier = (options.labelgenderqualifier or 'P518'), preferqualifiervalue = options.labelgender, noref='true', versalisering = options.versalisering, firstversalisering = options.firstversalisering})
		if labelgenus and labelgenus ~= '' then
			label = labelgenus
		end
	end
	local link = mw.wikibase.sitelink( entityId )

	if link and (not options.nolink or options.nolink == '') then
		if label and label ~= '' then
			return {value = '[[:' .. link .. '|' .. versalisering(label, options) .. ']]', label = label }
		else
			return {value = '[[:' .. versalisering(link, options) .. ']]', label = link }
		end
	else
		if label then
			return {value = versalisering(label, options), label = label}
		else
			local s = getLabelFromFallBack( entityId )
			local l = mw.language.fetchLanguageName(s.language, 'sv')
			if not l or l == '' then
				l = 'okänt språk'
			end
			if s then
				return {value = mw.text.tag('span', {title = l, ['data-q'] = entityId, class='modulwikidata2_missingswedishlabel'}, versalisering(s.value, options) ), cat = 'Wikidataetiketter på ' .. l, label = s.value }
			end
		end
		return {value = entityId, cat = 'som har labels med Qid', label = entityId}
	end
end

function formatFromPattern( str, options )
	-- Escape any % in str with another % before using it as replacement in gsub
	str = string.gsub( str, '%%', '%%%%' )
	return mw.ustring.gsub( options.pattern, '$1',  str) .. '' --Hack to get only the first result of the function
end

local p = {}

function p.formatEntityId( entityId, options )
	return formatEntityId( entityId, (options or {}) )
end

function p.formatStatements( frame, key )
	local args = frame.args

	--If a value if already set, use it
	if args.value and args.value ~= '' then
		return args.value
	end
	return formatStatements( frame.args, key )
end

function p.formatStatementsFromLua( options, key )
	--If a value if already set, use it
	if options.value and options.value ~= '' then
		return options.value
	end
	local s = formatStatements( options, key )
	if s == '' then
		s = nil
	end
	return s
end

-- Return the site link (for the current site) for a given data item.
function p.getSiteLink( frame )
	if frame.args[1] == nil then
		entity = mw.wikibase.getEntityObject()
		if not entity then
			entity = mw.wikibase.getEntityObject(frame.args[1])
		end
		id = entity.id
	else
		id = frame.args[1]
	end

	return mw.wikibase.sitelink( id )
end

-- Simple for simple templates like {{Q|}}}
function p.getLabel(frame) 
	local args = frame.args
	local entity = args.entity
	local lang = args.lang
	if lang == '' then
		lang = defaultlang
	end

	if string.sub(entity, 1, 10) == 'Property:P' then
		entity = string.sub(entity, 10)
	elseif (string.sub(entity, 1, 1) ~= 'P' and string.sub(entity, 1, 1) ~= 'Q') or (not tonumber(string.sub(entity, 2))) then
		return i18n('invalid-id')
	end

	if not args.link or args.link == '' then -- by default: no link
		args.link = '-'
	end
	if args.link == '-' then
		return p._getLabel(entity, lang) or i18n('invalid-id')
	else
		return p.formatEntity(entity, args)
	end
end

-- This is used to get the TA98 (Terminologia Anatomica first edition 1998) values like 'A01.1.00.005' (property P1323)
-- which are then linked to http://www.unifr.ch/ifaa/Public/EntryPage/TA98%20Tree/Entity%20TA98%20EN/01.1.00.005%20Entity%20TA98%20EN.htm
-- uses the newer mw.wikibase calls instead of directly using the snaks
-- formatPropertyValues returns a table with the P1323 values concatenated with ", " so we have to split them out into a table in order to construct the return string
p.getTAValue = function(frame)
	local ent = mw.wikibase.getEntityObject()
	local props = ent:formatPropertyValues('P1323')
	local out = {}
	local t = {}
	for k, v in pairs(props) do
		if k == 'value' then
			t = mw.text.split( v, ", ")
			for k2, v2 in pairs(t) do
				out[#out + 1] = "[http://www.unifr.ch/ifaa/Public/EntryPage/TA98%20Tree/Entity%20TA98%20EN/" .. string.sub(v2, 2) .. "%20Entity%20TA98%20EN.htm " .. v2 .. "]"
			end
		end
	end
	ret = table.concat(out, "<br> ")
	if #ret == 0 then
		ret = "Invalid TA"
	end
	return ret
end

p.commonscat_WD = function(frame)  -- används av mallen commonscat_WD
	local res = ''
	local item = mw.wikibase.getEntityObject()
	local qid = frame:getParent().args[1]
	if qid then item = mw.wikibase.getEntityObject(qid) end
	if item and p.formatStatementsFromLua({property="p373",noref="ja",entityId=item.id}) then 
		res = '* [[Fil:Commons-logo.svg|15px|länk=]] Wikimedia Commons har media som rör ' .. p.formatStatementsFromLua({property="p373",noref="ja",pattern="[[:Commons:Category:$1|$1]]",entityId=item.id})..'.'
    end
    return res
end

return p