Utilisateur:Guillaumrs/InsertQid.js
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;
Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5./**
* Ajoute un bouton dans la barre d'outils de l'éditeur wikicode pour copier
* le Qid Wikidata de la page courante dans le presse-papiers (Ctrl+V pour coller).
*
* @author Claude (Anthropic) - Conversation avec Guillaumrs
* @date Septembre 2026
* @version 2.1
*/
( function () {
'use strict';
var isEditMode = mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit';
if ( !isEditMode ) {
return;
}
// Notification après copie (désactivable)
if ( window.InsertQid_Notify === undefined ) {
window.InsertQid_Notify = true;
}
var qid = null;
var qidResolved = false;
/***
* RÉCUPÉRATION DU QID VIA L'API
* Fonctionne en mode édition, contrairement à wgWikibaseItemId.
* mw.Api nécessite le module 'mediawiki.api', chargé explicitement ici
* pour éviter toute erreur si le module n'est pas encore prêt.
*/
function resolveQid( callback ) {
var configQid = mw.config.get( 'wgWikibaseItemId' );
if ( configQid ) {
callback( configQid );
return;
}
mw.loader.using( 'mediawiki.api', function () {
try {
var api = new mw.Api( { userAgent: 'Gadget-InsertQid' } );
api.get( {
action: 'query',
prop: 'pageprops',
titles: mw.config.get( 'wgPageName' ),
ppprop: 'wikibase_item',
formatversion: 2
} ).done( function ( data ) {
var page = data.query && data.query.pages && data.query.pages[0];
var found = page && page.pageprops && page.pageprops.wikibase_item;
callback( found || null );
} ).fail( function () {
callback( null );
} );
} catch ( e ) {
console.error( '[InsertQid] Erreur lors de la résolution du Qid :', e );
callback( null );
}
} );
}
/***
* COPIE DANS LE PRESSE-PAPIERS
*/
function copyToClipboard( text, onDone ) {
if ( navigator.clipboard && navigator.clipboard.writeText ) {
navigator.clipboard.writeText( text ).then( function () {
onDone( true );
} ).catch( function () {
onDone( fallbackCopy( text ) );
} );
} else {
onDone( fallbackCopy( text ) );
}
}
function fallbackCopy( text ) {
var tmp = document.createElement( 'textarea' );
tmp.value = text;
tmp.style.position = 'fixed';
tmp.style.opacity = '0';
document.body.appendChild( tmp );
tmp.focus();
tmp.select();
var ok = false;
try {
ok = document.execCommand( 'copy' );
} catch ( e ) {
ok = false;
}
document.body.removeChild( tmp );
return ok;
}
/***
* MISE À JOUR DE L'APPARENCE DU BOUTON UNE FOIS LE QID CONNU
*/
function updateButtonState( btn ) {
if ( qid ) {
btn.textContent = '🆔 Copier ' + qid;
btn.title = 'Copie "' + qid + '" dans le presse-papiers (Ctrl+V pour coller)';
btn.disabled = false;
btn.style.opacity = '1';
} else {
btn.textContent = '🆔 Copier Qid';
btn.title = 'Aucun élément Wikidata associé à cette page';
btn.disabled = true;
btn.style.opacity = '0.5';
}
}
/***
* CRÉATION DU BOUTON
*/
function createButtonContainer() {
var container = document.createElement( 'div' );
container.style.cssText = 'margin: 8px 0; padding: 4px; background: #f8f9fa; border-radius: 3px; display: inline-block;';
var btn = document.createElement( 'button' );
btn.id = 'btn-insert-qid';
btn.type = 'button';
btn.className = 'mw-ui-button';
btn.style.cssText = 'margin: 0 4px; padding: 6px 12px; cursor: pointer;';
btn.textContent = '🆔 Chargement…';
btn.disabled = true;
btn.style.opacity = '0.5';
btn.addEventListener( 'click', function () {
if ( !qid ) {
return;
}
var originalText = btn.textContent;
copyToClipboard( qid, function ( success ) {
if ( success ) {
if ( window.InsertQid_Notify ) {
mw.notify( 'Qid ' + qid + ' copié dans le presse-papiers (Ctrl+V pour coller).', { type: 'success', tag: 'InsertQid', autoHide: true, autoHideSeconds: 3 } );
}
btn.textContent = '✅ Copié !';
setTimeout( function () { btn.textContent = originalText; }, 1500 );
} else {
mw.notify( 'Échec de la copie dans le presse-papiers.', { type: 'error', tag: 'InsertQid' } );
}
} );
} );
container.appendChild( btn );
if ( qidResolved ) {
updateButtonState( btn );
}
return { container: container, btn: btn };
}
/***
* PLACEMENT DANS LA BARRE D'OUTILS
*/
function placeButton() {
if ( document.querySelector( '#btn-insert-qid' ) ) {
return true;
}
var textarea = document.querySelector( '#wpTextbox1' );
if ( !textarea ) {
return false;
}
var colonnes2Btn = document.getElementById( 'btn-remove-obsolete' );
var built = createButtonContainer();
if ( colonnes2Btn && colonnes2Btn.parentElement ) {
var colonnes2Container = colonnes2Btn.parentElement;
colonnes2Container.parentElement.insertBefore( built.container, colonnes2Container.nextSibling );
} else {
var toolbar = document.querySelector( '.wikiEditor-ui-toolbar' ) ||
document.querySelector( '.editOptions' ) ||
textarea.parentElement;
toolbar.appendChild( built.container );
}
mw.log( '✓ Bouton de copie Qid ajouté' );
return true;
}
function addButtonWithRetry() {
if ( placeButton() ) {
return;
}
var tries = 0;
var maxTries = 40;
var interval = setInterval( function () {
tries++;
if ( placeButton() || tries >= maxTries ) {
clearInterval( interval );
}
}, 250 );
}
/***
* LANCEMENT
* Le placement du bouton et la résolution du Qid sont indépendants :
* même si resolveQid échoue, le bouton doit apparaître (juste désactivé).
*/
if ( document.readyState === 'loading' ) {
document.addEventListener( 'DOMContentLoaded', addButtonWithRetry );
} else {
if ( mw.loader.getState( 'ext.wikiEditor' ) === 'ready' ) {
mw.hook( 'wikiEditor.toolbarReady' ).add( addButtonWithRetry );
}
setTimeout( addButtonWithRetry, 500 );
}
resolveQid( function ( resolvedQid ) {
qid = resolvedQid;
qidResolved = true;
var existingBtn = document.getElementById( 'btn-insert-qid' );
if ( existingBtn ) {
updateButtonState( existingBtn );
}
} );
}() );