Module:Color contrast: Difference between revisions

m>Frietjes
No edit summary
m (2 revisions imported from wikipedia:Module:Color_contrast: see Topic:Vtixlm0q28eo6jtf)
 
(32 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 68: Line 83:


   -- 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]*([0-9][0-9%.]*)%%[%s]*%)$')
local s = mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9]*[%s]*,[%s]*([0-9][0-9]*)%%[%s]*,[%s]*[0-9][0-9]*%%[%s]*%)$')
local l = mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*%%[%s]*,[%s]*([0-9][0-9]*)%%[%s]*%)$')
return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)
return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)
  end
  -- convert from rgb
  if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$')
return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))
  end
  -- convert from rgb percent
  if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$')
return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)
   end
   end


Line 81: Line 106:
local cs = mw.text.split(c or '', '')
local cs = mw.text.split(c or '', '')
if( #cs == 6 ) then
if( #cs == 6 ) then
local R = sRGB( (16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2]))/255 )
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2])
local G = sRGB( (16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4]))/255 )
local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4])
local B = sRGB( (16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6]))/255 )
local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6])


L = 0.2126 * R + 0.7152 * G + 0.0722 * B
return rgbdec2lum(R, G, B)
return L
elseif ( #cs == 3 ) then
elseif ( #cs == 3 ) then
local R = sRGB( (16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1]))/255 )
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1])
local G = sRGB( (16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2]))/255 )
local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2])
local B = sRGB( (16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3]))/255 )
local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3])


L = 0.2126 * R + 0.7152 * G + 0.0722 * B
return rgbdec2lum(R, G, B)
return L
end
end