Saltu al enhavo

Modulo:Datoj

El Vikipedio, la libera enciklopedio
Dokumentado Dokumentado


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

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 Datoj -- 2022-09-06
-- ĉi tiu modulo celas plibonigi la jenajn ŝablonojn:
-- {{dato}},
-- {{daton}},
-- {{Naskiĝdato}}
-- {{Naskiĝdato kaj aĝo}}
-- {{Aĝo}}
-- {{Mortodato}}
-- kaj {{Mortodato kaj aĝo}}

-- variablon por ĉiuj funcioj 
	-- analizo de la nomspaco
    currentTitle = mw.title.getCurrentTitle()
    local ns   = currentTitle.namespace

-- internaj funkcioj

-- kopio el Modulo:Biografio/provejo, ĉar alie rezultas erarmesaĝo de Lua, ĉar
-- Datoj/provejo jam estas vokata de Modulo:Biografio/provejo
local function paghenamebase ()
	local frame = mw.getCurrentFrame()
	local n = frame:expandTemplate {
		title="PAGENAMEBASE",
	}
	return n
end

function monatonumero(m)
	local m1 = ""
	if m == 1 then
		m1 = "januaro"
	elseif m == 2 then
		m1 = "februaro"
	elseif m == 3 then
		m1 = "marto"
	elseif m == 4 then
		m1 = "aprilo"
	elseif m == 5 then
		m1 = "majo"
	elseif m == 6 then
		m1 = "junio"
	elseif m == 7 then
		m1 = "julio"
	elseif m == 8 then
		m1 = "aŭgusto"
	elseif m == 9 then
		m1 = "septembro"
	elseif m == 10 then
		m1 = "oktobro"
	elseif m == 11 then
		m1 = "novembro"
	elseif m == 12 then
		m1 = "decembro"
	end
	return m1
end	-- fino monatonumero

function monatoteksto(m)
	local m1 = ""
	local eraro = false
	-- se la dua parametro de {{dato}} aŭ {{daton}} forestas kaj anstataŭ tio estas jaro
	local n = tonumber(m)
	if n ~= nil then
		eraro = true
		m1 = ""
		return m1, eraro
	end
	local t = mw.ustring.lower(m)
	if t == "januaro"       or t == "jan" then
		m1 = "januaro"
	elseif t == "februaro"  or t == "feb" then
		m1 = "februaro"
	elseif t== "marto"      or t == "mar" then
		m1 = "marto"
	elseif t == "aprilo"    or t == "apr" then
		m1 = "aprilo"
	elseif t == "majo"      or t == "maj" then
		m1 = "majo"
	elseif t == "junio"     or t == "jun" then
		m1 = "junio"
	elseif t == "julio"     or t == "jul" then
		m1 = "julio"
	elseif t == "aŭgusto"   or t == "aŭg" then
		m1 = "aŭgusto"
	elseif t == "septembro" or t == "sep" then
		m1 = "septembro"
	elseif t == "oktobro"   or t == "okt" then
		m1 = "oktobro"
	elseif t == "novembro"  or t == "nov" then
		m1 = "novembro"
	elseif t == "decembro"  or t == "dec" then
		m1 = "decembro"
	else
		m1 = ""
		eraro = true
	end
	return m1, eraro
end	-- fino monatoteksto

-- redonu la numeron de monato ricenante ĝian nomon
function monatoalnumero (m)
	local r = ""
	m = mw.ustring.lower(m)
	if m == "januaro"       or m == "jan" then
		r = "01"
	elseif m == "februaro"  or m == "feb" then
		r = "02"
	elseif m== "marto"      or m == "mar" then
		r = "03"
	elseif m == "aprilo"    or m == "apr" then
		r = "04"
	elseif m == "majo"      or m == "maj" then
		r = "05"
	elseif m == "junio"     or m == "jun" then
		r = "06"
	elseif m == "julio"     or m == "jul" then
		r = "07"
	elseif m == "aŭgusto"   or m == "aŭg" then
		r = "08"
	elseif m == "septembro" or m == "sep" then
		r = "09"
	elseif t == "oktobro"   or m == "okt" then
		r = "10"
	elseif m == "novembro"  or m == "nov" then
		r = "11"
	elseif m == "decembro"  or m == "dec" then
		r = "12"
	end
	return r
