Github Repository Sorter

Sorts Github repositories.

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

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