thread win

sort comments by favorites

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

  1. // ==UserScript==
  2. // @name thread win
  3. // @namespace bperkins
  4. // @description sort comments by favorites
  5. // @include http://www.metafilter.com/*
  6. // @include http://ask.metafilter.com/*
  7. // @include http://metatalk.metafilter.com/*
  8. // @version 1.5
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12.  
  13. var savedstuff;
  14.  
  15. var winNode;
  16. var unwinNode;
  17. var copy;
  18.  
  19.  
  20.  
  21. function sortFav(a,b) {
  22.  
  23.  
  24.  
  25. return (-(getFav(a)-getFav(b)));
  26.  
  27. }
  28. function getFav(a)
  29. {
  30. var toplevel = a.getElementsByTagName("SPAN");
  31. var notloggedin = 0;
  32.  
  33. if (toplevel.length ==0 ) {
  34. return 1;
  35. }
  36.  
  37. var bylinespan = toplevel[0].getElementsByTagName("SPAN");
  38.  
  39. if (bylinespan.length ==0) {
  40. notloggedin =1
  41. bylinespan = a.getElementsByTagName("SPAN");
  42. }
  43. if (bylinespan.length ==0 ) {
  44. return 1;
  45. }
  46. var favspan;
  47.  
  48. if (bylinespan[0].getAttribute("class") == "staffp" ) {
  49. favspan = bylinespan[2].getElementsByTagName("SPAN");
  50. } else {
  51. favspan = bylinespan[0].getElementsByTagName("SPAN");
  52. }
  53.  
  54. if (favspan.length ==0) {
  55. //No extra span layer in MeTalk
  56. favspan=bylinespan
  57. }
  58.  
  59. var fava = favspan[0].getElementsByTagName("A");
  60.  
  61.  
  62.  
  63.  
  64. var fav =0;
  65. re = new RegExp("\\d+")
  66.  
  67.  
  68. if (fava.length > 0 &&fava[0] != undefined ) {
  69. var m;
  70. if (notloggedin) {
  71. if (fava.length >2) {
  72. m=re.exec(fava[2].innerHTML);
  73. } else {
  74. return 1
  75. }
  76. } else {
  77. m=re.exec(fava[0].innerHTML);
  78. }
  79. fav=m[0];
  80.  
  81. }
  82.  
  83.  
  84. return (1*fav)+1;
  85.  
  86. }
  87.  
  88.  
  89.  
  90.  
  91. function unwin () {
  92.  
  93. copy.replaceChild(winNode,unwinNode);
  94.  
  95. var parent=getCommentParent ();
  96. var newstuff = parent.childNodes;
  97. while ( newstuff.length >0 ) {
  98. parent.removeChild(newstuff[0]);
  99. }
  100.  
  101. for (var j = 0; j < savedstuff.length; j++) {
  102. parent.appendChild(savedstuff[j]);
  103. }
  104. }
  105.  
  106. function getCommentParent () {
  107. var snaps = ["//div[@id='posts']","//div[@id='page']","//body[@id='body']"];
  108.  
  109. for ( var snap in snaps ) {
  110.  
  111. page = document.evaluate(
  112. snaps[snap],
  113. document,
  114. null,
  115. XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  116. null);
  117.  
  118.  
  119. for (var i = 0; i < page.snapshotLength; i++) {
  120. stuff = page.snapshotItem(i).childNodes;
  121. for (var j = 0; j < stuff.length; j++) {
  122.  
  123. if (stuff[j].nodeName.toUpperCase()=="DIV" &&
  124. (stuff[j].getAttribute("class") == "comments" ||
  125. stuff[j].getAttribute("class") == "comments bestleft"||
  126. stuff[j].getAttribute("class") == "comments best")) {
  127. return page.snapshotItem(i);
  128. }
  129. }
  130. }
  131. }
  132.  
  133. alert ("threadwin: failed to get comment parent");
  134.  
  135. }
  136.  
  137.  
  138.  
  139.  
  140. function threadwin () {
  141.  
  142. copy.replaceChild(unwinNode,winNode);
  143.  
  144.  
  145. var parent= getCommentParent();
  146. var stuff = parent.childNodes;
  147. var commentidxs = new Array;
  148. var comments = new Array;
  149. var objects = new Array ;
  150. savedstuff=new Array;
  151.  
  152. var k=0;
  153. var favs =""
  154.  
  155. for (var j = 0; j < stuff.length; j++) {
  156. if (stuff[j].nodeName.toUpperCase()=="DIV" &&
  157. (stuff[j].getAttribute("class") == "comments" ||
  158. stuff[j].getAttribute("class") == "comments bestleft"||
  159. stuff[j].getAttribute("class") == "comments best")) {
  160. commentidxs.push(j);
  161. comments.push(stuff[j]);
  162. }
  163. objects.push(stuff[j]);
  164. savedstuff.push(stuff[j]);
  165.  
  166. }
  167.  
  168. comments.sort(sortFav);
  169.  
  170. for (var j = 0; j < comments.length; j++) {
  171.  
  172. objects[commentidxs[j]]=comments[j];
  173.  
  174. }
  175.  
  176.  
  177. while ( stuff.length >0 ) {
  178.  
  179. parent.removeChild(stuff[0]);
  180. }
  181.  
  182.  
  183. for (var j = 0; j < objects.length; j++) {
  184. parent.appendChild(objects[j]);
  185. }
  186.  
  187. }
  188.  
  189.  
  190. res = document.evaluate(
  191. "//div[@class='copy']",
  192. document,
  193. null,
  194. XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  195. null);
  196.  
  197. copy=res.snapshotItem(0)
  198.  
  199. if (copy.parentNode.id == "page"
  200. //newcode
  201. ||copy.parentNode.id == "posts" ) {
  202.  
  203.  
  204. winNode = document.createElement('a');
  205. winNode.innerHTML = "<small>[threadwin]</small> ";
  206. winNode.href ="#";
  207. winNode.addEventListener("click", threadwin, true);
  208. copy.appendChild( winNode );
  209. unwinNode = document.createElement('a');
  210. unwinNode.innerHTML = "<small>[unwin]</small>";
  211. unwinNode.href ="#";
  212. unwinNode.addEventListener("click", unwin, true);
  213.  
  214. }
  215.