Moduuli:Sv:Wikidata

Wikipediasta
Siirry navigaatioon Siirry hakuun

Ruotsinkielisen Wikipedian ohjeet

[muokkaa wikitekstiä]

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

anrop:

{{#invoke:Wikidata|formatStatements|property=p17}}
  • property =Nödvändigparameter som beskriver vilken property som ska hämtas.
  • entityId =Det id-nummer den artikel har som du vill hämta property från.
  • enbarten =När baraettvärde ska hämtas. Tex för att hämta bild på heraldiskt vapen, och då inte få tillbaka alla objekt.
  • separator =När något annat än "," ska separera en lista på objekt. Texseparator=<br/>Se ävenconjunction
  • conjunction =Som ovan, men påverkar bara den sista separatorn i en lista av objekt. Default äroch.
  • label =När man själv vill välja hur länken ska formateras. Tex [[Blekinge läns vapen|vapen]] fås av att angelabel=vapenDen här parametern påverkar även enheter
  • 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$1ihttps://viaf.org/viaf/$1/.
    • pattern = auktoritetsdataär ett specialfall av ovanstående. Det "pattern" som används, är då det som är angivet i P1630 (format för URL) för den berörda propertyn.
    • pattern = auktoritetsdata2kompletterar ovanstående och skapar en länk av typen[https://viaf.org/viaf/$1/ $1]
  • rank =Bestämmer vilken typ av Claims som ska släppas igenom.
    • rank = allsläpper igenom alla claims
    • rank = validslä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/deprecatedsläpper igenom angiven rank, men ingen annan
  • avoidqualifier =Sorterar bort värden som är associerade med en viss property i sin qualifier. Exempelvisavoidqualifier=P518(berörd del) om man vill ha folkmängden förhelaorten, inte bara de som är kvinnor eller den andel som bor i Haninge kommun.
  • 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 claims efter datum i qualifiers, detta system används med fördel tillsammans med parameterenbartenovan
    • sortbytime = chronologicalsorterar claims i kronologisk ordning i qualifiers
    • sortbytime = invertedsorterar claims i omvänd kronologisk ordning i qualifiers
  • sortingproperty =Ange vilken property 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 bara properties med datatype = time
  • sortbyarbitrary =sorterar claims efter datum de objekt som länkas i de olika statementen, exempelvis födelsedag för en rad av "barn". Tillåtna värden är 'chronological' eller 'inverted'. Vilken property som ska sökas anges med parameter 'sortingpropertyovan'.
  • langpref =I denna modul finns det ett filter som prioriterar claims som har qualifiern "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.
  • versalisering =För att ange vilken versalisering utdatan 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
  • modifytime =fixar med datumformat
    • modifytime = longdateskriver datum på formatet "4 lokakuu 2024", dvs ner till datumnivå när så tillåts
    • modifytime = Yskriver datum på formatet "2024", dvs endast årtal.
  • modifyqualifiertime =Som ovan, men påverkar bara qualifiers
  • getsimpleproperty =För att hämta information från det länkade objektet. Denna funktion tillåteringeniteration, utan går baraennivå.
    • getproperty =Här anger du vilken property du ska hämta medgetsimpleproperty
    • getenbarten =Här anger du om en eller alla statements ska hämtas medgetsimpleproperty
    • getmodifytime =Här anger du vilket tidsformatgetsimplepropertyska hämta
    • getraw =Som "raw" nedan
  • raw =är en parameter som kan användas från andra moduler. Den resulterar i att utdatan 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 sitelink till svwiki inte kommer att inkluderas.
  • prefix =Text läggs in före svaret
  • suffix =Text läggs in efter svaret

-- Den ordning fallback language hämtas, om svensk label saknas. Engelska först, därefter bokmål, danska, etc...
localfallback={'en','nb','da','nn','de','fr','es','it','pt'}
locali18n={
["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."
},
["somevalue"]="''unknown value''",
["novalue"]="''no value''"
}
localsortingproperties={'P585','P571','P580','P569','P582','P570'}

functiongetqualifierbysortingproperty(claim,sortingproperty)
fork,vinpairs(sortingproperty)do
ifclaim.qualifiersandclaim.qualifiers[v]andclaim.qualifiers[v][1].snaktype=='value'then
returnclaim.qualifiers[v][1].datavalue.value.time
end
end
returnnil
end

functiongetDate(claim,options)
localsortingproperty=sortingproperties
iftype(options.sortingproperty)=='table'then
sortingproperty=options.sortingproperty
elseiftype(options.sortingproperty)=='string'then
sortingproperty={options.sortingproperty}
end
returngetqualifierbysortingproperty(claim,sortingproperty)
end

functioncomparedates(a,b)
ifaandbthen
returna>b
elseifathen
returntrue
end
end

functionsortbyqualifier(claims,options)

table.sort(claims,function(a,b)
localtimeA=getDate(a,options)
localtimeB=getDate(b,options)
ifoptions.sortbytime=='inverted'then
returncomparedates(timeB,timeA)
else
returncomparedates(timeA,timeB)
end
end
)
returnclaims
end

functiongetLabelFromFallBack(id)
localentity=getEntityFromId(id)
fork,vinpairs(fallback)do
ifentity.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
ifentity.labelsthen
forv,kinpairs(entity.labels)do
return{value=k.value,language=k.language}
end
end
return{value='-',language=''}
end

functiongetEntityFromId(id)
ifidthen
returnmw.wikibase.getEntityObject(id)
else
returnmw.wikibase.getEntityObject()
end
end

functiongetEntityIdFromValue(value)
ifvalue['entity-type']=='item'then
return'Q'..value['numeric-id']
elseifvalue['entity-type']=='property'then
return'P'..value['numeric-id']
else
returnformatError('unknown-entity-type')
end
end

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


functionformatStatements(options,ref)
localformattedStatements={}
localclaims={}
ifnotoptions.propertythen
returnformatError('property-param-not-provided')
end

iftype(ref)=='table'then-- för de fall där funktionen anropas och alla claims redan finns i en tabell
claims=ref[options.property]
else

--Get entity
localentity=nil
ifoptions.entityandtype(options.entity)=="table"then
entity=options.entity
else
entity=getEntityFromId(options.entityId)
end

ifnotentitythen
return''--TODO error?
end

ifnotentity.claimsornotentity.claims[options.property:upper()]then
return''--TODO error?
end

--Format statement and concat them cleanly
ifoptions.rank=='best'ornotoptions.rankthen
claims=entity:getBestStatements(options.property:upper())
elseifoptions.rank=='valid'then
fori,statementinpairs(entity.claims[options.property:upper()])do
ifstatement.rank=='preferred'orstatement.rank=='normal'then
table.insert(claims,statement)
end
end
elseifoptions.rank=='all'then
fori,statementinpairs(entity.claims[options.property:upper()])do
table.insert(claims,statement)
end
else
fori,statementinpairs(entity.claims[options.property:upper()])do
ifstatement.rank==options.rankthen
table.insert(claims,statement)
end
end
end
ifoptions.avoidqualifierthen
localclaims2={}
fori,statementinpairs(claims)do
ifnotstatement.qualifiersornotstatement.qualifiers[options.avoidqualifier:upper()]then
table.insert(claims2,statement)
end
end
claims=claims2
end
--om det finns vissa statements som har en qualifier som säger "språk = svenska", ta bara med dessa
ifnotoptions.langpreforoptions.langpref==''then
localclaims2={}
fori,statementinpairs(claims)do
ifstatement.qualifiersandstatement.qualifiers.P407then
fork,vinpairs(statement.qualifiers.P407)do
ifv.snaktype=='value'andv.datavalue.value['numeric-id']==9027then-- Q9027 = 'svenska'
table.insert(claims2,statement)
end
end
end
end
if#claims2>0then
claims=claims2
end
end
ifoptions.sortbytime=='chronological'oroptions.sortbytime=='inverted'then
claims=sortbyqualifier(claims,options)
end
end
ifoptions.enbartenandoptions.enbarten~=''and#claims>1then
claims={claims[1]}
end
ifclaimsthen
fori,statementinpairs(claims)do
locals=formatStatement(statement,options)
ifs==''thens=nilend
iftype(ref)=='table'or(options.norefandoptions.noref~='')then--Inte leta efter referenser om själva anropet görs från en referens
table.insert(formattedStatements,s)
else
localt=''--formatReferences( statement, options )
table.insert(formattedStatements,s..t)
end
end
end
returnmw.text.listToText(formattedStatements,options.separator,options.conjunction)
end
functionformatReferences(statement,options)
localreference={}
ifstatement.referencesthen
localcite=require('Module:sv:Cite')
fori,refinpairs(statement.references)do
localitems,s={},nil
ifref.snaksthen
ifref.snaks.P248then
forj,propinpairs(ref.snaks.P248)do
table.insert(items,'Q'..prop.datavalue.value['numeric-id'])
end
end
s=cite.citeitem(items,ref.snaks,options)
ifs==''ornotsthen
s='Källangivelsen på Wikidata använder propertys som inte känns igen av Modul:Cite'
end
end
table.insert(reference,mw.getCurrentFrame():extensionTag('ref',s,{name=ref.hash}))
end
end
returntable.concat(reference)
end
functionformatStatement(statement,options)
ifstatement.type=='statement'then
returnformatSnak(statement.mainsnak,options).value
elseifnotstatement.typethen
returnformatSnak(statement,options).value--reference and qualifier
end
returnformatError('unknown-claim-type')
end

functionformatSnak(snak,options)
ifsnak.snaktype=='somevalue'then
return{value=i18n['somevalue']}
elseifsnak.snaktype=='novalue'then
return{value=i18n['novalue']}
elseifsnak.snaktype=='value'then
return{value=formatDatavalue(snak.datavalue,options,snak.datatype).value}
else
return{value=formatError('unknown-snak-type')}
end
end

functionformatDatavalue(datavalue,options,datatype)
--Use the customize handler if provided
ifoptions['value-module']oroptions['value-function']then
ifnotoptions['value-module']ornotoptions['value-function']then
return{value=formatError('unknown-value-module')}
end
localformatter=require('Module:'..options['value-module'])
ifnotformatterthen
return{value=formatError('value-module-not-found')}
end
localfun=formatter[options['value-function']]
ifnotfunthen
return{value=formatError('value-function-not-found')}
end
return{value=fun(datavalue.value,options)}
end

--Default formatters
ifdatatype=='wikibase-item'then
return{value=formatEntityId(getEntityIdFromValue(datavalue.value),options).value}

elseifdatatype=='string'ordatatype=='commonsMedia'then
ifoptions.patternandoptions.pattern~=''then
ifoptions.pattern=="auktoritetsdata"then
localpatter=formatStatements({property="P1630",entityId=options.property,enbarten='true',noref='true'})
return{value=formatFromPattern(datavalue.value,{pattern=patter})}
elseifoptions.pattern=="auktoritetsdata2"oroptions.pattern=='auktoritetsdata3'then
localpatter=formatStatements({property="P1630",entityId=options.property,enbarten='true',noref='true'})
return{value='['..formatFromPattern(datavalue.value,{pattern=patter})..' '..datavalue.value..']'}
else
return{value=formatFromPattern(datavalue.value,options)}
end
else
return{value=datavalue.value}
end

elseifdatatype=='time'then
localTime=require'Module:sv:Time'
return{value=Time.newFromWikidataValue(datavalue.value):toHtml()}

elseifdatatype=='globecoordinate'then
localGlobeCoordinate=require'Module:sv:GlobeCoordinate'
return{value=GlobeCoordinate.newFromWikidataValue(datavalue.value):toHtml()}

elseifdatatype=='quantity'then
localamount,unit,cat=datavalue.value.amount,datavalue.value.unit,nil
ifunitthen
unit=unit:match('Q%d+')
end
localformatera=require('Modul:Math')
localnumber=formatera.newFromWikidataValue(datavalue.value)

localunitraw=unit
ifunitthen
-- Kontrollerar om det finns någon förkortning för denna 'unit'
locallab=options.labelorformatStatements({property='P558',entityId=unit,enbarten='true',langpref=options.langpref,noref='true'})
iflaband(notoptions.nounitshortoroptions.nounitshort=='')then
locals=formatEntityId(unit,{label=lab,nolink=(options.nounitlinkoroptions.nolink)})
unit=s.value
cat=s.cat
else-- om det inte finns en förkortning
locals=formatEntityId(unit,{nolink=options.nounitlink})
unit=s.value
cat=s.cat
end
end
return{value=number..' '..(unitor''),amount=amount,unit=unit,unitraw=unitraw,cat=cat}

elseifdatatype=='url'then
ifoptions.labelandoptions.label~=''then
return{value='['..datavalue.value..' '..options.label..']'}
else
return{value=datavalue.value}
end

elseifdatavalue.type=='monolingualtext'then
return{value=mw.text.tag('span',{title=mw.language.fetchLanguageName(datavalue.value.language,'sv')},datavalue.value.text)}

else
return{value=formatError('unknown-datatype')}
end
end

functionformatEntityId(entityId,options)
locallabel=options.labelormw.wikibase.label(entityId)
iflabel==''then
label=mw.wikibase.label(entityId)ornil
end

locallink=mw.wikibase.sitelink(entityId)
iflinkand(notoptions.nolinkoroptions.nolink=='')then
iflabelandlabel~=''then
return{value='[[:'..link..'|'..label..']]'}
else
return{value='[[:'..link..']]'}
end
else
iflabelthen
return{value=label}
else
locals=getLabelFromFallBack(entityId)
locall=mw.language.fetchLanguageName(s.language,'sv')
ifnotlorl==''then
l='okänt språk'
end
ifsthen
return{value=mw.text.tag('span',{title=l},s.value),cat='med labels på '..l}
end
end
return{value=entityId,cat='som har labels med Qid'}
end
end

functionformatFromPattern(str,options)
returnmw.ustring.gsub(options.pattern,'$1',str)..''--Hack to get only the first result of the function
end

localp={}

functionp.formatStatements(frame,key)
localargs=frame.args

--If a value if already set, use it
ifargs.valueandargs.value~=''then
returnargs.value
end
returnformatStatements(frame.args,key)
end

functionp.formatStatementsFromLua(options,key)
--If a value if already set, use it
ifoptions.valueandoptions.value~=''then
returnoptions.value
end
locals=formatStatements(options,key)
ifs==''then
s=nil
end
returns
end

-- Return the site link (for the current site) for a given data item.
functionp.getSiteLink(frame)
ifframe.args[1]==nilthen
entity=mw.wikibase.getEntityObject()
ifnotentitythen
entity=mw.wikibase.getEntityObject(frame.args[1])
end
id=entity.id
else
id=frame.args[1]
end

returnmw.wikibase.sitelink(id)
end

-- look into entity object
functionp.ViewSomething(frame)
localf=(frame.args[1]orframe.args.id)andframeorframe:getParent()
localid=f.args.id
ifidand(#id==0)then
id=nil
end
localdata=mw.wikibase.getEntityObject(id)
ifnotdatathen
returnnil
end

locali=1
whiletruedo
localindex=f.args[i]
ifnotindexthen
iftype(data)=="table"then
returnmw.text.jsonEncode(data,mw.text.JSON_PRESERVE_KEYS+mw.text.JSON_PRETTY)
else
returntostring(data)
end
end

data=data[index]ordata[tonumber(index)]
ifnotdatathen
return
end

i=i+1
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:// 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)
localent=mw.wikibase.getEntityObject()
localprops=ent:formatPropertyValues('P1323')
localout={}
localt={}
fork,vinpairs(props)do
ifk=='value'then
t=mw.text.split(v,",")
fork2,v2inpairs(t)do
out[#out+1]="[http:// 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==0then
ret="Invalid TA"
end
returnret
end

returnp