end	 -- fino monatoalnumero

-- transprentita el Modulo:Biografio/provejo, ĉar la modulo Datoj estas pli taŭga por la funkcio
-- krome nun aliaj moduloj povas enplekti ĝin el la modulo Datoj
--  nj = naskigjaro, nm = naskiĝmonato, nt = naskiĝtago, mj = mortojaro, mm = mortomonato, mt = mortotago
-- ordigo = ordigŝlosilo
local function agho (nj,nm,nt,mj,mm,mt,ordigo,kat)
	local r = ""
	-- jen kodopeco, kiu certigu, ke nur numeroj estos traktataj
	local test = tonumber(nj) and tonumber(nm) and tonumber(nt)
	if test == nil then return r end
	d=os.time{year=nj, month=nm, day=nt}
	if mj ~= "" and mm ~="" and mt ~= "" then
		-- jen kodopeco, kiu certigu, ke nur numeroj estos traktataj
		local test = tonumber(mj) and tonumber(mm) and tonumber(mt)
		if test == nil then return r end
		f=os.time{year=mj, month=mm, day=mt}
	else
		f=os.time()
	end
	r = math.floor((f-d)/3600/24/365.25)
	if ordigo == "" then
		ordigo = paghenamebase()
	end
	if ns == 0 then
		if r > 99 and kat ~= "ne" then
			r = r .. "[[Kategorio:Centjaruloj|" .. ordigo .. "]]"
		end
	end
	return r
end

local p = {}

-- funkcioj, kiuj transprenas ion el Vikidatumoj per helpo de la modulo WikidataBiografio
local wd = require("Modulo:WikidataBiografio")

-- kopiitaj el la modulo WikidataBiografio/provejo
-- funkcioj por tekstoj en aliaj moduloj
function p.Nteksto()
   if wd.Ntago() == "" or wd.Nmonato == "" then return "en " .. p.Nkesto() else return "la " .. p.Nkeston() end
end

function p.Mteksto()
   if wd.Mtago() == "" then return "en " .. p.Mkesto() else return "la " .. p.Mkeston() end
end

function p.teksto()
	local nloko=wd.naskiloko() or ""
	local mloko=wd.mortloko() or ""
	if nloko ~= "" then
		nloko = "en [[" .. nloko .. "]]"
	end
	if mloko ~= "" then
		mloko = "en [[" .. mloko .. "]]"
	end
	local t=" (naskiĝis " ..  Nteksto() ..   nloko .. ", mortis " .. Mteksto() ..  mloko .. ")"
	return t
end


function p.Nkesto()
   return p._dato(wd.Ntago(),wd.Nmonato(),wd.Njaro())
end

function p.Mkesto()
   return p._dato(wd.Mtago(),wd.Mmonato(),wd.Mjaro())
end

function p.Nkeston()
   return p._daton(wd.Ntago(),wd.Nmonato(),wd.Njaro())
end

function p.Mkeston()
   return p._daton(wd.Mtago(),wd.Mmonato(),wd.Mjaro())
end

