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

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
quitte à devoir trimmer ces paramètres parents un peu partout, mieux vaut le faire une bonne fois en amont (si c'est seulement un nom de palette le trim n'est pas coûteux, et si c'est une palette complète de toute façon il faut le faire) ; ça évite tout un tas de soucis avec les valeurs entourées d'espaces, ainsi que les valeurs constituées seulement d'espaces
renommage de la variable, pour mieux montrer qu'il s'agit de mw.text.trim(), notamment pour empêcher tout risque de confusion avec Outils.trim()
 
(14 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
local p = { }
local mwTrim = mw.text.trim

local p = {}


function p.listePalette( frame )
function p.listePalette( frame )

-- http://lua-users.org/wiki/StringTrim
local function trim( s )
return s:match( '^()%s*$' ) and '' or s:match( '^%s*(.*%S)' )
end

local args = frame.args
local args = frame.args


local parentArgs = {}
local parentArgs = {}
for k, v in pairs( frame:getParent().args ) do
for k, v in pairs( frame:getParent().args ) do
-- effectue un trim sur les paramètres non nommés,
-- effectue un trim sur les paramètres non nommés
if type( k ) == 'number' then
-- et exclut les paramètres dont la valeur est vide
if type( k ) == number then
v = mwTrim( v )
v = trim( v )
end
if v ~= '' then
parentArgs[ k ] = v
end
end
parentArgs[ k ] = v
end
end


Ligne 31 : Ligne 24 :
local categoriePaletteEnDouble = '[[Catégorie:Modèle Palette - Palette affichée en double]]'
local categoriePaletteEnDouble = '[[Catégorie:Modèle Palette - Palette affichée en double]]'


local categories = { }
local categories = {}


local function _erreur( texte, param, ... )
local function _erreur( texte, param, ... )
Ligne 55 : Ligne 48 :


local function _paletteAvecParametres( i )
local function _paletteAvecParametres( i )
local argsPalette = { }
local argsPalette = {}
for n, v in pairs( parentArgs ) do
for n, v in pairs( parentArgs ) do
if not tonumber(n) then
if not tonumber(n) then
Ligne 96 : Ligne 89 :
end
end
table.insert( palettesValides, i )
table.insert( palettesValides, i )
if parentArgs[i]:match( '^<table class="navbox' ) or parentArgs[i]:match( '^{| ?class="navbox' ) then
if parentArgs[i]:match( '^<' ) then
wikiTable:insert( parentArgs[i] )
elseif parentArgs[i]:match( '^{|' ) then
wikiTable:insert( '\n' )
wikiTable:insert( parentArgs[i] )
wikiTable:insert( parentArgs[i] )
else
else
local codePalette = args[i]
local codePalette = args[i]
if codePalette:match( '^%[%[:Modèle:' ) then -- La palette n'existe pas
local testCodePalette = codePalette:lower()
if testCodePalette:match( '^%[%[:modèle:' ) then -- La palette n'existe pas
wikiTable:insert( _paletteInconnue( i ) )
wikiTable:insert( _paletteInconnue( i ) )
table.remove( palettesValides )
table.remove( palettesValides )
elseif testCodePalette:match( '^palette avec paramètres' ) then -- C'est une palette nécessitant des paramètres nommés
elseif codePalette:match( '^palette avec paramètres' ) then -- C'est une palette nécessitant des paramètres nommés
wikiTable:insert( _paletteAvecParametres( i ) )
wikiTable:insert( _paletteAvecParametres( i ) )
elseif testCodePalette:match( '^palette verticale avec paramètres' ) then -- C'est une palette verticale nécessitant des paramètres nommés
elseif codePalette:match( '^palette verticale avec paramètres' ) then -- C'est une palette verticale nécessitant des paramètres nommés
palettesVerticales = palettesVerticales .. ( _paletteAvecParametres( i ) )
palettesVerticales = palettesVerticales .. ( _paletteAvecParametres( i ) )
elseif testCodePalette:match( '^palette verticale' ) then -- C'est une palette verticale
elseif codePalette:match( '^palette verticale' ) then -- C'est une palette verticale
palettesVerticales = palettesVerticales .. codePalette:sub( 18 )
palettesVerticales = palettesVerticales .. codePalette:sub( 18 )
else
else

Dernière version du 7 novembre 2023 à 07:52

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

Utilisation

Fonctions exportables :

Modules externes et autres éléments dont ce module a besoin pour fonctionner : aucun

Exemples

Pour des exemples, voir la page de test permettant de tester diverses modifications apportées.

local mwTrim = mw.text.trim

local p = {}

function p.listePalette( frame )
	local args = frame.args

	local parentArgs = {}
	for k, v in pairs( frame:getParent().args ) do
		-- effectue un trim sur les paramètres non nommés
		if type( k ) == 'number' then
			v = mwTrim( v )
		end
		parentArgs[ k ] = v
	end

	local wikiTable = { '<div class="navbox-container" style="clear:both;">\n' }
	setmetatable( wikiTable, { __index = table } )   -- permet d'utiliser les fonctions de table comme des méthodes
	local palettesVerticales = ''

	local maxPalette = tonumber( args.maxPalette ) or 4
	local categoriePaletteInconnue = '[[Catégorie:Modèle Palette - Palette inconnue]]'
	local categorieTropDePalette = '[[Catégorie:Modèle Palette - Page contenant trop de palettes]]'
	local categoriePaletteEnDouble = '[[Catégorie:Modèle Palette - Palette affichée en double]]'

	local categories = {}

	local function _erreur( texte, param, ... )
		if param then texte = texte:format( param, ... )
		end
		local sep = #wikiTable > 1 and '<hr>' or ''
		return sep .. '<p><strong class="error" style="padding-left:.5em;">' .. texte .. '</strong></p>\n'
	end
	local function _pasDePalette()
		return _erreur( 'Erreur dans l’utilisation du [[Modèle:Palette]] : paramètre obligatoire absent.' )
	end

	local function _paletteInconnue( i )
		categories.paletteInconnue = categoriePaletteInconnue
		local nomPalette = parentArgs[i]
		return _erreur( 'Erreur : il n’existe pas de modèle {{[[Modèle:Palette %s|Palette %s]]}} [[Aide:Palette de navigation|(aide)]]', nomPalette, nomPalette )
	end

	local function _paletteEnDouble ( i )
		categories.paletteEnDouble = categoriePaletteEnDouble
		return "" -- inutile d'afficher une erreur visible pour ce cas puisque la mise en page n'est pas cassée
	end

	local function _paletteAvecParametres( i )
		local argsPalette = {}
		for n, v in pairs( parentArgs ) do
			if not tonumber(n) then
				if n:match( ' ' .. i .. '$' ) then
					argsPalette[ n:sub(1, n:len() - 1 - tostring(i):len() ) ] = v
				elseif n == 'nocat' .. i then
					argsPalette.nocat = v
				elseif not argsPalette[n] and n ~= 'stylecorps' then
					argsPalette[n] = v
				end
			end
		end
		return frame:expandTemplate{ title = 'Palette ' .. parentArgs[i], args = argsPalette }
	end

	local function _tropDePalettes()
		categories.tropDePalette = categorieTropDePalette
		return _erreur( 'Erreur dans le [[Modèle:Palette]] : trop de palettes (maximum : %s)', maxPalette )
	end


	local boite = parentArgs['titre boîte déroulante'] or parentArgs['titre boite déroulante']
	if boite then
		wikiTable[1] = '<div class="NavFrame navbox-container" style="clear:both;" >\n'
			.. '<div class="NavHead" style="text-align:center; height:1.6em; background-color:'
			.. ( parentArgs.couleurFondT or '#CCF' )
			.. '; color:' .. ( parentArgs.couleurTexteT or 'black' ) .. ';">'
			.. boite
			.. '</div>\n<div class="NavContent" style="margin-top:2px;">\n'
	end
	local i = 1
	local palettesValides = {}

	while parentArgs[i] and i <= maxPalette do
		if parentArgs[i] ~= '' then
			for _, j in ipairs( palettesValides ) do
				if args[i] == args[j] and not args[i]:match('^palette ') then
					wikiTable:insert ( _paletteEnDouble(i))
				end
			end
			table.insert( palettesValides, i )
			if parentArgs[i]:match( '^<' ) then
				wikiTable:insert( parentArgs[i] )
			elseif parentArgs[i]:match( '^{|' ) then
				wikiTable:insert( '\n' )
				wikiTable:insert( parentArgs[i] )
			else
				local codePalette = args[i]
				if codePalette:match( '^%[%[:Modèle:' ) then                  -- La palette n'existe pas
					wikiTable:insert( _paletteInconnue( i ) )
					table.remove( palettesValides )
				elseif codePalette:match( '^palette avec paramètres' ) then  -- C'est une palette nécessitant des paramètres nommés
					wikiTable:insert( _paletteAvecParametres( i ) )
				elseif codePalette:match( '^palette verticale avec paramètres' ) then  -- C'est une palette verticale nécessitant des paramètres nommés
					palettesVerticales = palettesVerticales .. ( _paletteAvecParametres( i ) )
				elseif codePalette:match( '^palette verticale' ) then        -- C'est une palette verticale
					palettesVerticales = palettesVerticales .. codePalette:sub( 18 )
				else
					wikiTable:insert( (codePalette:gsub( '^<div class="navbox%-container"', '<div' ) ) )
				end
			end
		end
		i = i + 1
	end

	if i == 1 then
		wikiTable:insert( _pasDePalette() )
	elseif i > maxPalette and parentArgs[i] and parentArgs[i] ~= '' then
		wikiTable:insert( _tropDePalettes() )
	end
	if #wikiTable == 1 then
		wikiTable[1] = palettesVerticales
	else
		if boite then
			wikiTable:insert( '</div>' )
		end
		wikiTable:insert( '</div>' .. palettesVerticales )
	end
	if mw.title.getCurrentTitle().namespace == 0 then
		for i, v in pairs( categories ) do
			wikiTable:insert( v )
		end
	end

	return wikiTable:concat()
end

return p