Module:Nsm/Lib/Sortable class

Une page de Wikiversité, la communauté pédagogique libre.

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 :

info 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'occurences utiliser option = '-i'
	
	for k, v in pairs(t) do
		i = i + 1 --incrémente compteur d'occurences
		-- '-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
]]--