phpBB User Hide engl

Hide posts of the selected users on any phpBB system.

当前为 2014-10-27 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name phpBB User Hide engl
  3. // @description Hide posts of the selected users on any phpBB system.
  4. // @exclude
  5. // @version 0.0.1.20141027080036
  6. // @namespace https://greasyfork.org/users/6356
  7. // ==/UserScript==
  8.  
  9. (function() {
  10. // Get stored hidden users from cookie
  11. var users = [];
  12. var cookieName = "phpUserHide";
  13. for (var i = 0; i < document.cookie.split('; ').length; i++) {
  14. var oneCookie = document.cookie.split('; ')[i].split('=');
  15. if (oneCookie[0] == cookieName) {
  16. users = oneCookie[1].split(', ');
  17. break;
  18. }
  19. }
  20.  
  21. // Cursor functions
  22. var curPointer = function(event) {
  23. event.target.style.cursor = 'pointer';
  24. event.preventDefault();
  25. };
  26. var curDefault = function(event) {
  27. event.target.style.cursor = 'default';
  28. event.preventDefault();
  29. };
  30.  
  31. // Add or remove a user from the cookie
  32. var addRemoveUser = function(event) {
  33. // Parse current cookie
  34. for(j = 0; j < document.cookie.split('; ').length; j++ ) {
  35. var oneCookie = document.cookie.split('; ')[j].split('=');
  36. if (oneCookie[0] == cookieName) {
  37. users = oneCookie[1].split(', ');
  38. break;
  39. }
  40. }
  41. var user = escape(event.target.nextSibling.innerHTML)
  42. notFound = true;
  43. for (var j = 0; j < users.length; j++) {
  44. if (users[j] == user) {
  45. users.splice(j, 1);
  46. notFound = false;
  47. }
  48. }
  49. if (notFound)
  50. users.push(user);
  51. if (users.length > 0) {
  52. var date = new Date();
  53. var days = 365;
  54. date.setTime(date.getTime() + (days*24*60*60*1000));
  55. var expires = '; expires=' + date.toGMTString();
  56. var value = users.join(', ');
  57. document.cookie = cookieName + '=' + value + expires + '; path=/';
  58. } else {
  59. document.cookie = cookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/';
  60. }
  61. window.alert(unescape(user) + ' has been ' + (notFound ? 'added to' : 'removed from')
  62. + ' your hide list\n'
  63. + 'You must refresh the page to view the changes.');
  64. event.preventDefault();
  65. };
  66. // Toggle display of user's post
  67. var togglePost = function(event) {
  68. var displayState = event.target.getAttribute('displaystate');
  69. if (displayState == 'none')
  70. displayState = '';
  71. else
  72. displayState = 'none';
  73. event.target.setAttribute('displaystate', displayState);
  74.  
  75. containingRow = event.target.parentNode.parentNode;
  76. var innerTags = containingRow.getElementsByTagName('*');
  77. for (var i = 0; i < innerTags.length; i++) {
  78. var tagClass = innerTags[i].getAttribute('class');
  79. if (tagClass == 'postbody' || tagClass == 'postsig'
  80. || tagClass == 'postdetails' || innerTags[i].tagName == 'TABLE')
  81. innerTags[i].style.display = displayState;
  82. }
  83. event.preventDefault();
  84. };
  85. // Toggle display of user's quote
  86. var toggleQuote = function(event) {
  87. var displayState = event.target.getAttribute('displaystate');
  88. if (displayState == 'none')
  89. displayState = 'table-row';
  90. else
  91. displayState = 'none';
  92. event.target.setAttribute('displaystate', displayState);
  93.  
  94. // Jump to parent row
  95. var containingRow = event.target.parentNode.parentNode.parentNode.parentNode.nextSibling;
  96. // Find containing row
  97. while (containingRow.nodeType != 1)
  98. containingRow = containingRow.nextSibling;
  99. containingRow.style.display = displayState;
  100.  
  101. event.preventDefault();
  102. };
  103.  
  104. // Find all the usernames in the page
  105. var results = document.evaluate("//span[@class='name']/b|//span[@class='name']/strong", document, null,
  106. XPathResult.ANY_TYPE, null);
  107. var resultNodes = [];
  108. var aResult;
  109. while (aResult = results.iterateNext())
  110. resultNodes.push(aResult);
  111.  
  112. // Loop through every user post on the page
  113. for (var i in resultNodes) {
  114. var containingRow = resultNodes[i].parentNode.parentNode.parentNode;
  115. // Format whitespace
  116. var user = escape(resultNodes[i].innerHTML);
  117.  
  118. // Flag whether the user is in our hide list
  119. var notFound = true;
  120. for (var j = 0; j < users.length; j++) {
  121. if (users[j] == user) {
  122. notFound = false;
  123. }
  124. }
  125.  
  126. // Add relevant event handlers to user's name and a toggler node
  127. var toggler = document.createElement('span');
  128. toggler.setAttribute('title', "click to add or remove this user from your hide list");
  129. toggler.appendChild(document.createTextNode('[X] '));
  130. toggler.style.fontSize = "7pt";
  131. toggler.addEventListener('mouseover', curPointer, true);
  132. toggler.addEventListener('mouseout', curDefault, true);
  133. toggler.addEventListener('click', addRemoveUser, true);
  134.  
  135. resultNodes[i].parentNode.insertBefore(toggler, resultNodes[i]);
  136.  
  137. // If this user isn't in our hide list, skip to the next user
  138. if (notFound)
  139. continue;
  140.  
  141. // Find the first element node (td) in the containing row
  142. var elem = containingRow.firstChild;
  143. while (elem.nodeType != 1)
  144. elem = elem.nextSibling;
  145.  
  146. // Create a span to control toggling
  147. var span = document.createElement('span');
  148. span.appendChild(document.createTextNode('Toggle Display'));
  149. span.appendChild(document.createElement('br'));
  150. span.setAttribute('class', 'gensmallbold');
  151. span.style.textDecoration = 'underline';
  152. span.setAttribute('displaystate', 'none');
  153. span.addEventListener('mouseover', curPointer, true);
  154. span.addEventListener('mouseout', curDefault, true);
  155. span.addEventListener('click', togglePost, true);
  156.  
  157. // Insert the span after the username and before the <br>
  158. elem.insertBefore(span, elem.firstChild.nextSibling.nextSibling);
  159. // Insert a <br> after the username and before the span
  160. elem.insertBefore(document.createElement('br'), elem.firstChild.nextSibling.nextSibling);
  161.  
  162. var innerTags = containingRow.getElementsByTagName('*');
  163. for (var i = 0; i < innerTags.length; i++) {
  164. var tagClass = innerTags[i].getAttribute('class');
  165. if (tagClass == 'postbody' || tagClass == 'postsig'
  166. || tagClass == 'postdetails' || innerTags[i].tagName == 'TABLE')
  167. innerTags[i].style.display = 'none';
  168. }
  169. }
  170.  
  171. // Find all the usernames quoted in the page
  172. var results = document.evaluate("//td[@class='quote']/parent::*/preceding-sibling::*/td/span/b|"
  173. + "//td[@class='quote']/parent::*/preceding-sibling::*/td/span/strong", document, null,
  174. XPathResult.ANY_TYPE, null);
  175. var resultNodes = [];
  176. var aResult;
  177. while (aResult = results.iterateNext())
  178. resultNodes.push(aResult);
  179.  
  180. // Loop through every user quote on the page
  181. for (var i in resultNodes) {
  182. var containingRow = resultNodes[i].parentNode.parentNode.parentNode.nextSibling;
  183. while (containingRow.nodeType != 1)
  184. containingRow = containingRow.nextSibling;
  185.  
  186. // Find username
  187. var usermatch = resultNodes[i].innerHTML.match(/(.*) wrote:$/);
  188. if (usermatch)
  189. var user = escape(usermatch[1]);
  190. else
  191. continue;
  192.  
  193. // Flag whether the user is in our hide list
  194. var notFound = true;
  195. for (var j = 0; j < users.length; j++) {
  196. if (users[j] == user) {
  197. notFound = false;
  198. }
  199. }
  200.  
  201. // If this user isn't in our hide list, skip to the next user
  202. if (notFound)
  203. continue;
  204.  
  205. // Create a span to control toggling
  206. var span = document.createElement('span');
  207. span.appendChild(document.createElement('br'));
  208. span.appendChild(document.createTextNode('Toggle Display'));
  209. span.setAttribute('class', 'gensmallbold');
  210. span.style.textDecoration = 'underline';
  211. span.setAttribute('displaystate', 'none');
  212. span.addEventListener('mouseover', curPointer, true);
  213. span.addEventListener('mouseout', curDefault, true);
  214. span.addEventListener('click', toggleQuote, true);
  215.  
  216. resultNodes[i].appendChild(span);
  217. // Hide the quote
  218. containingRow.style.display = 'none';
  219. }
  220.  
  221. })();