Modulo:Biografio

El Vikipedio, la libera enciklopedio
Jump to navigation Jump to search
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.)
-- modulo Biografio, 2017-03-28
-- ĉi tiu modulo celas aranĝi la ŝablonon {{informkesto biografio}}, kiu konsistas el tri partoj:
-- enkonduka frazo
-- kategorioj
-- informkesto

local datoj = require("Modulo:Datoj")
local wikidata = require("Modulo:Wikidata")			-- bonvolu atenti, ke temas pri du malsamaj moduloj!
local wikidatoj = require("Modulo:WikidataBiografio")	-- bonvolu atenti, ke temas pri du malsamaj moduloj!
local listoj = require("Modulo:Listutil")
local bildoj = require("Modulo:InfoboxImage/provejo")

-- helpaj funkcioj sen ŝablonoj
local function aldonulinion (c1, c2, wd)
	local tabellinio = tabelo:tag("tr")
	local chelo1 = tabellinio:tag("td")
		:wikitext("'''" .. c1 .. "'''")
		:done()
	if wd == "jes" then
		local chelo2 = tabellinio:tag("td")
			:addClass("wikidata-content")
			:wikitext(c2)
			:done()
			:newline()
	else
		local chelo2 = tabellinio:tag("td")
			:wikitext(c2)
			:done()
			:newline()
	end
end

-- por la funkcioj "enkonduko" kaj "informkesto", ĉar tie ligiloj eble devus esti aldonata
-- komparu la funkcion "link" en la modulo Listutil
local function chuligilo(teksto)
	-- analizo, ĉu jam estas ligilo. se jes, ŝanĝu nenion.
	-- kodopeco el Modulo:Listutil, funcio link
	local s = teksto:match( "%[%[[^|%]]*| *([^%]]+) *%]%]" )
	if not s then
		s = teksto:match( "%[%[%s*([^%]]+)%s*%]%]" )
	end
	if not s then
		return true
	end
	return false
end

-- el la modulo Listutil
-- senligiligas la tekston en v kaj eligas [[Ulo]] aŭ [[Artikolo|Ulo]] kiel Ulo.
-- tio estas bezonata, ĉar ligilo en ligilo ne eblas
-- s - estas helpa variablo
local function delink(v)
	s = v:match( "%[%[[^|%]]*| *([^%]]+) *%]%]" )
	if not s then
		s = v:match( "%[%[%s*([^%]]+)%s*%]%]" )
	end
	if not s then
		s = v
	end
	return mw.text.trim(s) -- forigas spacetojn
end

-- rearanĝas la okupojn, traŝovante la unuopajn erojn tra alia helpa funkcio, se estas pli ol unu
-- alie faru kiel ĉe "okupo", "okupo2" kaj "okupo3"
-- "chu" stiras, ĉu la rekunigitaj listeroj jam estu traktataj de la modulo Listutil aŭ ne
local function okupoanalizo(okupoj,chu)
	local o = ""
	local n = listoj._count(",",okupoj)
	if n > 1 then
		local strings = mw.text.split(okupoj, ",", plain)
		for k,v in pairs(strings) do
			local listero = ""
			if chuligilo(v) then
				listero = "[[" .. v .. "]]"
			else
				listero = v
			end
			if k > 1 then
				o = o .. "," .. listero
			else
				o = listero
			end
		end
		if chu ~="ne" then
			o = listoj._list(",",o,"jes","kaj")
		end
	else
		-- analizo, ĉu jam estas ligilo. se jes, ŝanĝu nenion.
		if chuligilo(okupoj) then
			o = "[[" .. okupoj .. "]]"
		else
			o = okupoj
		end
	end
	return o
end

local function okupokategorio (shtato, okupo,t)
	if shtato ~= "" and shtato ~= nil then
		local frame = mw.getCurrentFrame()
		local r = frame:expandTemplate{
			title="Informkesto biografio/Kategorio",
			args={
				shtato,
				okupo
			}
		}
		if t ~="" then
			r = mw.ustring.gsub(r,"%[%[Kategorio:","[[:Kategorio:")
		end
		return r
	else
		return ""
	end
end

local function shtatadjektivo (shtato)
	local frame = mw.getCurrentFrame()
	local st = frame:expandTemplate{
		title = "Informkesto biografio/Ŝtatlisto",
		args = {
		shtato,
		}
	}
	return st
end

local function vivtempo (naskjaro, mortjaro,t)
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate{
		title="Vivtempo",
		args = {}
	}
	if t ~="" then
		n = mw.ustring.gsub(n,"%[%[Kategorio:","[[:Kategorio:")
	end
	return n
end

local function etmajuskloj (teksto)
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {
		title="etmajuskloj",
		args = {
		teksto
		}
	}
	return n
end

local function changetemplate (shablono,fono)
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {
		title="ŝanĝu ŝablonon2",
		args = {
		["ŝablono"] = shablono,
		fonkoloro = fono
		}
	}
	return n
