This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing.
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 = "B567A4"
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