Modul:WikidataBilde
Dokumentasjon for denne modulen kan opprettes på Modul:WikidataBilde/dok
local p = {}
function dump( out )
if type( out ) == 'table' then
local s = '{ '
for k,v in pairs( out ) do
if type( k ) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump( v ) .. ','
end
return s .. '} '
else
return tostring( out )
end
end
local kategori = {[5] = "biografi" }
local resten = "[[Kategori:Artikler hvor bilde er hentet fra Wikidata]]"
function getProp(qid,pid)
local entity = mw.wikibase.getEntity(qid)
if not entity then
return {}
end
return entity:getBestStatements(pid)
end
function finnKategori(frame)
if not mw.wikibase then
return resten
end
local artikkel = mw.wikibase.getEntityObject()
if not artikkel then
return resten
end
local claims = artikkel:getBestStatements( 'P31' )
if not claims then
return resten
end
for _,v in ipairs( claims ) do
if v.type == 'statement' then
local snak = v.mainsnak
if snak.snaktype == 'value' then
if snak.datatype == 'wikibase-item' then
local data = snak.datavalue
if data.type == 'wikibase-entityid' then
local value = data.value
if value["entity-type"] == "item" then
if kategori[value["numeric-id"]] then
return "[[Kategori:Artikler hvor bilde er hentet fra Wikidata – " .. kategori[value["numeric-id"]] .. "]]"
end
end
end
end
end
end
end
-- failed to find correct type
return resten
end
-- Return bilde til artikkelen
function p.wikidatabilde(frame)
if not mw.wikibase then
return ""
end
local pid = frame.args["pid"] or nil
if not pid then pid = "P18" end
local artikkel = mw.wikibase.getEntityObject()
if not artikkel then
return ""
end
local claims = artikkel:getBestStatements( pid )
if not claims then
return ""
end
for _,v in ipairs( claims ) do
if v.type == 'statement' then
local snak = v.mainsnak
if snak.snaktype == 'value' then
if snak.datatype == 'commonsMedia' then
local data = snak.datavalue
if data.type == 'string' then
return data.value
end
end
end
end
end
-- failed to find correct type
return ""
end
function p.framebilde(frame)
local args = frame.args
if args[1] == nil then
local pFrame = frame:getParent();
args = pFrame.args;
for k,v in pairs( frame.args ) do
args[k] = v;
end
end
if args['bilde'] then
return args['bilde']
end
return ""
end
function p.framekart(frame)
local args = frame.args
if args[1] == nil then
local pFrame = frame:getParent();
args = pFrame.args;
for k,v in pairs( frame.args ) do
args[k] = v;
end
end
if args['kart'] then
return args['kart']
end
return ""
end
function p.velgbilde(frame)
local bilde = p.framebilde(frame)
if bilde and bilde ~= "" and bilde ~= "uten" then
return bilde
end
-- First: P18 (image)
local frawikidata = p.bilde(nil, "P18")
if frawikidata ~= "" then
return frawikidata
end
-- Second: P3383 (film poster)
frawikidata = p.bilde(nil, "P3383")
if frawikidata ~= "" then
return frawikidata
end
-- Third: P154 (logo)
frawikidata = p.bilde(nil, "P154")
if frawikidata ~= "" then
return frawikidata
end
return ""
end
function p.bildetekst(frame)
if not mw.wikibase then
return ''
end
local artikkel = mw.wikibase.getEntityObject()
if not artikkel then
return ''
end
local claims = artikkel:getBestStatements( 'P18' )
if not claims then
return ''
end
for _,v in ipairs( claims ) do
if v.type == 'statement' then
local snak = v.mainsnak
if snak.snaktype == 'value' then
if snak.datatype == 'commonsMedia' then
local data = snak.datavalue
if data.type == 'string' then
local q = v.qualifiers
if q then
wdcaptions = q['P2096']
end
if wdcaptions then
for k, l in pairs(wdcaptions) do
if l.datavalue.value and l.datavalue.value.text and l.datavalue.value.language == 'nb' then
return l.datavalue.value.text
end
end
end
end
end
end
end
end
-- failed to find correct type
return ''
end
function p.byline(frame)
if not mw.wikibase then
return ''
end
local artikkel = mw.wikibase.getEntityObject()
if not artikkel then
return ''
end
local claims = artikkel:getBestStatements( 'P18' )
if not claims then
return ''
end
for _,v in ipairs( claims ) do
if v.type == 'statement' then
local snak = v.mainsnak
if snak.snaktype == 'value' then
if snak.datatype == 'commonsMedia' then
local data = snak.datavalue
if data.type == 'string' then
local q = v.qualifiers
if q then
wdcaptions = q['P2093']
end
if wdcaptions then
for k, l in pairs(wdcaptions) do
if l.datavalue.value and l.datavalue.value.text then
return l.datavalue.value.text
end
end
end
end
end
end
end
end
-- failed to find correct type
return ''
end
function p.finnesbildeiartikkel(frame)
local innhold = mw.title.getCurrentTitle():getContent() or ''
local frawikidata = p.wikidatabilde(frame):gsub("[%-%+%*%?%^%%%(%)]", "%%%0") -- Erstatter visse spesialtegn (spesialtegn for Lua) med escapede versjoner av samme spesialtegn
frawikidata = frawikidata:gsub("[_ ]", "[_ ]") -- Erstatter understrek eller mellomrom med mønsteret [_ ], så søket nedenfor finner begge varianter
if innhold:find(":" .. frawikidata) then
return "[[Kategori:Artikler hvor bilde fra Wikidata også brukes utenfor infoboks]]"
else
return ""
end
end
function p.sammenlignbilde(frame)
local fraframe = p.framebilde(frame)
local frawikidata = p.wikidatabilde(frame)
if fraframe == frawikidata then
if fraframe == "" then
return ""
else
return "[[Kategori:Artikler hvor bilde er samme som på Wikidata]]"
end
else
if frawikidata == "" then
return "[[Kategori:Artikler hvor bilde mangler på Wikidata]]"
end
if fraframe == "" then
return "[[Kategori:Artikler uten bilde i infoboks med bilde på Wikidata]]"
end
return "[[Kategori:Artikler med bilde forskjellig fra Wikidata]]"
end
end
function p.sammenlignMedWikidataValgtBilde(frame)
local fraframe = p.framebilde(frame)
local frawikidata = p.wikidatabilde(frame)
local framekart = p.framekart(frame)
local finnesbildeiartikkel = p.finnesbildeiartikkel(frame)
if fraframe == frawikidata then
if fraframe == "" then
return ""
else
return
end
else
if frawikidata == "" then
return "[[Kategori:Artikler hvor bilde mangler på Wikidata]]"
end
if framekart == frawikidata then
return "[[Kategori:Artikler hvor kart er samme som bilde på Wikidata]]"
end
if fraframe == "" then
return finnKategori(frame) .. finnesbildeiartikkel
end
return "[[Kategori:Artikler med bilde forskjellig fra Wikidata]]"
end
end
function bilde(snak)
assert ( snak )
local item = nil
if snak.snaktype == "value" and snak.datatype == "commonsMedia" then
value = snak.datavalue.value or nil
end
return value
end
-- returnerer en rad for overskrift og en avsluttning hvis det er nødvendig
function formatOverskrift (overskrift,kollaps)
local oversk = ""
local avslutt = ""
if overskrift and overskrift ~= "" then
oversk = string.format([[
<tr class="overskrift" valign="top"><td colspan="4">%s</td></tr>
]], overskrift)
end
if kollaps and kollaps ~= "" then
end
return oversk,avslutt
end
function formatBilderad(value)
return string.format([[
<tr class="bilde" valign="top"><td colspan="4" class="sentrert">%s</td></tr>
]], value)
end
function p.bilde(qid,pid)
local prop = getProp(qid,pid)
if not prop or not prop[1] or not prop[1].mainsnak then
return ""
end
return bilde(prop[1].mainsnak)
end
-- språkkoder som vi viser hvis norsk bokmål ikke finnes
local altlang = {
["nn"] = "nynorsk",
["no"] = "",
["da"] = "dansk",
["sv"] = "svensk",
}
function bildetekst(qualifier)
local P2096 = nil
if qualifier then
P2096 = qualifier['P2096']
end
if P2096 then
for k, l in pairs(P2096) do
if l.datavalue and l.datavalue.value and l.datavalue.value.text and l.datavalue.value.language == 'nb' then
return l.datavalue.value.text
end
end
for k, l in pairs(P2096) do
if l.datavalue and l.datavalue.value and l.datavalue.value.text and altlang[l.datavalue.value.language] then
local langtxt = altlang[l.datavalue.value.language]
if langtxt ~= "" then
langtxt = " (" .. langtxt .. ")"
end
return l.datavalue.value.text .. langtxt
end
end
end
return nil
end
function byline(qualifier)
local P2093 = nil
if qualifier then
P2093 = qualifier['P2093']
end
if P2093 then
for k, l in pairs(P2093) do
if l.datavalue and l.datavalue.value then
return "Foto: " .. l.datavalue.value
end
end
end
return nil
end
function fmtBilde(bilde,bildetekst,byline,size, alttekst, class)
local tekst = ""
local pix = size or ""
local alt = ""
local localclass = ""
if alttekst and alttekst ~= "" then
alt = "|alt=" .. alttekst
end
if class and class ~= "" then
localclass = "|class=" .. class
end
if bilde then
tekst = "[[fil:" .. -- mw.wikibase.formatValue(snak)
bilde .. "|center|" .. pix .. "|frameless" .. alt .. localclass .. "]]"
end
if bildetekst or byline then
tekst = tekst .. '<div class="thumbcaption">'
end
if bildetekst then
tekst = tekst .. bildetekst
end
if byline then
tekst = tekst .. mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Byline/stil.css' } } .. '<div class="byline">' .. byline .. "</div>"
end
if bildetekst or byline then
tekst = tekst .. '</div>'
end
tekst = formatBilderad(tekst)
return tekst
end
function p.bildeFraWikidata(qid,pid, pix, alttekst, class)
local prop = getProp(qid,pid)
if not prop then
return ""
end
if not prop[1] then
return ""
end
if not prop[1].mainsnak then
return ""
end
local bildet = bilde(prop[1].mainsnak)
local bildeteksten = bildetekst(prop[1].qualifiers)
local byline = byline(prop[1].qualifiers)
return fmtBilde(bildet,bildeteksten,byline, pix, alttekst, class)
end
function p._bildeOgTekst(qid, pid, bilde, bildetekst, byline, pix, alttekst, overskrift, class)
if bilde and bilde == "uten" then
return ""
end
local overskriftRad,avslutning = "",""
if overskrift and overskrift ~= "" then
overskriftRad,avslutning = formatOverskrift(overskrift)
end
local bilderad = ""
if bilde and bilde ~= "" then
bilderad = fmtBilde(bilde,bildetekst,byline, pix, alttekst, class)
else
bilderad = p.bildeFraWikidata(qid, pid, pix, alttekst, class)
end
if bilderad ~= "" then
return overskriftRad .. bilderad .. avslutning
end
return ""
end
function p.bildeOgTekst(frame)
local qid = frame.args["qid"] or nil
if qid == "" then
qid = nil
end
local bilde = frame.args["bilde"] or nil
local bildetekst = frame.args["bildetekst"] or nil
local byline = frame.args["byline"] or nil
local pix = frame.args["bildestørrelse"] or ""
local overskrift = frame.args["overskrift"] or ""
local alttekst = frame.args["alttekst"] or ""
local class = frame.args["class"] or ""
--[[ pid kan ha en kommaseparert liste med pid-er kan fx inneholde:
P18 - bilde
P3451 - nattbilde
P5252 - vinterbilde
P5775 - interiørbilde
eller:
P154 - logo
P94 - bilde av våpenskjold
Derfor splittes argumentet, og brukes ett av gangen
--]]
local propslist = frame.args["pid"] or nil
local props = mw.text.split( propslist, ',', true )
for ix,pid in ipairs( props ) do
-- hvis bilde == uten vil alle kallene returnere blank tekst uten at vi trenger teste på det her
local txt = p._bildeOgTekst(qid, pid, bilde, bildetekst, byline, pix, alttekst, overskrift, class)
if txt and txt ~= "" then
return txt
end
end
return ""
end
return p