Module:Bandeau : Différence entre versions
(Bandeau : paramètre « domaine public », pour ne pas être dépendant du paramètre alt qui n'est pas forcément lié.) |
(_ébauche : nouvelle version utilisant des adjectifs de nationalité pour réduire la base de données ; Génération de tableaux récapitulatifs des ébauches.) |
||
Ligne 160 : | Ligne 160 : | ||
end | end | ||
− | + | -- fonction qui inverse la casse du premier caractère d'une chaine | |
− | local | + | 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 ) | |
− | + | -- 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 = { nom = theme } | |
− | + | local ebauche = paramEbauche[ theme ] or paramEbauche[ inverserCasse( theme ) ] | |
− | + | if not ebauche and theme:match( ' ' ) then | |
− | + | -- teste si le thème inclue 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 | ||
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 | ||
+ | elseif mw.title.new( modele ).exists then | ||
+ | local frame = mw.getCurrentFrame() | ||
+ | local parametres = { | ||
+ | icone = 'icône', | ||
+ | sujet = 'sujet', | ||
+ | selon = 'selon', | ||
+ | categ = 'catégorie', | ||
+ | type = 'type', | ||
+ | message = 'message' | ||
+ | } | ||
+ | for n, v in pairs( parametres ) do | ||
+ | local param = frame:expandTemplate{ title = modele, args = {v} } | ||
+ | params[ n ] = trim( param ) | ||
+ | end | ||
+ | else | ||
+ | params = nil | ||
+ | end | ||
+ | return params, nil | ||
+ | end | ||
+ | |||
+ | local function femininFromWikidata() | ||
+ | local entity = mw.wikibase.getEntity() | ||
+ | if entity then | ||
+ | local p21 = entity:getBestStatements( 'P21' ) | ||
+ | if 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' | ||
+ | then | ||
+ | return p21[ 1 ].mainsnak.datavalue.value['numeric-id'] == 6581072 | ||
+ | end | ||
+ | end | ||
+ | return false | ||
+ | end | ||
+ | |||
+ | p['_ébauche'] = function ( args ) | ||
+ | local paramEbauche = mw.loadData('Module:Bandeau/Ébauch') | ||
+ | local page = mw.title.getCurrentTitle() | ||
+ | local ebauches, gestionErreur = {}, {} | ||
+ | local feminin = yesno( args["féminin"] ) or femininFromWikidata() | ||
+ | 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 ) | ||
− | + | 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 |
− | + | 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 212 : | Ligne 263 : | ||
end | end | ||
+ | -- récupération des différents titres, images et catégories | ||
local images, titres, categs = {}, {}, {} | local images, titres, categs = {}, {}, {} | ||
− | local 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 |
− | -- | + | -- 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 | ||
− | + | local image = cfg.formatLien:format( ebauche.icone, tailleIcone, alt ) | |
− | + | table.insert( images, image ) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | ) | ||
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 .. '%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. | + | if ebauche.adjectif then |
− | + | -- tentative d'ajout du nom de l'adjectif dans les catégories précédentes | |
+ | 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 | ||
+ | end | ||
+ | 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:sub( 1, 1 ), '%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( ' <[^>]*>', '' ), |
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 | + | if not ( yesno( args.nocat ) or page.isTalkPage or page.namespace == 2 ) then |
− | categ = table.concat(categs) | + | 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('') | ||
Ligne 297 : | Ligne 411 : | ||
end | end | ||
− | local messageErreur = table.concat(gestionErreur) | + | local messageErreur = table.concat( gestionErreur ) |
− | if messageErreur:len() > 0 and not yesno(args.nocat) then | + | if messageErreur:len() > 0 and not yesno( args.nocat ) then |
− | messageErreur = messageErreur .. '[[Catégorie: | + | messageErreur = messageErreur .. '[[Catégorie:Ébauche inconnue]]' |
end | end | ||
− | return p._bandeauAvertissement(parametres) .. messageErreur .. categ | + | return p._bandeauAvertissement( parametres ) .. messageErreur .. categ |
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('Module:Bandeau/Ébauche') | ||
+ | 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 | ||
+ | wikiTab:insert('</table>') | ||
+ | |||
+ | -- troisième table pour les types | ||
+ | wikiTab | ||
+ | :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 | ||
+ | wikiTab:insert('</table>') | ||
+ | |||
+ | return table.concat( wikiTab ):gsub( ' <adjF?>', '' ) | ||
+ | end | ||
+ | |||
-- Insertion dans la table p des fonctions appelées par les | -- Insertion dans la table p des fonctions appelées par les |
Version du 2 mai 2016 à 13:11
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') -- local paramEbauche = mw.loadData('Module:Bandeau/Ébauche') -- ne sera chargé que pour un bandeau d'ébauche. local cfg = { forme = 'bandeau-simple', niveau = 'bandeau-niveau-neutre', formatLien = '[[Fichier:%s|%spx|alt=%s]]', tailleIcone = '45x45', public = 'domaine public', 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(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') 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') :cssText(args.styleImage) --Provisoire :wikitext(iconeWiki) :done() elseif backgroundIcone ~= '' and args.forme == 'section' then texte = ' ' .. texte end cells :tag('div') :addClass('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('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, ['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') :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 ) -- 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 = { nom = theme } local ebauche = paramEbauche[ theme ] or paramEbauche[ inverserCasse( theme ) ] if not ebauche and theme:match( ' ' ) then -- teste si le thème inclue 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 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 elseif mw.title.new( modele ).exists then local frame = mw.getCurrentFrame() local parametres = { icone = 'icône', sujet = 'sujet', selon = 'selon', categ = 'catégorie', type = 'type', message = 'message' } for n, v in pairs( parametres ) do local param = frame:expandTemplate{ title = modele, args = {v} } params[ n ] = trim( param ) end else params = nil end return params, nil end local function femininFromWikidata() local entity = mw.wikibase.getEntity() if entity then local p21 = entity:getBestStatements( 'P21' ) if 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' then return p21[ 1 ].mainsnak.datavalue.value['numeric-id'] == 6581072 end end return false end p['_ébauche'] = function ( args ) local paramEbauche = mw.loadData('Module:Bandeau/Ébauch') local page = mw.title.getCurrentTitle() local ebauches, gestionErreur = {}, {} local feminin = yesno( args["féminin"] ) or femininFromWikidata() 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, '<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 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 .. '%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 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 end 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:sub( 1, 1 ), '%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 -- paramètres pour le bandeau local parametres = { niveau = 'ébauche', ['icône'] = image, titre = titre:gsub( ' <[^>]*>', '' ), 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 = '' if not ( yesno( args.nocat ) 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 end local messageErreur = table.concat( gestionErreur ) if messageErreur:len() > 0 and not yesno( args.nocat ) then messageErreur = messageErreur .. '[[Catégorie:Ébauche inconnue]]' end return p._bandeauAvertissement( parametres ) .. messageErreur .. categ end --- -- fonction qui contruit deux tableaux récapitulatif de l'ensemble des paramètres d'ébauche function p.tableParametresEbauches( frame ) local paramEbauche = mw.loadData('Module:Bandeau/Ébauche') 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 wikiTab:insert('</table>') -- troisième table pour les types wikiTab :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 wikiTab:insert('</table>') return table.concat( wikiTab ):gsub( ' <adjF?>', '' ) 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