-- Moduli utili per il template Fonte divisi per dizionario
local p = {}
local titolo = mw.title.getCurrentTitle().subpageText

--[[ Funzione che toglie gli accenti "normalizzando" le lettere, usato nei template:
Fonte/sin-co;
Fonte/Sabco;
Fonte/dem;
Fonte/rep;
--]]

function p.senzaccenti(arg)
	if type(arg) ~= 'string' and arg.args ~= nil and arg.args[1] ~= nil then
		arg = arg.args[1]
	end
	if type(arg) ~= 'string' then
		error('Specificare un parametro di tipo stringa')
		return nil
	end
	arg = mw.ustring.gsub(arg, '[àáäãâåāăą]', 'a')
	arg = mw.ustring.gsub(arg, '[èéêëēěĕėę]', 'e')
	arg = mw.ustring.gsub(arg, '[ìíîïĩīĭį]', 'i')
	arg = mw.ustring.gsub(arg, '[òóôõöōŏőø]', 'o')
	arg = mw.ustring.gsub(arg, '[ùúûüũūŭůűų]', 'u')
	return arg
end

--[[ encode_url: 
Sostituisce le lettere accentate con l'equivalente UTF-8 (es: "%EO" per "à"). Usato da:
 Fonte/italwn
--]]
function p.encode_url(arg)
	local accenti = require('Modulo:Fonte/Accenti UTF-8')
	arg = arg.args[1]
	return accenti.accenti(arg)

end	

--[[ encode_HEXA: 
Sostituisce le lettere accentate con l'equivalente in esadecimale. Usato da:
 -
 preso da http://lua-users.org/wiki/StringRecipes
--]]
function p.encode_HEXA(arg)
	arg = arg.args[1]
	
	if arg then
      arg = arg:gsub("\n", "\r\n")
      arg = arg:gsub("([^%w %-%_%.%~])", function(c)
         return ("%%%02X"):format(string.byte(c))
      end)
      arg = arg:gsub(" ", "+")
   end
   return arg
end

--[[ Hoep: 
sostituisce il testo racchidendolo tra i caratteri" +(...)", indispensabile in caso di omonimie
 Nel caso sia scritto un parametro con una cifra, esempio "parametro2", questa funzione permette di isolare le lettere, sostituire i "_" con i "+" e cancellare i numeri. Usato nei template:
 Fonte/hoep
--]]

function p.hoepTesto(frame)
	local par1 = frame.args[1]
	local par2 = mw.ustring.gsub(par1, '%d', '') -- Cancella i numeri
	local res = titolo -- Se non ci sono lettere mostra il titolo della pagina

	if par2 ~= "" then -- Controlla se ci sono delle lettere 
		res = par2 -- Se ci sono lettere vuol dire che è stato specificato il primo parametro, quindi lo mostra
	end
	return mw.ustring.sub(res, 0, 1):upper() .. '/' .. mw.uri.encode(res, 'PATH') -- Appropriata codifica dell'indirizzo
end

function p.hoepNum(frame)
	par1 = frame.args[1]
	par3 = mw.ustring.gsub(par1, '%d', '') -- Cancella tutti i numeri
	par2 = mw.ustring.gsub(par1, '%a', '') -- Cancella tutte le lettere

	if par3 ~= "" then  --se ci sono delle lettere
		if par2 > "0" then  
			return mw.uri.encode(par3 .. ' (' .. par2 ..  ')')
		else
			return mw.uri.encode(par3)
		end
	else
		if par2 > "0" then -- se non ci sono lettere 
			return mw.uri.encode(titolo .. ' (' .. par2 ..  ')')
		else
			return mw.uri.encode(titolo)
		end
	end
end

--[[ Sabco: 
sostituisce tutte le lettere accentate con le rispettive lettere private dell'accento e sostituisce tutti gli spazi con il "_" necessario per linkare correttamente. Usato nei template:
Fonte/sin-co;
Fonte/Sabco;
--]]

function p.SabCo(frame)
	t2 = p.senzaccenti(titolo)
	t2 = mw.ustring.gsub(t2, ' ', '_') -- Sostituisce i "_" se non è specificata la pagina
	par = p.senzaccenti(frame.args[1])
	par = mw.ustring.gsub(par, ' ', '_') -- Sostituisce i "_" al primo parametro

	lett = mw.ustring.gsub(par, '%d', '') -- Cancella tutti i numeri
	num  = mw.ustring.gsub(par, '%a', '') -- Cancella tutte le lettere

	if lett ~= "" then  --se ci sono delle lettere
		if num > "0" then  
			return   lett , '_' .. num ..  ''
		else
			return  lett
		end
	else
		if num > "0" then -- se non ci sono lettere 
			return  t2 , '_' .. num ..  ''
		else
			return  t2
		end
	end
end

