Mòdul:Multicol/proves

De Viquipèdia
Salta a la navegació Salta a la cerca
Icona de documentació de mòdul Documentació del mòdul [ mostra ] [ modifica el codi ] [ mostra l'historial ] [ refresca ]

Mòdul Multicol (codi · ús · discussió · tests · casos prova | subpàgines · enllaços)

A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]


Mòdul per col·locar text en columnes:

  • Repartiment automàtic o manual de les línies.
  • El repartiment automàtic en columnes té en compte no trencar les línies que contenen "sublínies". Així, les "sublínies" sempre estaran sota de la línia principal i, per tant, en la mateixa columna. El motiu és millorar-ne la lectura. Un exemple de línia amb "sublínies" seria:
Línia 1
  • Sublínia 1.1
  • Sublínia 1.2
  • Pel grup de columnes: es pot definir amplada, encapçalament, peu, color de fons, alineació. L'alineació a dreta o esquerra permet que el text de l'article flueixi per l'altre costat.
  • Per a les columnes, es pot definir:
    • Que l'amplada de cadascuna sigui igual o ajustada al contingut.
    • La separació entre columnes.


Utilitzat per {{Multicol}}.

Per traduir o revisar la traducció al vostre idioma del mòdul, editeu amb compte Data:I18n/Multicol.tab.

Sintaxi[modifica]

El mode més senzill és: {{#invoke:Multicol|main|n_cols=|línies=
línia 1
línia 2
..
}}

On:

  • n_cols és el nombre de columnes (per defecte 1)


nom del paràmetre què fa
en anglès en català
lines línies Les línies, únic camp obligatori. Una línia que sigui "---" indica salt de columna manual. Si va seguida d'una mida (en px, em o %), aquesta indica la mida de l'amplada de la columna.
col_n n_cols Nombre de columnes. Es comprovarà que no hi hagi una línia "separadora" (que tingui de començament --), si hi és es considerarà que és un salt de columna manual, llavors el nombre de columnes es calcularà pel nombre de línies "separadores".
width amplada Nombre. Màxim espai ocupat per les columnes. El número pot ser en px, em o %. Per defecte ocupa l'amplada segons l'amplada de ocupada per les línies.
same_width id_amplada Booleà, Si és que sí, l'amplada de les columnes serà igual per a totes elles, independentment de l'amplada ocupada per les línies. Per defecte l'amplada depèn de l'amplada ocupada per les línies.
header encapçalament A dalt de les columnes, apareixerà en negreta i centrat.
footer peu A baix de les columnes.
h_align alineació_h Es pot determinar que s'alinei al centre/center, a la dreta/right o a l'esquerra/left. Només té efecte si l'amplada no és del 100%. Si s'alinea a dreta o esquerra, el text de l'article podrà fluir pel costat (com en una imatge inserida).
v_align alineació_v Per defecte s'alinea a dalt, però es pot determinar que s'alinei al centre/center o avall/bottom.
col_sep sep_cols Estableix els marges de separació del text entre les columnes. El número pot ser en px, em. Per defecte és 0.6em per costat de columna.
bg_color color_fons Color de fons. Per defecte és transparent.

Exemples[modifica]

Llista puntejada[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
línies =
*[[Primer]]
*Segon
*Tercer
*Quart
*'''Cinquè'''
*{{color|red|Sisè}}
*Setè
}}
  • Cinquè
  • Sisè
  • Setè


Llista no puntejada[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 3|
línies =
Primer
Segon
Tercer
Quart
Cinquè
Sisè
Setè
}}

Primer

Segon

Tercer

Quart

Cinquè

Sisè

Setè


Alineació horitzontal[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 3|
alineació_h=centre|
línies =
Primer
Segon
Tercer
Quart
Cinquè
Sisè
Setè
}}

Primer

Segon

Tercer

Quart

Cinquè

Sisè

Setè


Alineació vertical[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 3|
alineació_v = centre|
línies =
Primer
Segon
Tercer
Quart
Cinquè
Sisè
Setè
}}

Primer

Segon

Tercer

Quart

Cinquè

Sisè

Setè


Text al costat[modifica]

No utilitzeu el text al costat per a més d'una o dues columnes.

{{#invoke:Multicol/proves|main|
alineació_h = dreta|
línies =
Primer
Segon
}}
{{lorem}}

