Hopp til innhold

Modul:Infoboks lua

Fra Wikipedia, den frie encyklopedi
Moduldokumentasjon
local p = {}

local wikidataListe = require( 'Module:WikidataListe' )
local wdbilde = require( 'Modul:WikidataBilde')
local Mapframe = require( 'Modul:Mapframe')

function dump(item)
	return "<pre>" .. mw.text.jsonEncode(item, mw.text.JSON_PRETTY) .. "</pre>"
end

function getOkStatements(pid,qid)
	local entity = mw.wikibase.getEntity(qid)
	if not entity then
		return {}
	end
	local claims =  entity:getAllStatements(pid)
	local tbl = {}
	for i,claim in ipairs(claims) do
		if claim.rank == "normal" or claim.rank == "preferred" then
			table.insert(tbl,claim)
		end
	end
	return tbl
end

function overskrift(tekst)
	local txt = '<tr class="hode overskrift"><th colspan="4">' .. tekst .. '</th></tr>'
	return txt
end
	

function p._ibxStart(type,stor,navn,navn2)
	local txt0a = '<table class="infobox infoboks '
	local txt0b = type .. " " .. stor .. " "  ..'"'
	-- .. " " .. class 
	local txt0d = ">"
	local txt1 = ''
	if navn and navn ~= '' then
		txt1 = '<tr valign="top" class="hode"><th colspan="4">' .. navn .. '</th></tr>'
	end
	local txt2 = '<tr class="hode overskrift"><th colspan="4">' .. navn2 .. '</th></tr>'
	return txt0a .. txt0b .. txt0d .. txt1 .. txt2
end

function p._ibxSlutt(comcat,endcomment)
	return "</table>"
end

function p._ibxArgStart(args,navn)
	local typ = args["type"] or "biografi"
	local stor = args["stor"] or "bred"
	local navn2 = args["navn2"] or nil
	if not navn then
		navn = "navn"
	end
	
	if not navn2 then
		navn2 = ""
	end
	local value = p._ibxStart(typ, stor, navn, navn2)
	return value
end

function p.ibxStart(frame)
	local args = frame.args or {}
	local navn = args["navn"] or nil
	local navn2 = args["navn2"] or nil
	if not navn then
		navn = getname(frame)
	end
	local value = p._ibxArgStart(args,navn) --typ, stor, navn, navn2)
	return value
end

function p.ibxSlutt(frame)
	return p._ibxSlutt()
end

function getname(frame)
	local frameargs = frame:getParent().args
	local qid = getqid(frame)
	local navn = mw.wikibase.label(qid)
	return navn
end

function getlink(id)
	local text = mw.wikibase.label(id) or id
	local link = mw.wikibase.sitelink(id)
	if text and link then
		text = "[[" .. link .. "|" .. text .. "]]"
	end
	return text
end

function p.arbeidsdata()
	local data = {
		-- to lister som vil inneholde data for å utelate disse fra å bli brukt fremover
		["props"] = { }, -- wikidataegenskaper som ikke skal benyttes.
		["params"] = { }, -- parametre for argumenter fra artiklen som ikke skal benyttes.
	}
	return data
end

function ikkebruk(data,props,params)
	if not data then
		data = p.arbeidsdata()
	end
	if props then
		for i,prop in ipairs(props) do
			data.props[prop] = prop
		end
	end
	if params then
		for i,param in ipairs(params) do
			data.params[param] = param
		end
	end
	return data
end

-- legg til parametre og/eller egenskaper gitt som kommaseparerte lister
function p.ikkebruk(data,propslist,paramslist)
	local props = nil
	if propslist then
		props = mw.text.split( propslist, ',', true )
	end
	local params = nil
	if paramslist then
		params = mw.text.split( paramslist, ',', true )
	end
	return ikkebruk(data,props,params)
end

function ubrukte(frame,data,res)
	local lang = mw.language.getContentLanguage()
	local txt = ""
    local frameargs = frame:getParent().args
    for param,val in pairs( frameargs ) do
    	if not data or not data.params[param] then
    		local displayName = lang:ucfirst(param)
    		local val = wikidataListe._rad2(frame,nil,nil,param,nil,nil,displayName,nil,nil)
    		if val and val ~= "" then
    			table.insert(res, val)
    		end
    	end
	end
	if #res > 0 then
	--	txt = table.concat(res, "\n")
	end
	return res