-- por elvokoj el aliaj moduloj
-- t = tago, m = monato, j = jaro
function p._dato(t,m,j,ar,ligilo)
	if t ~= "" and m == "" and j == "" then
		local count = 0
		for eachMatch in t:gmatch("-") do count = count + 1 end

		local pos, arr = 0, {}
	
		for st,sp in function() return string.find(t,"-",pos,true) end do
			table.insert(arr,string.sub(t,pos,st-1))
			pos = sp + 1
		end
		table.insert(arr,string.sub(t,pos))

		if count == 0 then
			--return p._dato("", "", arr[1])
			t = ""	
			m = ""
			j = arr[1]
		elseif count == 1 then
			--return p._dato("", arr[2], arr[1])
			t = ""	
			m = arr[2]
			j = arr[1]			
		elseif count > 1 then
			--return p._dato(arr[3], arr[2], arr[1])
			t = arr[3]
			m = arr[2]
			j = arr[1]
		end
	end	
	
	-- ar - artikolo aŭ io tia
	if ar == "" or ar == nil then
		ar = ""
	elseif ar ~= "" then
		ar = ar .. " "
	end
	if ligilo == nil then 
		ligilo = ""
	end
	if t == nil and m == nil and j == nil then
		return ""
	else
		if t == nil or m == nil then
			t = ""
			m = ""
		end
		if j == nil then
			j = ""
		end
	end
	local p1 = ""  -- parto 1
	local p1komenco = ""
	local p1fino = ""
	if ligilo ~= "ne" then
		p1komenco = "[["
		p1fino = "]]"
	end
	local spaco = ""
	local p2 = ""  -- parto 2
	if t ~="" then
		local ttest = tonumber(t)
		if type(ttest) == "number" then
			t = t * 1 -- forigas komencajn nulojn
			p1 = ar .. p1komenco .. t 
		else
			t = ""
		end

	end

	if t ~= "" and m ~= "" then
		p1 = p1 .. "-a de"
		spaco = " "
	end	
	
	if t == "" and m ~= "" then
		p1 = p1komenco
	end

	if m ~= "" then
			local mtest = tonumber(m) or m
			if type(mtest) == "number" and mtest >0 and mtest < 13 then
				local m1 = monatonumero(mtest)
				p1 = p1 .. spaco .. m1
				p1 = p1 .. p1fino 
			else
				local m1, testo = monatoteksto(mtest)
				if testo == false then -- ĝusta nomo de monato
					p1 = p1 .. spaco .. m1
					p1 = p1 .. p1fino 
				else				   -- malĝusta nomo
					p1 = ""
				end
			end	

	end		

	if t ~= "" and m == "" then
		p1 = p1 .. p1fino
	end

	if t ~= "" or m ~= "" then
		if j ~="" and p1 ~= "" then
			p1 = p1 .. "&nbsp;"
		end		
	end	

	if j ~="" then
		local testo = tonumber(j)
		if type(testo) == "number" then
			j = j * 1 -- forigas komencajn nulojn
			p2 = p1komenco .. j .. p1fino
		else
			p2 = j
		end
	end
	local r = p1 .. p2
	return r
end

-- t = tago, m = monato, j = jaro
function p._daton(t,m,j,ar,ligilo)
	if t ~= "" and m == "" and j == "" then
		local count = 0
		for eachMatch in t:gmatch("-") do count = count + 1 end

		local pos, arr = 0, {}
	
		for st,sp in function() return string.find(t,"-",pos,true) end do
			table.insert(arr,string.sub(t,pos,st-1))
			pos = sp + 1
		end
		table.insert(arr,string.sub(t,pos))

		if count == 0 then
			--return p._daton("", "", arr[1])
			t = ""
			m = ""
			j = arr[1]
		elseif count == 1 then
			--return p._daton("", arr[2], arr[1])
			t = ""
			m = arr[2]
			j = arr[1]			
		elseif count > 1 then
			--return p._daton(arr[3], arr[2], arr[1])
			t = arr[3]
			m = arr[2]
			j = arr[1]				
		end
	end	
	
	-- ar - artikolo aŭ io tia
	if ar == "" or ar == nil then
		ar = ""
	elseif ar ~= "" then
		ar = ar .. "&nbsp;"
	end
	if ligilo == nil then
		ligilo = ""
	end
	if t == nil and m == nil and j == nil then
		return ""
	else
		if t == nil or m == nil then
			t = ""
			m = ""
		end
		if j == nil then
			j = ""
		end
	end
	local p1 = ""  -- parto 1
	local p1komenco = ""
	local p1mezo = ""
	local p1teksto = ""
	local p1fino = ""
	local p2fino = ""
	if ligilo ~= "ne" then
		p1komenco = "[["
		p1mezo = "|"
		p1fino = "]]"
		p2fino = "]]"
	end
	local p2 = ""  -- parto 2
	local spaco = ""
	if t ~="" then
		local ttest = tonumber(t)
		if type(ttest) == "number" then
			t = t * 1 -- forigas komencajn nulojn
			p1 = ar .. p1komenco .. t 
		else
			t = ""
		end
	end

	if t ~= "" and m ~= "" then
		p1 = p1 .. "-a de"
		p1teksto = "-an de"
		spaco = "&nbsp;"
	end
	
	if t == "" and m ~= "" then
		p1 = p1komenco
		p1fino = "n" .. p1fino
	end	

	if m ~= "" then
			local mtest = tonumber(m) or m
			if type(mtest) == "number" and mtest >0 and mtest < 13 then
				local m1 = monatonumero(mtest)
				if ligilo ~= "ne" then
					p1 = p1 .. spaco .. m1
					p1 = p1 .. p1mezo
				else
					p1 = ar
				end
				p1 = p1 .. t .. p1teksto
				p1 = p1 .. spaco .. m1
				p1 = p1 .. p1fino 
			else
				local m1, testo = monatoteksto(mtest)
				if testo == false then -- ĝusta nomo de monato
					if ligilo ~= "ne" then
						p1 = p1 .. spaco .. m1
						p1 = p1 .. p1mezo
					else
						p1 = ar
					end
					p1 = p1 .. t .. p1teksto
					p1 = p1 .. spaco .. m1
					p1 = p1 .. p1fino 
				else				   -- malĝusta nomo
					p1 = ""
				end
			end		
	end


	if t ~= "" or m ~= "" then
		if j ~="" and p1 ~="" then
			p1 = p1 .. "&nbsp;"
		end		
	end

	if j ~="" then
		local testo = tonumber(j)
		if type(testo) == "number" then
			j = j * 1 -- forigas komencajn nulojn
			p2 = p1komenco .. j .. p2fino
		else
			p2 = j
		end
	end
	local r = p1 .. p2
	return r
