Module:Color contrast: Difference between revisions
rudimentary CSS parser
m>Frietjes (better error checking) |
m>Kephir (rudimentary CSS parser) |
||
Line 202: | Line 202: | ||
local args = frame.args[1] and frame.args or frame:getParent().args | local args = frame.args[1] and frame.args or frame:getParent().args | ||
return p._greatercontrast(args) | return p._greatercontrast(args) | ||
end | |||
-- warning: crude! may be fooled by sufficientry tricky CSS | |||
function p.extract_css_colors(css, e) | |||
local fgcolor, bgcolor | |||
css = css:gsub("/%*.-%*/", "") | |||
for name, value in string.gmatch(css, "([a-z-]*)%s*:%s*([^;]*)") do | |||
value = mw.text.trim(value) | |||
if name == 'color' then | |||
fgcolor = value | |||
elseif name == 'background-color' then | |||
bgcolor = value | |||
elseif name == 'background' then | |||
value = value:gsub("url%((['\"]?).-%1%)", "") | |||
bgcolor = value:match("#[0-9A-Fa-f]*") or value:match("rgba?%([0-9.%, ]*%)") or value:match("hsla?%([0-9.%, ]*%)") | |||
if not bgcolor then | |||
value = value:gsub("[0-9.][0-9.]*[%%a-z][a-z]?[a-z]?", "") | |||
value = value:gsub("auto", ""):gsub("cover", ""):gsub("contain", "") | |||
value = value:gsub("scroll", ""):gsub("fixed", ""):gsub("local", "") | |||
value = value:gsub("left", ""):gsub("right", ""):gsub("top", ""):gsub("bottom", ""):gsub("center", "") | |||
value = value:gsub("no%-repeat", ""):gsub("repeat", ""):gsub("repeat%-[xy]", ""):gsub("space", ""):gsub("round", "") | |||
value = value:gsub("border%-box", ""):gsub("padding%-box", ""):gsub("content%-box", "") | |||
bgcolor = mw.text.trim(value) | |||
end | |||
end | |||
end | |||
return fgcolor, bgcolor | |||
end | end | ||
return p | return p |