« Module:MinecraftConnect » : différence entre les versions
De Nefald
Autres actions
m échappement |
mAucun résumé des modifications |
||
| Ligne 21 : | Ligne 21 : | ||
end | end | ||
-- Échappement pour JavaScript ( | -- Échappement manuel pour JavaScript | ||
local adresseJS = | local function jsEscape(str) | ||
return str:gsub("\\", "\\\\"):gsub("'", "\\'"):gsub('"', '\\"'):gsub("\n", "\\n") | |||
end | |||
local adresseJS = jsEscape(adresseComplete) | |||
local texteHTML = mw.text.encode(texte) | local texteHTML = mw.text.encode(texte) | ||
-- Génération d'un ID unique pour éviter les conflits | -- Génération d'un ID unique pour éviter les conflits | ||
local uniqueId = 'mc-btn-' .. | local uniqueId = 'mc-btn-' .. server:gsub('[^%w]', '-') | ||
-- HTML du bouton | -- HTML du bouton | ||
| Ligne 37 : | Ligne 41 : | ||
:attr('title', 'Cliquer pour copier : ' .. mw.text.encode(adresseComplete)) | :attr('title', 'Cliquer pour copier : ' .. mw.text.encode(adresseComplete)) | ||
:attr('data-server', adresseComplete) | :attr('data-server', adresseComplete) | ||
:wikitext(texteHTML .. ' 📋') | :wikitext(texteHTML .. ' 📋') | ||
:done() | :done() | ||
-- JavaScript pour la copie dans le presse-papier | -- JavaScript pour la copie dans le presse-papier | ||
local jsCode = | local jsCode = [[ | ||
(function() { | (function() { | ||
var btn = document.getElementById( | var btn = document.getElementById(']] .. uniqueId .. [[').querySelector('button'); | ||
if (!btn) return; | if (!btn) return; | ||
btn.addEventListener('click', function() { | btn.addEventListener('click', function() { | ||
var adresse = | var adresse = ']] .. adresseJS .. [['; | ||
if (navigator.clipboard && window.isSecureContext) { | if (navigator.clipboard && window.isSecureContext) { | ||
| Ligne 103 : | Ligne 107 : | ||
} | } | ||
})(); | })(); | ||
]] | ]] | ||
local script = mw.html.create('script'):wikitext(jsCode) | local script = mw.html.create('script'):wikitext(jsCode) | ||
Version du 10 novembre 2025 à 08:59
La documentation pour ce module peut être créée à Module:MinecraftConnect/doc
local p = {}
function p.button(frame)
-- Récupération des arguments du frame parent (pour {{#invoke}})
local args = frame.args
if not args[1] and frame:getParent() then
args = frame:getParent().args
end
-- Récupération et échappement des paramètres
local server = mw.text.trim(args[1] or args.serveur or 'play.exemple.fr')
local port = mw.text.trim(args[2] or args.port or '25565')
local texte = mw.text.trim(args[3] or args.texte or "Copier l'adresse")
-- Construction de l'adresse complète
local adresseComplete
if port == '25565' then
adresseComplete = server
else
adresseComplete = server .. ':' .. port
end
-- Échappement manuel pour JavaScript
local function jsEscape(str)
return str:gsub("\\", "\\\\"):gsub("'", "\\'"):gsub('"', '\\"'):gsub("\n", "\\n")
end
local adresseJS = jsEscape(adresseComplete)
local texteHTML = mw.text.encode(texte)
-- Génération d'un ID unique pour éviter les conflits
local uniqueId = 'mc-btn-' .. server:gsub('[^%w]', '-')
-- HTML du bouton
local html = mw.html.create('span')
:addClass('minecraft-connect-button')
:attr('id', uniqueId)
:tag('button')
:addClass('mw-ui-button mw-ui-progressive')
:attr('type', 'button')
:attr('title', 'Cliquer pour copier : ' .. mw.text.encode(adresseComplete))
:attr('data-server', adresseComplete)
:wikitext(texteHTML .. ' 📋')
:done()
-- JavaScript pour la copie dans le presse-papier
local jsCode = [[
(function() {
var btn = document.getElementById(']] .. uniqueId .. [[').querySelector('button');
if (!btn) return;
btn.addEventListener('click', function() {
var adresse = ']] .. adresseJS .. [[';
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(adresse).then(function() {
afficherFeedback(btn, '\u2713 Copié !', 'success');
}).catch(function() {
fallbackCopy(adresse, btn);
});
} else {
fallbackCopy(adresse, btn);
}
});
function fallbackCopy(texte, bouton) {
var textarea = document.createElement('textarea');
textarea.value = texte;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
try {
var success = document.execCommand('copy');
if (success) {
afficherFeedback(bouton, '\u2713 Copié !', 'success');
} else {
afficherFeedback(bouton, '\u2717 Erreur', 'error');
}
} catch (err) {
afficherFeedback(bouton, '\u2717 Erreur', 'error');
}
document.body.removeChild(textarea);
}
function afficherFeedback(bouton, message, type) {
var texteOriginal = bouton.textContent;
bouton.textContent = message;
bouton.disabled = true;
if (type === 'success') {
bouton.classList.add('mw-ui-constructive');
bouton.classList.remove('mw-ui-progressive');
} else {
bouton.classList.add('mw-ui-destructive');
bouton.classList.remove('mw-ui-progressive');
}
setTimeout(function() {
bouton.textContent = texteOriginal;
bouton.disabled = false;
bouton.classList.remove('mw-ui-constructive', 'mw-ui-destructive');
bouton.classList.add('mw-ui-progressive');
}, 2000);
}
})();
]]
local script = mw.html.create('script'):wikitext(jsCode)
return tostring(html) .. tostring(script)
end
return p