Přeskočit na obsah

Modul:Weather box

Z Wikipedie, otevřené encyklopedie
V tomto článku byl použit překlad textu z článku Module:Weather box na anglické Wikipedii.
-- Implement [[Template:Weather box]].

local precision = require('Module:Math')._precision

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 = { 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec' }
	for _, month in ipairs(months) do
		if stripToNil(args[month .. suffix]) then
			return true
		end
	end
end

local function makeLabel(args, 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 == 'sníh' or
				precision(args['leden ' .. what .. ' palce'] or '0') < 1)
					and 'cm'
					or 'mm'
		end
	end
	local second = 'palce'
	if stripToNil(args['nejprve imperiální']) then
		first, second = second, first
	end
	if is_first then
		if stripToNil(args['jeden řádek']) then
			first = first .. ' (' .. second .. ')'
		end
	else
		first = second
	end
	return base .. ' ' .. first
end

local function makeSources(frame, args)
	local source1 = stripToNil(args['zdroj']) or stripToNil(args['zdroj 1']) or stripToNil(args['zdroj1'])
	local source2 = stripToNil(args['zdroj 2']) or stripToNil(args['zdroj2'])
	local result = '|-\n|colspan="14" style="text-align:center;font-size:88%;"|'
	local text
	if source1 or source2 then
		if source1 and source2 then
			text = 'Zdroj 1: ' .. source1 .. '\n' .. 'Zdroj 2: ' .. source2
		else
			text = 'Zdroj: ' .. (source1 and source1 or source2)
		end
	else
		text = frame:expandTemplate({ title = 'doplňte zdroj', args = {date = stripToNil(args['datum přístupu'])} })
	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', '', 'collapsible' .. _if('collapsed', ' collapsed')) ..
'" style="width:' .. _ifset('width', '100%') ..
'; text-align:center; line-height: 1.2em; margin:' ..
_ifset('margin', 'auto') .. ';"' ..
_if('open',
	-- Following intentionally shows "{{{location}}}" if parameter is blank to alert editor.
	'\n|+' .. _if('místo', args['místo'], '{{{místo}}}') .. ' – podnebí',
	'\n|-' ..
	'\n!colspan="14" | ' ..
	_if('name',
		navbar({_if('místo', args['místo'], '{{{místo}}}') .. ' – podnebí', args['název'], collapsible=1}),
		_if('místo', args['místo'], '{{{místo}}}') .. ' – podnebí'
	)
) ..
[=[

|-
!scope="row" |Měsíc
!scope="col" |leden
!scope="col" |únor
!scope="col" |březen
!scope="col" |duben
!scope="col" |květen
!scope="col" |červen
!scope="col" |červenec
!scope="col" |srpen
!scope="col" |září
!scope="col" |říjen
!scope="col" |listopad
!scope="col" |prosinec
!scope="col" style="border-left-width:medium" |Rok
]=],

{---------- FIRST LINE maximální humidex ----------
	WANTROW = _ifany(' maximální humidex') and (not _ifset('nejprve imperiální') or _ifset('jeden řádek')),
	mode = 'výchozí',
	group_name = 'maximální humidex',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Maximální [[humidex]]',
	annual_mode = 'max',
},
{---------- FIRST LINE nejvyšší teplota TEMPERATURES ----------
	WANTROW = _ifany(' nejvyšší teplota C') or _ifany(' nejvyšší teplota F'),
	mode = 'teplota',
	group_name = 'nejvyšší teplota',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Nejvyšší teplota [°' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')') .. ']',
	annual_mode = 'max',
},
{---------- FIRST-SECOND LINE AVG MONTHLY MAXIMUM TEMPERATURES ----------
	WANTROW = _ifany(' avg record high C') or _ifany(' avg record high F'),
	mode = 'teplota',
	group_name = 'avg record high',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Mean maximum °' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')'),
	annual_mode = 'max',
},
{---------- FIRST LINE AVERAGE HIGH TEMPERATURES ----------
	WANTROW = _ifany(' high C') or _ifany(' high F'),
	mode = 'teplota',
	group_name = 'high',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Average high °' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')'),
	annual_mode = 'avg',
},
{---------- FIRST LINE DAILY MEAN TEMPERATURES ----------
	WANTROW = _ifany(' průměrná teplota C') or _ifany(' průměrná teplota F'),
	mode = 'teplota',
	group_name = 'průměrná teplota',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Průměrná teplota [°' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')') .. ']',
	annual_mode = 'avg',
},
{---------- FIRST LINE AVERAGE LOW TEMPERATURES ----------
	WANTROW = _ifany(' low C') or _ifany(' low F'),
	mode = 'teplota',
	group_name = 'low',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Average low °' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')'),
	annual_mode = 'avg',
},
{---------- FIRST-SECOND LINE AVG MONTHLY MINIMUM TEMPERATURES ----------
	WANTROW = _ifany(' avg record low C') or _ifany(' avg record low F'),
	mode = 'teplota',
	group_name = 'avg record low',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Mean minimum °' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')'),
	annual_mode = 'min',
},
{---------- FIRST LINE RECORD LOW TEMPERATURES ----------
	WANTROW = _ifany(' nejnižší teplota C') or _ifany(' nejnižší teplota F'),
	mode = 'teplota',
	group_name = 'nejnižší teplota',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Nejnižší teplota [°' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')') .. ']',
	annual_mode = 'min',
},
{---------- FIRST LINE MINIMUM WIND CHILL ----------
	WANTROW = _ifany(' chill') and (not _ifset('nejprve imperiální') or _ifset('jeden řádek')),
	mode = 'výchozí',
	group_name = 'chill',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Record low [[wind chill]]',
	annual_mode = 'min',
},
{---------- FIRST LINE TOTAL srážky ----------
	WANTROW = _ifany(' srážky cm') or _ifany(' srážky mm') or _ifany(' srážky palce'),
	mode = 'srážky',
	group_name = 'srážky',
	color_scheme = _ifset('barva srážek', 'p'),
	date_mode = true,
	scale_factor = '1',
	prefer_cm = precision(_ifset('leden srážky palce', '0')) < 1,
	label = makeLabel(args, true, '[[Srážky]]', 'srážky'),
	annual_mode = 'sum',
},
{---------- FIRST LINE maximální srážky ----------
	WANTROW = _ifany(' maximální srážky cm') or _ifany(' maximální srážky mm') or _ifany(' maximální srážky palce'),
	mode = 'srážky',
	group_name = 'maximální srážky',
	color_scheme = _ifset('barva deště', 'p'),
	date_mode = true,
	scale_factor = '1',
	prefer_cm = precision(_ifset('leden maximální srážky palce', '0')) < 1,
	label = makeLabel(args, true, 'Maximální srážky', 'maximální srážky'),
	annual_mode = 'sum',
},
{---------- FIRST LINE sníhFALL ----------
	WANTROW = _ifany(' sníh cm') or _ifany(' sníh mm') or _ifany(' sníh palce'),
	mode = 'srážky',
	group_name = 'sníh',
	prefer_cm = true,
	color_scheme = _ifset('barva sněhu', 'p'),
	date_mode = true,
	scale_factor = '1',
	label = makeLabel(args, true, '[[Sníh]]', 'sníh'),
	annual_mode = 'sum',
},
{---------- SECOND LINE maximální humidex ----------
	WANTROW = not _ifset('jeden řádek') and _ifany(' maximální humidex'),
	mode = 'výchozí',
	group_name = 'maximální humidex',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = '[[Humidex]]',
	annual_mode = 'max',
	second_line = true,
},
{---------- SECOND LINE nejvyšší teplota TEMPERATURES ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' nejvyšší teplota C') or _ifany(' nejvyšší teplota F')),
	mode = 'teplota',
	group_name = 'nejvyšší teplota',
	second_line = true,
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Nejvyšší teplota [°' .. _if('nejprve imperiální', 'C', 'F') .. ']',
	annual_mode = 'max',
},
{---------- SECOND LINE AVERAGE HIGH TEMPERATURES ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' high C') or _ifany(' high F')),
	mode = 'teplota',
	group_name = 'high',
	second_line = true,
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Average high [°' .. _if('nejprve imperiální', 'C', 'F') .. ']',
	annual_mode = 'avg',
},
{---------- SECOND LINE DAILY MEAN TEMPERATURES ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' mean C') or _ifany(' mean F')),
	mode = 'teplota',
	group_name = 'mean',
	second_line = true,
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Daily mean [°' .. _if('nejprve imperiální', 'C', 'F') .. ']',
	show = _if('nejprve imperiální', '1', '2'),
	annual_mode = 'avg',
},
{---------- SECOND LINE AVERAGE LOW TEMPERATURES ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' low C') or _ifany(' low F')),
	mode = 'teplota',
	group_name = 'low',
	second_line = true,
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Average low [°' .. _if('nejprve imperiální', 'C', 'F') .. ']',
	show = _if('nejprve imperiální', '1', '2'),
	annual_mode = 'avg',
},
{---------- SECOND LINE RECORD LOW TEMPERATURES ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' nejnižší teplota C') or _ifany(' nejnižší teplota F')),
	mode = 'teplota',
	group_name = 'nejnižší teplota',
	second_line = true,
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = 'Nejnižší teplota [°' .. _if('nejprve imperiální', 'C', 'F') .. ']',
	show = _if('nejprve imperiální', '1', '2'),
	annual_mode = 'min',
},
{---------- SECOND LINE MINIMUM WIND CHILL ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' chill') and not _if('nejprve imperiální')),
	mode = 'výchozí',
	group_name = 'chill',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = '[[Wind chill]]',
	annual_mode = 'min',
},
{---------- SECOND LINE TOTAL srážky ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' srážky cm') or _ifany(' srážky mm') or _ifany(' srážky palce')),
	mode = 'srážky',
	group_name = 'srážky',
	second_line = true,
	color_scheme = _ifset('barva srážek', 'p'),
	date_mode = true,
	scale_factor = '1',
	prefer_cm = precision(_ifset('leden srážky palce', '0')) < 1,
	label = makeLabel(args, false, '[[Srážky]]', 'srážky'),
	annual_mode = 'sum',
},
{---------- SECOND LINE maximální srážky ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' maximální srážky cm') or _ifany(' maximální srážky mm') or _ifany(' maximální srážky palce')),
	mode = 'srážky',
	group_name = 'maximální srážky',
	second_line = true,
	color_scheme = _ifset('barva deště', 'p'),
	date_mode = true,
	scale_factor = '1',
	prefer_cm = precision(_ifset('leden maximální srážky palce', '0')) < 1,
	label = makeLabel(args, false, 'Maximální srážky', 'maximální srážky'),
	annual_mode = 'sum',
},
{---------- SECOND LINE sníhFALL ----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' sníh cm') or _ifany(' sníh mm') or _ifany(' sníh palce')),
	mode = 'srážky',
	group_name = 'sníh',
	second_line = true,
	prefer_cm = true,
	color_scheme = _ifset('barva sněhu', 'p'),
	date_mode = true,
	scale_factor = '1',
	label = makeLabel(args, false, '[[Sníh]]', 'sníh'),
	annual_mode = 'sum',
},
{---------- srážkové dny ----------
	WANTROW = _ifany(' srážkové dny'),
	mode = 'výchozí',
	group_name = 'srážkové dny',
	color_scheme = _ifset('precip dny colour', 'd'),
	date_mode = true,
	scale_factor = '1',
	label = 'Srážkové dny' .. _if('unit srážkové dny', ' <span style="font-size:90%;" class="nowrap">(≥ ' .. _ifset('unit srážkové dny', '') .. ')</span>'),
	annual_mode = 'sum',
},
{---------- maximální srážkové dny ----------
	WANTROW = _ifany(' maximální srážkové dny'),
	mode = 'výchozí',
	group_name = 'maximální srážkové dny',
	color_scheme = _ifset('precip dny colour', 'd'),
	date_mode = true,
	scale_factor = '1',
	label = 'Maximální srážkové dny' .. _if('unit maximální srážkové dny', ' <span style="font-size:90%;" class="nowrap">(≥ ' .. _ifset('unit maximální srážkové dny', '') .. ')</span>'),
	annual_mode = 'sum',
},
{---------- sněžné dny ----------
	WANTROW = _ifany(' sněžné dny'),
	mode = 'výchozí',
	group_name = 'sněžné dny',
	color_scheme = _ifset('precip dny colour', 'd'),
	date_mode = true,
	scale_factor = '1',
	label = 'Sněžné dny' .. _if('unit sněžné dny', ' <span style="font-size:90%;" class="nowrap">(≥ ' .. _ifset('unit sněžné dny', '') .. ')</span>'),
	annual_mode = 'sum',
},
{---------- PERCENT RELATIVE HUMIDITY ----------
	WANTROW = _ifany(' vlhkost'),
	mode = 'výchozí',
	group_name = 'vlhkost',
	color_scheme = _ifset('barva vlhkosti', 'h'),
	scale_factor = '1',
	label = '[[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">(denní průměr)</span>'),
	annual_mode = 'avg',
},
{---------- AFTERNOON PERCENT RELATIVE HUMIDITY ----------
	WANTROW = _ifany(' afthumidity'),
	mode = 'výchozí',
	group_name = 'afthumidity',
	color_scheme = _ifset('barva vlhkosti', 'h'),
	scale_factor = '1',
	label = '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">(denní průměr)</span>'),
	annual_mode = 'avg',
},
{---------- FIRST LINE AVERAGE DEW POINT ----------
	WANTROW = _ifany(' dew point C') or _ifany(' dew point F'),
	mode = 'teplota',
	group_name = 'dew point',
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = '[[Dew point]] °' .. _if('nejprve imperiální', 'F', 'C') .. _if('jeden řádek', ' (°' .. _if('nejprve imperiální', 'C', 'F') .. ')'),
	annual_mode = 'avg',
},
{---------- SECOND LINE AVERAGE DEW POINT----------
	WANTROW = not _ifset('jeden řádek') and (_ifany(' dew point C') or _ifany(' dew point F')),
	mode = 'teplota',
	group_name = 'dew point',
	second_line = true,
	color_scheme = _ifset('barva teploty', 't'),
	scale_factor = '1',
	label = '[[Dew point]] °' .. _if('nejprve imperiální', 'C', 'F'),
	show = _if('nejprve imperiální', '1', '2'),
	annual_mode = 'avg',
},
{---------- MONTHLY SUNSHINE hodiny ----------
	WANTROW = _ifany(' slunečné hodiny'),
	mode = 'výchozí',
	group_name = 'slunečné hodiny',
	color_scheme = _ifset('barva slunce', 's'),
	date_mode = true,
	scale_factor = '1',
	label = 'Mean monthly [[Sunshine duration|sunshine hodiny]]',
	annual_mode = 'sum',
},
{---------- DAILY SUNSHINE hodiny ----------
	WANTROW = _ifany(' slunečné hodiny den'),
	mode = 'výchozí',
	group_name = ' slunečné hodiny den',
	color_scheme = _ifset('barva slunce', 's'),
	include_space = false,
	scale_factor = '30.44',
	label = 'Mean daily [[Sunshine duration|sunshine hodiny]]',
	annual_mode = 'avg',
},
{---------- DAILY DAYLIGHT hodiny ----------
	WANTROW = _ifany(' denní světlo'),
	mode = 'výchozí',
	group_name = ' denní světlo',
	color_scheme = _ifset('barva slunce', 's'),
	include_space = false,
	scale_factor = '30.44',
	label = 'Mean daily [[Daytime|daylight hodiny]]',
	annual_mode = 'avg',
},
{---------- PERCENT SUNSHINE ----------
	WANTROW = _ifany(' sluneční svit'),
	mode = 'výchozí',
	group_name = 'sluneční svit',
	color_scheme = _ifset('barva slunce', 's'),
	scale_factor = '7.2',
	label = 'Percent [[Sunshine duration|possible sunshine]]',
	annual_mode = 'avg',
},
{---------- ULTRAVIOLET INDEX ----------
	WANTROW = _ifany(' uv'),
	mode = 'výchozí',
	group_name = 'uv',
	color_scheme = _ifset('barva uv', 'u'),
	scale_factor = '1',
	label = '[[UV index]]',
	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:Weather box/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,
}