Saltu al enhavo

Modulo:Wikidata/bildoj

El Vikipedio, la libera enciklopedio
Dokumentado Dokumentado


Ŝablona programado Diskutoj Lua Testoj Subpaĝoj
Modulo Esperanto English Deutsch

Modulo: Dokumentado


Se vi havas demandon pri ĉi tiu Lua-modulo, tiam vi povas demandi en la diskutejo pri Lua-moduloj. La Intervikiaj ligiloj estu metataj al Vikidatumoj. (Vidu Helpopaĝon pri tio.)
-- 2022-08-06
-- jen helpa modulo por Wikidata, kiu uzas la samajn erarmesaĝojn kiel Wikidata kaj subtenas ID por testoj

-- aranĝas zorgigajn kategoriojn nur en la artikola nomspaco
        currentTitle = mw.title.getCurrentTitle()
        local ns   = currentTitle.namespace
        local kat1 = ""
        local kat2 = ""
        local kat3 = ""
        if ns == 0 then 
        	kat1 = "[[Kategorio:Artikoloj kun Vikidatumaj bildoj]]"
        	kat2 = "[[Kategorio:Artikoloj kun pluraj Vikidatumaj bildoj]]"
        	kat3 = "[[Kategorio:Artikoloj kun bildaj priskriboj el Vikidatumoj]]"
        end

local wikidata = require ("Modulo:Wikidata")
local bildfunkcio = require ("Modulo:InfoboxImage")
local listoj = require ("Modulo:Listutil")

-- helpaj funkcioj
local function link (id, p)
		local ligilo
		if id ~= "" and id ~= nil then
			ligilo = id
		else	
			ligilo = wikidata.pageId({args = {id=id} }) or ""
		end
		if ligilo then
			if p ~= "" and p ~= nil then
				ligilo = "[[:d:" .. ligilo .. "#" .. p .. "|[+]]]"			
			else	
				ligilo = "[[:d:" .. ligilo .. "#P2096|[+]]]"
			end
		end
		return ligilo
end

local p = {}