end

-- aranĝas la mikroformatojn por la naskiĝdato
function nmikro (t,m,j)
	local mikro = "" -- mikroformato
	-- <span style="display:none">(nun <span class="bday">{{{1|{{{jaro|}}}}}}-{{ducifera nombro|{{{2|{{{monato|}}}}}}}}-{{ducifera nombro|{{{3|{{{tago|{{{3}}}}}}}}}}}</span>)</span>
	mikro = '<span style="display:none">'
	mikro = mikro .. '(nun <span class="bday">'
	local test = tonumber(m)
	if type(test) == "number" then
		m = m * 1 -- espereble tio forigas komencajn nulojn
		if test >0 and test <10 then
		m = "0" .. m
		end
	else
		local m1 = monatoalnumero (m)
		if m1 ~= ""  then -- ĝusta nomo de monato
			m = m1
		else
			m = "00"
		end
	end
	t = tonumber(t)
	if type(t) == "number" then
		t = t * 1 -- espereble tio forigas komencajn nulojn
		if t >0 and t <10 then
			t = "0" .. t
		end
	else
		t = "00"
	end
	mikro = mikro .. j .. "-" .. m .. "-" .. t
	mikro = mikro .. "</span>)</span>"

	return mikro
end

function p._naskdato(t,m,j,a)
	local teksto = ""
	local r = ""
	local mikro = "" -- mikroformato
	local ar = "la "
	a = mw.ustring.lower(a)
	if a == "yes" or a == "jes" or a == "" then
		teksto = p._daton(t,m,j,ar)
	else
		teksto = p._dato(t,m,j,ar)
	end

	if teksto ~= "" then
		r = teksto
		mikro = nmikro(t,m,j)
		if mikro ~= "" then
		r = r .. mikro
		end
	end

	return r
end

function p._naskdatoagho(t,m,j,a,k)
	local teksto = ""
	local agho1 = ""
	teksto = p._naskdato(t,m,j,a)

	-- aldoni aĝon
	if teksto ~= "" then
		--<span class="noprint"> ({{aĝo| {{{1|{{{jaro|{{{1}}}}}}}}} | {{{2|{{{monato|{{{2}}}}}}}}} | {{{3|{{{tago|{{{3}}}}}}}}}| {{{4|{{CURRENTYEAR}}}}} | {{{5|{{CURRENTMONTH}}}}} | {{{6|{{CURRENTDAY}}}}} }}-jara)</span>
		local testo = tonumber(m)
		if type(testo) == "number" then
			agho1 = agho(j,m,t,"","","","",k)
		else
			local mt = monatoalnumero (m)
			agho1 = agho (j,mt,t,"","","","",k)
		end
		if agho1 ~= "" then
			teksto = teksto .. '<span class="noprint"> (' .. agho1 .. "‑jara)</span>"
		end
	end

	return teksto