end

local function proptest(props)
	for idx,claim in ipairs(props) do
		if claim.rank == 'preferred' or claim.rank == 'normal' then
			local snak = claim.mainsnak
			if snak.snaktype == "value" and snak.datatype ~= "external-id" then
				return props
			end
		end
	end
	return nil
end

local function allProps(entity,datatype)
	local retvals = {}
	if entity.claims  then
		for propid,props in pairs(entity.claims) do
			if proptest(props) then
			if true then
--				return propid
			end
			--if props[propid][1].mainsnak then
				table.insert(retvals,propid)
		--	end
			end
		end
	end
	return retvals
end

function wdAllProps(qid)
	local entity = mw.wikibase.getEntity(qid)
	local allprops = allProps(entity,datatype)
	return allprops
end

function lagRad(verdi,displayName)
 	return '<tr class="rad" valign="top">' ..
			'<th colspan="2" class="nowrap">' ..  displayName .. '</th>' ..
			'<td colspan="2">' .. verdi .. '</td>' ..
		'</tr>' -- lagRad(verdi,displayName)

end

function innhold(frame,qid,prop,propName)
	local snak = claim.mainsnak
	local datatype = snak.datatype
	if datatype == 'commonsMedia' then
	else
		wikidataListe._rad2(frame,qid,prop,"nil",nil,nil,displayName,nil,nil)

	end
end

function wdEgenskap(frame,qid,data,res,props)
	local lang = mw.language.getContentLanguage()
	for ix,prop in ipairs( props ) do
		-- kvikkfiks for å få bilder til å se litt penere ut for P18 (bilde)
		if prop == "P18" then
			local val =
				wdbilde._bildeOgTekst(qid, prop, "", "", "", "bildestørrelse", "", "")				
			if val and val ~= "" then
				table.insert(res, val)
			end
			else
		if not data or not data.props[prop] then
			local proplab,langq = mw.wikibase.getLabelWithLang(prop)
	  		local displayName = lang:ucfirst(proplab)
			local val = --lagRad(prop,displayName) --prop --
			wikidataListe._rad2(frame,qid,prop,"nil",nil,nil,displayName,nil,nil)
			if val and val ~= "" then
				table.insert(res, val)
			end
		end
			end
	end
	local txt = table.concat(res,  "\n")
	return txt,data
end

function wdEgenskapTabellRad(frame,qid,data,res,props)
	for ix,prop in ipairs( props ) do
		local val = wikidataListe._verdi(frame,qid,prop,"nil",nil,nil,nil,nil) or ""
		table.insert(res, val)
	end
	return table.concat(res,  "\n|")
end

function p.wdEgenskap(frame,qid,data,res,propslist,dodump)
	local entity = mw.wikibase.getEntity(qid)
	local frameargs = frame:getParent().args
	if true then
	--	return "<pre>" .. mw.text.jsonEncode(entity, mw.text.JSON_PRETTY) .. "</pre>"
	end
	local props = nil
	if not propslist and frameargs['props'] and frameargs['props'] ~= "" then
		propslist = frameargs['props']
	end
	if propslist =="all" or not propslist then
		props = wdAllProps(qid,"item")
	--	return "<pre>" .. mw.text.jsonEncode(props, mw.text.JSON_PRETTY) .. "</pre>"
	--	.. dump(entity)
	else
		props = mw.text.split( propslist, ',', true )
	end
	local dumptxt = ""
	if dodump then 
		dumptxt = dump(entity) 
	end
	return wdEgenskap(frame,qid,data,res,props) --.. dumptxt
end

-- for individuelle infobokser
function wdEgenskapBoks(frame,qid,props)
	local frameargs = frame:getParent().args
	local navn = mw.wikibase.label(qid)
	local data = p.arbeidsdata()
	local res = {}
	local start = p._ibxArgStart(frameargs,navn)
	local text = wdEgenskap(frame,qid,data,res,props)
	local slutt = p._ibxSlutt()
	return start .. text .. slutt

