« Module:Bandeau » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
m A modifié le niveau de protection de « Module:Bandeau » : Modèle très utilisé : plus 1,5 million d'inclusion ([Modifier=Autoriser uniquement les administrateurs] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini))
0x010D (discussion | contributions)
on ne peut pas générer d'<aside>…
 
(28 versions intermédiaires par le même utilisateur non affichées)
Ligne 15 : Ligne 15 :
local yesno = require('Module:yesno')
local yesno = require('Module:yesno')
local class = mw.loadData('Module:Bandeau/Class')
local class = mw.loadData('Module:Bandeau/Class')
-- local paramEbauche = mw.loadData('Module:Bandeau/Ébauche') -- ne sera chargé que pour un bandeau d'ébauche.
local moduleEbauche = 'Module:Bandeau/Ébauche'
-- local paramEbauche = mw.loadData(moduleEbauche) -- ne sera chargé que pour un bandeau d'ébauche.


local cfg = {
local cfg = {
forme = 'bandeau-simple',
forme = 'bandeau-simple',
niveau = 'bandeau-niveau-neutre',
niveau = 'bandeau-niveau-neutre',
formatLien = '[[Fichier:%s|%spx|alt=%s]]',
formatLien = '[[Fichier:%s|%spx|alt=%s|class=noviewer]]',
tailleIcone = '45x45',
tailleIcone = '45x45',
public = 'domaine public',
public = 'domaine public',
Ligne 38 : Ligne 39 :


if formatstring then
if formatstring then
res:wikitext(string.format(formatstring, texte))
res:wikitext(formatstring:format(texte))
else
else
res:wikitext(texte)
res:wikitext(texte)
Ligne 63 : Ligne 64 :
cells = mw.html.create('div')
cells = mw.html.create('div')
:addClass('bandeau-centrer')
:addClass('bandeau-centrer')
elseif trim(args.droite) then
cells = mw.html.create('div')
:css{ display = 'table', width = '100%' }
end
end
if icone and backgroundIcone == '' then
if icone and backgroundIcone == '' then
Ligne 70 : Ligne 74 :
if alt:lower() == cfg.public then
if alt:lower() == cfg.public then
alt = '|link='
alt = '|link='
end
if yesno( args['domaine public'] ) then
alt = alt .. '|link='
end
end
local taille = args['taille icône'] or cfg.tailleIcone
local taille = args['taille icône'] or cfg.tailleIcone
iconeWiki = mw.ustring.format(cfg.formatLien, icone, taille, alt)
iconeWiki = cfg.formatLien:format(icone, taille, alt)
end
end
cells
cells
:tag('div')
:tag('div')
:addClass('bandeau-cell bandeau-icone')
:addClass('bandeau-cell bandeau-icone')
:cssText(args.styleImage) --Provisoire
:wikitext(iconeWiki)
:wikitext(iconeWiki)
:done()
:done()
Ligne 86 : Ligne 92 :
:tag('div')
:tag('div')
:addClass('bandeau-cell ' .. backgroundIcone)
:addClass('bandeau-cell ' .. backgroundIcone)
:cssText(args.styleTexte) --Provisoire
:wikitext(texte)
:wikitext(texte)
:newline()
:newline()
:done()
:done()
if trim(args.droite) then
cells
:tag('div')
:addClass('bandeau-cell')
:css( 'padding-left', '1em' )
:newline()
:wikitext(args.droite)
:done()
end
res :node(cells)
res :node(cells)
if trim(args['supplément']) then
if trim(args['supplément']) then
res :tag('p')   
res :tag('p')   
Ligne 98 : Ligne 111 :
:done()
:done()
end
end
return tostring(res)
return tostring(res)
end
end
Ligne 118 : Ligne 130 :
niveau = args.niveau,
niveau = args.niveau,
id = args.id,
id = args.id,
class = args.class,
class = ( args.class or '' ) .. ' metadata',
['icône'] = trim(args['icône']) or trim(args['icône-complexe']) or args.niveau,
['icône'] = trim(args['icône']) or trim(args['icône-complexe']) or args.niveau,
alt = args.alt or args['légende'],
alt = args.alt or args['légende'],
['domaine public'] = args['domaine public'],
texte = tostring(htmlTexte),
texte = tostring(htmlTexte),
['supplément'] = args['supplément']
['supplément'] = args['supplément'],
}
}


Ligne 134 : Ligne 147 :
local texte = '&ensp;' .. (trim(args.texte) or erreur('texte', cfg.erreurArgument))
local texte = '&ensp;' .. (trim(args.texte) or erreur('texte', cfg.erreurArgument))


res :addClass('bandeau-section')
res :addClass('bandeau-section metadata')
:addClass(class.niveau[args.niveau] or cfg.niveau)
:addClass(class.niveau[args.niveau] or cfg.niveau)
Ligne 144 : Ligne 157 :
alt = '|link='
alt = '|link='
end
end
iconeWiki = mw.ustring.format(cfg.formatLien, icone, 'text-top|20x17', alt)
iconeWiki = cfg.formatLien:format(icone, 'text-top|20x17', alt)
end
end
res :wikitext(iconeWiki)
res :wikitext(iconeWiki)
Ligne 156 : Ligne 169 :
end
end


