Module:Palette de navigation/Bac à sable
Навигацияға өту
Іздеуге өту
Бұл модульдің құжаттамасын Module:Palette de navigation/Bac à sable/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.
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
function p._palette(argsPalette)
args = argsPalette
local etat = args['état']
local res = mw.html.create('div')
:addClass('palette fr-collapsible')
-- Paramètre état.
if etat == 'fermé' then
res:addClass('collapsed fr-collapsed')
elseif not etat == 'ouvert' then
res:addClass('fr-collapsed')
end
res
-- Construction de l'entête de la palette.
:node(entetePalette())
:tag('div')
:addClass('fr-collapsible-content')
-- Construction de la bannière supérieure de la palette.
:node(dessusPalette())
-- Construction du contenu de la palette.
:node(args.contenu or contenuPalette())
-- Construction de la bannière inférieure de la palette.
:node(dessousPalette())
return tostring(res)
end
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
function formatageListe(liste)
local premier = mw.ustring.sub(liste, 1, 1)
local dernier = mw.ustring.sub(liste, -1, -1)
local frame = mw.getCurrentFrame()
-- Formatage de début de liste.
if premier ~= '\n' then
liste = '\n' .. liste
end
--Formatage de fin de liste
if dernier ~= '\n' then
return frame:preprocess(liste .. '\n')
else
return frame:preprocess(liste)
end
end
function lienModifier()
local res = mw.html.create('span')
local titre = (args.namespace or 'Modèle') .. ':' .. args['modèle']
res
:addClass('palette-modifier noprint plainlinksneverexpand')
:wikitext('[[')
:wikitext(titre)
:wikitext('|')
:tag('abbr')
:addClass('abbr')
:attr('title', 'Voir ce modèle')
:cssText(args.couleur)
:wikitext('modifier')
:done()
:wikitext(']]')
return tostring(res)
end
function entetePalette()
local res = mw.html.create()
local modele = args['modèle']
-- Paramètre modèle.
if modele and modele ~= 'inactif' then
res:node(lienModifier())
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 tostring(res)
end
function dessusPalette()
local res = mw.html.create()
-- Bannière supérieure.
if args.dessus then
res
:tag('div')
:addClass('palette-banniere liste-horizontale')
:cssText(args.couleur)
:wikitext(formatageListe(args.dessus))
end
return tostring(res)
end
function dessousPalette()
local res = mw.html.create()
-- Comportement différent si argument image.
if args.image then
detectionImage = res:tag('div')
:addClass('palette-image')
if mw.ustring.sub(args.image, 1, 1) == '[' then
detectionImage:wikitext(args.image)
else
local lienImage = '[[Fichier:%s|100px]]'
detectionImage:wikitext(format(lienImage, args.image))
end
end
-- Bannière inférieure.
if args.dessous then
res
:tag('div')
:addClass('palette-banniere liste-horizontale')
:cssText(args.couleur)
:wikitext(formatageListe(args.dessous))
end
return tostring(res)
end
function contenuPalette()
local res = mw.html.create('ul')
if args.image then
res:addClass('palette-image')
end
-- Détection d'une section.
if args['section1'] and (args['liste1'] or args['liste1.1'] or args['groupe1.1']) then
for i = 1, lignes do
local sectionCourante = sectionPalette('', i)
if sectionCourante == '' then break end
res:node(sectionCourante)
end
-- Détection d'une ligne.
else
for i = 1, lignes do
local ligneCourante = lignePalette('', i)
if ligneCourante == '' then break end
res:node(ligneCourante)
end
end
return tostring(res)
end
function sectionPalette(prefixe, n)
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(liste, n, true)
end
-- Sinon : Section avec liste simple ou sous-ligne.
local res = mw.html.create('li')
:addClass('palette fr-collapsible fr-collapsed')
:css('border', '0')
:css('padding', '2px 0 0')
:css('font-size', '100%')
local contenuSection = res:tag('p')
:addClass('palette-section')
:cssText(args.couleur)
:wikitext(section)
:tag('div')
:addClass('fr-collapsible-content')
:tag('ul')
-- Section avec liste simple.
if liste and section then
contenuSection:node(listeSimple(liste, n, false))
return tostring(res)
end
-- Section avec sous-ligne.
local sousLignes = ''
for i = 1, lignes do
local ligneCourante = lignePalette(prefixe .. n .. '.', i)
if 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
function lignePalette(prefixe, n)
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(liste, n, true)
-- Liste et groupe présent.
elseif groupe and liste then
return listeGroupe(groupe, liste, n)
end
-- Sinon : Groupe seul avec sous-ligne.
local sousLignes = ''
for i = 1, lignes do
local ligneCourante = lignePalette(prefixe .. n .. '.', i)
if 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
function listeSimple(liste, n, pariteLigne)
local res = mw.html.create('li')
:addClass('palette-ligne-simple')
local listeSimpleParite = res:tag('div')
-- Parité d'une liste simple (sans groupe).
if altern % 2 == 0 and pariteLigne then
listeSimpleParite:addClass('palette-liste-simple-pair liste-horizontale')
else
listeSimpleParite:addClass('palette-liste-simple liste-horizontale')
end
listeSimpleParite:wikitext(formatageListe(liste))
altern = altern + 1
return tostring(res)
end
function listeGroupe(groupe, liste, n)
local res = mw.html.create('li')
:addClass('palette-ligne')
:tag('span')
:addClass('palette-groupe')
:cssText(args.couleur)
:wikitext(groupe)
:done()
local listeGroupeParite = res:tag('div')
-- Parité d'une liste avec groupe.
if altern % 2 == 0 then
listeGroupeParite:addClass('palette-liste-pair liste-horizontale')
else
listeGroupeParite:addClass('palette-liste liste-horizontale')
end
listeGroupeParite:wikitext(formatageListe(liste))
altern = altern + 1
return tostring(res)
end
return p