Módulo:Fmtn

Ourige: Biquipédia, la anciclopédia lhibre.

La decumentaçon pa este módulo puode ser criada na páigina Módulo:Fmtn/doc

local p = {}

-- Padrones de custruçon coincidos, cun ua trasformaçon para que se torne
-- un padron bálido.
-- L padron nun percisa ser purfeito, pus el ye balidado cumo númaro
-- passado la trasformaçon.  Anton nun hai porblemas se el eibentualmente podir
-- porduzir númaros ambálidos.  Hai solo de tomar l cuidado para que nó
-- porduza númaros ancorretos.
-- Obs.: Ouserbar que muitos REGEXes nun son bálidos an Lua.
--       Beija la documentaçon an:
--       https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
local padrones_coincidos = {
    {   "^[%d,]*%.%d*$",     -- formato 1,123,123.123
        false,                 -- nun necessita de rebison
        {
        	{ ",", "" },           -- remobe bírgulas
        }
    },
    {   "^[%d.]*,%d*$",      -- formato 1.123.123,123 ou 1123123,123
        false,                 -- nun marcar para rebison
        {
        	{ "%.", "" },          -- remobe puntos
        	{ ",", "."},           -- sustitui bírgula por punto
        }
    },
    {	"^[%d%s]*[,.]%d*$",  -- formato 1 123 123,123 ou 1 123 123.123
        false,                 -- nun marcar para rebison
        {
        	{ "%s", "" },          -- remobe spácios
        	{ ",", "."},           -- sustitui bírgula por punto, se houbir
        }
    },
    {   "^[%d,]*,%d%d%d$",   -- formato 1,123,123
        false,                 -- nun marcar para rebison
        {
        	{ ",", "" },           -- remobe bírgulas
        }
    },
	{   "^[%d.]*%.%d%d%d$",   -- formato 1.123.123 (trés dígitos ne l radadeiro bloco)
        false,                  -- nun marcar para rebison
        {
        	{ ",", "" },            -- remobe puntos
        }
    },
    {   "^[%d,]*,%d%d%d$",   -- formato 1,123,123 (trés dígitos ne l radadeiro bloco)
        false,                 -- nun marcar para rebison
        {
        	{ ",", "" },           -- remobe bírgulas
        }
    },
	{   "^[%d%s]*%s%d%d%d$", -- formato 1 123 123 (trés dígitos ne l radadeiro bloco)
        false,                -- nun marcar para rebison
        {
        	{ "%s", "" },         -- remobe spácios
        }
    },
    {   "^[%d.]*%.%d%d$",   -- formato 1.123.12 (dous dígitos ne l radadeiro bloco)
        true,                 -- marcar para rebison
        {
        	{ ".", "" },          -- remobe puntos
        	{ "(%d%d)$", ".%1" }, -- ansere un punto antes de ls dous radadeiros dígitos
        }
    },
    {   "^[%d,]*,%d%d$",    -- formato 1,123,12 (dois dígitos no último bloco)
        true,                 -- marcar para rebison
        {
        	{ ",", "" },          -- remobe bírgulas
        	{ "(%d%d)$", ".%1" }, -- ansere un punto antes de ls dous radadeiros dígitos
        }
    },
    {   "^[%d%s]%s%d%d$",    -- formato 1 123 12 (dous dígitos ne l radadeiro bloco)
        true,                 -- marcar para rebison
        {
        	{ "%s", "" },          -- remobe spácios
        	{ "(%d%d)$", ".%1" }, -- ansere un punto antes de ls dous radadeiros dígitos
        }
    },
}

