Twitter media-only filter toggle.

Toggle non-media tweets on and off, for the power-viewer!

当前为 2018-03-04 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Twitter media-only filter toggle.
  3. // @version 0.3
  4. // @description Toggle non-media tweets on and off, for the power-viewer!
  5. // @author Cro
  6. // @match https://twitter.com/*
  7. // @run-at document-idle
  8. // @grant GM_setValue
  9. // @grant GM_getValue
  10. // @namespace https://greasyfork.org/users/10865
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15. // Die fast if we cannot hook into the button bar.
  16. var buttonBar = document.getElementById("global-actions");
  17. if (buttonBar === null) return;
  18.  
  19. var hideIfTarget = function(node)
  20. {
  21. if (node.tagName &&
  22. node.tagName.toLowerCase() == "li" &&
  23. node.classList.contains("stream-item") &&
  24. null === node.querySelector("div.AdaptiveMediaOuterContainer"))
  25. {
  26. node.hidden = true;
  27. }
  28. };
  29.  
  30. var mutationCallback = function(mutations)
  31. {
  32. for (var mutation of mutations)
  33. {
  34. for (var node of mutation.addedNodes)
  35. {
  36. hideIfTarget(node);
  37. }
  38. }
  39. };
  40.  
  41. var hideAllNonMedia = function()
  42. {
  43. document.querySelectorAll("li.stream-item").forEach(hideIfTarget);
  44. };
  45.  
  46. var showAllTweets = function()
  47. {
  48. document.querySelectorAll("li.stream-item").forEach(function (node) { node.hidden = false; });
  49. };
  50.  
  51. var observer = new MutationObserver(mutationCallback);
  52. var stream = document.getElementsByClassName("stream")[0];
  53.  
  54. // UI
  55. var li = document.createElement("li");
  56. var button = document.createElement("button");
  57. var only = "Only Media Tweets";
  58. var all = "All Tweets";
  59. var storageKey = "cro-media-toggle";
  60.  
  61. button.onclick = function(event)
  62. {
  63. GM_setValue(storageKey, !GM_getValue(storageKey));
  64.  
  65. if (GM_getValue(storageKey))
  66. {
  67. button.innerText = only;
  68. hideAllNonMedia();
  69. observer.observe(stream, { childList: true, subtree: true });
  70. }
  71. else
  72. {
  73. button.innerText = all;
  74. showAllTweets();
  75. observer.disconnect();
  76. }
  77. };
  78.  
  79. buttonBar.appendChild(li);
  80. li.appendChild(button);
  81. button.click();
  82. })();