Mòdul:XCols
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. En el repartiment es prioritza que l'emplenament sigui segons l'ordre de la columna (així, per exemple, es descarta un repartiment en dues columnes, més ajustades per contingut, en que la segona columna estigués més plena que la primera).
- Per tal de millorar la lectura 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. Un exemple de línia amb "sublínies" seria:
- Línia 1
- Sublínia 1.1
- Sublínia 1.2
- Línia 1
- Les agrupacions de línies (vegeu #Agrupant).
- 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 {{XCols}}.
Sintaxi
[modifica]El mode més senzill és:
{{#invoke:XCols|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 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 o em. Per defecte és 0.6em per costat de columna. |
bg_color | color_fons | Color de fons. Per defecte és transparent. |
free_header | encapçalament_lliure | A dalt de les columnes. És una alternativa a encapçalament. No té estil definit. |
header_bg_color | color_fons_encapçalament | Color de fons de l'encapçalament. Per defecte és transparent o del color de fons. |
footer_bg_color | color_fons_peu | Color de fons de l'encapçalament. Per defecte és transparent o del color de fons. |
Exemples
[modifica]Llistes puntejades
[modifica]{{#invoke:XCols|main| n_cols = 2| línies = *[[Primer]] *Segon *Tercer *Quart *'''Cinquè''' *{{color|red|Sisè}} *Setè }}
|
|
Amb diferents nivells
[modifica]{{#invoke:XCols|main| n_cols = 2| línies = *Primer **A ***A1 ***A2 **B *Segon *Tercer *Quart *Cinquè *Sisè *Setè }}
|
|
En aquest exemple (degut a l'ús d'aquest mòdul) no se separen les "sublínies" de "Tercer", per millorar-ne la lectura.
{{#invoke:XCols|main| n_cols = 2| línies = *Primer *Segon *Tercer **A **B **C *Quart *Cinquè *Sisè *Setè }}
|
|
Això és el mateix que l'anterior, però realment, no fa falta posar les separacions:
{{#invoke:XCols|main| n_cols = 2| línies = *Primer *Segon *Tercer **A **B **C *Quart *Cinquè *Sisè *Setè }}
|
|
Observeu que si no es tingués en compte de no separar les "sublínies" (com fa aquest mòdul) es veuria així:
|
|
Amb pitjor lectura, tot i que les columnes serien més igualades.
Llista no puntejada
[modifica]{{#invoke:XCols|main| n_cols = 3| línies = Primer Segon Tercer Quart Cinquè Sisè Setè }}
Primer Segon Tercer |
Quart Cinquè |
Sisè Setè |
Amb agrupació de línies
[modifica]Fent tres grups de línies (primer en una sola columna):
{{#invoke:XCols|main| línies = Primer Segon Tercer Quart Cinquè Sisè Setè }}
Primer Tercer Sisè |
Amb dues columnes:
{{#invoke:XCols|main| n_cols = 2| línies = Primer Segon Tercer Quart Cinquè Sisè Setè }}
Primer Tercer |
Sisè |
Llista amb salt de columna manual
[modifica]Senzill
[modifica]{{#invoke:XCols|main| línies = Primer Segon --- Tercer Quart Cinquè --- Sisè Setè }}
Primer Segon |
Tercer Quart Cinquè |
Sisè Setè |
Agrupant
[modifica]{{#invoke:XCols|main| línies = Primer Segon --- Tercer Quart Cinquè --- Sisè Setè }}
Primer |
Tercer Quart |
Sisè |
Vegeu també: #Amb encapçalaments.
Alineació horitzontal
[modifica]{{#invoke:XCols|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:XCols|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:XCols|main| alineació_h = dreta| línies = ---30px [[File:Baseball bat (1904).jpg|30px]] ---100px En el [[beisbol]], el '''[[bat de beisbol|bat]]''' és el bastó que es fa servir per colpejar la pilota llançada pel [[pitcher]] o llançador. El que utilitza el bat, s'anomena batedor, i forma part de l'equip ofensiu. }} {{lorem|3}}
En el beisbol, el bat és el bastó que es fa servir per colpejar la pilota llançada pel pitcher o llançador. El que utilitza el bat, s'anomena batedor, i forma part de l'equip ofensiu. |
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.
Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst.
Fusce convallis, mauris imperdiet gravida bibendum, nisl turpis suscipit mauris, sed placerat ipsum urna sed risus. In convallis tellus a mauris. Curabitur non elit ut libero tristique sodales. Mauris a lacus. Donec mattis semper leo. In hac habitasse platea dictumst. Vivamus facilisis diam at odio. Mauris dictum, nisi eget consequat elementum, lacus ligula molestie metus, non feugiat orci magna ac sem. Donec turpis. Donec vitae metus. Morbi tristique neque eu mauris. Quisque gravida ipsum non sapien. Proin turpis lacus, scelerisque vitae, elementum at, lobortis ac, quam. Aliquam dictum eleifend risus. In hac habitasse platea dictumst. Etiam sit amet diam. Suspendisse odio. Suspendisse nunc. In semper bibendum libero.
{{#invoke:XCols|main| alineació_h = esquerra| n_cols = 2| encapçalament = Explicació| línies = '''Primer''' Nota '''Segon''' Nota 1 Nota 2 }} {{lorem|2}}
Explicació | |
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.
Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst.
Color de fons
[modifica]{{#invoke:XCols|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:XCols|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è |
|
Estil d'encapçalament definit per l'usuari
[modifica]{{#invoke:XCols|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:XCols|main| n_cols = 2| amplada = 50%| color_fons = LightYellow| 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:XCols|main| n_cols = 2| amplada = 50%| id_amplada = sí| color_fons = LightYellow| 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:XCols|main| n_cols = 2| color_fons = LightYellow| línies = Una línia, més o menys llarga Altra }}
Una línia, més o menys llarga |
Altra |
Modificant-lo
[modifica]{{#invoke:XCols|main| n_cols = 2| sep_cols = 1.2em| color_fons = LightYellow| 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:XCols|main| n_cols = 2| color_fons = LightYellow| 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 |
Altre Final |
{{#invoke:XCols|main| n_cols = 2| color_fons = LightYellow| 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
Altre
|
|
{{#invoke:XCols|main| n_cols = 2| color_fons = LightYellow| línies = Una línia, més o menys llarga Altra Tercera Quarta }}
Una línia, més o menys llarga |
Tercera Quarta |
{{#invoke:XCols|main| n_cols = 2| color_fons = LightYellow| línies = Una línia, més o menys llarga Altra }}
Una línia, més o menys llarga |
Altra |
{{#invoke:XCols|main| n_cols = 2| color_fons = LightYellow| línies = *Una línia, més o menys llarga *Altra }}
|
|
Una línia massa llarga
[modifica]El problema
[modifica]{{#invoke:XCols|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:XCols|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 |
Tercer Quart |
Solució 2
[modifica]{{#invoke:XCols|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 |
Tercer Quart |
Solució 3
[modifica]{{#invoke:XCols|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:XCols|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 |
Amb encapçalaments
[modifica]Rarament útil. Més que res per a llistes ordenades alfabèticament, i així permetent que apareguin en la taula de continguts; com en l'exemple:
Ciutats de Moldàvia |
---|
{{#invoke:XCols|main |alineació_h = centre |n_cols = 4 |línies = ====A==== *[[Anenii Noi]] ====B==== *[[Basarabeasca]] *[[Bălți]] *[[Biruința]] *[[Briceni]] *[[Bucovăț]] ====C==== *[[Cahul]] *[[Camenca]] *[[Cantemir]] *[[Căinari]] *[[Călărași]] *[[Căușeni]] *[[Ceadîr-Lunga]] *[[Chișinău]] *[[Cimișlia]] *[[Codru]] *[[Comrat]] *[[Cornești]] *[[Costești]] *[[Crasnoe]] *[[Cricova]] *[[Criuleni]] *[[Cupcini]] ====D==== *[[Dnestrovsc]] *[[Dondușeni]] *[[Drochia]] *[[Dubăsari]] *[[Durlești]] ====E==== *[[Edineț]] ====F==== *[[Fălești]] *[[Florești]] *[[Frunză]] ====G==== *[[Ghindești]] *[[Glodeni]] *[[Grigoriopol]] ====H==== *[[Hîncești]] ====I==== *[[Ialoveni]] *[[Iargara]] ====L==== *[[Leova (Moldàvia)|Leova]] *[[Lipcani]] ====M==== *[[Maiac (Moldàvia)|Maiac]] *[[Mărculești]] ====N==== *[[Nisporeni]] ====O==== *[[Ocnița]] *[[Orhei]] *[[Otaci]] ====R==== *[[Rezina]] *[[Rîbnița]] *[[Rîșcani]] ====S==== *[[Sîngera]] *[[Sîngerei]] *[[Slobozia]] *[[Soroca]] *[[Strășeni]] ====Ş==== *[[Șoldănești]] *[[Ștefan Vodă]] ====T==== *[[Taraclia]] *[[Telenești]] *[[Bender|Tighina (Bender)]] *[[Tiraspol]] *[[Tiraspolul Nou]] *[[Tvardița]] ====U==== *[[Ungheni]] ====V==== *[[Vadul lui Vodă]] *[[Vatra]] *[[Vulcănești]] }} |
ABC |
DEFGHI |
LMNORS |
ŞTUV |
local p = {}
local SA = require "Module:SimpleArgs"
local dir = require "Module:Dir"
local RS = {
--Arg
Lines = 'Lines',
Header = 'Header',
FreeHeader = 'FreeHeader',
Footer = 'Footer',
NumColumns = 'NumColumns',
NumDisplay = 'NumDisplay',
Width = 'Width',
SameWidth = 'SameWidth',
HAlign = 'HAlign',
VAlign = 'VAlign',
SepCols = 'SepCols',
BgColor = 'BgColor',
HeaderBgColor = 'HeaderBgColor',
FooterBgColor = 'FooterBgColor',
--Error
NColsBiggerNLabs = 'NColsBiggerNLabs',
}
p.i18n = {
["Arg"] = {
[RS.Lines] = "lines",
[RS.Header] = "header",
[RS.FreeHeader] = "free_header",
[RS.Footer] = "footer",
[RS.NumColumns] = "col_n",
[RS.NumDisplay] = "display_n",
[RS.Width] = "width",
[RS.SameWidth] = "same_width",
[RS.HAlign] = "h_align",
[RS.VAlign] = "v_align",
[RS.SepCols] = "col_sep",
[RS.BgColor] = "bg_color",
[RS.HeaderBgColor] = "header_bg_color",
[RS.FooterBgColor] = "footer_bg_color",
},
["Error"] = {
[RS.NColsBiggerNLabs] = "El nombre de columnes ($1) és més gran que el nombre d'etiquetes ($2)",
},
}
p.i18n = SA.loadI18n ('XCols', p.i18n)
local function I18nArgLabel (S)
return p.i18n["Arg"][S]
end
local function I18nError (S, ...)
return SA.I18nStrParams (p.i18n["Error"][S], ...)
end
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 CountChBegin (s, achar)
local c = 1
for j = 2, #s do
if string.sub(s,j,j) == achar then
c = c + 1
else
break
end
end
return c
end --CountChBegin
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
WithBlankLin = false
for k, v in ipairs(LinesByLin) do
if #v > 1 then
WithBlankLin = true
end
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
local TempH = {}
for k, v in ipairs(LinesByLin) do
if #v == 1 then
table.insert (TempH, v)
else
local vz = {}
for kk, vv in ipairs(v) do
local Begin = string.sub(vv, 1, 3)
if (Begin == '---') then
if #vz > 0 then
table.insert (TempH, vz)
vz = {}
end
table.insert (TempH, {vv})
else
table.insert (vz, vv)
end
end
if #vz > 0 then
table.insert (TempH, vz)
end
end
end
LinesByLin = {}
for k, v in ipairs(TempH) do
table.insert (LinesByLin, v)
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
if not WithBlankLin then
Levels = {}
local MaxLevel = 0
local MinLevel = 3
for k, v in ipairs(LinesByLin) do
local Begin = string.sub(v[1], 1, 1)
local Begin2 = string.sub(v[1], 2, 2)
function GetLev (achar)
if Begin2 == achar then
return 3
else
return 2
end
end
if Begin == '=' then
Lev = 0
elseif Begin == '*' then
Lev = GetLev ('*')
elseif Begin == '#' then
Lev = GetLev ('#')
elseif Begin == ':' then
Lev = GetLev (':')
else
Lev = 1
end
MinLevel = math.min (MinLevel, Lev)
MaxLevel = math.max (MaxLevel, Lev)
table.insert (Levels, Lev)
end
local c = false
local various = MinLevel ~= MaxLevel
if various then
local LinesByLinTemp = {}
local Lines = {}
for k, v in ipairs(LinesByLin) do
if Levels[k] == MinLevel then
if #Lines == 0 then
table.insert (Lines, v[1])
else
table.insert (LinesByLinTemp, Lines)
Lines = {v[1]}
end
else
table.insert (Lines, v[1])
end
end
table.insert (LinesByLinTemp, Lines)
LinesByLin = {}
for k, v in ipairs(LinesByLinTemp) do
table.insert (LinesByLin, v)
end
end
end
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 == '=' then
local HH = {2, 1.8, 1.38, 1.28, 1.2}
local c = CountChBegin (vv, '=')
HByL = HH[c]
elseif (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 (CurrCol < NCols) and (((AbsLinesPerCol - DoItN) + (HeightByLin[k]/2)) < ((DoItN + HeightByLin[k]) - AbsLinesPerCol)) then
LinesForDo = LinesForDo - DoItN
CalcLinesPerCol (LinesForDo, ColsForDo-1)
CurrCol = CurrCol + 1
DoItN = HeightByLin[k]
ColsForDo = ColsForDo - 1
else
DoItN = DoItN + HeightByLin[k]
end
LinCol[k] = CurrCol
end
end --SetColToLines
function TheItems ()
local IsUl = 0
local IsUlIntra = false
local LastWasUl = false
local IsOl = 0
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
function SplitChBegin0 (k, i, achar)
local s = LinesByLin[k][i]
local c = 1
for j = 2, #s do
if string.sub(s,j,j) == achar then
c = c + 1
else
break
end
end
return mw.text.trim (string.sub(s,c+1)), c
end --SplitChBegin0
function SplitChBegin (k, i, achar)
local s, c = SplitChBegin0 (k, i, achar)
LinesByLin[k][i] = '<li>'..s..'</li>'
return c
end --SplitChBegin
function WithHeader (k, i)
local s, c = SplitChBegin0 (k, i, '=')
local cc = 0
for j = #s, 1, -1 do
if string.sub(s,j,j) == '=' then
cc = cc + 1
else
break
end
end
s = string.sub (s,1,#s-cc)
LinesByLin[k][i] = '<h'..c..'>'..s..'</h'..c..'>'
end --WithHeader
function AddClose (num, achar)
for i = 1, num do
vv = vv..'</'..achar..'l>'
end
end --AddClose
function OnEnd ()
if IsUl > 0 then
AddClose (IsUl, 'u')
IsUl = 0
elseif IsOl > 0 then
AddClose (IsOl, 'o')
IsOl = 0
elseif IsDlx then
vv = vv..'</dl>'
IsDlx = false
elseif IsDl then
vv = vv..'</dl>'
IsDl = false
end
end --OnEnd
for k, v in ipairs(LinesByLin) do
if #v ~= 1 then
vv = vv..'<p>'
end
for i, j in ipairs(LinesByLin[k]) do
function BetweenAny (What)
LinesByLin[k][i] = '<'..What..'>'..string.sub(LinesByLin[k][i], 2)..'</'..What..'>'
end
function BeginUlOrOlOrDl (What)
LinesByLin[k][i] = '<'..What..'l>'..LinesByLin[k][i]
end
function EndUlOrOlOrDl (What)
LinesByLin[k][i] = '</'..What..'l>'..LinesByLin[k][i]
end
function BeginOrEndUlOrOl (IniV, NewV, achar)
local IsBegin = IniV < NewV
local s = ''
if IsBegin then
for k = 1, NewV-IniV do
s = s..'<'..achar..'l>'
end
else
for k = 1, (IniV-NewV)-1 do
s = s..'</'..achar..'l>'
end
EndUlOrOlOrDl (achar)
end
LinesByLin[k][i] = s..LinesByLin[k][i]
end --BeginOrEndUlOrOl
local Char = string.sub(LinesByLin[k][i],1,1) or ''
if Char == '*' then
local c = SplitChBegin (k, i, '*')
if IsUl ~= c then
BeginOrEndUlOrOl (IsUl, c, 'u')
IsUl = c
end
IsUlIntra = i > 1
elseif Char == '#' then
local c = SplitChBegin (k, i, '#')
if IsOl ~= c then
BeginOrEndUlOrOl (IsUl, c, 'o')
IsOl = c
end
IsOlIntra = i > 1
elseif Char == '=' then
OnEnd ()
WithHeader (k, i)
elseif Char == ';' then
BetweenAny ('dt')
BeginUlOrOlOrDl ('d')
IsDlx = true
elseif Char == ':' then
BetweenAny ('dd')
if not IsDl then
BeginUlOrOlOrDl ('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 > 0 then
BeginOrEndUlOrOl (IsUl, 0, 'u')
IsUl = 0
end
if IsOl > 0 then
BeginOrEndUlOrOl (IsUl, 0, 'o')
IsOl = 0
end
if IsDl then
EndUlOrOlOrDl ('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 > 0 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 = IsUl - 1
IsUlIntra = false
LastWasUl = true
end
elseif IsOl > 0 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 = IsOl - 1
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
AddClose (IsUl, 'u')
IsUl = 0
IsUlIntra = false
end
if IsOlIntra then
AddClose (IsOl, 'o')
IsOl = 0
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 = vv..'</p>'
end
local IsLastLine = (k == #LinesByLin)
if IsLastLine or (CurrCol ~= LinCol[k+1]) then
if not IsLastLine then
CurrCol = LinCol[k+1]
end
OnEnd ()
if vv ~= '' then
table.insert(Result, vv)
vv = ''
end
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, I18nArgLabel(RS.Lines))
else
lines = SA.Str_Par (args, I18nArgLabel(RS.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, I18nArgLabel(RS.NumColumns), 1, 1, 10)
local width = SA.Size_Par (args, I18nArgLabel(RS.Width), true, {perc={20,100},em={12,119},px={200,1900}})
local same_width = SA.Bool_Par (args, I18nArgLabel(RS.SameWidth), false)
local sep_cols = SA.Size_Par (args, I18nArgLabel(RS.SepCols), false, {em={0.6,2.2},px={9,36}}, '0.6em')
local h_align = SA.HAlign_Par (args, I18nArgLabel(RS.HAlign))
local v_align = SA.VAlign_Par (args, I18nArgLabel(RS.VAlign), 'top')
local header = SA.Str_Par (args, I18nArgLabel(RS.Header))
local footer = SA.Str_Par (args, I18nArgLabel(RS.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
SA.MsgError (I18nError (RS.NColsBiggerNLabs, NCols, NLines))
else
local bg_color = SA.Str_Par (args, I18nArgLabel(RS.BgColor))
local free_header = SA.Str_Par (args, I18nArgLabel(RS.FreeHeader))
local header_bg_color = SA.Str_Par (args, I18nArgLabel(RS.HeaderBgColor))
local footer_bg_color = SA.Str_Par (args, I18nArgLabel(RS.FooterBgColor))
SA.CheckParams (args, p.i18n["Arg"])
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