Aller au contenu

Module:Manipulation formatage

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.

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

Ce module est utilisé par les modèles {{Italique si non précisé}} et {{Retire italiques}}.

Voir aussi : Catégorie:Italique à vérifier dans un paramètre de modèle

-- luacheck: globals mw

local p = {}

function p.italiqueSiNonPrecise( value, debugMode )
	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
		result = value

		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
		result = '<i>' .. value .. '</i>'

		-- 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 = mw.text.trim( frame.args[ 1 ] )
	local debugMode = isDebug( frame )

	return p.italiqueSiNonPrecise( value, debugMode )
end

function p.modeleRetireItaliques( frame )
	local value = mw.text.trim( frame.args[ 1 ] )
	local debugMode = isDebug( frame )

	return p.retireItaliques( value, debugMode )
end

return p