Module:Bandeau : Différence entre versions
(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