Module:Weather box/colors/sandbox
Jump to navigation
Jump to search
| File:Edit In Sandbox Icon - Color.svg | This is the module sandbox page for Module:Weather box/colors (diff). |
File:Test Template Info-Icon - Version (2).svg Module documentation[view] [edit] [history] [purge]
| Warning | This Lua module is used on approximately 32,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
| File:Green check.svg | This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing. |
| Edit-copy green with red question mark | This module's documentation is missing, inadequate, or does not accurately describe its functionality or the parameters in its code. Please help add, expand, or improve it. |
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