function p.bildoj(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	if default then showerrors = nil end
	-- nur en ĉi tiu funkcio
	local grandeco = frame.args["grandeco"]
	local defgrandeco = frame.args["defaŭlta grandeco"] or "frameless"
	local priskribo = frame.args["priskribo de bildoj"]
	local defpriskribo = frame.args["defaŭlta priskribo de bildo"] or ""
	-- pkodoj por elvoko el alia modulo
	local pkodo = frame.args["pkodo"] or "P18"
	local pkodo2 = frame.args["pkodo2"]	or "P2096"
	-- stira variablo, kiu influas, ĉu la priskribo estas aldonata al la bildo de ĉi tiu modulo aŭ redonata aparte al la vokanta modulo
	local paparte = frame.args["ĉu priskribo aparte"]
	-- stira variablo, kiu influas ĉu grupo de bildoj estas transprenataj el Vikidatumoj aŭ nur unu
	local grupo = frame.args["grupo"] 
	-- variabla tabelo el vokanta modulo
	local tab = frame.args["tabelo"] or {}
	-- helpa variablo
	local alt = ""

	-- get wikidata entity
    local entity
    if id ~= nil and id ~= "" then
        entity = mw.wikibase.getEntity(id)
    else
        entity = mw.wikibase.getEntity()
    end
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	
	local bildo
	if grupo == "ne" then
		bildaro = wikidata.claim({args = { pkodo, id = id} })	
	else	
	-- {{#invoke:Wikidata|claim|P18|list=;;;}}
		bildaro = wikidata.claim({args = { pkodo, list=";;;", id = id} })
	end

	if bildaro then
		-- {{#invoke:Listutil|count|;;;|{{#invoke:Wikidata|claim|P18|list=;;;}}}}
		local nombro = listoj.count({args = {";;;", bildaro} })
		nombro = tonumber(nombro)
		local b = ""
		if nombro > 1 then
			if priskribo == "" or priskribo == nil then
				for i=1, nombro do
					local bp = frame.args["priskribo de bildo" .. i] or tab["priskribo de bildo" .. i] or ""
					if i == 1 then
						if bp ~= "" then
							-- priskribo el parametro
							alt = bp 
							priskribo = '<div style="text-align:center">' .. bp .. "</div>"
						else	
							priskribo = p.priskriboBildo({args = {id=id, showerrors, default=default, subf="jes", bn = i, pkodo=pkodo, pkodo2=pkodo2} }) or ""
							if priskribo ~= "" and (pkodo2 == "P2096" or pkodo2 == "P163" or pkodo2 == "P237") then
								local ligilo = link(id, pkodo2)	
								-- priskribo el Vikidatumoj
								alt = priskribo
								priskribo = '<div style="text-align:center" class="wikidata-content">' .. priskribo .. " " .. ligilo .. "</div>"
							else
								-- defaŭlta priskribo
								alt = defpriskribo
								priskribo = '<div style="text-align:center">' .. defpriskribo .. "</div>"
							end
						end
					else	
						if bp ~= "" then
							alt = alt .. ";;;" .. bp
							priskribo = priskribo .. ";;;" .. '<div style="text-align:center">' .. bp .. "</div>"
						else	
							bp1 = p.priskriboBildo({args = {id=id, showerrors, default=default, subf="jes", bn = i, pkodo=pkodo, pkodo2=pkodo2} })	or ""
							if bp1 ~= "" and (pkodo2 == "P2096" or pkodo2 == "P163" or pkodo2 == "P237") then
								local ligilo = link(id, pkodo2)
								alt = alt  .. ";;;" .. bp1
								bp1 = '<div style="text-align:center" class="wikidata-content">' .. bp1 .. " " .. ligilo .. "</div>"	
								priskribo = priskribo .. ";;;" .. bp1								
							else
								alt = alt  .. ";;; "
								priskribo = priskribo .. ";;; "
							end
						end
					end
				end

			end
			-- {{#invoke:InfoboxImage|InfoboxImage|image={{#invoke:Wikidata|claim|P18|list=;;;}}|size={{{bildo-larĝeco|}}}|sizedefault=frameless|alt={{{bildo-priskribo|}}}|suppressplaceholder=yes|center=yes|caption={{{priskribo de bildoj|}}}|wd=yes}}
			b = bildfunkcio.InfoboxImage({args={image=bildaro,size=grandeco,sizedefault=defgrandeco,center="yes", alt=alt, caption=priskribo, wd="yes"} })					

			b = b .. kat2   -- aldoni kategorion laŭ la supra difino
		else
			--b = bildfunkcio._InfoboxImage(bildaro, "", "", grandeco, "", defgrandeco, alt, "", "", "", "", "", "", "", "yes")	

			local priskribo1 = frame.args["priskribo de bildo"]  or priskribo    -- ĉe unusola bildo la numerado de rilata parametro ne necesas
			if priskribo1 ~= "" and priskribo1 ~= nil then
				priskribo = '<div style="text-align:center; width:100%;">' .. priskribo1 .. "</div>"
			else
				priskribo1 = p.priskriboBildo({args={id= id, showerrors=showerrors, default=default, pkodo=pkodo, pkodo2=pkodo2} }) or ""
				-- &nbsp; necesas por certigi, ke sub alta bildo restas spaco por la priskribo
				if priskribo1  ~= "" and priskribo1 ~= nil and (pkodo2 == "P2096" or pkodo2 == "P163" or pkodo2 == "P237") then
					local ligilo = link(id, pkodo2)		
					priskribo = '<div style="text-align:center; width:100%;" class="wikidata-content">' .. priskribo1 .. " " .. ligilo .. "</div>"
				elseif defpriskribo ~= "" and defpriskribo ~= nil then
					priskribo = '<div style="text-align:center; width:100%;">' .. defpriskribo .. "</div>"
				end
			end
	
			b = bildfunkcio.InfoboxImage({args= {image=bildaro, size=grandeco, alt=priskribo1, sizedefault=defgrandeco, center="yes"} })				

			if paparte == "jes" then
				priskribo = priskribo1 or defpriskribo
			elseif priskribo ~= "" and priskribo ~= nil then	
				b = b .. priskribo
			end
		end
		b = b .. kat1		-- aldoni kategorion laŭ la supra difino
		if paparte == "jes" then
			return b, priskribo
		else
			return b
		end
	else
		if showerrors then return wikidata.printError("image-not-found") else return default end
		
		--"bildo ne difinita en P18 de Vikidatumoj"

	end	

end	


-- Funkcio por legi la priskribon (P2096) de bildo (p18)
function p.priskriboBildo(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	if default then showerrors = nil end
	local subf = frame.args["subf"] 		-- ĉu subfunkcio de alia modulo aŭ ne
	local bn = frame.args["bn"]				-- bilda numero el la vokanta funkcio
	local pkodo= frame.args["pkodo"] or "P18"
	local pkodo2= frame.args["pkodo2"] or "P2096"	

	-- get wikidata entity
    local entity
    if id ~= nil and id ~= "" then
        entity = mw.wikibase.getEntity(id)
    else
        entity = mw.wikibase.getEntity()
    end
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local bildo = entity:getBestStatements( pkodo )
	if (#bildo == 0) or (bildo[1].mainsnak.snaktype ~= "value") then
		return nil
	end
	
	if subf == "jes" and #bildo > 1 then
	-- nur se vokata kiel subfunkcio	
		v = bildo[1].qualifiers and bildo[bn].qualifiers and bildo[bn].qualifiers[pkodo2] or nil
	else
		v = bildo[1].qualifiers and bildo[1].qualifiers[pkodo2] or nil
	end	
		if (v==nil) then 
			if showerrors then return wikidata.printError("qualifier-not-found") else return default end 
		else 
			local longo = #v
			for i=1, longo do
				local t =v[i].datavalue.value.text 
				local l = v[i].datavalue.value.language
				if l == "eo" then		-- serĉu tekston kun lingva indiko de esperanto
					return t .. kat3    -- aldonas kategorion. vidu supre
				end
			end
			return ""  			

		end

end

function p.nombro(frame)
	local id = frame.args["id"]	
	local pkodo= frame.args["pkodo"] or "P18"
	local entity
    if id ~= nil and id ~= "" then
        entity = mw.wikibase.getEntity(id)
    else
        entity = mw.wikibase.getEntity()
    end	
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
    local bildaro
    local artikolo = ""
    if id ~= nil and id ~= "" then    
    	bildaro = wikidata.claim({args = { pkodo, list=";;;", id = id} })
    	artikolo = wikidata.labelOf({args={id}}) or ""
    else
    	bildaro = wikidata.claim({args = { pkodo, list=";;;"} })  
    	artikolo = wikidata.labelOf({args={}}) or ""   	
    end 
    
    local nombro = listoj.count({args = {";;;", bildaro} })
    local nombro2 = tonumber(nombro)
    if type(nombro2) == "number" then
    	return "Nombro de bildoj: '''" .. nombro .. "''' - por " .. pkodo .. " de la artikolo [[" .. artikolo .. "]]"
    else
    	return "neniuj informoj"
    end
		
end	


return p