Module:Palèt navigasyon
Apparence
La documentation pour ce module peut être créée à Module:Palèt navigasyon/doc
--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:Palèt navigasyon/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(args)
local titre = mw.title.new(args['modèle'], args.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(args.couleur)
:wikitext(texte)
:done()
:wikitext(']')
end
local res = mw.html.create('div')
:addClass('palet-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(args)
local res = mw.html.create()
local model = args['modèl']
-- Paramètre modèle.
if model and model ~= 'inactif' then
res:node(liens(args))
elseif not model then
res:wikitext(erreur('modèl', true))
end
-- Titre de la palette.
res
:tag('div')
:addClass('palèt-titre')
:cssText(args.couleur)
:wikitext(args.titre or erreur('titre', true))
return res
end
local function banniere(args, banniere)
if banniere then
local res = mw.html.create('div')
:addClass('palèt-banniere liste-horizontale')
:cssText(args.couleur)
:wikitext(formatageListe(banniere))
return res
end
end
local function image(args)
if args.image then
local res = mw.html.create('div')
:addClass('palette-image')
if args.image:match('^%[') or args.image:match('^%<') then
res:wikitext(args.image)
else
local lienImage = '[[Fichye:%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('palèt-ligne-simple')
:tag('div')
:addClass('palèt-liste-simple')
-- Parité d'une liste simple (sans groupe).
:addClass(altern % 2 == 0 and pariteLigne
and 'palèt-pair'
or nil)
: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('palèt-ligne')
:tag('div')
:addClass('palèt-groupe')
:cssText(args.couleur)
:wikitext(groupe)
:done()
:tag('div')
:addClass('palèt-liste')
-- Parité d'une liste avec groupe.
:addClass(altern % 2 == 0
and 'palèt-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(args, liste, n, true)
-- Liste et groupe présent.
elseif groupe and liste then
return listeGroupe(args, groupe, liste, 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('palèt-ligne')
:tag('div')
:addClass('palèt-groupe')
:cssText(args.couleur)
:wikitext(groupe)
:done()
:tag('div')
:addClass('palèt-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(args, liste, n, true)
-- Section avec liste simple ou sous-ligne.
elseif liste or section then
local res = mw.html.create('li')
:addClass('pallèt mw-collapsible mw-collapsed')
:css('border', '0')
:css('border-top', '2px solid white')
:css('font-size', '100%')
local contenuSection = res:tag('div')
:addClass('palèt-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(args, liste, 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._palet(args)
local loadStyles = mw.getCurrentFrame():extensionTag('templatestyles', '', {
src = styles
})
local res = mw.html.create('div')
:addClass('palèt 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))
:tag('div')
:addClass('mw-collapsible-content')
:node(banniere(args, args.dessus))
:node(args.contenu or contenu(args))
:node(image(args))
:node(banniere(args, args.dessous))
return res
end
function p.palet(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._palet(args)
end
return p