mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/SyntaxHighlight_GeSHi
synced 2024-11-23 14:07:01 +00:00
Merge "Fix bugs in link generation"
This commit is contained in:
commit
4577cbe62f
|
@ -8,53 +8,59 @@ $( () => {
|
|||
// by John Gruber, from https://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||
const URLRegExp = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()[\]{};:'".,<>?«»“”‘’]))/i;
|
||||
|
||||
function processComment( node ) {
|
||||
let wikilinkMatch, templateMatch, URLMatch;
|
||||
const textNode = node.firstChild; // always a text node.
|
||||
const wikilinkRegExp = /\[\[([^|{}[\]\n]+)?(?:\|.*?)?]]/;
|
||||
const templateRegExp = /\{\{([^|{}[\]\n#]+)(?=\||}})/;
|
||||
|
||||
while (
|
||||
( wikilinkMatch = /\[\[([^|{}[\]\n]+)?(?:\|.*?)?]]/.exec( textNode.data ) ) ||
|
||||
( templateMatch = /\{\{([^|{}[\]\n#]+)(?=\||}})/i.exec( textNode.data ) ) ||
|
||||
function processComment( textNode, node ) {
|
||||
let wikilinkMatch, templateMatch, URLMatch;
|
||||
|
||||
if (
|
||||
( wikilinkMatch = wikilinkRegExp.exec( textNode.data ) ) ||
|
||||
( templateMatch = templateRegExp.exec( textNode.data ) ) ||
|
||||
( URLMatch = URLRegExp.exec( textNode.data ) )
|
||||
) {
|
||||
const link = document.createElement( 'a' );
|
||||
let start = ( wikilinkMatch || templateMatch || URLMatch ).index;
|
||||
let linkText;
|
||||
let linkText, title;
|
||||
link.classList.add( 'code-link' );
|
||||
|
||||
if ( URLMatch ) {
|
||||
const URL = URLMatch[ 0 ];
|
||||
link.href = URL;
|
||||
linkText = URL;
|
||||
} else {
|
||||
let fullPageName;
|
||||
if ( wikilinkMatch ) {
|
||||
linkText = wikilinkMatch[ 0 ];
|
||||
fullPageName = wikilinkMatch[ 1 ];
|
||||
} else if ( templateMatch ) {
|
||||
const pageName = templateMatch[ 1 ];
|
||||
linkText = pageName;
|
||||
fullPageName = mw.config.get( 'wgFormattedNamespaces' )[ 10 ] + ':' + pageName;
|
||||
link.title = fullPageName;
|
||||
start += 2; // opening braces "{{"
|
||||
}
|
||||
link.href = mw.util.getUrl( fullPageName );
|
||||
} else if ( wikilinkMatch ) {
|
||||
linkText = wikilinkMatch[ 0 ];
|
||||
title = mw.Title.newFromText( wikilinkMatch[ 1 ] );
|
||||
} else if ( templateMatch ) {
|
||||
const pageName = templateMatch[ 1 ];
|
||||
start += 2; // opening braces "{{"
|
||||
linkText = pageName;
|
||||
title = mw.Title.newFromText( pageName, 10 );
|
||||
}
|
||||
if ( title ) {
|
||||
link.href = mw.util.getUrl( title.toText() );
|
||||
link.title = title.toText();
|
||||
}
|
||||
if ( link.href ) {
|
||||
const textBeforeLink = textNode.data.slice( 0, Math.max( 0, start ) ),
|
||||
textAfterLink = textNode.data.slice( Math.max( 0, start + linkText.length ) );
|
||||
|
||||
const beforeLink = textNode.data.slice( 0, Math.max( 0, start ) ),
|
||||
afterLink = textNode.data.slice( Math.max( 0, start + linkText.length ) );
|
||||
|
||||
textNode.data = afterLink;
|
||||
link.appendChild( document.createTextNode( linkText ) );
|
||||
node.insertBefore( link, textNode );
|
||||
node.insertBefore( document.createTextNode( beforeLink ), link );
|
||||
textNode.data = textAfterLink;
|
||||
link.appendChild( document.createTextNode( linkText ) );
|
||||
node.insertBefore( link, textNode );
|
||||
const beforeTextNode = node.insertBefore( document.createTextNode( textBeforeLink ), link );
|
||||
processComment( beforeTextNode, node );
|
||||
processComment( textNode, node );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const commentClasses = [ 'c', 'c1', 'cm' ];
|
||||
Array.from( document.getElementsByClassName( 'mw-highlight' ) ).forEach( ( codeBlock ) => {
|
||||
commentClasses.forEach( ( commentClass ) => {
|
||||
Array.from( codeBlock.getElementsByClassName( commentClass ) ).forEach( processComment );
|
||||
Array.from( codeBlock.getElementsByClassName( commentClass ) ).forEach( ( node ) => {
|
||||
processComment( node.firstChild, node );
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
|
||||
|
|
Loading…
Reference in a new issue