Greasy Fork - Change Default Script Sort on User Profiles

Change default script sort on user profiles

目前為 2016-08-16 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Greasy Fork - Change Default Script Sort on User Profiles
  3. // @namespace https://greasyfork.org/users/649
  4. // @version 1.0.4
  5. // @description Change default script sort on user profiles
  6. // @author Adrien Pyke
  7. // @match *://greasyfork.org/*/users/*
  8. // @grant GM_getValue
  9. // @grant GM_setValue
  10. // @grant GM_registerMenuCommand
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16.  
  17. var Util = {
  18. getQueryParameter: function(name, url) {
  19. if (!url) url = window.location.href;
  20. name = name.replace(/[\[\]]/g, "\\$&");
  21. var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
  22. results = regex.exec(url);
  23. if (!results) return null;
  24. if (!results[2]) return '';
  25. return decodeURIComponent(results[2].replace(/\+/g, " "));
  26. },
  27.  
  28. setQueryParameter: function(key, value, url) {
  29. if (!url) url = window.location.href;
  30. var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
  31. hash;
  32.  
  33. if (re.test(url)) {
  34. if (typeof value !== 'undefined' && value !== null)
  35. return url.replace(re, '$1' + key + "=" + value + '$2$3');
  36. else {
  37. hash = url.split('#');
  38. url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
  39. if (typeof hash[1] !== 'undefined' && hash[1] !== null)
  40. url += '#' + hash[1];
  41. return url;
  42. }
  43. }
  44. else {
  45. if (typeof value !== 'undefined' && value !== null) {
  46. var separator = url.indexOf('?') !== -1 ? '&' : '?';
  47. hash = url.split('#');
  48. url = hash[0] + separator + key + '=' + value;
  49. if (typeof hash[1] !== 'undefined' && hash[1] !== null)
  50. url += '#' + hash[1];
  51. return url;
  52. }
  53. else
  54. return url;
  55. }
  56. }
  57. };
  58.  
  59. var Config = {
  60. load: function() {
  61. var defaults = {
  62. sort: 'daily-installs'
  63. };
  64.  
  65. var cfg = GM_getValue('cfg');
  66. if (!cfg) return defaults;
  67.  
  68. return JSON.parse(cfg);
  69. },
  70.  
  71. save: function (cfg) {
  72. GM_setValue('cfg', JSON.stringify(cfg));
  73. },
  74.  
  75. setup: function() {
  76. var createSelect = function(label, options, value) {
  77. var select = document.createElement('select');
  78. select.style.margin = '2px';
  79. var optgroup = document.createElement('optgroup');
  80. if (label) {
  81. optgroup.setAttribute('label', label);
  82. }
  83. select.appendChild(optgroup);
  84. options.forEach(function(opt) {
  85. var option = document.createElement('option');
  86. option.setAttribute('value', opt.value);
  87. option.textContent = opt.text;
  88. optgroup.appendChild(option);
  89. });
  90. select.value = value;
  91. return select;
  92. };
  93.  
  94. var createButton = function(text, onclick) {
  95. var button = document.createElement('button');
  96. button.style.margin = '2px';
  97. button.textContent = text;
  98. button.onclick = onclick;
  99. return button;
  100. };
  101.  
  102. var init = function(cfg) {
  103. var div = document.createElement('div');
  104. div.style.backgroundColor = 'white';
  105. div.style.border = '1px solid black';
  106. div.style.position = 'absolute';
  107. div.style.top = '0';
  108. div.style.right = '0';
  109.  
  110. var sort = createSelect('Default Sort', [
  111. { value: 'daily-installs', text: 'Daily installs' },
  112. { value: 'total_installs', text: 'Total installs' },
  113. { value: 'ratings', text: 'Ratings' },
  114. { value: 'created', text: 'Created' },
  115. { value: 'updated', text: 'Updated' },
  116. { value: 'name', text: 'Name' }
  117. ], cfg.sort);
  118. div.appendChild(sort);
  119.  
  120. div.appendChild(document.createElement('br'));
  121.  
  122. div.appendChild(createButton('Save', function(e) {
  123. var settings = {
  124. sort: sort.value
  125. };
  126. Config.save(settings);
  127. div.remove();
  128. }));
  129.  
  130. div.appendChild(createButton('Cancel', function(e) {
  131. div.remove();
  132. }));
  133.  
  134. document.body.appendChild(div);
  135. };
  136. init(Config.load());
  137. }
  138. };
  139.  
  140. GM_registerMenuCommand('GreasyFork Sort Settings', Config.setup);
  141.  
  142. document.addEventListener('DOMContentLoaded', function(e) {
  143. var dailyInstalls = document.querySelector('#script-list-sort > ul > li:nth-child(1) > a');
  144. if (dailyInstalls) {
  145. dailyInstalls.href = Util.setQueryParameter('sort', 'daily-installs', dailyInstalls.href);
  146. }
  147. });
  148.  
  149. var sort = Util.getQueryParameter('sort');
  150. if (!sort) {
  151. var cfg = Config.load();
  152. window.location.replace(Util.setQueryParameter('sort', cfg.sort));
  153. }
  154. })();