Modul:Wikidata

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


Se även Modul:Wikidataen för viss skild funktionalitet

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

anrop:

{{#invoke:Wikidata|formatStatements|property=p17}}

Parametrar

  • property = Obligatorisk parameter som beskriver vilken egenskap som ska hämtas.
  • entityId = Det id-nummer den artikel har som du vill hämta egenskap från.
  • 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.
  • 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
  • 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" 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.
  • 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
  • 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 bara properties med datatype = time
  • 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.
  • 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 = longdate skriver datum på formatet "29 juni 2024", dvs ner till datumnivå när så tillåts
    • modifytime = Y skriver datum på formatet "2024", dvs endast årtal.
  • modifyqualifiertime = Som ovan, men påverkar bara bestämningar
  • 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
    • 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 webbplatslänk 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...local fallback = {'en', 'nb', 'da', 'nn', 'de', 'fr', 'es', 'it', 'pt'}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."    },    ["somevalue"] = "''unknown value''",    ["novalue"] = "''no value''"}local sortingproperties = {'P585','P571','P580','P569','P582','P570'}function getqualifierbysortingproperty(claim, sortingproperty)for k, v in pairs(sortingproperty) doif claim.qualifiers and claim.qualifiers[v] and claim.qualifiers[v][1].snaktype == 'value' thenreturn claim.qualifiers[v][1].datavalue.value.time endendreturn 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 comparedates(a, b) if a and b thenreturn a > belseif a thenreturn trueendendfunction sortbyqualifier(claims, options)table.sort(claims, function(a,b)local timeA = getDate(a, options)local timeB = getDate(b, options)if options.sortbytime == 'inverted' thenreturn comparedates(timeB, timeA)elsereturn comparedates(timeA, timeB)endend)return claimsendfunction getLabelFromFallBack( id ) local entity = getEntityFromId( id ) for 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 then for v, k in pairs(entity.labels) doreturn {value = k.value, language = k.language}endendreturn {value = '-', language = ''}endfunction getEntityFromId( id )if id then return mw.wikibase.getEntityObject( id )elsereturn mw.wikibase.getEntityObject() endend 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' )    endend 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 tabellclaims = ref[options.property]else     --Get entity    local entity = nil    if options.entity and type( options.entity ) == "table" then        entity = options.entity    else        entity = getEntityFromId( options.entityId )    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 cleanlyif options.rank == 'best' or not options.rank then claims = entity:getBestStatements( options.property:upper() )elseif options.rank == 'valid' thenfor i, statement in pairs( entity.claims[options.property:upper()] ) do    if statement.rank == 'preferred' or statement.rank == 'normal' then    table.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 thenlocal claims2 = {}for i, statement in pairs( claims ) doif not statement.qualifiers or not statement.qualifiers[options.avoidqualifier:upper()] thentable.insert( claims2, statement)endendclaims = claims2end--om det finns vissa statements som har en qualifier som säger "språk = svenska", ta bara med dessaif 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 )endendendendif #claims2 > 0 thenclaims = claims2endendif options.sortbytime == 'chronological' or options.sortbytime == 'inverted' thenclaims = sortbyqualifier(claims, options)endendif options.enbarten and options.enbarten ~= '' and #claims > 1 thenclaims = {claims[1]}endif claims thenfor i, statement in pairs( claims ) dolocal s = formatStatement( statement, options ) if s == '' then s = nil endif type(ref) == 'table' or (options.noref and options.noref ~='') then --Inte leta efter referenser om själva anropet görs från en referenstable.insert( formattedStatements, s )elselocal t = ''--formatReferences( statement, options )table.insert( formattedStatements, s .. t )endendendreturn mw.text.listToText( formattedStatements, options.separator, options.conjunction )endfunction formatReferences( statement, options )local reference = {}if statement.references thenlocal cite = require('Modul:Cite')for i, ref in pairs(statement.references) dolocal items, s = {}, nilif ref.snaks thenif ref.snaks.P248 thenfor j, prop in pairs(ref.snaks.P248) dotable.insert(items, 'Q' .. prop.datavalue.value['numeric-id'])endends = cite.citeitem( items, ref.snaks, options ) if s == '' or not s thens = 'Källangivelsen på Wikidata använder propertys som inte känns igen av Modul:Cite'endendtable.insert(reference, mw.getCurrentFrame():extensionTag( 'ref', s, {name = ref.hash} ) )endendreturn table.concat(reference)endfunction formatStatement( statement, options )    if statement.type == 'statement' thenreturn formatSnak( statement.mainsnak, options ).value elseif not statement.type thenreturn formatSnak( statement, options ).value --reference and qualifier    endreturn formatError( 'unknown-claim-type' )end function formatSnak( snak, options )    if snak.snaktype == 'somevalue' then        return {value =  i18n['somevalue']}    elseif snak.snaktype == 'novalue' then        return {value = i18n['novalue']}    elseif snak.snaktype == 'value' then        return {value = formatDatavalue( snak.datavalue, options, snak.datatype ).value}    else        return {value = formatError( 'unknown-snak-type' )}    endend 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        return {value = formatEntityId( getEntityIdFromValue( datavalue.value ), options ).value}            elseif datatype == 'string' or datatype == 'commonsMedia' 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" or options.pattern == 'auktoritetsdata3' 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( datavalue.value, options )}            end        else            return {value = datavalue.value}        end            elseif datatype == 'time' then        local Time = require 'Module:Time'        return {value = Time.newFromWikidataValue( datavalue.value ):toHtml()}            elseif datatype == 'globe-coordinate' then        local GlobeCoordinate = require 'Module:GlobeCoordinate'        return {value = GlobeCoordinate.newFromWikidataValue( datavalue.value ):toHtml()}    elseif datatype == 'quantity' then local amount, unit, cat = datavalue.value.amount, datavalue.value.unit, nilif unit thenunit = unit:match('Q%d+')endlocal formatera = require('Modul:Math')local number = formatera.newFromWikidataValue(datavalue.value)local unitraw = unitif unit then-- Kontrollerar om det finns någon förkortning för denna 'unit'local lab = options.label or formatStatements({property = 'P558', entityId = unit, enbarten = 'true', langpref = options.langpref, noref = 'true'})if lab and ( not options.nounitshort or options.nounitshort == '' )  thenlocal s = formatEntityId( unit, {label = lab, nolink = (options.nounitlink or options.nolink) })unit = s.valuecat = s.catelse -- om det inte finns en förkortninglocal s = formatEntityId( unit, {nolink = options.nounitlink})unit = s.valuecat = s.catendendreturn {value = number .. ' ' .. (unit or ''), amount = amount, unit = unit, unitraw = unitraw, cat = cat}elseif datatype == 'url' thenif options.label and options.label ~= '' thenreturn {value = '[' .. datavalue.value .. ' ' .. options.label .. ']'}elsereturn {value = datavalue.value}endelseif datavalue.type == 'monolingualtext' thenreturn {value = mw.text.tag('span', {title = mw.language.fetchLanguageName(datavalue.value.language, 'sv')}, datavalue.value.text)}    else        return {value = formatError( 'unknown-datatype' )}    endend function formatEntityId( entityId, options )local label = options.label or mw.wikibase.label( entityId )if label == '' thenlabel = mw.wikibase.label( entityId ) or nilend    local link = mw.wikibase.sitelink( entityId )    if link and (not options.nolink or options.nolink == '') then        if label and label ~= '' then            return {value = '[[:' .. link .. '|' .. label .. ']]' }        else            return {value = '[[:' .. link .. ']]' }        end    else    if label then    return {value = 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}, s.value), cat = 'med labels på ' .. l }    end    end    return {value = entityId, cat = 'som har labels med Qid'}    endend function formatFromPattern( str, options )    return mw.ustring.gsub( options.pattern, '$1', str ) .. '' --Hack to get only the first result of the functionend local p = {} 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 send -- 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-- look into entity objectfunction p.ViewSomething(frame)local f = (frame.args[1] or frame.args.id) and frame or frame:getParent()local id = f.args.idif id and (#id == 0) thenid = nilendlocal data = mw.wikibase.getEntityObject(id)if not data thenreturn nilendlocal i = 1while true dolocal index = f.args[i]if not index thenif type(data) == "table" thenreturn mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)elsereturn tostring(data)endenddata = data[index] or data[tonumber(index)]if not data thenreturnendi = i + 1endend-- 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 retendreturn p