Greasy Fork 支持简体中文。

4chan Post Sort by quote

Sorts posts in a 4chan thread by quote. Origin Author:asdaa

  1. // ==UserScript==
  2. // @name 4chan Post Sort by quote
  3. // @namespace 4chan-post-sort-by-quote
  4. // @description Sorts posts in a 4chan thread by quote. Origin Author:asdaa
  5. // @license MIT
  6. // @include http://boards.4chan.org/*/*
  7. // @include https://boards.4chan.org/*/*
  8. // @grant GM_registerMenuCommand
  9. // @version 1.0.1
  10. // @author TomoeMami
  11. // @icon https://4chan.org/favicon.ico
  12. // ==/UserScript==
  13.  
  14. function sortPosts() {
  15. // 获取所有 replyContainer 元素
  16. const replyContainers = document.querySelectorAll('.replyContainer');
  17.  
  18. // 遍历每个 replyContainer
  19. replyContainers.forEach(container => {
  20. // 查找 class 为 backlink 的 div
  21. const backlinkDiv = container.querySelector('.backlink');
  22. if (backlinkDiv) {
  23. // 查找 backlink div 中的所有 quotelink 子元素
  24. const quotelinks = backlinkDiv.querySelectorAll('.quotelink');
  25. // 遍历每个 quotelink
  26. quotelinks.forEach(quotelink => {
  27. // 获取 quotelink 的文本内容
  28. const text = quotelink.textContent.trim();
  29.  
  30. // 检查是否包含 "OP"
  31. if (text.includes("OP")) {
  32. // 如果包含 "OP",跳过处理
  33. return;
  34. }
  35.  
  36. // 去除前两个符号并提取 ID
  37. const linkedId = text.slice(2);
  38.  
  39. // 查找对应的 replyContainer
  40. let linkedContainer = null;
  41. replyContainers.forEach(c => {
  42. // 查找 title 为 "Reply to this post" 的 <a> 元素
  43. const replyLink = c.querySelector('a[title="Reply to this post"]');
  44. if (replyLink && replyLink.textContent.trim() === linkedId) {
  45. linkedContainer = c;
  46. }
  47. });
  48.  
  49. // 如果找到对应的 replyContainer,将其移动到当前 container 之后
  50. if (linkedContainer) {
  51. container.insertAdjacentElement('afterend', linkedContainer);
  52. }
  53. });
  54. };
  55. });
  56. }
  57.  
  58. var sortBtn = document.createElement('a');
  59. sortBtn.href = 'javascript:;';
  60. sortBtn.innerText = 'Sort by Quote';
  61. document.querySelector(".navLinks.desktop").appendChild(sortBtn)
  62. sortBtn.insertAdjacentText('beforebegin', ' [');
  63. sortBtn.insertAdjacentText('afterend', ']');
  64. sortBtn.addEventListener("click", function() {
  65. console.log('Button clicked');
  66. sortPosts();
  67. }, false);
  68.  
  69. GM_registerMenuCommand('Sort Posts by Quote', sortPosts);