Module:ChartColors
local p = {}
 
 local ARG = require &quot;Module:Arguments&quot;
 local CFCM = require &quot;Module:ComplForColorModules&quot;
 local TNTT = require &quot;Module:TNTTools&quot;
 local SD = require &quot;Module:SimpleDebug&quot;
 
 local I18n = 'ChartColors'
 
 local function I18nStr (S, ...)
 	return TNTT.GetMsgP (I18n, S, {...})
 end
 
 --local RS_ColorNameInvalid = 'El nom del color (%s) no és vàlid (ha de ser Categ20 o Plotter)'
 --local RS_ColorNumInvalid = 'El nombre de colors hauria d’estar entre 1 i %d (ara és %d)'
 --local RS_StartNumInvalid = 'El número del primer color hauria d’estar entre 1 i %d (ara és %d)'
 
 local category20 = {
 	'#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5', 
 	'#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f', '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5',
 }
 local plotter = {--from Module:Plotter/DefaultColors
 	'red', 'blue', 'green', 'yellow', 'fuchsia', 'aqua', 'brown', 'orange', 'purple', 'sienna',
 	'#F0A3FF', '#191919', '#005C31', 'honeydew', '#808080', 'khaki', 'lime', 'navy', 'pink', '#426600',
 	'#5EF1F2', 'turquoise', '#E0FF66', 'violet', '#FFFF80', '#FF5005',
 }
 
 function p.GetColors (ColorName, IsInv, StartN, N, CallError)
 	local SelColors = {}
 	local ColorNameL = string.lower(ColorName)
 	local Palet0 = {}
 	if ColorNameL == 'categ20' then
 		Palet0 = category20
 	elseif ColorNameL == 'plotter' then
 		Palet0 = plotter 
 	elseif CallError then	
 		error (I18nStr ('ColorNameInvalid',ColorName))
 	end	
 	MaxN = table.getn(Palet0)
 	if (N &lt; 0) or (N &gt; MaxN) then
 		error (I18nStr ('ColorNumInvalid',tostring(MaxN),tostring(N)))
 	else
 		Palet = {}
 		if IsInv then
 			for i=MaxN, 1, -1 do
 				table.insert(Palet, Palet0[i])
 			end	
 		else
 			Palet = Palet0
 		end
 		if StartN &gt; MaxN then
 			error (I18nStr ('StartNumInvalid',tostring(MaxN),tostring(StartN)))
 		end	
 		local Step = 1
 		local NEnd = N
 		if (ColorNameL == 'categ20') and (N&lt;=10) then 
 			Step = 2
 			if StartN == 1 then
 				NEnd = N*2
 			end	
 		end	
 		if StartN == 1 then
 			for i=1, NEnd, Step do
 				table.insert(SelColors, Palet[i])
 			end
 		else
 			Count = 0
 			for i=StartN, MaxN, Step do
 				table.insert(SelColors, Palet[i])
 				Count = Count + 1
 				if Count == NEnd then
 					break
 				end	
 			end
 			if Count &lt; NEnd then
 				for i=1, MaxN, Step do
 					table.insert(SelColors, Palet[i])
 					Count = Count + 1
 					if Count == NEnd then
 						break
 					end	
 				end
 			end	
 		end	
 		return SelColors
 	end	
 end --GetColors
 
 function p.ColorNameInvStartFromS (S)
 	local StartN = 1
 	local ParamsA = {}
 	local ColorName, IsInv
     ColorName, IsInv, ParamsA = CFCM.ColorNameInvFromS0 (S)
 	local PN = table.getn(ParamsA)
 	if PN &gt; 1 then
 		if ParamsA[2]=='i' then
 			IsInv = true
 		else
 			StartN = tonumber (ParamsA[2])
 		end
 		if PN == 3 then
 			StartN = tonumber (ParamsA[3])
 		end	
 	end	
 	return ColorName, IsInv, StartN			    	
 end --ColorNameInvStartFromS
 
 function ColorNameInv (args)
 	local S = args[1] or ''
     local ColorName, IsInv, ParamsA = CFCM.ColorNameInvFromS0 (S)
     local StartN = 1
 	ColorName, IsInv, StartN = p.ColorNameInvStartFromS (S)
 	return ColorName, IsInv, StartN			    	
 end --ColorNameInv	
 
 function p.ShowColors(frame)
 	local args = ARG.getArgs(frame,{
 		removeBlanks = false
 	});
 	local ColorName, IsInv, StartN = ColorNameInv (args)
 	local N = tonumber(args[2])
 	local WriteColor = args[3] or &quot;&quot;
 	local ColorFound = {}
 	ColorFound = p.GetColors (ColorName, IsInv, StartN, N, true)
 	local boxes = {}
 	for i=1, table.getn(ColorFound) do
 		table.insert(boxes, CFCM.Box(ColorFound[i],WriteColor))
 	end	
 	return table.concat(boxes, &quot; &quot;)
 end --ShowColors
 
 function p.Legends(frame)
 	local args = ARG.getArgs(frame,{
 		removeBlanks = false
 	})
 	local Nargs = require(&quot;Module:TableTools&quot;).length(args)
 	local ColorName, IsInv, StartN = ColorNameInv (args)
 	local N = tonumber(args[2])
 	local ColWidth = args[3]
 	local ColorFound = {}
 	local Labels = {}
 	local NLabels = 0
 	local IsTemplate = true
 	ColorFound = p.GetColors (ColorName, IsInv, StartN, N, true)
 	Labels, NLabels, OutlineColor = CFCM.GetLabels (args, N, 4)
 	return CFCM.LegendText (ColorFound, Labels, NLabels, ColWidth, IsTemplate, OutlineColor)
 end