Primer

Segon

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.


{{#invoke:Multicol/proves|main|
alineació_h = esquerra|
n_cols = 2|
encapçalament = Explicació|
línies =
'''Primer'''
Nota

'''Segon'''
Nota 1
Nota 2
}}
{{lorem}}
{{lorem}}
Explicació

Primer
Nota

Segon
Nota 1
Nota 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.


Llista amb salt de columna manual[modifica]

{{#invoke:Multicol/proves|main|
línies =
Primer
Segon
---
Tercer
Quart
---
Cinquè
Sisè
Setè
}}

Primer

Segon

Tercer

Quart

Cinquè

Sisè

Setè


Color de fons[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
color_fons = LightYellow|
línies =
Una
Dues
Tres
Quatre
}}

Una

Dues

Tres

Quatre


Llista no puntejada amb encapçalament i peu[modifica]

Estil predefinit de l'encapçalament[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 3|
encapçalament = Encapçalament|
línies =
Primer
Segon
Tercer<ref>Referència al peu d'aquestes columnes</ref>
Quart
Cinquè
Sisè
Setè|
peu=<references/>
}}
Encapçalament

Primer

Segon

Tercer[1]

Quart

Cinquè

Sisè

Setè

  1. Referència al peu d'aquestes columnes


Estil d'encapçalament definit per l'usuari[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 3|
color_fons = Snow|
encapçalament_lliure = '''{{color|green|Encapçalament}}'''
<small>(amb una nota a sota, amb text petit)</small>|
color_fons_encapçalament = Lavender|
línies =
Primer
Segon
Tercer
Quart
Cinquè
Sisè
Setè|
peu=Aquesta és una nota al peu de les columnes|
color_fons_peu = Lavender|
}}
Encapçalament
(amb una nota a sota, amb text petit)

Primer

Segon

Tercer

Quart

Cinquè

Sisè

Setè

Aquesta és una nota al peu de les columnes


Modificant l'amplada[modifica]

Amplada de les columnes proporcional al contingut[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
amplada = 50%|
línies =
Una línia, més o menys llarga
Altra
}}

Una línia, més o menys llarga

Altra


Amplada de les columnes proporcional a l'amplada total[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
amplada = 50%|
id_amplada = sí|
línies =
Una línia, més o menys llarga
Altra
}}

Una línia, més o menys llarga

Altra


Modificant el marge de les columnes[modifica]

Sense modificar[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
línies =
Una línia, més o menys llarga
Altra
}}

Una línia, més o menys llarga

Altra


Modificant-lo[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
sep_cols = 1.2em|
línies =
Una línia, més o menys llarga
Altra
}}

Una línia, més o menys llarga

Altra


Línies heterogènies[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
línies =
Una línia, més o menys llarga
Amb la 1ª
També amb la 1ª

Altre

Final
}}

Una línia, més o menys llarga
Amb la 1ª
També amb la 1ª

Altre

Final


{{#invoke:Multicol/proves|main|
n_cols = 2|
línies =
Una línia, més o menys llarga
:Amb la 1ª
:També amb la 1ª

Altre
*Altre 1
*Altre 2

;Final: I ja està
}}

Una línia, més o menys llarga

Amb la 1ª
També amb la 1ª

Altre

  • Altre 1
  • Altre 2

Final
I ja està


{{#invoke:Multicol/proves|main|
n_cols = 2|
línies =
Una línia, més o menys llarga
Altra

Tercera

Quarta
}}

Una línia, més o menys llarga
Altra

Tercera

Quarta


{{#invoke:Multicol/proves|main|
n_cols = 2|
línies =
Una línia, més o menys llarga
Altra
}}

Una línia, més o menys llarga

Altra


{{#invoke:Multicol/proves|main|
n_cols = 2|
línies =
*Una línia, més o menys llarga
*Altra
}}
  • Una línia, més o menys llarga
  • Altra


Una línia massa llarga[modifica]

El problema[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
color_fons = LightYellow|
línies =
Primer
Segon, amb un comentari que pot resultar massa llarg
Tercer
Quart
}}

Primer

Segon, amb un comentari que pot resultar massa llarg

Tercer

Quart


Solució 1[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
color_fons = LightYellow|
línies =
Primer
Segon, amb un comentari<br>que pot resultar massa llarg
Tercer
Quart
}}