end

-- for sammenslått til en samlet infoboks
function wdEgenskapBoks2(frame,qid,props)
	local frameargs = frame:getParent().args
	local navn = mw.wikibase.label(qid)
	local data = p.arbeidsdata()
	local res = {}
	local start = overskrift(navn)
	local text = wdEgenskap(frame,qid,data,res,props)
	local slutt = "" --p._ibxSlutt()
	return start .. text .. slutt

end

-- for individuelle infobokser
function p.wdBrukEgenskap(frame,qid,brukprops,propslist,dodump)
--	local navn = mw.wikibase.label(qid)
	local bruk = mw.text.split( brukprops, ',', true )
	local claims = getOkStatements(bruk[1],qid)
	local props = mw.text.split( propslist, ',', true )
	local res = {}
	table.insert(res, retval)
	local retval = ""
	for i,claim in ipairs(claims) do
		local q = claim.mainsnak.datavalue.value.id or nil
		if q then
			retval = wdEgenskapBoks(frame,q,props)
			if retval and retval ~= "" then
				table.insert(res, retval)
			end
		end
	end
	local txt = table.concat(res, "\n")
	return  txt
end

-- for sammenslått til en samlet infoboks
function p.wdBrukEgenskap2(frame,qid,brukprops,propslist,dodump)
	local navn = mw.wikibase.label(qid)
	local bruk = mw.text.split( brukprops, ',', true )
	local claims = getOkStatements(bruk[1],qid)
	local props = mw.text.split( propslist, ',', true )
	local frameargs = frame:getParent().args
	local start = p._ibxArgStart(frameargs,navn)
	
	local res = {}
	local retval = ""
	-- egen boks for hovedelementet. For nå med samme liste av egenskaper som delene.
	retval = wdEgenskapBoks2(frame,qid,props)
	if retval and retval ~= "" then
		local overskr = overskrift("Omfatter disse")
		table.insert(res, retval..overskr)
	end
	local retval = ""
	for i,claim in ipairs(claims) do
		local q = claim.mainsnak.datavalue.value.id or nil
		if q then
			retval = wdEgenskapBoks2(frame,q,props)
			if retval and retval ~= "" then
				table.insert(res, retval)
			end
		end
	end
	local txt = table.concat(res, "\n")
	return start .. txt .. p._ibxSlutt()
end

function p.wdBrukEgenskapTittel(frame,qid,brukprops,propslist,dodump)
	local navn = mw.wikibase.label(qid)
	local bruk = mw.text.split( brukprops, ',', true )
	local claims = getOkStatements(bruk[1],qid)
	local props = mw.text.split( propslist, ',', true )
	local frameargs = frame:getParent().args
	local retval = ""	
	local res = {}
	table.insert(res, "\n!navn")
	for i,pid in ipairs(props) do
		if pid then
			local navn = mw.wikibase.label(pid)
			table.insert(res, navn)
		end
	end
	local txt = table.concat(res, "\n!")

	return txt
end

function idxx(claim)
	return claim.mainsnak.datavalue.value.id or nil
end



function p.wdBrukEgenskapVerdi(frame,qid,brukprops,propslist,dodump)
	--if true then return "" end
	local navn = mw.wikibase.label(qid)
	local bruk = mw.text.split( brukprops, ',', true )
	local claims = getOkStatements(bruk[1],qid)
	local props = mw.text.split( propslist, ',', true )
	local frameargs = frame:getParent().args
	local retval = ""	
	local res = {}
	local xxx = "\n|-\n|" --.. idxx(claims[1]) .. "\n|-\n|" --.. claims[2]
	--table.insert(res, xxx )
	--if true then return "\n|-\n|" .. idxx(claims[2])  end
	for i,claim in ipairs(claims) do
		local lqid = idxx(claim) --claims[1].mainsnak.datavalue.value.id --claim.mainsnak.datavalue.value.id or nil
		--local yyy = "aaaa \n|-\n|"
		--table.insert(res, lqid)
		if lqid then
	local res2 = {}
			local navn = "\n|-\n|" .. getlink(lqid) .. 
			 "\n|" .. wdEgenskapTabellRad(frame,lqid,data,res2,props, "\n|")
		--	local txt = bruk[1] .." aaa " ..lqid.."\n|"
			table.insert(res, navn )
		end
	end
	return table.concat(res, "\n")