--[[ Dem: 
sostituisce tutte le lettere accentate con le rispettive lettere private dell'accento e sostituisce tutti gli spazi con il "-" necessario per linkare correttamente. Usato nei template:
Fonte/dem;
--]]

function p.dem(frame)
	titolo2 = p.senzaccenti(titolo)
	titolo2 = mw.ustring.gsub(titolo2, '%s', '-') -- Sostituisce gli spazi nel titolo senza accenti con i "_"
	parametro = p.senzaccenti(frame.args[1])
	parametro = mw.ustring.gsub(parametro, '%s', '-') -- Sostituisce gli spazi nel parametro arbitrario con i "_"

	lettere = mw.ustring.gsub(parametro, '%d', '') -- Cancella tutti i numeri
	numeri  = mw.ustring.gsub(parametro, '%a', '') -- Cancella tutte le lettere

	if lettere ~= "" then  --se ci sono delle lettere
		if numeri > "0" then  
			return   lettere , '_' .. numeri ..  ''
		else
			return  lettere
		end
	else
		if numeri > "0" then -- se non ci sono lettere ma numeri sì 
			return  titolo2 , '_' .. numeri ..  ''
		else
			return  titolo2
		end
	end
end

--[[ Dizit: 
sostituisce tutte le lettere accentate con le rispettive lettere private dell'accento e costruisce il link tenendo conto anche delle omonimie. Usato nei template:
Fonte/dizit;
--]]

function p.dizit(frame)
	titolo2 = p.senzaccenti(titolo)
	titolo2 = titolo2:upper()
	parametro = p.senzaccenti(frame.args[1])
	parametro = parametro:upper()

	lettere = mw.ustring.gsub(parametro, '%d', '') -- Mantiene solo le lettere
	numeri  = mw.ustring.gsub(parametro, '%a', '') -- Cancella tutte le lettere
	
	if numeri ~= '' then
		numero = numeri..'00'
	else
		numero = '100'
	end
	
	-- Se il parametro non è vuoto e ci sono lettere
	if lettere ~= '' then
		return lettere..''..numero
	else
		return titolo2..''..numero
	end
	
end

--[[ Trec: 
sostituisce tutte le lettere accentate con le rispettive lettere private dell'accento e sostituisce tutti gli spazi con il "-" necessario per linkare correttamente. Usato nei template:
Fonte/trec;
--]]
--[[

								FUNZIONE DEPRECATA DOPO AGGIORNAMENTO DEL SITO DELLA TRECCANI


function p.trec(frame)
	titolo2 = p.senzaccenti(titolo)
	titolo2 = mw.ustring.gsub(titolo2, '%s', '-') -- Sostituisce gli spazi nel titolo senza accenti con i "-"
	parametro = p.senzaccenti(frame.args[1])
	parametro = mw.ustring.gsub(parametro, '%s', '-') -- Sostituisce gli spazi nel parametro arbitrario con i "-"

	lettere = mw.ustring.gsub(parametro, '%d', '') -- Cancella tutti i numeri
	numeri  = mw.ustring.gsub(parametro, '%a', '') -- Cancella tutte le lettere

	if lettere ~= "" then  --se ci sono delle lettere
		if numeri > "0" then  
			return   lettere , numeri
		else
			return  lettere
		end
	else
		if numeri > "0" then -- se non ci sono lettere ma numeri sì 
			return  titolo2 , numeri 
		else
			return  titolo2
		end
	end
end

--]]

--[[ mdbg: 
Analizza il testo inserito e taglia l'eventuale testo "zh-tc" dal parametro inserito e poi smista il testo in base al risultato. Usato nei template:
Fonte/mdgb;
--]]

function p.mdbgTesto(frame)
    par1=frame.args[1]
    par2 = mw.ustring.gsub(par1, '([%a0-9]+)(-([a-z]+-[a-z]+))', '%1'); 
    
	if par1 ~= "" then
		if par1 == "zh-tc" then  -- Controlla se è stato specificato soltanto "zh-tc"
			return titolo -- se non è stato specificato niente restituisce il titolo della pagina
		else
			return par2 -- se è stato specificato altro lo visualizza
		end
	else
		return titolo -- se è stato specificato altro lo visualizza
	end
end
 

function p.mdbgSuff(frame)
    par1=frame.args[1]
    par2 = mw.ustring.gsub(par1, '([%a0-9]+)(-([a-z]+-[a-z]+))', '%3'); 
    
	if par1 ~= "" then
		if par2 == "zh-tc" then  -- Controlla se è stato specificato soltanto "zh-tc"
			return '1' -- se non è stato specificato niente restituisce il titolo della pagina
		else
			return '0' -- se è stato specificato altro lo visualizza
		end
	else
		return '0' -- se è stato specificato altro lo visualizza
	end
end

return p