<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AWeather%2FstableSandbox</id>
	<title>Module:Weather/stableSandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AWeather%2FstableSandbox"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Weather/stableSandbox&amp;action=history"/>
	<updated>2026-06-19T02:14:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Weather/stableSandbox&amp;diff=480009&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Weather/stableSandbox&amp;diff=480009&amp;oldid=prev"/>
		<updated>2021-07-16T07:57:31Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;export = {}&lt;br /&gt;
degree = &amp;quot;°&amp;quot; -- used by add_unit_names()&lt;br /&gt;
minus = &amp;quot;−&amp;quot; -- used by makeRow() and makeTable()&lt;br /&gt;
thinSpace = mw.ustring.char(0x2009) -- used by makeCell()&lt;br /&gt;
&lt;br /&gt;
-- Error message handling&lt;br /&gt;
message = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function add_message(new_message)&lt;br /&gt;
	if show then&lt;br /&gt;
		if check_for_string(message) then&lt;br /&gt;
			message = message .. &amp;quot; &amp;quot; .. new_message&lt;br /&gt;
		else&lt;br /&gt;
			message = &amp;quot;Notices: &amp;quot; .. new_message&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Input and output parameters&lt;br /&gt;
local function get_format (frame)&lt;br /&gt;
	local input_parameter = frame.args.input&lt;br /&gt;
	local output_parameter = frame.args.output&lt;br /&gt;
	&lt;br /&gt;
	if input_parameter == nil then&lt;br /&gt;
		error(&amp;quot;Please provide the number of values and a unit in the input parameter&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		length = tonumber(string.match(input_parameter, &amp;quot;(%d+)&amp;quot;)) -- Find digits in the input parameter.&lt;br /&gt;
		input_unit = string.match(input_parameter, &amp;quot;([CF])&amp;quot;) -- C or F&lt;br /&gt;
		if string.find(input_parameter, &amp;quot;[^CF%d%s]&amp;quot;) then&lt;br /&gt;
			add_message(&amp;quot;There are extraneous characters in the &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;output&amp;lt;/span&amp;gt; parameter.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if input_unit == &amp;quot;C&amp;quot; then&lt;br /&gt;
		output_unit = &amp;quot;F&amp;quot;&lt;br /&gt;
	elseif input_unit == &amp;quot;F&amp;quot; then&lt;br /&gt;
		output_unit = &amp;quot;C&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		error (&amp;quot;Please provide an input unit in the input parameter: F for Fahrenheit or C for Celsius&amp;quot;, 0)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if length == nil then&lt;br /&gt;
		error (&amp;quot;get_format has not found a length value in the input parameter&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if output_parameter == nil then&lt;br /&gt;
		add_message(&amp;quot;No output format has been provided in the &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;output&amp;lt;/span&amp;gt; parameter.&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		cell_format = {}&lt;br /&gt;
		local n = 1&lt;br /&gt;
		for unit in output_parameter:gmatch(&amp;quot;[CF]&amp;quot;) do&lt;br /&gt;
			cell_format[n] = unit&lt;br /&gt;
			n = n + 1&lt;br /&gt;
			if n &amp;gt; 2 then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local function set_format(key, formatVariable, formatValue1, formatValue2)&lt;br /&gt;
			if string.find(output_parameter, key) then&lt;br /&gt;
				cell_format[formatVariable] = formatValue1&lt;br /&gt;
			else&lt;br /&gt;
				cell_format[formatVariable] = formatValue2&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if cell_format[1] then&lt;br /&gt;
			cell_format.first = cell_format[1]&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;quot;C or F not found in output parameter&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if cell_format[2] == nil then&lt;br /&gt;
			cell_format[&amp;quot;convert_units&amp;quot;] = &amp;quot;no&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			if cell_format[2] == cell_format[1] then&lt;br /&gt;
				error(&amp;quot;There should not be two of the same unit name in the output parameter.&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				cell_format[&amp;quot;convert_units&amp;quot;] = &amp;quot;yes&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		set_format(&amp;quot;unit&amp;quot;, &amp;quot;unit_names&amp;quot;, &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;)&lt;br /&gt;
		set_format(&amp;quot;no ?color&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;yes&amp;quot;)&lt;br /&gt;
		set_format(&amp;quot;sort&amp;quot;, &amp;quot;sortable&amp;quot;, &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;)&lt;br /&gt;
		set_format(&amp;quot;full ?size&amp;quot;, &amp;quot;small_font&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;yes&amp;quot;)&lt;br /&gt;
		set_format(&amp;quot;no ?brackets&amp;quot;, &amp;quot;brackets&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;yes&amp;quot;)&lt;br /&gt;
		set_format(&amp;quot;round&amp;quot;, &amp;quot;decimals&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		if string.find(output_parameter, &amp;quot;line break&amp;quot;) then&lt;br /&gt;
			cell_format[&amp;quot;line_break&amp;quot;] = &amp;quot;yes&amp;quot;&lt;br /&gt;
		elseif string.find(output_parameter, &amp;quot;one line&amp;quot;) then&lt;br /&gt;
			cell_format[&amp;quot;line_break&amp;quot;] = &amp;quot;no&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			cell_format[&amp;quot;line_break&amp;quot;] = &amp;quot;auto&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if string.find(output_parameter, &amp;quot;one line&amp;quot;) and string.find(output_parameter, &amp;quot;line break&amp;quot;) then&lt;br /&gt;
			error(&amp;quot;Place either \&amp;quot;one line\&amp;quot; or \&amp;quot;line break\&amp;quot; in the output parameter, not both&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if frame.args.palette == nil then&lt;br /&gt;
		palette = &amp;quot;cool2avg&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		palette = frame.args.palette&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if frame.args.messages == &amp;quot;show&amp;quot; then&lt;br /&gt;
		show = true&lt;br /&gt;
	else&lt;br /&gt;
		show = false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return length, input_unit, output_unit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Number and string-handling functions&lt;br /&gt;
local function check_for_number(value)&lt;br /&gt;
	return type(tonumber(value)) == &amp;quot;number&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function check_for_string(string)&lt;br /&gt;
	string = tostring(string)&lt;br /&gt;
	return string ~= &amp;quot;&amp;quot; and string ~= nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function round(value, decimals)&lt;br /&gt;
	value = tonumber(value)&lt;br /&gt;
	if type(value) == &amp;quot;number&amp;quot; then&lt;br /&gt;
		local string = string.format(&amp;quot;%.&amp;quot; .. decimals .. &amp;quot;f&amp;quot;, value)&lt;br /&gt;
		return string&lt;br /&gt;
	elseif value == nil then&lt;br /&gt;
		value = &amp;quot;nil&amp;quot;&lt;br /&gt;
		add_message(&amp;quot;Format was asked to operate on &amp;quot; .. value .. &amp;quot;, which cannot be converted to a number.&amp;quot;, 2)&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function convert(value, decimals, unit) -- Unit is the unit being converted from. It defaults to input_unit.&lt;br /&gt;
	if not unit then&lt;br /&gt;
		unit = input_unit&lt;br /&gt;
	end&lt;br /&gt;
	if check_for_number(value) then&lt;br /&gt;
		local value = tonumber(value)&lt;br /&gt;
		if unit == &amp;quot;C&amp;quot; then&lt;br /&gt;
			add_message(value .. &amp;quot; &amp;quot; .. degree .. unit .. &amp;quot; was converted.&amp;quot;)&lt;br /&gt;
			return round(value * 9/5 + 32, decimals)&lt;br /&gt;
		elseif unit == &amp;quot;F&amp;quot; then&lt;br /&gt;
			add_message(value .. &amp;quot; &amp;quot; .. degree .. unit .. &amp;quot; was converted.&amp;quot;)&lt;br /&gt;
			return round((value - 32) * 5/9, decimals)&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;quot;Input unit not recognized&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot; -- Setting result to empty string if value is not a number avoids concatenation errors.&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Input parsing&lt;br /&gt;
function make_array(parameter, array, frame)&lt;br /&gt;
	local array = {}&lt;br /&gt;
	local n = 1&lt;br /&gt;
	for number in parameter:gmatch(&amp;quot;%-?%d+%.?%d?&amp;quot;) do&lt;br /&gt;
		local number = number&lt;br /&gt;
		if n == 1 then&lt;br /&gt;
			local decimals = number:match(&amp;quot;%.(%d+)&amp;quot;)&lt;br /&gt;
			if decimals == nil then&lt;br /&gt;
				precision = &amp;quot;0&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				precision = #decimals&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(array, n, number)&lt;br /&gt;
		n = n + 1&lt;br /&gt;
		if n &amp;gt; length then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not array[length] then&lt;br /&gt;
		add_message(&amp;quot;There are not &amp;quot; .. length .. &amp;quot; values in the &amp;quot; .. parameter .. &amp;quot; parameter.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return array, precision&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function make_arrays(frame)&lt;br /&gt;
	get_format(frame)&lt;br /&gt;
	local parameter_a = frame.args.a&lt;br /&gt;
	local parameter_b = frame.args.b&lt;br /&gt;
	local parameter_c = frame.args.c&lt;br /&gt;
	if parameter_a then&lt;br /&gt;
		a = make_array(parameter_a, a, frame)&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;quot;Please provide a set of numbers in parameter a&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if parameter_b then&lt;br /&gt;
		b = make_array(parameter_b, b, frame)&lt;br /&gt;
	else&lt;br /&gt;
		add_message(&amp;quot;There is no content in parameter &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;b&amp;lt;/span&amp;gt;.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if parameter_c then&lt;br /&gt;
		c = make_array(parameter_c, c, frame)&lt;br /&gt;
	else&lt;br /&gt;
		add_message(&amp;quot;There is no content in parameter &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;c&amp;lt;/span&amp;gt;.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return a, b, c&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Color generation&lt;br /&gt;
&lt;br /&gt;
palettes = {&lt;br /&gt;
	-- The first three arrays in each palette defines background color using a table of four numbers,&lt;br /&gt;
	-- say { 11, 22, 33, 44 } (values in °C).&lt;br /&gt;
	-- That means the color is 0 below 11 and above 44, and is 255 from 22 to 33.&lt;br /&gt;
	-- The color rises from 0 to 255 between 11 and 22, and falls between 33 and 44.&lt;br /&gt;
	cool = {&lt;br /&gt;
		{ -42.75,   4.47, 41.5, 60   },&lt;br /&gt;
		{ -42.75,   4.47,  4.5, 41.5 },&lt;br /&gt;
		{ -90   , -42.78,  4.5, 23   },&lt;br /&gt;
		white = { -23.3, 37.8 },&lt;br /&gt;
	},&lt;br /&gt;
	cool2 = {&lt;br /&gt;
		{ -42.75,   4.5 , 41.5, 56   },&lt;br /&gt;
		{ -42.75,   4.5 ,  4.5, 41.5 },&lt;br /&gt;
		{ -90   , -42.78,  4.5, 23   },&lt;br /&gt;
		white = { -23.3, 35 },&lt;br /&gt;
	},&lt;br /&gt;
	cool2avg = {&lt;br /&gt;
		{ -38,   4.5, 25  , 45   },&lt;br /&gt;
		{ -38,   4.5,  4.5, 30   },&lt;br /&gt;
		{ -70, -38  ,  4.5, 23   },&lt;br /&gt;
		white = { -23.3, 25 },&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function temperature_color(palette, value, out_rgb)&lt;br /&gt;
	--[[ Return style for a table cell based on the given value which&lt;br /&gt;
		should be a temperature in °C. ]]&lt;br /&gt;
	local background_color, text_color&lt;br /&gt;
	value = tonumber(value)&lt;br /&gt;
	if value == nil then&lt;br /&gt;
		background_color, text_color = 'FFF', '000'&lt;br /&gt;
		add_message(&amp;quot;Value supplied to &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;temperature_color&amp;lt;/span&amp;gt; is not recognized.&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		local min, max = unpack(palette.white or { -23, 35 })&lt;br /&gt;
		if value &amp;lt; min or value &amp;gt;= max then&lt;br /&gt;
			text_color = 'FFF'&lt;br /&gt;
		else&lt;br /&gt;
			text_color = '' -- This assumes that black text color is the default for most readers.&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local background_rgb = out_rgb or {}&lt;br /&gt;
		for i, v in ipairs(palette) do&lt;br /&gt;
			local a, b, c, d = unpack(v)&lt;br /&gt;
			if value &amp;lt;= a then&lt;br /&gt;
				background_rgb[i] = 0&lt;br /&gt;
			elseif value &amp;lt; b then&lt;br /&gt;
				background_rgb[i] = (value - a) * 255 / (b - a)&lt;br /&gt;
			elseif value &amp;lt;= c then&lt;br /&gt;
				background_rgb[i] = 255&lt;br /&gt;
			elseif value &amp;lt; d then&lt;br /&gt;
				background_rgb[i] = 255 - ( (value - c) * 255 / (d - c) )&lt;br /&gt;
			else&lt;br /&gt;
				background_rgb[i] = 0&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		background_color = string.format('%02X%02X%02X', background_rgb[1], background_rgb[2], background_rgb[3])&lt;br /&gt;
	end&lt;br /&gt;
	if text_color == &amp;quot;&amp;quot; then&lt;br /&gt;
		return background_color&lt;br /&gt;
	else&lt;br /&gt;
		return background_color, text_color&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function color_CSS(background_color, text_color)&lt;br /&gt;
	if background_color and text_color then&lt;br /&gt;
		return 'background: #' .. background_color .. '; color: #' .. text_color .. ';'&lt;br /&gt;
	elseif background_color then&lt;br /&gt;
		return 'background: #' .. background_color .. ';'&lt;br /&gt;
	else&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function temperature_color_CSS(palette, value, out_rgb)&lt;br /&gt;
	return color_CSS(temperature_color(palette, value, out_rgb))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function temperature_CSS(value, unit, palette)&lt;br /&gt;
	local palette = palettes[palette] or palettes.cool&lt;br /&gt;
	local value = tonumber(value)&lt;br /&gt;
	if value == nil then&lt;br /&gt;
		error(&amp;quot;The function &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;temperature_CSS&amp;lt;/span&amp;gt; is receiving a nil value&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		if unit == 'C' then&lt;br /&gt;
			return color_CSS(temperature_color(palette, value))&lt;br /&gt;
		elseif unit == 'F' then&lt;br /&gt;
			return color_CSS(temperature_color(palette, convert(value, decimals, 'F')))&lt;br /&gt;
		else&lt;br /&gt;
			unit_error(unit or &amp;quot;nil&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function style_attribute(palette, value, out_rgb)&lt;br /&gt;
	local font_size = &amp;quot;font-size: 85%;&amp;quot;&lt;br /&gt;
	local color = temperature_color_CSS(palette, value, out_rgb)&lt;br /&gt;
	return 'style=\&amp;quot;' .. color .. ' ' .. font_size .. '\&amp;quot;'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.temperature_style(frame) -- used by Template:Average temperature table/color&lt;br /&gt;
	local palette = palettes[frame.args.palette] or palettes.cool&lt;br /&gt;
	local unit = frame.args.unit or 'C'&lt;br /&gt;
	local value = tonumber(frame.args[1])&lt;br /&gt;
	if unit == 'C' then&lt;br /&gt;
		return style_attribute(palette, value)&lt;br /&gt;
	elseif unit == 'F' then&lt;br /&gt;
		return style_attribute(palette, convert(value, 1, 'F'))&lt;br /&gt;
	else&lt;br /&gt;
		unit_error(unit)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ ==== Cell, row, table generation ==== ]]&lt;br /&gt;
local output_formats = {&lt;br /&gt;
	high_low_average_F =&lt;br /&gt;
		{ first = &amp;quot;F&amp;quot;,&lt;br /&gt;
		convert_units = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		unit_names = &amp;quot;no&amp;quot;,&lt;br /&gt;
		color = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		small_font = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		sortable = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		decimals = &amp;quot;0&amp;quot;,&lt;br /&gt;
		brackets = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		line_break = &amp;quot;auto&amp;quot;, },&lt;br /&gt;
	high_low_average_C =&lt;br /&gt;
		{ first = &amp;quot;C&amp;quot;,&lt;br /&gt;
		convert_units = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		unit_names = &amp;quot;no&amp;quot;,&lt;br /&gt;
		color = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		small_font = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		sortable = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		decimals = &amp;quot;0&amp;quot;,&lt;br /&gt;
		brackets = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		line_break = &amp;quot;auto&amp;quot;, },&lt;br /&gt;
	high_low_F =&lt;br /&gt;
		{ first = &amp;quot;F&amp;quot;,&lt;br /&gt;
		convert_units = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		unit_names = &amp;quot;no&amp;quot;,&lt;br /&gt;
		color = &amp;quot;no&amp;quot;,&lt;br /&gt;
		small_font = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		sortable = &amp;quot;no&amp;quot;,&lt;br /&gt;
		decimals = &amp;quot;&amp;quot;,&lt;br /&gt;
		brackets = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		line_break = &amp;quot;auto&amp;quot;, },&lt;br /&gt;
	high_low_C =&lt;br /&gt;
		{ first = &amp;quot;C&amp;quot;,&lt;br /&gt;
		convert_units = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		unit_names = &amp;quot;no&amp;quot;,&lt;br /&gt;
		color = &amp;quot;no&amp;quot;,&lt;br /&gt;
		small_font = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		sortable = &amp;quot;no&amp;quot;,&lt;br /&gt;
		decimals = &amp;quot;0&amp;quot;,&lt;br /&gt;
		brackets = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		line_break = &amp;quot;auto&amp;quot;, },&lt;br /&gt;
	average_F =&lt;br /&gt;
		{ first = &amp;quot;F&amp;quot;,&lt;br /&gt;
		convert_units = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		unit_names = &amp;quot;no&amp;quot;,&lt;br /&gt;
		color = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		small_font = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		sortable = &amp;quot;no&amp;quot;,&lt;br /&gt;
		decimals = &amp;quot;0&amp;quot;,&lt;br /&gt;
		brackets = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		line_break = &amp;quot;auto&amp;quot;, },&lt;br /&gt;
	average_C =&lt;br /&gt;
		{ first = &amp;quot;C&amp;quot;,&lt;br /&gt;
		convert_units = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		unit_names = &amp;quot;no&amp;quot;,&lt;br /&gt;
		color = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		small_font = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		sortable = &amp;quot;no&amp;quot;,&lt;br /&gt;
		decimals = &amp;quot;0&amp;quot;,&lt;br /&gt;
		brackets = &amp;quot;yes&amp;quot;,&lt;br /&gt;
		line_break = &amp;quot;auto&amp;quot;, },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local function add_unit_names(value, unit)&lt;br /&gt;
	if not unit then unit = input_unit end&lt;br /&gt;
	if output_format.unit_names == &amp;quot;yes&amp;quot; then&lt;br /&gt;
		if check_for_string(value) then&lt;br /&gt;
			return value .. &amp;quot;&amp;amp;nbsp;&amp;quot; .. degree .. unit&lt;br /&gt;
		else&lt;br /&gt;
			return value -- Don't add a unit name to an empty string&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return value&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function if_yes(parameter, realization1, realization2)&lt;br /&gt;
	if realization1 then&lt;br /&gt;
		if realization2 then&lt;br /&gt;
			if parameter == &amp;quot;yes&amp;quot; then&lt;br /&gt;
				parameter = { realization1, realization2 }&lt;br /&gt;
			else&lt;br /&gt;
				parameter = { &amp;quot;&amp;quot;, &amp;quot;&amp;quot; }&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if parameter == &amp;quot;yes&amp;quot; then&lt;br /&gt;
				parameter = realization1&lt;br /&gt;
			else&lt;br /&gt;
				parameter = &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		parameter = &amp;quot;&amp;quot;&lt;br /&gt;
		add_message(&amp;quot;&amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;if_yes&amp;lt;/span&amp;gt; needs at least one realization&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return parameter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function makeCell(output_format, a, b, c)&lt;br /&gt;
	local cell, cell_content = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	local color_CSS, other_CSS, title_attribute, sortkey, attribute_separator, converted_units_separator = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	local style_attribute, high_low_separator, brackets, values, converted_units = {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;}, {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;}, {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;}, {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;}, {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;}&lt;br /&gt;
	&lt;br /&gt;
	if check_for_number(output_format.decimals) then&lt;br /&gt;
		decimals = output_format.decimals&lt;br /&gt;
		--[[ Precision is the number of decimals in the first number of the last array.&lt;br /&gt;
			This may be a problem for data from Weatherbase,&lt;br /&gt;
			which seems to inappropriately remove .0 from numbers that have it. ]]&lt;br /&gt;
	else&lt;br /&gt;
		decimals = precision&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if check_for_number(b) and check_for_number(a) then&lt;br /&gt;
		values, high_low_separator = { round(a, decimals), round(b, decimals) }, { thinSpace .. &amp;quot;/&amp;quot; .. thinSpace, if_yes(output_format.convert_units, thinSpace .. &amp;quot;/&amp;quot; .. thinSpace) }&lt;br /&gt;
	elseif check_for_number(a) then&lt;br /&gt;
		values = { round(a, decimals), &amp;quot;&amp;quot; }&lt;br /&gt;
	elseif check_for_number(c) then&lt;br /&gt;
		values = { round(c, decimals), &amp;quot;&amp;quot; }&lt;br /&gt;
	end&lt;br /&gt;
	if output_format.first == input_unit then&lt;br /&gt;
		if output_format.convert_units == &amp;quot;yes&amp;quot; then&lt;br /&gt;
			converted_units = { add_unit_names(convert(values[1], decimals), output_unit), add_unit_names(convert(values[2], decimals), output_unit) }&lt;br /&gt;
		end&lt;br /&gt;
		values = { add_unit_names(values[1]), add_unit_names(values[2]) }&lt;br /&gt;
	elseif output_format.first == &amp;quot;C&amp;quot; or output_format.first == &amp;quot;F&amp;quot; then&lt;br /&gt;
		if output_format.convert_units == &amp;quot;yes&amp;quot; then&lt;br /&gt;
			converted_units = { add_unit_names(values[1]), add_unit_names(values[2]) }&lt;br /&gt;
		end&lt;br /&gt;
		values = { add_unit_names(convert(values[1], decimals), output_unit), add_unit_names(convert(values[2], decimals), output_unit) }&lt;br /&gt;
	else&lt;br /&gt;
		if output_format.first == nil then&lt;br /&gt;
			output_format.first = &amp;quot;nil&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		add_message(&amp;quot;&amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;&amp;quot; .. output_format.first .. &amp;quot;&amp;lt;/span&amp;gt;, the value for &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;first&amp;lt;/span&amp;gt; in &amp;lt;span style=\&amp;quot;background-color: #EEE; font-family: monospace;\&amp;quot;&amp;gt;output_format&amp;lt;/span&amp;gt; is not recognized.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Regarding line breaks:&lt;br /&gt;
		If there are two values, there will be at least three characters: 9/1.&lt;br /&gt;
		If there is one decimal, numbers will be three to five characters long&lt;br /&gt;
		and there will be 3 to 10 characters total even without unit conversion:&lt;br /&gt;
			1.1, 116.5/88.0.&lt;br /&gt;
		If there are units, that adds three characters per number: 25 °C/20 °C.&lt;br /&gt;
		In each of these cases, a line break is needed so that table cells are not too wide;&lt;br /&gt;
		even more so when more than one of these things are true.&lt;br /&gt;
		]]&lt;br /&gt;
	if output_format.convert_units == &amp;quot;yes&amp;quot; then&lt;br /&gt;
		brackets = if_yes(output_format.brackets, &amp;quot;(&amp;quot;, &amp;quot;)&amp;quot; )&lt;br /&gt;
		if output_format.line_break == &amp;quot;auto&amp;quot; then&lt;br /&gt;
			if check_for_string(values[2]) or decimals ~= &amp;quot;0&amp;quot; or output_format.show_units == &amp;quot;yes&amp;quot; then&lt;br /&gt;
				converted_units_separator = &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				converted_units_separator = &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		elseif output_format.line_break == &amp;quot;yes&amp;quot; then&lt;br /&gt;
			converted_units_separator = &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
		elseif output_format.line_break == &amp;quot;no&amp;quot; then&lt;br /&gt;
			converted_units_separator = &amp;quot;&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;quot;Value for line_break not recognized&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	cell_content = values[1] .. high_low_separator[1] .. values[2] .. converted_units_separator .. brackets[1] .. converted_units[1] .. high_low_separator[2] .. converted_units[2] .. brackets[2]&lt;br /&gt;
	&lt;br /&gt;
	if check_for_number(c) then&lt;br /&gt;
		color_CSS = if_yes(output_format.color, temperature_CSS(c, input_unit, palette))&lt;br /&gt;
		if check_for_number(b) and check_for_number(a) then&lt;br /&gt;
			local attribute_value&lt;br /&gt;
			if output_format.first == input_unit then&lt;br /&gt;
				attribute_value = c&lt;br /&gt;
			else&lt;br /&gt;
				attribute_value = convert(c, decimals)&lt;br /&gt;
			end&lt;br /&gt;
			sortkey = if_yes(output_format.sortable, &amp;quot; data-sort-value=\&amp;quot;&amp;quot; .. attribute_value .. &amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
			title_attribute = &amp;quot; title=\&amp;quot;Average temperature: &amp;quot; .. attribute_value .. &amp;quot; &amp;quot; .. degree .. output_format.first .. &amp;quot;\&amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	elseif check_for_number(b) then&lt;br /&gt;
		color_css = &amp;quot;&amp;quot;&lt;br /&gt;
	elseif check_for_number(a) then&lt;br /&gt;
		color_CSS = if_yes(output_format.color, temperature_CSS(a, input_unit, palette))&lt;br /&gt;
	else&lt;br /&gt;
		add_message(&amp;quot;Neither a nor b nor c are strings.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	other_CSS = if_yes(output_format.small_font, &amp;quot;font-size: 85%;&amp;quot;)&lt;br /&gt;
	if check_for_string(color_CSS) or check_for_string(other_CSS) then&lt;br /&gt;
		style_attribute = { &amp;quot;style=\&amp;quot;&amp;quot;, &amp;quot;\&amp;quot;&amp;quot; }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if check_for_string(other_CSS) or check_for_string(color_CSS) or check_for_string(title_attribute) or check_for_string(sortkey) then&lt;br /&gt;
		attribute_separator = &amp;quot; | &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	cell = &amp;quot;\n| &amp;quot; .. style_attribute[1] .. color_CSS .. other_CSS .. style_attribute[2] .. title_attribute .. sortkey .. attribute_separator .. cell_content&lt;br /&gt;
	return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.makeRow(frame)&lt;br /&gt;
	make_arrays(frame)&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		output = &amp;quot;\n|-&amp;quot;&lt;br /&gt;
		output = output .. &amp;quot;\n! &amp;quot; .. frame.args[1]&lt;br /&gt;
		if frame.args[2] then&lt;br /&gt;
			output = output .. &amp;quot; !! &amp;quot; .. frame.args[2]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if cell_format then&lt;br /&gt;
		output_format = cell_format&lt;br /&gt;
	end&lt;br /&gt;
	if a and b and c then&lt;br /&gt;
		for i = 1, length do&lt;br /&gt;
			if not output_format then&lt;br /&gt;
				output_format = output_formats.high_low_average_F&lt;br /&gt;
			end&lt;br /&gt;
			output = output .. makeCell(output_format, a[i], b[i], c[i])&lt;br /&gt;
		end&lt;br /&gt;
	elseif a and b then&lt;br /&gt;
		for i = 1, length do&lt;br /&gt;
			if not output_format then&lt;br /&gt;
				output_format = output_formats.high_low_F&lt;br /&gt;
			end&lt;br /&gt;
			output = output .. makeCell(output_format, a[i], b[i])&lt;br /&gt;
		end&lt;br /&gt;
	elseif a then&lt;br /&gt;
		for i = 1, length do&lt;br /&gt;
			if not output_format then&lt;br /&gt;
				output_format = output_formats.average_F&lt;br /&gt;
			end&lt;br /&gt;
			output = output .. makeCell(output_format, a[i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	output = mw.ustring.gsub(output, &amp;quot;([%p%s])-(%d)&amp;quot;, &amp;quot;%1&amp;quot; .. minus .. &amp;quot;%2&amp;quot;)&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.makeTable(frame)&lt;br /&gt;
	make_arrays(frame)&lt;br /&gt;
	local output = &amp;quot;{| class=\&amp;quot;wikitable center nowrap\&amp;quot;&amp;quot;&lt;br /&gt;
	if cell_format then&lt;br /&gt;
		output_format = cell_format&lt;br /&gt;
	end&lt;br /&gt;
	if a and b and c then&lt;br /&gt;
		for i = 1, length do&lt;br /&gt;
			if not output_format then&lt;br /&gt;
				output_format = output_formats.high_low_average_F&lt;br /&gt;
			end&lt;br /&gt;
			output = output .. makeCell(output_format, a[i], b[i], c[i])&lt;br /&gt;
		end&lt;br /&gt;
	elseif a and b then&lt;br /&gt;
		for i = 1, length do&lt;br /&gt;
			if not output_format then&lt;br /&gt;
				output_format = output_formats.high_low_F&lt;br /&gt;
			end&lt;br /&gt;
			output = output .. makeCell(output_format, a[i], b[i])&lt;br /&gt;
		end&lt;br /&gt;
	elseif a then&lt;br /&gt;
		for i = 1, length do&lt;br /&gt;
			if not output_format then&lt;br /&gt;
				output_format = output_formats.average_F&lt;br /&gt;
			end&lt;br /&gt;
			output = output .. makeCell(output_format, a[i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	output = mw.ustring.gsub(output, &amp;quot;([%p%s])-(%d)&amp;quot;, &amp;quot;%1&amp;quot; .. minus .. &amp;quot;%2&amp;quot;)&lt;br /&gt;
		--[[  Replaces hyphens that have a punctuation or space character before them and a number after them,&lt;br /&gt;
				making sure that hyphens in &amp;quot;data-sort-type&amp;quot; are not replaced with minuses.&lt;br /&gt;
				If Lua had (?&amp;lt;=), a capture would not be necessary.  ]]&lt;br /&gt;
	output = output .. &amp;quot;\n|}&amp;quot;&lt;br /&gt;
	if show then&lt;br /&gt;
		output = output .. &amp;quot;\n\n&amp;lt;span style=\&amp;quot;color: red; font-size: 80%; line-height: 100%;\&amp;quot;&amp;gt;&amp;quot; .. message .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local chart = [[&lt;br /&gt;
{{Graph:Chart&lt;br /&gt;
|width=600&lt;br /&gt;
|height=180&lt;br /&gt;
|xAxisTitle=Celsius&lt;br /&gt;
|yAxisTitle=__COLOR&lt;br /&gt;
|type=line&lt;br /&gt;
|x=__XVALUES&lt;br /&gt;
|y=__YVALUES&lt;br /&gt;
|colors=__COLOR&lt;br /&gt;
}}&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function export.show(frame)&lt;br /&gt;
	-- For testing, return wikitext to show graphs of how the red/green/blue colors&lt;br /&gt;
	-- vary with temperature, and a table of the resulting colors.&lt;br /&gt;
	local function collection()&lt;br /&gt;
		-- Return a table to hold items.&lt;br /&gt;
		return {&lt;br /&gt;
			n = 0,&lt;br /&gt;
			add = function (self, item)&lt;br /&gt;
				self.n = self.n + 1&lt;br /&gt;
				self[self.n] = item&lt;br /&gt;
			end,&lt;br /&gt;
			join = function (self, sep)&lt;br /&gt;
				return table.concat(self, sep)&lt;br /&gt;
			end,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	local function make_chart(result, color, xvalues, yvalues)&lt;br /&gt;
		result:add('\n')&lt;br /&gt;
		result:add(frame:preprocess((chart:gsub('__[A-Z]+', {&lt;br /&gt;
			__COLOR = color,&lt;br /&gt;
			__XVALUES = xvalues:join(','),&lt;br /&gt;
			__YVALUES = yvalues:join(','),&lt;br /&gt;
		}))))&lt;br /&gt;
	end&lt;br /&gt;
	local function with_minus(value)&lt;br /&gt;
		if value &amp;lt; 0 then&lt;br /&gt;
			return minus .. tostring(-value)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(value)&lt;br /&gt;
	end&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local first = args[1] or -90&lt;br /&gt;
	local last = args[2] or 59&lt;br /&gt;
	local palette = palettes[args.palette] or palettes.cool&lt;br /&gt;
	local xvals, reds, greens, blues = collection(), collection(), collection(), collection()&lt;br /&gt;
	local wikitext = collection()&lt;br /&gt;
	wikitext:add('{| class=&amp;quot;wikitable&amp;quot;\n|-\n')&lt;br /&gt;
	local columns = 0&lt;br /&gt;
	for celsius = first, last do&lt;br /&gt;
		local background_rgb = {}&lt;br /&gt;
		local style = style_attribute(palette, celsius, background_rgb)&lt;br /&gt;
		local R = math.floor(background_rgb[1])&lt;br /&gt;
		local G = math.floor(background_rgb[2])&lt;br /&gt;
		local B = math.floor(background_rgb[3])&lt;br /&gt;
		xvals:add(celsius)&lt;br /&gt;
		reds:add(R)&lt;br /&gt;
		greens:add(G)&lt;br /&gt;
		blues:add(B)&lt;br /&gt;
		wikitext:add('| ' .. style .. ' | ' .. with_minus(celsius) .. '\n')&lt;br /&gt;
		columns = columns + 1&lt;br /&gt;
		if columns &amp;gt;= 10 then&lt;br /&gt;
			columns = 0&lt;br /&gt;
			wikitext:add('|-\n')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	wikitext:add('|}\n')&lt;br /&gt;
	make_chart(wikitext, 'Red', xvals, reds)&lt;br /&gt;
	make_chart(wikitext, 'Green', xvals, greens)&lt;br /&gt;
	make_chart(wikitext, 'Blue', xvals, blues)&lt;br /&gt;
	return wikitext:join()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>