Github Repository Sorter

Sorts Github repositories.

当前为 2016-06-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Github Repository Sorter
  3. // @namespace http://sunnyrodriguez.com/
  4. // @version 0.2
  5. // @description Sorts Github repositories.
  6. // @author splttingatms
  7. // @include /^https?://.*\.?github\.com/\w+/?$/
  8. // @grant none
  9. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
  10. // @require https://greasyfork.org/scripts/1003-wait-for-key-elements/code/Wait%20for%20key%20elements.js?version=49342
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. function parseRepoStat(repo, stat) {
  17. return parseInt(repo.querySelector('[aria-label="' + stat + '"]').text.trim().replace(/,/g, ""));
  18. }
  19.  
  20. function sortBy(stat) {
  21. var repoCollection = document.getElementsByClassName("repo-list-item");
  22. var repos = Array.prototype.slice.call(repoCollection);
  23. repos.sort(function(a, b){
  24. var starsA = parseRepoStat(a, stat);
  25. var starsB = parseRepoStat(b, stat);
  26. return starsA - starsB; // sort low to high
  27. });
  28.  
  29. var list = document.getElementsByClassName("repo-list")[0];
  30. for (var i = 1; i < repos.length; i++) {
  31. list.insertBefore(repos[i], list.children[0]); // insert before reverses list to high to low
  32. }
  33. }
  34.  
  35. function createSortButtonByStat(stat) {
  36. var item = document.createElement("li");
  37. item.classList.add("right");
  38. item.classList.add("ml-3");
  39. item.style = "list-style-type: none";
  40.  
  41. var link = document.createElement("a");
  42. link.text = "Sort by " + stat;
  43. link.onclick = function() {
  44. sortBy(stat);
  45. var items = document.getElementById("sort-bar").getElementsByTagName("li");
  46. for (var i = 0; i < items.length; i++) {
  47. items[i].classList.remove("filter-selected");
  48. }
  49. item.classList.add("filter-selected");
  50. };
  51.  
  52. item.appendChild(link);
  53. return item;
  54. }
  55.  
  56. function addSortButtonsTo(parent) {
  57. var para = document.createElement("p");
  58. para.id = "sort-bar";
  59.  
  60. var list = document.createElement("ul");
  61. list.classList.add("right");
  62.  
  63. var forkSortButton = createSortButtonByStat("Forks");
  64. list.appendChild(forkSortButton);
  65.  
  66. var starSortButton = createSortButtonByStat("Stargazers");
  67. list.appendChild(starSortButton);
  68.  
  69. para.appendChild(list);
  70. console.log($(parent));
  71. document.getElementsByClassName(parent)[0].appendChild(para);
  72. }
  73.  
  74. function isRepositoryTab(jNode) {
  75. return jNode[0].children[0].classList.contains("repo-tab");
  76. }
  77.  
  78. function isOrganizationPage() {
  79. return $(".org-name").length > 0;
  80. }
  81.  
  82. // Execute
  83. if (isOrganizationPage()) {
  84. addSortButtonsTo("org-toolbar");
  85. } else {
  86. waitForKeyElements (".js-repo-filter", function(jNode) {
  87. if (isRepositoryTab(jNode)) {
  88. addSortButtonsTo("filter-bar");
  89. }
  90. });
  91. }
  92. })();