Aller au contenu

Module:Climat/Bac à sable

Une page de Wikipédia, l'encyclopédie libre.

 Documentation[voir] [modifier] [historique] [purger]

Utilisation

[modifier le code]

Ce module est conçu pour une utilisation à travers le modèle Modèle:Climat. Il fournit une fonction permettant la génération d'un tableau mettant en forme les relevés météorologiques d'une ville.

Ce module utilise la feuille de styles TemplateStyles Module:Climat/styles.css.

Fonctions exportables

[modifier le code]
  • main(frame) – Prend en argument un frame contenant des paramètres associés à des données météorologiques et retourne un tableau mettant en forme ces données.

Modules externes et autres éléments dont ce module a besoin pour fonctionner

[modifier le code]
  • mw.getLanguage – Crée un objet Language associé à une langue, pour ensuite appliquer des méthodes à cet objet afin d'appliquer les formatages de texte propres à cette langue ;
  • mw.ustring.gsub – Remplace toutes les occurrences d'un motif dans une chaîne de caractères par une chaîne de remplacement ;
  • mw.clone – Crée une copie de la valeur pour pouvoir l'exploiter sans la modifier ;
  • mw.text.split – Découpe une chaine de caractères en sous-chaines et retourne le résultat sous la forme d'un tableau.

Modules lua utilisant ce module

[modifier le code]

Aucun

Modèles appelant directement ce module

[modifier le code]

Dans Modèle:Climat, ce module est appelé par le code suivant :