end

function p._agho(t1,m1,j1,t2,m2,j2,a,jara,ordigo,k)
	local teksto = ""
	local agho1 = ""
	local ja = jara
	-- aldono de akuzativo, se samtempe "-jara" estas aldonata
	a = mw.ustring.lower(a)
	if a == "jes" or a == "yes" then
		a = "n"
	end

	-- analizo, ĉu monato estas numero aŭ vorto
	local testo = tonumber(m1)
	if type(testo) ~= "number" then
		m1 = monatoalnumero (m1)
	end
	local testo = tonumber(m2)
	if type(testo) ~= "number" then
		m2 = monatoalnumero (m2)
	end

	agho1 = agho(j1,m1,t1,j2,m2,t2,ordigo,k)

	if agho1 ~= "" and ja == "jes" then
		teksto = teksto .. '<span class="noprint"> (' .. agho1 .. "‑jara" .. a .. ")</span>"
	elseif agho ~= "" then
		teksto = agho1
	end

	return teksto
end

function p._mortodatoagho(t1,m1,j1,t2,m2,j2,a,k)
	local teksto = ""
	local agho1 = ""
	local ja = jara
	a = mw.ustring.lower(a)
	if a == "yes" or a == "jes" or a == "" then
		teksto = p._daton(t1,m1,j1)
	else
		teksto = p._dato(t1,m1,j1)
	end

	-- aldoni aĝon
	if teksto ~= "" then
		teksto = "la " .. teksto
		-- analizo, ĉu monato estas numero aŭ vorto
		local testo = tonumber(m1)
		if type(testo) ~= "number" then
			m1 = monatoalnumero (m1)
		end
		local testo = tonumber(m2)
		if type(testo) ~= "number" then
			m2 = monatoalnumero (m2)
		end

		agho1 = agho(j2,m2,t2,j1,m1,t1,"",k)
		if agho1 ~= "" then
			teksto = teksto .. '<span class="noprint"> (' .. agho1 .. "‑jara)</span>"
		end
	end

	return teksto
end

function p._mortodato (t,m,j,a)
	local teksto = ""
	a = mw.ustring.lower(a)
	if a == "yes" or a == "jes" or a == "" then
		teksto = p._daton(t,m,j)
	else
		teksto = p._dato(t,m,j)
	end
	if teksto ~= "" then
		teksto = "la " .. teksto
	end
	return teksto
end


-- funkcioj por #invoke kaj ŝablonoj

function p.dato(frame)
	local args = frame.args
	local pargs = frame:getParent().args

	local arg1 = args[1] or pargs[1] or ""
	local arg2 = args[2] or pargs[2] or ""
	local arg3 = args[3] or pargs[3] or ""
	local ar = args["ar"] or pargs["ar"] or ""
	local ligilo = args["ligilo"] or pargs["ligilo"] or ""	

	return p._dato(arg1, arg2, arg3, ar, ligilo)
end

function p.daton(frame)
	local args = frame.args
	local pargs = frame:getParent().args

	local arg1 = args[1] or pargs[1] or "" -- tago
	local arg2 = args[2] or pargs[2] or "" -- monato
	local arg3 = args[3] or pargs[3] or "" -- jaro
	local ar = args["ar"] or pargs["ar"] or ""
	local ligilo = args["ligilo"] or pargs["ligilo"] or ""		

	return p._daton(arg1, arg2, arg3, ar, ligilo)
end