p['_ébauche'] = function (args)
-- fonction qui inverse la casse du premier caractère d'une chaine
local paramEbauche = mw.loadData('Module:Bandeau/Ébauche')
local function inverserCasse( str )
local ebauches, gestionErreur = {}, {}
if type( str ) == 'string' then
local frame = mw.getCurrentFrame()
local premierCar = mw.ustring.sub( str, 1, 1 )
local parametres = {
if mw.ustring.lower( premierCar ) == premierCar then
icone = 'icône',
return mw.ustring.upper( premierCar ) .. mw.ustring.sub( str, 2 )
sujet = 'sujet',
else
selon = 'selon',
return mw.ustring.lower( premierCar ) .. mw.ustring.sub( str, 2 )
categ = 'catégorie',
end
type  = 'type',
end
message = 'message'
end
}
 
local getEbaucheTable = function( theme )
-- fonction qui récupètre la ou les tables d'ébauche correspondant au thème
-- récupére les paramètres lié au theme, à partir du module:Bandeau/Ébauche ou du modèle:Ébauche/paramètres theme
local function getEbaucheTable( paramEbauche, theme, feminin )
local modele = 'Modèle:Ébauche/paramètres ' .. theme
-- suprime les marques de direction ltr
local params
theme = theme:gsub( '\226\128\142', '' ):gsub( '_', ' ' )
if paramEbauche[theme] then
-- récupére les paramètres lié au theme, à partir du module:Bandeau/Ébauche
params = { nom = theme }
local params = {}
for n, v in pairs(paramEbauche[theme]) do
local ebauche = paramEbauche[ theme ] or paramEbauche[ inverserCasse( theme ) ]
params[n] = v
if not ebauche and theme:find( ' ' ) then
-- teste si l'un des mots du thème correspond à un adjectif existant
for adj in theme:gmatch( ' ([^ ]+)' ) do
paramsAdj = getEbaucheTable( paramEbauche, adj, feminin )
if paramsAdj and paramsAdj.adjectif == true then
local nom = theme:gsub( ' ' .. adj:gsub( '(%p)', '%%%1'), '' )
params = getEbaucheTable( paramEbauche, nom, feminin )
if params then
return params, paramsAdj
end
end
end
elseif mw.title.new( modele ).exists then
end
params = { nom = theme }
-- aucun mot ne correspond à un adjectif, on essait une autre methode pour trouver une correspondance avec plusieurs mots
for n, v in pairs(parametres) do
if theme:find( ' .+ ' ) then
local param = frame:expandTemplate{title = modele, args = {v}}
for adj, paramsAdj in pairs( paramEbauche ) do
params[n] = trim(param)
if paramsAdj.adjectif == true and theme:find( ' ' .. adj, 2, true ) then
local nom = theme:gsub( ' ' .. adj:gsub( '(%p)', '%%%1'), '' )
params = getEbaucheTable( paramEbauche, nom, feminin )
if params then
return params, paramsAdj
end
end
end
end
end
end
return params
end
end
if feminin and ebauche and ebauche.feminin then
ebauche = paramEbauche[ ebauche.feminin ]
end
if ebauche then
for n, v in pairs( ebauche ) do
params[ n ] = v
end
else
params = nil
end
return params, nil
end
p.getEbaucheTable = getEbaucheTable
local function femininFromWikidata()
local entity = mw.wikibase.getEntity()
if entity then
local p31 = entity:getBestStatements( 'P31' )
local estHumain = type( p31 ) == 'table'
and #p31 == 1
and type( p31[ 1 ].mainsnak ) == 'table'
and type( p31[ 1 ].mainsnak.datavalue ) == 'table'
and type( p31[ 1 ].mainsnak.datavalue.value ) == 'table'
and p31[ 1 ].mainsnak.datavalue.value['numeric-id'] == 5
local p21 = entity:getBestStatements( 'P21' )
local estFeminin = type( p21 ) == 'table'
and #p21 == 1
and type( p21[ 1 ].mainsnak ) == 'table'
and type( p21[ 1 ].mainsnak.datavalue ) == 'table'
and type( p21[ 1 ].mainsnak.datavalue.value ) == 'table'
and p21[ 1 ].mainsnak.datavalue.value['numeric-id'] == 6581072
return estHumain, estFeminin
end
return false, false
end
p['_ébauche'] = function ( args )
local paramEbauche = mw.loadData( moduleEbauche )
local page = mw.title.getCurrentTitle()
local ebauches, gestionErreur = {}, {}
local humain, feminin = femininFromWikidata()
feminin = yesno( args["féminin"], true ) or feminin
local estFeminin
-- fonction qui retourne la valeur de param pour l'ébauche i, ou une valeur par défaut
local ebaucheParam = function( i, param )
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 ]
return ebauches[i] and ebauches[i][param] or paramEbauche[''][param]
end
end
 
