Jump to content

User:Lenore/autolink.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// Autolink [[wikilinks]], [external links] and {templates} (especially useful for monobook.js 
// and similar pages); adapted from [[Wikipedia:WikiProject User scripts/Scripts/Autolink]]

/* ---------------------------------------------------------------------------------------------- */

$(function () {

    var autolinkCronoSpecial = mw.config.get('wgCanonicalSpecialPageName') == "Recentchanges" || /*
    */ mw.config.get('wgCanonicalSpecialPageName') == "Watchlist" || /*
    */ mw.config.get('wgCanonicalSpecialPageName') == "Recentchangeslinked" || /*
    */ mw.config.get('wgCanonicalSpecialPageName') == "Newpages" || /*
    */ mw.config.get('wgCanonicalSpecialPageName') == "Log" || /*
    */ mw.config.get('wgCanonicalSpecialPageName') == "Contributions";
    // Special crono pages where this script is enabled

    if ((typeof(autolinkMySpecialPage) != "undefined"))
       autolinkCronoSpecial = autolinkCronoSpecial || mw.config.get('wgPageName') == autolinkMySpecialPage;

    if (mw.config.get('wgCanonicalNamespace') == "Special" && !autolinkCronoSpecial) {

       return; // Disabled in the other special pages

    }

    if (typeof(autolinkParseLink) == 'undefined') { 

       autolinkParseLink = true; // Parse links in all cases, even in diffs. To be disabled when wikEd is active

    }

/* ---------------------------------------- Variables ------------------------------------------- */

    var autolinkDiff = location.href.indexOf('diff=') != -1;
    // It says if I'm in a diff page

    var autolinkCrono = (mw.config.get('wgAction') == 'history' || autolinkCronoSpecial);
    // It says if I'm in a history page

    var autolinkEdit = ($.inArray(mw.config.get('wgAction'), ['edit' , 'submit']) !== -1);
    // It says if I'm in an edit or submit page
	
	var autolinkColor; // links color

    var autolinkTargetDiv = [];

    if (autolinkDiff) { // in diff pages
		if (autolinkParseLink) { // without wikEd
			autolinkTargetDiv[0] = $('.diff');

			autolinkTargetDiv[1] = $('.firstrevisionheader');
			autolinkColor = 'inherit'; // not coloured links
		} else { // with wikEd
			autolinkTargetDiv[0] = $('.comment');
			autolinkColor = ''; // coloured links 
		}
    } else if (autolinkCrono || autolinkEdit) { // in comments
		autolinkTargetDiv[0] = $('.comment');
		autolinkColor = ''; // coloured links
	} else { // in code sections
           autolinkTargetDiv[0] = $('source');
           autolinkTargetDiv[1] = $('.javascript');
           autolinkTargetDiv[2] = $('.source-javascript');
           autolinkTargetDiv[3] = $('.css');
           autolinkTargetDiv[4] = $('.source-css');
	   autolinkColor = ''; // coloured links
    }

/* ------------------------------------------ Regex --------------------------------------------- */

	var autolinkRegexTl;
	var autolinkRegexURL;
	
	var autolinkRegexURLinWcodeWoLabel;
	var autolinkRegexSubstinWcodeWoLabel;
	var autolinkRegexURLinWcodeWithLabel;
	var autolinkRegexSubstinWcodeWithLabel;
	var autolinkRegexOtherPages;
	var autolinkRegexSubstOtherPages;	
	var autolinkRegexTemplate;
	var autolinkRegexSubstTemplate;
	var autolinkRegexWlink1;
	var autolinkRegexSubstWlink1;
	var autolinkRegexWlink2;
	var autolinkRegexSubstWlink2;
	
	var autolinkRegexInternalURL;
	var autolinkRegexImportScript;

        var autolinkActivateHTML = false;

	/*   ------------------------------------------------------------------------------------------ */

	autolinkRegexTl = /([^{]{{2}\s*[Tt]l\|)([^[\]{}|:<>\n]+)/g;
    // For {{tl}}
	
	autolinkRegexURL = /((?:[^"\[]|[^=]")(?:<span class="diffchange">)?)((?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+?)(?=(?:<\/span>)?[\s|)\]}'"])/g;
    // External links (no wikicode)

// Regex for diffs

        autolinkRegexURLinWcodeWoLabel = /((?:[^\[]|^)\[\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*)((?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+)((?:<\/span>)?(?:<span class="diffchange">)?)([\w._\/\\~%\-+&#?!=()@:]*)((?:<\/span>)?(?:<span class="diffchange">)?)([\w._\/\\~%\-+&#?!=()@:]*)([^\]\n]*\])/gm;
		autolinkRegexSubstinWcodeWoLabel = '$1<a class="external autolink" style="color:' + autolinkColor + '" href="$2$4$6">$2</a>$3<a class="external autolink" style="color:' + autolinkColor + '" href="$2$4$6">$4</a>$5<a class="external autolink" style="color:' + autolinkColor + '" href="$2$4$6">$6</a>$7';
		// External links in diff pages, wikicode without label

		autolinkRegexURLinWcodeWithLabel = autolinkRegexURLinWcodeWoLabel;
		autolinkRegexSubstinWcodeWithLabel = autolinkRegexSubstinWcodeWoLabel;
		// External links in diff pages, wikicode with label
		
		autolinkRegexOtherPages = /((?:[^{]|^)\{{2}\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*(?:(?:[Ss][Uu][Bb][Ss][Tt]|[Mm][Ss][Gg]|[Mm][Ss][Gg][Nn][Ww])\s*:)?\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*)((?:[Dd]iscussion[ei] ?)?\s*(?:[Ss]peciale?|[Ww](?:ikipedia|P)|[Tt]emplate|[Uu](?:ser|tente)|[Pp]ortale?|[Pp]rogetto)?\s*(?: ?[Tt]alk)?\s*:[^[\]{}|:<>\n]+)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|:<>\n]*)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|:<>\n]*)(\||}{2})/gm;
		autolinkRegexSubstOtherPages = '$1<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$2$4$6">$2</a>$3<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$2$4$6">$4</a>$5<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$2$4$6">$6</a>$7';
		// Other pages included in diff pages
	   
		autolinkRegexTemplate = /((?:[^{]|^)\{{2}\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*(?:(?:[Ss][Uu][Bb][Ss][Tt]|[Mm][Ss][Gg]|[Mm][Ss][Gg][Nn][Ww])\s*:)?\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?)([^[\]{}|:<>\n]+)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|:<>\n]*)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|:<>\n]*)(\||}{2}|:)/gm;
		autolinkRegexSubstTemplate = '$1<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/Template:$2$4$6">$2</a>$3<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/Template:$2$4$6">$4</a>$5<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/Template:$2$4$6">$6</a>$7';
		// Templates in diff pages   
		
		autolinkRegexWlink1 = /(\[{2}\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*)([^[\]{}|<>\n]+)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|<>\n]*)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|<>\n]*)((?:[^\]\n]|\][^\]])*\]{2})/g;
		autolinkRegexSubstWlink1 = '$1<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$2$4$6">$2</a>$3<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$2$4$6">$4</a>$5<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$2$4$6">$6</a>$7';
		// Wikilinks in diff pages
		
		autolinkRegexWlink2 = autolinkRegexWlink1;
		autolinkRegexSubstWlink2 = autolinkRegexSubstWlink1;

