« Module:Infobox/Core » : différence entre les versions
De Nefald
Autres actions
m Parserfunctions |
Supprimé l'ancienne section d'ajout d'icône avec :wikitext() Ajouté le traitement de l'icône après la construction du HTML Utilisé preprocess() pour traiter le parser function FontAwesome Injecté l'icône dans le HTML final avec gsub() Balises : Modification par mobile Modification par le web mobile |
||
Ligne 110 : | Ligne 110 : | ||
root:node(body) | root:node(body) | ||
-- | -- Traiter l'icône APRÈS avoir construit tout le HTML | ||
local finalResult = tostring(root) | |||
local | |||
local iconeType = config.icone.type or 'fas' | if config.icone then | ||
local iconeType = config.icone.type or 'fas' | |||
local iconeNom = config.icone.nom | |||
-- Utiliser mw.getCurrentFrame() si frame n'est pas disponible | |||
local currentFrame = frame or mw.getCurrentFrame() | |||
local iconeContent = '{{#' .. iconeType .. ':' .. iconeNom .. '}}' | |||
if currentFrame then | |||
iconeContent = currentFrame:preprocess(iconeContent) | |||
end | |||
-- Créer la div d'icône séparément et l'ajouter au résultat | |||
local iconeHtml = string.format( | |||
'<div class="infobox-icon-bottom">%s</div>', | |||
iconeContent | |||
) | |||
-- Injecter l'icône juste avant la fermeture de la div principale | |||
finalResult = finalResult:gsub('</div>$', iconeHtml .. '</div>') | |||
end | end | ||
return finalResult | |||
return | |||
end | end | ||
return p | return p |
Version du 27 septembre 2025 à 06:20
La documentation pour ce module peut être créée à Module:Infobox/Core/doc
local p = {}
local getArgs = require('Module:Arguments').getArgs
function p.build(args, config, frame) -- Ajouter le paramètre frame
if not args.nom or args.nom == '' then
return '<div class="error">Nom requis pour l\'infobox</div>'
end
local root = mw.html.create('div')
:addClass('infobox-table')
:attr('role', 'table')
-- En-tête avec nom
local header = mw.html.create('div')
:addClass('infobox-header')
if args.image and args.image ~= '' then
local imageDiv = mw.html.create('div')
:addClass('infobox-image')
local imageSize = args.tailleimage or '280px'
local imageCode = string.format('[[Fichier:%s|%s|center', args.image, imageSize)
if args.legende and args.legende ~= '' then
imageCode = imageCode .. '|' .. args.legende
end
imageCode = imageCode .. ']]'
imageDiv:wikitext(imageCode)
header:node(imageDiv)
end
-- Titre sans icône (icône déplacée en bas à droite)
local titleDiv = mw.html.create('div')
:addClass('infobox-title')
:wikitext(args.nom) -- Juste le nom, sans icône
header:node(titleDiv)
if args.soustitre and args.soustitre ~= '' then
local subtitleDiv = mw.html.create('div')
:addClass('infobox-subtitle')
:wikitext(args.soustitre)
header:node(subtitleDiv)
end
root:node(header)
-- Corps avec les champs
local body = mw.html.create('div')
:addClass('infobox-body')
for _, section in ipairs(config.sections or {}) do
if section.titre then
local sectionDiv = mw.html.create('div')
:addClass('infobox-section-title')
:wikitext(section.titre)
body:node(sectionDiv)
end
-- Vérifier si on doit afficher les coordonnées automatiquement
local hasCoordinates = args.x and args.x ~= '' and args.y and args.y ~= '' and args.z and args.z ~= ''
local coordinatesDisplayed = false
for _, champ in ipairs(section.champs or {}) do
-- Détection automatique des coordonnées
if hasCoordinates and not coordinatesDisplayed and (champ.cle == 'x' or champ.cle == 'y' or champ.cle == 'z' or champ.cle == 'spawn' or champ.cle == 'coordonnees') then
local rowDiv = mw.html.create('div')
:addClass('infobox-row')
local labelDiv = mw.html.create('div')
:addClass('infobox-label')
:wikitext('Coordonnées')
local valueDiv = mw.html.create('div')
:addClass('infobox-value')
-- Construction du lien vers la carte si le paramètre monde existe
if args.monde and args.monde ~= '' then
local mapUrl = string.format('[https://map.nefald.fr/?worldname=%s&mapname=surface&zoom=4&x=%s&y=%s&z=%s %s, %s, %s]',
args.monde, args.x, args.y, args.z, args.x, args.y, args.z)
valueDiv:wikitext("''" .. mapUrl .. "''")
else
-- Affichage simple sans lien
valueDiv:wikitext(string.format('%s, %s, %s', args.x, args.y, args.z))
end
rowDiv:node(labelDiv):node(valueDiv)
body:node(rowDiv)
coordinatesDisplayed = true
-- Traitement normal des autres champs (en excluant x, y, z individuels si coordonnées affichées)
elseif not (hasCoordinates and (champ.cle == 'x' or champ.cle == 'y' or champ.cle == 'z')) and args[champ.cle] and args[champ.cle] ~= '' then
local rowDiv = mw.html.create('div')
:addClass('infobox-row')
local labelDiv = mw.html.create('div')
:addClass('infobox-label')
:wikitext(champ.label)
local valueDiv = mw.html.create('div')
:addClass('infobox-value')
:wikitext(args[champ.cle])
rowDiv:node(labelDiv):node(valueDiv)
body:node(rowDiv)
end
end
end
root:node(body)
-- Traiter l'icône APRÈS avoir construit tout le HTML
local finalResult = tostring(root)
if config.icone then
local iconeType = config.icone.type or 'fas'
local iconeNom = config.icone.nom
-- Utiliser mw.getCurrentFrame() si frame n'est pas disponible
local currentFrame = frame or mw.getCurrentFrame()
local iconeContent = '{{#' .. iconeType .. ':' .. iconeNom .. '}}'
if currentFrame then
iconeContent = currentFrame:preprocess(iconeContent)
end
-- Créer la div d'icône séparément et l'ajouter au résultat
local iconeHtml = string.format(
'<div class="infobox-icon-bottom">%s</div>',
iconeContent
)
-- Injecter l'icône juste avant la fermeture de la div principale
finalResult = finalResult:gsub('</div>$', iconeHtml .. '</div>')
end
return finalResult
end
return p