Jump to content

User:Lenore/autolink.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Lenore (talk | contribs) at 21:03, 22 May 2010 (correct color of templates in diff pages). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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]]

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

addOnloadHook (function () {

    var autolinkCronoSpecial = wgCanonicalSpecialPageName == "Recentchanges" || /*
    */ wgCanonicalSpecialPageName == "Watchlist" || /*
    */ wgCanonicalSpecialPageName == "Recentchangeslinked" || /*
    */ wgCanonicalSpecialPageName == "Newpages" || /*
    */ wgCanonicalSpecialPageName == "Log" || /*
    */ wgCanonicalSpecialPageName == "Contributions";
    // Special crono pages where this script is enabled

    if ((typeof(autolinkMySpecialPage) != "undefined"))
       autolinkCronoSpecial = autolinkCronoSpecial || wgPageName == autolinkMySpecialPage;

    if (wgCanonicalNamespace == "Special" && !autolinkCronoSpecial) {

       return; // Disabled in the other special pages

    }

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

       autolinkParseLink = true; // Parse external links in all cases

    }

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

    var autolinkCrono = location.href.indexOf('&action=history') != -1 || autolinkCronoSpecial;
    // It says if I'm in a history page

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

    var autolinkEdit = location.href.indexOf('&action=edit') != -1 || location.href.indexOf('&action=submit') != -1;
    // It says if I'm in an edit or submit page

    var autolinkTargetDiv = [];

    if (autolinkDiff) {

       autolinkTargetDiv[0] = document.getElementsByClassName('diff');
       autolinkTargetDiv[1] = document.getElementsByClassName('firstrevisionheader');

    }
    
    else if (autolinkCrono || autolinkEdit)
       autolinkTargetDiv[0] = document.getElementsByClassName('comment');

    else {

       autolinkTargetDiv[0] = document.getElementsByTagName('pre');
       autolinkTargetDiv[1] = document.getElementsByTagName('tt');
       autolinkTargetDiv[2] = document.getElementsByTagName('code');
       autolinkTargetDiv[3] = document.getElementsByTagName('source');

    }

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

    var autolinkRegexURLinWcodeWoLabel;
    var autolinkRegexURLinWcodeWithLabel;

    var autolinkRegexURL;
    var autolinkRegexWlink;
    var autolinkRegexOtherPages;
    var autolinkRegexTl;
    var autolinkRegexTemplate;
    var autolinkRegexInternalURL;

    var autolinkRegexImportScript;

    var autolinkRegexCorrectNs;

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

    if (autolinkCrono || autolinkEdit) {

	  autolinkColor = ''; // Link color in history pages

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

      autolinkRegexURLinWcodeWithLabel = /([^\[])\[{1}\s*((?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+)\s+([^\]\n]+)\]{1}/g;
      autolinkRegexSubstinWcodeWithLabel = '$1<a class="external autolink" style="color:' + autolinkColor + '" href="$2">$3</a>';
      // External links in history pages, wikicode with label (the URL will not be visible)
	  
	  autolinkRegexTemplate = /((?:[^{]|^)\{{2}\s*(?:[Ss][Uu][Bb][Ss][Tt]:|[Mm][Ss][Gg]:|[Mm][Ss][Gg][Nn][Ww]:)?\s*)([^[\]{}|<>\n]+)(\||}{2})/gm;
	  autolinkRegexSubstTemplate = '$1<a class="autolink" style="color:' + autolinkColor + '" href="/wiki/Template:$2">$2</a>$3';
	  // Templates in history pages	  

    } else {

       autolinkRegexURLinWcodeWoLabel = /(\[{1}\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*)((?:https?|ftps?):\/\/[\w._\/\\~%\-+&#?!=()@:]+)((?:<\/span>)?(?:<span class="diffchange">)?)([\w._\/\\~%\-+&#?!=()@:]*)((?:<\/span>)?(?:<span class="diffchange">)?)([\w._\/\\~%\-+&#?!=()@:]*)([^\]\n]*\]{1})/g;
	   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 other pages, wikicode without label

       autolinkRegexURLinWcodeWithLabel = autolinkRegexURLinWcodeWoLabel;
	   autolinkRegexSubstinWcodeWithLabel = autolinkRegexSubstinWcodeWoLabel;
       // External links in other pages, wikicode with label

    }

    autolinkRegexTemplate = /((?:[^{]|^)\{{2}\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*(?:[Ss][Uu][Bb][Ss][Tt]:|[Mm][Ss][Gg]:|[Mm][Ss][Gg][Nn][Ww]:)?\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

    autolinkRegexWlink = /(\[{2}\s*(?:<\/span>)?\s*(?:<span class="diffchange">)?\s*)([^[\]{}|<>\n]+)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|<>\n]*)((?:<\/span>)?(?:<span class="diffchange">)?)([^[\]{}|<>\n]*)((?:[^\]\n]|\][^\]])*\]{2})/g;
	autolinkRegexSubstWlink = '$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

    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

    autolinkRegexCorrectNs = /(href="\/wiki\/)Template(:(?:[Dd]iscussion[ei] ?)?(?:[Ss]peciale?|[Ww](?:ikipedia|P)|[Tt]emplate|[Uu](?:ser|tente)|[Pp]ortale?|[Pp]rogetto)?(?: ?[Tt]alk)?")/g;
    // Correct link to Template:Namespace

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

    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;');
          // &lt; to &shy;<&shy; and &gt; to &shy;>&shy; (&shy; is needed to not activate HTML)

          autolinkContent = autolinkContent.replace(/&amp;/g, '&');
          // &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

          if (autolinkParseLink == true || !autolinkDiff) { 
          // Qui vanno tutte le sostituzioni fatte anche dal wikEd nelle diff

             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(autolinkRegexURL,
       '$1<a class="external autolink" style="color:' + autolinkColor + '" href="$2">$2</a>'); 
             // Parse inactive external links (no wikicode)

             autolinkContent = autolinkContent.replace(autolinkRegexWlink,
       autolinkRegexSubstWlink);
             // Make wikilink 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(autolinkRegexInternalURL,
    '$1$2<a class="external autolink" style="color:' + autolinkColor + '" href="' + 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(autolinkRegexCorrectNs,
    '$1Help$2');
          // Correct link to Template:Namespace

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

       }

    }

});

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