Primer

Segon, amb un comentari
que pot resultar massa llarg

Tercer

Quart


Solució 2[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
color_fons = LightYellow|
línies =
Primer

Segon, amb un comentari
que pot resultar massa llarg

Tercer

Quart
}}

Primer

Segon, amb un comentari
que pot resultar massa llarg

Tercer

Quart


Solució 3[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
color_fons = LightYellow|
amplada = 20%|
línies =
---80%
Primer
Segon, amb un comentari que pot resultar massa llarg
---20%
Tercer
Quart
}}

Primer

Segon, amb un comentari que pot resultar massa llarg

Tercer

Quart


Solució 4[modifica]

{{#invoke:Multicol/proves|main|
n_cols = 2|
color_fons = LightYellow|
línies =
---200px
Primer
Segon, amb un comentari que pot resultar massa llarg
---50px
Tercer
Quart
}}

Primer

Segon, amb un comentari que pot resultar massa llarg

Tercer

Quart


local p = {}

local SA = require "Module:SimpleArgs"
local SD = require "Module:SimpleDebug"
local TNTT = require "Module:TNTTools"
local dir = require "Module:Dir"

local I18n = 'Multicol'
local function I18nStr (S, ...)
	return TNTT.GetMsgP (I18n, S, {...})
end

local function I18nStrArrOr1 (S)
	return TNTT.TabTransMT (I18n, S, 2)
end

local RS_NColumnsBiggerNLabels = 'NColumnsBiggerNLabels'

local lang = mw.language.getContentLanguage().code
local dirh = ''
if dir.isRTL(lang) then
	dirh = 'rtl'
else
	dirh = 'ltr'
end	

