模块:WeatherBox

来自云南百科

此模块的文档可以在Module:WeatherBox/doc创建

-- Implement [[Template:Weather box]].

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 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 = '数据来源 1:' .. source1 .. '\n' .. result .. '数据来源 2:' .. source2
		else
			text = '数据来源:' .. (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 getDefinitions(frame, args)
	-- Return a list of tables or strings that define each row.
	local navbar = require('Module:Navbar')._navbar
	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
	return {

----------- HEADER ----------
'{| class="wikitable ' .. _if('open', '', 'mw-collapsible' .. _if('collapsed', ' mw-collapsed')) ..
'" style="width:' .. _ifset('width', '100%') ..
'; text-align:center; font-size:90%; line-height: 1.2em; margin:' ..
_ifset('margin', 'auto') .. ';"' ..
_if('open',
	-- Following intentionally shows "{{{location}}}" if parameter is blank to alert editor.
	'\n|+ ' .. _if('location', args.location, '{{{location}}}'),
	'\n|-' ..
	'\n!colspan="14" | ' ..
	_if('name',
		navbar({' ' .. _if('location', args.location, '{{{location}}}'), args.name, collapsible=1}),
		' ' .. _if('location', args.location, '{{{location}}}')
	)
) ..
[=[

|-
!scope="row" |月份
!scope="col" |1月
!scope="col" |2月
!scope="col" |3月
!scope="col" |4月
!scope="col" |5月
!scope="col" |6月
!scope="col" |7月
!scope="col" |8月
!scope="col" |9月
!scope="col" |10月
!scope="col" |11月
!scope="col" |12月
!scope="col" style="border-left-width:medium" |全年
]=],

{---------- FIRST LINE RECORD HIGH TEMPERATURES ----------
	WANTROW = _ifany(' record high C'),
	mode = 'temperature',
	group_name = 'record high',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">历史最高温<small>(°C)</small></span>',
	annual_mode = 'max',
},
{---------- FIRST-SECOND LINE AVG MONTHLY MAXIMUM TEMPERATURES ----------
	WANTROW = _ifany(' avg record high C'),
	mode = 'temperature',
	group_name = 'avg record high',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">平均最高温<small>(°C)</small></span>',
	annual_mode = 'max',
},
{---------- FIRST LINE AVERAGE HIGH TEMPERATURES ----------
	WANTROW = _ifany(' high C'),
	mode = 'temperature',
	group_name = 'high',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">平均高温<small>(°C)</small></span>',
	annual_mode = 'avg',
},
{---------- FIRST LINE DAILY MEAN TEMPERATURES ----------
	WANTROW = _ifany(' mean C'),
	mode = 'temperature',
	group_name = 'mean',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">日均气温<small>(°C)</small></span>',
	annual_mode = 'avg',
},
{---------- FIRST LINE AVERAGE LOW TEMPERATURES ----------
	WANTROW = _ifany(' low C'),
	mode = 'temperature',
	group_name = 'low',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">平均低温<small>(°C)</small></span>',
	annual_mode = 'avg',
},
{---------- FIRST-SECOND LINE AVG MONTHLY MINIMUM TEMPERATURES ----------
	WANTROW = _ifany(' avg record low C'),
	mode = 'temperature',
	group_name = 'avg record low',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">平均最低温<small>(°C)</small></span>',
	annual_mode = 'min',
},
{---------- FIRST LINE RECORD LOW TEMPERATURES ----------
	WANTROW = _ifany(' record low C'),
	mode = 'temperature',
	group_name = 'record low',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">历史最低温<small>(°C)</small></span>',
	annual_mode = 'min',
},
{---------- FIRST LINE MINIMUM WIND CHILL ----------
	WANTROW = _ifany(' chill'),
	mode = 'basic',
	group_name = 'chill',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '历史最低風寒指數',
	annual_mode = 'min',
},
{---------- FIRST LINE TOTAL PRECIPITATION ----------
	WANTROW = _ifany(' precipitation cm') or _ifany(' precipitation mm'),
	mode = 'precipitation',
	group_name = 'precipitation',
	color_scheme = _ifset('precipitation colour', 'p'),
	date_mode = true,
	scale_factor = '1',
	label = '平均降水量<small>(mm)</small>',
	annual_mode = 'sum',
},
{---------- FIRST LINE RAINFALL ----------
	WANTROW = _ifany(' rain cm') or _ifany(' rain mm'),
	mode = 'precipitation',
	group_name = 'rain',
	color_scheme = _ifset('rain colour', 'p'),
	date_mode = true,
	scale_factor = '1',
	label = '平均降雨量<small>(mm)</small>',
	annual_mode = 'sum',
},
{---------- FIRST LINE SNOWFALL ----------
	WANTROW = _ifany(' snow cm') or _ifany(' snow mm'),
	mode = 'precipitation',
	group_name = 'snow',
	prefer_cm = true,
	color_scheme = _ifset('snow colour', 'p'),
	date_mode = true,
	scale_factor = '1',
	label = '平均降雪量<small>(cm)</small>',
	annual_mode = 'sum',
},
{---------- FIRST LINE AVERAGE EXTREME SNOW DEPTH ----------
	WANTROW = _ifany(' snow depth cm') or _ifany(' snow depth mm'),
	mode = 'precipitation',
	group_name = 'snow depth',
	prefer_cm = true,
	color_scheme = _ifset('snow colour', 'p'),
	scale_factor = '0.2',
	label = '平均最大雪深',
	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 = '平均降水天数' .. _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 = '平均降雨天数' .. _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 = '平均降雪天数' .. _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 = '平均相對濕度<small>(%)</small>' ..
		_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 = '平均午後相對濕度<small>(%)</small>' ..
		_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'),
	mode = 'temperature',
	group_name = 'dew point',
	color_scheme = _ifset('temperature colour', 't'),
	scale_factor = '1',
	label = '<span class="nowrap">平均露点<small>(°C)</small></span>',
	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 = '月均日照時數',
	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 = '日均日照時數',
	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 = '日均昼长',
	annual_mode = 'avg',
},
{---------- PERCENT SUNSHINE ----------
	WANTROW = _ifany(' percentsun'),
	mode = 'basic',
	group_name = 'percentsun',
	color_scheme = _ifset('sun colour', 's'),
	scale_factor = '7.2',
	label = '可照百分比',
	annual_mode = 'avg',
},
{---------- ULTRAVIOLET INDEX ----------
	WANTROW = _ifany(' uv'),
	mode = 'basic',
	group_name = 'uv',
	color_scheme = _ifset('uv colour', 'u'),
	scale_factor = '1',
	label = '平均紫外线指数',
	annual_mode = 'avg',
},
----------- SOURCES ----------
makeSources(frame, args),
}
end

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

local function main(frame)
	local buildRow = require('Module:WeatherBox/row').buildRow
	local args = frame:getParent().args
	local results = {}
	for i, def in ipairs(getDefinitions(frame, args)) do
		local row
		if type(def) == 'string' then
			row = def
		elseif def.WANTROW then
			row = buildRow(makeFrame(def, args))
		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,
}