La documentation pour ce module peut être créée à Module:Manipulation formatage/doc

-- luacheck: globals mw

local p = {}

function p.italiqueSiNonPrecise( value, debugMode )
	-- on détermine si le paramètre est une liste en wikicode
	local firstChar = value:sub( 1, 1 )
	local isList = ( firstChar == '*' or firstChar == '#' )

	local result

	if
		( value:find( "''", nil, true )
			and ( value:find( "%f[']''%f[^']" )     -- wikicode italique
				or value:find( "%f[']'''''%f[^']" ) -- wikicode italique + gras
			)
		)
		or ( value:find( '<', nil, true )
			and ( value:find( '<[iI][> %t]' )       -- balise <i>
				or value:find( '<[eE][mM][> %t]' )  -- balise <em>
			)
		)
	then
		-- si le paramètre est une liste, on rétablit un "\n" pour un affichage correct du premier élément
		-- autrement, on repose sur le "\n" ajouté automatiquement / inopinément en raison de [[phab:T14974]]
		if isList then
			result = '\n' .. value
		else
			result = value
		end

		if
			-- détection de « Titre ''(film, 2020)'' » qui serait à remplacer par « ''Titre'' (film, 2020) »
			value:find( "%f[']'' ?%b() ?''%f[^']" )
			-- détection de « Foo'' et ''Bar », en faisant attention à ne pas matcher « ''Foo'' et ''Bar'' »
			or value:find( "%f[']'' et ''%f[^']" ) and not value:gsub( "%f[']'' et ''%f[^']", "" ):find( "''", nil, true )
			-- détection de « Foo ''et'' Bar »
			or value:find( " ''et'' ", nil, true )
		then
			result = result .. '[[Catégorie:Italique à vérifier dans un paramètre de modèle]]'
		end

		-- détection de wikicodes de mise en italique non équilibrés (i.e. en nombre impair)
		local nbWikicodesItalique = select( 2, result:gsub( "%f[']''%f[^']", "" ) )
		local nbWikicodesItaliquePlusGras = select( 2, result:gsub( "%f[']'''''%f[^']", "" ) )

		if ( nbWikicodesItalique + nbWikicodesItaliquePlusGras ) % 2 ~= 0 then
			result = result .. '[[Catégorie:Italique à vérifier dans un paramètre de modèle]]'
		end
	else
		-- si le paramètre est une liste, on rétablit un "\n" pour un affichage correct du premier élément
		-- noter que la liste entière est encadrée par un <i>...</i>,
		-- et c'est MediaWiki qui se charge de corriger en mettant chaque élément de liste dans un <i>
		if isList then
			result = '<i>' .. '\n' .. value .. '</i>'
		else
			result = '<i>' .. value .. '</i>'
		end

		-- détection de « Foo]], [[Bar » ainsi que « Foo]] et [[Bar » (italiques *probablement* manquants)
		if value:find( "]], [[", nil, true ) or value:find( "]] et [[", nil, true ) then
			result = result .. '[[Catégorie:Italique à vérifier dans un paramètre de modèle]]'
		end
	end

	if debugMode then
		return mw.text.nowiki( result )
	else
		return result
	end
end

function p.retireItaliques( value, debugMode )

	-- les closing tags ne sont pas censés contenir d'attributs,
	-- mais le parseur MediaWiki est tolérant et les laisse passer

	-- rappel : attention, gsub() retourne deux valeurs

	local result = value
		:gsub( "%f[']''%f[^']"          , '' )    -- wikicode italique
		:gsub( "%f[']'''''%f[^']"       , "'''" ) -- wikicode italique + gras (on remplace par gras : ''')
		:gsub( '</?[iI][ %t]*>'         , '' )    -- balises <i> et </i>
		:gsub( '</?[iI][ %t]+[^>]+>'    , '' )    -- balises <i attributs> et </i attributs>
		:gsub( '</?[eE][mM][ %t]*>'     , '' )    -- balises <em> et </em>
		:gsub( '</?[eE][mM][ %t]+[^>]+>', '' )    -- balises <em attributs> et </em attributs>

	if debugMode then
		return mw.text.nowiki( result )
	else
		return result
	end
end

local function isDebug( frame )
	local debugMode = false

	if frame.args.debug and frame.args.debug ~= '' then
		debugMode = ( require 'Module:Yesno' )( frame.args.debug )
	end

	return debugMode
end

function p.modeleItaliqueSiNonPrecise( frame )
	local value = frame.args.value
	local debugMode = isDebug( frame )

	return p.italiqueSiNonPrecise( value, debugMode )
end

function p.modeleRetireItaliques( frame )
	local value = frame.args.value
	local debugMode = isDebug( frame )

	return p.retireItaliques( value, debugMode )
end

return p