Editing Module:Color contrast
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 2: | Line 2: | ||
-- This module implements | -- This module implements | ||
-- {{Color contrast ratio}} | -- {{Color contrast ratio}} | ||
-- {{ColorToLum}} | -- {{ColorToLum}} | ||
-- {{RGBColorToLum}} | -- {{RGBColorToLum}} | ||
-- | -- | ||
local p = {} | local p = {} | ||
local function sRGB ( v ) | local function sRGB ( v ) | ||
Line 14: | Line 12: | ||
else | else | ||
v = math.pow((v+0.055)/1.055, 2.4) | v = math.pow((v+0.055)/1.055, 2.4) | ||
end | |||
return v | return v | ||
end | end | ||
local function color2lum( c ) | local function color2lum( c ) | ||
if (c == nil) then | if (c == nil) then | ||
return '' | return '' | ||
end | end | ||
local HTMLcolor = { | |||
white = 1, | |||
silver = 0.52711512570581, | |||
gray = 0.2158605001139, | |||
black = 0, | |||
red = 0.2126, | |||
maroon = 0.045891942324215, | |||
yellow = 0.9278, | |||
olive = 0.20027537200568, | |||
lime = 0.7152, | |||
green = 0.15438342968146, | |||
aqua = 0.7874, | |||
teal = 0.16996855778968, | |||
blue = 0.0722, | |||
navy = 0.015585128108224, | |||
fuchsia = 0.2848, | |||
purple = 0.061477070432439, | |||
orange = 0.4817026703631, | |||
gold = 0.69860877428159, | |||
pink = 0.63271070702466, | |||
lightpink = 0.58566152734898, | |||
hotpink = 0.34658438169715, | |||
deeppink = 0.23866895828276, | |||
palevioletred = 0.28754994117889, | |||
mediumvioletred = 0.14371899849357, | |||
lightsalmon = 0.4780675225206, | |||
salmon = 0.36977241527596, | |||
darksalmon = 0.40541471563381, | |||
lightcoral = 0.35522120733135, | |||
indianred = 0.21406134963884, | |||
crimson = 0.16042199953026, | |||
firebrick = 0.10724525535015, | |||
darkred = 0.054889674531132, | |||
orangered = 0.25516243753416, | |||
tomato = 0.30638612719415, | |||
coral = 0.37017930872924, | |||
darkorange = 0.40016167026524, | |||
lightyellow = 0.98161818392882, | |||
lemonchiffon = 0.94038992245622, | |||
lightgoldenrodyellow = 0.93348351018297, | |||
papayawhip = 0.87797100199835, | |||
moccasin = 0.80083000991567, | |||
peachpuff = 0.74905589878251, | |||
palegoldenrod = 0.78792647887614, | |||
khaki = 0.77012343394121, | |||
darkkhaki = 0.45747326349994, | |||
cornsilk = 0.93562110372965, | |||
blanchedalmond = 0.85084439608156, | |||
bisque = 0.80732327372979, | |||
navajowhite = 0.76519682342785, | |||
wheat = 0.74909702820482, | |||
burlywood = 0.51559844533893, | |||
tan = 0.48237604163921, | |||
rosybrown = 0.32319457649407, | |||
sandybrown = 0.46628543696283, | |||
goldenrod = 0.41919977809569, | |||
darkgoldenrod = 0.27264703559993, | |||
peru = 0.30113074877936, | |||
chocolate = 0.23898526114557, | |||
saddlebrown = 0.097922285020521, | |||
sienna = 0.13697631337098, | |||
brown = 0.098224287876511, | |||
} | |||
-- whitespace | |||
c = c:match( '^%s*(.-)%s*$' ) | |||
-- lowercase | -- lowercase | ||
c = c:lower() | c = c:lower() | ||
-- first try to look it up | -- first try to look it up | ||
local L = HTMLcolor[c] | local L = HTMLcolor[c] | ||
Line 81: | Line 97: | ||
return L | return L | ||
end | end | ||
-- remove leading # (if there is one) and whitespace | -- remove leading # (if there is one) and whitespace | ||
c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$') | c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$') | ||
Line 106: | Line 103: | ||
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 G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4]) | local G = sRGB( (16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4]))/255 ) | ||
local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6]) | local B = sRGB( (16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6]))/255 ) | ||
L = 0.2126 * R + 0.7152 * G + 0.0722 * 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 G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2]) | local G = sRGB( (16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2]))/255 ) | ||
local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3]) | local B = sRGB( (16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3]))/255 ) | ||
L = 0.2126 * R + 0.7152 * G + 0.0722 * B | |||
return L | |||
end | end | ||
-- failure, return blank | -- failure, return blank | ||
return '' | return '' | ||
end | end | ||
function | local function colors2ratio(c1,c2) | ||
local v1 = color2lum(c1) | |||
local v1 = color2lum( | |||
local v2 = color2lum(c2) | local v2 = color2lum(c2) | ||
if (type(v1) == 'number' and type(v2) == 'number') then | if (type(v1) == 'number' and type(v2) == 'number') then | ||
return (v2 + 0.05)/(v1 + 0.05) | |||
else | else | ||
return | return '' | ||
end | end | ||
end | end | ||
Line 216: | Line 137: | ||
function p.ratio(frame) | function p.ratio(frame) | ||
local | local r = colors2ratio( | ||
frame.args[1] or frame:getParent().args[1], | |||
frame.args[2] or frame:getParent().args[2] | |||
) | |||
if (r ~= '') then | |||
return r | |||
else | |||
return frame.args['error'] or frame:getParent().args['error'] or '?' | |||
end | |||
end | end | ||
return p | return p |