{{#invoke:Climat|main}}
local p = {}

local lang = mw.getLanguage("fr")
local lang_en = mw.getLanguage("en")

local has_periode

local options = {
	"tmin-bas-ann",
	"tmin-ann",
	"tmin-haut-ann",
	"tmoy-ann",
	"tmax-bas-ann",
	"tmax-ann",
	"tmax-haut-ann",
	"tmin-record-ann",
	"tmin-record-haut-ann",
	"tmax-record-bas-ann",
	"tmax-record-ann",
	"tmin--10-ann",
	"tmin--5-ann",
	"gel-jour-ann",
	"tmax--0-ann",
	"tmax-+25-ann",
	"tmax-+30-ann",
	"tmax-+35-ann",
	"soleil-ann",
	"soleil-min-ann",
	"soleil-max-ann",
	"soleil-record-ann",
	"soleil-0-ann",
	"soleil-+1-ann",
	"soleil-+5-ann",
	"ray-ann",
	"etp-ann",
	"humidité-ann",
	"prec-ann",
	"pluie-ann",
	"neige-ann",
	"pluie-record-ann",
	"neige-record-ann",
	"prec-bas-ann",
	"prec-haut-ann",
	"prec-nbr-bas-ann",
	"prec-nbr-ann",
	"prec-nbr-haut-ann",
	"pluie-jour+1mm-ann",
	"pluie-jour+5mm-ann",
	"pluie-jour+10mm-ann",
	"pluie-an-détail-ann",
	"orage-jour-ann",
	"grêle-jour-ann",
	"neige-jour-ann",
	"brouillard-jour-ann",
	"vent-10-ann",
	"vent-record-ann",
	"vent-nbr-+16-ann",
	"vent-nbr-+28-ann",
	"dju-ann",
	"dju-rad-ann",
	"dju-clim-ann",
	"press-bas-ann",
	"press-ann",
	"press-haut-ann"
}

-- les mois tel que nommes en parametres
local mois = {
	"jan",
	"fev",
	"mar",
	"avr",
	"mai",
	"jui",
	"jul",
	"aou",
	"sep",
	"oct",
	"nov",
	"dec"
}

local types_record = {
	["tmin-bas"]="année",
	["tmin-haut"]="année",
	["tmax-bas"]="année",
	["tmax-haut"]="année",
	["tmin-record"]="date",
	["tmin-record-haut"]="date",
	["tmax-record-bas"]="date",
	["tmax-record"]="date",
	["soleil-record"]="date",
	["soleil-min"]="année",
	["soleil-max"]="année",
	["pluie-record"]="date",
	["neige-record"]="date",
	["prec-bas"]="année",
	["prec-haut"]="année",
	["prec-nbr-bas"]="année",
	["prec-nbr-haut"]="année",
	["vent-record"]="date",
	["press-bas"]="date",
	["press-haut"]="date",
	["vent-10"]="date"
}

-- parse un nombre formaté en anglais tel qu'attendu par les parser functions
-- pour compenser la différence de traitement entre mediawiki et lua
function parseFormattedNumber(p)
	-- pas un moins normal (remplacé par les parser functions)
	if type(p) == 'string' then
		p = mw.ustring.gsub(p,"[−–˗‒]","-")
	end
	--les espaces sont supprimés par le tokenizer des parser function
	p=string.gsub(p," ", "")
	return lang_en:parseFormattedNumber(p)
end

local function formatNum( p )
	local result = lang:formatNum( p )
	return ( result:gsub( "^-", "−" ) )
end

-- tableau pour stocker les infos de debug
local d = {}

-- pour debugage (afficher dans un <pre> les variables de debug)
local function htmlescape(s)
	local escapes = {
		["<"] = "&lt;",
		[">"] = "&gt;",
		['"'] = "&quot;"
	}
	
	s=string.gsub(s,"&","&amp;")
	for k,v in pairs(escapes) do
		s = string.gsub(s,k,v)
	end
	return s
end

-- retourne true si au moins une option est dans les clefs de l'arg
local function any_options_in_args(args,options)
	for k,v in ipairs(options) do
		if args[v] ~= nil and args[v] ~= "" then
			return true
		end
	end
	return false
end

-- similaire à la méthode endswith de python
local function endswith(String,End)
	return End=='' or string.sub(String,-string.len(End))==End
end
-- similaire à la méthode sartsswith de python
function startswith(String,start)
	return string.sub(String,1,string.len(start))==start
end

-- fonction renvoyant la background color pour une valeur d'ensoleillement donné

local function background_color_soleil(soleil)
	if soleil > 220 then
		return "#FF8000 "
	end
	if soleil > 160 then
		return "#FFC040"
	end
	if soleil > 100 then
		return "#FFFF80"
	end
	if soleil > 39 then
		return "#FFFFC0"
	end
	return "#FFFFFF"
end

-- fonction renvoyant la background color pour une valeur de temperature donné
local function background_color_temperature(temperature)
	if temperature < -27.4 then
		return "#6478FF"
	end
	if temperature < -19.9 then
		return "#8CA0FF"
	end
	if temperature < -12.4 then
		return "#B4C8FF"
	end
	if temperature < -4.8 then
		return "#DCF0FF"
	end
	if temperature > 47.9 then
		return "#AD0200"
	end
	if temperature > 39.9 then
		return "#E23800"
	end
	if temperature > 27.4 then
		return "#FF8000"
	end
	if temperature > 19.9 then
		return "#FFC040"
	end
	if temperature > 12.4 then
		return "#FFFF80"
	end
	if temperature > 4.9 then
		return "#FFFFC0"
	end
	return "#FFFFFF"
end

-- fonction renvoyant la background color pour une valeur d'humidité donné
local function background_color_humidite(humidite)
	if humidite > 79 then
		return "#6478FF"
	end
	if humidite > 69 then
		return "#8CA0FF"
	end
	if humidite > 59 then
		return "#B4C8FF"
	end
	if humidite > 49 then
		return "#DCF0FF"
	end
	return "#FFFFFF"
end
-- fonction renvoyant la background color pour une valeur de précipitation donné
function background_color_precipitation(humidite)
	if humidite > 199 then
		return "#6478FF"
	end
	if humidite > 149 then
		return "#8CA0FF"
	end
	if humidite > 99 then
		return "#B4C8FF"
	end
	if humidite > 49 then
		return "#DCF0FF"
	end
	return "#FFFFFF"
end

-- fonction renvoyant la background color pour une valeur de neige donné
function background_color_neige (humidite)
	if humidite > 99 then
		return "#6478FF"
	end
	if humidite > 74 then
		return "#8CA0FF"
	end
	if humidite > 49 then
		return "#B4C8FF"
	end
	if humidite > 24 then
		return "#DCF0FF"
	end
	return "#FFFFFF"
end

local lignes_tableau = {
	{
		param='tmin',
		libelle='Température minimale moyenne ([[Degré Celsius|°C]])', 
		libelle_abrege='<abbr title="Température minimale moyenne (°C)">T. min. moy.</abbr>',
		style=background_color_temperature
	},
	{
		param='tmin-bas',
		libelle='Température minimale moyenne la plus basse (°C)',
		libelle_abrege='<abbr title="Température minimale moyenne la plus basse (°C)">T. min. moy. b.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmin-haut',
		libelle='Température minimale moyenne la plus haute (°C)',
		libelle_abrege='<abbr title="Température minimale moyenne la plus haute  (°C)">T. min. moy. h.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmoy',
		libelle='Température moyenne (°C)',
		libelle_abrege='<abbr title="Température moyenne">T. moy.</abbr> <small>([[Degré Celsius|°C]])</small>',
		style=background_color_temperature
	},
	{
		param='tmax',
		libelle='Température maximale moyenne (°C)',
		libelle_abrege='<abbr title="Température maximale moyenne  (°C)">T. max. moy.</abbr>',
		style=background_color_temperature
	},
	{
		param='tmax-bas',
		libelle='Température maximale moyenne la plus basse (°C)',
		libelle_abrege='<abbr title="Température maximale moyenne la plus basse  (°C)">T. max. moy. b.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmax-haut',
		libelle='Température maximale moyenne la plus haute (°C)',
		libelle_abrege='<abbr title="Température maximale moyenne la plus haute  (°C)">T. max. moy. h.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmin-record',
		libelle='Record de froid (°C)',
		libelle_abrege='<abbr title="Record de froid  (°C)">Rec. de fr.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmax-record-bas',
		libelle='Température maximale la plus basse (°C)',
		libelle_abrege='<abbr title="Température maximale la plus basse (°C)">T. max. b.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmin-record-haut',
		libelle='Température minimale la plus haute (°C)',
		libelle_abrege='<abbr title="Température minimale la plus haute (°C)">T. min. h.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmax-record',
		libelle='Record de chaleur (°C)',
		libelle_abrege='<abbr title="Record de chaleur (°C)">Rec. de ch.</abbr>',
		record=true,
		style=background_color_temperature
	},
	{
		param='tmin--10',
		libelle='Nombre de jours avec température minimale ≤ −10 °C',
		libelle_abrege='<abbr title="Nombre de jours avec température minimale">J. avec T. min.</abbr> ≤ −10 °C'
	},
	{
		param='tmin--5',
		libelle='Nombre de jours avec température minimale ≤ –5 °C',
		libelle_abrege='<abbr title="Nombre de jours avec température minimale">J. avec T. min.</abbr> ≤ −5 °C'
	},
	{
		param='gel-jour',
		libelle='Nombre de jours avec gel',
		libelle_abrege='<abbr title="Nombre de jours">J.</abbr> avec gel'
	},
	{
		param='tmax--0',
		libelle='Nombre de jours avec température maximale ≤ 0 °C',
		libelle_abrege='<abbr title="Nombre de jours avec température maximale">J. avec T. max.</abbr> ≤ 0 °C'
	},
	{
		param='tmax-+25',
		libelle='Nombre de jours avec température maximale ≥ 25 °C',
		libelle_abrege='<abbr title="Nombre de jours avec température maximale">J. avec T. max.</abbr> ≥ 25 °C'
	},
	{
		param='tmax-+30',
		libelle='Nombre de jours avec température maximale ≥ 30 °C',
		libelle_abrege='<abbr title="Nombre de jours avec température maximale">J. avec T. max.</abbr> ≥ 30 °C'
	},
	{
		param='tmax-+35',
		libelle='Nombre de jours avec température maximale ≥ 35 °C',
		libelle_abrege='<abbr title="Nombre de jours avec température maximale">J. avec T. max.</abbr> ≥ 35 °C'
	},
	{
		param='dju',
		libelle='[[Degré jour unifié|Degrés jour unifiés]]',
		libelle_abrege='[[Degré jour unifié|DJU]]'
	},
	{
		param='dju-clim',
		libelle='Degrés jour unifiés en climatisation',
		libelle_abrege='<abbr title="Degrés jour unifiés en climatisation">DJU en clim.</abbr>'
	},
	{
		param='dju-rad',
		libelle='Degrés jour unifiés en chauffage',
		libelle_abrege='<abbr title="Degrés jour unifiés en chauffage">DJU en ch.</abbr>'
	},
	{
		param='soleil',
		libelle='Ensoleillement ([[Heure|h]])',
		libelle_abrege='<abbr title="Ensoleillement">Ensol.</abbr> <small>([[Heure|h]])</small>',
		background_color_soleil
	},
	{
		param='soleil-min',
		libelle='Ensoleillement le plus bas (h)',
		libelle_abrege='<abbr title="Ensoleillement le plus bas">Ens. le plus b.</abbr> <small>(h)</small>',
		record=true
	},
	{
		param='soleil-max',
		libelle='Ensoleillement le plus élevé (h)',
		libelle_abrege='<abbr title="Ensoleillement le plus élevé">Ens. le plus h.</abbr> <small>(h)</small>',
		record=true
	},
	{
		param='soleil-record',
		libelle='Record d\'ensoleillement en 24 h (h)',
		libelle_abrege='<abbr title="Record d\'ensoleillement">Rec. d\'ens.</abbr> en 24 h <small>(h)</small>',
		record=true
	},
	{
		param='soleil-0',
		libelle='Nombre de jours sans ensoleillement',
		libelle_abrege='<abbr title="Nombre de jours sans ensoleillement">J. sans ens.</abbr>'
	},
	{
		param='soleil-+1',
		libelle='Nombre de jours avec ensoleillement ≥ 1 h',
		libelle_abrege='<abbr title="Nombre de jours avec ensoleillement">J. avec ens.</abbr> ≥ 1 h'
	},
	{
		param='soleil-+5',
		libelle='Nombre de jours avec ensoleillement ≥ 5 h',
		libelle_abrege='<abbr title="Nombre de jours avec ensoleillement">J. avec ens.</abbr> ≥ 5 h'
	},
	{
		param='ray',
		libelle='[[Ensoleillement]] ([[Joule|MJ]]/[[Mètre carré|m²]])',
		libelle_abrege='<abbr title="Ensoleillement">Ensol.</abbr> <small>([[Joule|MJ]]/[[Mètre carré|m²]])</small>'
	},
	{
		param='etp',
		libelle='[[Évapotranspiration#Évapotranspiration réelle (ETr) et potentielle (ETp)|ETp]] [[Évapotranspiration#Modélisation de Penman et Monteith|Penman]] (mm)',
		libelle_abrege='[[Évapotranspiration#Évapotranspiration réelle (ETr) et potentielle (ETp)|ETp]] [[Évapotranspiration#Modélisation de Penman et Monteith|Penman]] <small>(mm)</small>'
	},
	{
		param='vent-10',
		libelle='Record de vent sur 10 minutes (km/h)',
		libelle_abrege='<abbr title="Record de vent">Rec. de v.</abbr> sur 10 <abbr title="minutes">min.</abbr>  <small>(km/h)</small>',
		record=true
	},
	{
		param='vent-record',
		libelle='Record de vent (km/h)',
		libelle_abrege='<abbr title="Record de vent">Rec. de v.</abbr> <small>(km/h)</small>',
		record=true
	},
	{
		param='vent-nbr-+16',
		libelle='Nombre de jours avec rafales ≥ 57,6 km/h',
		libelle_abrege='<abbr title="Nombre de jours avec rafales">J. avec rafales</abbr> ≥ 57,6 km/h'
	},
	{
		param='vent-nbr-+28',
		libelle='Nombre de jours avec rafales ≥ 100,8 km/h',
		libelle_abrege='<abbr title="Nombre de jours avec rafales">J. avec rafales</abbr> ≥ 100,8 km/h'
	},
	{
		param='press',
		libelle='Pression atmosphérique au niveau de la mer ([[Pascal (unité)|hPa]])',
		libelle_abrege='<abbr title="Pression atmosphérique au niveau de la mer">P. atm. au niv. de la mer</abbr> <small>([[Pascal (unité)|hPa]])</small>'
	},
	{
		param='press-bas',
		libelle='Record de la pression la plus basse (hPa)',
		libelle_abrege='<abbr title="Record de pression">Rec. de P.</abbr> la plus basse <small>(hPa)</small>',
		record=true
	},
	{
		param='press-haut',
		libelle='Record de la pression la plus haute (hPa)',
		libelle_abrege='<abbr title="Record de pression">Rec. de P.</abbr> la plus haute <small>(hPa)</small>',
		record=true
	},
	{
		param='prec',
		libelle='Précipitations ([[Millimètre|mm]])',
		libelle_abrege='<abbr title="Précipitations">Préc.</abbr> <small>([[Millimètre|mm]])</small>',
		style=background_color_precipitation
	},
	{
		param='pluie',
		libelle='<small>dont pluie ([[Millimètre|mm]])</small>',
		libelle_abrege='<small>dont pluie ([[Millimètre|mm]])</small>',
		padding_left=true
	},
	{
		param='neige',
		libelle='<small>dont neige ([[Centimètre|cm]])</small>',
		libelle_abrege='<small>dont neige ([[Centimètre|cm]])</small>',
		style=background_color_neige,
		padding_left=true
	},
	{
		param='prec-bas',
		libelle='Précipitations les plus basses (mm)',
		libelle_abrege='<abbr title="Précipitations les plus basses">Préc. min.</abbr> <small>(mm)</small>',
		record=true
	},
	{
		param='prec-haut',
		libelle='Précipitations les plus hautes (mm)',
		libelle_abrege='<abbr title="Précipitations les plus hautes">Préc. max.</abbr> <small>(mm)</small>',
		record=true
	},
	{
		param='pluie-record',
		libelle='Record de pluie en 24 h (mm)',
		libelle_abrege='<abbr title="Record de pluie  en 24 h">Rec. de pl.</abbr> <small>(mm)</small>',
		record=true
	},
	{
		param='neige-record',
		libelle='Record de neige en 24 h (cm)',
		libelle_abrege='<abbr title="Record de neige en 24 h">Rec. de n.</abbr> <small>(mm)</small>',
		record=true
	},
	{
		param='pluie-jour',
		libelle='Nombre de jours avec précipitations',
		libelle_abrege='<abbr title="Nombre de jours avec précipitations">J. avec préc.</abbr>'
	},
	{
		param='prec-nbr-bas',
		libelle='Le moins de jours avec précipitations',
		libelle_abrege='<abbr title="Le moins de jours avec précipitations">J. avec préc. min.</abbr>',
		record=true
	},
	{
		param='prec-nbr-haut',
		libelle='Le plus de jours avec précipitations',
		libelle_abrege='<abbr title="Le plus de jours avec précipitations">J. avec préc. max.</abbr>',
		record=true
	},
	{
		param='pluie-jour+1mm',
		libelle='<small>dont nombre de jours avec précipitations ≥ 1 mm</small>',
		libelle_abrege='<small>dont J. avec pr. ≥ 1 mm</small>'
	},
	{
		param='pluie-jour+5mm',
		libelle='<small>dont nombre de jours avec précipitations ≥ 5 mm</small>',
		libelle_abrege='<small>dont J. avec pr. ≥ 5 mm</small>'
	},
	{
		param='pluie-jour+10mm',
		libelle='<small>dont nombre de jours avec précipitations ≥ 10 mm</small>',
		libelle_abrege='<small>dont J. avec pr. ≥ 10 mm</small>'
	},
	{
		param='pluie-an-détail',
		libelle='Pluviométrie du mois d\'une année (mm)',
		libelle_abrege='<abbr title="Pluviométrie du mois d\'une année">Pluv. du mois d\'1 an</abbr> <small>(mm)</small>'
	},
	{
		param='humidité',
		libelle='Humidité relative (%)',
		libelle_abrege='<abbr title="Humidité relative">Hum. rel.</abbr> <small>(%)</small>',
		style=background_color_humidite
	},
	{
		param='neige-jour',
		libelle='Nombre de jours avec neige',
		libelle_abrege='<abbr title="Nombre de jours avec neige">J. avec n.</abbr>'
	},
	{
		param='grêle-jour',
		libelle='Nombre de jours avec grêle',
		libelle_abrege='<abbr title="Nombre de jours avec grêle">J.</abbr> avec g.'
	},
	{
		param='orage-jour',
		libelle='Nombre de jours d\'orage',
		libelle_abrege='<abbr title="Nombre de jours d\'orage">J. d\'or.</abbr>'
	},
	{
		param='brouillard-jour',
		libelle='Nombre de jours avec brouillard',
		libelle_abrege='<abbr title="Nombre de jours avec brouillard">J. avec br.</abbr>'
	},
}

-- fonction principale
-- appelée par le modèle

function p.main(frame)
	
	local pframe = frame:getParent() -- on recupère le parent (le modèle)
	local args = pframe.args

-- séparation des args par période
-- sauf les common_keys sont considérés comme dans la période par défaut les arguments ne començant pas par période
	local common_keys = {
		["titre"]=true,
		["Charte"]=true,
		["source"]=true,
	}
	local common_args = {}
	local periodes = {}
	local non_periode_args = {}
	for k,value in pairs(args) do
		if common_keys[k] ~= nil then
			common_args[k] = value
		elseif startswith(k,"période") then
			local key = mw.text.split(k,"-")
			local periode = table.remove(key,1)
			periode=tonumber(string.sub(periode,string.len("période")+1))
			if periode ~= nil then
				local v = periodes[periode]
				if v == nil then
					v = {}
					periodes[periode] = v
				end
				v[table.concat(key,"-")] = value
			end
		else
			local v = periodes[0]
			if v == nil then
				v = {}
				periodes[0] = v
			end
			v[k] = value
		end
	end

	-- tri des periodes
	a = {}
	for n in pairs(periodes) do
		table.insert(a, n)
	end
	table.sort(a)
	local new_periodes = {}
	for i,n in ipairs(a) do
		table.insert(new_periodes,periodes[n])
	end
	periodes = new_periodes
	
	-- global
	-- calcule si periode doit être affiché
	has_periode = #periodes>1
	
	-- On detecte si on doit afficher la colonne annee
	local annuel_present = false
	for i, args in ipairs(periodes) do
		local an = 1
		while true do
			local annee = args ["annee"..tostring(an)] or ""
			if annee == "" then
				break
			end
			options.insert("pluie-an"..an.."-ann")
			an = an + 1
		end
		
		if any_options_in_args(args, options) then
			annuel_present = true
		end
	end
	for i,args in ipairs(periodes) do
		local an = 1
		while true do
			local annee = args["année"..tostring(an)] or ""
			if annee == "" then
				break
			end
			table.insert(lignes_tableau, {
				param="pluie-an"..tostring(an),
				libelle="Relevé pluviométrique en "..annee.." ([[Millimètre|mm]])",
				libelle_abrege='<abbr title="Relevé pluviométrique">Rel. pluv.</abbr> en '..annee..' ([[Millimètre|mm]])',
				style=background_color_precipitation,
				extra_arg="annee"..tostring(an)})
			an=an+1
		end
	end
	

	local result = {}
	local r = {}
	table.insert(result,'<table class="wikitable sortable centre climat">\n' )
	
	titre = args["titre"] or ""
	if titre ~= nil then
		table.insert(result,"<caption>" .. titre .. "</caption>\n")
	end
	table.insert(result,"<tr>")
	charte = args["Charte"] or ""
	if charte ~= "" then
		local chartes = require ("Module:Chartes").charte_m
		charte = '#' .. chartes('geographie', 'secondaire', charte)
	end
	if has_periode then
		table.insert(result,"<th scope=col ")
		if charte ~= "" then
			table.insert(result,' style="background-color:' .. charte..'"')
		end
		table.insert(result,">Période")
		
		table.insert(result,"</th>\n")
	end
	
	table.insert(result,"<th scope=col ")
	if charte ~= "" then
		table.insert(result,' style="background-color:' .. charte..'"')
	end
	if not has_periode then
		table.insert(result,' class="unsortable"')
	end
	table.insert(result,">Mois")
	
	table.insert(result,"</th>\n")
	
	-- écrit dans result les headers correspondant aux mois
	local mois_headers = { "janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre", "année" }
	local abbr = { "jan.","fév.","","","","","jui.","","sep.","oct.","nov.","déc.",""}

	for i =1, annuel_present and 13 or 12 do
		table.insert(result, '<th scope=col class="unsortable"')
		if charte ~= "" then
			table.insert( result,' style="background-color:' .. charte .. '"')
		end
		table.insert(result,">")
		if abbr[i] == "" then
			table.insert(result, mois_headers[i])
		else
			table.insert(result, '<abbr title="' .. mois_headers[i] .. '">' .. abbr[i] .. '</abbr>')
		end
		table.insert(result,"</th>\n")
	end
	
	table.insert(result,'</tr>')
	-- Ajout des lignes dans le tableau
	for i,args in ipairs(periodes) do
		nb_row =0
		
		for j, ligne in ipairs(lignes_tableau) do
			local params = {}
			local libelle = ligne["libelle"]
			
			for k,v in ipairs(mois) do
				table.insert(params, ligne["param"] .. "-" .. v)
			end
			if ligne["extra_arg"] ~= nil then
				table.insert(params,ligne["extra_arg"])
			end
			if not any_options_in_args(args, params) then
				return
			end
			abrege = args["abrégé"] and args["abrégé"] ~= "non" and args["abrégé"] ~= ""
			if abrege then
				libelle = ligne["libelle_abrege"]
			end
			
			local annee_record = false
			if ligne["record"] then
				local params_date = {}
				for k,v in ipairs(mois) do
					table.insert(params_date, ligne["param"] .. "-date-" .. v)
				end
				annee_record = any_options_in_args(args, params_date)
				if annee_record then-- retourne le type de record pour le paramètre donné
					local type_record = types_record[ligne["param"]] or "année"
					libelle = libelle .. "<br><small>".. type_record
					if not abrege then
						libelle = libelle .. " du record"
					end
					libelle = libelle .. "</small>"
				end
			end
			table.insert(result,'<tr>\n')
			if nb_row == 0 and has_periode then
				local p_libelle_periode = args["libellé-période"] or ""
				
				table.insert(result, '<th scope=row rowspan="')
				
				-- place_holder= global variable qui contient l'élément remplacé lorsqu'on aura fini d'afficher toutes les lines
				
				table.insert(result, "place_holder")
				place_holder = #result
				table.insert(result,'" style="')
				if charte ~= "" then
					table.insert(result, 'background-color:' .. charte.. ';' )
				end
				table.insert(result,' text-align:left;')
				
				table.insert(result,'">')
				table.insert(result, p_libelle_periode)
				table.insert(result, '</th>\n')
			end
			nb_row = nb_row + 1
			table.insert(result, '<th scope=row style="')
			if charte ~= "" then
				table.insert(result, 'background-color:' .. charte.. ';' )
			end
			table.insert(result,' text-align:left;')
			if ligne["padding_left"] then
				table.insert(result,"padding-left:10px;")
			end
			table.insert(result,'">')
			table.insert(result, libelle)
			table.insert(result, '</th>\n')
			for k,v in ipairs(mois) do
				local p = args[ligne["param"] .. "-" .. v] or ""
				local p_annee = args[ligne["param"] .. "-date-" .. v] or ""
				
				if p == "" then
					table.insert(result, "<td></td>\n")
				else
					local parsed = parseFormattedNumber( p )
					if parsed == nil then
						table.insert(result, "<td style='color:red;'>erreur "..ligne["param"].."-"..v.." n'est pas un nombre (".. p ..")".."</td>\n")
					else
						table.insert(result, "<td ")
						
						if ligne["style"]~= nil  then
							s = ligne["style"]( parsed )
							if s == "#AD0200" then
								color = ";color:white"
							else
								color = ""
							end
							table.insert(result,'style="background-color:'..ligne["style"]( parsed )..color..'"')
						end
						table.insert(result,">".. formatNum( parsed ))
						if annee_record then
							table.insert(result,'<br><small>'..p_annee..'</small>')
						end
						table.insert(result,"</td>\n")
					end
				end
			end
			local p = args[ligne["param"] .. "-ann"] or ""
			if p ~= "" then
				local parsed = parseFormattedNumber( p )
				if parsed == nil then
					table.insert(result, "<td style='color:red;'>erreur "..ligne["param"].."-ann n'est pas un nombre (".. p ..")".."</td>\n")
				else
					table.insert(result, "<td>'''".. formatNum( parsed ).."'''")
					if annee_record then
						local p_ann = args[ligne["param"] .. "-date-ann"] or ""
						if p_ann ~= "" then
							table.insert(result,'<br><small>'..p_ann..'</small>')
						end
					end
					table.insert(result,"</td>\n")
				end
			end
			table.insert(result,'</tr>\n')
		end
		
		if nb_row > 0 and has_periode then
			result[place_holder] = tostring(nb_row)
		end
	end
	source = args["source"] or ""
	table.insert(result,"</table>")
	if source ~= "" then
		table.insert(result,'<div style="margin-top: -1em; text-align:center; font-size:85%">Source : '.. source..'</div>\n')
	else
		table.insert(result,'<div style="font-style:italic; margin-top: -1em; color:#FF0000; text-align:center; font-size:85%">Ce tableau est sujet à caution car [[Wikipédia:Citez vos sources|il ne cite pas ses sources]].</div>')
	end
	for i,args in ipairs(periodes) do
		local diagramme = args["diagramme"] or ""
		local libelle_periode = args["libellé-période"] or ""
		if diagramme ~= "" then
			table.insert(result,'<table style="text-align:center; margin: 1em auto; border:solid 1px silver; border-collapse: collapse;">\n')
			table.insert(result,'<tr><td colspan="12">[[Diagramme climatique]] '.. libelle_periode ..'</td></tr>\n')
			
			table.insert(result,'<tr><td><abbr title="janvier">J</abbr></td><td><abbr title="février">F</abbr></td><td><abbr title="mars">M</abbr></td><td><abbr title="avril">A</abbr></td><td><abbr title="mai">M</abbr></td><td><abbr title="juin">J</abbr></td><td><abbr title="juillet">J</abbr></td><td><abbr title="août">A</abbr></td><td><abbr title="septembre">S</abbr></td><td><abbr title="octobre">O</abbr></td><td><abbr title="novembre">N</abbr></td><td><abbr title="décembre">D</abbr></td></tr>')
			table.insert(result,'<tr>')
			
			for k,v in ipairs(mois) do
				local arg1 = args["tmin-"..v] or ""
				local arg2 = args["tmax-"..v] or ""
				local arg3 = args["prec-"..v] or ""
				if arg1 == "" then
					arg1 = 10
				else
					arg1 = parseFormattedNumber(arg1)
					if arg1 == nil then
						arg1 = 10
					end
				end
				
				if arg2 == "" then
					arg2 = 20
				else
					arg2 = parseFormattedNumber(arg2)
					if arg2 == nil then
						arg2 = 20
					end
				end
				if arg3 == "" then
					arg3 = 80
				else
					arg3 = parseFormattedNumber(arg3)
					if arg3 == nil then
						arg3 = 80
					end
					
				end
				table.insert(result,'<td>')
				
				table.insert(result,'<div style="position:relative;margin:0;height:16.5em;width:1.6em;background:white;padding:0;color:black;line-height:1.5;vertical-align:bottom;text-align:center">')
				table.insert(result,'<div style="position:absolute;margin:0;bottom:2em;left:0;height:6em;width:1.6em;overflow:hidden;border-top:1px dotted #AAA;border-bottom:1px dotted #AAA;background:none;padding:0;color:transparent">&nbsp;</div>')
				table.insert(result,'<div style="position:absolute;margin:0;bottom:2em;left:.4em;height:'..(arg3/50) ..'em;width:.8em;overflow:hidden;background:#6478FF;padding:0;color:transparent">&nbsp;</div>')
				table.insert(result,'<div style="position:absolute;margin:0;bottom:' ..( 8+arg1/5)..'em;left:.4em;height:'..((arg2-arg1)/5)..'em;width:.8em;overflow:hidden;background:black;padding:0;color:transparent">&nbsp;</div>')
				table.insert(result,'<div style="position:absolute;margin:0;bottom:' .. (7.75+arg2/5)..'em;left:0;height:1.5em;width:1.6em;background:none;padding:0;color:red"><small>'..formatNum(arg2)..'</small></div>')
				table.insert(result,'<div style="position:absolute;margin:0;bottom:'.. (6.5+arg1/5)..'em;left:0;height:1.5em;width:1.6em;background:none;padding:0;color:blue"><small>'..formatNum(arg1)..'</small></div>')
				table.insert(result,'<div style="position:absolute;margin:0;bottom:.5em;left:0;height:1.5em;width:1.6em;background:none;padding:0;color:#6478FF"><small>'..formatNum(arg3)..'</small></div>')
				table.insert(result,'</div>')
				table.insert(result,'</td>')
		
			end
			table.insert(result,[[</tr>
				<tr><td colspan=12 style="text-align:left;">Moyennes : <abbr title="Températures">• Temp.</abbr> <span style="color:red">maxi</span> et <span style="color:blue">mini</span> <abbr title="Degrés Celsius">°C</abbr> <span style="color:#6478FF">• Précipitation</span> <abbr title="Millimètres">mm</abbr></td></tr>
				</table>]])
		
		end
	end
	
	-- preprocess nécessaire pour convertir les ref
	-- ligne commentée a decommenter si besoin de debug
	return frame:extensionTag{ name = 'templatestyles', args = { src = "Module:Climat/styles.css"} } 
			.. frame:preprocess(table.concat(result))   -- .."<pre>"..htmlescape(table.concat(d)).."</pre>"
end

return p