Документация
local p = {} -- p stands for package
local colorContrast = require('Module:Color contrast')

-- from https://github.com/EmmanuelOga/columns/blob/master/utils/color.lua
function hsvToRgb(h, s, v)
  local r, g, b

  local i = math.floor(h * 6);
  local f = h * 6 - i;
  local p = v * (1 - s);
  local q = v * (1 - f * s);
  local t = v * (1 - (1 - f) * s);

  i = i % 6

  if i == 0 then r, g, b = v, t, p
  elseif i == 1 then r, g, b = q, v, p
  elseif i == 2 then r, g, b = p, v, t
  elseif i == 3 then r, g, b = p, q, v
  elseif i == 4 then r, g, b = t, p, v
  elseif i == 5 then r, g, b = v, p, q
  end

  return math.floor(r * 255), math.floor(g * 255), math.floor(b * 255)
end

function p.main (frame)
	local res = ''
	local number = tonumber(frame.args['number'] or '0')
	local colors = {}
	for k, value in pairs(frame.args) do
		if k ~= 'number' then
			local h, s, v = string.match(value, "([0-9.]+), ([0-9.]+), ([0-9.]+)")
			local r, g, b = hsvToRgb(tonumber(h)/360, tonumber(s)/100, tonumber(v)/100)
			table.insert(colors, {h=tonumber(h), s=tonumber(s), v=tonumber(v), r=r, g=g, b=b, hex=string.format("%x%x%x", r , g , b)})
			-- res = res .. value:sub(1,#value-1) .. ': ' .. colors[tonumber(k)].hex.. '\r\n'
		end
	end
	
	res = res .. 'Строчки кликабельны и от/с-крывают карточку ниже'
	res = res .. '<table class="wikitable">'
	for k, c in pairs(colors) do
		res = res .. '<tr>'
		res = res .. string.format('<td class="mw-customtoggle-color%d-%d" style="background:#%s">#%s (%d, %d, %.1f)</td>', number, k, c.hex, c.hex, c.h, c.s, c.v)
		res = res .. '<td>' .. math.floor(colorContrast._ratio({'#' .. c.hex, 'black'}) * 10) / 10 .. '</td>'
		res = res .. '</tr>'
	end
	res = res .. '</table>'
	
	res = res .. '<div class="mw-customtoggle-colorarticle' .. number .. '" style="font-weight: bold;">Статья?</div>'
	res = res .. '<div class="mw-collapsible'
	if number ~= 0 then
		res = res .. ' mw-collapsed'
	end
	res = res .. '" id="mw-customcollapsible-colorarticle' .. number .. '">'
	for k, c in pairs(colors) do
		res = res .. '<div class="mw-collapsible'
		if k ~= 1 then
			res = res .. ' mw-collapsed'
		end
		res = res .. '" id="mw-customcollapsible-color' .. number .. '-' .. k .. '">'
		res = res .. frame:expandTemplate{title='Участник:Wikisaurus/Служебное/Цветная карточка', args={c.hex}}
		res = res .. '</div>'
	end
	res = res .. frame:expandTemplate{title='Участник:Wikisaurus/Служебное/Цветная статья', args={}}
	res = res .. '</div>'
	
	res = res .. '<div class="mw-customtoggle-colortable' .. number .. '" style="font-weight: bold;">Таблица?</div>'
	res = res .. '<div class="mw-collapsible'
	if number ~= 0 then
		res = res .. ' mw-collapsed'
	end
	res = res .. '" id="mw-customcollapsible-colortable' .. number .. '">'
	res = res .. '<table><tr>'
	for k, c in pairs(colors) do
		local infobox = frame:expandTemplate{title='Участник:Wikisaurus/Служебное/Цветная карточка', args={c.hex}}
		res = res .. '<td>' .. infobox .. '</td>'
		if k ~= 1 and math.fmod(k, 3) == 1 then
			res = res .. '</tr><tr><td>' .. infobox .. '</td>'
		end
	end
	res = res .. '</tr></table>'
	res = res .. '</div>'

	return res .. '</pre>'
end

return p