Modul:WikidataBilde

Frå Wikipedia – det frie oppslagsverket

Dokumentasjon for modulen kan opprettast 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:Artiklar der bilete er henta frå 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:Artiklar der bilete er henta frå Wikidata – " .. kategori[value["numeric-id"]] .. "]]"
    						end
						end
					end
				end
			end
		end
	end

    -- failed to find correct type
	return resten
end

-- Return bilete til artikkelen
function p.wikidatabilete(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
    					return data.value
					end
				end
			end
		end
	end
	
    -- failed to find correct type
    return ""
end

function p.framebilete(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['bilete'] then
        return args['bilete']
     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.velgbilete(frame)
    local bilete = p.framebilete(frame)
    if bilete then
        if bilete == "" then
--            return ""
        elseif bilete == "utan" then
    	   return ""
        else
           return bilete
        end
    else
        return ""
    end
    local frawikidata = p.wikidatabilete(frame)
    local framekart = p.framekart(frame)
    if framekart == frawikidata then
    	return ""
    end

    return frawikidata
end

function p.biletetekst(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 == 'nn' 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.finnesbileteiartikkel(frame)
	local innhold = mw.title.getCurrentTitle():getContent() or ''
	local frawikidata = p.wikidatabilete(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:Artiklar der bilete frå Wikidata også er brukte utanfor infoboksen]]"
	else
		return ""
	end
end
 
function p.sammenlignbilete(frame)
    local fraframe = p.framebilete(frame)
    local frawikidata = p.wikidatabilete(frame)
    if fraframe == frawikidata then
        if fraframe == "" then
            return ""
        else
            return "[[Kategori:Artiklar der bilete er samme som på Wikidata]]"
        end
    else
        if frawikidata == "" then
            return "[[Kategori:Artiklar hvor bilete mangler på Wikidata]]"
        end
        if fraframe == "" then
            return "[[Kategori:Artiklar uten bilete i infoboks med bilete på Wikidata]]"
        end
        return "[[Kategori:Artiklar med bilete forskjellig fra Wikidata]]"
    end
end

function p.sammenlignMedWikidataValgtBilde(frame)
    local fraframe = p.framebilete(frame)
    local frawikidata = p.wikidatabilete(frame)
    local framekart = p.framekart(frame)
    local finnesbileteiartikkel = p.finnesbileteiartikkel(frame)
    if fraframe == frawikidata then
        if fraframe == "" then
            return ""
        else
            return 
        end
    else 
        if frawikidata == "" then
            return "[[Kategori:Artiklar hvor bilete mangler på Wikidata]]"
        end
    	if framekart == frawikidata then
    		return "[[Kategori:Artiklar hvor kart er samme som bilete på Wikidata]]"
    	end
        if fraframe == "" then
            return finnKategori(frame) .. finnesbileteiartikkel
        end
        return "[[Kategori:Artiklar med bilete forskjellig fra Wikidata]]"
    end
end

function bilete(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 formatbileterad(value)
	return string.format([[
		<tr class="bilete" valign="top"><td colspan="4" class="sentrert">%s</td></tr>
		]], value)
end

function p.bilete(qid,pid)
	local prop = getProp(qid,pid)
	if not prop or not prop[1] or not prop[1].mainsnak then
		return ""
	end
	return bilete(prop[1].mainsnak)
end

function biletetekst(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 == 'nn' 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 "bilete: " .. l.datavalue.value
			end
		end
	end
	return nil
end

function fmtbilete(bilete,biletetekst,byline,size, alttekst)
	local tekst = ""
	local pix = size or ""
	local alt = ""
	if alttekst and alttekst ~= "" then
		alt = "|alt=" .. alttekst 
	end
	if bilete then
		tekst = "[[fil:" .. -- mw.wikibase.formatValue(snak)
		   bilete .. "|center|" .. pix .. "|frameless" .. alt .."]]"
	end
	if biletetekst or byline then
		tekst = tekst .. '<div class="thumbcaption" style="text-align:center">'
	end
	if biletetekst then
		tekst = tekst .. biletetekst
	end
	if byline then
		tekst = tekst .. '<div class="thumbcaption" style="text-align:center">' .. byline .. "</div>"
	end
	if biletetekst or byline then
		tekst = tekst .. '</div>'
	end	
	tekst = formatbileterad(tekst)
	return tekst
end

function p.bileteFraWikidata(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 biletet =  bilete(prop[1].mainsnak)
	local bileteteksten = biletetekst(prop[1].qualifiers)
	local byline = byline(prop[1].qualifiers)
	return fmtbilete(biletet,bileteteksten,byline, pix, alttekst)
end


function p._bileteOgTekst(qid, pid, bilete, biletetekst, byline, pix, alttekst, overskrift)
	if bilete and bilete == "utan" then
		return ""
	end
	local overskriftRad,avslutning = "",""
	if overskrift and overskrift ~= "" then
		overskriftRad,avslutning = formatOverskrift(overskrift)
	end
	local bileterad = ""
	if bilete and bilete ~= "" then
		bileterad = fmtbilete(bilete,biletetekst,byline, pix, alttekst)
	else
		bileterad = p.bileteFraWikidata(qid, pid, pix, alttekst)
	end
	if bileterad ~= "" then
		return overskriftRad .. bileterad .. avslutning
	end
	return ""
end

function p.bileteOgTekst(frame)
	local qid = frame.args["qid"] or nil
	if qid == "" then
		qid = nil
	end
	local pid = frame.args["pid"] or nil
	local bilete = frame.args["bilete"] or nil
	local biletetekst = frame.args["biletetekst"] or nil
	local byline = frame.args["byline"] or nil
	local pix = frame.args["biletestørrelse"] or ""
	local overskrift = frame.args["overskrift"] or ""
	local alttekst = frame.args["alttekst"] or ""
	return p._bileteOgTekst(qid, pid, bilete, biletetekst, byline, pix, alttekst, overskrift)
end

return p