Module:Palette de navigation/Bac à sable
Apparence
[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
[modifier le code]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 avecrequire()
dans un autre module renvoyant la structure HTML de la palette.
Autres fonctions
[modifier le code]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'argumentpariteLigne
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éthodelignePalette(prefixe, n)
.contenu()
– Construit le corps des palettes (ligne ou section).
Exemples
[modifier le code]Pour des exemples, voir la page de test permettant de tester diverses modifications apportées.
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
Les éditeurs peuvent travailler dans le bac à sable (modifier).
Voir les statistiques d'appel depuis le wikicode sur l'outil wstat et les appels depuis d'autres modules.
--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 styles = 'Module:Palette de navigation/styles.css'
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 liens(modele, namespace, couleur)
local titre = mw.title.new(modele, namespace or 'Modèle')
local lien = function(abbr, texte, action)
return mw.html.create('li')
:wikitext('[' .. titre:fullUrl(action) .. ' ')
:tag('abbr')
:addClass('abbr')
:attr('title', abbr)
:cssText(couleur)
:wikitext(texte)
:done()
:wikitext(']')
end
local res = mw.html.create('div')
:addClass('palette-liens liste-horizontale')
:addClass('noprint plainlinksneverexpand')
res
:tag('ul')
:node(lien('Voir ce modèle', 'v'))
:node(lien('Modifier ce modèle', 'm', 'action=edit'))
return res
end
local function entete(modele, titre, namespace, couleur)
local res = mw.html.create()
-- Paramètre modèle.
if modele and modele ~= 'inactif' then
res:node(liens(modele, namespace, couleur))
elseif not modele then
res:wikitext(erreur('modèle', true))
end
-- Titre de la palette.
res
:tag('div')
:addClass('palette-titre')
:cssText(couleur)
:wikitext(titre or erreur('titre', true))
return res
end
local function banniere(contenu, couleur)
if contenu then
local res = mw.html.create('div')
:addClass('palette-banniere liste-horizontale')
:cssText(couleur)
:wikitext(formatageListe(contenu))
return res
end
end
local function image(contenu)
if contenu then
local res = mw.html.create('div')
:addClass('palette-image')
if contenu:match('^%[') or contenu:match('^%<') then
res:wikitext(contenu)
else
local lienImage = '[[Fichier:%s|100px]]'
res:wikitext(format(lienImage, contenu))
end
return res
end
end
local function listeSimple(liste, styleListe, n, pariteLigne)
local res = mw.html.create('li')
:addClass('palette-ligne-simple')
:tag('div')
:addClass('palette-liste-simple')
-- Parité d'une liste simple (sans groupe).
:addClass(altern % 2 == 0 and pariteLigne
and 'palette-pair'
or nil)
:addClass('liste-horizontale')
:cssText(styleListe)
:wikitext(formatageListe(liste))
:done()
altern = altern + 1
return tostring(res)
end
local function listeGroupe(groupe, liste, couleur, n)
local res = mw.html.create('li')
:addClass('palette-ligne')
:tag('div')
:addClass('palette-groupe')
:cssText(couleur)
:wikitext(groupe)
:done()
:tag('div')
:addClass('palette-liste')
-- Parité d'une liste avec groupe.
:addClass(altern % 2 == 0
and 'palette-pair'
or nil)
:addClass('liste-horizontale')
:wikitext(formatageListe(liste))
:done()
altern = altern + 1
return tostring(res)
end
local function ligne(args, n, prefixe)
prefixe = prefixe or ''
local liste = args['liste' .. prefixe .. n]
local groupe = args['groupe' .. prefixe .. n]
-- Liste seule.
if liste and not groupe then
return listeSimple(liste, args.styleliste, n, true)
-- Liste et groupe présent.
elseif groupe and liste then
return listeGroupe(groupe, liste, args.couleur, n)
-- Groupe seul avec sous-ligne.
elseif groupe then
local sousLignes = ''
for i = 1, lignes do
local ligneCourante = ligne(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('Gestion incorrecte des groupes/sous-groupes')
end
-- Construction des sous-lignes.
local res = mw.html.create('li')
:addClass('palette-ligne')
:tag('div')
:addClass('palette-groupe')
:cssText(args.couleur)
:wikitext(groupe)
:done()
:tag('div')
:addClass('palette-listes')
:tag('ul')
:node(sousLignes)
:allDone()
return tostring(res)
end
end
local function section(args, n)
local section = args['section' .. n]
local liste = args['liste' .. n]
-- Liste seule.
if liste and not section then
return listeSimple(liste, args.styleliste, n, true)
-- Section avec liste simple ou sous-ligne.
elseif liste or section then
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('div')
:addClass('palette-section')
:cssText(args.couleur)
:wikitext(section)
:done()
:tag('div')
:addClass('mw-collapsible-content')
:tag('ul')
-- Section avec liste simple.
if liste and section then
contenuSection:node(listeSimple(liste, args.styleliste, n, false))
return tostring(res)
end
-- Section avec sous-ligne.
local sousLignes = ''
for i = 1, lignes do
local ligneCourante = ligne(args, i, n .. '.')
if not ligneCourante then break end
sousLignes = sousLignes .. ligneCourante
end
-- Détection des erreurs de paramètrage.
if sousLignes == '' then
return erreur('Gestion incorrecte des sections')
end contenuSection:wikitext(sousLignes)
return tostring(res)
end
end
local function contenu(args)
local res = mw.html.create('ul')
local contenu = ''
if args.image then
res:addClass('palette-image')
end
-- Détection d'une section. On suppose ici que la liste des arguments est
-- ordonnée et ne comporte aucun saut.
if args['section1']
and (args['liste1'] or args['liste1.1'] or args['groupe1.1']) then
for i = 1, lignes do
local sectionCourante = section(args, i)
if not sectionCourante then break end
res:node(sectionCourante)
altern = 1
end
-- Détection d'une ligne.
else
for i = 1, lignes do
local ligneCourante = ligne(args, i)
if not ligneCourante then break end
res:node(ligneCourante)
end
end
return res
end
function p._palette(args)
local loadStyles = mw.getCurrentFrame():extensionTag('templatestyles', '', {
src = styles
})
local res = mw.html.create('div')
:addClass('palette mw-collapsible')
:wikitext(loadStyles)
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(entete(args['modèle'], args.titre, args.namespace, args.couleur))
:tag('div')
:addClass('mw-collapsible-content')
:node(banniere(args.dessus, args.couleur))
:node(args.contenu or contenu(args))
:node(image(args.image))
:node(banniere(args.dessus, args.couleur))
return 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