MediaWiki:Gadget-AncreTitres.js
Apparence
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./**
* AncreTitres
*
* Cette fonction fournit un lien vers une section de page en cliquant
* sur le lien [URL] ou [[lien]] à droite du titre de section.
*
* Auteurs : Pabix, Phe, Bayo, Chphe, Arkanosis, Mah3110, Ash_Crow
* {{Projet:JavaScript/Script|AncreTitres}}
*/
/* global $, mw */
/* eslint-env browser */
// <nowiki>
mw.loader.using( [ 'mediawiki.util', 'user' ], function () {
'use strict';
$( function ( $ ) {
var lang = mw.config.get( 'wgUserLanguage' ),
messages = {
en: {
'ancretitres-anchor-name': '[URL]',
'ancretitres-internal-link-name': '[[Link]]',
'ancretitres-description': 'Get an URL to this section',
'ancretitres-int-description': 'Get an internal link to this section',
'ancretitres-notif-title': 'Text copied to clipboard',
'ancretitres-notif-error': 'Could not copy to clipboard'
},
fr: {
'ancretitres-anchor-name': '[URL]',
'ancretitres-internal-link-name': '[[Lien]]',
'ancretitres-description': 'Obtenir une URL vers cette section',
'ancretitres-int-description': 'Obtenir un lien interne vers cette section',
'ancretitres-notif-title': 'Texte copié dans le presse-papiers',
'ancretitres-notif-error': 'Impossible de copier dans le presse-papiers'
}
},
options = {
afficheE: true,
afficheI: true
};
mw.messages.set( messages.en );
if ( lang !== 'en' && lang in messages ) {
mw.messages.set( messages[ lang ] );
}
function copyTextToClipboard( text ) {
function notifySuccess() {
mw.notify( text, { title: mw.msg( 'ancretitres-notif-title' ), tag: 'ancretitres', type: 'info', autoHide: true } );
}
function notifyError() {
mw.notify( mw.msg( 'ancretitres-notif-error' ), { tag: 'ancretitres', type: 'error', autoHide: true } );
}
if ( navigator.clipboard ) {
// Clipboard API
navigator.clipboard.writeText( text ).then( notifySuccess, notifyError );
} else {
notifyError();
}
}
if ( typeof window.AncreTitres !== 'undefined' ) {
Object.assign( options, window.AncreTitres );
}
if ( !options.afficheI && !options.afficheE ) {
return;
}
// https://phabricator.wikimedia.org/T13555
// https://www.mediawiki.org/wiki/Heading_HTML_changes
// old markup (hN > .mw-headline)
$( '.mw-headline' ).each( function ( _, mwHeadline ) {
if ( mwHeadline.id ) {
processHeading( mwHeadline.parentElement, mwHeadline.id );
}
} );
// new markup (.mw-heading > hN)
$( '.mw-heading' ).each( function ( _, mwHeading ) {
var heading = mwHeading.querySelector( 'h1, h2, h3, h4, h5, h6' );
if ( heading && heading.id ) {
processHeading( mwHeading, heading.id );
}
} );
function processHeading( headingContainer, sectionId ) {
var $span = $( '<span>' )
.addClass( 'noprint ancretitres' )
.css( {
'font-size': 'xx-small',
'font-weight': 'normal',
'user-select': 'none' // jQuery se charge d'ajouter un vendor prefix si nécessaire
} );
var sectionUrl = 'https://' + mw.config.get( 'wgServerName' ) + mw.util.getUrl() + '#' + sectionId;
if ( options.afficheE ) {
var $linkE = $( '<a>' )
.attr( 'href', sectionUrl )
.attr( 'title', mw.msg( 'ancretitres-description' ) )
.text( mw.msg( 'ancretitres-anchor-name' ) )
.click( function ( e ) {
e.preventDefault();
copyTextToClipboard( sectionUrl );
} );
$span.append( ' ', $linkE );
}
if ( options.afficheI ) {
var $linkI = $( '<a>' )
.attr( 'href', sectionUrl )
.attr( 'title', mw.msg( 'ancretitres-int-description' ) )
.text( mw.msg( 'ancretitres-internal-link-name' ) )
.click( function ( e ) {
e.preventDefault();
var escapedAnchor = sectionId
// escaping caractères spéciaux HTML
// (partiel, '"& ne sont pas escapés pour ne pas dégrader inutilement la lisibilité du lien)
.replaceAll( '<', '<' )
.replaceAll( '>', '>' )
// escaping caractères spéciaux MediaWiki
.replaceAll( '[', '[' )
.replaceAll( ']', ']' )
.replaceAll( '{', '{' )
.replaceAll( '|', '|' )
.replaceAll( '}', '}' );
var outputText = '[[' + ( mw.config.get( 'wgPageName' ) + '#' + escapedAnchor ).replaceAll( '_', ' ' ) + ']]';
copyTextToClipboard( outputText );
} );
$span.append( ' ', $linkI );
}
headingContainer.append( $span[ 0 ] );
}
} );
} );