w = {};
convert = require( "Module:BaseConvert" );
math_mod = require( "Module:Math" );
function hex( value )
return convert._convert( value, 16, 10, 0, 2, nil, nil, nil );
end
function format_line( background, text_color )
return "background:#" .. background .. ";color:#" .. text_color .. ";font-size:85%;text-align:center;";
end
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, frame.args[1] );
return w._days_color( val );
end
function w.color_pastel( frame )
local val = math_mod._cleanNumber( frame, frame.args[1] );
return w._pastel_color( val );
end
function w.color_t( frame )
local val = math_mod._cleanNumber( frame, frame.args[1] );
return w._temperature_color( val );
end
function w.color_green( frame )
local val = math_mod._cleanNumber( frame, frame.args[1] );
return w._green_color( val );
end
function w.color_s( frame )
local val = math_mod._cleanNumber( frame, frame.args[1] );
return w._sunshine_color( val );
end
function w.color_h( frame )
local val = math_mod._cleanNumber( frame, frame.args[1] );
return w._humidity_color( val );
end
function w.color_p( frame )
local val = math_mod._cleanNumber( frame, frame.args[1] );
return w._precipitation_color( val );
end
function w._days_color( val )
local item, background, text_color;
if val == nil then
return format_line( "FFFFFF", "000000" );
end
background = '';
item = hex( range_pos( val, 20, 0 )*255 );
background = 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
background = '';
item1 = hex( range_pos( val, 165.6, 0 )*255 );
item2 = hex( range_pos( val, 300, 165.61 )*207 + 48 );
background = 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
background = '';
if val < 4.5 then
item = range_pos( val, -42.75, 4.5 )*255;
background = background .. hex( item );
else
item = range_pos( val, 60, 41.5 )*255;
background = 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
background = '';
item = hex( range_pos( val, 165.6, 0 )*255 );
background = 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
background = '';
item = hex( range_pos( val, 66.67, 0 )*255 );
background = 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
background = '';
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 = 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 item, 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
background = '';
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.dual_line( frame )
local color_scheme = string.lower( frame.args.colors or 't' );
local scale_factor = math_mod._cleanNumber(frame.args.scale_factor) or 1;
local pframe = frame:getParent();
local show = pframe.args.show or '1'
local alt = pframe.args.alt or '2';
local label = pframe.args.label or '';
local result = '';
if color_scheme == 't' then
color_scheme = w._temperature_color;
elseif color_scheme == 'pastel' then
color_scheme = w._pastel_color;
else
error( 'Unknown color scheme option' );
end
result = "|- \n! height='16' | " .. label .. "\n"
months = { 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
'aug', 'sep', 'oct', 'nov', 'dec', 'yr' };
local m1, m_show, m_alt;
for _, k in ipairs( months ) do
result = result .. ' :' .. k .. ':' .. (pframe.args[ k .. '1' ] or 'nil') .. ':';
m1 = math_mod._cleanNumber(pframe.args[ k .. '1' ]);
if show == '1' then
m_show = m1;
else
m_show = math_mod._cleanNumber(pframe.args[ k .. show ]) or 0;
end
if alt == '1' then
m_alt = m1;
else
m_alt = math_mod._cleanNumber(pframe.args[ k .. alt ]) or 0;
end
if k == 'yr' then
result = result .. '|style="' .. color_scheme( m1*scale_factor ) ..' border-left-width:medium" | '
else
result = result .. '|style="' .. color_scheme( m1*scale_factor ) ..'" | '
end
result = result .. m_show .. " <br /> (" .. m_alt .. ")\n";
end
result = result .. "|-\n";
return result;
end
return w;