MaximumPC: Trolls Interpreter / Remover

Translate troll's comments into blah sentences or simply hide them.

  1. // ==UserScript==
  2. // @id MaximumPC-Trolls-Interpreter
  3. // @name MaximumPC: Trolls Interpreter / Remover
  4. // @namespace V@no
  5. // @author V@no
  6. // @description Translate troll's comments into blah sentences or simply hide them.
  7. // @icon data:image/png;base64,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
  8. // @include http://maximumpc.com/*
  9. // @include http://www.maximumpc.com/*
  10. // @version 1.1
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. var list = cookieGet("trolls", "RUSENSITIVESWEETNESS"),
  15. trollHide = Number(cookieGet("trollHide")) ? 1 : 0,
  16. trollSrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMi8yOC8xMZSAjI8AAAA/UExURf///wAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCw0NDQ8PDxAQEBISEhMTExYWFvr6+v////L9RbYAAAABdFJOUwBA5thmAAAAZklEQVQYGY3BWw6CMABFwXtQKLZafJz9r1WaaPgycSb5wwys8KT1DFcPZIeHlgQBZ5jcbUnTByq4oDXpopMDd88JWlCZEEtSKUsHRCUJr1W8iVqTIBeWAirZ4Rdk6A6cWPMBHfLbGzqjB8v8i7F/AAAAAElFTkSuQmCC";
  17.  
  18. list = list.split("+");
  19. if (list[0] === "")
  20. list.splice(0,1);
  21.  
  22. function cookieSet(cookieName, cookieValue, lifeTime)
  23. {
  24. lifeTime = typeof(lifeTime) == "undefined" ? 31536000 : lifeTime;
  25. if (!cookieName)
  26. return;
  27. document.cookie = escape(cookieName) + "=" + escape(cookieValue) +
  28. ";expires=" + (new Date((new Date()).getTime() + (1000 * lifeTime))).toGMTString() + ";path=/";
  29. }
  30.  
  31. function cookieGet(cookieName, d)
  32. {
  33. d = typeof(d) == "undefined" ? null : d;
  34. var cookieJar = document.cookie.split("; ");
  35. for (var x = 0; x < cookieJar.length; x++)
  36. {
  37. var oneCookie = cookieJar[x].split("=");
  38. if (oneCookie[0] == escape(cookieName))
  39. return unescape(oneCookie[1]);
  40. }
  41. return d;
  42. }
  43.  
  44. function censor(a, b, c, d, e)
  45. {
  46. var p = "blah",
  47. r = "",
  48. caps = true,
  49. t,
  50. i,
  51. isStr = isNaN(a.replace(/['`].*/, ''));
  52.  
  53. if ((a.length < 2 && isStr) || (a.length < 5 && a.match(/['`]/) && isStr) || a.match(/^\$?[0-9]+k?/i))
  54. return a;
  55. // return "";
  56. for(i = 0; i < a.length; i++)
  57. if (a[i] == a[i].toLowerCase())
  58. {
  59. caps = false;
  60. break;
  61. }
  62.  
  63. for(i = 0; i < p.length; i++)
  64. {
  65. t = p[i];
  66.  
  67. if (caps || (a.length > i && a[i] != a[i].toLowerCase()))
  68. t = t.toUpperCase();
  69.  
  70. r += t;
  71. }
  72. return r;
  73. }
  74. function toggleTroll(comment, f)
  75. {
  76. //f = 0: orig
  77. //f = 1: troll
  78. //f = 2: toggle
  79. f = typeof(f) == "undefined" ? 2 : f;
  80. if (f == 1 || (f == 2 && comment.innerHTML == comment.origHTML))
  81. {
  82. if (!("trollHTML" in comment))
  83. comment.trollHTML = getText(comment);
  84.  
  85. if (trollHide)
  86. comment.innerHTML = '<img src="' + trollSrc + '" class="trollComment">';
  87. else
  88. comment.innerHTML = comment.trollHTML;
  89. }
  90. else
  91. {
  92. comment.innerHTML = comment.origHTML;
  93. }
  94. }
  95. function getText(obj)
  96. {
  97. var c = obj.childNodes;
  98. for(var i = 0; i < c.length; i++)
  99. {
  100. if (c[i].nodeName == "#text")
  101. c[i].nodeValue = c[i].nodeValue.replace(/(\w+(['`]\w+)?)/g, censor);
  102. else if (c[i].childNodes.length)
  103. getText(c[i]);
  104. }
  105. return obj.innerHTML;
  106. }
  107.  
  108. function checkbox(id, text, checked, callback, p)
  109. {
  110. id = typeof(id) == "undefined" ? null : id;
  111. text = typeof(text) == "undefined" ? "" : text;
  112. checked = typeof(checked) == "undefined" ? false : checked;
  113. callback = typeof(callback) == "undefined" ? function(){} : callback;
  114. p = typeof(p) == "undefined" ? true : p;
  115. var input = document.createElement("input"),
  116. label = document.createElement("label"),
  117. span = document.createElement("div");
  118. input.type = "checkbox";
  119. input.id = id ? id : "c" + Date().getTime();
  120. input.checked = checked;
  121. label.htmlFor = input.id;
  122. label.appendChild(document.createTextNode(text));
  123. span.appendChild(input);
  124. span.appendChild(label);
  125. input.addEventListener("change", callback, p);
  126. return span;
  127. }
  128. //var root = document.getElementById("site-menu").getElementsByTagName("ul")[0],
  129. var root = document.getElementsByClassName("nav-links")[0].getElementsByTagName("ul")[0],
  130. style = document.createElement("style"),
  131. li = root.lastChild.cloneNode(true),
  132. a = li.getElementsByTagName("a")[0],
  133. div = li.getElementsByTagName("div")[0],
  134. divSettings = div.getElementsByTagName("div")[1];
  135.  
  136. style.innerHTML = '.trollComment{cursor:pointer;opacity: 0.4;transform:scaleX(-1)}a[troll="false"]+.troll{opacity: 0.1;transform: scaleX(-1);}.troll{cursor:pointer;margin-left:0.5em;}.trollMenuImg{vertical-align: top;}.trollBox{height: auto; line-height: 1.3em;}';
  137. document.getElementsByTagName("head")[0].appendChild(style);
  138.  
  139. div.getElementsByTagName("div")[0].innerHTML = "";
  140. divSettings.parentNode.className = "menu-pulldown nosubpage";
  141. root.lastChild.className = root.lastChild.className.replace(" last", "");
  142. a.href = "javascript:return void(0);";
  143. a.innerHTML = '<img src="' + trollSrc + '" class="trollMenuImg"> Settings';
  144. divSettings.innerHTML = "";
  145. div.style.width = "auto";
  146. root.appendChild(li);
  147. divSettings.appendChild(checkbox("trollHide", "Hide troll's posts", (trollHide), function(e)
  148. {
  149. trollHide = e.target.checked ? 1 : 0;
  150. cookieSet("trollHide", trollHide);
  151. init();
  152. }, true));
  153.  
  154. //not finished
  155. function makeList()
  156. {
  157. return;
  158. /*
  159. listBox.innerHTML = "";
  160. var a = document.createElement("a"),
  161. box = document.createElement("p");
  162. a.href = "#";
  163. var l = [],
  164. i;
  165. for(i = 0; i < list.length; i++)
  166. l[i] = list[i];
  167. l.sort(function(a, b)
  168. {
  169. return a.toLowerCase().localeCompare(b.toLowerCase());
  170. });
  171. for(i = 0; i < l.length; i++)
  172. {
  173. a = a.cloneNode(true),
  174. box = box.cloneNode(false);
  175. a.innerHTML = l[i];
  176. box.appendChild(a);
  177. listBox.appendChild(box);
  178. }
  179. */
  180. }
  181. /*
  182. img = document.createElement("img");
  183. img.src = trollSrc;
  184. img.className = "troll trollmenu";
  185. // box.className = "trollmenu";
  186. box.appendChild(img);
  187. root.appendChild(box);
  188. */
  189. function isScrolledIntoView(elem)
  190. {
  191. var docViewTop = window.pageYOffset;
  192. var docViewBottom = docViewTop + window.innerHeight;
  193. var elemTop = elem.offsetTop;
  194. var elemBottom = elemTop + elem.offsetHeight;
  195. return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
  196. }
  197. function init()
  198. {
  199. var names = document.evaluate('.//a[@title="View user profile."]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  200. for(var i = 0; i < names.snapshotLength; i++)
  201. {
  202. var name = names.snapshotItem(i),
  203. isTroll = list.indexOf(name.innerHTML) != -1;
  204.  
  205. name.setAttribute("troll", isTroll);
  206.  
  207. var xPathRes = document.evaluate('.//div[@class="content"]', name.parentNode.parentNode.parentNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  208. for(var n = 0; n < xPathRes.snapshotLength; n++)
  209. {
  210. (function()
  211. {
  212. var comment = xPathRes.snapshotItem(n),
  213. _name = name;
  214. if (!("origHTML" in comment))
  215. {
  216. comment.origHTML = comment.innerHTML;
  217. comment.addEventListener("click", function(e)
  218. {
  219. if (comment.innerHTML != comment.origHTML)
  220. toggleTroll(comment);
  221. }, true);
  222. comment.addEventListener("dblclick", function(e)
  223. {
  224. if (_name.getAttribute("troll") == "true")
  225. toggleTroll(comment);
  226. }, true);
  227. }
  228. toggleTroll(comment, isTroll ? 1 : 0);
  229. })();
  230. }
  231. makeList();
  232. if (name.inited)
  233. continue;
  234. name.inited = true;
  235. var img = document.createElement("img");
  236. img.className = "troll";
  237. img.src = trollSrc;
  238. img.addEventListener("click", function(e)
  239. {
  240. var isTroll = list.indexOf(e.target.previousSibling.innerHTML);
  241. if (isTroll != -1)
  242. list.splice(isTroll, 1);
  243. else
  244. list[list.length] = e.target.previousSibling.innerHTML;
  245. cookieSet("trolls", list.join("+"));
  246. var o = e.target.offsetTop - window.scrollY;
  247. init();
  248. window.scrollTo(window.scrollX, e.target.offsetTop - (o));
  249. }, true);
  250. name.parentNode.appendChild(img);
  251. }
  252. }
  253. init();