Module:Weather box/row

This is an old revision of this page, as edited by Dragons flight (talk | contribs) at 20:56, 8 March 2013 (+CtoF). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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 w.CtoF( frame )
    local v1, v2, v2_str, v3
    v1 = frame.args[1];
    if v1 ~= '' and v1 ~= nil then
        v3 = frame.args[3];        
        if v3 == nil or v3 == '' then
            v3 = v1;
        end
        _, v3 = math._cleanNumber( frame, v3 );
        if v3:sub(1,1) == '-' then
            v3 = '−' .. v3:sub(2);
        end
        return v3;
    else
        v2, v2_str = math._cleanNumber( frame, frame.args[2] );
        if v2 ~= nil then
            v3 = math.cleanNumber( frame, frame.args[3] ) or v2;
            v3 = math_mod._precision_format( v3*1.8 + 32, math_mod._precision( v2_str ) );
            return v3;
        end
        return '';
    end
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 interpret_color_code( code )
    code = code:lower();
    if code == 't' then
        return w._temperature_color;
    elseif color_scheme == 'pastel' then
        return w._pastel_color;
    elseif color_scheme == 'green' then
        return w._green_color;
    elseif color_scheme == 'h' then
        return w._humidity_color;
    elseif color_scheme == 's' then
        return w._sunshine_color;
    elseif color_scheme == 'p' then
        return w._precipitation_color;
    elseif color_scheme == 'd' then
        return w._days_color;
    else
        error( 'Unknown color scheme option' );
    end    
end

function w.line( frame )
    local color_scheme = frame.args.colors or 't';
    local scale_factor = math_mod._cleanNumber( frame, frame.args.scale_factor) or 1;
    
    local pframe = frame:getParent();
    local show = pframe.args.show or '1'
    local alt = pframe.args.alt or '';
    local label = pframe.args.label or '';
    local result = '';
    
    color_scheme = interpret_color_code( color_scheme );
    
    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, color_value;
    local m1_str, m_show_str, m_alt_string;
    for _, k in ipairs( months ) do
        m1_str = pframe.args[ k .. '1' ];
        m1 = math_mod._cleanNumber( frame, m1_str );
        if show == '1' then
            m_show = m1;
            m_show_str = m1_str;
        else
            m_show_str = pframe.args[ k .. show ];
            m_show = math_mod._cleanNumber( frame, m_show_str );
        end
        if alt == '1' then
            m_alt_str = m1_str;
            m_alt = m1;
        elseif alt ~= '' then
            m_alt_str = pframe.args[ k .. alt ];
            m_alt = math_mod._cleanNumber( frame, m_alt_str );
        else
            m_alt_str = nil;
            m_alt = nil;
        end        
        
        if m1 ~= nil then
            color_value = color_scheme( m1*scale_factor );
        else
            color_value = color_scheme( nil );
        end
        
        if k == 'yr' then
            result = result .. '|style="' .. color_value ..' border-left-width:medium" | '
        else
            result = result .. '|style="' .. color_value ..'" | '
        end
        
        if m_show == nil then
            result = result .. m_show_str .. "\n"
        else
            if m_alt == nil then
                m_alt = m_alt_str;
            end
            
            if m_alt ~= nil then
                result = result .. m_show .. " <br /> (" .. m_alt .. ")\n";    
            else
                result = result .. m_show .. "\n";    
            end    
        end        
    end
    
    return result;
end

return w;