function p.naskdato(frame)
	local args = frame.args
	local pargs = frame:getParent().args

	local j = args[1] or args["jaro"] or pargs[1] or pargs["jaro"] or "" -- tago
	local m = args[2] or args["monato"] or pargs[2]  or pargs["monato"] or "" -- monato
	local t = args[3] or args["tago"] or pargs[3] or pargs["tago"] or "" -- jaro
	local a = args["akuzativo"] or pargs["akuzativo"] or ""
	-- elvoko de la funkcio p._naskdato(), sed kun inversa sekvo de la la tri parametroj por la dato
	return p._naskdato(t,m,j,a)
end

function p.naskdatoagho(frame)
	local args = frame.args
	local pargs = frame:getParent().args

	local j = args[1] or args["jaro"] or pargs[1] or pargs["jaro"] or "" -- tago
	local m = args[2] or args["monato"] or pargs[2]  or pargs["monato"] or "" -- monato
	local t = args[3] or args["tago"] or pargs[3] or pargs["tago"] or "" -- jaro
	local a = args["akuzativo"] or pargs["akuzativo"] or ""
	local k = args["centjarulo"] or pargs["centjarulo"] or ""
	-- elvoko de la funkcio p._naskdatoagho(), sed kun inversa sekvo de la la tri parametroj por la dato
	return p._naskdatoagho(t,m,j,a,k)
end

function p.agho(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	-- naskiĝdato
	local j1 = args[1] or args["jaro1"] or pargs[1] or pargs["jaro1"] or "" -- tago1
	local m1 = args[2] or args["monato1"] or pargs[2]  or pargs["monato1"] or "" -- monato1
	local t1 = args[3] or args["tago1"] or pargs[3] or pargs["tago1"] or "" -- jaro1
	-- mortodato aŭ aktuala dato
	local j2 = args[4] or args["jaro2"] or pargs[4] or pargs["jaro2"] or "" -- tago2
	local m2 = args[5] or args["monato2"] or pargs[5]  or pargs["monato2"] or "" -- monato2
	local t2 = args[6] or args["tago2"] or pargs[6] or pargs["tago2"] or "" -- jaro2

	local a = args["akuzativo"] or pargs["akuzativo"] or ""
	local jara = args["jara"] or pargs["jara"] or ""
	local ordigo = args["ordigo"] or pargs["ordigo"] or ""
	local k = args["centjarulo"] or pargs["centjarulo"] or ""
	-- elvoko de la funkcio p._naskdatoagho(), sed kun inversa sekvo de la la tri parametroj por la dato
	return p._agho(t1,m1,j1,t2,m2,j2,a,jara,ordigo,k)
end

function p.mortodatoagho(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	-- naskiĝdato
	local j1 = args[1] or args["jaro1"] or pargs[1] or pargs["jaro1"] or "" -- tago1
	local m1 = args[2] or args["monato1"] or pargs[2]  or pargs["monato1"] or "" -- monato1
	local t1 = args[3] or args["tago1"] or pargs[3] or pargs["tago1"] or "" -- jaro1
	-- mortodato aŭ aktuala dato
	local j2 = args[4] or args["jaro2"] or pargs[4] or pargs["jaro2"] or "" -- tago2
	local m2 = args[5] or args["monato2"] or pargs[5]  or pargs["monato2"] or "" -- monato2
	local t2 = args[6] or args["tago2"] or pargs[6] or pargs["tago2"] or "" -- jaro2

	local a = args["akuzativo"] or pargs["akuzativo"] or ""
	local k = args["centjarulo"] or pargs["centjarulo"] or ""	
	-- elvoko de la funkcio p._naskdatoagho(), sed kun inversa sekvo de la la tri parametroj por la dato
	return p._mortodatoagho(t1,m1,j1,t2,m2,j2,a,k)
end

function p.mortodato(frame)
	local args = frame.args
	local pargs = frame:getParent().args

	local j = args[1] or args["jaro"] or pargs[1] or pargs["jaro"] or "" -- tago
	local m = args[2] or args["monato"] or pargs[2]  or pargs["monato"] or "" -- monato
	local t = args[3] or args["tago"] or pargs[3] or pargs["tago"] or "" -- jaro
	local a = args["akuzativo"] or pargs["akuzativo"] or ""
	-- elvoko de la funkcio p._naskdato(), sed kun inversa sekvo de la la tri parametroj por la dato
	return p._mortodato(t,m,j,a)
end

return p