function p.MultiCol (splited, NCols, LinesByLin)
	local NLines = 0
	local LinCol = {}
	local WithBreakLine = false
	local HeightByLin = {}
	local ColWidht = {}
	
	function PrepareItems ()
		local IsUl = false
		local IsFirst = true
		local NLinesCol = 0
		for k, v in ipairs(LinesByLin) do
			NLinesCol = NLinesCol + 1
			v = mw.text.trim (v)
			if splited then
				local z = {}
				table.insert (z, v)
				LinesByLin[k] = z	
			else	
				v = mw.text.split(v, "\n")
				LinesByLin[k] = v	
			end
		end
		for k, v in ipairs(LinesByLin) do
			local Char = string.sub(v[1],1,1) or ''
			if Char == ';' then
				local Sep = string.find(v[1],':') or 0
				if Sep ~=0 then
					local Temp = {}
					local Begin = mw.text.trim (string.sub (v[1],1,Sep-1))
					local End = mw.text.trim (string.sub (v[1],Sep+1))
					table.insert (Temp, Begin)
					table.insert (Temp, End)
					for kk = 2, #v do
						table.insert (Temp, v[kk])
					end	
					LinesByLin[k] = Temp
				end	
			end	
		end	
		for k, v in ipairs(LinesByLin) do
			local Begin = string.sub(v[1], 1, 3)
			if (#v == 1) and (Begin == '---') then
				WithBreakLine = true
				break
			end	
		end
		if WithBreakLine then
			local LinesByLinTemp = {}
			local CurCol = 1
			for k, v in ipairs(LinesByLin) do
				local Begin = string.sub(v[1], 1, 3)
				if (#v == 1) and (Begin == '---') then
					if k ~= 1 then
						CurCol = CurCol + 1
					end	
					local width = string.sub(v[1], 4)
					if width ~= '' then
						SA.CheckSize (CurCol, width)
					end	
					table.insert (ColWidht, width)
				else
					table.insert (LinesByLinTemp, v)
					table.insert (LinCol, CurCol)			
				end	
			end
			NCols = CurCol
			LinesByLin = {}
			for k, v in ipairs(LinesByLinTemp) do
				table.insert (LinesByLin, v)
			end	
		else
			for k, v in ipairs(LinesByLin) do
				table.insert (LinCol, 1)
				local h = 0
				for kk, vv in ipairs(v) do
					local HByL = 0
					if kk == 1 then
						local Char = string.sub(vv,1,1) or ''
						if (Char == ';') or (Char == '*') then
							HByL = 0.8
						elseif #v > 1 then
							local Char = string.sub(v[2],1,1) or ''
							if (Char == '*') or (Char == '#') or (Char == ':') then
								HByL = 1
							else
								HByL = 0.8
							end	
						else	
							HByL = 1
						end	
					elseif kk == #v then
						HByL = 1
					else	
						HByL = 0.8
					end	
					h = h + HByL
				end	
				table.insert (HeightByLin, h)
				NLines = NLines + h
			end	
		end	
	end --PrepareItems
	
	function SetColToLines ()
		local AbsLinesPerCol = 0
		function CalcLinesPerCol (L,C)
			AbsLinesPerCol = L/C
		end
		CalcLinesPerCol (NLines, NCols)
		local DoItN = 0
		local LinesForDo = NLines
		local ColsForDo = NCols
		local CurrCol = 1
		for k, v in ipairs(LinesByLin) do
			local fornext = false
			if (AbsLinesPerCol - DoItN) + 0.4 < ((DoItN + HeightByLin[k]) - AbsLinesPerCol) then
				LinCol[k] = CurrCol + 1
				fornext = true
			else
				LinCol[k] = CurrCol
			end
			DoItN = DoItN + HeightByLin[k]		
			if (DoItN >= AbsLinesPerCol) or fornext then
				LinesForDo = LinesForDo - DoItN
				if LinesForDo > 0 then
					ColsForDo = ColsForDo - 1
					CalcLinesPerCol (LinesForDo, ColsForDo)
					DoItN = 0
					CurrCol = CurrCol + 1
				end	
			end	
		end
	end --SetColToLines
	
	function TheItems ()
		local IsUl = false
		local IsUlIntra = false
		local LastWasUl = false
		local IsOl = false
		local IsOlIntra = false
		local LastWasOl = false
		local IsDl = false
		local IsDlx = false
		local IsDlIntra = false
		local LastWasDl = false

		local Lines = {}
		local vv = ''
		
		local Result = {}
		local CurrCol = 1
		for k, v in ipairs(LinesByLin) do
			for i, j in ipairs(LinesByLin[k]) do
			
				function BetweenAny (i, What)
					LinesByLin[k][i] = '<'..What..'>'..string.sub(LinesByLin[k][i], 2)..'</'..What..'>'
				end	
				function BetweenLi (i)
					BetweenAny (i, 'li')
				end	
				function BeginUlOrOlOrDl (i, What)
					LinesByLin[k][i] = '<'..What..'l>'..LinesByLin[k][i]
				end	
				function EndUlOrOlOrDl (i, What)
					LinesByLin[k][i] = '</'..What..'l>'..LinesByLin[k][i]
				end	
				
				local Char = string.sub(LinesByLin[k][i],1,1) or ''
				if Char == '*' then
					BetweenLi (i)
					if not IsUl then
						BeginUlOrOlOrDl (i, 'u')
					end	
					IsUl = true
					IsUlIntra = i > 1
				elseif Char == '#' then
					BetweenLi (i)
					if not IsOl then
						BeginUlOrOlOrDl (i, 'o')
					end	
					IsOl = true
					IsOlIntra = i > 1
				elseif Char == ';' then
					BetweenAny (i, 'dt')
					BeginUlOrOlOrDl (i, 'd')
					IsDlx = true
				elseif Char == ':' then
					BetweenAny (i, 'dd')
					if not IsDl then
						BeginUlOrOlOrDl (i, 'd')
					end	
					IsDl = true
					IsDlIntra = i > 1
				else	
					if #v == 1 then
						LinesByLin[k][i] = '<p>'..LinesByLin[k][i]..'</p>'
					elseif i ~= #LinesByLin[k] then
						LinesByLin[k][i] = LinesByLin[k][i]..'<br>'
					end	
					if IsUl then
						EndUlOrOlOrDl (i, 'u')
					end	
					if IsOl then
						EndUlOrOlOrDl (i, 'o')
					end	
					if IsOl then
						EndUlOrOlOrDl (i, 'd')
					end	
					if IsDlx then
						LinesByLin[k][i] = '<dd>'..LinesByLin[k][i]..'</dd>'
					end	
					IsUlIntra = false
					IsOlIntra = false
					IsDlIntra = false
				end
				--revised intralin
				if vv ~= '' then
					if IsUl then
						vv = vv..LinesByLin[k][i]
						if (i < #LinesByLin[k]) and ((LinesByLin[k][i+1] == '') or (string.sub(LinesByLin[k][i+1],1,1) ~= '*')) then
							vv = vv..'</ul>'
							IsUl = false
							IsUlIntra = false
							LastWasUl = true
						end	
					elseif IsOl then
						vv = vv..LinesByLin[k][i]
						if (i < #LinesByLin[k]) and ((LinesByLin[k][i+1] == '') or (string.sub(LinesByLin[k][i+1],1,1) ~= '#')) then
							vv = vv..'</ol>'
							IsOl = false
							IsOlIntra = false
							LastWasOl = true
						end	
					elseif IsDl then
						vv = vv..LinesByLin[k][i]
						if (i < #LinesByLin[k]) and ((LinesByLin[k][i+1] == '') or (string.sub(LinesByLin[k][i+1],1,1) ~= ':')) then
							vv = vv..'</dl>'
							IsDl = false
							IsDlIntra = false
							LastWasDl = true
						end	
					elseif LastWasUl then
						vv = vv..LinesByLin[k][i]
						LastWasUl = false
					elseif LastWasOl then
						vv = vv..LinesByLin[k][i]
						LastWasOl = false
					elseif LastWasDl then
						vv = vv..LinesByLin[k][i]
						LastWasDl = false
					else	
						vv = vv..LinesByLin[k][i]
					end	
				else
					vv = LinesByLin[k][i]
				end	
			end
			--revised lin with lines
			if IsUlIntra then
				vv = vv..'</ul>'
				IsUl = false
				IsUlIntra = false
			end	
			if IsOlIntra then
				vv = vv..'</ol>'
				IsOl = false
				IsOlIntra = false
			end	
			if IsDlx then
				vv = vv..'</dl>'
				IsDlx = false
			end	
			if IsDlIntra then
				vv = vv..'</dl>'
				IsDl = false
				IsDlIntra = false
			end
			if #v ~= 1 then
				vv = '<p>'..vv..'</p>'
			end	
			local IsLastLine = (k == #LinesByLin)
			if IsLastLine or (CurrCol ~= LinCol[k+1]) then
				if not IsLastLine then
					CurrCol = LinCol[k+1]
				end	
				if IsUl then
					vv = vv..'</ul>'
				elseif IsOl	then
					vv = vv..'</ol>'
				elseif IsDlx then
					vv = vv..'</dl>'
				elseif IsDl	then
					vv = vv..'</dl>'
				end	
				table.insert(Result, vv)
				IsUl = false
				IsOl = false
				vv = ''
			end	
		end
		return Result
	end --TheItems	

	PrepareItems()
	if (not WithBreakLine) then
		SetColToLines ()
	end	
	return TheItems (true), NCols, ColWidht
end --MultiCol

function p.MultiColX (splited, width, same_width, sep_cols, NCols, Lines, h_align, v_align, header, footer, bg_color, free_header, header_bg_color, footer_bg_color)
	Lines, NCols, ColWidht = p.MultiCol (splited, NCols, Lines)
	local col_width = ''
	if same_width then
		col_width = math.floor(100/NCols)..'%'
	end
	local td = {}
	local s = mw.html.create("table")
	
	function AddAny (S, IsHeader, Color)
		if (S ~= nil) and (S ~= '') then
			local tr = s:newline():tag('tr')
				if Color ~= nil then
					tr:	css ('background-color', Color)
				end	
				local td = tr:newline():tag('td')
					:attr('colspan', NCols)
					if Color ~= nil then
						td:	css ('padding-right', '0.3em')
						td:	css ('padding-left', '0.3em')
						td:	css ('padding-top', '0.2em')
						td:	css ('padding-bottom', '0.2em')
					end	
				if IsHeader then
					local d = td:newline():tag('div')
						:addClass ('center')
						:css	('width', 'auto')
						:css	('margin-left', 'auto')
						:css	('margin-right', 'auto')
						:wikitext ( "'''"..S.."'''")
				else		
					S = mw.text.split (S, "\n")
					S = table.concat(S, '<br>')
					td :wikitext (S)
				end	
		end	
	end	
	
		s:	attr ('direction', dirh)
		if h_align ~= nil then
			s:	attr ('align', h_align)
			if h_align ~= 'center' then
				s:	css ('padding-left', '8px')
				s:	css ('padding-right', '8px')
				if h_align == 'right' then
					s:	css ('margin-left', '12px') 
				elseif h_align == 'left' then
					s:	css ('margin-right', '12px') 
				end
			end	
		end	
		if width ~= nil then
			s:	css ('width', width)
		end	
		if bg_color ~= nil then 
			s:	css ('background-color', bg_color)
			s:	css ('padding-right', sep_cols)
			s:	css ('padding-left', sep_cols)
		end	
		AddAny (header, true, header_bg_color)
		AddAny (free_header, false, header_bg_color)
		local tr = s:newline():tag('tr')
			if v_align ~= nil then
				tr:attr ('valign', v_align) 
			end	
			for k = 1, NCols do
				td[k] = tr:newline():tag('td')
				if same_width then
					td[k]:css ('width', col_width) 
				elseif (#ColWidht > 0) and (ColWidht[k] ~= '') then
					td[k]:css ('width', ColWidht[k]) 
				end	
				local AddRight = false
				local AddLeft = false
				if NCols > 1 then
					if k == 1 then
						if dir.isRTL(lang) then
							AddLeft = true
						else
							AddRight = true
						end	
					elseif k == NCols then
						if dir.isRTL(lang) then
							AddRight = true
						else
							AddLeft = true
						end	
					else	
						AddRight = true
						AddLeft = true
					end	
				end	
				if AddRight then
					td[k] :css ('padding-right', sep_cols)
				end
				if AddLeft then
					td[k] :css ('padding-left', sep_cols)
				end
					td[k]:wikitext (Lines[k])
			end	
		AddAny (footer, false, footer_bg_color)
	return tostring (s)
end --MultiColX

function p.MainVals (args, Required)
	local lines = ''
	if Required then
		lines = SA.RStr_Par (args, I18nStrArrOr1('Lines'))
	else
		lines = SA.Str_Par (args, I18nStrArrOr1('Lines'))
	end	
	local NLines = 0
	local splited = false
	if lines ~= nil then
		lines = mw.text.split(mw.text.trim(lines), "\n\n")
		NLines = #lines
		if NLines == 1 then
			lines = mw.text.split (lines[1], "\n")
			NLines = #lines
			splited = true
		end	
	end	
	local NCols = SA.PosInt_Par (args, I18nStrArrOr1('NumColumns'), 1, 1, 10)
	local width = SA.Size_Par (args, I18nStrArrOr1('Width'), true, {perc={20,100},em={12,119},px={200,1900}})
	local same_width = SA.Bool_Par (args, I18nStrArrOr1('SameWidth'), false)
	local sep_cols = SA.Size_Par (args, I18nStrArrOr1('SepCols'), false, {em={0.6,2.2},px={9,36}}, '0.6em')
	local h_align = SA.HAlign_Par (args, I18nStrArrOr1('HAlign'))
	local v_align = SA.VAlign_Par (args, I18nStrArrOr1('VAlign'), 'top')
	local header = SA.Str_Par (args, I18nStrArrOr1('Header'))
	local footer = SA.Str_Par (args, I18nStrArrOr1('Footer'))
	return splited, NLines, lines, NCols, width, same_width, sep_cols, h_align, v_align, header, footer
end --MainVals

function p.main (frame)
	local args,NArgs = SA.GetArgs (frame)
	if NArgs == 0 then return end
	local splited, NLines, Lines, NCols, width, same_width, sep_cols, h_align, v_align, header, footer, bg_color, free_header, header_bg_color = p.MainVals (args, true)
	if NCols > NLines then
		error (I18nStr (RS_NColumnsBiggerNLabels, NCols, NLines))
	else
		local bg_color = SA.Str_Par (args, I18nStrArrOr1('BgColor'))
		local free_header = SA.Str_Par (args, I18nStrArrOr1('FreeHeader'))
		local header_bg_color = SA.Str_Par (args, I18nStrArrOr1('HeaderBgColor'))
		local footer_bg_color = SA.Str_Par (args, I18nStrArrOr1('FooterBgColor'))
		return p.MultiColX (splited, width, same_width, sep_cols, NCols, Lines, h_align, v_align, header, footer, bg_color, free_header, header_bg_color, footer_bg_color)
	end	
end --main

return p