<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FErutuon%2FTemperature_arrays</id>
	<title>Module:Sandbox/Erutuon/Temperature arrays - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FErutuon%2FTemperature_arrays"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Erutuon/Temperature_arrays&amp;action=history"/>
	<updated>2026-04-15T00:49:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Erutuon/Temperature_arrays&amp;diff=145380&amp;oldid=prev</id>
		<title>imported&gt;Erutuon: adding comments as pseudo-headers</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Erutuon/Temperature_arrays&amp;diff=145380&amp;oldid=prev"/>
		<updated>2016-10-05T02:35:23Z</updated>

		<summary type="html">&lt;p&gt;adding comments as pseudo-headers&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;f = {}&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 = &amp;#039;FFF&amp;#039;, &amp;#039;000&amp;#039;&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 = &amp;#039;FFF&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			text_color = &amp;#039;&amp;#039; -- 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(&amp;#039;%02X%02X%02X&amp;#039;, 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 &amp;#039;background: #&amp;#039; .. background_color .. &amp;#039;; color: #&amp;#039; .. text_color .. &amp;#039;;&amp;#039;&lt;br /&gt;
	elseif background_color then&lt;br /&gt;
		return &amp;#039;background: #&amp;#039; .. background_color .. &amp;#039;;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&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 == &amp;#039;C&amp;#039; then&lt;br /&gt;
			return color_CSS(temperature_color(palette, value))&lt;br /&gt;
		elseif unit == &amp;#039;F&amp;#039; then&lt;br /&gt;
			return color_CSS(temperature_color(palette, convert(value, decimals, &amp;#039;F&amp;#039;)))&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;
--[[ ==== 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&amp;#039;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 f.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 f.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;
		--[[  Makes 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;
return f&lt;/div&gt;</summary>
		<author><name>imported&gt;Erutuon</name></author>
	</entry>
</feed>