« Module:Bandeau » : différence entre les versions
Aller à la navigation
Aller à la recherche
Modèle>Hlm Z. Aucun résumé des modifications |
Modèle>Zebulon84 (fonctions de bandeau générique, d'article, de section, d'ébauche fonctionnels.) |
||
| Ligne 9 : | Ligne 9 : | ||
--Créer une fonction exportable pour les bandeaux système (ns:8). | --Créer une fonction exportable pour les bandeaux système (ns:8). | ||
--Gérer les images multiples. | --Gérer les images multiples. | ||
local p = {} | local p = {} | ||
local | local trim = require('Module:Outils').trim | ||
local yesno = require('Module:yesno') | |||
local class = mw.loadData('Module:Bandeau/Class/Test') | |||
-- local paramEbauche = mw.loadData('Module:Bandeau/Ébauche') -- ne sera chargé que pour un bandeau d'ébauche. | |||
local cfg = {} | local cfg = { | ||
forme = 'test-bandeau-simple', | |||
niveau = 'test-bandeau-niveau-neutre', | |||
formatLien = '[[Fichier:%s|%spx|alt=%s]]', | |||
tailleIcone = '45x45', | |||
erreurArgument = 'Paramètre <code>|%s=</code> manquant', | |||
erreurEbaucheParam = 'le thème « %s » du modèle [[Modèle:Ébauche|{{ébauche}}]] n’est pas [[Aide:Ébauche/Aide paramètres|défini]].', | |||
erreurEbaucheType = 'le thème « %s » doit apparaître en tête de liste du modèle [[Modèle:Ébauche|{{ébauche}}]].', | |||
ebaucheImage = '<span style="white-space:nowrap;word-spacing:5px">%s</span>', | |||
ebaucheTitre = '%s est une [[Aide:Ébauche|ébauche]].', | |||
ebaucheTitreSujet = '%s est une [[Aide:Ébauche|ébauche]] concernant %s.', | |||
ebaucheCateg = '[[Catégorie:Wikipédia:ébauche %s]]', | |||
} | |||
local function erreur(texte, formatstring, tag) | |||
local res = mw.html.create(tag or 'span') | |||
res :addClass('error') | |||
:wikitext('Erreur : ') | |||
if formatstring then | |||
res:wikitext(string.format(formatstring, texte)) | |||
else | |||
res:wikitext(texte) | |||
end | |||
return tostring(res) | |||
end | |||
function p._bandeau( | function p._bandeau(args) | ||
local res = mw.html.create('div') | local res = mw.html.create('div') | ||
local cells = mw.html.create() | |||
local icone = trim(args.image) or trim(args['icône']) | |||
local backgroundIcone = class.icones[icone] or '' | |||
local texte = (trim(args.texte) or erreur('texte', cfg.erreurArgument)) | |||
res | res :attr{ id = args.id } | ||
:addClass( | :addClass(class.formes[args.forme] or cfg.forme) | ||
:addClass( | :addClass(class.niveau[args.niveau] or cfg.niveau) | ||
:addClass('plainlinks') | :addClass('plainlinks') | ||
:cssText(args.style) | :addClass(args.class) | ||
:cssText(args.style) | |||
if args. | |||
if yesno(args.centrer) then | |||
:addClass('test-bandeau- | cells = mw.html.create('div') | ||
:addClass('test-bandeau-centrer') | |||
if | end | ||
if icone and backgroundIcone == '' then | |||
local iconeWiki = icone | |||
if not icone:match('%[') then | |||
local alt = args['légende'] or '|link=' | |||
local taille = args['taille icône'] or cfg.tailleIcone | |||
iconeWiki = mw.ustring.format(cfg.formatLien, icone, taille, alt) | |||
end | end | ||
cells | |||
:tag('div') | |||
:addClass('test-bandeau-cell test-bandeau-icone') | |||
:cssText(args.styleImage) --Provisoire | |||
:wikitext(iconeWiki) | |||
:done() | |||
elseif backgroundIcone ~= '' and args.forme == 'section' then | |||
texte = ' ' .. texte | |||
end | end | ||
cells | |||
:tag(' | :tag('div') | ||
:addClass('test-bandeau- | :addClass('test-bandeau-cell ' .. backgroundIcone) | ||
: | :cssText(args.styleTexte) --Provisoire | ||
:wikitext(texte) | |||
:newline() | |||
:done() | |||
res :node(cells) | |||
if trim(args['supplément']) then | |||
res :tag('p') | |||
:wikitext(args['supplément']) | |||
:done() | :done() | ||
end | |||
return tostring(res) | return tostring(res) | ||
end | end | ||
| Ligne 65 : | Ligne 103 : | ||
htmlTexte | htmlTexte | ||
:tag('strong') | :tag('strong') | ||
:wikitext(args.titre or erreur( | :addClass('test-bandeau-titre') | ||
:wikitext(trim(args.titre) or erreur('titre', cfg.erreurArgument)) | |||
:done() | :done() | ||
: | :wikitext(' ' .. (args.date or '')) | ||
:newline():newline() | |||
:wikitext(args.texte) | |||
local parametres = { | local parametres = { | ||
forme = 'article', | |||
niveau = args.niveau, | niveau = args.niveau, | ||
id = args.id, | |||
['icône'] = trim(args['icône']) or trim(args['icône-complexe']) or args.niveau, | |||
texte = tostring(htmlTexte), | texte = tostring(htmlTexte), | ||
['supplément'] = args['supplément'] | ['supplément'] = args['supplément'] | ||
| Ligne 83 : | Ligne 120 : | ||
return p._bandeau(parametres) | return p._bandeau(parametres) | ||
end | |||
function p._bandeauSection(args) | |||
local res = mw.html.create('div') | |||
local icone = trim(args.image) or trim(args['icône']) | |||
local backgroundIcone = class.icones[icone] or '' | |||
local texte = ' ' .. (trim(args.texte) or erreur('texte', cfg.erreurArgument)) | |||
res :addClass('test-bandeau-section') | |||
:addClass(class.niveau[args.niveau] or cfg.niveau) | |||
if icone and backgroundIcone == '' then | |||
local iconeWiki = icone | |||
if not icone:match('%[') then | |||
local alt = args['légende'] or '|link=' | |||
iconeWiki = mw.ustring.format(cfg.formatLien, icone, '20x17', alt) | |||
end | |||
res :wikitext(iconeWiki) | |||
:done() | |||
end | |||
res :addClass(backgroundIcone) | |||
:wikitext(texte) | |||
:done() | |||
return tostring(res) | |||
end | end | ||
p['_ébauche'] = function (args) | p['_ébauche'] = function (args) | ||
local | local paramEbauche = mw.loadData('Module:Bandeau/Ébauche') | ||
local | local ebauches, gestionErreur = {}, {} | ||
local frame = mw.getCurrentFrame() | |||
local parametres = { | |||
icone = 'icône', | |||
sujet = 'sujet', | |||
selon = 'selon', | |||
categ = 'catégorie', | |||
type = 'type', | |||
message = 'message' | |||
} | } | ||
local ebauches, gestionErreur = {}, {} | local getEbaucheTable = function( theme ) | ||
-- récupére les paramètres lié au theme, à partir du module:Bandeau/Ébauche ou du modèle:Ébauche/paramètres theme | |||
local modele = 'Modèle:Ébauche/paramètres ' .. theme | |||
local params | |||
if paramEbauche[theme] then | |||
params = { nom = theme } | |||
for n, v in pairs(paramEbauche[theme]) do | |||
params[n] = v | |||
end | |||
elseif mw.title.new( modele ).exists then | |||
params = { nom = theme } | |||
for n, v in pairs(parametres) do | |||
local param = frame:expandTemplate{title = modele, args = {v}} | |||
params[n] = trim(param) | |||
end | |||
end | |||
return params | |||
end | |||
local ebaucheParam = function( i, param ) | |||
-- foction qui retourne la valeur de param pour l'ébauche i, ou une valeur par défaut. | |||
return ebauches[i] and ebauches[i][param] or paramEbauche[''][param] | |||
end | |||
for i, theme in ipairs(args) do | |||
-- récupération des paramètres de tous les thèmes | |||
theme = trim(theme) | |||
if theme then | |||
local t = getEbaucheTable(theme) | |||
if t then | |||
table.insert(ebauches, t) | |||
else | |||
table.insert( | |||
gestionErreur, | |||
erreur(theme, cfg.erreurEbaucheParam, 'div') | |||
) | |||
end | |||
end | |||
end | |||
local images, titres, categs = {}, {}, {} | |||
local tailleIcone = cfg.tailleIcone | |||
if #ebauches > 3 then | |||
tailleIcone = '35x25' | |||
end | |||
for i, ebauche in ipairs(ebauches) do | |||
-- mise en forme des images | |||
if ebauche.icone then | |||
table.insert( | |||
images, | |||
cfg.formatLien:format( | |||
ebauche.icone, | |||
tailleIcone, | |||
ebauche.altIcone or '' | |||
) | |||
) | |||
end | |||
if math.fmod(#ebauches, 3) == 1 and (#ebauches - i) == 2 | |||
or math.fmod(i, 3) == 0 and (#ebauches - i) > 1 | |||
then | |||
-- sur plusieurs lignes s'il y a plus de 3 images, avec minimum deux images sur la dernière ligne. | |||
table.insert(images,'<br>') | |||
end | |||
if i > 1 and ebauche.type and ebauche.type ~= paramEbauche[''].type then | |||
-- remplace "Cet article par "Ce portail" ou autre en fonction du premier thème. | |||
table.insert( | |||
gestionErreur, | |||
erreur(ebauche.nom, cfg.erreurEbaucheType, 'div') | |||
) | |||
end | |||
-- récupères les différents noms de thème | |||
table.insert(titres, ebauche.sujet) | |||
-- mise en forme des catégories | |||
if ebauche.categ then | |||
table.insert( categs, cfg.ebaucheCateg:format( ebauche.categ ) ) | |||
end | |||
end | |||
local image | |||
if trim(args['icône']) then | |||
local theme = getEbaucheTable(args['icône']) | |||
if theme and theme.icone then | |||
image = cfg.formatLien:format(theme.icone, tailleIcone, '') | |||
end | end | ||
elseif #images == 1 then | |||
image = images[1] | |||
elseif #images > 1 then | |||
image = cfg.ebaucheImage:format(table.concat(images, ' ')) | |||
end | |||
local titre | |||
if #titres > 0 then | |||
titre = cfg.ebaucheTitreSujet:format( | |||
ebaucheParam(1, 'type'), | |||
mw.text.listToText(titres) | |||
) | |||
else | |||
titre = cfg.ebaucheTitre:format(ebaucheParam(1, 'type')) | |||
end | end | ||
local texte | |||
if #ebauches == 0 then | |||
texte = (ebaucheParam(1, 'message')) .. '.' | |||
else | |||
texte = (ebaucheParam(1, 'message')) .. ' ' .. (ebaucheParam(1, 'selon')) .. '.' | |||
end | |||
local parametres = { | local parametres = { | ||
niveau = 'ébauche', | |||
['icône'] = image, | |||
titre = titre, | |||
texte = | texte = texte, | ||
id = args.id | |||
} | } | ||
local categ = '' | |||
if not yesno(args.nocat) then | |||
categ = table.concat(categs) | |||
if categ == '' then | |||
categ = cfg.ebaucheCateg:format('') | |||
end | |||
end | |||
if | local messageErreur = table.concat(gestionErreur) | ||
if messageErreur:len() > 0 and not yesno(args.nocat) then | |||
messageErreur = messageErreur .. '[[Catégorie:Page utilisant un modèle avec une syntaxe erronée|Ébauche]]' | |||
end | end | ||
return | return p._bandeauAvertissement(parametres) .. messageErreur .. categ | ||
end | end | ||
-- Insertion dans la table p des fonctions appelées par les | -- Insertion dans la table p des fonctions appelées par les | ||
-- modèles à l'aide d'un adaptateur de fonction. | -- modèles à l'aide d'un adaptateur de fonction. | ||
function adaptateur(nomFonction) | local function adaptateur(nomFonction) | ||
return function (frame) | return function (frame) | ||
return p[nomFonction](frame:getParent().args or frame.args) | |||
end | end | ||
end | end | ||
local nomsFonction = {'bandeau', 'bandeauAvertissement', 'ébauche'} | local nomsFonction = {'bandeau', 'bandeauAvertissement', 'bandeauSection', 'ébauche' } | ||
for _, nomFonction in ipairs(nomsFonction) do | for _, nomFonction in ipairs(nomsFonction) do | ||
p[nomFonction] = adaptateur('_' .. nomFonction) | p[nomFonction] = adaptateur('_' .. nomFonction) | ||
Version du 3 janvier 2016 à 23:07
La documentation pour ce module peut être créée à Module:Bandeau/doc
--Ce module implémente les modèles de bandeau.
--Standardisation des bandeaux ([[Catégorie:Modèle de bandeau]]).
--Créer une fonction exportable pour le modèle {{Bandeau}} (ns:all).
--Créer une fonction exportable pour les bandeaux d'article (ns:0).
--Créer une fonction exportable pour les bandeaux de section (ns:0).
--Créer une fonction exportable pour les bandeaux d'ébauche (ns:0).
--Créer une fonction exportable pour les bandeaux de discussion (ns:1).
--Créer une fonction exportable pour les bandeaux système (ns:8).
--Gérer les images multiples.
local p = {}
local trim = require('Module:Outils').trim
local yesno = require('Module:yesno')
local class = mw.loadData('Module:Bandeau/Class/Test')
-- local paramEbauche = mw.loadData('Module:Bandeau/Ébauche') -- ne sera chargé que pour un bandeau d'ébauche.
local cfg = {
forme = 'test-bandeau-simple',
niveau = 'test-bandeau-niveau-neutre',
formatLien = '[[Fichier:%s|%spx|alt=%s]]',
tailleIcone = '45x45',
erreurArgument = 'Paramètre <code>|%s=</code> manquant',
erreurEbaucheParam = 'le thème « %s » du modèle [[Modèle:Ébauche|{{ébauche}}]] n’est pas [[Aide:Ébauche/Aide paramètres|défini]].',
erreurEbaucheType = 'le thème « %s » doit apparaître en tête de liste du modèle [[Modèle:Ébauche|{{ébauche}}]].',
ebaucheImage = '<span style="white-space:nowrap;word-spacing:5px">%s</span>',
ebaucheTitre = '%s est une [[Aide:Ébauche|ébauche]].',
ebaucheTitreSujet = '%s est une [[Aide:Ébauche|ébauche]] concernant %s.',
ebaucheCateg = '[[Catégorie:Wikipédia:ébauche %s]]',
}
local function erreur(texte, formatstring, tag)
local res = mw.html.create(tag or 'span')
res :addClass('error')
:wikitext('Erreur : ')
if formatstring then
res:wikitext(string.format(formatstring, texte))
else
res:wikitext(texte)
end
return tostring(res)
end
function p._bandeau(args)
local res = mw.html.create('div')
local cells = mw.html.create()
local icone = trim(args.image) or trim(args['icône'])
local backgroundIcone = class.icones[icone] or ''
local texte = (trim(args.texte) or erreur('texte', cfg.erreurArgument))
res :attr{ id = args.id }
:addClass(class.formes[args.forme] or cfg.forme)
:addClass(class.niveau[args.niveau] or cfg.niveau)
:addClass('plainlinks')
:addClass(args.class)
:cssText(args.style)
if yesno(args.centrer) then
cells = mw.html.create('div')
:addClass('test-bandeau-centrer')
end
if icone and backgroundIcone == '' then
local iconeWiki = icone
if not icone:match('%[') then
local alt = args['légende'] or '|link='
local taille = args['taille icône'] or cfg.tailleIcone
iconeWiki = mw.ustring.format(cfg.formatLien, icone, taille, alt)
end
cells
:tag('div')
:addClass('test-bandeau-cell test-bandeau-icone')
:cssText(args.styleImage) --Provisoire
:wikitext(iconeWiki)
:done()
elseif backgroundIcone ~= '' and args.forme == 'section' then
texte = ' ' .. texte
end
cells
:tag('div')
:addClass('test-bandeau-cell ' .. backgroundIcone)
:cssText(args.styleTexte) --Provisoire
:wikitext(texte)
:newline()
:done()
res :node(cells)
if trim(args['supplément']) then
res :tag('p')
:wikitext(args['supplément'])
:done()
end
return tostring(res)
end
function p._bandeauAvertissement(args)
local htmlTexte = mw.html.create()
htmlTexte
:tag('strong')
:addClass('test-bandeau-titre')
:wikitext(trim(args.titre) or erreur('titre', cfg.erreurArgument))
:done()
:wikitext(' ' .. (args.date or ''))
:newline():newline()
:wikitext(args.texte)
local parametres = {
forme = 'article',
niveau = args.niveau,
id = args.id,
['icône'] = trim(args['icône']) or trim(args['icône-complexe']) or args.niveau,
texte = tostring(htmlTexte),
['supplément'] = args['supplément']
}
return p._bandeau(parametres)
end
function p._bandeauSection(args)
local res = mw.html.create('div')
local icone = trim(args.image) or trim(args['icône'])
local backgroundIcone = class.icones[icone] or ''
local texte = ' ' .. (trim(args.texte) or erreur('texte', cfg.erreurArgument))
res :addClass('test-bandeau-section')
:addClass(class.niveau[args.niveau] or cfg.niveau)
if icone and backgroundIcone == '' then
local iconeWiki = icone
if not icone:match('%[') then
local alt = args['légende'] or '|link='
iconeWiki = mw.ustring.format(cfg.formatLien, icone, '20x17', alt)
end
res :wikitext(iconeWiki)
:done()
end
res :addClass(backgroundIcone)
:wikitext(texte)
:done()
return tostring(res)
end
p['_ébauche'] = function (args)
local paramEbauche = mw.loadData('Module:Bandeau/Ébauche')
local ebauches, gestionErreur = {}, {}
local frame = mw.getCurrentFrame()
local parametres = {
icone = 'icône',
sujet = 'sujet',
selon = 'selon',
categ = 'catégorie',
type = 'type',
message = 'message'
}
local getEbaucheTable = function( theme )
-- récupére les paramètres lié au theme, à partir du module:Bandeau/Ébauche ou du modèle:Ébauche/paramètres theme
local modele = 'Modèle:Ébauche/paramètres ' .. theme
local params
if paramEbauche[theme] then
params = { nom = theme }
for n, v in pairs(paramEbauche[theme]) do
params[n] = v
end
elseif mw.title.new( modele ).exists then
params = { nom = theme }
for n, v in pairs(parametres) do
local param = frame:expandTemplate{title = modele, args = {v}}
params[n] = trim(param)
end
end
return params
end
local ebaucheParam = function( i, param )
-- foction qui retourne la valeur de param pour l'ébauche i, ou une valeur par défaut.
return ebauches[i] and ebauches[i][param] or paramEbauche[''][param]
end
for i, theme in ipairs(args) do
-- récupération des paramètres de tous les thèmes
theme = trim(theme)
if theme then
local t = getEbaucheTable(theme)
if t then
table.insert(ebauches, t)
else
table.insert(
gestionErreur,
erreur(theme, cfg.erreurEbaucheParam, 'div')
)
end
end
end
local images, titres, categs = {}, {}, {}
local tailleIcone = cfg.tailleIcone
if #ebauches > 3 then
tailleIcone = '35x25'
end
for i, ebauche in ipairs(ebauches) do
-- mise en forme des images
if ebauche.icone then
table.insert(
images,
cfg.formatLien:format(
ebauche.icone,
tailleIcone,
ebauche.altIcone or ''
)
)
end
if math.fmod(#ebauches, 3) == 1 and (#ebauches - i) == 2
or math.fmod(i, 3) == 0 and (#ebauches - i) > 1
then
-- sur plusieurs lignes s'il y a plus de 3 images, avec minimum deux images sur la dernière ligne.
table.insert(images,'<br>')
end
if i > 1 and ebauche.type and ebauche.type ~= paramEbauche[''].type then
-- remplace "Cet article par "Ce portail" ou autre en fonction du premier thème.
table.insert(
gestionErreur,
erreur(ebauche.nom, cfg.erreurEbaucheType, 'div')
)
end
-- récupères les différents noms de thème
table.insert(titres, ebauche.sujet)
-- mise en forme des catégories
if ebauche.categ then
table.insert( categs, cfg.ebaucheCateg:format( ebauche.categ ) )
end
end
local image
if trim(args['icône']) then
local theme = getEbaucheTable(args['icône'])
if theme and theme.icone then
image = cfg.formatLien:format(theme.icone, tailleIcone, '')
end
elseif #images == 1 then
image = images[1]
elseif #images > 1 then
image = cfg.ebaucheImage:format(table.concat(images, ' '))
end
local titre
if #titres > 0 then
titre = cfg.ebaucheTitreSujet:format(
ebaucheParam(1, 'type'),
mw.text.listToText(titres)
)
else
titre = cfg.ebaucheTitre:format(ebaucheParam(1, 'type'))
end
local texte
if #ebauches == 0 then
texte = (ebaucheParam(1, 'message')) .. '.'
else
texte = (ebaucheParam(1, 'message')) .. ' ' .. (ebaucheParam(1, 'selon')) .. '.'
end
local parametres = {
niveau = 'ébauche',
['icône'] = image,
titre = titre,
texte = texte,
id = args.id
}
local categ = ''
if not yesno(args.nocat) then
categ = table.concat(categs)
if categ == '' then
categ = cfg.ebaucheCateg:format('')
end
end
local messageErreur = table.concat(gestionErreur)
if messageErreur:len() > 0 and not yesno(args.nocat) then
messageErreur = messageErreur .. '[[Catégorie:Page utilisant un modèle avec une syntaxe erronée|Ébauche]]'
end
return p._bandeauAvertissement(parametres) .. messageErreur .. categ
end
-- Insertion dans la table p des fonctions appelées par les
-- modèles à l'aide d'un adaptateur de fonction.
local function adaptateur(nomFonction)
return function (frame)
return p[nomFonction](frame:getParent().args or frame.args)
end
end
local nomsFonction = {'bandeau', 'bandeauAvertissement', 'bandeauSection', 'ébauche' }
for _, nomFonction in ipairs(nomsFonction) do
p[nomFonction] = adaptateur('_' .. nomFonction)
end
return p