이 모듈에 대한 설명문서는 모듈:HSL/설명문서에서 만들 수 있습니다
-- Module:HSL
local p = {}
-- HEX 색상 문자열 → R, G, B 변환
local function hexToRgb(hex)
hex = hex:gsub("#", "")
if #hex == 6 then
local r = tonumber(hex:sub(1, 2), 16)
local g = tonumber(hex:sub(3, 4), 16)
local b = tonumber(hex:sub(5, 6), 16)
return r, g, b
end
return 0, 0, 0 -- fallback
end
-- RGB → HSL
local function rgbToHsl(r, g, b)
r = r / 255
g = g / 255
b = b / 255
local max = math.max(r, g, b)
local min = math.min(r, g, b)
local h, s, l = 0, 0, (max + min) / 2
if max ~= min then
local d = max - min
s = l > 0.5 and d / (2 - max - min) or d / (max + min)
if max == r then
h = (g - b) / d + (g < b and 6 or 0)
elseif max == g then
h = (b - r) / d + 2
else
h = (r - g) / d + 4
end
h = h / 6
end
return h * 360, s * 100, l * 100
end
-- L 조정
local function adjustL(l, h)
local l_adj = l > 50 and (-0.6 * l + 70) or (0.75 * l)
if h > 39 and h < 88 then
l_adj = l_adj - 10
end
return math.max(0, math.min(100, math.floor(l_adj + 0.5)))
end
-- H, S 수정 규칙
local function applySpecialRules(h, s, l)
if (l > 90 or (h > 220 and h < 268 and l > 80)) or s < 12.5 then
return 200, 5, l
else
return h, s, l
end
end
-- 메인
function p.main(frame)
local args = frame:getParent().args
local colorStr = args[1] or ""
local r = tonumber(args['r'])
local g = tonumber(args['g'])
local b = tonumber(args['b'])
-- HEX 형식이면 파싱
if colorStr:match("^#%x%x%x%x%x%x$") then
r, g, b = hexToRgb(colorStr)
end
if not (r and g and b) then
return "Invalid RGB input"
end
local h, s, l = rgbToHsl(r, g, b)
h, s, l = applySpecialRules(h, s, l)
local l_adj = adjustL(l, h)
return string.format("HSL(%d, %d%%, %d%%)", math.floor(h + 0.5), math.floor(s + 0.5), l_adj)
end
return p