Модуль:Colour (Bk;rl,&Colour)

Перейти к навигации Перейти к поиску
Документация
-- Просто попытка использовать Луа
-- Практическая ценность минимальна (хотя функция hsv_to_rgb может кому пригодится?)

local p = {}

-- оттенок от 0 до 360
function p.hsv_to_rgb(hue_input, saturation, value)
    local hue = hue_input % 360
    local chroma = saturation * value
    local h = hue / 60
    local x = (1 - math.abs(h % 2 - 1)) * chroma
    
    local r, g, b = 0, 0, 0
    
    if h < 1 then
        r, g = chroma, x
    elseif h < 2 then
        r, g = x, chroma
    elseif h < 3 then
        g, b = chroma, x
    elseif h < 4 then
        g, b = x, chroma
    elseif h < 5 then
        r, b = x, chroma
    else
        r, b = chroma, x
    end
    
    m = value - chroma
    return r+m, g+m, b+m
end

function p.rgb_to_css(r, g, b)
  return 'rgb(' .. math.ceil(r*255) .. ',' .. math.ceil(g*255) .. ',' .. math.ceil(b*255) .. ')'
end

function p.hsv_to_css(h, s, v)
    local r, g, b = p.hsv_to_rgb(h, s, v)
    return p.rgb_to_css(r, g, b)
end

function p.rainbow(frame)
    local s = frame.args[1]
    local r = ''
    local l = mw.ustring.len(s)
    local i = 0
    for v in mw.ustring.gmatch(s, '.') do
        r = r .. '<span style="color: ' .. p.hsv_to_css(i * 360 / l, 1, 0.7) .. ';">' .. v .. '</span>'
        i = i + 1
    end
    return r
end

-- определяем цвет по числу
function p.map_number_to_color_css_args(number, raised_to, minnum, maxnum, s, v)
	-- получаем значение от 0 до 1
	-- TODO: убедиться, что maxnum ≠ minnum
	local h = (number - minnum) / (maxnum - minnum)
	if h < 0 then
		h = 0
	end
	if h >= 1 then
		h = 1
	end
	
	-- теперь возьмём цвет
	return p.hsv_to_css(math.pow(h, raised_to) * 400 - 40, s, v)
end

function p.map_number_to_color_css(frame)
	return p.map_number_to_color_css_args(
			tonumber(frame.args[1]), tonumber(frame.args[2]),
			tonumber(frame.args[3]), tonumber(frame.args[4]),
			tonumber(frame.args[5]), tonumber(frame.args[6])
		)
end


return p