Aller au contenu

Module:Palette de navigation/Bac à sable

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 21 novembre 2015 à 22:52 et modifiée en dernier par Hlm Z. (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[voir] [modifier] [historique] [purger]

Ce module implémente le modèle {{Utilisateur:Hlm Z./Palette de navigation}}. Voir la page du modèle pour les instructions d'utilisation.

Fonctions exportables

  • palette(frame) – Fonction principale du module appelable avec #invoke dans un modèle renvoyant la structure HTML de la palette.
  • _palette(args) – Fonction subsidiaire du module appelable avec require() dans un autre module renvoyant la structure HTML de la palette.

Autres fonctions

  • erreur() – Retourne un message d'erreur en rouge visible par l'utilisateur.
  • formatageLigne(liste) – Prend en argument la liste des éléments de la palette et retourne le formatage wikifié de cette liste.
  • liens() – Retourne la mise en forme du lien modifier disponible en haut à gauche de la palette.
  • entete() – Construit l'entête des palettes et retourne le titre, l'état et le bouton modifier des palette.
  • banniere() – Construit les bannières inférieures et supérieures des palettes.
  • listeSimple(liste, n, pariteLigne) – Retourne les listes simples pairs ou impairs. L'argument pariteLigne permet de désactiver les listes pairs (option pour les sections).
  • listeGroupe(groupe, liste, n) – Retourne les groupes avec listes pairs ou impairs.
  • ligne(prefixe, n) – Retourne la ligne des palettes (liste, groupe et sous-groupe). Cette méthode permet également les sous-groupes récursifs.
  • section(n) – Retourne les sections déroulantes des palettes (liste, sous-groupe et sous-liste). Cette méthode permet les sous-groupes grâce à l'appel de la méthode lignePalette(prefixe, n).
  • contenu() – Construit le corps des palettes (ligne ou section).

Exemples

Pour des exemples, voir la page de test permettant de tester diverses modifications apportées.

--Ce module implémente le modèle {{Palette de navigation}}.

local p = {}

-- Redéfinition utile.
local format = mw.ustring.format

local lignes = 30 -- Nombre maximal de ligne.
local altern = 1 -- Variable d'alternance des lignes.

local function erreur(texte, argManquant)
	local res = mw.html.create('span')
		:addClass('error')
		:wikitext('Erreur : ')

	if argManquant then
		res:wikitext(format('Paramètre <code>|%s=</code> introuvable', texte))
	else
		res:wikitext(texte)
	end

	return tostring(res)
end

local function formatageListe(liste)
	if liste:match('^\n') then
		return liste
	end
	return '\n' .. liste .. '\n'
end

local function liensPalette(args)
	local titre = mw.title.new(args['modèle'], args.namespace or 'Modèle')
	local lienPalette = function(abbr, texte, action)
		return mw.html.create('li')
			:wikitext('[' .. titre:fullUrl(action) .. ' ')
			:tag('abbr')
				:addClass('abbr')
				:attr('title', abbr)
				:cssText(args.couleur)
				:wikitext(texte)
				:done()
			:wikitext(']')
	end
	local res = mw.html.create('div')
		:addClass('palette-liens liste-horizontale')
		:addClass('noprint plainlinksneverexpand')
	res
		:tag('ul')
			:node(lienPalette('Voir ce modèle', 'v'))
			:node(lienPalette('Modifier ce modèle', 'm', 'action=edit'))

	return res
end

local function entetePalette(args)
	local res = mw.html.create()
	local modele = args['modèle']

	-- Paramètre modèle.
	if modele and modele ~= 'inactif' then
		res:node(liensPalette(args))
	elseif not modele then
		res:wikitext(erreur('modèle', true))
	end

	-- Titre de la palette.
	res
		:tag('p')
			:addClass('palette-titre')
			:cssText(args.couleur)
			:wikitext(args.titre or erreur('titre', true))

	return res
end

local function bannierePalette(args, banniere)
	if banniere then
		local res = mw.html.create('div')
			:addClass('palette-banniere liste-horizontale')
			:cssText(args.couleur)
			:wikitext(formatageListe(banniere))

		return res
	end
end

local function imagePalette(args)
	if args.image then
		local res = mw.html.create('div')
			:addClass('palette-image')

		if args.image:match('^%[') then
			res:wikitext(args.image)
		else
			local lienImage = '[[Fichier:%s|100px]]'
			res:wikitext(format(lienImage, args.image))
		end

		return res
	end
end

local function listeSimple(args, liste, n, pariteLigne)
	local res = mw.html.create('li')
		:addClass('palette-ligne-simple')
		:tag('div')
			-- Parité d'une liste simple (sans groupe).
			:addClass(altern % 2 == 0 and pariteLigne
				and 'palette-liste-simple-pair'
				or 'palette-liste-simple')
			:addClass('liste-horizontale')
			:cssText(args.styleliste)
			:wikitext(formatageListe(liste))
			:done()
	altern = altern + 1

	return tostring(res)
end

local function listeGroupe(args, groupe, liste, n)
	local res = mw.html.create('li')
		:addClass('palette-ligne')
		:tag('span')
			:addClass('palette-groupe')
			:cssText(args.couleur)
			:wikitext(groupe)
			:done()
		:tag('div')
			-- Parité d'une liste avec groupe.
			:addClass(altern % 2 == 0
				and 'palette-liste-pair'
				or 'palette-liste')
			:addClass('liste-horizontale')
			:wikitext(formatageListe(liste))
			:done()
	altern = altern + 1

	return tostring(res)
end

local function lignePalette(args, n, prefixe)
	prefixe = prefixe or ''
	local liste = args['liste' .. prefixe .. n]
	local groupe = args['groupe' .. prefixe .. n]

	-- Liste et groupe absent.
	if not liste and not groupe then
		return
	-- Liste seule.
	elseif liste and not groupe then
		return listeSimple(args, liste, n, true)
	-- Liste et groupe présent.
	elseif groupe and liste then
		return listeGroupe(args, groupe, liste, n)
	end

	-- Sinon : Groupe seul avec sous-ligne.
	local sousLignes = ''
	for i = 1, lignes do
		local ligneCourante = lignePalette(args, i, prefixe .. n .. '.')
		if not ligneCourante then break end
		sousLignes = sousLignes .. ligneCourante
	end

	-- Détection des erreurs de paramètrage.
	if sousLignes == '' then
		return erreur('Syntaxe incorrecte des groupes ou sous-groupes')
	end

	-- Construction des sous-lignes.
	local res = mw.html.create('li')
		:addClass('palette-ligne')
		:tag('span')
			:addClass('palette-groupe')
			:cssText(args.couleur)
			:wikitext(groupe)
			:done()
		:tag('div')
			:addClass('palette-liste-fils')
			:tag('ul')
				:node(sousLignes)
		:allDone()

	return tostring(res)
end

local function sectionPalette(args, n, prefixe)
	prefixe = prefixe or ''
	local section = args['section' .. n]
	local liste = args['liste' .. n]

	-- Liste et section absent.
	if not liste and not section then
		return
	-- Liste seule.
	elseif liste and not section then
		return listeSimple(args, liste, n, true)
	end

	-- Sinon : Section avec liste simple ou sous-ligne.
	local res = mw.html.create('li')
		:addClass('palette') --mw-collapsible mw-collapsed
		:css('border', '0')
		:css('border-top', '2px solid white')
		:css('font-size', '100%')

	local contenuSection = res:tag('p')
		:addClass('palette-section')
		:cssText(args.couleur)
		:wikitext(section)
		:tag('div')
			--:addClass('mw-collapsible-content')
			:tag('ul')

	-- Section avec liste simple.
	if liste and section then
		contenuSection:node(listeSimple(args, liste, n, false))
		return tostring(res)
	end

	-- Section avec sous-ligne.
	local sousLignes = ''
	for i = 1, lignes do
		local ligneCourante = lignePalette(args, i, prefixe .. n .. '.')
		if not ligneCourante then break end
		sousLignes = sousLignes .. ligneCourante
	end

	-- Détection des erreurs de paramètrage.
	if sousLignes == '' then
		return erreur('Syntaxe incorrecte des sections')
	end

	contenuSection:node(sousLignes)

	return tostring(res)
end

local function contenuPalette(args)
	local res = mw.html.create('ul')
	local contenu = ''

	if args.image then
		res:addClass('palette-image')
	end

	-- On suppose ici que la liste des arguments est ordonnée et ne
	-- comporte aucun saut (∈ ℕ*).
	-- Détection d'une section.
	if args['section1'] and (args['liste1'] or args['liste1.1']) then
		for i = 1, lignes do
			local sectionCourante = sectionPalette(args, i)
			if not sectionCourante then break end
			contenu = contenu .. sectionCourante
			altern = 1
		end
	-- Détection d'une ligne.
	else
		for i = 1, lignes do
			local ligneCourante = lignePalette(args, i)
			if not ligneCourante then break end
			contenu = contenu .. ligneCourante
		end
	end
	res:node(contenu)

	return tostring(res)
end

function p._palette(args)
	local res = mw.html.create('div')
		:addClass('palette mw-collapsible')
	local etat = args['état']

	-- Paramètre état.
	if etat == 'fermé' then
		res:addClass('mw-collapsed')
	elseif etat == 'ouvert' then
		res:addClass('mw-uncollapsed')
	end

	res
		:node(entetePalette(args))
		:tag('div')
			:addClass('mw-collapsible-content')
			:node(bannierePalette(args, args.dessus))
			:node(args.contenu or contenuPalette(args))
			:node(imagePalette(args))
			:node(bannierePalette(args, args.dessous))

	return tostring(res)
end

function p.palette(frame)
	local args = {}
	local argsParent = frame:getParent().args

	-- Paramètres vides interprétés par Lua.
	for cle, val in pairs(argsParent) do
		if val ~= '' then
			args[cle] = val
		end
	end

	return p._palette(args)
end

return p