end

local function monato (m)
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {
		title="monato",
		args = {
		m
		}
	}
	return n
end

local function paghenamebase ()
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {
		title="PAGENAMEBASE",
	}
	return n
end

local p = {}

function p.enkonduko ( frame )
	-- This function builds the infobox used by the {{informkesto biografio}} template.
	if not getArgs then
		getArgs = require("Module:Arguments").getArgs
	end
	--local args = getArgs(frame, {wrappers = "Template:Babel"})
	local args = getArgs(frame, {wrappers = "Ŝablono:Informkesto biografio"})

	-- nomoj
	local antaunomo = args["Antaŭnomo"] or ""
	local familinomo = args["Familinomo"] or ""
	local postnomo = args["Postnomo"] or ""
	local prononco = args["Prononco"] or ""
	local postfamilinomo = args["PostFamilinomo"] or ""
	local aliajlingvoj = args["AliajLingvoj"] or ""
	local veranomo = args["VeraNomo"] or ""

	-- datoj
	local nasktago = args["NaskiĝTago"] or ""
	local naskmonato = args["NaskiĝMonato"] or ""
	local naskjaro = args["NaskiĝJaro"] or ""
	local naskloko = args["NaskiĝLoko"] or ""
	local nasklokoligilo = args["NaskiĝLokoLigilo"] or ""
	local morttago = args["MortTago"] or ""
	local mortmonato = args["MortMonato"] or ""
	local mortjaro = args["MortJaro"] or ""
	local mortloko = args["MortLoko"] or ""
	local mortlokoligilo = args["MortLokoLigilo"] or ""

	-- okupoj
	local antauokupo = args["AntaŭOkupo"] or ""
	local okupoj = args["Okupoj"] or ""
	local okupo = args["Okupo"] or ""
	local okupo2 = args["Okupo2"]	or ""
	local okupo3 = args["Okupo3"]	or ""
	local aliajokupoj = args["AliajOkupoj"] or ""
	local postokupo = args["PostOkupo"] or ""

	-- lokaj aferoj
	local shtato = args["Ŝtato"] or ""

	-- ceteraj variabloj
	local r = ""
	local estas = "estas"
	local spaco = " "

	-- noma parto
	local nomo = "'''"

	if antaunomo ~= "" then
		nomo = nomo .. antaunomo .. spaco
	end
	if familinomo ~= "" then
		nomo = nomo .. '<span style="text-transform:uppercase">' .. familinomo .. "</span>"
	end
	if postnomo ~= "" then
		nomo = nomo .. spaco .. postnomo
	end
	nomo = nomo .. "'''"

	r = r .. nomo

	-- stira variablo por la sekvaj informoj kaj la funkcia bloko pri naskiĝo kaj morto
	local jamkrampo = false
	-- transdoni prononcindikon al la rilata ŝablono
	if prononco ~= "" then
		local p = frame:expandTemplate{
			title = "prononco",
			args = {
				prononco,
			}
		}
		r = r .. spaco .. "(" .. p
		jamkrampo = true
	end
	if postfamilinomo ~= "" then
		local k = ""
		if jamkrampo == false then
			k = "("
			jamkrampo = true
		else
			k = ", "
		end
		r = r .. spaco .. k .. postfamilinomo
	end
	if aliajlingvoj ~= "" then
		local k = ""
		if jamkrampo == false then
			k = "("
			jamkrampo = true
		else
			k = ", "
		end
		r = r .. spaco .. k .. aliajlingvoj
	end

	-- data parto
	local n = "" -- pri naskiĝo
	local m = "" -- pri morto
	local d = "" -- pri la tuta dataro
	local v = "" -- vera nomo kun indiko pri tio

	-- naskiĝa parto de la skripto
	if nasktago ~= "" and naskmonato ~= "" then
		local naskdato = datoj._daton(nasktago, naskmonato, naskjaro)
		n = "naskiĝis la " .. naskdato
	elseif naskjaro ~= "" then
		if naskjaro == "?" then
			n = "naskiĝdato nekonata"
		else
			local testo = tonumber(naskjaro)
			if type(testo) == "number" then
				n = "naskiĝis en [[" .. naskjaro .. "]]"
			else
				n = "naskiĝis " .. naskjaro
			end
		end
	elseif nasktago == "" and naskmonato == "" and naskjaro == "" then
		-- rigardu al Vikidatumoj
		local naskdato = wikidatoj.naskidato()
		if naskdato ~= nil then
			-- n = "naskiĝis " .. wikidatoj.Nteksto()
			n = "naskiĝis " .. datoj.Nteksto()
		end
	end
	if naskloko ~= "" then
		local komo = ""
		-- se jam estas enhavo, interŝovu komon
		if n ~= "" then
			komo = ", "
		else
			komo = "naskiĝis "
		end
		if nasklokoligilo ~= "" then
			naskloko = "[[" .. nasklokoligilo .. "|" .. naskloko .. "]]"
		else
			local l = listoj._count(",",naskloko)
			if l > 1 then
				naskloko = listoj._list(",",naskloko, "jes", "span", ",", "", "", "", 0, "")
			else
				naskloko = "[[" .. naskloko .. "]]"
			end
		end
		n = n .. komo .. "en " .. naskloko
	-- jen skripto pri tio en wikidatumoj
	else
		naskloko = wikidatoj.naskiloko()
		if naskloko == nil then
			naskloko = ""
		else
			naskloko = "[[" .. naskloko .. "]]"
			n = n .. ", " .. "en " .. naskloko
		end
	end
	-- parto pri la mortodatoj de la skripto
	if morttago ~= "" and mortmonato ~= "" then
		local mortdato = datoj._daton(morttago, mortmonato, mortjaro)
		m = spaco .. "mortis la " .. mortdato
		estas = "estis"
	elseif mortjaro ~= "" then
		if mortjaro == "?" then
			m = spaco .. "mortodato nekonata"
		else
			local testo = tonumber(mortjaro)
			if type(testo) == "number" then
				m = spaco .. "mortis en [[" .. mortjaro .. "]]"
			else
				m = spaco .. "mortis " .. mortjaro
			end
		end
			estas = "estis"
	elseif morttago == "" and mortmonato == "" and mortjaro == "" then
		-- rigardu al Vikidatumoj
		local mortdato = wikidatoj.mortdato()
		if mortdato ~= nil then
			-- if la homo mortis, aŭ oni konas lian datmorton aŭ oni ne konas ĝin
			if mortdato ~= "nekonata" then
				m = spaco .. "mortis " .. datoj.Mteksto()
			elseif mortdato == "nekonata" then
				m = spaco .. "mortis je nekonata dato"
			end
			estas = "estis"
		end
	end
	if mortloko ~= "" then
		local komo = ""
		-- se jam estas enhavo, interŝovu komon
		if n ~= "" then
			komo = ", "
		else
			komo = "mortis "
		end
		if mortlokoligilo ~= "" then
			mortloko = "[[" .. mortlokoligilo .. "|" .. mortloko .. "]]"
		else
			local l = listoj._count(",",mortloko)
			if l > 1 then
				mortloko = listoj._list(",",mortloko, "jes", "span", ",", "", "", "", 0, "")
			else
				mortloko = "[[" .. mortloko .. "]]"
			end
		end
		m = m .. komo .. "en " .. mortloko
	-- jen skripto pri tio en wikidatumoj
	else
		mortloko = wikidatoj.mortloko()
		if mortloko == nil then
			mortloko = ""
		else
			mortloko = "[[" .. mortloko .. "]]"
			m = m .. ", " .. "en " .. mortloko
		end
	end

	if veranomo ~= "" then
		v = "&#059; vera nomo " .. veranomo
	end
	-- kunmetado de la informoj pri la naskiĝo kaj morto, se tiaj datoj estas ie difinitaj
	-- se ekzistas informoj pri prononco, postfamilinomo aŭ aliajlingvoj, tiam la enkonduka krampo
	-- jam estas tie kaj ĉi tie devas esti punktokomo
	local k = "; "
	if jamkrampo == false then
		k = "("
		jamkrampo = true
	end
	if n ~= "" and m ~= "" then
		d = spaco .. k .. n .. "," .. m .. v .. ") "
	elseif n ~= "" and m == "" then
		d = spaco .. k .. n .. v .. ") "
	elseif n == "" and m ~= "" then
		d = spaco .. k .. "naskiĝdato nekonata; " .. m .. v .. ") "
	elseif n == "" and m == "" then
		d = spaco .. k .. "naskiĝdato nekonata" .. v .. ") "
	end
	-- aldono al la eldonota signoĉeno
	r = r .. d

	-- fina krampo estu aranĝata, se informoj pri naskiĝo kaj morto forestas, sed estas io pri
	-- prononco, postfamilinomo aŭ aliajlingvoj
	if d == "" and jamkrampo == true then
		r = r .. ") "
	end

	-- aldono al la eldonota signoĉeno
	if antauokupo ~= "" then
		r = r .. antauokupo .. spaco
	else
		r = r .. " " .. estas
	end

	-- ŝtato kaj la rilata adjektivo per ŝablono
	local s = " [[" .. shtato .. "|"
	local st = shtatadjektivo(shtato)
	r = r .. s .. st .. "]] "

	-- okupoj
	local o = ""

	if okupoj ~="" then
		if aliajokupoj ~= "" then
			okupoj = okupoj .. "," .. aliajokupoj
		end
		o =  okupoanalizo(okupoj)
	elseif okupo ~= "" or okupo2 ~= "" or okupo3 ~= "" or aliajokupoj ~= ""  then
		local okupoj = ""
		if okupo ~="" then
			if chuligilo(okupo) then
				okupoj = "[[" .. okupo .. "]]"
			else
				okupoj = okupo
			end
		end
		if okupo2 ~="" then
			local o2 = okupo2
			if chuligilo(okupo2) then
				o2 = "[[" .. o2 .. "]]"
			end
			okupoj = okupoj .. "," .. o2
		end
		if okupo3 ~="" then
			local o3 = okupo3
			if chuligilo(okupo3) then
				o3 = "[[" .. o3 .. "]]"
			end
			okupoj = okupoj .. "," .. o3
		end
		if aliajokupoj ~="" then
			local o_a = okupoanalizo(aliajokupoj,"ne")
			okupoj = okupoj .. "," .. o_a
		end
		if okupo ~= "" or okupo2 ~= "" or okupo3 ~= "" or aliajokupoj ~= "" then
			o = listoj._list(",",okupoj,"jes","kaj")
		end
	else
		-- okupoj el Vikidatumoj
		local wdo = wikidatoj.okupo()
		if wdo ~= nil then
			o = listoj._list(",",wdo,"jes","kaj")
		end
	end
	r = r .. o
	-- io metata post la okupoj
	if postokupo ~= "" then
		r = r .. postokupo
	end

	return r
