Permanently protected module
From Wikipedia, the free encyclopedia


local w = {}

local math_mod = require('Module:Math')



local function hex( value )

	return string.format("%02X", value)

end



local function format_line( background, text_color )

	return "background: #" .. background .. "; color:#" .. text_color .. ";"

end



local function range_pos( value, start, stop )

	if start < stop then

		if value < start then

			return 0

		elseif value > stop then

			return 1

		else

			return (value - start) / (stop - start)

		end

	else

		if value < stop then

			return 1

		elseif value > start then

			return 0

		else

			return (start - value) / (start - stop)

		end

	end

end



function w.color_d( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._days_color( val )

end

function w.color_pastel( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._pastel_color( val )

end

function w.color_t( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._temperature_color( val )

end

function w.color_green( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._green_color( val )

end

function w.color_s( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._sunshine_color( val )

end

function w.color_h( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._humidity_color( val )

end

function w.color_p( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._precipitation_color( val )

end

function w.color_u( frame )

	local val = math_mod._cleanNumber( frame.args1 )

	return w._uv_color( val )

end



function w._days_color( val )

	local item, background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	item = hex( range_pos( val, 20, 0 )*255 )

	background = item .. item



	item = hex( range_pos( val, 40, 20 )*255 )

	background = background .. item



	if val >= 12 then

		text_color = "FFFFFF"

	else

		text_color = "000000"

	end



	return format_line( background, text_color )

end



function w._green_color( val )

	local item1, item2, background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	item1 = hex( range_pos( val, 165.6, 0 )*255 )

	item2 = hex( range_pos( val, 300, 165.61 )*207 + 48 )

	background = item1 .. item2 .. item1

	if val >= 200 then

		text_color = "FFFFFF"

	else

		text_color = "000000"

	end



	return format_line( background, text_color )

end



function w._temperature_color( val )

	local item, background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	if val < 4.5 then

		item = range_pos( val, -42.75, 4.5 )*255

		background = hex( item )

	else

		item = range_pos( val, 60, 41.5 )*255

		background = hex( item )

	end



	if val <= 4.5 then

		item = range_pos( val, -42.75, 4.5 )*255

		background = background .. hex( item )

	else

		item = range_pos( val, 41.5, 4.5 )*255

		background = background .. hex( item )

	end



	if val < -42.78 then

		item = range_pos( val, -90, -42.78 )*255

		background = background .. hex( item )

	else

		item = range_pos( val, 23, 4.5 )*255

		background = background .. hex( item )

	end



	if val < -23.3 or val >= 37.8 then

		text_color = "FFFFFF"

	else

		text_color = "000000"

	end



	return format_line( background, text_color )

end



function w._precipitation_color( val )

	local item, background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	item = hex( range_pos( val, 165.6, 0 )*255 )

	background = item .. item



	item = hex( range_pos( val, 300, 165.61 )*207 + 48 )

	background = background .. item



	if val > 90 then

		text_color = "FFFFFF"

	else

		text_color = "000000"

	end



	return format_line( background, text_color )

end



function w._humidity_color( val )

	local item, background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	item = hex( range_pos( val, 66.67, 0 )*255 )

	background = item .. item



	item = hex( range_pos( val, 133.33, 66.667 )*255 )

	background = background .. item



	if val >= 40 then

		text_color = "FFFFFF"

	else

		text_color = "000000"

	end



	return format_line( background, text_color )

end



function w._sunshine_color( val )

	local item, background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	if val < 90 then

		item = hex( range_pos( val, 0, 90 )*170 )

	elseif val < 180 then

		item = hex( range_pos( val, 90, 180 )*42.5 + 170 )

	else

		item = hex( range_pos( val, 180, 360 )*42.5 + 212.5 )

	end

	background = item .. item



	if val < 90 then

		item = hex( range_pos( val, 0, 90 )*170 )

	elseif val < 270 then

		item = hex( range_pos( val, 150, 90 )*170 )

	else

		item = hex( range_pos( val, 270, 720 )*255 )

	end

	background = background .. item



	if val < 80 then

		text_color = "FFFFFF"

	else

		text_color = "000000"

	end



	return format_line( background, text_color )

end



function w._pastel_color( val )

	local background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	if val < -15 or val >= 39 then

		text_color = "FFFFFF"

	else

		text_color = "000000"

	end



	if val >= 51 then

		background = 'EE2200'

	else

		val = math_mod._round( (val + 25.5)/3, 0 )

		if val == 1 then

			background = 'BB00CC'

		elseif val == 2 then

			background = 'CC00EE'

		elseif val == 3 then

			background = 'CC33EE'

		elseif val == 4 then

			background = 'CC55EE'

		elseif val == 5 then

			background = 'DD66EE'

		elseif val == 6 then

			background = 'DD77EE'

		elseif val == 7 then

			background = 'DD99EE'

		elseif val == 8 then

			background = 'DDAAEE'

		elseif val == 9 then

			background = 'DDBBEE'

		elseif val == 10 then

			background = 'EECCFF'

		elseif val == 11 then

			background = 'FFDDFF'

		elseif val == 12 then

			background = 'F1F1F1'

		elseif val == 13 then

			background = 'FFEEBB'

		elseif val == 14 then

			background = 'FFFFCC'

		elseif val == 15 then

			background = 'FFFFBB'

		elseif val == 16 then

			background = 'FFFFAA'

		elseif val == 17 then

			background = 'FFFF88'

		elseif val == 18 then

			background = 'FFCC33'

		elseif val == 19 then

			background = 'FFBB33'

		elseif val == 20 then

			background = 'FF9900'

		elseif val == 21 then

			background = 'FF8844'

		elseif val == 22 then

			background = 'FF6633'

		elseif val == 23 then

			background = 'FF5522'

		elseif val == 24 then

			background = 'FF4422'

		elseif val == 25 then

			background = 'EE4400'

		else

			background = 'AA00AA'

		end

	end



	return format_line( background, text_color )

end



function w._uv_color( val )

	local background, text_color



	if val == nil then

		return format_line( "FFFFFF", "000000" )

	end



	if val < 3 then

		background = "3EA72D"

	elseif val >= 3 and val < 6 then

		background = "FFF300"

	elseif val >= 6 and val < 8 then

		background = "F18B00"

	elseif val >= 8 and val < 11 then

		background = "E53210"

	else

		background = "A45693"

	end



	if val < 3 then

		text_color = "FFFFFF"

	elseif val >= 3 and val < 8 then

		text_color = "000000"

	else

		text_color = "FFFFFF"

	end



	return format_line( background, text_color )

end



function w._none_color()

	return format_line( "FAFAFA", "000000" )

end



function w.interpret_color_code( code )

	code = code:lower()

	if code == 't' then

		return w._temperature_color

	elseif code == 'pastel' then

		return w._pastel_color

	elseif code == 'green' then

		return w._green_color

	elseif code == 'h' then

		return w._humidity_color

	elseif code == 's' then

		return w._sunshine_color

	elseif code == 'p' then

		return w._precipitation_color

	elseif code == 'd' then

		return w._days_color

	elseif code == 'u' then

		return w._uv_color

	elseif code == 'none' then

		return w._none_color

	else

		error( 'Unknown color scheme option' )

	end

end



return w