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

local p = {}

local function necessiteCadre( contenu )
	if contenu:match( '\n[ \t]*\n' ) -- ligne vide (donc plusieurs paragraphes)
	or contenu:match( '\n[*#:]' )    -- liste à puces, liste numérotée, indentation
	then
		return true
	else
		return false
	end
end

-- utilisé par {{Citation}} et {{Citation étrangère}}
function p.necessiteCadre( frame )
	local contenu = frame.args[ 1 ]
	if necessiteCadre( contenu ) then
		return '1'
	else
		return ''
	end
end

local function affichageBloc( args )
	local background = args.background or ''
	if background == '' then
		background = 'white'
	end

	local html = mw.html.create( '' )
		:wikitext( '\n' )
		:tag( 'div' )
			:cssText( 'position:relative; margin-top:0.8em;' )
			:tag( 'div' )
				:addClass( 'need_ref' )
				:cssText( 'cursor:help; overflow:hidden; padding-bottom:0;' )
				:css{ background = background }
				:attr{ title = args.titre }
				:wikitext( args[ 1 ], '\n' )
				:done()
			:tag( 'div' )
				:addClass( 'need_ref_tag' )
				:cssText( 'position:absolute; top:-0.6em; left:1em; padding:0 0.5em; font-size:80%; line-height:1em;' )
				:css{ background = background }
				:wikitext( args.message2 )
		:allDone()

	return tostring( html )
end

local function affichageInline( args, ajouterinfobulle )
	local html = mw.html.create( '' )

	if args[ 1 ] and args[ 1 ]:match( '%S' ) then
		html:tag( 'span' )
				:addClass( 'need_ref' )
				:cssText( 'cursor:help;' )
				:attr{ title = args.titre }
				:wikitext( mw.text.trim( args[ 1 ] ) )
				:done()
		ajouterinfobulle = false -- Facultatif, on pourrait accepter l'infobulle sur l'exposant quel que soit le cas.
	end
	if ajouterinfobulle then
		html:tag( 'sup' )
			:addClass( 'need_ref_tag' )
			:cssText ( 'padding-left:2px;' )
			:attr{ title = args.titre2 }
			:wikitext( args.message2 )
		:allDone()
	else
		html:tag( 'sup' )
			:addClass( 'need_ref_tag' )
			:cssText ( 'padding-left:2px;' )
			:wikitext( args.message2 )
		:allDone()
	end

	return tostring( html )
end

local function generateMessage( args, nommodele, modeinfobulle ) -- Le dernier paramètre sert de booléen pour forcer une infobulle dans le lien interne.
	local modeinfobulle = modeinfobulle or false
	local messageloc = ''
	local infobulle_mise = false
	if args.message and args.message ~= '' then
		local cible
    	if args.message_lien and args.message_lien ~= '' then
    		if args.message_lien == 'non' then
				cible = false
			else
				cible = args.message_lien
			end
		else
			cible = args.message
		end

		if cible then
			if cible:sub( 1, 1 ) == ':' then
				cible = cible:sub( 2 )
			end
			if modeinfobulle == true then -- On force l'infobulle à l'intérieur. Il y aurait peut-être plus smple, avec un seul message et l'ajout d'une classe désactivant les infobulles sur les liens internes
				messageloc = '[[:' .. cible .. '|' .. '<span title="' .. args.titre2 ..'">&#91;' .. args.message .. '&#93;</span>' .. ']]'
				infobulle_mise = true
			else
				messageloc = '[[:' .. cible .. '|&#91;' .. args.message .. '&#93;]]'
				infobulle_mise = true -- Facultatif mais on peut bien considérer inutile d'ajouter une autre infobulle autour de ce contenu. Cela est encore plus vrai si lien interne créé à la ligne précédente est sur l'intégralité du message.
			end
		else
			messageloc = '&#91;' .. args.message .. '&#93;'
			if not args.message:find( '%[%[' ) then
				args.titre2 = args.titre
			end
		end

		-- trois lignes qui suivent : test temporaire à activer lors de la transition d'affichage pour les appels qui introduisent déjà un lien via le paramètre message
		if ( args.message:find( '%[' ) or args.message:find( '%]' ) ) and ( args.message_lien or '' ) ~= 'non' then
			messageloc = args.message
		end
	else
		messageloc = '<span class="error">argument « message » manquant dans le modèle ' .. nommodele .. '.</span>'
		args.titre2 = "Erreur dans l'appel du modèle Fix"
	end

	return messageloc, infobulle_mise
end

function p.affichageFix( frame )
	local args = frame.getParent and frame:getParent().args or frame
	local nommodele = frame.getParent and frame:getParent():getTitle() or frame:getTitle()
	local messageDate = ''
	local messageAide = ' ; v'
	local ponctuation = '.'
	if args.date and args.date ~= '' then
		messageDate = ' (demandé le ' .. args.date .. ')'
	else
		local infobulle_texte = mw.text.trim( ( args.infobulle or '' ):gsub( '%b<>', '' ) )
		if infobulle_texte ~= '' then
			if infobulle_texte:match( '[!?…]$' ) then
				messageAide = ' V'
				ponctuation = ''
			end
		else
			messageAide = 'V'
			ponctuation = ''
		end
	end
	messageAide = messageAide .. 'oir l\'aide.'
	args.titre = mw.text.trim( ( args.infobulle or '' ):gsub( '[,.;:]$', '' ) ) .. messageDate .. ponctuation
	args.titre2 = mw.text.trim( ( args.infobulle or '' ):gsub( '[,.;:]$', '' ) ) .. messageDate .. messageAide

	if args[ 1 ] and args[ 1 ]:match( '%S' ) then
		args.message2, infobulle_mise = generateMessage( args, nommodele )
		if necessiteCadre( args[ 1 ] ) or args.bloc and args.bloc ~= '' then -- attention, on ne trimme pas args[ 1 ]
			return affichageBloc( args )
		end
	else
		args.message2, infobulle_mise = generateMessage( args, nommodele, true )
	end

	return affichageInline( args, not infobulle_mise )
end

return p