end

--
function p.kategorio (frame)
	-- This function builds the infobox used by the {{informkesto biografio}} template.
	if not getArgs then
		getArgs = require("Module:Arguments").getArgs
	end
	--local args = getArgs(frame, {wrappers = "Template:Babel"})
	local args = getArgs(frame, {wrappers = "Ŝablono:Informkesto biografio"})

	-- nomoj
	local antaunomo = args["Antaŭnomo"] or ""
	local familinomo = args["Familinomo"] or ""
	local postnomo = args["Postnomo"] or ""
	local prononco = args["Prononco"] or ""
	local postfamilinomo = args["PostFamilinomo"] or ""
	local aliajlingvoj = args["AliajLingvoj"] or ""
	local veranomo = args["VeraNomo"] or ""

	-- datoj
	local nasktago = args["NaskiĝTago"] or ""
	local naskmonato = args["NaskiĝMonato"] or ""
	local naskjaro = args["NaskiĝJaro"] or ""
	local naskloko = args["NaskiĝLoko"] or ""
	local morttago = args["MortTago"] or ""
	local mortmonato = args["MortMonato"] or ""
	local mortjaro = args["MortJaro"] or ""
	local mortloko = args["MortLoko"] or ""

	-- okupoj
	local antauokupo = args["AntaŭOkupo"] or ""
	local okupoj = args["Okupoj"] or ""
	local okupo = args["Okupo"] or ""
	local okupo2 = args["Okupo2"]	or ""
	local okupo3 = args["Okupo3"]	or ""
	local aliajokupoj = args["AliajOkupoj"] or ""
	local postokupo = args["PostOkupo"] or ""

	-- lokaj aferoj
	local shtato = args["Ŝtato"] or ""

	-- por la kategorioj
	local ordigilo = args["Ordigo"] or ""
	local ordigu = args["Ordigu"] or ""
	local test = args["Testo"] or ""

	-- ceteraj variabloj
	local r = ""
	local okat = ""
	local spaco = "&#32;"
	local t = ""
	if test == "yes" or test == "jes" then
		t = ":"
	end

	-- kategorioj pri okupoj
	if okupoj ~= "" then
		local n = listoj._count(",", okupoj)
		if n > 1 then
			strings = mw.text.split(okupoj, ",", plain)
			for k,v in pairs(strings) do
				v = delink(v)
				local okat1 = okupokategorio(shtato,v,t)
				okat = okat .. okat1
			end
		else
			okupoj = delink(okupoj)
			local okat1 = okupokategorio(shtato,okupoj,t)
			okat = okat .. okat1
		end
	end

	if okupo ~="" then
		okupo = delink(okupo)
		local okat1 = okupokategorio(shtato,okupo,t)
		okat = okat .. okat1
	end
	if okupo2 ~="" then
		okupo2 = delink(okupo2)
		local okat1 = okupokategorio(shtato,okupo2,t)
		okat = okat .. okat1
	end
	if okupo3 ~="" then
		okupo3 = delink(okupo3)
		local okat1 = okupokategorio(shtato,okupo3,t)
		okat = okat .. okat1
	end
	-- Kategorioj pri okupoj el Vikidatumoj, se nenio alia ĉeestas
	if okupoj == "" and okupo == "" and okupo2 == "" and okupo3 == "" then
		local wdo = wikidatoj.okupo()
		if wdo ~= nil then
			local n = listoj._count(",", wdo)
			if n > 1 then
				strings = mw.text.split(wdo, ",", plain)
				for k,v in pairs(strings) do
					local okat1 = okupokategorio(shtato,v,t)
					okat = okat .. okat1
				end

			else
				local okat1 = okupokategorio(shtato,wdo,t)
				okat = okat .. okat1
			end
		end
	end

	-- transpreno de informoj pri la sekso de persono el vikidatumoj
	local sekso = wikidatoj.sekso()
	if sekso ~= nil then
		if sekso == "vira" then
			okat = okat .. okat .. "[[" .. t  .. "Kategorio:Viroj]]"
		elseif sekso == "ina" then
			okat = okat .. okat .. "[[" .. t  .. "Kategorio:Virinoj]]"
		end
	end

	-- aldono al la eldonenda signoĉeno
	r = r .. okat

	-- ordigo
	--{{DEFAULTSORT:{{ucfirst:{{#if:{{{Ordigo|}}}|{{{Ordigo}}}|{{#if:{{{Familinomo|}}}|{{{Familinomo}}}&#32;,{{{Antaŭnomo}}}|{{{Antaŭnomo}}}}}}}}}}}
	local ordigo = ""
	if ordigilo ~="" then
		local ordigilo = mw.ustring.upper(mw.ustring.sub(ordigilo, 1, 1)) .. mw.ustring.sub(ordigilo, 2)   -- anstataŭaĵo de {{ucfirst:
		ordigo = ordigo .. ordigilo
	else
		if familinomo ~= "" then
			ordigo = ordigo .. familinomo .. spaco .. "," .. antaunomo
		else
			ordigo = ordigo .. antaunomo
		end
	end
	-- ĝi okazu nur, se la koncerna variablo ne malŝaltas tion
	if ordigu ~= "ne" then
		ordigo = frame:callParserFunction{ name = "DEFAULTSORT", args = ordigo }
	else
		-- se ne okazu ordigo laŭ iu ordigilo, forĵetu tion, por ke tio ne subite aperu kiel normala teksto
		ordigo = ""
	end
	-- aldono al la eldonenda signoĉeno
	r = r .. ordigo

	-- dataj kategorioj
	if naskjaro ~= "" then
		local n = vivtempo(naskjaro,mortjaro,t)
		-- aldono al la eldonenda signoĉeno
		r = r .. n
	else
		local n = wikidatoj.naskidato()
		if n ~= nil then
			local n = wikidatoj.Njaro()
			local m = wikidatoj.Mjaro()
			if wikidatoj.mortdato() == "nekonata" then m="NEKONATA" end
			local k = vivtempo(n,m,t)
			--local k = ""
			-- aldono al la eldonenda signoĉeno
			r = r .. k
		end
	end

	return r
end

-- funkcio por la informkesta parto, iom post iom kompletigota
function p.informkesto (frame)
	-- This function builds the infobox used by the {{informkesto biografio}} template.
	if not getArgs then
		getArgs = require("Module:Arguments").getArgs
	end
	--local args = getArgs(frame, {wrappers = "Template:Babel"})
	local args = getArgs(frame, {wrappers = "Ŝablono:Informkesto biografio"})

	-- nomoj
	local antaunomo = args["Antaŭnomo"] or ""
	local familinomo = args["Familinomo"] or ""
	local postnomo = args["Postnomo"] or ""
	local prononco = args["Prononco"] or ""
	local postfamilinomo = args["PostFamilinomo"] or ""
	local aliajlingvoj = args["AliajLingvoj"] or ""
	local veranomo = args["VeraNomo"] or ""

	-- bildo resp. dosiero
	local dosiero = args["Dosiero"] or ""
	local tipodosiero = args["TipoDosiero"] or ""
	local dosieragrandeco = args["Dosiera grandeco"] or ""
	local subteksto = args["Subteksto"] or ""

	-- datoj
	local nasktago = args["NaskiĝTago"] or ""
	local naskmonato = args["NaskiĝMonato"] or ""
	local naskjaro = args["NaskiĝJaro"] or ""
	local naskloko = args["NaskiĝLoko"] or ""
	local nasklokoligilo = args["NaskiĝLokoLigilo"] or ""
	local morttago = args["MortTago"] or ""
	local mortmonato = args["MortMonato"] or ""
	local mortjaro = args["MortJaro"] or ""
	local mortloko = args["MortLoko"] or ""
	local mortlokoligilo = args["MortLokoLigilo"] or ""

	-- okupoj
	local antauokupo = args["AntaŭOkupo"] or ""
	local okupoj = args["Okupoj"] or ""
	local okupo = args["Okupo"] or ""
	local okupo2 = args["Okupo2"]	or ""
	local okupo3 = args["Okupo3"]	or ""
	local aliajokupoj = args["AliajOkupoj"] or ""
	local postokupo = args["PostOkupo"] or ""

	-- lokaj aferoj
	local shtato = args["Ŝtato"] or ""

	-- formatoj
	local fono = args["Fono"] or ""
	if fono == "" then
	-- ĉi tie prefere estu difinata la sama koloro kiel en {{informkesto homoj}} por la tiea kaplinio kaj piedlinio
	-- laŭ ĵusa diskuto sur [[Ŝablono-Diskuto:Informkesto_homoj]] pri la koloroj, 20151013
		fono = "#DDDDFF"
	end

	-- ceteraj variabloj
	local r = ""
	local spaco = "&#32;"
	local fn1 = '<span style="text-transform:uppercase">'
	local fn2 = "</span>"
	local br = "<br/>"

	-- komenco de la tabelo
	-- la variablo "tabelo" ne povas esti local, ĉar alie ĝia uzo en subŝablono ne funkcias
	tabelo = mw.html.create("table")
			:addClass("infobox vcard")
			:css("width","23em")
			:css("-moz-box-shadow", "4px 4px 4px #ccc")
			:css("-webkit-box-shadow", "4px 4px 4px #ccc")
			:css("box-shadow", "4px 4px 4px #ccc")
			:newline()
	-- kaplinio
	local tabelkapo = tabelo:tag("tr")
	-- kaplinia ĉelo
	local kapchelo = tabelkapo:tag("th")
			:addClass("kaplinio persono fn")
			:attr("colspan","3")
			:css("color","#000")
			:css("background-color",fono)
			:css("text-align","center")

	-- nomoj
	local n = ""
	if antaunomo ~="" then
		n = antaunomo .. spaco
	end
	if familinomo ~="" then
		n = n .. fn1 .. familinomo .. fn2
	end
	if postnomo ~= "" then
		n = n .. br .. spaco .. postnomo
	end

	-- meto de la nomoj en la kapĉelon
	kapchelo:wikitext (n)
			:done()
			:newline()

	-- parto por la tabela korpo

	-- bilda parto
	-- colspan="2" style="font-size:smaller;text-align: center"
	if dosiero ~= "" then
		local bildo = tabelo:tag("tr")
		local bildchelo = bildo:tag("td")
			:attr("colspan","2")
			:css("font-size","smaller")
			:css("text-align","center")

		-- {{#invoke:InfoboxImage|InfoboxImage|image={{{Dosiero|}}}|ending={{{TipoDosiero|}}}|endingdefault=jpg|size={{{Dosiera grandeco|}}}|sizedefault=220px|alt={{{Subteksto|{{{Antaŭnomo|}}}}}}|suppressplaceholder=yes}}
		local alt = antaunomo
		local n = antaunomo .. " " .. etmajuskloj(familinomo)
		if subteksto ~= "" then
			alt = subteksto
			n = subteksto
		end
		local b = bildoj._InfoboxImage(dosiero, tipodosiero, "jpg", dosieragrandeco, "", "220px", alt, "", "", "", "", "", "", "", "yes")
		-- {{{Subteksto|{{{Antaŭnomo}}} {{etmajuskloj|{{{Familinomo}}}}}}}}}}
		if n ~= "" then
			b = b .. "<div>" .. n .. "</div>"
		end
		bildchelo:wikitext(b)
	end

	-- personaj informoj
	local subtitolo1 = tabelo:tag("tr")
	local titol1chelo = subtitolo1:tag("th")
			:css("background-color","#ddd")
			:css("text-align","center")
			:attr("colspan","2")
			:wikitext("Persona informo")
			:done()
			:newline()

	--! {{#if:{{{VeraNomo|}}}|Plumnomo|Nomo}}
	--| {{#if:{{{Antaŭnomo|}}}|{{{Antaŭnomo}}}&#32;|}}{{etmajuskloj|{{{Familinomo|}}}}}{{#if:{{{Postnomo|}}}|&#32;{{{Postnomo}}}|}}
	local n1 = "Nomo"
	local n2 = ""
	if veranomo ~= "" then
		n1 = "Plumnomo"
	end
	if antaunomo ~= "" then
		n2 = antaunomo .. spaco
	end
	if familinomo ~= "" then
		n2 = n2 .. etmajuskloj(familinomo)
	end
	if postnomo ~= "" then
		n2 = n2 .. spaco .. postnomo
	end

	-- unua tabellinio por nomoj
		tabelo:newline()
	aldonulinion (n1, n2)

	-- dua tabellinio por nomoj
	if veranomo ~= "" then
		local n1 = "Vera nomo"
		local n2 = veranomo
		tabelo:newline()
		aldonulinion (n1, n2)
	end

	-- naskiĝjaro
	local n1 = "Dato de naskiĝo"
	if naskjaro ~= "" then
		local testo = tonumber(naskjaro)
		local n2 = ""
		if type(testo) == "number" then
			n2 = datoj._dato(nasktago,naskmonato,naskjaro)
		else
			n2 = naskjaro
		end
		aldonulinion (n1, n2)
	else
		local naskdato = wikidatoj.naskidato()
		if naskdato ~= nil then
			-- n2 = wikidatoj.Nkesto()
			n2 = datoj.Nkesto()
			local wdl = wikidata._pageId()         -- <span class="el_wd">[[:d:{{#invoke:Wikidata|pageId}}#P569|[+]]]</span>
			if wdl ~= nil then
				n2 = n2 .. ' <span class="el_wd">[[:d:' .. wdl .. "#P569|[#]]]</span>"
			end
			local wd = "jes"
			aldonulinion (n1, n2, wd)
		end
	end

	-- nakiĝloko
	local n1 = "Loko de naskiĝo"
	if naskloko ~= "" then
		if nasklokoligilo ~= "" then
			n2 = "[[" .. nasklokoligilo .. "|" .. naskloko .. "]]"
		else
			local l = listoj._count(",",naskloko)
			if l > 1 then
				n2 = listoj._list(",",naskloko, "jes", "span", ",", "", "", "", 0, "")
			else
				n2 = "[[" .. naskloko .. "]]"
			end
		end
		aldonulinion (n1, n2)
	else
		local nl = wikidatoj.NlokTeksto()
		if nl ~= nil then
			n2 = nl
			local wdl = wikidata._pageId()         -- <span class="el_wd">[[:d:{{#invoke:Wikidata|pageId}}#P19|[+]]]</span>
			if wdl ~= nil then
				n2 = n2 .. ' <span class="el_wd">[[:d:' .. wdl .. "#P19|[#]]]</span>"
			end
			local wd = "jes"
			aldonulinion (n1, n2, wd)
		end
	end

	-- mortjaro
	local m1 = "Dato de morto"
	if mortjaro ~= "" then
		local testo = tonumber(mortjaro)
		local m2 = ""
		if type(testo) == "number" then
			m2 = datoj._dato(morttago,mortmonato,mortjaro)
		else
			m2 = mortjaro
		end
		aldonulinion (m1, m2)
	else
		local mortdato = wikidatoj.mortdato()
		if mortdato ~= nil then
			-- m2 = wikidatoj.Mkesto()
			m2 = datoj.Mkesto()
			if wikidatoj.mortdato() == "nekonata" then m2="nekonata" end
			local wdl = wikidata._pageId()         -- <span class="el_wd">[[:d:{{#invoke:Wikidata|pageId}}#P570|[+]]]</span>
			if wdl ~= nil then
				m2 = m2 .. ' <span class="el_wd">[[:d:' .. wdl .. "#P570|[#]]]</span>"
			end
			local wd = "jes"
			aldonulinion (m1, m2, wd)
		end
	end

	-- mortloko
	local m1 = "Loko de morto"
	if mortloko ~= "" then
		if mortlokoligilo ~= "" then
			m2 = "[[" .. mortlokoligilo .. "|" .. mortloko .. "]]"
		else
			local l = listoj._count(",",mortloko)
			if l > 1 then
				m2 = listoj._list(",",mortloko, "jes", "span", ",", "", "", "", 0, "")
			else
				m2 = "[[" .. mortloko .. "]]"
			end
		end
		aldonulinion (m1, m2)
	else
		local ml = wikidatoj.MlokTeksto()
		if ml ~= nil then
			m2 = ml
			local wdl = wikidata._pageId()         -- <span class="el_wd">[[:d:{{#invoke:Wikidata|pageId}}#P20|[+]]]</span>
			if wdl ~= nil then
				m2 = m2 .. ' <span class="el_wd">[[:d:' .. wdl .. "#P20|[#]]]</span>"
			end
			local wd = "jes"
			aldonulinion (m1, m2, wd)
		end
	end

	-- okupoj
	local o = ""
	local n = 1 -- nombro de okupoj, ĉar de tio dependas la teksto en la tabelo
	local wd = "" -- indikilo por vikidatuma deveno, uzata malsupre

	if okupoj ~="" then
		if aliajokupoj ~= "" then
			okupoj = okupoj .. "," .. aliajokupoj
		end
		n = listoj._count(",",okupoj)
		o =  okupoanalizo(okupoj)
	elseif okupo ~= "" or okupo2 ~= "" or okupo3 ~= "" or aliajokupoj ~= ""  then
		local okupoj = ""
		if okupo ~="" then
			local o1 = okupo
			if chuligilo(okupo) then
				o1 = "[[" .. o1 .. "]]"
			end
			okupoj = o1
		end
		if okupo2 ~="" then
			local o2 = okupo2
			if chuligilo(okupo2) then
				o2 = "[[" .. o2 .. "]]"
			end
			okupoj = okupoj .. "," .. o2
		end
		if okupo3 ~="" then
			local o3 = okupo3
			if chuligilo(okupo3) then
				o3 = "[[" .. o3 .. "]]"
			end
			okupoj = okupoj .. "," .. o3
		end
		if aliajokupoj ~="" then
			local o_a = okupoanalizo(aliajokupoj,"ne")
			okupoj = okupoj .. "," .. o_a
		end
		if okupo ~= "" or okupo2 ~= "" or okupo3 ~= "" or aliajokupoj ~= "" then
			n = listoj._count(",",okupoj)
			if n > 1 then
				o = listoj._list(",",okupoj,"jes","kaj","","jes") -- disiga signo, ĉitiea variablo, modo, limsigno (ĉikaze ne uzata), linisalto
			else
				o = okupoj
			end
		end
	else
		-- okupoj el Vikidatumoj
		local wdo = wikidatoj.okupo()
		if wdo ~= nil then
			n = listoj._count(",",wdo)
			o = listoj._list(",",wdo,"jes","kaj","","jes")
			wd = "jes" -- ne estu "local" ĉi tie, ĉar alie ne funkcios ekster ĉi tiu else-bloko
		end
	end

	-- metado en tabelajn ĉelojn
	local o1 = "Okupoj"
	if o ~= "" then
		if n == 1 or n == "1" then
			o1 = "Okupo"
		end
		local o2 = o
		if wd == "jes" then
			local wdl = wikidata._pageId()         -- <span class="el_wd">[[:d:{{#invoke:Wikidata|pageId}}#P106|[+]]]</span>
			if wdl ~= nil then
				o2 = o2 .. ' <span class="el_wd">[[:d:' .. wdl .. "#P106|[#]]]</span>"
			end
			aldonulinion(o1, o2,wd)
		else
			aldonulinion(o1, o2)
		end
	end

	-- aĝo
	local a = ""
	-- {{{Familinomo|}}}, {{#if:{{{Antaŭnomo|}}}|&#32;{{{Antaŭnomo}}}|}}{{#if:{{{Postnomo|}}}|&#32;{{{Postnomo}}}|}}}}
	local ordigo = familinomo .. ", "
	if antaunomo ~= "" then
		ordigo = ordigo .. spaco .. antaunomo
	end
	if postnomo ~= "" then
		ordigo = ordigo .. spaco .. postnomo
	end
	-- se la nomoj ne estas difinitaj, malplenigu la ordigan ŝlosilon
	if ordigo == ", " then
		ordigo = ""
	end
	local v = true -- ĉu viva?
	if naskjaro ~= "" and mortjaro ~="" then
		-- naskiĝdato
		local nj = naskjaro
		local nm = "januaro"
		if naskmonato ~= "" then
			nm = naskmonato
		end
		local nm = monato(nm)
		local nt = "1"
		if nasktago ~= "" then
			nt = nasktago
		end
		-- mortodato
		local mj = mortjaro
		local mm = "januaro"
		if mortmonato ~= "" then
			mm = mortmonato
		end
		local mm = monato(mm)
		local mt = "1"
		if morttago ~= "" then
			mt = morttago
		end
		--a = agho (nj,nm,nt,mj,mm,mt,ordigo)
		-- la funkcio prefere estu en la modulo Datoj kaj tial estas nun enplektita de tie
		a = datoj._agho(nt,nm,nj,mt,mm,mj,"","",ordigo)
		v = false
	elseif naskjaro ~= "" and mortjaro == "" then
		-- naskiĝdato
		local nj = naskjaro
		local nm = "januaro"
		if naskmonato ~= "" then
			nm = naskmonato
		end
		local nm = monato(nm)
		local nt = "1"
		if nasktago ~= "" then
			nt = nasktago
		end
		--a = agho (nj,nm,nt,"","","",ordigo)
		-- nun la funkcio troviĝas en la modulo Datoj, ĉar tio estas pli taŭga modulo por ĝi
		a = datoj._agho(nt,nm,nj,"","","","","",ordigo)
	else
		a = wikidatoj.agho()
		local test = wikidatoj.vivanta()
		if test == 1 then
			v = false
		end
		if a == nil then
			a = ""
		end
	end

	-- aldono al la tabelo
	local a1 = "Aĝo"
	if a ~= "" then
		if v == false then
			a1 = "Aĝo je morto"
		end
		local a2 = a
		aldonulinion (a1, a2)
	end

	-- ligilo al portalo, laŭ {{Informkesto homoj}}
	-- ! colspan="2" style="margin:0;padding:1px;border:solid #aaa 1px;background:#fff;
	-- font-size:90%;text-align:center"| '''[[Portalo:Homoj|<span style="color:#000;background:#f9f9f9">Portalo pri Homoj</span>]]'''
	local portalo = '[[Portalo:Homoj|<span style="color:#000;background:#f9f9f9">Portalo pri Homoj</span>]]'
	portalo = "'''" .. portalo .. "'''" -- la grasigo estu aparta, ĉar alie Lua traktas tion kiel eraron
	local portallinio = tabelo:tag("tr")
	local portalchelo = portallinio:tag("th")
		:attr("colspan","2")
		:css("margin","0")
		:css("padding","1px")
		:css("border","solid #aaa 1px")
		:css("background","#fff")
		:css("font-size","90%")
		:css("text-align","center")
		:wikitext(portalo)

	-- ŝanĝu ŝablonon
	-- {{ŝanĝu ŝablonon|ŝablono=Informkesto biografio}}
	local shablono="Informkesto biografio"
	local t = changetemplate(shablono,fono)
	tabelo:newline()
		:wikitext(t)
		:newline()
		:done()

	r = tostring(tabelo)
	return r

end

return p