Module:Aẓṭṭa n twlafin d izwal

La documentation pour ce module peut être créée à Module:Aẓṭṭa n twlafin d izwal/doc

local module = {}


function module.grille(liste_blocs, base_largeur, limite_par_ligne, style, style_ligne, style_case)
	-- Génère une grille redimensionnable en HTML utilisant Flex.
	-- :param liste_blocs : tableau indexé du contenu à afficher dans chaque case
	-- :param base_largeur : largeur minimale en px, em, etc. d'une case 
	-- :param limite_par_ligne : permet de limiter le nombre de case par ligne
	-- :param style : style CSS à appliquer à la grille elle-même
	-- :param style_ligne : style CSS à appliquer à la grille elle-même
	-- :param style_case : style CSS à appliquer à chaque case
	local i_ligne = 1
	local grille = mw.html.create('div')
	grille:cssText(style)
	
	local ligne = mw.html.create('div')
	ligne:css('display', 'flex')
		:css('flex-direction', 'row')
		:css('flex-wrap', 'wrap')
		:css('text-align', 'center')
		:css('align-items', 'center')
		:cssText(style_ligne)

	for i,contenu in ipairs(liste_blocs) do
		-- dépassement du nombre d'éléments par ligne
		if i > i_ligne*limite_par_ligne then
			-- on ferme le block div de la ligne et on repart sur un nouveau
			grille:node(ligne)
			i_ligne = i_ligne + 1
			ligne = mw.html.create('div')
			ligne:css('display', 'flex')
				:css('flex-direction', 'row')
				:css('flex-wrap', 'wrap')
				:css('text-align', 'center')
				:css('align-items', 'center')
				:cssText(style_ligne)
		end
		local case = mw.html.create('div')
		case:css('display', 'flex')
			:css('flex-direction', 'column')
			:css('flex', '1 1 '..base_largeur)
			:cssText(style_case)
			:wikitext(contenu)

		ligne:node(case)
	end
	grille:node(ligne)

	return tostring(grille)
end


function parse_list(str)
	-- Découpe une liste non numérotée en tableau Lua indexé

	-- motif de découpage: les * précédées de retour à la ligne
	local parse = mw.text.split(str, '\n%*')
	local res = {}
	local res_i = 1
	-- suppression des lignes vides
	for i, ligne in pairs(parse) do
		if mw.text.trim(ligne) ~= '' then
			res[res_i] = ligne
			res_i = res_i + 1
		end
	end
	return res
end

function module.grille_equilibree(frame)
	-- Retourne une grille HTML redimensionnable 
	-- à partir d'une liste wiki non numérotée 
	-- :param 0: liste wiki non numérotée
	-- :param largeur: largeur minimale d'une case
	-- :param nombre: nombre max d'éléments par ligne
	local args = {}
	local argsParent = frame.args
	-- Paramètres vides interprétés par Lua.
	-- paramètres non nommés
	for cle, val in ipairs(argsParent) do
		if val ~= '' then
			args[cle] = val
		end
	end
	-- paramètres nommés
	for cle, val in pairs(argsParent) do
		if val ~= '' then
			args[cle] = val
		end
	end

	-- valeurs par défaut
	if args['largeur'] == nil then
		args['largeur'] = '5em'
	end

	if args['nombre'] == nil then
		args['nombre'] = 6
	else
		args['nombre'] = tonumber(args['nombre'])
	end

	local items = parse_list(args[1])
	return module.grille(
		items, args['largeur'], args['nombre'], 
		args['style'], args['style ligne'], args['style case']
	)
end
 
return module