MediaWiki:Gadget-HideAds.js

From Zelda Dungeon Wiki
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl+F5 or Ctrl+R (Command+R on a Mac)
  • Google Chrome: press Ctrl+Shift+R (Command+Shift+R on a Mac)
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl+F5
  • Konqueror: click Reload or press F5
  • Opera: clear the cache in Tools → Preferences
// ==UserScript==
// @name          Disable Text Ads
// @namespace     http://www.fibble.org/
// @description	  Disables inline text ads from Vibrant Media (IntelliTXT), AdBrite, Infolicious (lingoSpot), Kontera, Linkworth, EchoTopic, Targetpoint (defunct?), MediaText (defunct), ResultLinks, Chitika and Infolinks.
// @version 9.0
// @include       http://*
// ==/UserScript==

var disableTextAds = {

  blockAds: function(elt) {
    var target = elt;
    var childNode;
    
    switch(elt.nodeName.toLowerCase()) {

      // EchoTopic and ResultLinks wrap their inserted links in a <nobr> tag.
      case 'nobr':
      if (elt.firstChild.getAttribute('class') == "tfTextLink") { //EchoTopic
        childNode = elt.firstChild.firstChild;
      } else if (elt.firstChild.hasAttribute('id') && elt.firstChild.getAttribute('id').search(/RLLINK/) >= 0) { //ResultLinks
        childNode = elt.firstChild.firstChild;        
      }
      
      break;
      

      // AdBrite check
      case 'ispan':
      if (elt.hasAttribute('id')) {
        if (match = elt.getAttribute('id').match(/AdBriteInlineAd_(.*)/i)) {
          childNode = document.createTextNode(match[1]);
        }
      }
      break;
      
      // Chitika
      case 'span':
      if (elt.firstChild.nodeName.toLowerCase() == 'a') {
        if (elt.getAttribute('class') != null && elt.getAttribute('class').search(/lx-link/) >= 0) {
          childNode = elt.firstChild.firstChild;
          break;          
        }
      }

      // The rest of the networks
      case 'a':

      var a_class = elt.getAttribute('class');

      switch(a_class) {
        // Infolinks
        case 'IL_LINK_STYLE':
          childNode = elt.firstChild;
          break;

        // Kontera
        case 'kLink':
          childNode = disableTextAds.findKonteraText(elt);
          break;        
      }
      
      // IntelliTXT
      if (elt.hasAttribute('itxtdid')) {
        childNode = elt.firstChild;
        break;
      }

      // Mediatext
      if (elt.hasAttribute('c4fadvertpos')) {
        childNode = elt.firstChild;
        break;
      }

      // Targetpoint Check
      if (elt.hasAttribute('tpi')) {
        childNode = elt.firstChild;
        break;
      }			



      // Old AdBrite check - not sure if this is still relevant
      if (elt.hasAttribute('id')) {
        if (match = elt.getAttribute('id').match(/AdBriteInlineAd_(.*)/i)) {
          childNode = document.createTextNode(match[1]);
        }
        break;
      }

      // Can't be too cautious.
      break;
      } // case


      // Grab the inner text and replace the inserted tag with it
      if (childNode) {
        target.parentNode.replaceChild(childNode, target);
      }
    },

    findKonteraText: function(elt) {
      // kontera triply-nests the original content: 
      // <a><font><span>text</span><span>here</span></font></a>

      var kTextNodes = document.evaluate("font/span[@class='kLink']/text()", elt, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
      var kTextNode = kTextNodes.iterateNext();
      var content = '';
      while(kTextNode) {
        content += kTextNode.data + ' ';
        kTextNode = kTextNodes.iterateNext();
      }

      return document.createTextNode(content.substring(0,content.length-1));
    },

    blockKontera: function(elt) {
      var target = elt;
      if (elt.nodeName.toLowerCase() == 'a' && elt.getAttribute('class') == 'kLink') {
        var childNode = disableTextAds.findKonteraText(elt);
      }

      // Grab the inner text and replace the inserted tag with it
      if (childNode) {
        target.parentNode.replaceChild(childNode, target);
      }
    }
  };

  document.addEventListener('DOMNodeInserted', function(event) { disableTextAds.blockKontera(event.target); }, true);

  // Handle the cases that don't trigger our DOMNodeInserted hook.
//  window.addEventListener("load", function(event) { 

    // According to LingoSpot, setting this global variable will disable all ads.  Doesn't actually see to have any effect.
//    unsafeWindow.LINGOSPOT_DISABLED = true;

    // Thanks to Descriptor for yet another way to block LingoSpot; doesn't on every page, unfortunately.
    // Still, it should reduce runtime for pages where it works.
//    unsafeWindow.tf_maxKeywords = 0;

    // Unfortunately, Linkworth has decided to remove their container div, so we're stuck crawling the entire document body.  Meh.
//    var links = document.evaluate("//a[@class='lw_cad_link' or @itxtdid]", document.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
//    for (var i=0; i<links.snapshotLength; i++) { 
//      var anchor = links.snapshotItem(i);
//      anchor.parentNode.replaceChild(document.createTextNode(anchor.textContent), anchor);
//    }
//  }, false);