Belgekirina modulê[biafirîne]
--[[
  Sous-module de Module:Tableau population d'article de commune de France contenant
  diverses fonctions utilitaires (non classées dans les autres catégories)
--]]

local p = {}

-- il nous faut les constantes
p.constantes = require("Module:Population de France/Constantes")

-- fonction de dump récursif d'une table. Ne sert qu'au debug
function p.dump(t, level)
	level = level or 0
    for i,v in pairs(t) do
    	local txt = string.rep('  ', level) .. tostring(i) .. ": "
        if type(v) == 'table' then
        	mw.log(txt .. "{}")
            p.dump(v, level + 1)
        else
        	mw.log(txt .. tostring(v))
        end
    end
end

-- nettoie un paramètre : retourne nil si vide (via 'trim'), sa valeur sinon
function p.nettoie(val)
	if (val == nil) then
		return val
	end
	if (type(val) ~= "string") then
		return val
	end
	if ( mw.text.trim(val) == "") then
		return nil
	end
	return val
end


-- conserve 'dp' décimales dans 'val'
function p.round(val, dp)
	local mult = 10^(dp or 0)
	return math.floor(val * mult + 0.5) / mult
end


-- transforme une couleur de type RRGGBB en valeurs entre 0 et 1 (r, g, b)
function p.color2rgb(color)
	-- on retire d'abord l'éventuel "nowiki" : <nowiki>#</nowiki>RRGGBB ou <nowiki />#RRGGBB
	color = mw.text.unstripNoWiki(color)
	-- on retire ensuite le '#' si présent : #RRGGBB ou &#35;RRGGBB
	color = color:gsub('^#', ''):gsub('^&#35;', '')

	local r, g, b
	if (color:match('^%x%x%x%x%x%x$')) then
		r = color:sub(1, 2)
		g = color:sub(3, 4)
		b = color:sub(5, 6)
	elseif (color:match('^%x%x%x$')) then
		r = color:sub(1, 1):rep(2)
		g = color:sub(2, 2):rep(2)
		b = color:sub(3, 3):rep(2)
	else
		return nil
	end
	local vr = tonumber(r, 16)
	local vg = tonumber(g, 16)
	local vb = tonumber(b, 16)
	return p.round(vr/255, 2) .. "," .. p.round(vg/255, 2) .. "," .. p.round(vb/255, 2)
end


-- retourne un message d'erreur "pas de données" ('donnees' est le nom du modèle/module cherché)
function p.err_nodata(fonc, donnees, err, court)
	local namescape = mw.title.getCurrentTitle().namespace
	-- pas de données (ni module ni modèle) : erreur
	local cat = p.constantes.cat_usage
		if (p.constantes.cats_erreur[err] ~= nil) then
			cat = cat .. p.constantes.cats_erreur[err]
		else
			cat = cat .. p.constantes.cats_erreur[1] -- par défaut
		end
	if (court) then
		return mw.ustring.format(p.constantes.err_data_c, p.constantes.code_erreur[err]) .. cat
	else
		return mw.ustring.format(p.constantes.err_data, fonc, p.constantes.code_erreur[err], donnees) .. cat
	end
end


-- retourne la forme élisée ou pas du mot selon la présence d'une voyelle ou pas
function p.apostrophe(mot, pre)
	if (mw.ustring.find(mot, '^[aeiouyAEIOUYéèàÉÈÀÊÂêâûîÛÎëïäüÄËÏÜ]')) then
		if (pre == "de le") then
			return "de l'"
		elseif (pre == "de") then
			return "d'"
		else
			return "l'"
		end
	else
		if (pre == "de le") then
			return "de"
		else
			return pre
		end
	end
end


-- fonction qui retourne true si l'année indiquée doit être sélectionnée par rapport
--  aux règles d'affichage définies
function p.test_annee(annee, data)
	local sup1k = false
	local dep

	-- si trop peu de données (commune nouvelle) on retourne tout
	if ((data["dernier"] ~= nil) and (data[data["dernier"]-5] == nil)) then
		return true
	end

	if (data["recens-prem"] == "annuel") then
		sup1k = true
		if (data["division"] == "canton") then
			dep = 2013                         --  les cantons ayant été créés en 2015, on compte à partir de 2016, soit 2013
		else
			dep = 2006
		end
	else
		dep = data["recens-prem"]
	end
	if data["division"] == "commune" and data["recens-prem"] ~= "annuel" then    -- ces règles d'affichage ne concernent que les communes de - de 10k
		if annee == 2006 then -- on affiche toujours 2006 s'il existe
			return true
		end
		if data["recens-prem"] == 2008 and annee == 2007 then                    -- si recens-prem = 2008, afficher 2006 mais pas 2007
			return false
		end
		if data["recens-prem"] == 2009 and (annee == 2007 or annee == 2008) then -- si recens-prem = 2009, afficher 2006 mais pas 2007 ni 2008
				return false
		end
	end
	if (annee <= dep) then
		return true  -- commune de + de 10k → tous les ans avant 2006 inclus
	end

	-- on accepte toujours la dernière
	if (annee == data["dernier"]) then
		return true
	end
	-- ok pour les modulo 5 à partir du premier
	if ((annee - dep) % 5 == 0) then
		return true
	else
		return false
	end
end

-- retourne la liste des années ayant une référence, sous forme d'une liste
function p.liste_annees(data)
	local txt = ""

	if (data["minref"] ~= nil) then
		if (data["minref"] ~= data["maxref"]) then
			txt = txt .. "pour les années "
		else
			txt = txt .. "pour l'année "
		end
		local i
		for i = data["minref"],data["maxref"] do
			if ((data[i] ~= nil) and (data[i]["ref"] ~= nil)) then
				if (i > data["minref"]) then
					if (i == data["maxref"]) then
						txt = txt .. " et "
					else
						txt = txt .. ", "
					end
				end
				if (data[i]["ref"] ~= nil) then
					txt = txt .. "[" .. data[i]["ref"] .. " " .. i .. "]"
				else
					txt = txt .. i
				end
			end
		end
	end
	return txt
end

-- retourne une liste d'années ayant des références, de 5 en 5 à partir
-- de la date indiquée
function p.liste_annees_pred(data, annee)
	local resu = {}
	local nb = 0
	if (data["minref"] == nil) then
		return resu, 0
	end
	for i = data["minref"], annee-1 do
		if ((data[i] ~= nil) and (data[i]["ref"] ~= nil)) then
			table.insert(resu, 1, i)
			nb = nb + 1
		end
	end
	return resu, nb
end

-- fin du module
return p