Modul:Wikidata2: Skillnad mellan sidversioner
Utseende
Innehåll som raderades Innehåll som lades till
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)
- labelfromnameproperty = för den egenskap som anges i property väljs som etikett det namn (P2561) som har startdatum (P580) och/eller slutdatum (P582) som "gafflar in" den egenskapen som anges som parametervärde. Exempel på användning: property = P19, labelfromnameproperty = P569 för att få det namn (P2561) på födelseplats (P19) som gällde vid födelsedatum (P569).
- 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 .. '¶ms=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ' ' .. a .. ']'
end
if options.label ~= '' then
return magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '¶ms=' .. params .. '_globe:' .. planet .. '_type:' .. typen .. ' ' .. options.label .. ']'
else
return magic .. '[https://tools.wmflabs.org/geohack/geohack.php?language=sv' .. nn .. '¶ms=' .. 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
Kategorier:
- Wikidatamoduler
- Mallar och moduler som använder Property:P31
- Mallar och moduler som använder Property:P102
- Mallar och moduler som använder Property:P143
- Mallar och moduler som använder Property:P180
- Mallar och moduler som använder Property:P248
- Mallar och moduler som använder Property:P291
- Mallar och moduler som använder Property:P373
- Mallar och moduler som använder Property:P405
- Mallar och moduler som använder Property:P428
- Mallar och moduler som använder Property:P512
- Mallar och moduler som använder Property:P518
- Mallar och moduler som använder Property:P574
- Mallar och moduler som använder Property:P580
- Mallar och moduler som använder Property:P582
- Mallar och moduler som använder Property:P585
- Mallar och moduler som använder Property:P625
- Mallar och moduler som använder Property:P642
- Mallar och moduler som använder Property:P965
- Mallar och moduler som använder Property:P1323
- Mallar och moduler som använder Property:P1630
- Mallar och moduler som använder Property:P1686
- Mallar och moduler som använder Property:P2096
- Mallar och moduler som använder Property:P2370
- Mallar och moduler som använder Property:P2937
- Mallar och moduler som använder Property:P7903
- Mallar och moduler som använder Property:P7904