Aller au contenu

Module:Climat

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.

 Documentation[créer] [purger]
local p = {}
local lang = mw.getLanguage("fr")
local lang_en = mw.getLanguage("en")

-- 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 = {}

-- calcule si periode doit être affiché

function calc_has_periode(periodes)
	if #periodes>1 then
		return true
	end
	if #periodes ==0 then
		return false
	end
	libelle_periode = periodes[1]["libellé-période"] or ""
	if libelle_periode ~= "" then
	end
	return false
end

-- pour debugage (afficher dans un <pre> les variables de debug)
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

-- écrit dans result les headers correespondant aux mois
function headers(result,charte)
	local mois = { "janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre" }
	local abbr = { "jan.","fév.","","","","","jui.","","sep.","oct.","nov.","déc."}
	
	for i =1,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[i])
		else
			table.insert(result, '<abbr title="' .. mois[i] .. '">' .. abbr[i] .. '</abbr>')
		end
		table.insert(result,"</th>\n")
	end
end

-- detecte si on doit afficher la colonne annee
function annuel_present(periodes)
	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" }
	for i, args in ipairs(periodes) do
		opt = mw.clone(options)
		an = 1
		while true do
			annee = args ["annee"..tostring(an)] or ""
			if annee == "" then
				break
			end
			opt.insert("pluie-an"..an.."-ann")
			an = an + 1
				
		end
		
		if any_options_in_args(args, opt) then
			return true
		end
	end
	return false
end

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

-- similaire à la méthode endswith de python
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


-- affiche une ligne dans le tableau
function row(result, args, charte, param, libelle, libelle_abrege, record, style, padding_left, extra_arg)
	local params = {}
	for k,v in ipairs(mois) do
		table.insert(params, param .. "-" .. v)
	end
	if extra_arg ~= nil then
		table.insert(params,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 = libelle_abrege
	end
	
	local annee_record = false
	if record then
		local params_date = {}
		for k,v in ipairs(mois) do
			table.insert(params_date, param .. "-date-" .. v)
		end
		annee_record = any_options_in_args(args, params_date)
		if annee_record then
			libelle = libelle .. "<br><small>".. type_record(param)
			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émént remplacée lorsque 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 padding_left then
		table.insert(result,"adding-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[param .. "-" .. v] or ""
		local p_annee = args[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 "..param.."-"..v.." n'est pas un nombre (".. p ..")".."</td>\n")
			else
				table.insert(result, "<td ")
				
				if style~= nil  then
					s = style( parsed )
					if s == "#AD0200" then
						color = ";color:white"
					else
						color = ""
					end
					table.insert(result,'style="background-color:'..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[param .. "-ann"] or ""
	if p ~= "" then
		local parsed = parseFormattedNumber( p )
		if parsed == nil then
			table.insert(result, "<td style='color:red;'>erreur "..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[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

-- retourne si au moins une option est dans les clefs de l'arg
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

-- retourne le type de record pour le paramètre donné
function type_record(param)
	local type = {
		["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"
	}
	t = type[param]
	if not t then
		return "année"
	else
		return t
	end
end

-- sépare les 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
function split_args(args)
	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 les periodes avant de les retourner
	a = {}
	for n in pairs(periodes) do
		table.insert(a, n)
	end
	table.sort(a)
	result = {}
	for i,n in ipairs(a) do
		table.insert(result,periodes[n])
		
	end
	return result,common_args
end

-- 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
	local periodes, common_args = split_args(args)

	-- global
	has_periode = calc_has_periode(periodes)
	
	local result = {}
	local r = {}
	table.insert(result,'<table class="wikitable sortable centre" style="text-align:center; background: var(--background-color-base, #fff); color:var(--color-emphasized, #000);">\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
		charte = frame:expandTemplate{ title = 'Charte de couleur', args = { 'communes', 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")
	headers(result,charte)
	if annuel_present(periodes) then
		table.insert(result,"<th scope=col class='unsortable'")
		if charte ~= "" then
			table.insert(result,' style="background-color:' .. charte..'"')
		end
		table.insert(result,'>année</th>\n')
	end
	
	table.insert(result,'</tr>')
	for i,args in ipairs(periodes) do
		affiche_rows_periode(result, args)
	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
		affiche_diagramme(result,args)
	end
	
	-- preprocess nécessaire pour convertir les ref
	-- ligne commentée a decommenter si besoin de debug
	return frame:preprocess(table.concat(result))  -- .."<pre>"..htmlescape(table.concat(d)).."</pre>"
end

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

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

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é
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é
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
return p