function p.fmtn(frame)
	local param1 = frame.args[1] or ""
	local param2 = frame.args[2] or ""
	local param3 = frame.args[3] or ""
	
	num1, isnumber1, needcheck1 = recoince_numaro(param1)
	num2, isnumber2, needcheck2 = recoince_numaro(param2)
	num3, isnumber3, needcheck3 = recoince_numaro(param3)
	
	isarticle = mw.title.getCurrentTitle().namespace == 0
	
	prefixo = ''
	sufixo = ''
	if isnumber1 and not isnumber2 and not isnumber3 then
		-- solamente l purmeiro númaro ye bálido
		mynum = num1
		needcheck = needcheck1
		if param2 ~= '' then sufixo = sufixo .. ' ' .. param2 end
		if param3 ~= '' then sufixo = sufixo .. ' ' .. param3 end
	elseif not isnumber1 and isnumber2 and not isnumber3 then
		-- solamente l segundo númaro ye bálido
		mynum = num2
		needcheck = needcheck2
		if param1 ~= '' then prefixo = prefixo .. param1 .. ' ' end
		if param3 ~= '' then sufixo = sufixo .. ' ' .. param3 end
	elseif not isnumber1 and not isnumber2 and isnumber3 then
		-- solamente l terceiro númaro ye bálido
		mynum = num3
		needcheck = needcheck3
		if param1 ~= '' then prefixo = prefixo .. param1 .. ' ' end
		if param2 ~= '' then prefixo = prefixo .. param2 .. ' ' end
	else
		-- ERRO: eisisten mais de dous númaros bálidos, ó nanhun ye bálido
		-- Nesse causo, faç l que yá era feito antes, tenta formatar de la forma
		-- que fur possible i retorna ls parámetros na orde que fúrun
		-- apersentados
		
		-- Eiqui usa-se l "callParserFunction" para copiar l cumportamiento que yá
		-- era persenciado antes desse módulo eisistir i eibitar qu'erros séian
		-- ampressos ne ls artigos
		res = ''
		if param1 ~= '' then
			res = res .. formatnum(param1)
		end
		if param2 ~= '' then
			if res ~= '' then res = res .. ' ' end
			res = res .. formatnum(param2)
		end
		if param3 ~= '' then
			if res ~= '' then res = res .. ' ' end
			res = res .. formatnum(param3)
		end
		if isarticle then
			res = res .. "[[Catadorie:!Páiginas cun erro d'outelizaçon de l modelo Fmtn]]"
		end
		return res
	end
	
  	res = prefixo .. formatnum(mynum) .. sufixo
  	if needcheck and isarticle then
  		res = res .. '[[Catadorie:!Páiginas cuja outelizaçon de l modelo Fmtn debe ser rebisada]]'
  	end
  	return res
end

function formatnum(num)
	frame = mw.getCurrentFrame()
	return frame:callParserFunction{ name = 'formatnum', args = { num } }
	
	-- Nun ye outelizado pus nun preserba l númaro de dígitos passado la casa decimal
	-- lang = mw.language.getContentLanguage()
	-- return lang:formatNum(mynum)
end

function recoince_numaro(num)
	if tonumber(num) then
		-- yá ye un númaro bálido, nun percisa fazer nada
		isnumber = true
		needcheck = false
	else
		isnumber = false
		needcheck = true
		-- nun ye un númaro bálido, ouserba ls padrones para ber
		-- se puode ser cumbertido nun padron bálido
		for _, rule in pairs(padrones_coincidos) do
			checkpattern = rule[1]
			if string.find(num, checkpattern) then
				newneedcheck = rule[2]
				substitutions = rule[3]
				
				newstr = num
				for _, subs in pairs(substitutions) do
					-- aplica la sustituiçon na string
					newstr = string.gsub(newstr, subs[1], subs[2])
				end
				
				if tonumber(newstr) then
					-- berifica se la trasformaçon porduziu un númaro bálido
					-- causo positibo, ancerra l loop
					num = newstr
					isnumber = true
					needcheck = newneedcheck
					break
				end
			end
		end
		-- se nanhun padron funcionou, anton debe ser ambálido
		-- deixa l código retornar l mesmo númaro passado i deixa que
		-- l chamador faga l sou trabalho
	end
	return num, isnumber, needcheck
end

return p