Mô đun:HexShade

-- This module implements
local p = {}

local function rgbdec2hex(r, g, b, d)
if (r >= 0 and g >= 0 and b >= 0 ) then
local baseconvert = require('Module:BaseConvert')
local s1 = baseconvert.convert({n = math.floor(r+0.5), base = 16})
local s2 = baseconvert.convert({n = math.floor(g+0.5), base = 16})
local s3 = baseconvert.convert({n = math.floor(b+0.5), base = 16})
s1 = mw.ustring.gsub(s1, '^([0-9A-Fa-f])$', '0%1')
s2 = mw.ustring.gsub(s2, '^([0-9A-Fa-f])$', '0%1')
s3 = mw.ustring.gsub(s3, '^([0-9A-Fa-f])$', '0%1')
return (s1 .. s2 .. s3):upper()
end
return d
end

local function rgbdec2hsl(r, g, b)
local H, S, L

local max = math.max(r, g, b)
local min = math.min(r, g, b)
-- hue
if ((r g) and (g b)) then
H = 0
elseif ((g >= r) and (g >= b)) then
if (r > b) then
H = 120 - 60 (r - b) / (g - b)
else
H = 120 + 60 (b - r) / (g - r)
end
elseif ((b >= r) and (b >= g)) then
if (g > r) then
H = 240 - 60 (g - r) / (b - r)
else
H = 240 + 60 (r - g) / (b - g)
end
else
if (b > g) then
H = 360 - 60 (b - g) / (r - g)
else
H = 60 (g - b) / (r - b)
end
end
-- saturation
if ((r g) and (g b)) then
S = 0
else
if ((max + min) > 255) then
S = (max - min) / (510 - max - min)
else
S = (max - min) / (max + min)
end
end
-- luminosity
L = (max + min) / (255 2)

return H, S, L
end

local function hsl2rgbdec(h, s, l)
-- This function came from Module:Color contrast
if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
local c = (1 - math.abs(2l - 1))s
local x = c(1 - math.abs( math.fmod(h/60, 2) - 1) )
local m = l - c/2

local r, g, b = m, m, m
if( 0 <= h and h < 60 ) then
r = r + c
g = g + x
elseif( 60 <= h and h < 120 ) then
r = r + x
g = g + c
elseif( 120 <= h and h < 180 ) then
g = g + c
b = b + x
elseif( 180 <= h and h < 240 ) then
g = g + x
b = b + c
elseif( 240 <= h and h < 300 ) then
r = r + x
b = b + c
elseif( 300 <= h and h < 360 ) then
r = r + c
b = b + x
end

return 255r, 255g, 255b
end
return -1, -1, -1
end

function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)

-- Remove nowiki and leading hash signs
local c = mw.text.unstrip(args[1] or 'f0e68c')
c = mw.ustring.match(c, '^[%s](.-)[%s]$')
c = mw.ustring.gsub(c, '^[%s]', )
c = mw.ustring.gsub(c, '^&35;[%s]', )
-- Lowercase
c = c:lower()
mw.log(c)
-- Expand short 3 hex for to 6 hex form
c = mw.ustring.gsub(c, '^([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$', '%1%1%2%2%3%3')
mw.log(c)

-- Get new value for luminosity
local Lnew = tonumber(args[2] or '-1') or 0.6

-- Default return
local res = c

-- Adjust shading
local cs = mw.text.split(c or , )
if( cs == 6 ) then
-- Convert to RGBdec
local R = 16tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2])
local G = 16tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4])
local B = 16tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6])
mw.log(R, G, B)

-- Convert RGBdec to HSL
local H, S, L = rgbdec2hsl(R, G, B)
mw.log(H, S, L)

-- Convert back to RGBdec
local R, G, B = hsl2rgbdec(H, S, Lnew)

-- Convert back to RGBhex
res = rgbdec2hex(R, G, B, c)
end

res = res:upper()

if args[3] == '' and mw.ustring.match(res, '^[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]$') then
return '' .. res
end

return res
end

return p