Différences entre les versions de « Module:Documentation »
Aller à la navigation
Aller à la recherche
(Page créée avec « --Ce module implémente le modèle {{Documentation}}. local p = {} local function existePage(page) return page and page.exists end local function nomDocumentation(page... ») |
|||
(6 versions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 12 : | Ligne 12 : | ||
return page.subjectNsText .. ':' .. page.text .. '/Documentation' | return page.subjectNsText .. ':' .. page.text .. '/Documentation' | ||
end | end | ||
− | + | ||
--On est dans une sous-page | --On est dans une sous-page | ||
local sousPage = page.subpageText | local sousPage = page.subpageText | ||
Ligne 26 : | Ligne 26 : | ||
local function lienUrl(nomPage, titrePage, action, pagePreload) | local function lienUrl(nomPage, titrePage, action, pagePreload) | ||
local argument = {['action'] = action or 'edit'} | local argument = {['action'] = action or 'edit'} | ||
− | + | ||
if pagePreload then | if pagePreload then | ||
argument['preload'] = 'Modèle:Documentation/Preload' .. pagePreload | argument['preload'] = 'Modèle:Documentation/Preload' .. pagePreload | ||
Ligne 81 : | Ligne 81 : | ||
if niveauProtection and niveauProtection[1] then | if niveauProtection and niveauProtection[1] then | ||
local tableProtection = { | local tableProtection = { | ||
− | autoconfirmed = {'semiProtection', '{{%s*[Ss]emi%-protection%s* | + | autoconfirmed = {'semiProtection', '{{%s*[Ss]emi%-protection%s*[|}]', '{{%s*[Ss]emi%-protection +longue%s*[|}]'}, |
− | editextendedsemiprotected = {'semiProtectionEtendue', '{{%s*[Ss]emi%-protection étendue%s*[|}]'}, | + | editextendedsemiprotected = {'semiProtectionEtendue', '{{%s*[Ss]emi%-protection +étendue%s*[|}]'}, |
sysop = {'protection', '{{%s*[Pp]rotection%s*[|}]'}, | sysop = {'protection', '{{%s*[Pp]rotection%s*[|}]'}, | ||
} | } | ||
local protection = tableProtection[niveauProtection[1]] | local protection = tableProtection[niveauProtection[1]] | ||
+ | if not protection then | ||
+ | return '' | ||
+ | end | ||
+ | |||
+ | local alreadyShown = false | ||
if existeDoc then | if existeDoc then | ||
-- Vérification qu'il n'y a pas déjà un modèle de | -- Vérification qu'il n'y a pas déjà un modèle de | ||
-- protection dans la documentation du modèle. | -- protection dans la documentation du modèle. | ||
local contenuDoc = doc:getContent() | local contenuDoc = doc:getContent() | ||
− | if contenuDoc:match(protection[2]) then | + | if contenuDoc:match(protection[2]) or (protection[3] and contenuDoc:match(protection[3])) then |
− | + | alreadyShown = true | |
end | end | ||
end | end | ||
− | if | + | if not alreadyShown then |
if message == '' then | if message == '' then | ||
message = nil | message = nil | ||
Ligne 102 : | Ligne 107 : | ||
end | end | ||
end | end | ||
+ | end | ||
+ | |||
+ | -- pour les bacs à sable, on retire les balises de catégories | ||
+ | -- habituellement situées en "includeonly" à la fin de la documentation | ||
+ | local function retireBalisesCategories(contenuDoc) | ||
+ | local count | ||
+ | repeat | ||
+ | contenuDoc, count = mw.ustring.gsub(contenuDoc, '%[%[Catégorie:[^%]]+%]%][\t\r\n\f ]*$', '') | ||
+ | until count == 0 | ||
+ | |||
+ | contenuDoc, count = mw.ustring.gsub(contenuDoc, '[\t\r\n\f ]*$', '') | ||
+ | |||
+ | return contenuDoc | ||
end | end | ||
Ligne 110 : | Ligne 128 : | ||
if args.contenu then | if args.contenu then | ||
res:wikitext(args.contenu) | res:wikitext(args.contenu) | ||
+ | |||
elseif existeDoc then | elseif existeDoc then | ||
local frame = mw.getCurrentFrame() | local frame = mw.getCurrentFrame() | ||
if frame.args and frame.args['contenu sous-page'] then | if frame.args and frame.args['contenu sous-page'] then | ||
− | + | local contenuDoc = frame.args['contenu sous-page'] | |
+ | if page.subpageText == 'Bac à sable' or page.subpageText == 'Test' then | ||
+ | contenuDoc = retireBalisesCategories(contenuDoc) | ||
+ | end | ||
+ | res:wikitext(contenuDoc) | ||
else | else | ||
− | + | local contenuDoc = frame:expandTemplate{title = doc.prefixedText} | |
+ | if page.subpageText == 'Bac à sable' or page.subpageText == 'Test' then | ||
+ | contenuDoc = retireBalisesCategories(contenuDoc) | ||
+ | end | ||
+ | res:wikitext(contenuDoc) | ||
end | end | ||
+ | |||
elseif page.subpageText ~= 'Bac à sable' and page.subpageText ~= 'Test' then | elseif page.subpageText ~= 'Bac à sable' and page.subpageText ~= 'Test' then | ||
− | local texteBandeau = '<b>Ce %s ne possède aucune | + | local texteBandeau = '<b>Ce %s ne possède aucune documentation ' |
..'explicative en sous-page</b>, pas même une description succincte.<br> ' | ..'explicative en sous-page</b>, pas même une description succincte.<br> ' | ||
..'Vous pouvez %s afin de documenter ce %s adéquatement.' | ..'Vous pouvez %s afin de documenter ce %s adéquatement.' | ||
Ligne 127 : | Ligne 155 : | ||
'module' | 'module' | ||
) | ) | ||
+ | if page.baseText == 'Country data' or page.text:sub(1, 12) == 'Utilisateur:' then | ||
+ | -- pas de catégorisation pour : modèles de données, pseudo-namespace "Module:Utilisateur:Toto/Nom du module" | ||
+ | else | ||
+ | texteBandeau = texteBandeau .. '' | ||
+ | end | ||
else | else | ||
texteBandeau = texteBandeau:format( | texteBandeau = texteBandeau:format( | ||
Ligne 133 : | Ligne 166 : | ||
'modèle' | 'modèle' | ||
) | ) | ||
− | + | texteBandeau = texteBandeau .. '' | |
− | |||
− | texteBandeau = texteBandeau .. ' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
local param = { | local param = { | ||
− | |||
alt = 'domaine public', | alt = 'domaine public', | ||
style = 'width:80%;', | style = 'width:80%;', | ||
Ligne 156 : | Ligne 180 : | ||
:tag('div') | :tag('div') | ||
:css('clear', 'both') | :css('clear', 'both') | ||
− | + | ||
return res | return res | ||
end | end | ||
Ligne 177 : | Ligne 201 : | ||
else | else | ||
contenuParagraphe | contenuParagraphe | ||
− | :wikitext('La | + | :wikitext('La documentation ') |
:wikitext('de ce [[Aide:Modèle|modèle]] est directement ') | :wikitext('de ce [[Aide:Modèle|modèle]] est directement ') | ||
:wikitext('[[Aide:Inclusion|incluse]] dans le corps de ce dernier. ') | :wikitext('[[Aide:Inclusion|incluse]] dans le corps de ce dernier. ') | ||
Ligne 193 : | Ligne 217 : | ||
end | end | ||
contenuParagraphe | contenuParagraphe | ||
− | :wikitext('La | + | :wikitext('La documentation de ce ') |
:wikitext(lienAide) | :wikitext(lienAide) | ||
:wikitext(' est [[Aide:Inclusion|incluse]] depuis sa [[') | :wikitext(' est [[Aide:Inclusion|incluse]] depuis sa [[') | ||
Ligne 212 : | Ligne 236 : | ||
end | end | ||
end | end | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
return res | return res | ||
end | end | ||
Ligne 279 : | Ligne 245 : | ||
local existeDoc = existePage(doc) | local existeDoc = existePage(doc) | ||
local res = mw.html.create() | local res = mw.html.create() | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
--Génération de la documentation | --Génération de la documentation | ||
Ligne 301 : | Ligne 258 : | ||
:node(contenu(args, doc, existeDoc)) | :node(contenu(args, doc, existeDoc)) | ||
:node(notice(args, page, doc, existeDoc)) | :node(notice(args, page, doc, existeDoc)) | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
return tostring(res) | return tostring(res) | ||
Ligne 337 : | Ligne 283 : | ||
if mw.title.new(titreDoc).exists then | if mw.title.new(titreDoc).exists then | ||
return titreDoc | return titreDoc | ||
− | end | + | end |
end | end | ||
end | end | ||
return p | return p |
Version actuelle datée du 3 novembre 2019 à 01:14
Ce module implémente le modèle {{Documentation}}. Voir la page du modèle pour les instructions d'utilisation.
1 Fonctions exportables
documentation(frame)
– Fonction principale du module – à appeler avec#invoke
dans 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.
2 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, /Bac à sable, /Test.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é.
--Ce module implémente le modèle {{Documentation}}.
local p = {}
local function existePage(page)
return page and page.exists
end
local function nomDocumentation(page)
--On n'est pas dans une sous-page
if not page.isSubpage then
return page.subjectNsText .. ':' .. page.text .. '/Documentation'
end
--On est dans une sous-page
local sousPage = page.subpageText
if sousPage == 'Documentation'
or sousPage == 'Bac à sable'
or sousPage == 'Test' then
return page.subjectNsText .. ':' .. page.baseText .. '/Documentation'
else
return page.subjectNsText .. ':' .. page.text .. '/Documentation'
end
end
local function lienUrl(nomPage, titrePage, action, pagePreload)
local argument = {['action'] = action or 'edit'}
if pagePreload then
argument['preload'] = 'Modèle:Documentation/Preload' .. pagePreload
end
return mw.ustring.format('[%s %s]', nomPage:fullUrl(argument), titrePage)
end
local function entete(args, page, doc, existeDoc)
local res = mw.html.create('div')
res
:css('margin-bottom', '1ex')
:css('border-bottom', '1px solid #aaa')
:css('padding-bottom', '3px')
:wikitext('[[Fichier:Template-info.png|50px|alt=|link=]]')
:tag('span')
:css('font-weight', 'bold')
:css('font-size', '125%')
:css('vertical-align', 'middle')
:wikitext(' ')
:wikitext(args.titre or 'Documentation')
:done()
if not args.contenu then
local editionLien = res:tag('span')
:addClass('mw-editsection plainlinks')
:css('vertical-align', 'middle')
:wikitext('[')
if existeDoc then
editionLien:wikitext(lienUrl(doc, 'modifier'))
else
if args.module then
editionLien:wikitext(lienUrl(doc, 'créer', 'edit', 'Module'))
else
editionLien:wikitext(lienUrl(doc, 'créer', 'edit', ''))
end
end
editionLien
:wikitext('] [')
:wikitext(lienUrl(page, 'purger', 'purge'))
:wikitext(']')
end
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
-- pour les bacs à sable, on retire les balises de catégories
-- habituellement situées en "includeonly" à la fin de la documentation
local function retireBalisesCategories(contenuDoc)
local count
repeat
contenuDoc, count = mw.ustring.gsub(contenuDoc, '%[%[Catégorie:[^%]]+%]%][\t\r\n\f ]*$', '')
until count == 0
contenuDoc, count = mw.ustring.gsub(contenuDoc, '[\t\r\n\f ]*$', '')
return contenuDoc
end
local function contenu(args, doc, existeDoc)
local page = mw.title.getCurrentTitle()
local res = mw.html.create():newline()
if args.contenu then
res:wikitext(args.contenu)
elseif existeDoc then
local frame = mw.getCurrentFrame()
if frame.args and frame.args['contenu sous-page'] then
local contenuDoc = frame.args['contenu sous-page']
if page.subpageText == 'Bac à sable' or page.subpageText == 'Test' then
contenuDoc = retireBalisesCategories(contenuDoc)
end
res:wikitext(contenuDoc)
else
local contenuDoc = frame:expandTemplate{title = doc.prefixedText}
if page.subpageText == 'Bac à sable' or page.subpageText == 'Test' then
contenuDoc = retireBalisesCategories(contenuDoc)
end
res:wikitext(contenuDoc)
end
elseif page.subpageText ~= 'Bac à sable' and page.subpageText ~= 'Test' then
local texteBandeau = '<b>Ce %s ne possède aucune documentation '
..'explicative en sous-page</b>, pas même une description succincte.<br> '
..'Vous pouvez %s afin de documenter ce %s adéquatement.'
if args.module then
texteBandeau = texteBandeau:format(
'module',
lienUrl(doc, 'créer cette sous-page', 'edit', 'Module'),
'module'
)
if page.baseText == 'Country data' or page.text:sub(1, 12) == 'Utilisateur:' then
-- pas de catégorisation pour : modèles de données, pseudo-namespace "Module:Utilisateur:Toto/Nom du module"
else
texteBandeau = texteBandeau .. ''
end
else
texteBandeau = texteBandeau:format(
'modèle',
lienUrl(doc, 'créer cette sous-page', 'edit', ''),
'modèle'
)
texteBandeau = texteBandeau .. ''
end
local param = {
alt = 'domaine public',
style = 'width:80%;',
texte = texteBandeau,
}
res:wikitext(require('Module:Bandeau')._bandeau(param))
end
res
:newline()
:tag('div')
:css('clear', 'both')
return res
end
local function notice(args, page, doc, existeDoc)
local res = mw.html.create('div')
:css('border-top', '1px solid #aaa')
: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')
if args.contenu then
if args.notice then
contenuParagraphe:wikitext(args.notice .. '<br />')
else
contenuParagraphe
:wikitext('La documentation ')
:wikitext('de ce [[Aide:Modèle|modèle]] est directement ')
:wikitext('[[Aide:Inclusion|incluse]] dans le corps de ce dernier. ')
:wikitext(lienUrl(page, 'Cliquez ici pour purger le cache', 'purge'))
:wikitext('.<br /> 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', ''))
:wikitext('.<br /> ')
end
else
if existeDoc then
local lienAide = '[[Aide:Modèle|modèle]]'
if args.module then
lienAide = '[[Aide:Module|module]]'
end
contenuParagraphe
:wikitext('La documentation de ce ')
:wikitext(lienAide)
:wikitext(' est [[Aide:Inclusion|incluse]] depuis sa [[')
:wikitext(tostring(doc))
:wikitext('|sous-page de documentation]] ')
:tag('span')
:css('font-size', '89%')
:css('font-style', 'normal')
:wikitext('(')
:wikitext(lienUrl(doc, 'modifier'))
:wikitext(' | ')
:wikitext(lienUrl(doc, 'historique', 'history'))
:wikitext(').<br /> ')
:done()
:wikitext('Veuillez placer les catégories dans la sous-page ')
:wikitext(lienUrl(doc, '/Documentation'))
:wikitext('.<br /> ')
end
end
return res
end
function p._documentation(args)
local page = mw.title.getCurrentTitle()
local titreDoc = nomDocumentation(page)
local doc = mw.title.new(args[1] or titreDoc)
local existeDoc = existePage(doc)
local res = mw.html.create()
--Génération de la documentation
res
:tag('div')
:css('clear', 'both')
:css('margin', '1em 0 0 0')
:css('border', '1px solid #aaa')
:css('background', args.couleur or '#ecfcf4')
:css('padding', '1em 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
if val ~= '' then
args[cle] = mw.text.trim(val)
end
end
return p._documentation(args)
end
function p.nomDocumentation(frame)
if frame.args[1] and mw.text.trim(frame.args[1]) ~= '' then
return frame.args[1]
else
local titreDoc = nomDocumentation(mw.title.getCurrentTitle())
if mw.title.new(titreDoc).exists then
return titreDoc
end
end
end
return p