2024-09-09 17:42:55 +00:00
|
|
|
$( () => {
|
2024-10-12 16:10:56 +00:00
|
|
|
function addLink( element, title ) {
|
2024-09-09 17:42:55 +00:00
|
|
|
const link = document.createElement( 'a' );
|
2024-10-12 16:10:56 +00:00
|
|
|
link.href = title.getUrl();
|
|
|
|
link.title = title.toText();
|
2024-09-09 17:42:55 +00:00
|
|
|
// put text node from element inside link
|
|
|
|
const firstChild = element.firstChild;
|
|
|
|
if ( !( firstChild instanceof Text ) ) {
|
|
|
|
throw new TypeError( 'Expected Text object' );
|
|
|
|
}
|
|
|
|
link.appendChild( firstChild );
|
|
|
|
element.appendChild( link ); // put link inside syntax-highlighted string
|
|
|
|
}
|
|
|
|
|
|
|
|
// List of functions whose parameters should be linked if they meet the given condition
|
|
|
|
const parametersToLink = {
|
|
|
|
require: ( title ) => title.getNamespaceId() === 828,
|
|
|
|
'mw.loadData': ( title ) => title.getNamespaceId() === 828,
|
|
|
|
'mw.loadJsonData': () => true
|
|
|
|
};
|
|
|
|
|
2024-10-12 16:10:56 +00:00
|
|
|
mw.hook( 'wikipage.content' ).add( ( $content ) => {
|
2024-09-09 17:42:55 +00:00
|
|
|
|
2024-10-12 16:10:56 +00:00
|
|
|
// s1 is the class applied by Pygments to single-quoted strings
|
|
|
|
// s2 is the class applied by Pygments to double-quoted strings
|
|
|
|
const stringNodes = $content.find( '.s1' ).get()
|
|
|
|
.concat( $content.find( '.s2' ).get() );
|
|
|
|
|
|
|
|
stringNodes.forEach( ( node ) => {
|
|
|
|
if ( !node.nextElementSibling ||
|
|
|
|
!node.nextElementSibling.firstChild ||
|
|
|
|
!node.nextElementSibling.firstChild.nodeValue ||
|
|
|
|
node.nextElementSibling.firstChild.nodeValue.indexOf( ')' ) !== 0 ) {
|
|
|
|
return;
|
2024-09-09 17:42:55 +00:00
|
|
|
}
|
2024-10-12 16:10:56 +00:00
|
|
|
if ( !node.previousElementSibling || !node.previousElementSibling.firstChild ||
|
|
|
|
node.previousElementSibling.firstChild.nodeValue !== '(' ) {
|
|
|
|
return;
|
2024-09-09 17:42:55 +00:00
|
|
|
}
|
2024-10-12 16:10:56 +00:00
|
|
|
Object.keys( parametersToLink ).forEach( ( invocation ) => {
|
|
|
|
const parts = invocation.split( '.' );
|
|
|
|
let partIdx = parts.length - 1;
|
|
|
|
let curNode = node.previousElementSibling && node.previousElementSibling.previousElementSibling;
|
|
|
|
while ( partIdx >= 0 ) {
|
|
|
|
if ( !curNode || curNode.firstChild.nodeValue !== parts[ partIdx ] ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ( partIdx === 0 ) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
const prev = curNode.previousElementSibling;
|
|
|
|
if ( !prev || prev.firstChild.nodeValue !== '.' ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
curNode = prev.previousElementSibling;
|
|
|
|
partIdx--;
|
|
|
|
}
|
|
|
|
const page = node.firstChild.nodeValue.slice( 1, -1 );
|
|
|
|
const condition = parametersToLink[ invocation ];
|
|
|
|
const title = mw.Title.newFromText( page );
|
|
|
|
if ( title && condition( title ) ) {
|
|
|
|
addLink( node, title );
|
|
|
|
}
|
|
|
|
} );
|
2024-09-09 17:42:55 +00:00
|
|
|
} );
|
|
|
|
|
2024-10-12 16:10:56 +00:00
|
|
|
} );
|
2024-09-09 17:42:55 +00:00
|
|
|
} );
|