Aller au contenu

Module:Protection/Bac à sable

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 31 décembre 2014 à 01:56 et modifiée en dernier par Hlm Z. (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

 Documentation[voir] [modifier] [historique] [purger]

Ce module implémente les modèles {{Protection}}, {{Semi-protection}}, {{Semi-protection longue}} et {{Nom protégé}}. Voir la documentation des modèles pour les instructions d'utilisation.

Fonctions exportables

  • protection(frame) – Fonction implémentant le modèle {{Protection}} – à appeler avec #invoke.
  • semiProtection(frame) – Fonction implémentant le modèle {{Semi-protection}} – à appeler avec #invoke.
  • semiProtectionLongue(frame) – Fonction implémentant le modèle {{Semi-protection longue}} – à appeler avec #invoke.
  • nomProtégé(frame) – Fonction implémentant le modèle {{Nom protégé}} – à appeler avec #invoke.
  • main(args, typeProtection, titrePage) – Fonction qui peut être appelée dans un autre module avec require(). Ceci est une bonne pratique d'appeler directement cette fonction dans un autre module car vous n'avez pas besoin d'avoir l'objet frame de disponible, ce qui améliore les performances et simplifie la gestion des arguments. Le paramètre typeProtection prend la valeur du nom des fonctions définies précédemment. Si aucune valeur n'est renseignée, le type sera initialisé à protection.
local p = {}

-- Chargement du module de données.
--local donnees = mw.loadData('Module:Protection/Données')

--Redéfinitions utiles
local format = mw.ustring.format
local insert = table.insert

local types = {
	protection = {
		image     = 'Crystal Clear action lock1.png',
		lien      = ':Catégorie:Page protégée',
		texte     = 'Cette page est protégée.',
		niveau    = 'sysop',
		categorie = {
			['']        = 'Article protégé',
			Projet      = 'Archive protégée',
			Utilisateur = 'Page utilisateur protégée',
			['Modèle']  = 'Modèle protégé',
			Module      = 'Module protégé',
			['défaut']  = 'Page protégée'
		}
	},
	semiProtection = {
		image     = 'Crystal Clear action half lock.png',
		lien      = ':Catégorie:Page semi-protégée',
		texte     = 'Cette page est semi-protégée.',
		niveau    = 'autoconfirmed',
		categorie = {
			['Modèle']  = 'Modèle semi-protégé',
			Module      = 'Module semi-protégé',
			['défaut']  = 'Page semi-protégée'
		}
	},
	semiProtectionLongue = {
		image  = 'Crystal Clear action half lock.png',
		lien   = ':Catégorie:Page en semi-protection longue',
		texte  = 'Cette page est en semi-protection longue.',
		niveau = 'autoconfirmed',
		categorie = {
			['Modèle']  = 'Modèle semi-protégé',
			Module      = 'Module semi-protégé',
			['défaut']  = 'Page en semi-protection longue'
		}
	},
	['nomProtégé'] = {
		id        = 'protection-renommage',
		image     = 'Crystal Clear action lock5.png',
		texte     = 'Le titre de cette page ne peut être modifié.',
		niveau    = 'sysop',
		categorie = {
			['défaut']  = 'Page au nom protégé'
		}
	}
}

local cfg = {}

cfg[''] = "Cette page est l'objet d'un [[Wikipédia:Guerre d'édition|important désaccord entre participants]] et [[Wikipédia:Protection|ne peut temporairement pas être modifiée]]."
cfg['Modèle'] = "Ce [[Wikipédia:Modèles à haut risque|modèle à risque]] est inclus %s pages et [[Wikipédia:Protection|ne peut pas être modifié]]."
cfg['Module'] = "Ce [[Aide:Module|module]] à risque est inclus %s pages et [[Wikipédia:Protection|ne peut pas être modifié]]."
cfg['Fichier'] = "Cette image [[Wikipédia:Protection|ne peut temporairement pas être modifiée]]."
cfg['Projet'] = "Cette page communautaire est une archive, conservée pour son intérêt historique : [[Wikipédia:Protection|elle ne peut plus être modifiée]]."
cfg['Aide'] = "Cette page d'aide [[Wikipédia:Protection|ne peut temporairement pas être modifiée]]."
cfg['Utilisateur'] = "Cette page utilisateur [[Wikipédia:Protection|ne peut temporairement plus être modifiée]] afin d'en interdire le [[Wikipédia:Vandalisme|vandalisme]]."
cfg['titreDéfaut'] = "Cette page [[Wikipédia:Protection|est protégée]]."
cfg['texteBandeau'] = "Cette protection ne constitue pas obligatoirement une approbation de la version actuelle. Vous pouvez proposer une modification en [[%s|page de discussion]] ou [%s auprès des administrateurs] (voir [%s journal des protections])."
cfg['lienAdmin'] = "Wikipédia:Demande d'intervention sur une page protégée"
cfg['optionAdmin'] = "action=edit&section=new&preload=Modèle:Préchargement_pour_requête_d'intervention_sur_une_page_protégée&preloadtitle=%%7B%%7Ba-court%%7C%s%%7D%%7D"
cfg['option2Admin'] = '&editintro=Modèle:Intro_DIPP%2Fbandeau_protection'
cfg['lienJournal'] = 'Spécial:Journal'
cfg['optionJournal'] = 'type=protect&page=%s'

function p.main(typeProtection, args)
	local modeProtection = types[typeProtection]
	local titrePage = mw.title.getCurrentTitle()
	local res = {}

	if typeProtection == 'protection' and args.nocat then
		return bandeauProtection(titrePage, args)
	end

	if true or protectionPage(modeProtection, titrePage) then
		-- Création de l'icône de titre selon le mode de protection.
		insert(res, creerIconeTitre(modeProtection))
		-- Création du bandeau de protection pour le mode 'protection'.
		if typeProtection == 'protection' then
			insert(res, bandeauProtection(titrePage, args))
		end
		-- Catégorisation selon le mode de protection.
		insert(res, insertionCategorie(modeProtection, titrePage.nsText))
	elseif not estSousPage(titrePage) then
		-- Catégorisation lorsque le niveau de protection en écriture ne
		-- correspond pas ou plus. Note : les sous-pages '/Documentation',
		-- '/Bac à sable' ou '/Test' appartenant aux modèles ou aux modules
		-- ne sont pas – et ne doivent pas être – concernées.
		insert(res, '[[Catégorie:Page dont la protection est à vérifier]]')
	end

	return table.concat(res)
end

function protectionPage(modeProtection, titrePage)
	-- Retourne vrai si la page courante est protégée et correspond
	-- au type de protection.
	local niveauProtection = titrePage.protectionLevels.edit[1]
	return modeProtection.niveau == niveauProtection
end

function estSousPage(titrePage)
	-- Teste si la page actuelle est une sous-page /Documentation,
	-- /Bac à sable ou /Test de modèle ou de module. Retourne vrai
	-- si c'est le cas et faux sinon.
	local espaceNom = titrePage.nsText == 'Modèle' or titrePage.nsText == 'Module'
	local sousPage = titrePage.isSubpage and 
		(titrePage.subpageText == 'Documentation'
		or titrePage.subpageText == 'Bac à sable'
		or titrePage.subpageText == 'Test')
 
	return espaceNom and sousPage
end

function creerIconeTitre(modeProtection)
	local iconeTitre = require('Module:Icône de titre')._main
	local argsIcone = {
		image  = modeProtection.image,
		lien   = modeProtection.lien,
		texte  = modeProtection.texte,
		taille = 15,
		id     = modeProtection.id or 'protection-edition'
	}

	return iconeTitre(argsIcone)
end

function insertionCategorie(typeProtection, nsPage)
	local nomCategorie = typeProtection.categorie[nsPage]
	local defautCategorie = typeProtection.categorie['défaut']
	local lienCategorie = '[[Catégorie:%s]]'

	return format(lienCategorie, nomCategorie or defautCategorie)
end

function bandeauProtection(titrePage, args)
	local nsPage = args.nsdoc or titrePage.nsText
	local titre = cfg[nsPage] or cfg['titreGénérique']
	local texte = mw.html.create('span')
	local lienAdmin, lienJournal

	-- Gestion du nombre d'inclusion pour les modéles/modules.
	if nsPage == 'Modèle' or nsPage == 'Module' then
		if args.nombre and tonumber(args.nombre) then
			titre = format(titre, 'dans plus de ' .. mw.language.new('fr')
				:formatNum(tonumber(args.nombre)))
		else
			titre = format(titre, 'sur un très grand nombre de')
		end
	end

	-- Gestion du paramètre 'texte' et de ses liens internes
	lienAdmin = mw.title.new(cfg['lienAdmin'])
		:fullUrl(format(cfg['optionAdmin'],
			mw.uri.encode(titrePage.fullText, 'WIKI')))
	if nsPage == '' then lienAdmin = lienAdmin .. cfg['option2Admin'] end
	lienJournal = mw.title.new(cfg['lienJournal'])
		:fullUrl(format(cfg['optionJournal'],
			mw.uri.encode(titrePage.fullText, 'WIKI')))

	texte
		:addClass('plainlinks')
		:wikitext(format(cfg['texteBandeau'], 
			tostring(titrePage.talkPageTitle), lienAdmin, lienJournal))

	return mw.getCurrentFrame():expandTemplate{
		title = "Méta bandeau d'avertissement",
		args  = {
			niveau    = 'information',
			['icône'] = types['protection'].image,
			titre     = args[1] or titre,
			texte     = tostring(texte)
		}
	}
end

function adaptateur(nomFonction)
	return function (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.main(nomFonction, args)
	end
end

-- Insertion dans la table p des fonctions appelées par les
-- modèles à l'aide d'un adaptateur de fonction.
local nomsFonction = {'protection', 'semiProtection', 'semiProtectionLongue', 'nomProtégé'} 
for _, nomFonction in ipairs(nomsFonction) do
	p[nomFonction] = adaptateur(nomFonction)
end

return p