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

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
passage en déclaration locale des fonctions affichageBloc, affichageInline et generateMessage, qui ne sont pas utilisées en dehors de ce module
si des éléments se trouvaient à côté du cadre, par exemple une image, il n'était plus possible de cliquer sur ceux-ci, les liens ne fonctionnaient plus (exemple) ; après de nombreux essais, voici la seule solution que j'ai trouvée
 
(8 versions intermédiaires par le même utilisateur non affichées)
Ligne 26 : Ligne 26 :
background = 'white'
background = 'white'
end
end

local html = mw.html.create( '' )
local html = mw.html.create( '' )
:wikitext( '\n' )
:wikitext( '\n' )
:tag( 'div' )
:tag( 'div' )
:cssText( 'position:relative; margin-top:0.8em;')
:cssText( 'position:relative; display:table; margin-top:0.8em;' )
:tag( 'div' )
:tag( 'div' )
:addClass( 'need_ref' )
:addClass( 'need_ref' )
Ligne 36 : Ligne 36 :
:css{ background = background }
:css{ background = background }
:attr{ title = args.titre }
:attr{ title = args.titre }
:wikitext( args[1], '\n' )
:wikitext( args[ 1 ], '\n' )
:done()
:done()
:tag( 'div' )
:tag( 'div' )
:addClass( 'need_ref_tag' )
:addClass( 'need_ref_tag' )
:cssText( 'position:absolute; top:-0.6em; left:1em; padding:0 0.5em; font-size:80%; line-height:1em;')
:cssText( 'position:absolute; top:-0.6em; left:1em; padding:0 0.5em; font-size:80%; line-height:1em;' )
:css{ background = background }
:css{ background = background }
: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 args[ 1 ]:match( '%S' ) then
html:tag( 'span' )
html:tag( 'span' )
:addClass( 'need_ref' )
:addClass( 'need_ref' )
:cssText( 'cursor:help;' )
:cssText( 'cursor:help;' )
:attr{ title = args.titre }
:attr{ title = args.titre }
:wikitext( mw.text.trim(args[1]) )
:wikitext( mw.text.trim( args[ 1 ] ) )
:done()
:done()
ajouterinfobulle=false--Facultatif, on pourrait accepter l'infobulle sur l'exposant quel que soit le cas.
ajouterinfobulle = false -- Facultatif, on pourrait accepter l'infobulle sur l'exposant quel que soit le cas.
end
end
if ajouterinfobulle then
if ajouterinfobulle then
Ligne 78 : Ligne 78 :
end
end


local function generateMessage( args, nommodele, modeinfobulle )-- Le dernier paramètre sert de booléen pour forcer une infobulle dans le lien interne.
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 modeinfobulle = modeinfobulle or false
local messageloc=''
local messageloc = ''
local infobulle_mise=false
local infobulle_mise = false
if args.message and args.message ~= '' then
if args.message and args.message ~= '' then
local cible
if args.message_lien and args.message_lien ~= '' then
if args.message_lien=='non' then
if args.message_lien and args.message_lien ~= '' then
if args.message_lien == 'non' then
messageloc= "[" .. args.message .. "]"
cible = false
if not args.message:find("%[%[") then
args.titre2=args.titre
end
else
else
cible = args.message_lien
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
end
else
else
cible = args.message
if modeinfobulle==true then
end
messageloc= "[[:" .. args.message .. "|" .. '<span title="' .. args.titre2 ..'">&#91;' .. args.message .. "&#93;</span>" .. "]]" .. tostring(table.concat(args))

infobulle_mise=true
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
else
messageloc= "[[:" .. args.message .. "|&#91;" .. args.message .. "&#93;]]"
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.
infobulle_mise=true--Facultatif, idem plus haut
end
else
messageloc = '&#91;' .. args.message .. '&#93;'
if not args.message:find( '%[%[' ) then
args.titre2 = args.titre
end
end
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
-- 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
if ( args.message:find( '%[' ) or args.message:find( '%]' ) ) and ( args.message_lien or '' ) ~= 'non' then
messageloc= args.message
messageloc = args.message
end
end
else
else
messageloc= '<span class="error">argument « message » manquant dans le modèle ' .. nommodele .. '.</span>'
messageloc = '<span class="error">argument « message » manquant dans le modèle ' .. nommodele .. '.</span>'
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
Ligne 124 : Ligne 129 :
local messageDate = ''
local messageDate = ''
local messageAide = ' ; v'
local messageAide = ' ; v'
local ponctuation="."
local ponctuation = '.'
if args.date and args.date ~= '' then
if args.date and args.date ~= '' then
messageDate = ' (demandé le ' .. args.date .. ')'
messageDate = ' (demandé le ' .. args.date .. ')'
else
else
local infobulle_texte= mw.text.trim((args.infobulle or ''):gsub( '%b<>', '' ))
local infobulle_texte = mw.text.trim( ( args.infobulle or '' ):gsub( '%b<>', '' ) )
if infobulle_texte ~= '' then
if infobulle_texte ~= '' then
if infobulle_texte:match( '[!?…]$' ) then
if infobulle_texte:match( '[!?…]$' ) then
messageAide = ' V'
messageAide = ' V'
ponctuation=""
ponctuation = ''
end
end
else
else
messageAide = 'V'
messageAide = 'V'
ponctuation=""
ponctuation = ''
end
end
end
end
messageAide = messageAide .. 'oir l\'aide.'
messageAide = messageAide .. 'oir l\'aide.'
args.titre = mw.text.trim(( args.infobulle or '' ):gsub( '[,.;:]$', '' )) .. messageDate .. ponctuation
args.titre = mw.text.trim( ( args.infobulle or '' ):gsub( '[,.;:]$', '' ) ) .. messageDate .. ponctuation
args.titre2 = mw.text.trim(( args.infobulle or '' ):gsub( '[,.;:]$', '' )) .. messageDate .. messageAide
args.titre2 = mw.text.trim( ( args.infobulle or '' ):gsub( '[,.;:]$', '' ) ) .. messageDate .. messageAide


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



Dernière version du 18 décembre 2022 à 14:24

 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; display:table; 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