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.
Ceci est une version archivée de cette page, en date du 5 juin 2014 à 23:44 et modifiée en dernier par Zebulon84 (discuter | contributions) (Prise en compte de différent tiret à la place du signe moins. (Il faudrait mettre les fonctions en local, mais il faut revoir l'ordre avant)). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 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

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

-- 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.","","","","","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, 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
        	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

-- 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,">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="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',
       'Température minimale moyenne ([[Degré Celsius|°C]])',
       false, background_color_temperature)
       
   row(result, args, charte,
       'tmin-bas',
       'Température minimale moyenne la plus basse (°C)',
       true, background_color_temperature)

   row(result, args, charte,
       'tmin-haut',
       'Température minimale moyenne la plus haute (°C)',
       true, background_color_temperature)

   row(result, args, charte,
       'tmoy',
       'Température moyenne (°C)',
       false, background_color_temperature)
       
   row(result, args, charte,
       'tmax',
       'Température maximale moyenne (°C)',
       false, background_color_temperature)
       
   row(result, args, charte,
       'tmax-bas',
       'Température maximale moyenne la plus basse (°C)',
       true, background_color_temperature)

   row(result, args, charte,
       'tmax-haut',
       'Température maximale moyenne la plus haute (°C)',
       true, background_color_temperature)

   row(result, args, charte,
       'tmin-record',
       'Record de froid (°C)',
       true, background_color_temperature)
       
   row(result, args, charte,
       'tmax-record-bas',
       'Température maximale la plus basse (°C)',
       true, background_color_temperature)
       
   row(result, args, charte,
       'tmin-record-haut',
       'Température minimale la plus haute (°C)',
       true, background_color_temperature)

   row(result, args, charte,
       'tmax-record',
       'Record de chaleur (°C)',
       true, background_color_temperature)

   row(result, args, charte,
       'tmin--10',
       'Nombre de jours avec température minimale ≤ −10 °C',
       false, nil)   

   row(result, args, charte,
       'tmin--5',
       'Nombre de jours avec température minimale ≤ –5 °C',
       false, nil)

   row(result, args, charte,
       'gel-jour',
       'Nombre de jours avec gel',
       false, nil)

   row(result, args, charte,
       'tmax--0',
       'Nombre de jours avec température maximale ≤ 0 °C',
       false, nil)

   row(result, args, charte,
       'tmax-+25',
       'Nombre de jours avec température maximale ≥ 25 °C',
       false, nil)

   row(result, args, charte,
       'tmax-+30',
       'Nombre de jours avec température maximale ≥ 30 °C',
       false, nil)

   row(result, args, charte,
       'tmax-+35',
       'Nombre de jours avec température maximale ≥ 35 °C',
       false, nil)
       
   row(result, args, charte,
       'dju',
       '[[Degré jour unifié|Degrés jour unifiés]]',
       false, nil)
       
   row(result, args, charte,
       'dju-clim',
       'Degrés jour unifiés en climatisation',
       false, nil)

   row(result, args, charte,
       'dju-rad',
       'Degrés jour unifiés en chauffage',
       false, nil)
       
   row(result, args, charte,
       'soleil',
       'Ensoleillement ([[Heure|h]])',
       false, background_color_soleil)

   row(result, args, charte,
       'soleil-min',
       'Ensoleillement la plus basse (h)',
       true, nil)

   row(result, args, charte,
       'soleil-max',
       'Ensoleillement la plus haute (h)',
       true, nil)

   row(result, args, charte,
       'soleil-record',
       'Record d\'ensoleillement en 24 h (h)',
       true, nil)

   row(result, args, charte,
       'soleil-0',
       'Nombre de jours sans ensoleillement',
       false, nil)

   row(result, args, charte,
       'soleil-+1',
       'Nombre de jours avec ensoleillement ≥ 1 h',
       false, nil)

   row(result, args, charte,
       'soleil-+5',
       'Nombre de jours avec ensoleillement ≥ 5 h',
       false, nil)

   row(result, args, charte,
       'ray',
       '[[Ensoleillement]] ([[Joule|MJ]]/[[Mètre carré|m²]])',
       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)',
       false, nil)
       
   row(result, args, charte,
       'vent-10',
       'Record de vent sur 10 minutes (km/h)',
       true, nil)
       
   row(result, args, charte,
       'vent-record',
       'Record de vent (km/h)',
       true, nil)
       
   row(result, args, charte,
       'vent-nbr-+16',
       'Nombre de jours avec rafales ≥ 57,6 km/h',
       false, nil)

   row(result, args, charte,
       'vent-nbr-+28',
       'Nombre de jours avec rafales ≥ 100,8 km/h',
       false, nil)
       
   row(result, args, charte,
       'press',
       'Pression atmosphérique au niveau de la mer ([[Pascal (unité)|hPa]])',
       false, nil)

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

   row(result, args, charte,
       'press-haut',
       'Record de la pression la plus haute (hPa)',
       true, nil)
       
   row(result, args, charte,
       'prec',
       'Précipitations ([[Millimètre|mm]])',
       false, background_color_precipitation)

   row(result, args, charte,
       'pluie',
       '<small>dont pluie ([[Millimètre|mm]])',
       false, nil, true)

   row(result, args, charte,
       'neige',
       '<small>dont neige ([[Centimètre|cm]])',
       false, background_color_neige, true)
       
   row(result, args, charte,
       'prec-bas',
       'Précipitations les plus basses (mm)',
       true, nil)

   row(result, args, charte,
       'prec-haut',
       'Précipitations les plus hautes (mm)',
       true, nil)    

   row(result, args, charte,
       'pluie-record',
       'Record de pluie en 24 h (mm)',
       true, nil)

   row(result, args, charte,
       'neige-record',
       'Record de neige en 24 h (cm)',
       true, nil)
       
   row(result, args, charte,
       'pluie-jour',
       'Nombre de jours avec précipitations',
       false, nil)    

   row(result, args, charte,
       'prec-nbr-bas',
       'Le moins de jours avec précipitations',
       true, nil)

   row(result, args, charte,
       'prec-nbr-haut',
       'Le plus de jours avec précipitations',
       true, nil)

   row(result, args, charte,
       'pluie-jour+1mm',
       '<small>dont nombre de jours avec précipitations ≥ 1 mm',
       false, nil)

   row(result, args, charte,
       'pluie-jour+5mm',
       '<small>dont nombre de jours avec précipitations ≥ 5 mm',
       false, nil)

   row(result, args, charte,
       'pluie-jour+10mm',
       '<small>dont nombre de jours avec précipitations ≥ 10 mm',
       false, nil)

   row(result, args, charte,
       'pluie-an-détail',
       'Pluviométrie du mois d\'une année mm',
       false, nil)
       
   row(result, args, charte,
       'humidité',
       'Humidité relative (%)',
       false, background_color_humidite)

   row(result, args, charte,
       'neige-jour',
       'Nombre de jours avec neige',
       false, nil)
       
   row(result, args, charte,
       'grêle-jour',
       'Nombre de jours avec grêle',
       false, nil)
       
   row(result, args, charte,
       'orage-jour',
       'Nombre de jours d\'orage',
       false, nil)

   row(result, args, charte,
       'brouillard-jour',
       'Nombre de jours avec brouillard',
       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]])", 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;">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