Module:Documentation
Aller à la navigation
Aller à la recherche
Ce module implémente le modèle {{Documentation}}. Voir la page du modèle pour les instructions d'utilisation.
Fonctions exportables
documentation(frame)– Fonction principale du module – à appeler avec#invokedans un modèle – renvoyant le code HTML de la documentation._documentation(args)– Fonction subsidiaire du module – à appeler avecrequire()dans un autre module – et renvoyant le code HTML de la documentation.
Autres fonctions
nomDocumentation(page)– Renvoie le nom de la documentation si on n'est pas dans une sous-page ou encore si les sous-pages sont de la forme /Documentation.existePage(page)– Teste si une page existe.lienUrl(nomPage, titrePage, action, pagePreload)– Retourne le lien URL wikifié de la forme [nomPage titrePage] voulu.entete(args, page, doc, existeDoc)– Construit l'entête de la documentation contenant l'image de documentation, le titre, et les liens de création/modification/purge.contenu(args, titreDoc, existeDoc)– Retourne la concaténation de la documentation en dur, sans cadre vert. C'est cette méthode qui génère la sous-page /Documentation rédigée par l'utilisateur.notice(args, page, doc, existeDoc)– Retourne la notice de la documentation situé en bas de page. Elle peut-être modifiée par l'utilisateur grâce au paramètre «|notice=» dans un modèle seulement si le paramètre «|contenu=» est renseigné.
La documentation de ce module est générée par le modèle {{Documentation module}}.
Elle est incluse depuis sa sous-page de documentation. Veuillez placer les catégories sur cette page-là.
-- Ce module implémente le modèle {{Méta documentation de modèle}}.
local p = {}
local function existePage(page)
return page and page.exists
end
local function textPagebase(page)
--On n'est pas dans une sous-page
if not page.isSubpage then
return page.text
end
--On est dans une sous-page
local sousPage = page.subpageText
if sousPage == 'Documentation' then
return page.baseText
else
return page.text
end
end
local function nomSouspage(page, souspage)
return page.subjectNsText .. ':' .. textPagebase(page) .. '/' .. souspage
end
local function lienUrl(nomPage, texteLien, action, pagePreload)
local arguments = {}
if action then
arguments['action'] = action
end
if pagePreload then
arguments['preload'] = 'Modèle:Documentation/' .. pagePreload
end
if arguments['action'] or arguments['preload'] then
return mw.ustring.format('[%s %s]', nomPage:fullUrl(arguments), texteLien)
else
return mw.ustring.format('[[%s|%s]]', nomPage.fullText, texteLien)
end
end
local function entete(args, page, doc, existeDoc)
local res = mw.html.create('div')
-- Titre
res
:css('margin-bottom', '1em')
:css('border-bottom', '1px solid var(--border-color-base, #a2a9b1)')
:css('padding-bottom', '3px')
:tag('span')
:addClass('documentation-icone')
:css('font-weight', 'bold')
:css('font-size', '125%')
:css('vertical-align', 'middle')
:wikitext(' ')
:wikitext(args.titre or 'Documentation')
:done()
-- Liens
local editionLien = res:tag('span')
:addClass('mw-editsection-like plainlinks')
:css('vertical-align', 'middle')
if args['aucun contenu additionnel'] == nil then
if not args.contenu then
if existeDoc then
editionLien
:wikitext(lienUrl(doc, 'voir'))
:wikitext(lienUrl(doc, 'modifier', 'edit'))
:wikitext(lienUrl(doc, 'historique', 'history'))
else
local pagePreload = 'Preload'
if page.namespace == 828 then
pagePreload = 'PreloadModule'
end
editionLien
:wikitext(lienUrl(doc, 'créer', 'edit', pagePreload))
end
end
end
editionLien
:wikitext(lienUrl(page, 'purger', 'purge'))
return res
end
local function protection(page, doc, existeDoc, message)
-- Insertion automatique du modèle de protection.
local niveauProtection = page.protectionLevels.edit
if niveauProtection and niveauProtection[1] then
local tableProtection = {
autoconfirmed = {'semiProtection', '{{%s*[Ss]emi%-protection%s*[|}]', '{{%s*[Ss]emi%-protection +longue%s*[|}]'},
editextendedsemiprotected = {'semiProtectionEtendue', '{{%s*[Ss]emi%-protection +étendue%s*[|}]'},
sysop = {'protection', '{{%s*[Pp]rotection%s*[|}]'},
}
local protection = tableProtection[niveauProtection[1]]
if not protection then
return ''
end
local alreadyShown = false
if existeDoc then
-- Vérification qu'il n'y a pas déjà un modèle de
-- protection dans la documentation du modèle.
local contenuDoc = doc:getContent()
if contenuDoc:match(protection[2]) or (protection[3] and contenuDoc:match(protection[3])) then
alreadyShown = true
end
end
if not alreadyShown then
if message == '' then
message = nil
end
return require('Module:Protection').main({message}, protection[1], page)
end
end
end
local function contenu(args, doc, existeDoc)
local page = mw.title.getCurrentTitle()
local res = mw.html.create():newline()
-- Contenu auto haut
if args['contenu auto haut'] then
res:wikitext(args['contenu auto haut'])
:newline()
end
-- Contenu, sous-page de doc, ou fallback Wikipédia
if args['aucun contenu additionnel'] == nil then
if args.contenu then
res:newline()
:wikitext(args.contenu)
:newline()
elseif existeDoc then
local contenuDoc = mw.getCurrentFrame():expandTemplate{title = doc.prefixedText}
res:newline()
:wikitext(contenuDoc)
:newline()
else
-- DÉBUT DE L'AJOUT : Fallback vers Wikipédia (fr)
-- doc.prefixedText contient déjà le bon espace de nom (Modèle: ou Module:) et le nom de la sous-page
local wpUrl = 'https://fr.wikipedia.org/wiki/' .. mw.uri.encode(doc.prefixedText, 'WIKI')
local fallbackDiv = mw.html.create('div')
:css('background-color', '#f8f9fa')
:css('border', '1px solid var(--border-color-base, #a2a9b1)')
:css('padding', '10px')
:css('margin-top', '1em')
:css('color', '#202122') -- Force une couleur lisible si le wiki a un fond sombre sans variables CSS définies
:wikitext("Voir ")
:wikitext(mw.ustring.format('[%s la documentation correspondante sur Wikipédia (fr)].', wpUrl))
res:newline()
:node(fallbackDiv)
:newline()
-- FIN DE L'AJOUT
end
end
-- Contenu auto bas
if args['contenu auto bas'] then
res:newline()
:wikitext(args['contenu auto bas'])
end
res
:tag('div')
:css('clear', 'both')
return res
end
local function lienRechercheModule(nomModule, texteLien)
local nomModuleEncoded = mw.text.encode(nomModule)
local nomModuleNoSpaces = mw.ustring.gsub(nomModuleEncoded, ' ', '+')
local quote = mw.text.encode('"')
local url = 'https://fr.wikipedia.org/w/index.php?title=Spécial:Recherche&ns828=1&search=insource:' .. quote .. nomModuleNoSpaces .. quote
return mw.ustring.format('[%s %s]', url, texteLien)
end
local function notice(args, page, doc, existeDoc)
local res = mw.html.create('div')
:css('border-top', '1px solid var(--border-color-base, #a2a9b1)')
:css('margin', '1.5em 0 0')
local contenuParagraphe = res
:tag('p')
:addClass('plainlinks')
:css('margin-bottom', '0')
:css('padding-left', '1em')
:css('font-style', 'italic')
-- Phrase "la documentation est générée par ..."
if args['nom modèle'] then
local lienAide = '[[Aide:Modèle|modèle]]'
if page.namespace == 828 then
lienAide = '[[Aide:Module|module]]'
end
contenuParagraphe
:wikitext('La [[Aide:Documentation de modèle|documentation]] de ce ')
:wikitext(lienAide)
:wikitext(' est générée par le modèle ')
:wikitext(mw.getCurrentFrame():expandTemplate{title = 'm', args = {args['nom modèle']} })
:wikitext('.<br>')
else
contenuParagraphe
:tag('span')
:addClass('error')
:wikitext('Erreur : le paramètre <code>nom modèle</code> n\'est pas renseigné.<br>')
end
-- Phrase indiquant la provenance du contenu (dans le corps ou en sous-page)
if args['aucun contenu additionnel'] == nil then
if args.contenu then
contenuParagraphe
:wikitext('Elle est directement [[Aide:Inclusion|incluse]] dans l\'appel de ce dernier. ')
:wikitext('Si cette page est protégée, veuillez ')
:wikitext('transférer le contenu de la documentation vers sa ')
:wikitext(lienUrl(doc, 'sous-page dédiée', 'edit', 'Preload'))
:wikitext('.<br>')
elseif existeDoc then
contenuParagraphe
:wikitext('Elle est [[Aide:Inclusion|incluse]] depuis ')
if args['page doc'] then
contenuParagraphe
:wikitext('la page [[')
:wikitext(tostring(doc))
:wikitext(']]. ')
else
contenuParagraphe
:wikitext('sa [[')
:wikitext(tostring(doc))
:wikitext('|sous-page de documentation]]. ')
end
contenuParagraphe
:wikitext('Veuillez placer les catégories sur cette page-là.<br>')
end
end
return res
end
function p._documentation(args)
local page = mw.title.getCurrentTitle()
local titrePageDoc = args['page doc'] or nomSouspage(page, 'Documentation')
local doc = mw.title.new(titrePageDoc)
local existeDoc = existePage(doc)
local res = mw.html.create()
--Génération de la documentation
local classeNamespace = 'documentation-modele'
if page.namespace == 828 then
classeNamespace = 'documentation-module'
end
res
:tag('div')
:addClass('documentation')
:addClass(classeNamespace)
:css('clear', 'both')
:css('margin', '1em 0 0 0')
:css('border', '1px solid var(--border-color-base, #a2a9b1)')
:css('padding', '0.5em 1em 0.8em')
:node(entete(args, page, doc, existeDoc))
:wikitext(protection(page, doc, existeDoc, args['message protection']))
:node(contenu(args, doc, existeDoc))
:node(notice(args, page, doc, existeDoc))
return tostring(res)
end
function p.documentation(frame)
local args = {}
local argsParent = frame:getParent().args
--Paramètres vides interprétés par Lua
for cle, val in pairs(argsParent) do
val = mw.text.trim(val)
if val ~= '' then
args[cle] = val
end
end
return p._documentation(args)
end
return p