Hopp til innhold

Modul:WikidataBilde

Fra Wikipedia, den frie encyklopedi

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 then
        if bilde == "" then
--            return ""
        elseif bilde == "uten" then
    	   return ""
        else
           return bilde
        end
    else
        return ""
    end
    local frawikidata = p.wikidatabilde(frame)
    local framekart = p.framekart(frame)
    if framekart == frawikidata then
    	return ""
    end

    return frawikidata
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

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
	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)
	local tekst = ""
	local pix = size or ""
	local alt = ""
	if alttekst and alttekst ~= "" then
		alt = "|alt=" .. alttekst 
	end
	if bilde then
		tekst = "[[fil:" .. -- mw.wikibase.formatValue(snak)
		   bilde .. "|center|" .. pix .. "|frameless" .. alt .."]]"
	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)
	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)
end


function p._bildeOgTekst(qid, pid, bilde, bildetekst, byline, pix, alttekst, overskrift)
	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)
	else
		bilderad = p.bildeFraWikidata(qid, pid, pix, alttekst)
	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 pid = frame.args["pid"] or nil
	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 ""
	return p._bildeOgTekst(qid, pid, bilde, bildetekst, byline, pix, alttekst, overskrift)
end

return p