Modul:WikidataBilde

Fra Wikisida.no
Sideversjon per 14. des. 2025 kl. 20:02 av nb>Haros (legger inn i bildeOgTekst en muiighet for kommaseparert liste av pid (egenskaps identiteter). Vil velge første i listen med bilde på wikidata når lokalt bilde mangler.)
(diff) ← Eldre sideversjon | Nåværende sideversjon (diff) | Nyere sideversjon → (diff)
Hopp til navigering Hopp til søk

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