Github News Feed Filter

Add filters for Github homepage news feed items

当前为 2014-03-06 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Github News Feed Filter
  3. // @namespace https://greasyfork.org/scripts/171
  4. // @description Add filters for Github homepage news feed items
  5. // @author jerone
  6. // @homepage https://github.com/jerone/UserScripts/tree/master/Github_News_Feed_Filter
  7. // @homepageURL https://github.com/jerone/UserScripts/tree/master/Github_News_Feed_Filter
  8. // @downloadURL https://greasyfork.org/scripts/171/code.user.js
  9. // @updateURL https://greasyfork.org/scripts/171/code.meta.js
  10. // @include http*://github.com/
  11. // @version 1
  12. // @grant none
  13. // ==/UserScript==
  14.  
  15.  
  16. (function () {
  17.  
  18. function proxy(fn) {
  19. return function () {
  20. var that = this;
  21. return function (e) {
  22. var args = that.slice(0); // clone;
  23. args.unshift(e); // prepend event;
  24. fn.apply(this, args);
  25. };
  26. }.call([].slice.call(arguments, 1));
  27. }
  28.  
  29. function addFilters() {
  30. var container;
  31. if (!(container = document.querySelector(".news"))) return;
  32.  
  33. var ul = document.createElement("ul");
  34. ul.classList.add("dashboard-tabs");
  35. [{ text: "", icon: "octicon-comment-discussion", filter: ["*"] },
  36. { text: "Comments", icon: "octicon-comment", filter: ["issues_comment"] },
  37. { text: "Commits", icon: "octicon-git-commit", filter: ["push"] },
  38. { text: "Issue actions", icon: "octicon-issue-opened", filter: ["issues_opened", "issues_closed"] }
  39. ].forEach(function (item) {
  40. var li = document.createElement("li");
  41. var a = document.createElement("a");
  42. a.classList.add("js-selected-navigation-item");
  43. a.setAttribute("href", "/");
  44. a.setAttribute("title", item.filter.join(" & "));
  45. var s = document.createElement("span");
  46. s.classList.add("octicon", item.icon);
  47. if (item.filter == "*") {
  48. li.style.cssFloat = "left";
  49. li.style.width = "49px";
  50. a.classList.add("selected");
  51. } else {
  52. s.style.marginRight = "6px";
  53. }
  54. a.appendChild(s);
  55. a.appendChild(document.createTextNode(item.text));
  56. a.addEventListener("click", proxy(function (e, filter) {
  57. e.preventDefault();
  58. Array.forEach(container.querySelectorAll(".selected"), function (m) {
  59. m.classList.remove("selected");
  60. });
  61. this.classList.add("selected");
  62. var alerts = container.querySelectorAll(".alert");
  63. Array.filter(alerts, function (alert) {
  64. alert.style.display = filter == "*" || filter.some(function (c) {
  65. return alert.classList.contains(c);
  66. }) ? "block" : "none";
  67. });
  68. return false;
  69. }, item.filter));
  70. li.appendChild(a);
  71. ul.appendChild(li);
  72. });
  73.  
  74. container.insertBefore(ul, container.firstChild);
  75.  
  76. // update on clicking "More"-button;
  77. var event = new Event("click");
  78. $.pageUpdate(function () {
  79. window.setTimeout(function () {
  80. container.querySelector(".selected").dispatchEvent(event);
  81. }, 1);
  82. });
  83. }
  84.  
  85. // init;
  86. addFilters();
  87.  
  88. // on pjax;
  89. $(document).on('pjax:success', addFilters);
  90.  
  91. })();