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

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
table.concat() ineffectif, car n'opérant que sur les clés indexées, et dans cette branche du code on sait que args[1] est absent ; de toute façon ce table.concat() ne fait pas sens ici, c'était vraisemblablement un code de debug
m trim trailing spaces
Ligne 26 : Ligne 26 :
background = 'white'
background = 'white'
end
end

local html = mw.html.create( '' )
local html = mw.html.create( '' )
:wikitext( '\n' )
:wikitext( '\n' )
Ligne 44 : Ligne 44 :
:wikitext( args.message2 )
:wikitext( args.message2 )
:allDone()
:allDone()

return tostring( html )
return tostring( html )
end
end
Ligne 50 : Ligne 50 :
local function affichageInline( args, ajouterinfobulle )
local function affichageInline( args, ajouterinfobulle )
local html = mw.html.create( '' )
local html = mw.html.create( '' )

if args[ 1 ] and mw.text.trim( args[ 1 ] ) ~= '' then
if args[ 1 ] and mw.text.trim( args[ 1 ] ) ~= '' then
html:tag( 'span' )
html:tag( 'span' )
Ligne 115 : Ligne 115 :
args.titre2 = "Erreur dans l'appel du modèle Fix"
args.titre2 = "Erreur dans l'appel du modèle Fix"
end
end

return messageloc, infobulle_mise
return messageloc, infobulle_mise
end
end

Version du 20 octobre 2021 à 23:18

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

Module utilisé par le métamodèle {{Fix}}, et indirectement par le modèle {{Référence nécessaire}} et dérivés.

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 mw.text.trim( args[ 1 ] ) ~= '' 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
    	if args.message_lien and args.message_lien ~= '' then
    		if args.message_lien == 'non' then
				messageloc = '[' .. args.message .. ']'
				if not args.message:find( '%[%[' ) then
					args.titre2 = args.titre
				end
			else
				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 = '[[:' .. args.message_lien .. '|' .. '<span title="' .. args.titre2 ..'">&#91;' .. args.message .. '&#93;</span>' .. ']]'
					infobulle_mise = true
				else
					messageloc = '[[:' .. args.message_lien .. '|&#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
			end
		else
			if modeinfobulle == true then
				messageloc = '[[:' .. args.message .. '|' .. '<span title="' .. args.titre2 ..'">&#91;' .. args.message .. '&#93;</span>' .. ']]'
				infobulle_mise = true
			else
				messageloc = '[[:' .. args.message .. '|&#91;' .. args.message .. '&#93;]]'
				infobulle_mise = true -- Facultatif, idem plus haut
			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 mw.text.trim( args[ 1 ] ) ~= '' then
		args.message2, infobulle_mise = generateMessage( args, nommodele )
		if necessiteCadre( args[ 1 ] ) or args.bloc and args.bloc ~= '' then
			return affichageBloc( args )
		end
	else
		args.message2, infobulle_mise = generateMessage( args, nommodele, true )
	end

	return affichageInline( args, not infobulle_mise )
end

return p