« Module:Fix » : différence entre les versions
(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) |
m (1 version importée) |
Dernière version du 1 juin 2024 à 11:44
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; 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 ..'">[' .. args.message .. ']</span>' .. ']]'
infobulle_mise = true
else
messageloc = '[[:' .. cible .. '|[' .. args.message .. ']]]'
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 = '[' .. args.message .. ']'
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