Modul:WeatherBox
Videz
![]() | Predloga se uporablja na številnih straneh, zato bo vsaka njena sprememba takoj zelo opazna. Prosimo, da vse spremembe, ki jih želite uvesti, pred uvedbo preizkusite na podstraneh predloge (/peskovnik in /testniprimeri) ali na svojih lastnih podstraneh. Pred spreminjanjem te predloge se o želenih spremembah rajši pogovorite na pogovorni strani. |
![]() | Ta modul je ocenjen kot pripravljen za splošno uporabo. Dosegel je zrelo obliko in naj bi bil razmeroma brez napak ter pripravljen za uporabo, kjer je to primerno. Lahko ga omenite na straneh pomoči in v drugih virih o Wikipediji kot možnost za učenje novih uporabnikov. Da bi zmanjšali obremenitev strežnikov in slab izhod, ga je treba izboljšati s testiranjem v peskovniku, namesto ponavljajočega se urejanja poskusov in napak. |
Usage
[uredi kodo]This module is used by {{Weather box}}.
{{#invoke:WeatherBox|function_name}}
Podnebni podatki za Edmonton City Centre (Blatchford Field) Airport (1981−2010) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Mesec | Jan | Feb | Mar | Apr | Maj | Jun | Jul | Avg | Sep | Okt | Nov | Dec | Letno |
Rekordno visoka temperatura °C | 11.7 | 14.0 | 23.9 | 31.1 | 32.3 | 34.9 | 34.6 | 34.5 | 33.9 | 28.6 | 21.7 | 16.7 | 34.9 |
Povprečna visoka temperatura °C | −6.0 | −2.7 | 2.2 | 11.2 | 17.5 | 21.0 | 23.1 | 22.6 | 17.1 | 10.4 | 0.0 | −4.5 | 9.3 |
Povprečna dnevna temperatura °C | −10.4 | −7.6 | −2.5 | 5.4 | 11.5 | 15.5 | 17.7 | 16.9 | 11.4 | 5.1 | −4.1 | −8.8 | 4.2 |
Povprečna nizka temperatura °C | −14.8 | −12.5 | −7.2 | −0.5 | 5.4 | 9.9 | 12.3 | 11.3 | 5.8 | −0.2 | −8.2 | −13.1 | −1.0 |
Rekordno nizka temperatura °C | −44.4 | −46.1 | −36.1 | −25.6 | −12.2 | −1.1 | 0.6 | −1.2 | −11.7 | −25.0 | −34.1 | −48.3 | −48.3 |
Rekordno nizek občutek mraza zaradi vetra | −52.8 | −50.7 | −44.6 | −37.5 | −14.5 | 0.0 | 0.0 | −3.7 | −13.3 | −34.3 | −50.2 | −55.5 | −55.5 |
Povprečna količina padavin mm | 21.7 | 12.0 | 15.8 | 28.8 | 46.1 | 77.5 | 93.8 | 61.9 | 43.5 | 21.7 | 18.0 | 15.0 | 455.7 |
Povprečna količina dežja mm | 1.3 | 0.76 | 1.7 | 14.5 | 40.7 | 77.5 | 93.8 | 61.8 | 42.4 | 10.9 | 1.6 | 0.73 | 347.8 |
Povprečna količina zapadlega snega cm | 24.5 | 13.4 | 17.4 | 15.3 | 4.9 | 0.0 | 0.0 | 0.0 | 1.0 | 11.6 | 19.1 | 16.4 | 123.5 |
Povp. št. dni s padavinami (≥ 0.2 mm) | 11.0 | 7.9 | 8.3 | 8.8 | 11.0 | 14.2 | 14.6 | 11.1 | 9.8 | 8.0 | 8.8 | 9.4 | 122.9 |
Povp. št. deževnih dni (≥ 0.2 mm) | 1.1 | 0.83 | 1.4 | 5.9 | 10.5 | 14.2 | 14.6 | 11.1 | 9.6 | 5.6 | 1.5 | 0.75 | 77.3 |
Povp. št. sneženih dni (≥ 0.2 cm) | 10.7 | 7.7 | 7.7 | 4.2 | 1.2 | 0.0 | 0.0 | 0.0 | 0.50 | 3.2 | 7.9 | 9.3 | 52.4 |
Povprečna relativna vlažnost (%) | 65.2 | 61.2 | 56.5 | 42.9 | 40.4 | 48.2 | 52.6 | 51.4 | 50.1 | 50.5 | 64.7 | 65.4 | 54.1 |
Povp. št. sončnih ur | 100.8 | 121.7 | 176.3 | 244.2 | 279.9 | 285.9 | 307.5 | 282.3 | 192.7 | 170.8 | 98.4 | 84.5 | 2.344,8 |
% možne sončnosti | 40.2 | 44.1 | 48.1 | 58.2 | 56.8 | 56.2 | 60.2 | 61.5 | 50.4 | 52.0 | 37.8 | 36.0 | 50.1 |
Povp. indeks UV | 0 | 1 | 3 | 5 | 7 | 9 | 11 | 9 | 7 | 5 | 3 | 1 | 5 |
Vir: Environment Canada,[1] Weather Atlas[2] |
Sklici
Te reference se bodo pojavile v članku, ampak ta seznam se bo pojavil le na tej strani.
- ↑ »Edmonton City Centre Airport«. Canadian Climate Normals 1981−2010. Environment Canada. 19. avgust 2013. Pridobljeno 10. septembra 2013.
- ↑ »Monthly weather forecast and Climate: Edmonton, Canada«. Weather Atlas. Pridobljeno 12. marca 2019.
Zgornja dokumentacija je vključena iz Modul:WeatherBox/dok. (uredi | zgodovina) Urejevalci lahko preizkušate ta modul v peskovniku (ustvari | mirror) in testnihprimerih (ustvari). Prosimo, da dodate kategorije v /dok podstran. Podstrani te predloge. |
w = {};
math_mod = require( "Modul:Math" );
wbc = require( "Modul:Weather box/colors" );
function checkFlag( flag )
if flag == nil then
return nil;
elseif type( flag ) == 'boolean' then
return flag;
elseif type( flag ) == 'string' then
flag = flag:lower();
if flag == '0' or flag == 'false' or
flag == '' or flag == 'no' or
flag == 'n' then
return false;
else
return true;
end
else
return error( 'Flag type not valid' );
end
end
function w.buildRow( frame )
local mode = (frame.args.mode or 'basic'):lower();
local group_name = frame.args.group_name;
local first_value_string, second_value_string;
local first_value_number, second_value_number, color_values;
local color_scheme = frame.args.color_scheme or 't';
local scale_factor = math_mod._cleanNumber( frame, frame.args.scale_factor) or 1;
local date_mode = checkFlag( frame.args.date_mode or false );
local label = frame.args.label or '';
local annual_mode = (frame.args.annual_mode or 'avg'):lower();
local include_space = checkFlag( frame.args.include_space or true );
local second_line = checkFlag( frame.args.second_line ) or false;
local prefer_cm = checkFlag( frame.args.prefer_cm ) or false;
local result;
local pframe = frame:getParent();
local metric_first = checkFlag( frame.args['metric first'] );
if metric_first == nil then metric_first = checkFlag( pframe.args['metric first'] ); end
if mode == 'basic' then
first_value_string, first_value_number = getInputs( pframe, group_name,
nil, include_space );
second_value_string = nil;
second_value_number = nil;
elseif mode == 'temperature' then
first_value_string, first_value_number = getInputs( pframe, group_name,
{'C'}, include_space );
second_value_string, second_value_number = getInputs( pframe, group_name,
{'F'}, include_space );
first_value_string, first_value_number =
reconcileTemperature( first_value_string, first_value_number,
second_value_string, second_value_number )
elseif mode == "precipitation" then
first_value_string, first_value_number, variant = getInputs( pframe, group_name,
{'cm', 'mm'}, include_space );
second_value_string, second_value_number = getInputs( pframe, group_name,
{'inch'}, include_space );
first_value_string, first_value_number, second_value_string, second_value_number,
variant =
reconcilePrecipitation( first_value_string, first_value_number,
second_value_string, second_value_number, variant, prefer_cm )
else
error( 'Requested mode not recognized' );
end
local good = false;
for i = 1,13 do
if first_value_string[i] ~= nil and first_value_string[i] ~= '' then
good = true;
break;
end
end
if not good then
return '';
end
if first_value_string[13] == nil or first_value_string[13] == '' then
first_value_string[13], first_value_number[13] = getAnnualValue( first_value_number, annual_mode );
end
if second_value_string ~= nil then
if second_value_string[13] == nil or second_value_string[13] == '' then
second_value_string[13], second_value_number[13] = getAnnualValue( second_value_number, annual_mode );
end
if mode == 'precipitation' then
for i = 1,12 do
if variant[i] ~= 0 then
variant[13] = variant[i];
break;
end
end
end
end
color_scheme = wbc.interpret_color_code( color_scheme );
color_values = {};
month_adj = { 31/30, 28/30, 31/30, 1, 31/30, 1,
31/30, 31/30, 1, 31/30, 1, 31/30, 12.175 };
local adj;
for i = 1,13 do
if first_value_number[i] ~= nil and first_value_number[i] ~= -9999 then
adj = scale_factor;
if date_mode then
adj = adj / month_adj[i];
end
if mode == "precipitation" then
if variant[i] == 1 then
adj = adj * 10;
end
end
table.insert( color_values, color_scheme( first_value_number[i] * adj ) );
else
table.insert( color_values, color_scheme( nil ) );
end
end
local lang = mw.getContentLanguage();
for i = 1,13 do
if first_value_number[i] ~= nil and first_value_number[i] ~= -9999 then
if math.abs(first_value_number[i]) >= 1000 then
first_value_string[i] = lang:formatNum( math.abs(first_value_number[i]) );
if first_value_number[i] < 0 then
first_value_string[i] = '−' .. first_value_string[i];
end
elseif first_value_number[i] < 0 then
first_value_string[i] = '−' .. first_value_string[i]:sub(2);
end
end
if second_value_number ~= nil then
if second_value_number[i] ~= nil and second_value_number[i] ~= -9999 then
if math.abs(first_value_number[i]) >= 1000 then
second_value_string[i] = lang:formatNum( math.abs(second_value_number[i]) );
if second_value_number[i] < 0 then
second_value_string[i] = '−' .. second_value_string[i];
end
elseif second_value_number[i] < 0 then
second_value_string[i] = '−' .. second_value_string[i]:sub(2);
end
end
end
end
return makeLine( label, first_value_string, color_values, color_scheme );
end
function makeLine( label, first_value_string, color_values, color_scheme )
local result, color_str, value_str;
result = {'|- \n! height="16" | ', label, "\n"}
for i = 1,13 do
color_str = color_values[i];
if i == 13 then
table.insert( result, table.concat( {'|style="', color_str, ' border-left-width:medium" | '} ) );
else
table.insert( result, table.concat( {'|style="', color_str, '" | '} ) );
end
value_str = first_value_string[i];
if value_str ~= '' and value_str ~= nil then
if tonumber(value_str) and string.find(value_str, "%.") then
table.insert( result, mw.getContentLanguage():formatNum( tonumber(value_str) ) );
else
table.insert( result, value_str );
end
else
table.insert( result, '—' );
end
table.insert( result, "\n" );
end
return table.concat( result );
end
function getInputs( frame, group_name, suffix, include_space )
local month_names = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'year' };
local str, str2, val;
local output_string = {};
local output_value = {};
local variant = {};
if suffix == nil then
for _, mon in ipairs( month_names ) do
if include_space then
str = ( frame.args[ mon .. ' ' .. group_name ] or '' );
else
str = ( frame.args[ mon .. group_name ] or '' );
end
val, str2 = math_mod._cleanNumber( frame, str );
if val ~= nil then
table.insert( output_string, str2 );
table.insert( output_value, val );
else
table.insert( output_string, str );
table.insert( output_value, -9999 );
end
end
else
local updated = false;
for _, mon in ipairs( month_names ) do
updated = false;
for i, suf in ipairs( suffix ) do
if include_space then
str = frame.args[ mon .. ' ' .. group_name .. ' ' .. suf ];
else
str = frame.args[ mon .. group_name .. ' ' .. suf ];
end
if str ~= nil and str ~= '' then
val, str2 = math_mod._cleanNumber( frame, str );
if val ~= nil then
table.insert( output_string, str2 );
table.insert( output_value, val );
else
table.insert( output_string, str );
table.insert( output_value, -9999 );
end
table.insert( variant, i );
updated = true;
break;
end
end
if not updated then
table.insert( output_string, '' );
table.insert( output_value, -9999 );
table.insert( variant, 0 );
end
end
end
return output_string, output_value, variant;
end
function getAnnualValue( values, mode )
local total = 0;
local val = 0;
if mode == 'avg' or mode == 'sum' then
local p1, p2;
p1 = 0;
for i = 1, 12 do
val = values[i];
if val == -9999 then
return '', -9999;
end
p2 = math_mod._precision( val );
if p2 > p1 then
p1 = p2;
end
total = total + val;
end
if mode == 'avg' then
total = math_mod._round( total / 12, p1 + 1 );
end
return tostring( total ), total;
elseif mode == 'min' then
local min_val = nil;
for i = 1, 12 do
val = values[i];
if val ~= -9999 then
if min_val == nil or val < min_val then
min_val = val;
end
end
end
return tostring( min_val ), min_val;
elseif mode == 'max' then
local max_val = nil;
for i = 1, 12 do
val = values[i];
if val ~= -9999 then
if max_val == nil or val > max_val then
max_val = val;
end
end
end
return tostring(max_val), max_val;
else
error( 'Unrecognized Annual Mode' );
end
end
function reconcileTemperature( C_degree_strings, C_degree_values, F_degree_strings, F_degree_values )
local p;
for i = 1,13 do
if C_degree_strings[i] == '' then
if F_degree_values[i] ~= -9999 then
p = math.max( 0, math_mod._precision( F_degree_strings[i] ) );
C_degree_values[i] = math_mod._round( (F_degree_values[i] - 32)*5/9, p );
C_degree_strings[i] = tostring( C_degree_values[i] );
end
end
end
return C_degree_strings, C_degree_values;
end
function reconcilePrecipitation( M_degree_strings, M_degree_values,
I_degree_strings, I_degree_values, variant, prefer_cm )
local p;
local v_class = 0;
for i = 1,13 do
if variant[i] == 1 then
v_class = 1;
elseif variant[i] == 2 then
v_class = 2;
end
end
if v_class == 0 then
if prefer_cm then
v_class = 1;
else
v_class = 2;
end
end
for i = 1,13 do
if M_degree_strings[i] == '' then
if I_degree_values[i] ~= -9999 then
if v_class == 1 then
p = math.max( 0, math_mod._precision( I_degree_strings[i] ) );
M_degree_values[i] = math_mod._round( I_degree_values[i]*2.54, p );
variant[i] = v_class;
else
p = math.max( 0, math_mod._precision( I_degree_strings[i] ) ) - 1;
M_degree_values[i] = math_mod._round( I_degree_values[i]*25.4, p );
variant[i] = v_class;
end
M_degree_strings[i] = tostring( M_degree_values[i] );
end
elseif I_degree_strings[i] == '' then
if M_degree_values[i] ~= -9999 then
if variant[i] == 1 then
p = math.max( 0, math_mod._precision( M_degree_strings[i] ) ) + 1;
I_degree_values[i] = M_degree_values[i]/2.54;
else
p = math.max( 0, math_mod._precision( M_degree_strings[i] ) ) + 2;
I_degree_values[i] = M_degree_values[i]/25.4;
end
I_degree_values[i] = math_mod._round( I_degree_values[i], p );
I_degree_strings[i] = tostring( I_degree_values[i] );
end
end
end
return M_degree_strings, M_degree_values, I_degree_strings, I_degree_values, variant;
end
return w;