Pojdi na vsebino

Modul:BaseConvert

Iz Wikipedije, proste enciklopedije
Redakcija dne 22:06, 24. junij 2013 od Badavinc (pogovor | prispevki) (nov modul)
(razl) ← Starejša redakcija | prikaži trenutno redakcijo (razl) | Novejša redakcija → (razl)
Documentation icon Dokumentacija modula[predogled] [uredi] [zgodovina] [osveži]

Converts numbers to a specified base between 2 and 36, for use in templates such as {{binary}}, {{octal}}, {{hexadecimal}}, etc.

Example usage:

local BaseConvert = require('Modul:BaseConvert')
BaseConvert.convert({n = 14600926, base = 16}) -- returns 'DECADE'

Arguments:

  • n - (required) the number to be converted, as a string. It may be a number instead, if the input base is 10.
  • base - (required) the base to which the number should be converted. May be between 2 and 36, inclusive.
  • from - the base of the input. Defaults to 10 (or 16 if the input has a leading '0x'). Note that bases other than 10 are not supported if the input has a fractional part.
  • precision - number of digits to be rendered after the radix point. Trailing zeros will be added if needed. If not specified, however many digits are needed will be shown, up to 10.
  • width - minimum number of digits to be rendered before the radix point. Leading zeros will be added if needed.
  • default - Value to return if n is empty or non-numeric. Defaults to the value of n.
  • prefix / suffix - wikitext to add before/after the returned result. Will not be added if n is empty or non-numeric. For example, you might use a prefix of 0x when converting to hex, or a suffix of <sub>8</sub> when converting to octal.
w = {};
convert = require( 'Module:BaseConvert' );
math_mod = require( 'Module:Math' );

function hex( value )
    return convert.convert( { n = value, base = 16, width = 2, precision = 0 } );
end

function format_line( background, text_color )
    return table.concat( {"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
   
    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 = table.concat( { 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 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
    
    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._none_color( val )
    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 == 'none' then
        return w._none_color;
    else
        error( 'Unknown color scheme option' );
    end    
end

return w;