for i, theme in ipairs(args) do
-- récupération des paramètres de tous les thèmes
-- récupération des paramètres de tous les thèmes
for i, theme in ipairs( args ) do
theme = trim(theme)
theme = trim( theme )
if theme then
if theme then
local t = getEbaucheTable(theme)
local t, tAdj = getEbaucheTable( paramEbauche, theme, feminin )
if t then
if t then
table.insert(ebauches, t)
table.insert( ebauches, t )
table.insert( ebauches, tAdj )
else
else
table.insert(
table.insert(
gestionErreur,  
gestionErreur,  
erreur(theme, cfg.erreurEbaucheParam, 'div')
erreur( theme, cfg.erreurEbaucheParam, 'div' )
)
)
end
end
Ligne 207 : Ligne 279 :
end
end
-- récupération des différents titres, images et catégories
local images, titres, categs = {}, {}, {}
local images, titres, categs = {}, {}, {}
local tailleIcone = cfg.tailleIcone
local tailleIcone = '45x35'
if #ebauches > 3 then
if #ebauches > 3 then
tailleIcone = '35x25'
tailleIcone = '35x25'
end
end
for i, ebauche in ipairs(ebauches) do
for i, ebauche in ipairs( ebauches ) do
-- mise en forme des images
-- création du lien de l'image
local alt = ebauche.altIcone
if not alt then
if ebauche.sujet then
alt = 'image illustrant ' .. ebauche.sujet
else
alt = ''
end
end
if ebauche.icone then
if ebauche.icone then
table.insert(
local image = cfg.formatLien:format( ebauche.icone, tailleIcone, alt )
images,
table.insert( images, image )
cfg.formatLien:format(
ebauche.icone,  
tailleIcone,  
ebauche.altIcone or ''
)
)
end
end
if math.fmod(#ebauches, 3) == 1 and (#ebauches - i) == 2
if math.fmod( #ebauches, 3 ) == 1 and ( #ebauches - i ) == 2
or math.fmod(i, 3) == 0 and (#ebauches - i) > 1
or math.fmod( i, 3 ) == 0 and ( #ebauches - i ) > 1
then
then
-- sur plusieurs lignes s'il y a plus de 3 images, avec minimum deux images sur la dernière ligne.
-- sur plusieurs lignes s'il y a plus de 3 images, avec minimum deux images sur la dernière ligne
table.insert(images,'<br>')
table.insert( images, '<br> ' )
end
end
if i > 1 and ebauche.type and ebauche.type ~= paramEbauche[''].type then
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.
-- remplace "Cet article par "Ce portail" ou autre en fonction du premier thème
table.insert(
table.insert(
gestionErreur,  
gestionErreur,  
erreur(ebauche.nom, cfg.erreurEbaucheType, 'div')
erreur( ebauche.nom, cfg.erreurEbaucheType, 'div' )
)
)
end
end
-- récupères les différents noms de thème
-- récupères les différents noms de thème
table.insert(titres, ebauche.sujet)
if ebauche.adjectif and #titres > 0 then
local sujet = ebauche.sujet or ebauche.nom
if estFeminin then
sujet = ebauche.sujetF or sujet:gsub(
ebauche.nom:gsub( '(%p)', '%%%1') .. '%f[%W]',
ebauche.feminin
)
end
-- ajout du sujet de l'adjectif dans le sujet de l'ébauche précédente
local titre, subst = titres[ #titres ]:gsub(
'<(adj[^>]*)>',
{ adjectif = sujet, adj = ebauche.nom, adjF = ebauche.feminin }
)
if subst > 0 then
titres[ #titres ] = titre
else
titres[ #titres ] = titre .. ' ' .. sujet
end
else
table.insert( titres, ebauche.sujet )
estFeminin = ebauche.estFeminin or ( ebauche.sujet == '' and estFeminin )
end
-- mise en forme des catégories
-- mise en forme des catégories
if ebauche.categ then  
if ebauche.adjectif then
table.insert( categs, cfg.ebaucheCateg:format( ebauche.categ ) )
-- tentative d'ajout du nom de l'adjectif dans les catégories précédentes
local modif = false
for k, v in ipairs( categs ) do
local cat, subst = v:gsub(
'<(adj[^>]*)>',
{ adj = ebauche.nom, adjF =  ebauche.feminin,  adjectif = ebauche.nom }
)
if subst == 0 then
cat = v .. ' ' .. ebauche.nom
end
if mw.title.new( 'Catégorie:Wikipédia:ébauche ' .. cat ).exists then
categs[ k ] = cat
modif = true
end
end
if not modif
and humain
and mw.title.new( 'Catégorie:Wikipédia:ébauche personnalité ' .. ebauche.feminin ).exists
then
table.insert( categs, 'personnalité ' .. ebauche.feminin )
end
end
end
table.insert( categs, ebauche.categ )
table.insert( categs, ebauche.categ2 )
end
end
-- mise en forme des images
local image  
local image  
if trim(args['icône']) then
if trim( args['icône'] ) then
local theme = getEbaucheTable(args['icône'])
local theme = getEbaucheTable( paramEbauche, args['icône'] )
if theme and theme.icone then
if theme and theme.icone then
image = cfg.formatLien:format(theme.icone, tailleIcone, theme.altIcone or '')
image = cfg.formatLien:format(
theme.icone,  
tailleIcone,  
theme.altIcone or ( 'image illustrant ' .. theme.sujet )
)
end
end
elseif #images == 1 then
elseif #images == 1 then
image = images[1]
image = images[ 1 ]
elseif #images > 1 then
elseif #images > 1 then
image = cfg.ebaucheImage:format(table.concat(images, ' '))
image = cfg.ebaucheImage:format( table.concat( images, ' ' ) )
end
end
-- mise en forme du titre
local titre
local titre
if #titres > 0 then
if #titres > 0 then
titre = cfg.ebaucheTitreSujet:format(  
titre = cfg.ebaucheTitreSujet:format(  
ebaucheParam(1, 'type'),  
ebaucheParam( 1, 'type' ),  
mw.text.listToText(titres)
mw.text.listToText( titres )
)
)
else
else
titre = cfg.ebaucheTitre:format(ebaucheParam(1, 'type'))
titre = cfg.ebaucheTitre:format( ebaucheParam( 1, 'type' ) )
end
end
-- mise en forme du texte
local texte
local texte
if #ebauches == 0 then
if #ebauches == 0 then
texte = (ebaucheParam(1, 'message')) .. '.'
texte = ( ebaucheParam( 1, 'message' ) ) .. '.'
else
else
texte = (ebaucheParam(1, 'message')) .. ' ' .. (ebaucheParam(1, 'selon')) .. '.'
local message = ebaucheParam( 1, 'message' )
local selon = ebaucheParam( 1, 'selon' )
-- ajout d'un point si le paramètre selon commence par un retour ligne ou une majuscule
if message:sub( -1 ) == ')' and ( selon:sub( 1, 3 ) == '<br' or mw.ustring.match( selon, '^%u' ) ) then
texte = ( ebaucheParam( 1, 'message' ) ) .. '. ' .. ( ebaucheParam( 1, 'selon' ) ) .. '.'
else
texte = ( ebaucheParam( 1, 'message' ) ) .. ' ' .. ( ebaucheParam( 1, 'selon' ) ) .. '.'
end
end
-- ajout d'un texte s'il y a une liste de tâches
local todo = mw.title.makeTitle( mw.site.namespaces[ page.namespace ].talk.id, page.text .. '/À faire' )
if todo.exists then
texte = texte .. '\n\n'
.. 'Consultez la liste des <b>tâches à accomplir</b> en [['
.. page.talkPageTitle.prefixedText
.. '|page de discussion]].'
end
end
-- paramètres pour le bandeau
local parametres = {
local parametres = {
niveau = 'ébauche',
niveau = 'ébauche',
['icône'] = image,
['icône'] = image,
titre = titre,
titre = titre:gsub( ' <adj[^>]*>', '' ),
texte = texte,
texte = texte,
id = args.id
id = args.id
}
}
-- concaténation des différentes catégories (pas de catégorisation si nocat, ou page de discussion, ou espace utilisateur)
local categ = ''
local categ = ''
if not yesno(args.nocat) then
local messageErreur = table.concat( gestionErreur )
categ = table.concat(categs)
if not ( yesno( args.nocat, true, false ) or page.isTalkPage or page.namespace == 2 ) then
for i = 1, #categs do
categs[ i ] = cfg.ebaucheCateg:format( categs[ i ] )
end
categ = table.concat( categs ):gsub( ' <[^>]*>', '' )
if categ == '' then
if categ == '' then
categ = cfg.ebaucheCateg:format('')
categ = cfg.ebaucheCateg:format('')
end
end
if #gestionErreur > 0 then
messageErreur = messageErreur .. '[[Catégorie:Ébauche inconnue]]'
end
end
return p._bandeauAvertissement( parametres ) .. messageErreur .. categ
end
---
-- fonction retournant un paramètre d'une table d'ébauche.
-- Elle est prévue pour être appelée directement par #invoke:
-- avec pour paramètres le thème et le paramètre désiré
-- Cette fonction est principalement destinée à la page d'aide.
function p.parametreEbauche( frame )
local paramEbauche = mw.loadData( moduleEbauche )
local theme = frame.args[1]
local param = frame.args[2]
if paramEbauche[ theme ] then
return paramEbauche[ theme ][ param ]
elseif paramEbauche[ inverserCasse( theme ) ] then
return paramEbauche[ inverserCasse( theme ) ][ param ]
end
end
---
-- Fonction retournant le féminin d'un théme d'ébauche
-- Elle est prévue pour être appelée directement par #invoke:
-- avec pour paramètres le thème et le paramètre désiré
-- Cette fonction est principalement destinée au modèle {{Catégorie d'ébauche}}, donc une valeur n'est retournée que si les catégories sont identiques
function p.femininEbauche( frame )
local paramEbauche = mw.loadData( moduleEbauche )
local theme = frame.args[1]
local themeF
if theme then
local t = getEbaucheTable( paramEbauche, theme )
local tF, tAdjF = getEbaucheTable( paramEbauche, theme, true )
if t.feminin and  tF.categ == t.categ then
if tAdjF then
themeF = tF.nom .. ' ' .. tAdjF.feminin
elseif tF then
themeF = tF.nom
end
return themeF
end
end
end
---
-- fonction qui contruit deux tableaux récapitulatif de l'ensemble des paramètres d'ébauche
function p.tableParametresEbauches( frame )
local paramEbauche = mw.loadData( moduleEbauche )
local params, paramAdj, paramType = {}, {}, {}
local wikiTab = { '<table class="wikitable sortable" style="table-layout:fixed;">' }
wikiTab.insert = function ( t, value )
table.insert( t, value )
return t
end
for clef, ebauche in pairs( paramEbauche ) do
local kEbauche = {}
for k, v in pairs( ebauche ) do
kEbauche[ k ] = v
end
kEbauche.clef = clef
if ebauche.type then
table.insert( paramType, kEbauche )
elseif ebauche.adjectif then
if clef == ebauche.nom or clef ~= ebauche.feminin then
table.insert( paramAdj, kEbauche )
end
else
table.insert( params, kEbauche )
end
end
local comp = function( eb1, eb2 )
return eb1.clef < eb2.clef
end
table.sort( params, comp )
table.sort( paramAdj, comp )
table.sort( paramType, comp )
wikiTab
:insert('\n=== Ébauches normales ===\n')
:insert('<caption>Liste des paramètres d\'ébauche</caption>')
:insert('<th scope=col style="width:15%;">nom</th>')
:insert('<th scope=col style="width:50px; box-sizing:border-box;">i</th>')
:insert('<th scope=col style="width:20%;">sujet</th>')
:insert('<th scope=col style="width:20%;">catégorie</th>')
:insert('<th scope=col>selon</th>')
for k, ebauche in ipairs( params ) do
wikiTab
:insert('<tr><td>')
:insert( ebauche.clef )
:insert('</td><td>')
if ebauche.icone then
wikiTab:insert( cfg.formatLien:format( ebauche.icone, '45x35', ebauche.altIcone or '' ) )
end
wikiTab
:insert('</td><td>')
:insert( ebauche.sujet )
:insert('</td><td>')
if ebauche.categ then
wikiTab
:insert( '[[:Catégorie:Wikipédia:ébauche ' .. ebauche.categ .. '|' .. ebauche.categ .. ']]' )
end
if ebauche.cageg2 then
wikiTab
:insert('<br>')
:insert( '[[:Catégorie:Wikipédia:ébauche ' .. ebauche.categ2 .. '|' .. ebauche.categ2 .. ']]' )
end
wikiTab
:insert('</td><td>')
:insert( ebauche.selon )
:insert('</td></tr>')
end
wikiTab:insert('</table>')
-- seconde table pour les adjectifs
wikiTab
:insert('\n=== Adjectifs ===\n')
:insert('<table class="wikitable">')
:insert('<caption>Liste des adjectifs</caption>')
:insert('<th scope=col>adjectif</th>')
:insert('<th scope=col>féminin</th>')
:insert('<th scope=col style="width:50px;">icone</th>')
:insert('<th scope=col>sujet</th>')
:insert('<th scope=col>sujet féminin</th>')
:insert('<th scope=col>catégorie</th>')
for k, ebauche in ipairs( paramAdj ) do
wikiTab
:insert('<tr><td>')
:insert( ebauche.clef )
:insert('</td><td>')
:insert( ebauche.feminin )
:insert('</td><td>')
if ebauche.icone then
wikiTab
:insert( cfg.formatLien:format( ebauche.icone, '45x35', ebauche.altIcone or '' ) )
end
wikiTab
:insert('</td><td>')
:insert( ebauche.sujet )
:insert('</td><td>')
:insert( ebauche.sujetF or ebauche.sujet:gsub( ebauche.nom .. '%f[%W]', ebauche.feminin ) )
:insert('</td><td>')
if ebauche.categ then
wikiTab
:insert( '[[:Catégorie:Wikipédia:ébauche ' .. ebauche.categ .. '|' .. ebauche.categ .. ']]' )
end
wikiTab
:insert('</td></tr>')
end
end
wikiTab:insert('</table>')
local messageErreur = table.concat(gestionErreur)
-- troisième table pour les types
if messageErreur:len() > 0 and not yesno(args.nocat) then
wikiTab
messageErreur = messageErreur .. '[[Catégorie:Page utilisant un modèle avec une syntaxe erronée|Ébauche]]'
:insert('\n=== Types ===\n')
:insert('<table class="wikitable">')
:insert('<caption>Liste des paramètres de type</caption>')
:insert('<th scope=col style="width:15%;">nom</th>')
:insert('<th scope=col style="width:50px;">icone</th>')
:insert('<th scope=col style="width:20%;">type</th>')
:insert('<th scope=col style="width:15%;">sujet</th>')
:insert('<th scope=col style="width:15%;">catégorie</th>')
:insert('<th scope=col>message</th>')
for k, ebauche in ipairs( paramType ) do
wikiTab
:insert('<tr><td>')
:insert( ebauche.clef )
:insert('</td><td>')
if ebauche.icone then
wikiTab:insert( cfg.formatLien:format( ebauche.icone, '45x35', ebauche.altIcone or '' ) )
end
wikiTab
:insert('</td><td>')
:insert ( ebauche.type )
:insert('</td><td>')
:insert( ebauche.sujet )
:insert('</td><td>')
if ebauche.categ then
wikiTab:insert( '[[:Catégorie:Wikipédia:ébauche ' .. ebauche.categ .. '|' .. ebauche.categ .. ']]' )
end
wikiTab
:insert('</td><td>')
:insert( ebauche.message )
:insert('</td></tr>')
end
end
wikiTab:insert('</table>')
return table.concat( wikiTab ):gsub( ' <adjF?>', '' )
end


return p._bandeauAvertissement(parametres) .. messageErreur .. categ
-- fonction destiné au gadget MediaWiki:Gadget-BandeauxEbauches.js
function p.listeEbauches( frame )
local paramEbauche = mw.loadData( moduleEbauche )
local liste = {}
for k in pairs( paramEbauche ) do
if k ~="" then
table.insert( liste, k )
end
end
table.sort( liste )
return table.concat( liste, '\n' )
end
end


-- Insertion dans la table p des fonctions appelées par les
-- Insertion dans la table p des fonctions appelées par les

Dernière version du 19 mai 2017 à 04:23

--Ce module implémente les modèles de bandeau.

--Standardisation des bandeaux (). --Créer une fonction exportable pour le modè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') local moduleEbauche = 'Module:Bandeau/Ébauche' -- local paramEbauche = mw.loadData(moduleEbauche) -- ne sera chargé que pour un bandeau d'ébauche.

local cfg = { forme = 'bandeau-simple', niveau = 'bandeau-niveau-neutre', formatLien = '%s', tailleIcone = '45x45', public = 'domaine public', erreurArgument = 'Paramètre |%s= manquant', erreurEbaucheParam = 'le thème « %s » du modèle Erreur Lua à la ligne 230 : attempt to index field 'wikibase' (a nil value). n’est pas défini.', erreurEbaucheType = 'le thème « %s » doit apparaître en tête de liste du modèle Erreur Lua à la ligne 230 : attempt to index field 'wikibase' (a nil value)..', ebaucheImage = '%s', ebaucheTitre = '%s est une ébauche.', ebaucheTitreSujet = '%s est une ébauche concernant %s.', ebaucheCateg = , }

local function erreur(texte, formatstring, tag) local res = mw.html.create(tag or 'span') res :addClass('error') :wikitext('Erreur : ')

if formatstring then res:wikitext(formatstring:format(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('bandeau-centrer') elseif trim(args.droite) then cells = mw.html.create('div') :css{ display = 'table', width = '100%' } end if icone and backgroundIcone == then local iconeWiki = icone if not icone:match('%[') then local alt = args.alt or args['légende'] or if alt:lower() == cfg.public then alt = '|link=' end if yesno( args['domaine public'] ) then alt = alt .. '|link=' end local taille = args['taille icône'] or cfg.tailleIcone iconeWiki = cfg.formatLien:format(icone, taille, alt) end cells :tag('div') :addClass('bandeau-cell bandeau-icone') :wikitext(iconeWiki) :done() elseif backgroundIcone ~= and args.forme == 'section' then texte = ' ' .. texte end cells :tag('div') :addClass('bandeau-cell ' .. backgroundIcone) :wikitext(texte) :newline() :done() if trim(args.droite) then cells :tag('div') :addClass('bandeau-cell') :css( 'padding-left', '1em' ) :newline() :wikitext(args.droite) :done() end

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('bandeau-titre') :wikitext(trim(args.titre) or erreur('titre', cfg.erreurArgument)) :done() :wikitext(args.date) :newline():newline() :wikitext(args.texte)

local parametres = { forme = 'article', niveau = args.niveau, id = args.id, class = ( args.class or ) .. ' metadata', ['icône'] = trim(args['icône']) or trim(args['icône-complexe']) or args.niveau, alt = args.alt or args['légende'], ['domaine public'] = args['domaine public'], 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('bandeau-section metadata') :addClass(class.niveau[args.niveau] or cfg.niveau)

if icone and backgroundIcone == then local iconeWiki = icone if not icone:match('%[') then local alt = args.alt or args['légende'] or if alt:lower() == cfg.public then alt = '|link=' end iconeWiki = cfg.formatLien:format(icone, 'text-top|20x17', alt) end res :wikitext(iconeWiki) :done() end res :addClass(backgroundIcone) :wikitext(texte) :done()

return tostring(res) end

-- fonction qui inverse la casse du premier caractère d'une chaine local function inverserCasse( str ) if type( str ) == 'string' then local premierCar = mw.ustring.sub( str, 1, 1 ) if mw.ustring.lower( premierCar ) == premierCar then return mw.ustring.upper( premierCar ) .. mw.ustring.sub( str, 2 ) else return mw.ustring.lower( premierCar ) .. mw.ustring.sub( str, 2 ) end end end

-- fonction qui récupètre la ou les tables d'ébauche correspondant au thème local function getEbaucheTable( paramEbauche, theme, feminin ) -- suprime les marques de direction ltr theme = theme:gsub( '\226\128\142', ):gsub( '_', ' ' ) -- récupére les paramètres lié au theme, à partir du module:Bandeau/Ébauche local params = {} local ebauche = paramEbauche[ theme ] or paramEbauche[ inverserCasse( theme ) ] if not ebauche and theme:find( ' ' ) then -- teste si l'un des mots du thème correspond à un adjectif existant for adj in theme:gmatch( ' ([^ ]+)' ) do paramsAdj = getEbaucheTable( paramEbauche, adj, feminin ) if paramsAdj and paramsAdj.adjectif == true then local nom = theme:gsub( ' ' .. adj:gsub( '(%p)', '%%%1'), ) params = getEbaucheTable( paramEbauche, nom, feminin ) if params then return params, paramsAdj end end end -- aucun mot ne correspond à un adjectif, on essait une autre methode pour trouver une correspondance avec plusieurs mots if theme:find( ' .+ ' ) then for adj, paramsAdj in pairs( paramEbauche ) do if paramsAdj.adjectif == true and theme:find( ' ' .. adj, 2, true ) then local nom = theme:gsub( ' ' .. adj:gsub( '(%p)', '%%%1'), ) params = getEbaucheTable( paramEbauche, nom, feminin ) if params then return params, paramsAdj end end end end end if feminin and ebauche and ebauche.feminin then ebauche = paramEbauche[ ebauche.feminin ] end if ebauche then for n, v in pairs( ebauche ) do params[ n ] = v end else params = nil end return params, nil end p.getEbaucheTable = getEbaucheTable

local function femininFromWikidata() local entity = mw.wikibase.getEntity() if entity then local p31 = entity:getBestStatements( 'P31' ) local estHumain = type( p31 ) == 'table' and #p31 == 1 and type( p31[ 1 ].mainsnak ) == 'table' and type( p31[ 1 ].mainsnak.datavalue ) == 'table' and type( p31[ 1 ].mainsnak.datavalue.value ) == 'table' and p31[ 1 ].mainsnak.datavalue.value['numeric-id'] == 5 local p21 = entity:getBestStatements( 'P21' ) local estFeminin = type( p21 ) == 'table' and #p21 == 1 and type( p21[ 1 ].mainsnak ) == 'table' and type( p21[ 1 ].mainsnak.datavalue ) == 'table' and type( p21[ 1 ].mainsnak.datavalue.value ) == 'table' and p21[ 1 ].mainsnak.datavalue.value['numeric-id'] == 6581072 return estHumain, estFeminin end return false, false end

p['_ébauche'] = function ( args ) local paramEbauche = mw.loadData( moduleEbauche ) local page = mw.title.getCurrentTitle() local ebauches, gestionErreur = {}, {} local humain, feminin = femininFromWikidata() feminin = yesno( args["féminin"], true ) or feminin local estFeminin

-- fonction qui retourne la valeur de param pour l'ébauche i, ou une valeur par défaut local ebaucheParam = function( i, param ) return ebauches[ i ] and ebauches[ i ][ param ] or paramEbauche[][ param ] end

-- récupération des paramètres de tous les thèmes for i, theme in ipairs( args ) do theme = trim( theme ) if theme then local t, tAdj = getEbaucheTable( paramEbauche, theme, feminin ) if t then table.insert( ebauches, t ) table.insert( ebauches, tAdj ) else table.insert( gestionErreur, erreur( theme, cfg.erreurEbaucheParam, 'div' ) ) end end end

-- récupération des différents titres, images et catégories local images, titres, categs = {}, {}, {} local tailleIcone = '45x35' if #ebauches > 3 then tailleIcone = '35x25' end for i, ebauche in ipairs( ebauches ) do -- création du lien de l'image local alt = ebauche.altIcone if not alt then if ebauche.sujet then alt = 'image illustrant ' .. ebauche.sujet else alt = end end if ebauche.icone then local image = cfg.formatLien:format( ebauche.icone, tailleIcone, alt ) table.insert( images, image ) 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, '
' ) 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 if ebauche.adjectif and #titres > 0 then local sujet = ebauche.sujet or ebauche.nom if estFeminin then sujet = ebauche.sujetF or sujet:gsub( ebauche.nom:gsub( '(%p)', '%%%1') .. '%f[%W]', ebauche.feminin ) end -- ajout du sujet de l'adjectif dans le sujet de l'ébauche précédente local titre, subst = titres[ #titres ]:gsub( '<(adj[^>]*)>', { adjectif = sujet, adj = ebauche.nom, adjF = ebauche.feminin } ) if subst > 0 then titres[ #titres ] = titre else titres[ #titres ] = titre .. ' ' .. sujet end else table.insert( titres, ebauche.sujet ) estFeminin = ebauche.estFeminin or ( ebauche.sujet == and estFeminin ) end

-- mise en forme des catégories if ebauche.adjectif then -- tentative d'ajout du nom de l'adjectif dans les catégories précédentes local modif = false for k, v in ipairs( categs ) do local cat, subst = v:gsub( '<(adj[^>]*)>', { adj = ebauche.nom, adjF = ebauche.feminin, adjectif = ebauche.nom } ) if subst == 0 then cat = v .. ' ' .. ebauche.nom end if mw.title.new( 'Catégorie:Wikipédia:ébauche ' .. cat ).exists then categs[ k ] = cat modif = true end end if not modif and humain and mw.title.new( 'Catégorie:Wikipédia:ébauche personnalité ' .. ebauche.feminin ).exists then table.insert( categs, 'personnalité ' .. ebauche.feminin ) end end table.insert( categs, ebauche.categ ) table.insert( categs, ebauche.categ2 ) end

-- mise en forme des images local image if trim( args['icône'] ) then local theme = getEbaucheTable( paramEbauche, args['icône'] ) if theme and theme.icone then image = cfg.formatLien:format( theme.icone, tailleIcone, theme.altIcone or ( 'image illustrant ' .. theme.sujet ) ) end elseif #images == 1 then image = images[ 1 ] elseif #images > 1 then image = cfg.ebaucheImage:format( table.concat( images, ' ' ) ) end

-- mise en forme du titre 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

-- mise en forme du texte local texte if #ebauches == 0 then texte = ( ebaucheParam( 1, 'message' ) ) .. '.' else local message = ebaucheParam( 1, 'message' ) local selon = ebaucheParam( 1, 'selon' ) -- ajout d'un point si le paramètre selon commence par un retour ligne ou une majuscule if message:sub( -1 ) == ')' and ( selon:sub( 1, 3 ) == '<br' or mw.ustring.match( selon, '^%u' ) ) then texte = ( ebaucheParam( 1, 'message' ) ) .. '. ' .. ( ebaucheParam( 1, 'selon' ) ) .. '.' else texte = ( ebaucheParam( 1, 'message' ) ) .. ' ' .. ( ebaucheParam( 1, 'selon' ) ) .. '.' end end -- ajout d'un texte s'il y a une liste de tâches local todo = mw.title.makeTitle( mw.site.namespaces[ page.namespace ].talk.id, page.text .. '/À faire' ) if todo.exists then texte = texte .. '\n\n' .. 'Consultez la liste des tâches à accomplir en [[' .. page.talkPageTitle.prefixedText .. '|page de discussion]].' end

-- paramètres pour le bandeau local parametres = { niveau = 'ébauche', ['icône'] = image, titre = titre:gsub( ' <adj[^>]*>', ), texte = texte, id = args.id }

-- concaténation des différentes catégories (pas de catégorisation si nocat, ou page de discussion, ou espace utilisateur) local categ = local messageErreur = table.concat( gestionErreur ) if not ( yesno( args.nocat, true, false ) or page.isTalkPage or page.namespace == 2 ) then for i = 1, #categs do categs[ i ] = cfg.ebaucheCateg:format( categs[ i ] ) end categ = table.concat( categs ):gsub( ' <[^>]*>', ) if categ == then categ = cfg.ebaucheCateg:format() end if #gestionErreur > 0 then messageErreur = messageErreur .. end end


return p._bandeauAvertissement( parametres ) .. messageErreur .. categ end

--- -- fonction retournant un paramètre d'une table d'ébauche. -- Elle est prévue pour être appelée directement par #invoke: -- avec pour paramètres le thème et le paramètre désiré -- Cette fonction est principalement destinée à la page d'aide. function p.parametreEbauche( frame ) local paramEbauche = mw.loadData( moduleEbauche ) local theme = frame.args[1] local param = frame.args[2] if paramEbauche[ theme ] then return paramEbauche[ theme ][ param ] elseif paramEbauche[ inverserCasse( theme ) ] then return paramEbauche[ inverserCasse( theme ) ][ param ] end end

--- -- Fonction retournant le féminin d'un théme d'ébauche -- Elle est prévue pour être appelée directement par #invoke: -- avec pour paramètres le thème et le paramètre désiré -- Cette fonction est principalement destinée au modèle Modèle:Catégorie d'ébauche, donc une valeur n'est retournée que si les catégories sont identiques function p.femininEbauche( frame ) local paramEbauche = mw.loadData( moduleEbauche ) local theme = frame.args[1] local themeF if theme then local t = getEbaucheTable( paramEbauche, theme ) local tF, tAdjF = getEbaucheTable( paramEbauche, theme, true ) if t.feminin and tF.categ == t.categ then if tAdjF then themeF = tF.nom .. ' ' .. tAdjF.feminin elseif tF then themeF = tF.nom end return themeF end end end

--- -- fonction qui contruit deux tableaux récapitulatif de l'ensemble des paramètres d'ébauche function p.tableParametresEbauches( frame ) local paramEbauche = mw.loadData( moduleEbauche ) local params, paramAdj, paramType = {}, {}, {}

local wikiTab = { '

' } wikiTab.insert = function ( t, value ) table.insert( t, value ) return t end for clef, ebauche in pairs( paramEbauche ) do local kEbauche = {} for k, v in pairs( ebauche ) do kEbauche[ k ] = v end kEbauche.clef = clef if ebauche.type then table.insert( paramType, kEbauche ) elseif ebauche.adjectif then if clef == ebauche.nom or clef ~= ebauche.feminin then table.insert( paramAdj, kEbauche ) end else table.insert( params, kEbauche ) end end local comp = function( eb1, eb2 ) return eb1.clef < eb2.clef end table.sort( params, comp ) table.sort( paramAdj, comp ) table.sort( paramType, comp ) wikiTab :insert('\n=== Ébauches normales ===\n') :insert('') :insert('') :insert('') :insert('') :insert('') :insert('')

for k, ebauche in ipairs( params ) do wikiTab

:insert('') end wikiTab:insert('
Liste des paramètres d\'ébauche
nomisujetcatégorieselon
')

:insert( ebauche.clef )

:insert('
')

if ebauche.icone then wikiTab:insert( cfg.formatLien:format( ebauche.icone, '45x35', ebauche.altIcone or ) ) end wikiTab

:insert('
')

:insert( ebauche.sujet )

:insert('
')

if ebauche.categ then wikiTab :insert( '' .. ebauche.categ .. '' ) end if ebauche.cageg2 then wikiTab :insert('
') :insert( '' .. ebauche.categ2 .. '' ) end wikiTab

:insert('
')

:insert( ebauche.selon )

:insert('

')

-- seconde table pour les adjectifs wikiTab :insert('\n=== Adjectifs ===\n')

:insert('

') :insert('') :insert('') :insert('') :insert('') :insert('') :insert('') :insert('')

for k, ebauche in ipairs( paramAdj ) do wikiTab

:insert('') end wikiTab:insert('
Liste des adjectifs
adjectiffémininiconesujetsujet féminincatégorie
')

:insert( ebauche.clef )

:insert('
')

:insert( ebauche.feminin )

:insert('
')

if ebauche.icone then wikiTab :insert( cfg.formatLien:format( ebauche.icone, '45x35', ebauche.altIcone or ) ) end wikiTab

:insert('
')

:insert( ebauche.sujet )

:insert('
')

:insert( ebauche.sujetF or ebauche.sujet:gsub( ebauche.nom .. '%f[%W]', ebauche.feminin ) )

:insert('
')

if ebauche.categ then wikiTab :insert( '' .. ebauche.categ .. '' ) end wikiTab

:insert('

')

-- troisième table pour les types wikiTab :insert('\n=== Types ===\n')

:insert('

') :insert('') :insert('') :insert('') :insert('') :insert('') :insert('') :insert('')

for k, ebauche in ipairs( paramType ) do wikiTab

:insert('') end wikiTab:insert('
Liste des paramètres de type
nomiconetypesujetcatégoriemessage
')

:insert( ebauche.clef )

:insert('
')

if ebauche.icone then wikiTab:insert( cfg.formatLien:format( ebauche.icone, '45x35', ebauche.altIcone or ) ) end wikiTab

:insert('
')

:insert ( ebauche.type )

:insert('
')

:insert( ebauche.sujet )

:insert('
')

if ebauche.categ then wikiTab:insert( '' .. ebauche.categ .. '' ) end wikiTab

:insert('
')

:insert( ebauche.message )

:insert('

')

return table.concat( wikiTab ):gsub( ' <adjF?>', ) end

-- fonction destiné au gadget MediaWiki:Gadget-BandeauxEbauches.js function p.listeEbauches( frame ) local paramEbauche = mw.loadData( moduleEbauche ) local liste = {} for k in pairs( paramEbauche ) do if k ~="" then table.insert( liste, k ) end end table.sort( liste ) return table.concat( liste, '\n' ) 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) local args if frame.args.texte or frame.args.titre then args = frame.args else args = frame:getParent().args end return p[nomFonction](args) end end

local nomsFonction = {'bandeau', 'bandeauAvertissement', 'bandeauSection', 'ébauche' } for _, nomFonction in ipairs(nomsFonction) do p[nomFonction] = adaptateur('_' .. nomFonction) end

return p