Modul:Wikidata2

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 "9 juli 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å "9 juli 2024", "juli 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 (9 juli 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 (9 juli 2024-16 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 = {'nb', 'da', 'en', 'nn', 'de', 'fr', 'es', 'it', 'pt', 'fi'}local fallbackprio = { ['sv'] = 20, ['nb'] = 19, ['da'] = 18, ['en'] = 17, ['nn'] = 15, ['de'] = 12, ['fr'] = 11, ['es'] = 10, ['it'] = 8, ['pt'] = 7, ['fi'] = 6}local redundanta = {'viaf.org/viaf/', 'portal.dnb.de/', 'www.nndb.com/', 'catalogue.bnf.fr/ark', 'Gemeinsame Normdatei', 'Freebase Data Dumps'}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",["invalid-id"] = "Ogiltigt id",["no-label"] = "Etikett saknas"},["somevalue"] = "''unknown value''",["novalue"] = "''no value''"}local sortingproperties = {'P585','P571','P580','P569','P582','P570'}function namefordate(options)local entity = options.entityId or mw.wikibase.getEntityIdForCurrentPage()if entity == nil then return nil endtheobject = getEntityFromId(entity)if theobject == nil or theobject == '' or theobject.claims == nil then return nil endthetime = theobject.claims[options.labelfromnameproperty]if thetime == nil or thetime == '' then return nil endif thetime[1] == nil then return nil endif thetime[1].mainsnak.snaktype ~= 'value' then return nil end    tiden = string.match(thetime[1].mainsnak.datavalue.value.time,'%d+%-%d+%-%d+')if theobject.claims[options.property] == nil then return nil endallnamesobject = nil    for i,k in pairs(theobject["claims"][options.property]) doif theobject["claims"][options.property][i].rank~='deprecated' and theobject["claims"][options.property][i].mainsnak.snaktype == "value" thenallnamesobject = getEntityFromId(theobject["claims"][options.property][i]["mainsnak"].datavalue.value.id)endif rank=='preferred' thenbreakend    end    if allnamesobject == nil or allnamesobject == {} then return nil end    if allnamesobject.claims == nil then return nil end    allnames=allnamesobject.claims['P2561']if allnames == nil or allnames == '' then return nil endfound = nilfor i,k in pairs(allnames) dolang = k.mainsnak.datavalue.value.languageif k.qualifiers thenfromdate = nilp580 = k.qualifiers['P580']if p580 ~= nil and p580[1].snaktype == "value" then fromdate = string.match(p580[1].datavalue.value.time,'%d+%-%d+%-%d+') endtodate = nilp582 = k.qualifiers['P582']if p582 ~= nil and p582[1].snaktype == "value" then todate = string.match(p582[1].datavalue.value.time,'%d+%-%d+%-%d+') endif not ((fromdate and fromdate>tiden) or (p580 and p580[1].snaktype ~= "value") or (todate and todate<tiden) or (p582 and p582[1].snaktype ~= "value")) then if  lang == 'sv' or lang == 'mul' or lang == 'en' then found = k.mainsnak.datavalue.value.text endend    endendreturn foundend 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 == '' thenlab = formatStatements({property = 'P558', entityId = unit, enbarten = 'true', langpref = options.langpref, noref = 'true'})endif lab and ( not options.nounitshort or options.nounitshort == '' ) thenreturn formatEntityId( unit, {label = lab, nolink = (options.nounitlink or options.nolink) }).valueelse -- om det inte finns en förkortningreturn formatEntityId( unit, {nolink = options.nounitlink}).valueendendfunction multiplikation(a, b, typ)local r = {}if typ == '*' thenr.amount = tonumber(a.amount) * tonumber(b.amount)if tonumber(a.upperBound) and a.upperBound and b.upperBound thenr.upperBound = tonumber(a.upperBound) * tonumber(b.upperBound)endif tonumber(a.lowerBound) and a.lowerBound and b.lowerBound thenr.lowerBound = tonumber(a.lowerBound) * tonumber(b.lowerBound)endelseif typ == '/' thenif tonumber(b.amount) and tonumber(b.amount) ~= 0 thenr.amount = tonumber(a.amount) / tonumber(b.amount)endif tonumber(a.upperBound) and tonumber(b.lowerBound) and tonumber(b.lowerBound) ~= 0 thenr.upperBound = tonumber(a.upperBound) / tonumber(b.lowerBound)endif tonumber(a.lowerBound) and tonumber(b.upperBound) and tonumber(b.upperBound) ~= 0 thenr.lowerBound = tonumber(a.lowerBound) / tonumber(b.upperBound)endendif r.lowerBound and r.upperBound and r.lowerBound > r.upperBound thenlocal slask = r.lowerBoundr.lowerBound = r.upperBoundr.upperBound = slaskendreturn rendfunction fallbackigen(options, alternativ)if alternativ and alternativ ~= '' thenreturn alternativendif options.entity and options.entity.labels thenif options.entity.labels.sv thenreturn options.entity.labels.sv.valueelsefor k, v in pairs(fallback) doif options.entity.labels[v] thenreturn options.entity.labels[v].valueendendendfor v, k in pairs(options.entity.labels) doreturn k.valueendendreturn mw.title.getCurrentTitle().textendfunction regionaux(entity)local w = formatStatements({property = 'P297', entity = entity, noref = 'true', raw = 'true', enbarten = 'true'})if w and #w > 0 thenreturn w[1].valueendw = formatStatements({property = 'P300', entity = entity, noref = 'true', raw = 'true', enbarten = 'true'})if w and #w > 0 thenreturn w[1].valueendendfunction 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 w2endfunction regional(options, latitude)local i = 6local entity = options.entitylocal a = ''while i > 0 dolocal region = regionaux(entity)if region thenreturn regionendlocal v = regionaux2(entity)if v and #v > 0 thenentity = mw.wikibase.getEntityObject( v[1].item )endi = i - 1endlocal w = formatStatements({property = 'P17', entity = options.entity, noref = 'true', raw = 'true', enbarten = true})if w and #w > 0 thenw = formatStatements({property = 'P297', entityId = w[1].item, noref = 'true', raw = 'true', enbarten = true})if w and #w > 0 thenreturn w[1].valueendendif latitude and latitude < -65 then -- Antarktisreturn 'AQ'endreturn nilendfunction 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'endfunction inlist(needle, haystack)-- Checks if an item is present amongst the values of a listfor _, v in pairs(haystack) doif v == needle thenreturn trueend  return false  endendfunction koorder(data, options)if not data thenreturn nilendlocal 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 thens.lat_NS = 'N'elses.lat_NS = 'S'endif data.longitude > 0 thens.long_EW = 'E'elses.long_EW = 'W'endlocal frac = 0if data.precision == nil thens.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}) thens.lat_g, frac = math.modf(math.abs(data.latitude) / data.precision + 0.5) * data.precisions.long_g, frac = math.modf(math.abs(data.longitude) / data.precision + 0.5) * data.precisionelseif data.precision > 0.0166 and data.precision < 0.0167 thens.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 thens.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 thens.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)/10s.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)/10elseif data.precision > 0.00000277 and data.precision < 0.00000278 thens.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)/100s.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)/100elses.lat_g = math.abs(data.latitude)s.long_g = math.abs(data.longitude)endlocal params = s.lat_dec .. '_' .. s.lat_NS .. '_' .. s.long_dec .. '_' .. s.long_EWlocal typen = options.typen or 'landmark'local region = options.regionlocal pagename = fallbackigen(options, options.pagename)if not region and planet == 'earth' thenregion = regional(options, data.latitude)endlocal magic = ''if not options.nogeodataparser or options.nogeodataparser == '' thenlocal args = { data.latitude, data.longitude, globe = planet, type = typen, region = region, name = pagename }local primary = options.num == 1if options.primary and options.primary ~= '' thenprimary = options.primary == 'primary'endif primary thentable.insert( args, 1, 'primary' )endmagic = mw.getCurrentFrame():callParserFunction{name = '#coordinates',args = args}endif options.geodataparseronly and options.geodataparseronly ~= '' thenreturn magicendpagename = string.gsub (pagename, "([^%w ])",    function (c) return string.format ("%%%02X", string.byte(c)) end)     pagename = string.gsub (pagename, " ", "+")local nn = '&title=' .. pagenameif region thenplanet = planet .. '_region:' .. regionendif not options.label thenlocal a = s.lat_g .. '°'if s.lat_m thena = a .. s.lat_m .. '′'endif s.lat_s thena = a .. s.lat_s .. '″'enda = a .. s.lat_NSa = a .. ',' .. s.long_g .. '°'if s.long_m thena = a .. s.long_m .. '′'endif s.long_s thena = a .. s.long_s .. '″'enda = a .. s.long_EWreturn magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '&params=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ' ' .. a .. ']'endif options.label ~= '' thenreturn magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '&params=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ' ' .. options.label .. ']'elsereturn magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '&params=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ']'endendfunction getonly(claims, options)local claims2 = {}for i, j in pairs(claims) doif j.mainsnak and j.mainsnak.snaktype == 'value' and j.mainsnak.datavalue and j.mainsnak.datavalue.value and j.mainsnak.datavalue.value.id and options.getonly thenlocal t = j.mainsnak.datavalue.value.idlocal traff = falselocal t2 = formatStatements( {property = (options.getonlyproperty or "P31"), entityId = t, noref = 'true', raw = 'true' })if t2 and #t2 > 0 thenfor k, state in pairs( t2 ) dofor j2, only in pairs(mw.text.split(options.getonly,',')) doif state.item == only thentraff = trueendendendendif traff thentable.insert(claims2, j)endend-- filter by a list of Qid provided by option getonlyidsif j.mainsnak and j.mainsnak.snaktype == 'value' and j.mainsnak.datavalue and j.mainsnak.datavalue.value and j.mainsnak.datavalue.value.id and options.getonlyids thenlocal t = j.mainsnak.datavalue.value.idlocal traff = falsefor j2, only in pairs(mw.text.split(options.getonlyids,',')) doif t == only thentraff = trueendendif traff thentable.insert(claims2, j)endendendreturn claims2endfunction claimindex(claims, options)local claims2 = {}for j, index in pairs(mw.text.split(options.claimindex,',')) doif tonumber(index) and #claims >= tonumber(index) thentable.insert(claims2, claims[tonumber(index)])endendreturn claims2endfunction preferqualifier(claims, options)local claims2 = {}for i, statement in pairs( claims ) doif statement.qualifiers and statement.qualifiers[options.preferqualifier:upper()] thenif options.preferqualifiervalue and options.preferqualifiervalue ~= '' thenlocal active = falsefor k, t in pairs(mw.text.split(options.preferqualifiervalue,',')) dofor j, value in pairs(formatStatements({property=options.preferqualifier:upper(), raw = 'true'}, statement.qualifiers)) doif value.item == t and not active thentable.insert( claims2, statement)active = trueendendendelsetable.insert( claims2, statement)endendendreturn claims2endfunction versalisering(label, options)local versalisering = options.versaliseringif options.firstversalisering and options.num == 1 thenversalisering = options.firstversaliseringendif not versalisering or versalisering == '' thenreturn labelendif versalisering == 'lcfirst' thenreturn mw.getCurrentFrame():preprocess("{{lcfirst: " .. label .. " }}")elseif versalisering == 'ucfirst' thenreturn mw.language.getContentLanguage():ucfirst( label )elseif versalisering == 'lc' thenreturn mw.getCurrentFrame():preprocess("{{lc: " .. label .. " }}")elseif versalisering == 'uc' thenreturn mw.getCurrentFrame():preprocess("{{uc: " .. label .. " }}")endreturn labelendfunction getqualifierbysortingproperty(claim, sortingproperty)for k, v in pairs(sortingproperty) doif claim.qualifiers and claim.qualifiers[v] and claim.qualifiers[v][1].snaktype == 'value' thenif claim.qualifiers[v][1].datavalue.value.time thenreturn claim.qualifiers[v][1].datavalue.value.timeelsereturn claim.qualifiers[v][1].datavalue.valueendendendreturn nilendfunction getDate(claim, options)local sortingproperty = sortingpropertiesif type(options.sortingproperty) == 'table' thensortingproperty = options.sortingpropertyelseif type(options.sortingproperty) == 'string' thensortingproperty = {options.sortingproperty}endreturn getqualifierbysortingproperty(claim, sortingproperty)endfunction getDateArb(claim, options)local sortingproperty = options.sortingproperty or 'P569'if claim.mainsnak.snaktype == 'value' thenlocal item = getEntityIdFromValue( claim.mainsnak.datavalue.value )return formatStatements({property = sortingproperty, entityId = item, enbarten = 'ja', sortbytime = 'chronological', noref = 'ja'})endendfunction comparedates(a, b, options)if a==nil and (options.sortnotimeas == 'maxtime') then a = '+9999-12-31T23:59:59Z' endif b==nil and (options.sortnotimeas == 'maxtime') then b = '+9999-12-31T23:59:59Z' endif a and b thenreturn a > belseif a thenreturn trueendendfunction getValue(claim, options)local sortingproperty = sortingpropertiesif type(options.sortingproperty) == 'table' thensortingproperty = options.sortingpropertyelseif type(options.sortingproperty) == 'string' thensortingproperty = {options.sortingproperty}endreturn getqualifierbysortingproperty(claim, sortingproperty)endfunction comparevalues(a,b)if a and b thenreturn a > belseif a thenreturn trueendendfunction sortbyqualifier(claims, options)if options.sortbytime thentable.sort(claims, function(a, b)local timeA = getDate(a, options)local timeB = getDate(b, options)if options.sortbytime == 'inverted' thenreturn comparedates(timeB, timeA, options)elsereturn comparedates(timeA, timeB, options)endend)elseif options.sortbyvalue thentable.sort(claims, function(a, b)local valueA = tonumber(getValue(a, options))local valueB = tonumber(getValue(b, options))if options.sortbyvalue == 'ascending' thenreturn comparevalues(valueB, valueA)elsereturn comparevalues(valueA, valueB)endend)endreturn claimsendfunction getPrio(claim, options)local a = fallbackprio[claim.mainsnak.datavalue.value.language]if not a thenreturn 0endreturn aendfunction sortbylanguage(claims, options)if claims[1].mainsnak.datatype ~= 'monolingualtext' thenreturn claimsendtable.sort(claims, function(a, b)local prioA = getPrio(a, options)local prioB = getPrio(b, options)if options.sortbytime == 'inverted' thenreturn comparedates(prioB, prioB, options)elsereturn comparedates(prioA, prioB, options)endend)return claimsendfunction sortbyarb(claims, options)table.sort(claims, function(a,b)local timeA = getDateArb(a, options)local timeB = getDateArb(b, options)if options.sortbyarbitrary == 'inverted' thenreturn comparedates(timeB, timeA, options)elsereturn comparedates(timeA, timeB, options)endend)return claimsendfunction getLabelFromFallBack( id )local entity = {}if type(id) == 'table' thenentity = idid = entity.idelseentity = getEntityFromId( id )endif not entity or not entity.labels thenreturn {value = '[[d:' .. id .. '|' .. id .. ']][[Kategori:Wikidatabaserade länkar som leder till sidor utan etikett]]', language = ''}endfor k, v in pairs(fallback) doif entity.labels[v] thenreturn {value = entity.labels[v].value, language = entity.labels[v].language}endend-- Om inget fallback-språk finns av de i variabeln ovan, så används det först definierade i objektetif entity.labels thenfor v, k in pairs(entity.labels) doreturn {value = k.value, language = k.language}endendreturn {value = '-', language = ''}endfunction getEntityFromId( id )if id and id ~= ''thenreturn mw.wikibase.getEntityObject( id )elsereturn mw.wikibase.getEntityObject()endendfunction getEntityIdFromValue( value )if value['entity-type'] == 'item' thenreturn 'Q' .. value['numeric-id']elseif value['entity-type'] == 'property' thenreturn 'P' .. value['numeric-id']elsereturn formatError( 'unknown-entity-type' )endendfunction formatError( key )return '<span class="error">' .. i18n.errors[key] .. '</span>'endfunction formatStatements( options, ref )local formattedStatements = {}local claims = {}if not options.property thenreturn formatError( 'property-param-not-provided' )endif type(ref) == 'table' then -- för de fall där funktionen anropas och alla claims redan finns i en tabellclaims = ref[options.property] or {}else--Get entitylocal entity = nilif options.entity and type( options.entity ) == "table" thenentity = options.entityelseentity = getEntityFromId( options.entityId )options.entity = entityendif not entity thenreturn '' --TODO error?end--if property is given as Pxxx/Pyyy/..../Pzzz then --  climb the property path and change entity successively for all P... except the last one.--  only the first claim for each P... is considered--  if property is given as Pxxx:Qrrr,Qsss,.../Pyyy:Qttt,Quuu,.../..../Pzzz then--  filter for entities with P31=any of the given Q... on each level--  to filter on the last level, parameter "getonly" should be usedlocal props = mw.text.split(options.property:upper(),'/')for i,prop in ipairs(props) doif i<#props thenlocal prop_and_getonlys = mw.text.split(prop,':')if #prop_and_getonlys == 1 then  -- no getonly valuesif entity.claims[prop] == nil then return '' endif entity.claims[prop][1]['mainsnak'].datavalue == nil then return '' endif entity.claims[prop][1]['mainsnak'].datavalue.value == nil then return '' endoptions.entityId=entity.claims[prop][1]['mainsnak'].datavalue.value.id -- just use the first value if no filter givenif options.entityId == nil or entity.claims[prop][1]['rank'] == 'deprecated' thenreturn ''endentity = getEntityFromId( options.entityId )else-- one or more getonly values to be used as filterprop = prop_and_getonlys[1]:upper()local foundentity = falseif entity.claims[prop] ~= nil thenfor k,q in ipairs(entity.claims[prop]) do-- check all values for matchtestentity = getEntityFromId(q['mainsnak'].datavalue.value.id)p31s = testentity.claims['P31']for m,p31 in ipairs(p31s) do-- check all values for P31p31value = p31['mainsnak'].datavalue.value.id for j,getonly in ipairs(mw.text.split(prop_and_getonlys[2],',')) do  -- check against all getonly valuesif p31value == getonly and p31['rank'] ~= 'deprecated' thenfoundentity = testentityend endendendendif foundentity then entity = foundentityelsereturn ''endendelseoptions.property=prop:upper()    endendif not entity.claims or not entity.claims[options.property:upper()] thenreturn '' --TODO error?end--Format statement and concat them cleanlyif options.rank == 'best' or not options.rank thenclaims = entity:getBestStatements( options.property:upper() )elseif options.rank == 'valid' thenfor i, statement in pairs( entity.claims[options.property:upper()] ) doif statement.rank == 'preferred' thentable.insert( claims, statement )endendfor i, statement in pairs( entity.claims[options.property:upper()] ) doif statement.rank == 'normal' thentable.insert( claims, statement )endendelseif options.rank == 'all' thenfor i, statement in pairs( entity.claims[options.property:upper()] ) dotable.insert( claims, statement )endelsefor i, statement in pairs( entity.claims[options.property:upper()] ) doif statement.rank == options.rank thentable.insert( claims, statement )endendendif options.avoidqualifier or options.avoidqualifierand thenlocal claims2 = {}for i, statement in pairs( claims ) doif not statement.qualifiers thentable.insert( claims2, statement)elselocal avoid= falseif options.avoidqualifier thenlocal ptoavoid = mw.text.split(options.avoidqualifier:upper():gsub(' ',''),',')for i, p in pairs(ptoavoid) doif statement.qualifiers[p] thenavoid=trueendendendlocal avoidand = falseif options.avoidqualifierand thenavoidand = truelocal ptoavoid = mw.text.split(options.avoidqualifierand:upper():gsub(' ',''),',')for i,p in pairs(ptoavoid) doif not statement.qualifiers[p] thenavoidand = falseendendendif not (avoid or avoidand) thentable.insert( claims2, statement)endendendclaims = claims2endif options.preferqualifier and options.preferqualifier ~= '' thenclaims = preferqualifier(claims, options)endif options.avoidstringpattern and options.avoidstringpattern ~= '' thenlocal claims2 = {}for i, statement in pairs( claims ) doif statement.mainsnak.datavalue and statement.mainsnak.datavalue.type == 'string' thenif not (string.find(statement.mainsnak.datavalue.value,options.avoidstringpattern)) thentable.insert(claims2, statement)endelsetable.insert(claims2, statement)endendclaims = claims2end--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 == '' thenlocal claims2 = {}for i, statement in pairs( claims ) doif statement.qualifiers and statement.qualifiers.P407 thenfor k, v in pairs( statement.qualifiers.P407 ) doif v.snaktype == 'value' and v.datavalue.value['numeric-id'] == 9027 then -- Q9027 = 'svenska'table.insert( claims2, statement )endendelseif statement.qualifiers and statement.qualifiers.P282 thenfor k, v in pairs( statement.qualifiers.P282 ) doif v.snaktype == 'value' and v.datavalue.value['numeric-id'] == 8229 then -- Q8229 = 'latinska alfabetet'table.insert( claims2, statement )endendendendif #claims2 > 0 thenclaims = claims2endendif #claims > 1 then claims = sortbylanguage(claims, options)endif options.sortbytime == 'chronological' or options.sortbytime == 'inverted' or options.sortbyvalue == 'ascending' or options.sortbyvalue == 'descending' thenclaims = sortbyqualifier(claims, options)elseif options.sortbyarbitrary == 'chronological' or options.sortbyarbitrary == 'inverted' thenclaims = sortbyarb(claims, options)endif options.getonly and options.getonly ~= '' thenclaims = getonly(claims, options)endif options.getonlyids and options.getonlyids ~= '' thenclaims = getonly(claims, options)    endendif options.claimindex and #claims > 0 thenclaims = claimindex(claims, options)endif options.enbarten and options.enbarten ~= '' and #claims > 1 thenclaims = {claims[1]}endlocal statementsraw = {}if claims thenfor i, statement in pairs( claims ) dooptions.num = ilocal stat = formatStatement( statement, options )if stat thenlocal s = stat.valuelocal spostref = ''local d = stat.datumlocal tf = stat.tifrlocal pr = stat.prlocal av = stat.avlocal utgivort = stat.utgivortlocal m = stat.mandatperiodlocal valkrets = stat.valkretslocal regering = stat.regeringlocal arb = stat.forarbetelocal ordningsnummer = stat.ordningsnummerlocal parti = stat.partilocal partycolor = stat.partycolorlocal partilong = stat.partilonglocal objektroll = stat.objektrolllocal gatunr = stat.gatunrlocal tilsmns = stat.tillsammanslocal kellege = stat.kellegelocal foretradare = stat.foretradarelocal eftertradare = stat.eftertradarelocal slutorsak = stat.slutorsaklocal bd = stat.berorddelif s == '' then s = nil endif s thenif options.av and options.av ~= '' thenif stat.av and stat.av ~= '' thens = s .. (options.avalt or ' av') .. ' ' .. stat.avendendif m and options.withmandatperiod and options.withmandatperiod ~= '' thens = s .. mw.text.tag('br') .. mw.text.tag('small', {}, m)end if valkrets and options.withvalkrets and options.withvalkrets ~= '' thens = s .. mw.text.tag('small', {}, ', ' .. valkrets)end if regering and options.withregering and options.withregering ~= '' thens = s .. mw.text.tag('br') .. mw.text.tag('small', {}, regering)end if arb and options.withforarbete and options.withforarbete ~= '' thens = s .. ', för '.. mw.text.tag('i', {}, arb)end if ordningsnummer and options.ordningsnummer and options.ordningsnummer ~= '' thens = ordningsnummer .. '. ' .. send if objektroll and options.objektroll and options.objektroll ~= '' thens = s .. ', ' .. objektrollend if gatunr and options.gatunr and options.gatunr ~= '' thens = s .. ' ' .. gatunrend if parti and options.parti and options.parti ~= '' thens = s .. ', ' .. partiend if partycolor and options.partycolor and options.partycolor ~= '' thens = '<span style="background-color:#' .. partycolor .. '; color:white;border:1px solid darkgray;"> &nbsp; &nbsp; </span>&nbsp;' .. send if partilong and options.partilong and options.partilong ~= '' thens = s .. ', ' .. partilongend if tilsmns and options.withtillsammans and options.withtillsammans ~= '' thens = s .. ', med '.. ' ' .. tilsmnsend if options.helpmall and options.helpmall ~= '' thens = mw.getCurrentFrame():preprocess("{{" .. options.helpmall .. "|wdid=" .. s .. "}}")end if options.succession and options.succession ~= '' thenif tf and foretradare and eftertradare thens = mw.getCurrentFrame():preprocess("<tr style='text-align:center'><td style='width:30%' rowspan='1'><span style='white-space:nowrap'><small>Företrädare:</small><br/>" .. foretradare .. "</td><td style='width: 40%; text-align: center;' rowspan='1'>" .. s .. "<br/>" .. tf .. "</td><td style='width: 30%; text-align: center;' rowspan='1'><small>Efterträdare:</small><br/>" .. eftertradare .. "</td></tr>")elses = mw.getCurrentFrame():preprocess("<tr style='text-align:center'><td style='width:30%' rowspan='1'><span style='white-space:nowrap'><small>Företrädare:</small><br/>" .. (foretradare or '') .. "</td><td style='width: 40%; text-align: center;' rowspan='1'>" .. s .. "<br/>" .. (tf or '') .. "</td><td style='width: 30%; text-align: center;' rowspan='1'><small>Efterträdare:</small><br/>" .. (eftertradare or '') .. "</td></tr>")end end if options.examen thenif options.examen == 'examenslutdatum' and stat.examen ~= '' and stat.examen and stat.ti and stat.ti ~= '' thens = s .. ', ' .. stat.examen .. ', ' .. stat.tielseif options.examen == 'examenslutdatum' and stat.examen and stat.examen ~= '' thens = s .. ', ' .. stat.examen elseif options.examen == 'examenslutdatum' and stat.ti and stat.ti ~= '' thens = s .. ', ' .. stat.tielseif options.examen == 'baraslutdatum' and stat.ti and stat.ti ~= '' thens = stat.tiendendif d and options.withdate and options.withdate ~= '' thenif options.withdate == 'komma' thens = s .. ', ' .. ' ' .. delseif options.withdate == 'parentes' thens = s .. ' (' .. d .. ')'elseif options.withdate == 'only' thens = delses = s .. mw.text.tag('small', {}, ' (' .. d .. ')')endendif d and options.dateonly and options.dateonly ~= '' thens = dendif d == nil and options.dateonly and options.dateonly ~= '' thens = '-'endif tf and options.withintervall and options.withintervall ~= '' thenif options.withintervallformat == 'Y' thenfor i in mw.ustring.gmatch(tf,'">([^<]*)<',false) doj = mw.ustring.gsub(mw.ustring.gsub(i,'"',''),'%-','%%-')tf = mw.ustring.gsub(tf,j,mw.ustring.sub(j,1,4))endendif options.withintervall == 'gift' thenif kellege thens = s .. mw.text.tag('br') .. mw.text.tag('small', {}, '(g. ' .. tf .. ', ' .. kellege .. '[[Kategori:Uppgifter från Wikidata med förbehåll – äktenskap]])')elseif slutorsak thens = s .. mw.text.tag('br') .. mw.text.tag('small', {}, '(g. ' .. tf .. ', ' .. slutorsak .. ')')elses = s .. mw.text.tag('br') .. mw.text.tag('small', {}, '(g. ' .. tf .. ')')endendelseif options.withintervall == 'komma' thens = s .. ', ' .. tfelseif options.withintervall == 'bara' thens = tfelses = s .. mw.text.tag('small', {}, ' (' .. tf .. ')')endendif kellege and options.withkellege and options.withkellege ~= '' thens = s .. ' ('.. kellege.. ')[[Kategori:Uppgifter från Wikidata med förbehåll]]'end if utgivort and options.withutgivort and options.withutgivort ~= '' thenif options.withutgivort == 'parantes och small' thens = s .. ' ' .. mw.text.tag('small', {}, ' (' .. utgivort .. ')')elses = s .. ' ' .. utgivortendendif options.getsimpleproperty == 'född' and pr and pr ~= '' thens = s .. ' ' .. mw.text.tag('small', {}, '(f. ' .. pr .. ')')endif options.getsimpleproperty == 'parentes' and pr and pr ~= '' thens = s .. ' ' .. mw.text.tag('span', {}, '(' .. pr .. ')')endif options.getsimpleproperty == 'avnågon' and pr and pr ~= '' thens = s .. ' ' .. mw.text.tag('span', {}, ' av ' .. pr .. '')endif options.getsimpleproperty == '15px' and pr and pr ~= '' thens = '[[File:' .. pr .. '|15px]]&nbsp;' .. sendif options.getsimpleproperty == 'slepspenne' and pr and pr ~= '' thens = '[[File:' .. pr .. '|50x20px]]&nbsp;' .. sendif options.getsimpleproperty == 'only' thenif pr and pr ~= '' thens = prelses = ''endendif options.grav and options.grav ~= '' thenif options.grav == 'coordonly' thenif stat.koord thenspostref = '<br/>' .. stat.koordendelseif stat.gravid thenspostref = '<br/>' .. stat.gravidendif stat.koord thenspostref = spostref .. '<br/>' .. stat.koordendendendif bd and options.withbd thens = s .. ' ' .. mw.text.tag('small', {}, '<br />('.. bd ..')')end if type(ref) == 'table' then --Inte leta efter referenser om själva anropet görs från en referenstable.insert( formattedStatements, s .. spostref )elselocal t = formatReferencesNew( statement, options)if t.flag thentable.insert( formattedStatements, s .. t.value .. spostref)stat.ref = t.valuestat.refraw = t.refrawstat.refquality = t.refqualityelsestat = nilendendendif stat thentable.insert(statementsraw, stat)endendendendlocal tot = mw.text.listToText( formattedStatements, options.separator, options.conjunction )if tot == '' then tot = nil endif options.wdlink and options.wdlink ~= '' thenlocal dlink = ''local wdlabel = 'WD'if options.wdlinklabel and options.wdlinklabel ~= '' thenwdlabel = options.wdlinklabelendif options.entityId thendlink = options.entityId .. '#' .. options.propertyelsedlink = 'Special:ItemByTitle/svwiki/' .. mw.getCurrentFrame():getParent():getTitle() .. '#' .. options.propertyendif options.wdlink == 'sub' thentot = tot .. ' ' .. mw.text.tag('sub', {}, '[[d:' .. dlink .. '|' .. wdlabel .. ']]')elseif options.wdlink == 'sup' thentot = tot .. ' ' .. mw.text.tag('sup', {}, '[[d:' .. dlink .. '|' .. wdlabel .. ']]')elseif options.wdlink == 'small' thentot = tot .. ' ' .. mw.text.tag('small', {}, '[[d:' .. dlink .. '|' .. wdlabel .. ']]')elsetot = tot .. ' [[d:' .. dlink .. '|'.. wdlabel ..']][[Kategori:Wikidatatest4]]'endendif options.raw and options.raw ~= '' thenreturn statementsrawendif options.numberofclaims and options.numberofclaims ~= '' thenreturn #formattedStatementsendreturn totendfunction formatReferencesNew( statement, options)local limit = tonumber(options.sourcelimit) or 3local reference = {}local references = {}local quality = 0 -- ingen källa allslocal flagga = falselocal limitcounter = 0local qualmax = 0local qual2 = 0if statement.references thenlocal cite = require('Modul:Cite')for i, ref in pairs(statement.references) dolocal items, s = {}, nilqual2 = 100if ref.snaks thenif ref.snaks.P248 thenfor j, prop in pairs(ref.snaks.P248) doif prop.snaktype=='value' thentable.insert(items, getEntityIdFromValue( prop.datavalue.value ))endendendif quality < 10 and (ref.snaks.P143 or ref.snaks.P4656 or ref.snaks.P3452) thenquality = 10 -- kvalite (importerad från och härlett från)endif quality < 100 and not (ref.snaks.P143 or ref.snaks.P4656 or ref.snaks.P3452) thenquality = 100 -- källa finns och den är (förhoppningsvis) bättre än "importerad från" och "härlett från".endif (options.noref and options.noref ~= '' and options.noref ~= 'noimport') or (options.noref == 'noimport' and (ref.snaks.P143 or ref.snaks.P4656 or ref.snaks.P3452 or ref.snaks.P887)) then--elses = cite.citeitem( items, ref.snaks, options )if s == '' or not s thens = 'Källangivelsen på Wikidata använder egenskaper (properties) som inte känns igen av Modul:Cite'qual2 = 10endif (ref.snaks.P143 or ref.snaks.P4656 or ref.snaks.P3452) thenqual2 = 25 -- importerad frånendif s thenfor j, rr in pairs(redundanta) doif s:match(rr) thenqual2 = 50endendendendendif s and s ~= '' then-- ta bort unika koder med oklart syfte, -- de gjorde att det blev Referensfel: Taggen <ref> är ogiltig; namnet "..." definieras flera gånger med olika innehålls=s:gsub('\"\`UNIQ.-QINU`\"','')table.insert(reference, {value = s, name = ref.hash, qq = qual2})endif qual2 > qualmax thenqualmax = qual2endendif (options.sources == 'required' and quality > 99) or  (options.sources == 'basic' and quality > 9) or (not options.sources or options.sources == '') thenfor i, ref in pairs(reference) doif limitcounter < limit thenif options.norefrank and options.norefrank ~= '' thentable.insert(references, mw.getCurrentFrame():extensionTag( 'ref', ref.value, {name = ref.name}))limitcounter = limitcounter + 1elseif ref.qq >= qualmax thentable.insert(references, mw.getCurrentFrame():extensionTag( 'ref', ref.value, {name = ref.name}))limitcounter = limitcounter + 1endendendendflagga = trueelseflagga = falseendelseif not options.sources or options.sources == '' thenflagga = trueendendreturn {value = table.concat(references), refquality = quality, refraw = reference, flag = flagga}endfunction formatStatement( statement, options )if statement.type == 'statement' thenlocal s = formatSnak( statement.mainsnak, options )if s and statement.qualifiers thenif statement.qualifiers.P102 then -- tillhör politiskt partis.parti = formatStatements({property = "P102", conjunction = ', ', noref = 'true', kortnamn = 'true'}, statement.qualifiers)endif statement.qualifiers.P102 then -- partifärgs.partycolor = formatStatements({property = "P102", enbarten = 'true', noref = 'true', RGBcolor = 'true', nolink= 'true'}, statement.qualifiers)endif statement.qualifiers.P102 then -- långt namn på politiskt partis.partilong = formatStatements({property = "P102", conjunction = ', ', noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P3831 then -- objektrolls.objektroll = formatStatements({property = "P3831", conjunction = ', ', noref = 'true', kortnamn = 'true'}, statement.qualifiers)endif statement.qualifiers.P670 then -- gatunummers.gatunr = formatStatements({property = "P670", conjunction = ', ', noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P574 thens.dateoftaxpub = formatStatements({property = "P574", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime}, statement.qualifiers)endif statement.qualifiers.P585 thens.datum = formatStatements({property = "P585", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime}, statement.qualifiers)endif statement.qualifiers.P512 then -- akademisk examens.examen = formatStatements({property = "P512", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime, somevalue = ''}, statement.qualifiers)endif statement.qualifiers.P625 thenif s.item thenlocal opt = optionsopt.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 or 'secondary'), pagename=options.koordpagename, geodataparseronly = options.geodataparseronly, region = region}, statement.qualifiers)elses.koord = formatStatements({property = "P625", enbarten = 'true', noref = 'true', label = options.koordlabel, typen = options.koordtypen, primary = (options.koordprimary or 'secondary'), pagename=options.koordpagename, geodataparseronly = options.geodataparseronly}, statement.qualifiers)endendif statement.qualifiers.P965 thens.gravid = formatStatements({property = "P965", noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P405 thenlocal auktorer = {}for i, j in pairs(statement.qualifiers.P405) doif j.snaktype == 'value' thenlocal item = getEntityIdFromValue( j.datavalue.value )local auktorsnamn = formatStatements({property = "P428", entityId = item, noref = 'ja', enbarten = 'ja'})if auktorsnamn and auktorsnamn ~= '' thentable.insert(auktorer, formatEntityId(item, {label = auktorsnamn}).value)elsetable.insert(auktorer, formatEntityId(item, {}).value)endendends.auktor = mw.text.listToText(auktorer, ', ', ' & ')endif s and (statement.qualifiers.P580 or statement.qualifiers.P582) thenlocal f = formatStatements({property = "P580", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime, somevalue = options.intervallsomevalue or ''}, statement.qualifiers) or ''local t = formatStatements({property = "P582", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime, somevalue = options.intervallsomevalue or ''}, statement.qualifiers) or ''s.tifr = f .. '–' .. tif statement.qualifiers.P582 thens.ti = formatStatements({property = "P582", enbarten = 'true', noref = 'true', modifytime = options.modifyqualifiertime, somevalue = ''}, statement.qualifiers) or ''endendif statement.qualifiers.P642 thenlocal av = formatStatements({property = "P642", enbarten = 'true', noref = 'true', relevantred = 'true'}, statement.qualifiers) or ''s.av = avendif statement.qualifiers.P291 thens.utgivort = formatStatements({property = "P291", noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)endif statement.qualifiers.P2096 thens.bildtext = formatStatements({property = "P2096", noref = 'true', langpref = (options.langpref or 'sv')}, statement.qualifiers)endif statement.qualifiers.P180 thens.motiv = formatStatements({property = "P180", noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P2937 thens.mandatperiod = formatStatements({property = "P2937", noref = 'true', novalue = ''}, statement.qualifiers)endif statement.qualifiers.P768 thens.valkrets = formatStatements({property = "P768", noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P5054 thens.regering = formatStatements({property = "P5054", noref = 'true', relevantred = 'true'}, statement.qualifiers)endif statement.qualifiers.P1686 thens.forarbete = formatStatements({property = "P1686", noref = 'true', relevantred = 'true'}, statement.qualifiers)endif statement.qualifiers.P1545 thens.ordningsnummer = formatStatements({property = "P1545", noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P1706 thens.tillsammans = formatStatements({property = "P1706", noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P1480 thens.kellege = formatStatements({property = "P1480", noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P1365 thens.foretradare = formatStatements({property = "P1365", noref = 'true', redlink = 'true', novalue = ''}, statement.qualifiers)endif statement.qualifiers.P1366 thens.eftertradare = formatStatements({property = "P1366", noref = 'true', redlink = 'true', novalue = ''}, statement.qualifiers)endif statement.qualifiers.P1534 thens.slutorsak = formatStatements({property = "P1534", noref = 'true'}, statement.qualifiers)endif statement.qualifiers.P518 thens.berorddel = formatStatements({property = "P518", noref = 'true'}, statement.qualifiers)end if statement.qualifiers.P7903 thens.fick = formatStatements({property = "P7903", noref = 'true'}, statement.qualifiers)end if statement.qualifiers.P7904 thens.gav = formatStatements({property = "P7904", noref = 'true'}, statement.qualifiers)end if s thenif options.qual1 and options.qual1 ~= '' and statement.qualifiers[options.qual1] thens.qp1 = formatStatements({property = options.qual1, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction, convertunit = options.qualifierconvertunit, withoutunit = options.qualifierwithoutunit, noformatera = options.qualifiernoformatera}, statement.qualifiers)endif options.qual2 and options.qual2 ~= '' and statement.qualifiers[options.qual2] thens.qp2 = formatStatements({property = options.qual2, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)endif options.qual3 and options.qual3 ~= '' and statement.qualifiers[options.qual3] thens.qp3 = formatStatements({property = options.qual3, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)endif options.qual4 and options.qual4 ~= '' and statement.qualifiers[options.qual4] thens.qp4 = formatStatements({property = options.qual4, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)endif options.qual5 and options.qual5 ~= '' and statement.qualifiers[options.qual5] thens.qp5 = formatStatements({property = options.qual5, noref = 'true', separator = options.qualifierseparator, conjunction = options.qualifierconjunction}, statement.qualifiers)endendendreturn selseif not statement.type thenreturn formatSnak( statement, options )endreturn {value = formatError( 'unknown-claim-type' )}endfunction formatSnak( snak, options )if snak.snaktype == 'somevalue' thenif options.somevalue thenif options.somevalue == '' thenreturn nilelsereturn {value = options.somevalue}endendreturn {value = i18n['somevalue']}elseif snak.snaktype == 'novalue' thenif options.novalue thenif options.novalue == '' thenreturn nilelsereturn {value = options.novalue}endendreturn {value = i18n['novalue']}elseif snak.snaktype == 'value' thenlocal s = formatDatavalue( snak.datavalue, options, snak.datatype )if s and options.prefix and options.prefix ~= '' thens.value = options.prefix .. s.valueendif s and options.suffix and options.suffix ~= '' thens.value = s.value .. options.suffixendif s and s.item and options.getsimpleproperty and options.getsimpleproperty ~= '' and options.getproperty and options.getproperty ~= '' thenlocal pr = formatStatements({property = options.getproperty, entityId = s.item, enbarten = options.getenbarten, noref = 'ja', modifytime = options.getmodifytime, somevalue = options.getsomevalue, novalue=options.getnovalue ,raw = options.getraw})if pr then s.pr = pr endendreturn selsereturn {value = formatError( 'unknown-snak-type' )}endendfunction formatDatavalue( datavalue, options, datatype )--Use the customize handler if providedif options['value-module'] or options['value-function'] thenif not options['value-module'] or not options['value-function'] thenreturn {value = formatError( 'unknown-value-module' )}endlocal formatter = require ('Module:' .. options['value-module'])if not formatter thenreturn {value = formatError( 'value-module-not-found' )}endlocal fun = formatter[options['value-function']]if not fun thenreturn {value = formatError( 'value-function-not-found' )}endreturn {value = fun( datavalue.value, options )}end--Default formattersif datatype == 'wikibase-item' thenlocal s = formatEntityId( getEntityIdFromValue( datavalue.value ), options )s.item = getEntityIdFromValue( datavalue.value )if options.relevans and options.relevans ~= '' thenif not mw.wikibase.sitelink( s.item ) thenreturn nilendendreturn selseif datatype == 'string' or datatype == 'commonsMedia' or datatype == 'external-id' thenif options.pattern and options.pattern ~= '' thenlocal patter = formatStatements( {property = "P1630", entityId = options.property, enbarten = 'true', noref = 'true' })if options.pattern == "auktoritetsdata" and patter and patter ~= '' thenreturn {value = formatFromPattern( datavalue.value, {pattern = patter} )}elseif options.pattern == "auktoritetsdata2" and patter and patter ~= '' thenreturn {value = '[' .. formatFromPattern( datavalue.value, {pattern = patter} ) .. ' ' .. datavalue.value .. ']' }elseif (options.pattern == "auktoritetsdata2") then  -- options.pattern blir sönderskriven(?) av funktionen getMost() i Modul:Cite-- återställer till ett defaultvärde i detta fall när P1630 saknas för property och formatFromPattern annars kör i diketoptions.pattern = '$1'endreturn {value = formatFromPattern( versalisering(datavalue.value, options), options )}endelsereturn {value = versalisering(datavalue.value, options), label = datavalue.value}endelseif datatype == 'time' thenlocal Time = require 'Module:Time'local tid = Time.newFromWikidataValue( datavalue.value ):toHtml()local gs = nilif datavalue.value.calendarmodel:match('Q%d+') == 'Q1985786' then -- juliansk kalenderlocal yr = tonumber(string.sub(datavalue.value.time, 0, string.find(datavalue.value.time, '-', 2)-1)) --försök hämta årtalet oformateratlocal gr = tonumber(options.gs) or 1582 -- låt 1582 vara default-värde för när gs ska angesif yr > gr or options.gs == 'always' then -- gs = '([[Gamla stilen och nya stilen|g.s.]])'endendif options.modifytime == 'longdate' thenlocal mall = ''if datavalue.value.precision >= 11 thenmall = '{{#time:j F Y|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)elseif datavalue.value.precision == 10 thenmall = '{{#time:F Y|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)elseif datavalue.value.precision == 9 thenmall = '{{#time:Y|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)endelseif options.modifytime == 'longdatelink' thenlocal mall = ''if datavalue.value.precision >= 11 thenmall = '{{#time:[[j F]] [[Y]]|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)elseif datavalue.value.precision == 10 thenmall = '{{#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 thenmall = '{{#time:[[Y]]|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)endelseif options.modifytime == 'Y' thenlocal mall = ''local thetime = datavalue.value.time if string.sub(datavalue.value.time,1,1) == '-' thenthetime = string.sub(thetime,2)    mall = '{{#time:Y|' .. string.gsub(thetime,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)..' f.Kr.'elsemall = '{{#time:Y|' .. string.gsub(thetime,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)endif tid == "0000" thentid = "0"        else tid = string.gsub(tid,"^0+","")endelseif options.modifytime == 'Ylink' thenlocal mall = '{{#time:[[Y]]|' .. string.gsub(datavalue.value.time,'-00','-01') .. '}}'tid = mw.getCurrentFrame():preprocess(mall)end-- do not display time value if the precision is lower than lowesttimeprecisionif options.lowesttimeprecision and options.lowesttimeprecision ~= '' and datavalue.value.precision<tonumber(options.lowesttimeprecision) thentid = '' end   if options.gs and gs then    tid = tid .. ' ' .. gs   endreturn {value = tid}elseif datatype == 'globe-coordinate' thenreturn {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' thenlocal amount, unit = datavalue.value.amount, datavalue.value.unitlocal amountR = formatera.newFromWikidataValueR(datavalue.value)local orginal = datavalue.valuelocal amountsi, unitsi, unitrawsi, numbersi, valuesi= nil, nil, nil, nil, nillocal amountsiupperBound, amountsilowerBound = nil, nillocal amountconv, numberconv, unitconv, unitrawconv, valueconv = nil, nil, nil, nil, nilif unit thenunit = unit:match('Q%d+')endlocal number = nildatavalue.value.norounding = options.noroundingif options.noformatera and options.noformatera ~= '' thennumber = formatera.newFromWikidataValueR(datavalue.value)elsenumber = formatera.newFromWikidataValue(datavalue.value)endlocal unitraw = unit -- enheten som Qidif unit thenunit = unithandle(unit, options)-- skickar tillbaka enheten i hanterbart formatif not options.antiloop and options.convertunit and options.convertunit ~= '' and options.convertunit ~= unitraw then -- Av eknomiska skäl görs detta bara om konvertering efterfrågas och om den efterfrågade enheten inte är den som redan existerarlocal a = formatStatements({property = 'P2370', entityId = unitraw, enbarten = 'true', noref = 'true', raw = 'true', antiloop = 'true'})local b = formatStatements({property = 'P2370', entityId = options.convertunit, enbarten = 'true', noref = 'true', raw = 'true', antiloop = 'true'})if a and b and #a > 0 and b and #b > 0 then local orginalsi = multiplikation(datavalue.value, a[1], '*') -- multiplicera orginalet för att få fram SI-enhetenlocal orginalcv = multiplikation(orginalsi, b[1], '/') -- Dividera för att få fram den efterfrågade enhetenamountsi = orginalsi.amountamountsiR = formatera.newFromWikidataValueR(orginalsi)if options.noformatera and options.noformatera ~= '' thennumbersi = amountsielselocal lang = mw.language.new( 'sv' )numbersi = lang:formatNum(tonumber(amountsi))endunitsi = a[1].unitunitrawsi = a[1].unitrawvaluesi = numbersi .. ' ' .. (unitsi or '')amountconv = orginalcv.amountamountconvR = formatera.newFromWikidataValueR(orginalcv)if options.noformatera and options.noformatera ~= '' thennumberconv = formatera.newFromWikidataValueR(orginalcv)elsenumberconv = formatera.newFromWikidataValue(orginalcv)endunitrawconv = options.convertunitunitconv = unithandle(options.convertunit, options)upperBoundconv, lowerBoundconv = orginalcv.upperBound, orginalcv.lowerBoundif options.withoutunit and options.withoutunit ~= '' thenvalueconv = numberconvelsevalueconv = numberconv .. ' ' .. (unitconv or '')endreturn {value = valueconv, amount = amountconv, amountR = amountconvR, upperBound = upperBoundconv, lowerBound = lowerBoundconv, unit = unitconv, unitraw = unitrawconv, valuesi = valuesi, amountsi = amountsi, amountsiR = amountsiR, unitrawsi = unitrawsi, unitsi = unitsi}elsereturn {value = number .. ' ' .. (unit or '') .. ' ' .. formatError( 'non-convertible unit') .. '[[Kategori:Wikidata:Påståenden som inte går att konvertera]]', amount = amount, amountR = amountR, upperBound = datavalue.value.upperBound, lowerBound = datavalue.value.lowerBound, unit = unit, unitraw = unitraw, valuesi = valuesi, amountsi = amountsi, amountsiR = amountsiR, unitrawsi = unitrawsi, unitsi = unitsi}endendendif not unit and options.convertunit and options.convertunit ~= '' thennumber = number .. formatError( 'non-convertible unit') .. '[[Kategori:Wikidata:Påståenden som inte går att konvertera]]'endif options.withoutunit and options.withoutunit ~= '' thenreturn {value = number, amount = amount, amountR = amountR, upperBound = datavalue.value.upperBound, lowerBound = datavalue.value.lowerBound, unit = unit, unitraw = unitraw, valuesi = valuesi, amountsi = amountsi, unitrawsi = unitrawsi, unitsi = unitsi}elsereturn {value = number .. ' ' .. (unit or ''), amount = amount, amountR = amountR, upperBound = datavalue.value.upperBound, lowerBound = datavalue.value.lowerBound, unit = unit, unitraw = unitraw, valuesi = valuesi, amountsi = amountsi, unitrawsi = unitrawsi, unitsi = unitsi}endelseif datatype == 'url' thenif options.label and options.label ~= '' thenreturn {value = '[' .. datavalue.value .. ' ' .. options.label .. ']'}elsereturn {value = datavalue.value}endelseif datatype == 'monolingualtext' thenlocal texten = versalisering(datavalue.value.text, options)if not options.langpref or options.langpref == '' thenreturn {value = mw.text.tag('span', {title = mw.language.fetchLanguageName(datavalue.value.language, 'sv')}, texten), text = texten}elseif options.langpref == datavalue.value.language thenreturn {value = texten, text = texten}endendelseif datatype == 'geo-shape' and datavalue and datavalue.type and datavalue.type == "string" thenreturn { value = datavalue.value }elsereturn {value = formatError( 'unknown-datatype' )}endendfunction formatEntityId( entityId, options )local label = options.label or mw.wikibase.getLabelByLang( entityId, 'sv' )if label == '' thenlabel = mw.wikibase.getLabelByLang( entityId, 'sv' ) or nilendif options.labelformatter and options.labelformatter ~= '' thenlocal formatter = require ('Module:Wikidata2/Aux2')local fun = formatter[options.labelformatter]if fun thenlabel = fun(label, options)endendif options.labelgender and options.labelgender ~= '' thenlocal 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 ~= '' thenlabel = labelgenusendendif options.kortnamn and options.kortnamn ~= '' thenlocal kortnamn = formatStatements({property='P1813', entityId = entityId, enbarten = 'ja', noref = 'ja'})if kortnamn and kortnamn ~= '' thenlabel = kortnamnendendif options.RGBcolor and options.RGBcolor ~= '' thenlocal RGBcolor = formatStatements({property='P465', entityId = entityId, enbarten = 'ja', noref = 'ja'})if RGBcolor and RGBcolor ~= '' thenlabel = RGBcolorendendif options.qvalue and options.qvalue ~= '' thenlocal qvalue = formatStatements({entityId = entityId, noref = 'ja'})if qvalue and qvalue ~= '' thenlabel = entityIdendendif options.labelfromnameproperty and options.labelfromnameproperty ~= '' thenlocal newlabel = namefordate(options)if newlabel and newlabel ~= '' then label = newlabel endendlocal link = mw.wikibase.sitelink( entityId )if link and (not options.nolink or options.nolink == '') thenif label and label ~= '' thenreturn {value = '[[:' .. link .. '|' .. versalisering(label, options) .. ']]', label = label }elsereturn {value = '[[:' .. versalisering(link, options) .. ']]', label = link }endelseif label thenif not (options.redlink or options.redlink ~= '' or options.relevantred or options.relevantred ~= '') thenreturn {value = versalisering(label, options), label = label}elseif options.redlink and options.redlink ~= '' thenreturn {value = mw.getCurrentFrame():preprocess("{{#ifexist:" .. versalisering(label, options) .. "|[[" .. versalisering(label, options) .. " (" .. entityId .. ")|" .. versalisering(label, options) .. "]]|[[:" .. versalisering(label, options) .. ']]}}'), label = label}elseif options.relevantred and options.relevantred ~= '' thenlocal entity = mw.wikibase.getEntity( entityId )-- Downloadif entity.sitelinks thenreturn {value = mw.getCurrentFrame():preprocess("{{#ifexist:" .. versalisering(label, options) .. "|[[" .. versalisering(label, options) .. " (" .. entityId .. ")|" .. versalisering(label, options) .. "]]|[[:" .. versalisering(label, options) .. ']]}}'), label = label}elsereturn {value = versalisering(label, options), label = label}endelsereturn {value = versalisering(label, options), label = label}endelselocal s = getLabelFromFallBack( entityId )local l = mw.language.fetchLanguageName(s.language, 'sv')if not l or l == '' thenl = 'okänt språk'endif s thenif options.cat ~= 'false' thenreturn {value = mw.text.tag('span', {title = l, ['data-q'] = entityId, class='modulwikidata2_missingswedishlabel'}, versalisering(s.value, options) ) .. '[[Kategori:Wikidataetiketter på ' .. l .. ']][[Kategori:Wikidataetiketter på främmande språk för egenskapen ' .. (options.property or 'okänd egenskap') .. ']]', label = s.value }elsereturn {value = mw.text.tag('span', {title = l, ['data-q'] = entityId, class='modulwikidata2_missingswedishlabel'}, versalisering(s.value, options) ), label = s.value }endendendif options.cat ~= 'false' then return {value = entityId .. '[[Kategori:Wikidataetiketter med Qid]]', label = entityId}elsereturn {value = entityId, label = entityId}endendendfunction formatFromPattern( str, options )-- Escape any % in str with another % before using it as replacement in gsubstr = string.gsub( str, '%%', '%%%%' )return mw.ustring.gsub( options.pattern, '$1',  str) .. '' --Hack to get only the first result of the functionendlocal p = {}function p.formatEntityId( entityId, options )return formatEntityId( entityId, (options or {}) )endfunction p.formatStatements( frame, key )local args = frame.args--If a value if already set, use itif args.value and args.value ~= '' thenreturn args.valueendreturn formatStatements( frame.args, key )endfunction p.formatStatementsFromLua( options, key )--If a value if already set, use itif options.value and options.value ~= '' thenreturn options.valueendlocal s = formatStatements( options, key )if s == '' thens = nilendreturn send-- Return the site link (for the current site) for a given data item.function p.getSiteLink( frame )if frame.args[1] == nil thenentity = mw.wikibase.getEntityObject()if not entity thenentity = mw.wikibase.getEntityObject(frame.args[1])endid = entity.idelseid = frame.args[1]endreturn mw.wikibase.sitelink( id )endlocal function defaultLabel(entity, lang, displayformat) -- label when no label is availableif entity and displayformat == 'id' thenreturn entity.idendreturn formatError('no-label')endfunction p._getLabel(entity, lang, default)if not entity thenreturn nilendif type(entity) ~= 'table' thenentity = p.getEntity(entity)endif entity and entity.labels thenif entity.labels[lang] then return entity.labels[lang].value endif entity.labels["sv"] then return entity.labels["sv"].value elsefor i, lg in pairs(fallback) doif entity.labels[lg] thenreturn entity.labels[lg].valueendendendendreturn defaultLabel(entity, lang, default)endfunction p.getEntity( val )if type(val) == 'table' thenreturn valendreturn mw.wikibase.getEntityObject(val)end-- Simple for simple templates like {{Q|}}}function p.getLabel(frame) local args = frame.argslocal entity = args.entitylocal lang = args.langif lang == '' thenlang = defaultlangendif string.sub(entity, 1, 10) == 'Property:P' thenentity = 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))) thenreturn formatError('invalid-id')endif not args.link or args.link == '' then -- by default: no linkargs.link = '-'endif args.link == '-' thenreturn p._getLabel(entity, lang) or formatError('invalid-id')elsereturn p.formatEntity(entity, args)endend-- 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 stringp.getTAValue = function(frame)local ent = mw.wikibase.getEntityObject()local props = ent:formatPropertyValues('P1323')local out = {}local t = {}for k, v in pairs(props) doif k == 'value' thent = mw.text.split( v, ", ")for k2, v2 in pairs(t) doout[#out + 1] = "[http://www.unifr.ch/ifaa/Public/EntryPage/TA98%20Tree/Entity%20TA98%20EN/" .. string.sub(v2, 2) .. "%20Entity%20TA98%20EN.htm " .. v2 .. "]"endendendret = table.concat(out, "<br> ")if #ret == 0 thenret = "Invalid TA"endreturn retendp.commonscat_WD = function(frame)  -- används av mallen commonscat_WDlocal res = ''local item = mw.wikibase.getEntityObject()local qid = frame:getParent().args[1]if qid then item = mw.wikibase.getEntityObject(qid) endif item and p.formatStatementsFromLua({property="p373",noref="ja",entityId=item.id}) then svlabel = item.labels['sv']if svlabel thenlinktext = svlabel.valueelse linktext = '$1'endres = '* [[Fil:Commons-logo.svg|15px|länk=]] Wikimedia Commons har media som rör ' .. p.formatStatementsFromLua({property="p373",noref="ja",pattern="[[:Commons:Category:$1|"..linktext.."]]",entityId=item.id})..'.'elseres = '[[Kategori:Wikipedia:Artiklar med mallen Commonscat WD som saknar property P373]]'    end    return resendp.getEntityIdForCurrentPage = function(frame)return mw.wikibase.getEntityIdForCurrentPage()endp.getcoord = function(frame)    local qid = frame.args['qid'] or ''    local what = frame.args['what'] or ''    local item = mw.wikibase.getEntityObject(qid)    local claims = item:getBestStatements( 'P625' )    if what == 'lat' then     return claims[1].mainsnak.datavalue.value.latitude    end    if what == 'long' then     return claims[1].mainsnak.datavalue.value.longitudeendreturn ''endp.getcoordfromproperty = function(frame)local qid = frame.args['qid'] or mw.wikibase.getEntityIdForCurrentPage() or ''if qid == '' thenreturn ''    endlocal what = frame.args['what'] or ''local property = frame.args['property'] or ''local item = mw.wikibase.getEntityObject(qid)if item['claims'] and item['claims'][property] and item['claims'][property][1]['qualifiers'] and item['claims'][property][1]['qualifiers']['P625']thenif what=='lat' then return  item['claims'][property][1]['qualifiers']['P625'][1].datavalue.value.latitude endif what=='long' then return  item['claims'][property][1]['qualifiers']['P625'][1].datavalue.value.longitude endreturn ''elsereturn ''endendp.averagepropertyvalue = function(frame)--property is given as Pwww/Pxxx/..../Pyyy/Pzzz (at least two parts)--  all properties except the last one should return wikibase items--  climb the property path and change entity successively for all P... except the last two.--  only the first claim for each P... is considered    --  finally get the values for the last property (Pzzz) for all values (objects) of Pyyy and return the average value--  ranks are not considered--  claims with a qualifier corresponding to the argument 'avoidqalifier' is not included in the averagelocal options = frame.argslocal what = frame.args['what']local avoidqualifier = frame.args['avoidqualifier']local entityId = frame.args['qid'] or mw.wikibase.getEntityIdForCurrentPage() or ''if entityId == '' then return '' endentity = getEntityFromId( entityId )local property = frame.args['property']if property == nil then return '' end    local props = mw.text.split(property:upper(),'/')for i,prop in ipairs(props) doif i<#props-1 thenif entity.claims[prop] == nil then return '' endentityId=entity.claims[prop][1]['mainsnak'].datavalue.value.idif entityId == nil thenreturn '' endentity = getEntityFromId( entityId )endif i == #props-1 then theobjects = propend  -- the second last propertyif i == #props then theprop = prop end       -- the very last propertyendlocal summa = 0 local n = 0res = ''if entity.claims[theobjects] == nil then return '' endfor i,v in ipairs(entity.claims[theobjects]) doif v['mainsnak'].datatype ~= 'wikibase-item' then return '' endif v['qualifiers'] == nil or v['qualifiers'] and v['qualifiers'][avoidqualifier] == nil thenentityterm = getEntityFromId(v['mainsnak'].datavalue.value.id)if entityterm.claims[theprop] == nil then return '' endif entityterm.claims[theprop][1].mainsnak.datatype == 'quantity' thenn = n + 1 summa = summa + tonumber(entityterm.claims[theprop][1].mainsnak.datavalue.value.amount)res = summa/nelseif entityterm.claims[theprop][1].mainsnak.datatype == 'globe-coordinate' thenif what=='lat' then n = n + 1summa = summa + entityterm.claims[theprop][1].mainsnak.datavalue.value.latituderes = summa/nelseif what=='long' thenn = n + 1summa = summa + entityterm.claims[theprop][1].mainsnak.datavalue.value.longituderes = summa/nelsereturn ''endelse--TODO, not yet implementedreturn ''endendendreturn resendreturn p