Module:Color contrast: Difference between revisions

    From Nonbinary Wiki
    m>Frietjes
    (add support for hsl)
    m (2 revisions imported from wikipedia:Module:Color_contrast: see Topic:Vtixlm0q28eo6jtf)
     
    (36 intermediate revisions by 12 users not shown)
    Line 16: Line 16:
    end
    end
    return v
    return v
    end
    local function rgbdec2lum( R, G, B )
    if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then
    return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)
    else
    return ''
    end
    end
    end


    local function hsl2lum( h, s, l )
    local function hsl2lum( h, s, l )
    local lum = ''
    if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
    if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
    local c = (1 - abs(2*l - 1))*s
    local c = (1 - math.abs(2*l - 1))*s
    local x = c*(1 - abs( mod(h/60, 2) - 1) )
    local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )
    local m = l - c/2
    local m = l - c/2


    local R, G, B = m, m, m
    local r, g, b = m, m, m
    if( 0 <= h and h < 60 ) then
    if( 0 <= h and h < 60 ) then
    R = R + c
    r = r + c
    G = G + x
    g = g + x
    elseif( 60 <= h and h < 120 ) then
    elseif( 60 <= h and h < 120 ) then
    R = R + x
    r = r + x
    G = G + c
    g = g + c
    elseif( 120 <= h and h < 180 ) then
    elseif( 120 <= h and h < 180 ) then
    G = R + c
    g = g + c
    B = G + x
    b = b + x
    elseif( 180 <= h and h < 240 ) then
    elseif( 180 <= h and h < 240 ) then
    G = R + x
    g = g + x
    B = G + c
    b = b + c
    elseif( 240 <= h and h < 300 ) then
    elseif( 240 <= h and h < 300 ) then
    R = R + x
    r = r + x
    B = G + c
    b = b + c
    elseif( 300 <= h and h < 360 ) then
    elseif( 300 <= h and h < 360 ) then
    R = R + c
    r = r + c
    B = G + x
    b = b + x
    end
    end
    lum = 0.2126 * sRGB(R) + 0.7152 * sRGB(G) + 0.0722 * sRGB(B)
    return rgbdec2lum(255*r, 255*g, 255*b)
    else
    return ''
    end
    end
    return lum
    end
    end


    Line 55: Line 63:
    return ''
    return ''
    end
    end
    -- html '#' entity
    c = c:gsub("&#35;", "#")
    -- whitespace
    -- whitespace
    c = c:match( '^%s*(.-)%s*$' )
    c = c:match( '^%s*(.-)[%s;]*$' )
     
    -- unstrip nowiki strip markers
    c = mw.text.unstripNoWiki(c)


    -- lowercase
    -- lowercase
    Line 66: Line 81:
    return L
    return L
    end
    end
    -- remove leading # (if there is one) and whitespace
    c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s;]*$')


       -- convert from hsl
       -- convert from hsl
       if mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*%%[%s]*,[%s]*[0-9][0-9]*%%[%s]*%)$') then
       if mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
    local h = mw.ustring.match(c,'^hsl%[%s]*([0-9][0-9]*)[%s]*,[%s]*[0-9][0-9]*%%[%s]*,[%s]*[0-9][0-9]*%%[%s]*%$')
    local h, s, l = mw.ustring.match(c,'^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*(<