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

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
trim() optimisé, trim du paramètre avant insertion dans le résultat lorsqu'il s'agit d'une palette complète passée en paramètre (refs 186827197 par exemple)
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
Ligne 9 : Ligne 9 :


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

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


local wikiTable = { '<div class="navbox-container" style="clear:both;">\n' }
local wikiTable = { '<div class="navbox-container" style="clear:both;">\n' }
Ligne 34 : Ligne 45 :
local function _paletteInconnue( i )
local function _paletteInconnue( i )
categories.paletteInconnue = categoriePaletteInconnue
categories.paletteInconnue = categoriePaletteInconnue
local nomPalette = trim( parentArgs[i] )
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 )
return _erreur( 'Erreur : il n’existe pas de modèle {{[[Modèle:Palette %s|Palette %s]]}} [[Aide:Palette de navigation|(aide)]]', nomPalette, nomPalette )
end
end
Ligne 56 : Ligne 67 :
end
end
end
end
return frame:expandTemplate{ title = 'Palette ' .. trim( parentArgs[i] ), args = argsPalette }
return frame:expandTemplate{ title = 'Palette ' .. parentArgs[i], args = argsPalette }
end
end


Ligne 78 : Ligne 89 :


while parentArgs[i] and i <= maxPalette do
while parentArgs[i] and i <= maxPalette do
if parentArgs[i]:match( '%S' ) then
if parentArgs[i] ~= '' then
for _, j in ipairs( palettesValides ) do
for _, j in ipairs( palettesValides ) do
if args[i] == args[j] and not args[i]:match('^palette ') then
if args[i] == args[j] and not args[i]:match('^palette ') then
Ligne 85 : Ligne 96 :
end
end
table.insert( palettesValides, i )
table.insert( palettesValides, i )
if parentArgs[i]:match( '^%s*<table class="navbox' ) or parentArgs[i]:match( '^%s*{| ?class="navbox' ) then
if parentArgs[i]:match( '^<table class="navbox' ) or parentArgs[i]:match( '^{| ?class="navbox' ) then
wikiTable:insert( trim( parentArgs[i] ) )
wikiTable:insert( parentArgs[i] )
else
else
local codePalette = args[i]
local codePalette = args[i]

Version du 5 octobre 2021 à 13:25

 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 p = { }

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 parentArgs = {}
	for k, v in pairs( frame:getParent().args ) do
		-- effectue un trim sur les paramètres non nommés,
		-- et exclut les paramètres dont la valeur est vide
		if type( k ) == number then
			v = trim( v )
		end
		if v ~= '' then
			parentArgs[ k ] = v
		end
	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( '^<table class="navbox' ) or parentArgs[i]:match( '^{| ?class="navbox' ) then
				wikiTable:insert( parentArgs[i] )
			else
				local codePalette = args[i]
				local testCodePalette = codePalette:lower()
				if testCodePalette:match( '^%[%[:modèle:' ) then                  -- La palette n'existe pas
					wikiTable:insert( _paletteInconnue( i ) )
					table.remove( palettesValides )
				elseif testCodePalette:match( '^palette avec paramètres' ) then  -- C'est une palette nécessitant des paramètres nommés
					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
					palettesVerticales = palettesVerticales .. ( _paletteAvecParametres( i ) )
				elseif testCodePalette: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