MeFi Navigator - fixed

Navigate users' comments in Metafilter threads. Fixed version of matthewr script.

当前为 2015-06-30 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name MeFi Navigator - fixed
  3. // @namespace http://www.metafilter.com/
  4. // @description Navigate users' comments in Metafilter threads. Fixed version of matthewr script.
  5. // @include http://*.metafilter.com/*
  6. // @include http://metafilter.com/*
  7. // @include https://*.metafilter.com/*
  8. // @include https://metafilter.com/*
  9. // @grant none
  10. // @version 0.0.1.20150630234118
  11. // ==/UserScript==
  12. if (/.*metafilter\.com\/(\d{1,7}\/|mefi\/|comments\.mefi).*/.test(window.location)) {
  13. var mfn_poster;
  14. var mfn_all = [];
  15. var mfn_div = document.createElement("div");
  16. mfn_preload();
  17. mfn_main(); // don't wait for page load event
  18. }
  19. function mfn_preload() {
  20. mfn_you = mfn_user();
  21. var css = document.createElement("style");
  22. css.setAttribute("type","text/css");
  23. css.innerHTML = "#mfn-dot { padding:0 2px 0 2px;font-size:9pt;line-height:0; } #mfn-arrow { padding:0 2px 0 2px;font-size:10pt;line-height:0;} #mfn-list{padding:0 2px 0 2px;font-size:9pt;line-height:0;} #navigator-list a { -moz-opacity:0.9;background:#666;font-size:8pt;font-family:Arial,sans-serif;border:1px solid #CCC;border-top:none;margin:0;display:block;padding:1px 3px 1px 3px;text-align:center; } #navigator-list li { border:0;margin:0;padding:0;} #navigator-list a:hover { -moz-opacity:1;}";
  24. document.getElementsByTagName("head")[0].appendChild(css);
  25. document.body.addEventListener("click",function() { mfn_div.innerHTML = "";mfn_div.style.display = "none"; },true);
  26. mfn_div.setAttribute("id","navigator-list");
  27. mfn_div.setAttribute("style","display:none;position:absolute;left:0;top:0;padding:1px 0 0 0;");
  28. document.body.appendChild(mfn_div);
  29. mfn_posterNode = document.createElement("span");
  30. mfn_posterNode.innerHTML = "Poster";
  31. mfn_posterNode.setAttribute("style","font-family:Arial,sans-serif;-moz-opacity:0.8;background:#D0D000;color:#222;margin-left:4px;padding:0px 2px 0px 2px;font-weight:bold;font-size:9px;line-height:0;");
  32. mfn_adminNode = mfn_posterNode.cloneNode(true);
  33. mfn_adminNode.innerHTML = "Admin";
  34. mfn_adminNode.style.background = "white";
  35. mfn_userNode = mfn_adminNode.cloneNode(true);
  36. mfn_userNode.innerHTML = "Me";
  37. mfn_userNode.style.background = "#CC9";
  38. mfn_userNode.style.color = "#333";
  39. mfn_zeroNode = document.createTextNode("No other comments.");
  40. var htmlDot = "<b id=\"mfn-dot\">&middot;</b>";
  41. var htmlLeft = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>&laquo;</a>";
  42. var htmlList = "<a href=\"javascript:void(0)\" target='_self' id='mfn-list' onfocus='blur();'>&equiv;</a>";
  43. var htmlRight = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>&raquo;</a>";
  44. mfn_htmlFirst = htmlDot + htmlList + htmlRight;
  45. mfn_htmlNormal = htmlLeft + htmlList + htmlRight;
  46. mfn_htmlLast = htmlLeft + htmlList + htmlDot;
  47. }
  48. function mfn_user() {
  49. var cookie = document.cookie.toString();
  50. var i = cookie.indexOf("USER_NAME");
  51. if (i == -1) {
  52. return false;
  53. } else {
  54. var j = cookie.indexOf(';',i);
  55. if (j == -1) j=cookie.length;
  56. return unescape(cookie.substring(i+10,j));
  57. }
  58. }
  59. function mfn_main() {
  60. var elements = document.evaluate('//div[@class="comments" or @class="copy" or @class="comments bestleft"]/span[@class="smallcopy" or @class="smallcopy postbyline"]',document.body,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
  61. mfn_poster = elements.snapshotItem(0).getElementsByTagName('a').item(0).textContent.toString();
  62. for (var i=0,element;element = elements.snapshotItem(i);i++) {
  63. var author = element.getElementsByTagName('a').item(0).textContent.toString();
  64. if (typeof(mfn_all[author]) == "object") { // 'splice' problem
  65. mfn_all[author].push(element);
  66. } else{
  67. mfn_all[author] = [element,];
  68. }
  69. }
  70. for (var author in mfn_all) {
  71. for (var i = 0,lim=mfn_all[author].length;i<lim;i++) {
  72. if (mfn_you != false && author == mfn_you) {
  73. mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_userNode.cloneNode(true));
  74. }
  75. if (author == mfn_poster && i > 0) {
  76. mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_posterNode.cloneNode(true));
  77. }
  78. if (lim==1) {
  79. mfn_all[author][i].appendChild(mfn_zeroNode.cloneNode(false));
  80. } else {
  81. var panel = document.createElement("span");
  82. var buffer = ["Other&nbsp;<small style='line-height:0;'>[",];
  83. buffer.push((i+1),"/",lim,"]</small>:&nbsp;");
  84. if (i==0) {
  85. buffer.push(mfn_htmlFirst);
  86. } else if (i==(lim-1)) {
  87. buffer.push(mfn_htmlLast);
  88. } else {
  89. buffer.push(mfn_htmlNormal);
  90. }
  91. panel.innerHTML = buffer.join("");
  92. if (i > 0) panel.childNodes.item(3).addEventListener("click",function() {mfn_prev(this.parentNode);},true);
  93. panel.childNodes.item(4).addEventListener("click",function() {mfn_list(this);},true);
  94. if (i < (lim-1)) panel.childNodes.item(5).addEventListener("click",function() {mfn_next(this.parentNode);},true);
  95. mfn_all[author][i].appendChild(panel);
  96. }
  97. }
  98. }
  99. }
  100. mfn_prev = function (panel) {
  101. var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
  102. var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
  103. if (author == mfn_poster && (i-2)==0) {
  104. window.location = "#top";
  105. } else {
  106. var link = mfn_all[author][i-2].getElementsByTagName('a').item(1).href;
  107. if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one
  108. link = mfn_all[author][i-2].getElementsByTagName('a').item(2).href;
  109. }
  110. window.location = link.substring(link.lastIndexOf("#"));
  111. }
  112. };
  113. mfn_list = function (icon) {
  114. var author = icon.parentNode.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
  115. var j = icon.parentNode.textContent.substring(icon.parentNode.textContent.indexOf("[")+1,icon.parentNode.textContent.indexOf("/"))*1;
  116. var buffer = [];
  117. if (author == mfn_poster) {
  118. var link = "#top";
  119. } else {
  120. var link = mfn_all[author][0].getElementsByTagName('a').item(1).href;
  121. link = link.substring(link.lastIndexOf("#"));
  122. }
  123. buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;border-right:none;background:#111;' title='first'>&middot;&lt;</a>");
  124. link = mfn_all[author][mfn_all[author].length-1].getElementsByTagName('a').item(1).href;
  125. link = link.substring(link.lastIndexOf("#"));
  126. buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;background:#111' title='last'>&gt;&middot;</a>");
  127. buffer.push("<div id='navigator-scroll' style='clear:both;height:200px;overflow:auto;'>");
  128. for (var i=0,lim=mfn_all[author].length;i<lim;i++) {
  129. if (author == mfn_poster && i==0) {
  130. link = "#top";
  131. } else {
  132. link = mfn_all[author][i].getElementsByTagName('a').item(1).href;
  133. if (link.indexOf("faq.metafilter.com") !== -1) {
  134. link = mfn_all[author][i].getElementsByTagName('a').item(2).href;
  135. }
  136. link = link.substring(link.lastIndexOf("#"));
  137. }
  138. buffer.push("<a href='"+link+"' target='_self' style='background:#"+(i%2==0?'444':'111')+((i+1)==j?';text-decoration:underline;color:white;':';')+"'>"+(i+1)+"</a>");
  139. }
  140. buffer.push("</div>");
  141. mfn_div.innerHTML = buffer.join("");
  142. var rect = icon.getBoundingClientRect();
  143. var body = document.body
  144. var docElem = document.documentElement
  145. var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
  146. var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
  147. var clientTop = docElem.clientTop || body.clientTop || 0
  148. var clientLeft = docElem.clientLeft || body.clientLeft || 0
  149. var menu_top_pos = rect.bottom + scrollTop - clientTop;
  150. var menu_left_pos = rect.left + scrollLeft - clientLeft;
  151. mfn_div.style.left = Math.round(menu_left_pos) + 'px';
  152. mfn_div.style.top = Math.round(menu_top_pos) + 'px';
  153. mfn_div.style.display = "block";
  154. mfn_div.childNodes.item(2).scrollTop = mfn_div.childNodes.item(2).childNodes.item(j-1).offsetTop-32; };
  155. mfn_next = function (panel) {
  156. var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent;
  157. var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/"));
  158. var link = mfn_all[author][i].getElementsByTagName('a').item(1).href;
  159. if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one
  160. link = mfn_all[author][i].getElementsByTagName('a').item(2).href;
  161. }
  162. window.location = link.substring(link.lastIndexOf("#"));
  163. };