Module:Nsm/Lib/Sortable class
< Module:Nsm | Lib
Librairie de fonctions pour l’outil wmflabs/fr-wikiversity-ns aussi appelé Namespace monitor. Cette Bibliothèque regroupe les fonctions, dédiées à la composition du code wikitexte des tableaux triables. Voir aussi les librairies suivantes :
- La librairie Module:Nsm/Lib contient les fonctions principales communes aux différents espaces.
- La librairie Module:Nsm/Lib/Sub, contient les sous-fonctions.
Documentation du Module:Nsm/Lib/Sortable class : v · d · m · h.
--[[Librairie de fonction pour l'édition de tableaux triable - class=sortable]]--
st_open = '{|class="wikitable sortable\n' -- début du tableau (sortable)
st_title = '!Index\n!Page\n' -- (base_titres) --ATTENTION
st_endline = '|-\n' -- fin de ligne (endline)
st_close = '|}' -- fin de tableau (table_close)
function st_print(t, colonnes, option) -- _new
--t= {10, 99, 7, 15 , 5} --num-num
--t= {'c','a', 'dire', 'bien'} --num-str
--t= {c='ceci', a='cela'} --str-str
--t= {b=1, d=42, a=5} --str-num
--local option = '-i'
--table.sort(t)
--local colonnes = {'page', 'nsep', 'cible', 'n_add', 'l_add','n_exist'}
local tab = st_open -- Wikitexte déclaration du tableau
local tab_lines = '' -- Wikitexte lignes de données du tableau
local title_line = '' -- Wikitexte ligne des titres de colonnes
local compteur = 0 -- Compteur remplace ou s'ajoute à l'index si option = '-i'
for k, v in pairs(t) do -- Parcours la table en entrée
local k_type = type(k) -- Verifie le type de donnée de la clé
local v_type = type(v) -- et celui de la valeur
if k_type == 'string' and v_type == 'string' then -- lnk-lnk
compteur = compteur + 1
if option == '-i' then tab_lines = tab_lines .. cel(compteur) end
tab_lines = tab_lines .. cel(lnk(k)) .. cel(lnk(v)) ..st_endline end
if k_type == 'string' and v_type == 'number' then -- lnk-num
compteur = compteur + 1
if option == '-i' then tab_lines = tab_lines .. cel(compteur) end
tab_lines = tab_lines .. cel(lnk(k)) .. cel(v) ..st_endline end
if k_type == 'number' and v_type == 'number' then -- num-lnk
tab_lines = tab_lines .. cel(k) .. cel(lnk(v)) ..st_endline end
if k_type == 'number' and v_type == 'string' then -- num-string
compteur = compteur + 1
if option == '-i' then k = compteur end -- Remplace clé par compteur
tab_lines = tab_lines .. cel(k) .. cel(lnk(v)) ..st_endline end
if k_type == 'number' and v_type == 'table' then -- num-table
title_line = st_titlecol(k_type)
compteur = compteur + 1
if option == '-i' then k = compteur end --Compteur remplace index
tab_lines = tab_lines .. cel(k)
for kc, colonne in pairs(colonnes) do -- Pour chaque colonne en argument
title_line = title_line .. st_titlecol(colonne) -- compile titre
data_type = type(v[colonne]) -- test type de données
if data_type == 'string' then tab_lines = tab_lines .. cel(lnk(v[colonne])) end
if data_type == 'number' then tab_lines = tab_lines .. cel(v[colonne]) end
if data_type == 'table' then tab_lines = tab_lines .. cel_list(v[colonne]) end
if data_type == 'nil' then tab_lines = tab_lines .. cel(null) end --test type cellule vides =='nil' pour cible et date1.
end -- compose et ajoute cellule du tableau (mème vide cible, date1)
title_line = title_line .. st_endline -- Fin de la ligne des titres
tab_lines = tab_lines .. st_endline -- Fin des lignes de données
end
-- if string-table n'est pas pris en compte !
end
tab = tab .. title_line .. tab_lines .. st_close -- Compilation titres colonnes & lignes de données ; ferme le tableau
return tab -- Retourne le wikitext du tableau
end
function st_titlecol(var)
local titlecol = '!'..var..'\n'
return titlecol
end
function cel_list(var) --Reçoit une liste. Formate le contenu de la cellule sous forme de liste d'items numérotés, voir st_pre_cel ; st_find_col. Retourne une cellule.
local cel = '|\n' --'|Liste :\n'
for key, item in pairs(var) do cel= cel ..'# '.. lnk(item) .. '\n' end
return cel
end
function st_pre_cel(k, v) -- Reçoit index et valeur
if k == 'page' then v = lnk(v) end -- si l'index vaut 'page', formate le lien
if type(v) == 'table' then v = cel_list(v) end -- si v est une table formate une cellule avec une liste
return v --Retourne V (soit un lien, soit une liste)
end
function cel(var) -- place var dans une cellule de tableau
local cel = '|' -- ouvre la celule
if var ~= nil then cel = cel .. var end
cel = cel..'\n' --ferme la cellule
return cel
--local cel = '|'..var..'\n' return cel end --SAVED
end
--[[
function st_print_old(t, l, option)
local tab = st_open -- Initialise code Wikitext
title_line = '!Index\n' -- Initialise titres de colonnes
--TOUJOURS LE 1er CHAMP AJOUTER FX
if l[1] == 'index' then table.remove(l, 1) end -- A corriger on enlève le titre de la colonne 1 si index
-- Wikitext colonnes à partir de l(iste col):
for kc, column in pairs(l) do title_line = title_line .. st_titlecol(column) end
title_line = title_line .. st_endline -- Fin wikitext colonnes
tab = tab .. title_line -- Compilation titres colonnes
i = 0 -- compteur d'occurrences utiliser option = '-i'
for k, v in pairs(t) do
i = i + 1 --incrémente compteur d'occurrences
-- '-i' remplace k par le compteur d'occurrences
if option == '-i' then tab = tab .. cel(i) else tab = tab .. cel(k) end
if type(v) == 'table' then -- v = table
for kc, column in pairs(l) do -- pour chaque colonnes en argument
for kn, vn in pairs(v) do -- ¿sous-fonction find_col(col, t)?
if kn == column then -- colonne trouvée dans table
tab = tab .. cel(st_pre_cel(kn, vn)) -- sous-fonction pre_cel(kn, vn)
elseif type(vn) == 'table' then --Attention kn not colonne vn table
st_find_col(column, vn, tab)
end
-- FLAG STOP kn not col vn not table
end -- fin itération table v
end -- fin itération arguments colonnes
tab = tab .. st_endline -- Ferme ligne de données
else -- v n'est pas une table donc formate cellule
tab = tab .. cel(lnk(v)) --pre_cel ne reconnait pas 'page'
end -- fin test type v
tab = tab .. st_endline -- Ferme la ligne de données
end -- Fin itération de la table principale
tab = tab .. st_close -- Ferme le tableau
return tab -- Retourne le code wikitext de t
end
-- VERIFIER
function st_find_col(col, t, tab) -- Reçoit un titre de colonne, une table de données à convertir et le code wikitext du tableau à imprimer
for k, v in pairs(t) do -- chaque ligne de la table
if k == col then -- si l'index correspond au titre de la colonne
tab = tab .. cel(st_pre_cel(k, v)) -- Compile le code du tableau
return tab
elseif type(v) == 'table' then -- Si la valeur est une table
st_find_col(col, v, tab) -- RECURSIF
else
tab = tab .. cel('find_col() says no data for'.. col)
return tab
end end end
]]--