// Regex for comments or code sections

    if (!autolinkDiff || (autolinkDiff && !autolinkParseLink)) {

      autolinkRegexURLinWcodeWoLabel = /([^\[]|^)\[\s*((?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+)\s*\]/gm;
      autolinkRegexSubstinWcodeWoLabel = '$1<a class="external autolink" style="color:' + autolinkColor + '" href="$2">$2</a>';
      // External links in comments or code sections, wikicode without label

      autolinkRegexURLinWcodeWithLabel = /([^\[]|^)\[\s*((?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+)\s+([^\n]+?)\s*\]/gm;
      autolinkRegexSubstinWcodeWithLabel = '$1<a class="external autolink" style="color:' + autolinkColor + '" href="$2">$3</a>';
      // External links in comments or code sections, wikicode with label (the URL will not be visible)
	  
	  autolinkRegexOtherPages = /((?:[^{]|^)\{{2}\s*(?:(?:[Ss][Uu][Bb][Ss][Tt]|[Mm][Ss][Gg]|[Mm][Ss][Gg][Nn][Ww])\s*:)?\s*)((?:[Dd]iscussion[ei] ?)?\s*(?:[Ss]peciale?|[Ww](?:ikipedia|P)|[Tt]emplate|[Uu](?:ser|tente)|[Pp]ortale?|[Pp]rogetto)?\s*(?: ?[Tt]alk)?\s*:[^[\]{}|:<>\n]+)(\||}{2})/gm;
	  autolinkRegexSubstOtherPages = '$1<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$2">$2</a>$3';
	  // Other pages included in comments or code sections
	  
	  autolinkRegexTemplate = /((?:[^{]|^)\{{2}\s*(?:(?:[Ss][Uu][Bb][Ss][Tt]|[Mm][Ss][Gg]|[Mm][Ss][Gg][Nn][Ww])\s*:)?\s*)([^[\]{}|:<>\n]+)(\||}{2}|:)/gm;
	  autolinkRegexSubstTemplate = '$1<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/Template:$2">$2</a>$3';
	  // Templates in comments or code sections	  

	  autolinkRegexWlink1 = /\[{2}\s*([^[\]{}|<>\n]+?)\s*\|\s*(.+?)\s*\]{2}/g;
      autolinkRegexSubstWlink1 = '<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$1">$2</a>';
	  // Wikilinks in code sections, with label
	  
	  autolinkRegexWlink2 = /\[{2}\s*([^[\]{}|<>\n]+?)\s*\|?\s*\]{2}/g;
      autolinkRegexSubstWlink2 = '<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$1">$1</a>';
	  // Wikilinks in code sections, without label
	  
	  autolinkActivateHTML = true;
	  // Activate some HTML (inline) and wikicode for bold and italic

    }

    autolinkRegexInternalURL = /([^=])('|"|\s)((?:\/?w\/index\.php\?|\/?wiki\/)[\w._\/\\~%\-+&#?!=()@:]+)\2/g;
    // External links (no wikicode, under wgServer)

    autolinkRegexImportScript = /([Ii]mport[Ss]cript(?:<span class="br0">)?\((?:<\/span><span class="st0">)?)('|")([^[\]{}|<>\n]+?)(\2(?:<\/span><span class="br0">)?\)(?:<\/span>)?)/g;
    // ImportScript

/*   ---------------------------------------------------------------------------------------------- */

    for (i=0; i<autolinkTargetDiv.length; i++) {

       for (j=0; j<autolinkTargetDiv[i].length; j++) {

			var autolinkContent = autolinkTargetDiv[i][j].innerHTML;

			autolinkContent = autolinkContent.replace(/&lt;/g, '&shy;<&shy;');
			autolinkContent = autolinkContent.replace(/&gt;/g, '&shy;>&shy;');
			// &amp;lt; to &amp;shy;<&amp;shy; and &amp;gt; to &amp;shy;>&amp;shy; (&amp;shy; is a marker)

			autolinkContent = autolinkContent.replace(/&amp;/g, '&');
			// &amp;amp; to &
			
			/* ----------------------------------------------------------------------------------- */

			autolinkContent = autolinkContent.replace(autolinkRegexTl, '$1<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/Template:$2">$2</a>');
			// For {{tl}}: make his argument into link

			autolinkContent = autolinkContent.replace(autolinkRegexURL, '$1<a class="external autolink" style="color:' + autolinkColor + '" href="$2">$2</a>'); 
			// Parse inactive external links (no wikicode)

			autolinkContent = autolinkContent.replace(autolinkRegexURLinWcodeWoLabel, autolinkRegexSubstinWcodeWoLabel);
			// Make external links in wikicode without label into links


			autolinkContent = autolinkContent.replace(autolinkRegexURLinWcodeWithLabel, autolinkRegexSubstinWcodeWithLabel);
			// Make external links in wikicode with label into links
			
			autolinkContent = autolinkContent.replace(autolinkRegexOtherPages, autolinkRegexSubstOtherPages);
			// Make other pages included code into links

			autolinkContent = autolinkContent.replace(autolinkRegexTemplate, autolinkRegexSubstTemplate);
			autolinkContent = autolinkContent.replace(/href\="\/wiki\/Template\:#/g, 'href="/wiki/Help:');
			// Make template code into links

			autolinkContent = autolinkContent.replace(autolinkRegexWlink1, autolinkRegexSubstWlink1);
			autolinkContent = autolinkContent.replace(autolinkRegexWlink2, autolinkRegexSubstWlink2);
			// Make wikilink code into links

			autolinkContent = autolinkContent.replace(autolinkRegexInternalURL, '$1$2<a class="external autolink" style="color:' + autolinkColor + '" href="' + mw.config.get('wgServer') + '$3">$3</a>$2');
			// Parse inactive external links (no wikicode, under wgServer)

			autolinkContent = autolinkContent.replace(autolinkRegexImportScript, '$1$2<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/$3">$3</a>$4');
			// Parse ImportScript

			/* ----------------------------------------------------------------------------------- */
			
			autolinkContent = autolinkContent.replace(/&shy;<&shy;/g, '&lt;');
			autolinkContent = autolinkContent.replace(/&shy;>&shy;/g, '&gt;');
			// &amp;shy;<&amp;shy; to &amp;lt; and &amp;shy;>&amp;shy; to &amp;gt; (revert)
			
			if (autolinkActivateHTML) {
		 
				autolinkContent = autolinkContent.replace(/&lt;(span|b|i|strong|small|tt|del|s|u|sub|sup)&gt;(.*?)&lt;\/(\1)&gt;/g, '<$1>$2</$3>');
				autolinkContent = autolinkContent.replace(/([^']|^)'{3}(.+?)'{3}([^']|$)/gm, '$1<b>$2</b>$3');
				autolinkContent = autolinkContent.replace(/([^']|^)'{2}(.+?)'{2}([^']|$)/gm, '$1<i>$2</i>$3');
			
                                if (autolinkCrono || autolinkEdit)
                                	autolinkContent = autolinkContent.replace(/<i>(.*?)<\/i>/g, '<span title="italic" style="border: 1px solid silver; padding: 2px;">$1</span>');
                                // I'm in a comment field (italic)

				}

                        if (autolinkDiff && autolinkParseLink) {
                        	autolinkContent = autolinkContent.replace(/<a [^>]+><\/a>/g, ''); // Clean
                                autolinkContent = autolinkContent.replace(/([^\[]|^)\[\s*(<a [^>]+>)(?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+(<\/a>)\s+([^\]\n]+)\]/gm, '$1$2$4$3');
                                autolinkContent = autolinkContent.replace(/([^\[]|^)\[\s*(<a [^>]+>)((?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+)(<\/a>)\s*\]/gm, '$1$2$3$4');
                        }

			autolinkTargetDiv[i][j].innerHTML = autolinkContent; // Write it back

       }

    }

});

// [[Category:Wikipedia scripts|Autolink]]