Aller au contenu

Module:Climat/Bac à sable

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 13 février 2014 à 16:50 et modifiée en dernier par Xavier Combelle (discuter | contributions) (début suppression des icones). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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

Utilisation

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

  • 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

  • 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

Aucun

Modèles appelant directement ce module

Exemples

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")

-- parse un nombre formaté en anglais tel qu'attendu par les parser functions
-- pour compenser la difference de traitement entre mediawiki et lua
function parseFormattedNumber(p)
	-- pas un moins normal (remplacé par les parser function)
	p = string.gsub(p,"−","-")
	--les espaces sont supprimés par le tokenizer des parser function
	p=string.gsub(p," ", "")
	return lang_en:parseFormattedNumber(p)
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

-- ecrit 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.","","","","","juil.","","sept.","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",
		"tmin--0-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-+1-ann",
		"pluie-+5-ann",
		"pluie-+10-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, 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
	
	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) .." du record"
		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
			if parseFormattedNumber( p)==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(parseFormattedNumber(p))
				    if s == "#AD0200" then
				    	color = ";color:white"
				    else
				    	color = ""
				    end
					table.insert(result,'style="background-color:'..style(parseFormattedNumber(p))..color..'"')
				end
				table.insert(result,">".. lang:formatNum(parseFormattedNumber(p)))
				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
		if parseFormattedNumber(p)==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>'''".. lang:formatNum(parseFormattedNumber(p)).."'''")
			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"]="mois-année",
		["tmin-haut"]="mois-année",
		["tmax-bas"]="mois-année",
		["tmax-haut"]="mois-année",
		["tmin-record"]="jour-mois-année",
		["tmin-record-haut"]="jour-mois-année",
		["tmax-record-bas"]="jour-mois-année",
		["tmax-record"]="jour-mois-année",
		["soleil-min"]="mois-année",
		["soleil-max"]="mois-année",
		["pluie-record"]="jour-mois-année",
		["neige-record"]="jour-mois-année",
		["prec-haut"]="mois-année",
		["prec-nbr-bas"]="mois-année",
		["prec-nbr-haut"]="mois-année",
		["vent-record"]="jour-mois-année",
		["press-bas"]="jour-mois-année",
		["press-haut"]="jour-mois-année"
	}
	t = type[param]
	if not t then
		return "année"
	else
		return t
	end
end