end


function brukmal(frame,mal)
	if not mal then return "" end
	local frameargs = frame:getParent().args
	if mal.metode == "ekspander" then
		return frame:expandTemplate{ title=mal.mal, args = frameargs}
	end
	return ""
end

function verdirad(frame,def,qid,lang)
	if not def then return "" end
	local param = def["param"]
	local pid = def["pid"]
	local ref = def["ref"]
	local sprak = def["sprak"]
	local displayName = def["displayName"] or lang:ucfirst(param)
	local vis = nil
	local split = def["split"]
	local txt = wikidataListe._rad2(frame,qid,pid,param,ref,sprak,displayName,vis,split)
	return txt
end

-->{{#invoke:WikidataBilde|bildeOgTekst|bilde={{{bilde|}}}|bildetekst ={{{bildetekst|}}}|byline={{{byline|}}}|pid=P18|qid={{{qid|}}}|bildestørrelse={{{bildestørrelse|}}}}}<!--

function bilderad(frame,def,qid,lang)
	if not def then return "" end
	local frameargs = frame:getParent().args
	local pid = def["pid"] or nil
	local bilde = frameargs[def["bilde"] or "bilde"]
	local bildetekst = frameargs[def["bildetekst"]] or ""
	local byline = frameargs[def["byline"]] 
	local pix = frameargs[def["bildestor"] or "bildestørrelse"]
	local overskrift = ""
	local alttekst = ""
	return wdbilde._bildeOgTekst(qid, pid, bilde, bildetekst, byline, pix, alttekst, overskrift)

end

-->{{#invoke:Mapframe|infoboxLocation|zoom={{{standardzoom|15}}}|width=290|vis={{{viskart|ja}}}|vis egenskap=P355,P527}}

function kartrad(frame)
	return '<tr class="rad" >' ..
			'<td colspan="4" class="center">' .. Mapframe.infoboxLocation(frame) .. "</td>		</tr>"
end

function overskriftgruppe(frame,def,qid,lang)
	if not def then return "" end
	local frameargs = frame:getParent().args
	local txt = ""
	if def.innhold  then
		txt = p._rader(frame,def.innhold)
	end
	local over = ""
	if def.tekst then
		over = overskrift(def.tekst)
	end
	if txt and txt ~= "" then
		return over .. txt
	end
	return ""
end

function p._rader(frame,defs)
	local lang = mw.language.getContentLanguage()
	local res = {}
	local txt = ""
    local qid = nil
    local frameargs = frame:getParent().args

	if frameargs['qid'] and frameargs['qid'] ~= "" then
		qid = frameargs['qid']
	end
 	for i,def in ipairs(defs) do
		if not def[1] or def[1] == "rad" then
			txt = verdirad(frame,def,qid,lang)
		end
		if def and def[1] == "mal" then
			txt = brukmal(frame,def)
		end
		if def and def[1] == "bilde" then
			txt = bilderad(frame,def,qid,lang)
		end
		if def and def[1] == "kart" then
			txt = kartrad(frame,def,qid,lang)
		end
		if not def[1] or def[1] == "overskrift" then
			txt = overskriftgruppe(frame,def,qid,lang)
		end
		if txt and txt ~= "" then
			table.insert(res, txt)
			txt = ""
		end
 	end
 	--res = ubrukte(frame,data,res)
	if #res > 0 then
		txt = table.concat(res, "\n")
	end
	return txt
end


function p._innhold(frame,defs)
	local returtxt = ""
	--"<pre>" .. mw.text.jsonEncode(defs, mw.text.JSON_PRETTY) .. "</pre>" --
	local returtxt = p._rader(frame,defs)
	return returtxt
end

function getqid(frame)
	local qid = nil
	local parentargs = frame:getParent().args
	if parentargs['qid'] and parentargs['qid'] ~= "" then
		qid = parentargs['qid']
	end
	if not qid then
		local frameargs = frame.args
		if frameargs['qid'] and frameargs['qid'] ~= "" then
			qid = frameargs['qid']
		end
	end
	if not qid then
		local entity = mw.wikibase.getEntity(qid)
		qid = entity.id
	end
	return qid
end

function p.test(frame)
	local start = p.ibxStart(frame)
	local propslist = "P31,P17"
	local res = {}
	local qid = getqid(frame)
	local text = p.wdEgenskap(frame,qid,data,res,"all",1) --propslist)
	local slutt = p._ibxSlutt()
	return start .. text .. slutt
end

function p._dump(qid,pid,num)
	if not pid then
		local entity = mw.wikibase.getEntity(qid)
		return dump(entity)
	end
	local statments = getOkStatements(pid,qid)
	if statments then
		if num then
			return dump(statments[num])
		end
		return dump(statments)
	end
	return ""	
end

function p.dump(frame)
	local qid = getqid(frame)
	local parentargs = frame:getParent().args
	local pid = parentarg(frame,'pid')
	local num = parentarg(frame,'num')
	return p._dump(qid,pid,num)
end

function parentarg(frame,argument)
	local argval = nil
	local parentargs = frame:getParent().args
	if parentargs[argument] and parentargs[argument] ~= "" then
		argval = parentargs[argument]
	end
	return argval
end	

function p.wikidataboks(frame)
	local qid = getqid(frame)
	local parentargs = frame:getParent().args
	local arg1 = parentarg(frame,1)
	if arg1 and arg1 == "tabell" then
		return p.wikidatatabell(frame)
	end
	if arg1 and arg1 == "dump" then
		return p.dump(frame)
	end
	local start = p.ibxStart(frame)
	local qid = getqid(frame)
	local parentargs = frame:getParent().args
	local brukegenskap = parentarg(frame,'bruk egenskap')
	if brukegenskap then
		--qid = "Q11976947"
		local propslist = parentarg(frame,'egenskaper')
		if true then
		--	qid = "Q661191"
		--	local entity = mw.wikibase.getEntity(qid)
		--	return dump(entity)

			--return p.dump(frame) --propslist --"P31,P18,P131,P17,P571,P814,P361,P2046"
		end
		local retval = p.wdBrukEgenskap2(frame,qid,brukegenskap,propslist,dodump)
		return retval
	end
	local data = nil
	local res = {}
	local minus = parentarg(frame,'minus')
	if minus then
		data = p.ikkebruk(data,minus,nil)
	end
	local startprops = parentarg(frame,'startrader')
	local startrader = ""
	if startprops then
		startrader,data = p.wdEgenskap(frame,qid,data,res,startprops)
	end
	local sluttrader = parentarg(frame,'sluttrader')
	local alle = parentarg(frame,'alle')
	local text = p.wdEgenskap(frame,qid,data,res,alle) --propslist)
	local slutt = p._ibxSlutt()
	return start .. text .. slutt
end

function p._lenke(tittel,qid)
	local tekst = tittel  or mw.wikibase.label(qid)
	local lenke = mw.wikibase.sitelink(qid) or nil
	if  tekst and lenke then
		tekst = "[[" .. lenke .. "|" .. tekst .. "]]"
	end
	return tekst
end

function p.lenke(frame)
	local parentargs = frame:getParent().args
	local tittel = parentarg(frame,'tekst')
	local qid = parentarg(frame,'qid') or ""
	return p._lenke(tittel,qid)
end

function p.wikidatatabell(frame)
	local qid = getqid(frame)
	local parentargs = frame:getParent().args
	local brukegenskap = parentarg(frame,'bruk egenskap')
	if brukegenskap then
		local propslist = parentarg(frame,'egenskaper')
		local start = '{|class="wikitable"\n|-' 
		.. p.wdBrukEgenskapTittel(frame,qid,brukegenskap,propslist,dodump)
		local slutt = "\n|}"
		local retval = p.wdBrukEgenskapVerdi(frame,qid,brukegenskap,propslist,dodump)
		return start .. retval .. slutt
	end
	return ""
end

p.wikidataTabell = p.wikidatatabell

return p