Latest revision |
Your text |
Line 63: |
Line 63: |
| return '' | | return '' |
| end | | end |
|
| |
| -- html '#' entity
| |
| c = c:gsub("#", "#")
| |
|
| |
| -- whitespace | | -- whitespace |
| c = c:match( '^%s*(.-)[%s;]*$' ) | | c = c:match( '^%s*(.-)[%s;]*$' ) |
|
| |
| -- unstrip nowiki strip markers
| |
| c = mw.text.unstripNoWiki(c)
| |
|
| |
|
| -- lowercase | | -- lowercase |
Line 125: |
Line 118: |
| function p._greatercontrast(args) | | function p._greatercontrast(args) |
| local bias = tonumber(args['bias'] or '0') or 0 | | local bias = tonumber(args['bias'] or '0') or 0 |
| local css = (args['css'] and args['css'] ~= '') and true or false
| |
| local v1 = color2lum(args[1] or '') | | local v1 = color2lum(args[1] or '') |
| local c2 = args[2] or '#FFFFFF' | | local c2 = args[2] or '#FFFFFF' |
Line 131: |
Line 123: |
| local c3 = args[3] or '#000000' | | local c3 = args[3] or '#000000' |
| local v3 = color2lum(c3) | | local v3 = color2lum(c3) |
| local ratio1 = -1; | | local ratio1 = 0; |
| local ratio2 = -1; | | local ratio2 = 0; |
| if (type(v1) == 'number' and type(v2) == 'number') then | | if (type(v1) == 'number' and type(v2) == 'number') then |
| ratio1 = (v2 + 0.05)/(v1 + 0.05) | | ratio1 = (v2 + 0.05)/(v1 + 0.05) |
Line 141: |
Line 133: |
| ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2 | | ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2 |
| end | | end |
|
| | return (ratio1 + bias > ratio2) and c2 or c3 |
| if css then
| |
| local c1 = args[1] or ''
| |
| if mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
| |
| mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
| |
| c1 = '#' .. c1
| |
| end
| |
| if mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
| |
| mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
| |
| c2 = '#' .. c2
| |
| end
| |
| if mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
| |
| mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
| |
| c3 = '#' .. c3
| |
| end
| |
| return 'background-color:' .. c1 .. '; color:' .. ((ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '') .. ';'
| |
| end
| |
|
| |
| return (ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '' | |
| end | | end |
|
| |
|
Line 173: |
Line 147: |
| else | | else |
| return args['error'] or '?' | | return args['error'] or '?' |
| end
| |
| end
| |
|
| |
| function p._styleratio(args)
| |
| local style = (args[1] or ''):lower()
| |
| local bg, fg = 'white', 'black'
| |
| local lum_bg, lum_fg = 1, 0
| |
|
| |
| if args[2] then
| |
| local lum = color2lum(args[2])
| |
| if lum ~= '' then bg, lum_bg = args[2], lum end
| |
| end
| |
| if args[3] then
| |
| local lum = color2lum(args[3])
| |
| if lum ~= '' then fg, lum_fg = args[3], lum end
| |
| end
| |
|
| |
| local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or '', '&#[Xx]23;', '#'), '#', '#'), ';')
| |
| for k = 1,#slist do
| |
| local s = slist[k]
| |
| local k,v = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' )
| |
| k = k or ''
| |
| v = v or ''
| |
| if (k:match('^[%s]*(background)[%s]*$') or k:match('^[%s]*(background%-color)[%s]*$')) then
| |
| local lum = color2lum(v)
| |
| if( lum ~= '' ) then bg, lum_bg = v, lum end
| |
| elseif (k:match('^[%s]*(color)[%s]*$')) then
| |
| local lum = color2lum(v)
| |
| if( lum ~= '' ) then bg, lum_fg = v, lum end
| |
| end
| |
| end
| |
| if lum_bg > lum_fg then
| |
| return (lum_bg + 0.05)/(lum_fg + 0.05)
| |
| else
| |
| return (lum_fg + 0.05)/(lum_bg + 0.05)
| |
| end | | end |
| end | | end |
Line 218: |
Line 157: |
| 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._ratio(args) | | return p._ratio(args) |
| end
| |
|
| |
| function p.styleratio(frame)
| |
| local args = frame.args[1] and frame.args or frame:getParent().args
| |
| return p._styleratio(args)
| |
| end | | end |
|
| |
|