-- separe les args par periode
-- sauf les common_keys sont considéré comme dans la période par défaut les arguments ne comencant pas par periode
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)
   --return "salut"
   
   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: #FFFFFF; color:#000000;">\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,">Élément étudié")
   
   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="font-style:italic; 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-bas',
       '<abbr title="température moyenne minimale du mois la plus basse en degré Celsius">temp. moy. min. mois record bas mois</abbr>',
       true, background_color_temperature)

   row(result, args, charte,
       'tmin',
       '<abbr title="température moyenne minimale du mois en degrés Celsius">temp. moy. min. mois</abbr>',
       false, background_color_temperature)

   row(result, args, charte,
       'tmin-haut',
       '<abbr title="température moyenne minimale du mois la plus haute en degré Celsius">temp. moy. min. mois record haut mois</abbr>',
       true, background_color_temperature)

   row(result, args, charte,
       'tmoy',
       '<abbr title="température moyenne mensuelle en degré Celsius">temp. moy. mois</abbr>',
       false, background_color_temperature)

   row(result, args, charte,
       'tmax-bas',
       '<abbr title="température moyenne maximale du mois la plus basse en degré Celsius">temp. moy. max. mois record bas mois</abbr>',
       true, background_color_temperature)

   row(result, args, charte,
       'tmax',
       '<abbr title="température moyenne maximale du mois en degré Celsius">temp.moy.max.mois</abbr>',
       false, background_color_temperature)

   row(result, args, charte,
       'tmax-haut',
       '<abbr title="température moyenne maximale du mois la plus haute en degré Celsius">temp. moy. max. mois record haut mois</abbr>',
       true, background_color_temperature)

   row(result, args, charte,
       'tmin-record',
       '<abbr title="température quotidienne minimale la plus basse du mois en degré Celsius">temp. min. jour record bas mois</abbr>',
       true, background_color_temperature)

   row(result, args, charte,
       'tmin-record-haut',
       '<abbr title="température quotidienne minimale la plus haute du mois en degré Celsius">temp. min. jour record haut mois</abbr>',
       true, background_color_temperature)

   row(result, args, charte,
       'tmax-record-bas',
       '<abbr title="température quotidienne maximale la plus basse du mois en degré Celsius">temp. max. jour record bas mois</abbr>',
       true, background_color_temperature)

   row(result, args, charte,
       'tmax-record',
       '<abbr title="température quotidienne maximale la plus haute du mois en degré Celsius">temp.max.jour record haut mois</abbr> ',
       true, background_color_temperature)

   row(result, args, charte,
       'tmin--10',
       '<abbr title="moyenne mensuelle du nombre de jours dont la température minimale est inférieure ou égale à moins dix degrés Celsius">temp. min. ≤ {{tmp|- 10|°C}} nbr moy. jour mois</abbr>',
       false, nil)

   row(result, args, charte,
       'tmin--5',
       '<abbr title="moyenne mensuelle du nombre de jours dont la température minimale est inférieure ou égale à moins cinq degrés Celsius">temp.min. ≤ {{tmp|- 5|°C}} nbr moy.jour mois</abbr> <span style="float:right">[[File:Temp min inf à moins cinq.png|51px]]</span>',
       false, nil)

   row(result, args, charte,
       'tmin--0',
       '<abbr title="moyenne mensuelle du nombre de jours dont la température minimale est inférieure ou égale à zéro degré Celsius">temp.min. ≤ {{tmp|0|°C}} nbr moy.jour mois</abbr> <span style="float:right">[[File:Temp min inf à zéro.png|44px]]</span>',
       false, nil)

   row(result, args, charte,
       'tmax--0',
       '<abbr title="moyenne mensuelle du nombre de jours dont la température maximale est inférieure ou égale à zéro degré Celsius">temp.max. ≤ {{tmp|0|°C}} nbr moy.jour mois</abbr> <span style="float:right">[[File:Temp maxi inf à zéro.png|44px]]</span>',
       false, nil)

   row(result, args, charte,
       'tmax-+25',
       '<abbr title="moyenne mensuelle du nombre de jours dont la température maximale est supérieure ou égale à vingt-cinq degrés Celsius">temp.max. ≥ {{tmp|25|°C}} nbr moy.jour mois</abbr> <span style="float:right">[[File:Temp maxi sup à 25.png|51px]]</span>',
       false, nil)

   row(result, args, charte,
       'tmax-+30',
       '<abbr title="moyenne mensuelle du nombre de jours dont la température maximale est supérieure ou égale à trente degrés Celsius">temp.max. ≥ {{tmp|30|°C}} nbr moy.jour mois</abbr> <span style="float:right">[[File:Temp maxi sup à 30.png|51px]]</span>',
       false, nil)

   row(result, args, charte,
       'tmax-+35',
       '<abbr title="moyenne mensuelle du nombre de jours dont la température maximale est supérieure ou égale à trente-cinq degrés Celsius">temp.max. ≥ {{tmp|35|°C}} nbr moy.jour mois</abbr> <span style="float:right">[[File:Temp maxi sup à 35.png|51px]]</span>',
       false, nil)

   row(result, args, charte,
       'soleil',
       '<abbr title="moyenne mensuelle de la durée d\'ensoleillement en heure">nbr heure ensoleillement mensuel</abbr> <span style="float:right">[[File:A6 soleil pour modèle climat.png|28px]]</span>',
       false, background_color_soleil)

   row(result, args, charte,
       'soleil-min',
       '<abbr title="la plus faible durée d’ensoleillement mensuel en heure">nbr min.heure soleil record mois</abbr> <span style="float:right">[[File:Record minimal pour modèle climat.png|17px]] [[File:A6 soleil pour modèle climat.png|28px]]</span>',
       true, nil)

   row(result, args, charte,
       'soleil-max',
       '<abbr title="la plus haute durée d\'ensoleillement mensuel en heure">nbr max.heure soleil record mois</abbr> <span style="float:right">[[File:Le record maximum pour modèle climat.png|17px]] [[File:A6 soleil pour modèle climat.png|28px]]</span>',
       true, nil)

   row(result, args, charte,
       'soleil-record',
       '<abbr title="la plus haute durée d\'ensoleillement quotidien en heure">nbr max.heure soleil record jour</abbr> <span style="float:right">[[File:Le record maximum pour modèle climat.png|17px]] [[File:A6 soleil jour.png|28px]]</span>',
       false, nil)

   row(result, args, charte,
       'soleil-0',
       '<abbr title="moyenne mensuelle du nombre de jours dont la durée d\'ensoleillement quotidienne est nulle">nbr moy.jour absence soleil</abbr> <span style="float:right">[[File:Soleil 0 % pour modèle climat.png|30px]]</span>',
       false, nil)

   row(result, args, charte,
       'soleil-+1',
       '<abbr title="moyenne mensuelle du nombre de jours dont la durée d\'ensoleillement quotidienne est supérieure ou égale à une heure">nbr moy.jour avec soleil ≥ 1 heure</abbr> <span style="float:right">[[File:Soleil 20 % pour modèle climat.png|33px]]</span>',
       false, nil)

   row(result, args, charte,
       'soleil-+5',
       '<abbr title="moyenne mensuelle du nombre de jours dont la durée d\'ensoleillement quotidienne est supérieure ou égale à cinq heures">nbr moy.jour avec soleil ≥ 5 heures</abbr> <span style="float:right">[[File:Soleil 80 % pour modèle climat.png|31px]]</span>',
       false, nil)

   row(result, args, charte,
       'ray',
       'rayonnement global moyen (MJ/m²) <span style="float:right">[[File:Pyranomètre pour modèle climat.png|17px]]</span>',
       false, nil)

   row(result, args, charte,
       'etp',
       'ETP Penman moyen (mm)',
       false, nil)

   row(result, args, charte,
       'humidité',
       'humidité relative (%) <span style="float:right">[[File:Brouillard pour modèle climat.png|17px]]</span>',
       false, nil)

   row(result, args, charte,
       'prec',
       'quantité précipitations mensuelles (mm) <span style="float:right">[[File:Précipitation 1 mm par heure pour modèle climat.png|16px]]</span>',
       false, background_color_precipitation)

   row(result, args, charte,
       'pluie',
       'dont pluie (mm) <span style="float:right">[[File:Précipitation 1 mm par heure pour modèle climat.png|16px]]</span>',
       false, nil, true)

   row(result, args, charte,
       'neige',
       'dont neige (cm) <span style="float:right">[[File:Il neige pour modèle climat.png|20px]]</span>',
       false, background_color_neige, true)

   row(result, args, charte,
       'pluie-record',
       '<abbr title="la plus haute quantité de pluie quotidienne en millimètre">record de pluie quotidien</abbr> <span style="float:right">[[File:Le record maximum pour modèle climat.png|17px]] [[File:Pluie j.png|16px]]</span>',
       true, nil)

   row(result, args, charte,
       'neige-record',
       '<abbr title="la plus haute quantité de chutes de neige quotidiennes en centimètre">record de neige quotidien</abbr> <span style="float:right">[[File:Le record maximum pour modèle climat.png|17px]] [[File:Neige j.png|20px]]</span>',
       true, nil)

   row(result, args, charte,
       'prec-bas',
       '<abbr title="la plus basse quantité de précipitations mensuelles en millimètre">min.précipitations record mois</abbr> <span style="float:right">[[File:Record minimal pour modèle climat.png|17px]] [[File:Précipitation 1 mm par heure pour modèle climat.png|16px]]</span>',
       false, nil)

   row(result, args, charte,
       'prec-haut',
       '<abbr title="la plus haute quantité de précipitations mensuelles en millimètre">max.préc.record mois</abbr> <span style="float:right">[[File:Le record maximum pour modèle climat.png|17px]] [[File:Précipitation 1 mm par heure pour modèle climat.png|16px]]</span>',
       true, nil)

   row(result, args, charte,
       'prec-nbr-bas',
       '<abbr title="le plus bas nombre de jours dans le mois avec précipitations">nbr min.jour avec préc.record mois</abbr> <span style="float:right">[[File:Record minimal pour modèle climat.png|17px]] [[File:Pluie nombre.png|16px]]</span>',
       true, nil)

   row(result, args, charte,
       'prec-nbr',
       '<abbr title="moyenne mensuelle du nombre de jours avec précipitations">nbr moy.jour avec préc.mois</abbr> <span style="float:right">[[File:Pluie nombre.png|16px]]</span>',
       false, nil)

   row(result, args, charte,
       'prec-nbr-haut',
       '<abbr title="le plus haut nombre de jours dans le mois avec précipitations">nbr max.jour avec préc.record mois</abbr> <span style="float:right">[[File:Le record maximum pour modèle climat.png|17px]] [[File:Pluie nombre.png|16px]]</span>',
       true, nil)

   row(result, args, charte,
       'pluie-+1',
       '<abbr title="nombre de jours avec pluie supérieure ou égale à un millimètre">nbr jour avec pluie ≥ {{unité|1|mm}}</abbr> <span style="float:right">[[File:Pluie nombre supérieur.png|25px]]</span>',
       false, nil)

   row(result, args, charte,
       'pluie-+5',
       '<abbr title="nombre de jours avec pluie supérieure ou égale à cinq millimètres">nbr jour avec pluie ≥ {{unité|5|mm}}</abbr> <span style="float:right">[[File:Précipitation 5 mm par heure pour modèle climat.png|31px]]</span>',
       false, nil)

   row(result, args, charte,
       'pluie-+10',
       '<abbr title="nombre de jours avec pluie supérieure ou égale à dix millimètres">nbr jour avec pluie ≥ {{unité|10|mm}}</abbr> <span style="float:right">[[File:Précipitation 10 mm par heure pour modèle climat.png|47px]]</span>',
       false, nil)

   row(result, args, charte,
       'pluie-an-détail',
       'pluviométrie du mois d\'une année (mm) <span style="float:right">[[File:Pluie d.png|16px]]</span>',
       false, nil)

   row(result, args, charte,
       'orage-jour',
       'nombre de jours orageux <span style="float:right">[[File:Foudre pour modèle climat.png|20px]]</span>',
       false, nil)

   row(result, args, charte,
       'grêle-jour',
       'nombre de jours avec chutes de grêle',
       false, nil)

   row(result, args, charte,
       'neige-jour',
       '<abbr title="nombre de jours avec des chutes de neige">nbr jour avec neige</abbr> <span style="float:right">[[File:Neige nombre.png|20px]]</span>',
       false, nil)

   row(result, args, charte,
       'brouillard-jour',
       'nombre de jours avec brouillard <span style="float:right">[[File:Le brouillard nombre.png|17px]]</span>',
       false, nil)

   row(result, args, charte,
       'vent-10',
       'vent moyen sur 10 minutes (m/s) <span style="float:right">[[File:Le vent faible pour modèle climat.png|12px]]</span>',
       false, nil)

   row(result, args, charte,
       'vent-record',
       'vent maximum instantané (m/s) <span style="float:right">[[File:Le record maximum pour modèle climat.png|17px]] [[File:Le vent fort pour modèle climat.png|21px]]</span>',
       true, nil)

   row(result, args, charte,
       'vent-nbr-+16',
       '<abbr title="moyenne mensuelle du nombre de jours dont les rafales sont supérieures ou égales à seize mètres par seconde">nbr moy.jour avec rafale ≥ 16 m/s</abbr> <span style="float:right">[[File:Vent faible nombre.png|21px]]</span>',
       false, nil)

   row(result, args, charte,
       'vent-nbr-+28',
       '<abbr title="moyenne mensuelle du nombre de jours dont les rafales sont supérieures ou égales à vingt-huit mètres par seconde">nbr moy.jour avec rafale ≥ 28 m/s</abbr> <span style="float:right">[[File:Vent fort nombre.png|29px]]</span>',
       false, nil)

   row(result, args, charte,
       'dju',
       'moyenne mensuelle des degrés jour unifiés',
       false, nil)

   row(result, args, charte,
       'dju-rad',
       '<abbr title="moyenne mensuelle des degrés jour unifiés de chauffage">moy.mois degré jour unifié chauffage</abbr>',
       false, nil)

   row(result, args, charte,
       'dju-clim',
       '<abbr title="moyenne mensuelle des degrés jour unifiés de climatisation">moy.mois degré jour unifié climatisation</abbr>',
       false, nil)

   row(result, args, charte,
       'press-bas',
       'la plus basse pression (hPa)',
       true, nil)

   row(result, args, charte,
       'press',
       'moyenne mensuelle de la pression (hPa)',
       false, nil)

   row(result, args, charte,
       'press-haut',
       'la plus haute pression (hPa)',
       true, 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, 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,'<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
		    arg1 = parseFormattedNumber(arg1)
		    if arg1 == nil then
		       arg1 = 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>'..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>'..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>'..arg3..'</small></div>')
		 table.insert(result,'</div>')
		 table.insert(result,'</td>')
	
		end
		 table.insert(result,[[</tr>
			<tr><td colspan=12 style="text-align:left;"><abbr title="Températures">Temp.</abbr> moyennes <span style="color:red">maxi</span> et <span style="color:blue">mini</span> (°C) •  <span style="color:#6478FF">Précipitations</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