Module:Weather box: Difference between revisions
Appearance
Content deleted Content added
work around bug reported by User:Crunch41 where input 'Jan precipitation inch = trace' caused function precision to throw an error |
update from Module:Weather box/sandbox: refactor for consistent options and fix single_line=N bug; default auto width by Tholme |
||
Line 30: | Line 30: | ||
end |
end |
||
local function makeLabel(args, is_first, base, what) |
local function makeLabel(args, options, is_first, base, what) |
||
local first |
local first |
||
if isAny(args, ' ' .. what .. ' cm') then |
if isAny(args, ' ' .. what .. ' cm') then |
||
Line 49: | Line 49: | ||
end |
end |
||
if is_first then |
if is_first then |
||
if |
if options.wantSingleLine then |
||
first = first .. ' (' .. second .. ')' |
first = first .. ' (' .. second .. ')' |
||
end |
end |
||
Line 75: | Line 75: | ||
end |
end |
||
local function |
local function wantSingle(parm) |
||
-------------------------------------------------------------------------------- |
|||
-- Result before July 2022 for single_line setting: |
|||
-- blank/omitted : separate table rows for metric and imperial (two rows) |
|||
-- N : bug: only one row with either metric or imperial (not both) |
|||
-- but heading like "cm (inches)" |
|||
-- Y/junk : single row with both metric/imperial in same cell |
|||
-------------------------------------------------------------------------------- |
|||
-- Intend changing in July 2022 so single_line=Y is the default and |
|||
-- need single_line=N for separate lines. |
|||
-- However, this release (1 July 2022) keeps blank/omitted as meaning "no" |
|||
-- so the other large changes can be tested before switching the default. |
|||
parm = (parm or ''):lower() |
|||
return not (parm == 'no' or parm == 'n' or parm == '') |
|||
⚫ | |||
local function getDefinitions(frame, args, options) |
|||
-- Return a list of tables or strings that define each row. |
-- Return a list of tables or strings that define each row. |
||
⚫ | |||
local function _if(parm, a, b) |
local function _if(parm, a, b) |
||
return stripToNil(args[parm]) and a or b or '' |
return stripToNil(args[parm]) and a or b or '' |
||
Line 86: | Line 101: | ||
local function _ifany(suffix) |
local function _ifany(suffix) |
||
return isAny(args, suffix) |
return isAny(args, suffix) |
||
end |
|||
local function _ifSingle(a, b) |
|||
return options.wantSingleLine and a or b or '' |
|||
end |
|||
local location = _if('location', args.location, '{{{location}}}') -- show "{{{location}}}" to alert editor if parameter is blank |
|||
local navbarText |
|||
if not stripToNil(args.open) then |
|||
if stripToNil(args.name) then |
|||
⚫ | |||
⚫ | |||
end |
|||
end |
end |
||
return { |
return { |
||
Line 91: | Line 117: | ||
----------- HEADER ---------- |
----------- HEADER ---------- |
||
'{| class="wikitable ' .. _if('open', '', 'mw-collapsible' .. _if('collapsed', ' mw-collapsed')) .. |
'{| class="wikitable ' .. _if('open', '', 'mw-collapsible' .. _if('collapsed', ' mw-collapsed')) .. |
||
'" style="width:' .. _ifset('width', ' |
'" style="width:' .. _ifset('width', 'auto') .. |
||
'; text-align:center; line-height: 1.2em; margin:' .. |
'; text-align:center; line-height: 1.2em; margin:' .. |
||
_ifset('margin', ' |
_ifset('margin', '') .. ';"' .. |
||
_if('open', |
_if('open', |
||
⚫ | |||
-- Following intentionally shows "{{{location}}}" if parameter is blank to alert editor. |
|||
⚫ | |||
'\n|-' .. |
'\n|-' .. |
||
'\n!colspan="14" | ' .. |
'\n!colspan="14" | ' .. _if('name', navbarText, 'Climate data for ' .. location) |
||
_if('name', |
|||
⚫ | |||
'Climate data for ' .. _if('location', args.location, '{{{location}}}') |
|||
⚫ | |||
) .. |
) .. |
||
[=[ |
[=[ |
||
Line 124: | Line 145: | ||
{---------- FIRST LINE MAXIMUM HUMIDEX ---------- |
{---------- FIRST LINE MAXIMUM HUMIDEX ---------- |
||
WANTROW = _ifany(' maximum humidex') and (_ifset('metric first') or |
WANTROW = _ifany(' maximum humidex') and (_ifset('metric first') or options.wantSingleLine), |
||
mode = 'basic', |
mode = 'basic', |
||
group_name = 'maximum humidex', |
group_name = 'maximum humidex', |
||
Line 138: | Line 159: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Record high °' .. _if('metric first', 'C', 'F') .. |
label = 'Record high °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'max', |
annual_mode = 'max', |
||
}, |
}, |
||
Line 147: | Line 168: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Mean maximum °' .. _if('metric first', 'C', 'F') .. |
label = 'Mean maximum °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'max', |
annual_mode = 'max', |
||
}, |
}, |
||
Line 156: | Line 177: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Average high °' .. _if('metric first', 'C', 'F') .. |
label = 'Average high °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'avg', |
annual_mode = 'avg', |
||
}, |
}, |
||
Line 165: | Line 186: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Daily mean °' .. _if('metric first', 'C', 'F') .. |
label = 'Daily mean °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'avg', |
annual_mode = 'avg', |
||
}, |
}, |
||
Line 174: | Line 195: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Average low °' .. _if('metric first', 'C', 'F') .. |
label = 'Average low °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'avg', |
annual_mode = 'avg', |
||
}, |
}, |
||
Line 183: | Line 204: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Mean minimum °' .. _if('metric first', 'C', 'F') .. |
label = 'Mean minimum °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'min', |
annual_mode = 'min', |
||
}, |
}, |
||
Line 192: | Line 213: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Record low °' .. _if('metric first', 'C', 'F') .. |
label = 'Record low °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'min', |
annual_mode = 'min', |
||
}, |
}, |
||
{---------- FIRST LINE MINIMUM WIND CHILL ---------- |
{---------- FIRST LINE MINIMUM WIND CHILL ---------- |
||
WANTROW = _ifany(' chill') and (_ifset('metric first') or |
WANTROW = _ifany(' chill') and (_ifset('metric first') or options.wantSingleLine), |
||
mode = 'basic', |
mode = 'basic', |
||
group_name = 'chill', |
group_name = 'chill', |
||
Line 212: | Line 233: | ||
scale_factor = '1', |
scale_factor = '1', |
||
prefer_cm = precision(_ifset('Jan precipitation inch', '0')) < 1, |
prefer_cm = precision(_ifset('Jan precipitation inch', '0')) < 1, |
||
label = makeLabel(args, true, 'Average [[precipitation]]', 'precipitation'), |
label = makeLabel(args, options, true, 'Average [[precipitation]]', 'precipitation'), |
||
annual_mode = 'sum', |
annual_mode = 'sum', |
||
}, |
}, |
||
Line 223: | Line 244: | ||
scale_factor = '1', |
scale_factor = '1', |
||
prefer_cm = precision(_ifset('Jan rain inch', '0')) < 1, |
prefer_cm = precision(_ifset('Jan rain inch', '0')) < 1, |
||
label = makeLabel(args, true, 'Average rainfall', 'rain'), |
label = makeLabel(args, options, true, 'Average rainfall', 'rain'), |
||
annual_mode = 'sum', |
annual_mode = 'sum', |
||
}, |
}, |
||
Line 234: | Line 255: | ||
date_mode = true, |
date_mode = true, |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = makeLabel(args, true, 'Average snowfall', 'snow'), |
label = makeLabel(args, options, true, 'Average snowfall', 'snow'), |
||
annual_mode = 'sum', |
annual_mode = 'sum', |
||
}, |
}, |
||
Line 244: | Line 265: | ||
color_scheme = _ifset('snow colour', 'p'), |
color_scheme = _ifset('snow colour', 'p'), |
||
scale_factor = '0.2', |
scale_factor = '0.2', |
||
label = makeLabel(args, true, 'Average extreme snow depth', 'snow depth'), |
label = makeLabel(args, options, true, 'Average extreme snow depth', 'snow depth'), |
||
annual_mode = 'max', |
annual_mode = 'max', |
||
}, |
}, |
||
{---------- SECOND LINE MAXIMUM HUMIDEX ---------- |
{---------- SECOND LINE MAXIMUM HUMIDEX ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and _ifany(' maximum humidex'), |
||
mode = 'basic', |
mode = 'basic', |
||
group_name = 'maximum humidex', |
group_name = 'maximum humidex', |
||
Line 258: | Line 279: | ||
}, |
}, |
||
{---------- SECOND LINE RECORD HIGH TEMPERATURES ---------- |
{---------- SECOND LINE RECORD HIGH TEMPERATURES ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' record high C') or _ifany(' record high F')), |
||
mode = 'temperature', |
mode = 'temperature', |
||
group_name = 'record high', |
group_name = 'record high', |
||
Line 268: | Line 289: | ||
}, |
}, |
||
{---------- SECOND LINE AVERAGE HIGH TEMPERATURES ---------- |
{---------- SECOND LINE AVERAGE HIGH TEMPERATURES ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' high C') or _ifany(' high F')), |
||
mode = 'temperature', |
mode = 'temperature', |
||
group_name = 'high', |
group_name = 'high', |
||
Line 278: | Line 299: | ||
}, |
}, |
||
{---------- SECOND LINE DAILY MEAN TEMPERATURES ---------- |
{---------- SECOND LINE DAILY MEAN TEMPERATURES ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' mean C') or _ifany(' mean F')), |
||
mode = 'temperature', |
mode = 'temperature', |
||
group_name = 'mean', |
group_name = 'mean', |
||
Line 289: | Line 310: | ||
}, |
}, |
||
{---------- SECOND LINE AVERAGE LOW TEMPERATURES ---------- |
{---------- SECOND LINE AVERAGE LOW TEMPERATURES ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' low C') or _ifany(' low F')), |
||
mode = 'temperature', |
mode = 'temperature', |
||
group_name = 'low', |
group_name = 'low', |
||
Line 300: | Line 321: | ||
}, |
}, |
||
{---------- SECOND LINE RECORD LOW TEMPERATURES ---------- |
{---------- SECOND LINE RECORD LOW TEMPERATURES ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' record low C') or _ifany(' record low F')), |
||
mode = 'temperature', |
mode = 'temperature', |
||
group_name = 'record low', |
group_name = 'record low', |
||
Line 311: | Line 332: | ||
}, |
}, |
||
{---------- SECOND LINE MINIMUM WIND CHILL ---------- |
{---------- SECOND LINE MINIMUM WIND CHILL ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' chill') and _if('metric first')), |
||
mode = 'basic', |
mode = 'basic', |
||
group_name = 'chill', |
group_name = 'chill', |
||
Line 320: | Line 341: | ||
}, |
}, |
||
{---------- SECOND LINE TOTAL PRECIPITATION ---------- |
{---------- SECOND LINE TOTAL PRECIPITATION ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' precipitation cm') or _ifany(' precipitation mm') or _ifany(' precipitation inch')), |
||
mode = 'precipitation', |
mode = 'precipitation', |
||
group_name = 'precipitation', |
group_name = 'precipitation', |
||
Line 328: | Line 349: | ||
scale_factor = '1', |
scale_factor = '1', |
||
prefer_cm = precision(_ifset('Jan precipitation inch', '0')) < 1, |
prefer_cm = precision(_ifset('Jan precipitation inch', '0')) < 1, |
||
label = makeLabel(args, false, 'Average [[precipitation]]', 'precipitation'), |
label = makeLabel(args, options, false, 'Average [[precipitation]]', 'precipitation'), |
||
annual_mode = 'sum', |
annual_mode = 'sum', |
||
}, |
}, |
||
{---------- SECOND LINE RAINFALL ---------- |
{---------- SECOND LINE RAINFALL ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' rain cm') or _ifany(' rain mm') or _ifany(' rain inch')), |
||
mode = 'precipitation', |
mode = 'precipitation', |
||
group_name = 'rain', |
group_name = 'rain', |
||
Line 340: | Line 361: | ||
scale_factor = '1', |
scale_factor = '1', |
||
prefer_cm = precision(_ifset('Jan rain inch', '0')) < 1, |
prefer_cm = precision(_ifset('Jan rain inch', '0')) < 1, |
||
label = makeLabel(args, false, 'Average rainfall', 'rain'), |
label = makeLabel(args, options, false, 'Average rainfall', 'rain'), |
||
annual_mode = 'sum', |
annual_mode = 'sum', |
||
}, |
}, |
||
{---------- SECOND LINE SNOWFALL ---------- |
{---------- SECOND LINE SNOWFALL ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' snow cm') or _ifany(' snow mm') or _ifany(' snow inch')), |
||
mode = 'precipitation', |
mode = 'precipitation', |
||
group_name = 'snow', |
group_name = 'snow', |
||
Line 352: | Line 373: | ||
date_mode = true, |
date_mode = true, |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = makeLabel(args, false, 'Average snowfall', 'snow'), |
label = makeLabel(args, options, false, 'Average snowfall', 'snow'), |
||
annual_mode = 'sum', |
annual_mode = 'sum', |
||
}, |
}, |
||
{---------- SECOND LINE AVERAGE EXTREME SNOW DEPTH ---------- |
{---------- SECOND LINE AVERAGE EXTREME SNOW DEPTH ---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' snow depth cm') or _ifany(' snow depth mm') or _ifany(' snow depth inch')), |
||
mode = 'precipitation', |
mode = 'precipitation', |
||
group_name = 'snow depth', |
group_name = 'snow depth', |
||
Line 363: | Line 384: | ||
color_scheme = _ifset('snow colour', 'p'), |
color_scheme = _ifset('snow colour', 'p'), |
||
scale_factor = '0.2', |
scale_factor = '0.2', |
||
label = makeLabel(args, false, 'Average extreme snow depth', 'snow depth'), |
label = makeLabel(args, options, false, 'Average extreme snow depth', 'snow depth'), |
||
annual_mode = 'max', |
annual_mode = 'max', |
||
}, |
}, |
||
Line 424: | Line 445: | ||
color_scheme = _ifset('temperature colour', 't'), |
color_scheme = _ifset('temperature colour', 't'), |
||
scale_factor = '1', |
scale_factor = '1', |
||
label = 'Average [[dew point]] °' .. _if('metric first', 'C', 'F') .. |
label = 'Average [[dew point]] °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'), |
||
annual_mode = 'avg', |
annual_mode = 'avg', |
||
}, |
}, |
||
{---------- SECOND LINE AVERAGE DEW POINT---------- |
{---------- SECOND LINE AVERAGE DEW POINT---------- |
||
WANTROW = not |
WANTROW = not options.wantSingleLine and (_ifany(' dew point C') or _ifany(' dew point F')), |
||
mode = 'temperature', |
mode = 'temperature', |
||
group_name = 'dew point', |
group_name = 'dew point', |
||
Line 489: | Line 510: | ||
makeSources(frame, args), |
makeSources(frame, args), |
||
} |
} |
||
⚫ | |||
local function makeFrame(self_args, parent_args) |
|||
-- Kludge to pass arguments for a single row to buildRow. |
|||
-- Later: Refactor buildRow so this is not needed. |
|||
return { |
|||
args = self_args, |
|||
getParent = function (self) return makeFrame(parent_args, nil) end, |
|||
} |
|||
end |
end |
||
local function main(frame) |
local function main(frame) |
||
local sandbox = frame:getTitle():find('sandbox', 1, true) and '/sandbox' or '' |
|||
local buildRow = require('Module:Weather box/row'). |
local buildRow = require('Module:Weather box/row' .. sandbox)._buildRow |
||
local args = frame:getParent().args |
local args = frame:getParent().args |
||
local options = { |
|||
wantSingleLine = wantSingle(args['single line']), |
|||
sandbox = sandbox, |
|||
⚫ | |||
local results = {} |
local results = {} |
||
for i, |
for i, definition in ipairs(getDefinitions(frame, args, options)) do |
||
local row |
local row |
||
if type( |
if type(definition) == 'string' then |
||
row = |
row = definition |
||
elseif |
elseif definition.WANTROW then |
||
row = buildRow( |
row = buildRow(definition, args, options) |
||
else |
else |
||
row = '' |
row = '' |
Revision as of 11:01, 1 July 2022
![]() | This Lua module is used on approximately 31,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
Usage
This module is used by {{Weather box}}.
{{#invoke:Weather box|function_name}}
Climate data for Edmonton City Centre (Blatchford Field) Airport (1981−2010) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Month | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Year |
Record high °C (°F) | 11.7 (53.1) |
14.0 (57.2) |
23.9 (75.0) |
31.1 (88.0) |
32.3 (90.1) |
34.9 (94.8) |
34.6 (94.3) |
34.5 (94.1) |
33.9 (93.0) |
28.6 (83.5) |
21.7 (71.1) |
16.7 (62.1) |
34.9 (94.8) |
Average high °C (°F) | −6.0 (21.2) |
−2.7 (27.1) |
2.2 (36.0) |
11.2 (52.2) |
17.5 (63.5) |
21.0 (69.8) |
23.1 (73.6) |
22.6 (72.7) |
17.1 (62.8) |
10.4 (50.7) |
0.0 (32.0) |
−4.5 (23.9) |
9.3 (48.7) |
Daily mean °C (°F) | −10.4 (13.3) |
−7.6 (18.3) |
−2.5 (27.5) |
5.4 (41.7) |
11.5 (52.7) |
15.5 (59.9) |
17.7 (63.9) |
16.9 (62.4) |
11.4 (52.5) |
5.1 (41.2) |
−4.1 (24.6) |
−8.8 (16.2) |
4.2 (39.6) |
Average low °C (°F) | −14.8 (5.4) |
−12.5 (9.5) |
−7.2 (19.0) |
−0.5 (31.1) |
5.4 (41.7) |
9.9 (49.8) |
12.3 (54.1) |
11.3 (52.3) |
5.8 (42.4) |
−0.2 (31.6) |
−8.2 (17.2) |
−13.1 (8.4) |
−1.0 (30.2) |
Record low °C (°F) | −44.4 (−47.9) |
−46.1 (−51.0) |
−36.1 (−33.0) |
−25.6 (−14.1) |
−12.2 (10.0) |
−1.1 (30.0) |
0.6 (33.1) |
−1.2 (29.8) |
−11.7 (10.9) |
−25.0 (−13.0) |
−34.1 (−29.4) |
−48.3 (−54.9) |
−48.3 (−54.9) |
Record low wind chill | −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 |
Average precipitation mm (inches) | 21.7 (0.85) |
12.0 (0.47) |
15.8 (0.62) |
28.8 (1.13) |
46.1 (1.81) |
77.5 (3.05) |
93.8 (3.69) |
61.9 (2.44) |
43.5 (1.71) |
21.7 (0.85) |
18.0 (0.71) |
15.0 (0.59) |
455.7 (17.94) |
Average rainfall mm (inches) | 1.3 (0.05) |
0.76 (0.03) |
1.7 (0.07) |
14.5 (0.57) |
40.7 (1.60) |
77.5 (3.05) |
93.8 (3.69) |
61.8 (2.43) |
42.4 (1.67) |
10.9 (0.43) |
1.6 (0.06) |
0.73 (0.03) |
347.8 (13.69) |
Average snowfall cm (inches) | 24.5 (9.6) |
13.4 (5.3) |
17.4 (6.9) |
15.3 (6.0) |
4.9 (1.9) |
0.0 (0.0) |
0.0 (0.0) |
0.0 (0.0) |
1.0 (0.4) |
11.6 (4.6) |
19.1 (7.5) |
16.4 (6.5) |
123.5 (48.6) |
Average precipitation days (≥ 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 |
Average rainy days (≥ 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 |
Average snowy days (≥ 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 |
Average relative humidity (%) | 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 |
Mean monthly sunshine hours | 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 |
Percent possible sunshine | 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 |
Average ultraviolet index | 0 | 1 | 3 | 5 | 7 | 9 | 11 | 9 | 7 | 5 | 3 | 1 | 5 |
Source: Environment Canada,[1] Weather Atlas[2] |
References
- ^ "Edmonton City Centre Airport". Canadian Climate Normals 1981−2010. Environment Canada. August 19, 2013. Retrieved September 10, 2013.
- ^ "Monthly weather forecast and Climate: Edmonton, Canada". Weather Atlas. Retrieved March 12, 2019.
-- Implement [[Template:Weather box]].
local _precision = require('Module:Math')._precision
local function precision(text)
-- Input like 'Jan precipitation inch = trace' calls this with text = 'trace'
-- which would cause _precision to throw an error since it is not numeric.
-- Workaround: Return 0 as the precision if an error occurs.
local success, result = pcall(_precision, text)
if success then
return result
end
return 0
end
local function stripToNil(text)
-- If text is a non-empty string, return its trimmed content.
-- Otherwise, return nothing (text is an empty string or is not a string).
if type(text) == 'string' then
return text:match('(%S.-)%s*$')
end
end
local function isAny(args, suffix)
local months = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' }
for _, month in ipairs(months) do
if stripToNil(args[month .. suffix]) then
return true
end
end
end
local function makeLabel(args, options, is_first, base, what)
local first
if isAny(args, ' ' .. what .. ' cm') then
first = 'cm'
else
if isAny(args, ' ' .. what .. ' mm') then
first = 'mm'
else
first = (what == 'snow' or
precision(args['Jan ' .. what .. ' inch'] or '0') < 1)
and 'cm'
or 'mm'
end
end
local second = 'inches'
if not stripToNil(args['metric first']) then
first, second = second, first
end
if is_first then
if options.wantSingleLine then
first = first .. ' (' .. second .. ')'
end
else
first = second
end
return base .. ' ' .. first
end
local function makeSources(frame, args)
local source1 = stripToNil(args.source) or stripToNil(args['source 1'])
local source2 = stripToNil(args['source 2']) or stripToNil(args['source2'])
local result = '|-\n|colspan="14" style="text-align:center;font-size:95%;"|'
local text
if source1 or source2 then
if source1 and source2 then
text = 'Source 1: ' .. source1 .. '\n' .. result .. 'Source 2: ' .. source2
else
text = 'Source: ' .. (source1 and source1 or source2)
end
else
text = frame:expandTemplate({ title = 'citation needed', args = {date = stripToNil(args.date)} })
end
return result .. text .. '\n|}'
end
local function wantSingle(parm)
--------------------------------------------------------------------------------
-- Result before July 2022 for single_line setting:
-- blank/omitted : separate table rows for metric and imperial (two rows)
-- N : bug: only one row with either metric or imperial (not both)
-- but heading like "cm (inches)"
-- Y/junk : single row with both metric/imperial in same cell
--------------------------------------------------------------------------------
-- Intend changing in July 2022 so single_line=Y is the default and
-- need single_line=N for separate lines.
-- However, this release (1 July 2022) keeps blank/omitted as meaning "no"
-- so the other large changes can be tested before switching the default.
parm = (parm or ''):lower()
return not (parm == 'no' or parm == 'n' or parm == '')
end
local function getDefinitions(frame, args, options)
-- Return a list of tables or strings that define each row.
local function _if(parm, a, b)
return stripToNil(args[parm]) and a or b or ''
end
local function _ifset(parm, a)
return stripToNil(args[parm]) and args[parm] or a
end
local function _ifany(suffix)
return isAny(args, suffix)
end
local function _ifSingle(a, b)
return options.wantSingleLine and a or b or ''
end
local location = _if('location', args.location, '{{{location}}}') -- show "{{{location}}}" to alert editor if parameter is blank
local navbarText
if not stripToNil(args.open) then
if stripToNil(args.name) then
local navbar = require('Module:Navbar')._navbar
navbarText = navbar({'Climate data for ' .. location, args.name, collapsible=1})
end
end
return {
----------- HEADER ----------
'{| class="wikitable ' .. _if('open', '', 'mw-collapsible' .. _if('collapsed', ' mw-collapsed')) ..
'" style="width:' .. _ifset('width', 'auto') ..
'; text-align:center; line-height: 1.2em; margin:' ..
_ifset('margin', '') .. ';"' ..
_if('open',
'\n|+Climate data for ' .. location,
'\n|-' ..
'\n!colspan="14" | ' .. _if('name', navbarText, 'Climate data for ' .. location)
) ..
[=[
|-
!scope="row" |Month
!scope="col" |Jan
!scope="col" |Feb
!scope="col" |Mar
!scope="col" |Apr
!scope="col" |May
!scope="col" |Jun
!scope="col" |Jul
!scope="col" |Aug
!scope="col" |Sep
!scope="col" |Oct
!scope="col" |Nov
!scope="col" |Dec
!scope="col" style="border-left-width:medium" |Year
]=],
{---------- FIRST LINE MAXIMUM HUMIDEX ----------
WANTROW = _ifany(' maximum humidex') and (_ifset('metric first') or options.wantSingleLine),
mode = 'basic',
group_name = 'maximum humidex',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Record high [[humidex]]',
annual_mode = 'max',
},
{---------- FIRST LINE RECORD HIGH TEMPERATURES ----------
WANTROW = _ifany(' record high C') or _ifany(' record high F'),
mode = 'temperature',
group_name = 'record high',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Record high °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'max',
},
{---------- FIRST-SECOND LINE AVG MONTHLY MAXIMUM TEMPERATURES ----------
WANTROW = _ifany(' avg record high C') or _ifany(' avg record high F'),
mode = 'temperature',
group_name = 'avg record high',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Mean maximum °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'max',
},
{---------- FIRST LINE AVERAGE HIGH TEMPERATURES ----------
WANTROW = _ifany(' high C') or _ifany(' high F'),
mode = 'temperature',
group_name = 'high',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Average high °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'avg',
},
{---------- FIRST LINE DAILY MEAN TEMPERATURES ----------
WANTROW = _ifany(' mean C') or _ifany(' mean F'),
mode = 'temperature',
group_name = 'mean',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Daily mean °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'avg',
},
{---------- FIRST LINE AVERAGE LOW TEMPERATURES ----------
WANTROW = _ifany(' low C') or _ifany(' low F'),
mode = 'temperature',
group_name = 'low',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Average low °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'avg',
},
{---------- FIRST-SECOND LINE AVG MONTHLY MINIMUM TEMPERATURES ----------
WANTROW = _ifany(' avg record low C') or _ifany(' avg record low F'),
mode = 'temperature',
group_name = 'avg record low',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Mean minimum °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'min',
},
{---------- FIRST LINE RECORD LOW TEMPERATURES ----------
WANTROW = _ifany(' record low C') or _ifany(' record low F'),
mode = 'temperature',
group_name = 'record low',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Record low °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'min',
},
{---------- FIRST LINE MINIMUM WIND CHILL ----------
WANTROW = _ifany(' chill') and (_ifset('metric first') or options.wantSingleLine),
mode = 'basic',
group_name = 'chill',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Record low [[wind chill]]',
annual_mode = 'min',
},
{---------- FIRST LINE TOTAL PRECIPITATION ----------
WANTROW = _ifany(' precipitation cm') or _ifany(' precipitation mm') or _ifany(' precipitation inch'),
mode = 'precipitation',
group_name = 'precipitation',
color_scheme = _ifset('precipitation colour', 'p'),
date_mode = true,
scale_factor = '1',
prefer_cm = precision(_ifset('Jan precipitation inch', '0')) < 1,
label = makeLabel(args, options, true, 'Average [[precipitation]]', 'precipitation'),
annual_mode = 'sum',
},
{---------- FIRST LINE RAINFALL ----------
WANTROW = _ifany(' rain cm') or _ifany(' rain mm') or _ifany(' rain inch'),
mode = 'precipitation',
group_name = 'rain',
color_scheme = _ifset('rain colour', 'p'),
date_mode = true,
scale_factor = '1',
prefer_cm = precision(_ifset('Jan rain inch', '0')) < 1,
label = makeLabel(args, options, true, 'Average rainfall', 'rain'),
annual_mode = 'sum',
},
{---------- FIRST LINE SNOWFALL ----------
WANTROW = _ifany(' snow cm') or _ifany(' snow mm') or _ifany(' snow inch'),
mode = 'precipitation',
group_name = 'snow',
prefer_cm = true,
color_scheme = _ifset('snow colour', 'p'),
date_mode = true,
scale_factor = '1',
label = makeLabel(args, options, true, 'Average snowfall', 'snow'),
annual_mode = 'sum',
},
{---------- FIRST LINE AVERAGE EXTREME SNOW DEPTH ----------
WANTROW = _ifany(' snow depth cm') or _ifany(' snow depth mm') or _ifany(' snow depth inch'),
mode = 'precipitation',
group_name = 'snow depth',
prefer_cm = true,
color_scheme = _ifset('snow colour', 'p'),
scale_factor = '0.2',
label = makeLabel(args, options, true, 'Average extreme snow depth', 'snow depth'),
annual_mode = 'max',
},
{---------- SECOND LINE MAXIMUM HUMIDEX ----------
WANTROW = not options.wantSingleLine and _ifany(' maximum humidex'),
mode = 'basic',
group_name = 'maximum humidex',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = '[[Humidex]]',
annual_mode = 'max',
second_line = true,
},
{---------- SECOND LINE RECORD HIGH TEMPERATURES ----------
WANTROW = not options.wantSingleLine and (_ifany(' record high C') or _ifany(' record high F')),
mode = 'temperature',
group_name = 'record high',
second_line = true,
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Record high °' .. _if('metric first', 'F', 'C'),
annual_mode = 'max',
},
{---------- SECOND LINE AVERAGE HIGH TEMPERATURES ----------
WANTROW = not options.wantSingleLine and (_ifany(' high C') or _ifany(' high F')),
mode = 'temperature',
group_name = 'high',
second_line = true,
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Average high °' .. _if('metric first', 'F', 'C'),
annual_mode = 'avg',
},
{---------- SECOND LINE DAILY MEAN TEMPERATURES ----------
WANTROW = not options.wantSingleLine and (_ifany(' mean C') or _ifany(' mean F')),
mode = 'temperature',
group_name = 'mean',
second_line = true,
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Daily mean °' .. _if('metric first', 'F', 'C'),
show = _if('metric first', '2', '1'),
annual_mode = 'avg',
},
{---------- SECOND LINE AVERAGE LOW TEMPERATURES ----------
WANTROW = not options.wantSingleLine and (_ifany(' low C') or _ifany(' low F')),
mode = 'temperature',
group_name = 'low',
second_line = true,
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Average low °' .. _if('metric first', 'F', 'C'),
show = _if('metric first', '2', '1'),
annual_mode = 'avg',
},
{---------- SECOND LINE RECORD LOW TEMPERATURES ----------
WANTROW = not options.wantSingleLine and (_ifany(' record low C') or _ifany(' record low F')),
mode = 'temperature',
group_name = 'record low',
second_line = true,
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Record low °' .. _if('metric first', 'F', 'C'),
show = _if('metric first', '2', '1'),
annual_mode = 'min',
},
{---------- SECOND LINE MINIMUM WIND CHILL ----------
WANTROW = not options.wantSingleLine and (_ifany(' chill') and _if('metric first')),
mode = 'basic',
group_name = 'chill',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = '[[Wind chill]]',
annual_mode = 'min',
},
{---------- SECOND LINE TOTAL PRECIPITATION ----------
WANTROW = not options.wantSingleLine and (_ifany(' precipitation cm') or _ifany(' precipitation mm') or _ifany(' precipitation inch')),
mode = 'precipitation',
group_name = 'precipitation',
second_line = true,
color_scheme = _ifset('precipitation colour', 'p'),
date_mode = true,
scale_factor = '1',
prefer_cm = precision(_ifset('Jan precipitation inch', '0')) < 1,
label = makeLabel(args, options, false, 'Average [[precipitation]]', 'precipitation'),
annual_mode = 'sum',
},
{---------- SECOND LINE RAINFALL ----------
WANTROW = not options.wantSingleLine and (_ifany(' rain cm') or _ifany(' rain mm') or _ifany(' rain inch')),
mode = 'precipitation',
group_name = 'rain',
second_line = true,
color_scheme = _ifset('rain colour', 'p'),
date_mode = true,
scale_factor = '1',
prefer_cm = precision(_ifset('Jan rain inch', '0')) < 1,
label = makeLabel(args, options, false, 'Average rainfall', 'rain'),
annual_mode = 'sum',
},
{---------- SECOND LINE SNOWFALL ----------
WANTROW = not options.wantSingleLine and (_ifany(' snow cm') or _ifany(' snow mm') or _ifany(' snow inch')),
mode = 'precipitation',
group_name = 'snow',
second_line = true,
prefer_cm = true,
color_scheme = _ifset('snow colour', 'p'),
date_mode = true,
scale_factor = '1',
label = makeLabel(args, options, false, 'Average snowfall', 'snow'),
annual_mode = 'sum',
},
{---------- SECOND LINE AVERAGE EXTREME SNOW DEPTH ----------
WANTROW = not options.wantSingleLine and (_ifany(' snow depth cm') or _ifany(' snow depth mm') or _ifany(' snow depth inch')),
mode = 'precipitation',
group_name = 'snow depth',
second_line = true,
prefer_cm = true,
color_scheme = _ifset('snow colour', 'p'),
scale_factor = '0.2',
label = makeLabel(args, options, false, 'Average extreme snow depth', 'snow depth'),
annual_mode = 'max',
},
{---------- PRECIPITATION DAYS ----------
WANTROW = _ifany(' precipitation days'),
mode = 'basic',
group_name = 'precipitation days',
color_scheme = _ifset('precip days colour', 'd'),
date_mode = true,
scale_factor = '1',
label = 'Average precipitation days' .. _if('unit precipitation days', ' <span style="font-size:90%;" class="nowrap">(≥ ' .. _ifset('unit precipitation days', '') .. ')</span>'),
annual_mode = 'sum',
},
{---------- RAINY DAYS ----------
WANTROW = _ifany(' rain days'),
mode = 'basic',
group_name = 'rain days',
color_scheme = _ifset('precip days colour', 'd'),
date_mode = true,
scale_factor = '1',
label = 'Average rainy days' .. _if('unit rain days', ' <span style="font-size:90%;" class="nowrap">(≥ ' .. _ifset('unit rain days', '') .. ')</span>'),
annual_mode = 'sum',
},
{---------- SNOWY DAYS ----------
WANTROW = _ifany(' snow days'),
mode = 'basic',
group_name = 'snow days',
color_scheme = _ifset('precip days colour', 'd'),
date_mode = true,
scale_factor = '1',
label = 'Average snowy days' .. _if('unit snow days', ' <span style="font-size:90%;" class="nowrap">(≥ ' .. _ifset('unit snow days', '') .. ')</span>'),
annual_mode = 'sum',
},
{---------- PERCENT RELATIVE HUMIDITY ----------
WANTROW = _ifany(' humidity'),
mode = 'basic',
group_name = 'humidity',
color_scheme = _ifset('humidity colour', 'h'),
scale_factor = '1',
label = 'Average [[relative humidity]] (%)' ..
_if('time day', ' <span style="font-size:90%;" class="nowrap">(at ' .. _ifset('time day', '') .. ')</span>') ..
_if('daily', ' <span style="font-size:90%;" class="nowrap">(daily average)</span>'),
annual_mode = 'avg',
},
{---------- AFTERNOON PERCENT RELATIVE HUMIDITY ----------
WANTROW = _ifany(' afthumidity'),
mode = 'basic',
group_name = 'afthumidity',
color_scheme = _ifset('humidity colour', 'h'),
scale_factor = '1',
label = 'Average afternoon [[relative humidity]] (%)' ..
_if('time day', ' <span style="font-size:90%;" class="nowrap">(at ' .. _ifset('time day', '') .. ')</span>') ..
_if('daily', ' <span style="font-size:90%;" class="nowrap">(daily average)</span>'),
annual_mode = 'avg',
},
{---------- FIRST LINE AVERAGE DEW POINT ----------
WANTROW = _ifany(' dew point C') or _ifany(' dew point F'),
mode = 'temperature',
group_name = 'dew point',
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Average [[dew point]] °' .. _if('metric first', 'C', 'F') .. _ifSingle(' (°' .. _if('metric first', 'F', 'C') .. ')'),
annual_mode = 'avg',
},
{---------- SECOND LINE AVERAGE DEW POINT----------
WANTROW = not options.wantSingleLine and (_ifany(' dew point C') or _ifany(' dew point F')),
mode = 'temperature',
group_name = 'dew point',
second_line = true,
color_scheme = _ifset('temperature colour', 't'),
scale_factor = '1',
label = 'Average [[dew point]] °' .. _if('metric first', 'F', 'C'),
show = _if('metric first', '2', '1'),
annual_mode = 'avg',
},
{---------- MONTHLY SUNSHINE HOURS ----------
WANTROW = _ifany(' sun'),
mode = 'basic',
group_name = 'sun',
color_scheme = _ifset('sun colour', 's'),
date_mode = true,
scale_factor = '1',
label = 'Mean monthly [[Sunshine duration|sunshine hours]]',
annual_mode = 'sum',
},
{---------- DAILY SUNSHINE HOURS ----------
WANTROW = _ifany('d sun'),
mode = 'basic',
group_name = 'd sun',
color_scheme = _ifset('sun colour', 's'),
include_space = false,
scale_factor = '30.44',
label = 'Mean daily [[Sunshine duration|sunshine hours]]',
annual_mode = 'avg',
},
{---------- DAILY DAYLIGHT HOURS ----------
WANTROW = _ifany(' light'),
mode = 'basic',
group_name = ' light',
color_scheme = _ifset('sun colour', 's'),
include_space = false,
scale_factor = '30.44',
label = 'Mean daily [[Daytime|daylight hours]]',
annual_mode = 'avg',
},
{---------- PERCENT SUNSHINE ----------
WANTROW = _ifany(' percentsun'),
mode = 'basic',
group_name = 'percentsun',
color_scheme = _ifset('sun colour', 's'),
scale_factor = '7.2',
label = 'Percent [[Sunshine duration|possible sunshine]]',
annual_mode = 'avg',
},
{---------- ULTRAVIOLET INDEX ----------
WANTROW = _ifany(' uv'),
mode = 'basic',
group_name = 'uv',
color_scheme = _ifset('uv colour', 'u'),
scale_factor = '1',
label = 'Average [[ultraviolet index]]',
annual_mode = 'avg',
},
----------- SOURCES ----------
makeSources(frame, args),
}
end
local function main(frame)
local sandbox = frame:getTitle():find('sandbox', 1, true) and '/sandbox' or ''
local buildRow = require('Module:Weather box/row' .. sandbox)._buildRow
local args = frame:getParent().args
local options = {
wantSingleLine = wantSingle(args['single line']),
sandbox = sandbox,
}
local results = {}
for i, definition in ipairs(getDefinitions(frame, args, options)) do
local row
if type(definition) == 'string' then
row = definition
elseif definition.WANTROW then
row = buildRow(definition, args, options)
else
row = ''
end
results[i] = row
end
return '<div>\n'..table.concat(results)..'\n</div>' -- prevent Scribunto from inserting a blank line before the table
end
return {
main = main,
}