Modulo:Colori

From Semi del Verbo

La documentazione per questo modulo può essere creata in Modulo:Colori/man

-- Questo modulo fornisce funzioni base per manipolare i colori in CSS

local p={};

--[[
is_rgb

Restituisce '1' se la stringa passata come primo argomento combacia con l'espressione regolare /#?([0-9A-Fa-f]{3,4}|[0-9A-Fa-f]{6})/,
'0' altrimenti.

Uso:
{{#invoke:colori|is_rgb|code|rigorous=eventuale_stringa}}

Parametri
	code: La stringa su cui si vuole effettuare la verifica.
	rigorous: Da valorizzare se si vuole forzare la funzione a riconoscere un pattern di 6 caratteri esadecimali.

Esempi di chiamata:
	{{#invoke:colori|is_rgb|abcxyz}} (resituisce '0')
	{{#invoke:colori|is_rgb|abcdef}} (resituisce '1')
	{{#invoke:colori|is_rgb|#abcDEF}} (resituisce '1')
	{{#invoke:colori|is_rgb|#012}} (resituisce '1')
	{{#invoke:colori|is_rgb|#012|rigorous=sì}} (resituisce '0')
	{{#invoke:colori|is_rgb|#012ABC|rigorous=sì}} (resituisce '1')
]]
function p.is_rgb(frame)
	local code = frame.args[1] or nil
	local rigorous = frame.args.rigorous or false	-- sarà equivalente a "true" se è una stringa con qualunque valore
	if code == nil then return nil end
	if code:match("^#?[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]$") or
			( not rigorous and code:match("^#?[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]?$") ) then
		return '1';
	else
		 return '0';
	end
end

--[[
rgba

Restituisce la funzione CSS3 'rgba( x, y, z, t )' (dove x, y e z sono i codici decimali dei colori e t è l'opacità)
se la stringa in ingresso è in formato esadecimale completo,
altrimenti restituisce la stringa in input.

Uso:
{{#invoke:colori|rgba|code|alpha_value}}

Parametri
	code: La stringa che si vuole trasformare in funzione RGBa.
	alpha_value: Percentuale di opacità.
		Valori ammessi:
		- numero decimale, da 0.0 a 1.0;
		- valore percentuale intero, da 0% a 100%.
		Il valore di default è massimo (1.0).

Esempi di chiamata:
	{{#invoke:colori|rgba|abcDEF}}
	{{#invoke:colori|rgba|#012ABC}}
	{{#invoke:colori|rgba|#AABBCC|0.6}}
]]
function p.rgba(frame)
	local code = frame.args[1]
	local alpha = frame.args[2] or "1.0"
	if code == nil or code == "" then return nil end
	frame.args.rigorous = true
	if p.is_rgb(frame) ~= '1' then return code
	else
		if alpha:match("^0*%d?%d%%") then
			alpha = alpha:gsub("%%","")
			alpha = tostring(tonumber(alpha) / 100)
		elseif not alpha:match("^0?%.%d+$") and not alpha:match("^0+$") then
			alpha = "1.0"
		end
		rgba_values = {}
		for substr in code:gmatch("(%w%w)") do
			table.insert(rgba_values, tostring(tonumber(substr, 16)))
		end
		table.insert(rgba_values, alpha)
		return string.format("rgba( %s )", table.concat(rgba_values, ", "))
	end
end

return p