Module:Weather box/colors

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.args[1] )
	return w._days_color( val )
end
function w.color_pastel( frame )
	local val = math_mod._cleanNumber( frame.args[1] )
	return w._pastel_color( val )
end
function w.color_t( frame )
	local val = math_mod._cleanNumber( frame.args[1] )
	return w._temperature_color( val )
end
function w.color_green( frame )
	local val = math_mod._cleanNumber( frame.args[1] )
	return w._green_color( val )
end
function w.color_s( frame )
	local val = math_mod._cleanNumber( frame.args[1] )
	return w._sunshine_color( val )
end
function w.color_h( frame )
	local val = math_mod._cleanNumber( frame.args[1] )
	return w._humidity_color( val )
end
function w.color_p( frame )
	local val = math_mod._cleanNumber( frame.args[1] )
	return w._precipitation_color( val )
end
function w.color_u( frame )
	local val = math_mod._cleanNumber( frame.args[1] )
	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

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.