Troll Blocker 2

By Mittineague Last update Nov 12, 2006 — Installed 329 times.
// ==UserScript==
// @name          Troll Blocker 2
// @namespace     http://www.mittineague.com/dev/
// @description   blocks out annoying troll posts
// @include       http://massdems.blogspot.com/*
// ==/UserScript==

/*
 * Troll Blocker 2  -  trollblocker2.user.js version 1.1
 * Author: Mittineague <N/A> (N/A) http://www.mittineague.com
 *
 * Change Log
 * version 1.0 - Nov 11, 2006
 * version 1.1 - November 15, 2006	// added (function(){ [CODE] })();
 *				// changed event capture to bubble for Opera compatibility
 * 
 * script hosted at http://www.mittineague.com/dev/trollblocker2.user.js
 * and can be found at http://userscripts.org/scripts/show/6324
 *
 * This script was created specifically for the
 * Massachusetts Democratic Party
 * blogs at massdems.blogspot.com
 * With special thanks to "Anonymous"
 * for your encouragement
 *
 * The blogs use these DOM mark-ups
 * ........
 * <dt class="comment-data"                             |
 *   <a></a> // "name" anchor tag                       |
 *   text - "At"                                        |
 *   <a>Time and Date</a> // link to above anchor tag   |
 *   text - ","                                         |
 ******* Beginning of Variable DOM Section              |
 * VARIATION 1 : anonymous user comment                 |
 *   text - "Anonymous said..."                         | The dt
 * VARIATION 2 : non-registered user comment            | section is
 *   <span>                                             | replaced with a
 *      [USERS NAME HERE]                               | new dt saying
 *   </span>                                            | that it has
 *   text - " said..."                                  | been replaced
 * VARIATION 3 : registered user comment                |
 *   <a rel="nofollow">                                 |
 *     [USERS NAME HERE]                                |
 *   </a>                                               |
 *   text - " said..."                                  |
 ******* End of Variable DOM Section                    |	
 * </dt>                                                |_______________
 * <dd class="comment-body">                            | The dd section
 *   [CONTENT HERE]                                     | is replaced with
 * </dd>                                                | a new empty dd
 *
 * CURRENT SCRIPT ACTIONS
 * script replaces <dt> and <dd> (with it's contents) of known trolls with new <dt> <dd>
 * script inserts <span> after each user before closing </dt> tag on all posts
 * script replaces <dt> and <dd> (with it's contents) of newly blocked trolls with new <dt> <dd>
 *
 * Tired of seeing known troll posts on page load?
 * Add known trolls to array sequentially starting with "0"
 * Names are Case sensitive
 * ie. "mittineague" is not the same as "Mittineague", or "MITTINEAGUE"
 * knownTrolls = new Array();
 * knownTrolls[0] = "first known troll's name";
 * knownTrolls[1] = "second known troll's name";
 * knownTrolls[2] = "third known troll's name";
 * knownTrolls[3] = "fourth known troll's name";
 * etc. etc.
 */

(function(){

/* add known trolls beneath the following array as shown above
 * names added here will be filtered from all threads
 * names must be removed from array to see posts again
 */
knownTrolls = new Array();


var dataItems, thisDataItem, userName, thisAttrs;
subNodes = new Array();
var newItems, thisNewItem;

  dataItems = document.evaluate(
    "//dt[@class='comment-data']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);

  for (var i = 0; i < dataItems.snapshotLength; i++)
  {
  	thisDataItem = dataItems.snapshotItem(i);
	if(thisDataItem.innerHTML.search(/Anonymous/gi) != -1 )
	{
		userName = "Anonymous";
	}

	subNodes = thisDataItem.childNodes;
	for(var j = 0; j < subNodes.length; j++)
	{
		if(subNodes[j].nodeName == "SPAN")
		{
			userName = subNodes[j].innerHTML;
		}
		else if(subNodes[j].nodeName == "A")
		{
			thisAttrs = subNodes[j].attributes;
			for(var k = 0; k < thisAttrs.length; k++)
			{
				if(thisAttrs[k].value == "nofollow")
				{
					userName = subNodes[j].innerHTML;
				}
			}
		}
	}

    var newSpan = document.createElement('span');
    var blockText = document.createTextNode(" - Troll??  Block " + userName);
    newSpan.appendChild(blockText);
    newSpan.style.color = "#811400";
    newSpan.style.textDecoration = "underline";
    newSpan.style.cursor = "pointer";
    newSpan.style.marginLeft = "2em";
    newSpan.setAttribute("posterName",userName);
    newSpan.addEventListener(
    "mouseover",
    function() {
    this.style.textDecoration = "none";
    },
    false);
    newSpan.addEventListener(
    "mouseout",
    function() {
    this.style.textDecoration = "underline";
    },
    false);
    newSpan.addEventListener(
    "click",
    function() {
    var newName = this.getAttribute("posterName");
    hideNewTroll(newName);
    },
    false);
    thisDataItem.appendChild(newSpan);

    /* hide known Trolls */
    for (var m = 0; m < knownTrolls.length; m++)
    {
    	if ( userName == knownTrolls[m] )
 	{
        	var newDT = document.createElement('dt');
        	var newDD = document.createElement('dd');
	        newDT.style.marginTop = "2em";
        	newDT.style.marginBottom = "2em";
	        newDT.style.color = "#f00";
        	var newText = document.createTextNode("All posts by " + knownTrolls[m] + " have been Blocked, to view posts by this person you must edit the trollblocker2.user.js file.");
	        newDT.appendChild(newText);
        	var atNode = thisDataItem; // DT
		var wsNode = atNode.nextSibling; // #text (whitespace)
	        var postNode = wsNode.nextSibling; // DD
   		atNode.parentNode.replaceChild(newDD, postNode);
		atNode.parentNode.replaceChild(newDT, atNode);
	}
    }
userName = "";
}

function hideNewTroll(newName){

  newItems = document.evaluate(
  "//span[@posterName ='" + newName + "']",
  document,
  null,
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  null);

  for (var n = 0; n < newItems.snapshotLength; n++) {
    thisNewItem = newItems.snapshotItem(n);
    var replacement = document.createElement('dt');
    var companion = document.createElement('dd');
    replacement.style.marginTop = "2em";
    replacement.style.marginBottom = "2em";
    replacement.style.color = "#f00";
    var newText = document.createTextNode("All posts by " + newName + " have been Blocked on this web page, to view posts by this person, you must Reload this web page.");
    replacement.appendChild(newText);
    var upperNode = thisNewItem.parentNode; // DT
    var textNode = upperNode.nextSibling; // #text (whitespace)
    var commentNode = textNode.nextSibling; // DD
    upperNode.parentNode.replaceChild(companion, commentNode);
    upperNode.parentNode.replaceChild(replacement, upperNode);
  }
}

})();