Greasy Fork is available in English.

GitHub - Make PRs easier

Add some js buttons to diffs

Versione datata 11/11/2015. Vedi la nuova versione l'ultima versione.

  1. // ==UserScript==
  2. // @name GitHub - Make PRs easier
  3. // @namespace http://adamwknox.com
  4. // @version 1.0
  5. // @description Add some js buttons to diffs
  6. // @author DrKnoxy
  7. // @include https://github.com/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. var tool = (function() {
  12.  
  13. var collapse = {
  14. // vars
  15. toggleId: 'js-blob-toggle',
  16. blobSelector: '.blob-wrapper, .render-wrapper, .file-header + .empty',
  17. isAllVisible: true,
  18.  
  19. // methods
  20. addElement: collapseAddElement,
  21. monitor: collapseMonitor
  22. };
  23.  
  24. var whitespace = {
  25. // vars
  26. toggleId: 'js-whitespace-toggle',
  27. isVisible: false,
  28.  
  29. // methods
  30. init: whitespaceInit,
  31. addElement: whitespaceAddElement,
  32. monitor: whitespaceMonitor
  33. };
  34.  
  35.  
  36. // Public methods
  37. return {
  38. init: init,
  39. addElements: addElements
  40. }
  41.  
  42.  
  43. /////////////////////
  44.  
  45. function init() {
  46. whitespace.init();
  47.  
  48. // Watch for events
  49. collapse.monitor();
  50. whitespace.monitor();
  51. }
  52.  
  53. function addElements() {
  54. collapse.addElement();
  55. whitespace.addElement();
  56. }
  57.  
  58.  
  59. //////////////////////////
  60. /// Whitespace Methods
  61. //////////////////////////
  62.  
  63. function whitespaceInit() {
  64. var search = _getSearchAsObj();
  65. whitespace.isVisible = (search.w == 1);
  66. }
  67.  
  68. function whitespaceMonitor() {
  69. $(document).on('click', '#' + whitespace.toggleId, function(e) {
  70. e.preventDefault();
  71.  
  72. // blow away the whole search query...
  73. window.location.search = whitespace.isVisible ? 'w=0' : 'w=1';
  74. });
  75. }
  76.  
  77. function whitespaceAddElement() {
  78. var toggle = {
  79. id: whitespace.toggleId,
  80. label: 'Ignore Whitespace',
  81. isSelected: whitespace.isVisible
  82. };
  83.  
  84. _addToggle(toggle);
  85. }
  86.  
  87.  
  88. //////////////////////////
  89. /// Collapse Methods
  90. //////////////////////////
  91.  
  92. function collapseMonitor() {
  93. collapseMonitorHeader();
  94. collapseMonitorToggle();
  95. }
  96.  
  97. function collapseMonitorHeader() {
  98. $(document).on('click', '.file-header', function(e) {
  99. $(this).next(collapse.blobSelector).toggle();
  100. });
  101. }
  102.  
  103. function collapseMonitorToggle() {
  104. $(document).on('click', '#' + collapse.toggleId, function(e) {
  105. e.preventDefault();
  106.  
  107. // can't use toggle, because we need to obey our state
  108. // not the items state
  109. if (collapse.isAllVisible) {
  110. $(this).addClass('selected');
  111. $(collapse.blobSelector).hide();
  112. } else {
  113. $(this).removeClass('selected');
  114. $(collapse.blobSelector).show();
  115. }
  116.  
  117. collapse.isAllVisible = !collapse.isAllVisible;
  118. });
  119. }
  120.  
  121. function collapseAddElement() {
  122. var toggle = {
  123. id: collapse.toggleId,
  124. label: 'Collapse'
  125. };
  126.  
  127. _addToggle(toggle);
  128. }
  129.  
  130. //////////////////////////
  131. /// Utils
  132. //////////////////////////
  133.  
  134. /**
  135. * @param options {id, label, isSelected}
  136. */
  137. function _addToggle(options) {
  138. if (!$('#' + options.id).length) {
  139. var cssClasses = 'btn btn-sm right';
  140. if (options.isSelected) {
  141. cssClasses += ' selected';
  142. }
  143.  
  144. var tmpl = [
  145. '<a id="' + options.id + '"',
  146. 'class="' + cssClasses + '"',
  147. 'style="margin-left: 4px;"',
  148. '>',
  149. options.label,
  150. '</a>'
  151. ].join(' ');
  152.  
  153. $('#toc .btn-group').before(tmpl);
  154. }
  155. }
  156.  
  157. function _getSearchAsObj() {
  158. var search = {};
  159. if (window.location.search) {
  160. window.location.search.replace('?', '').split('&').forEach(function(el) {
  161. var group = el.split('=');
  162. var prop = group[0];
  163. var val = group[1] || '';
  164. return search[prop] = val;
  165. });
  166. }
  167.  
  168. return search;
  169. }
  170.  
  171. })();
  172.  
  173. // ready!
  174. $(function() {
  175. tool.init();
  176. tool.addElements();
  177.  
  178. $(document).on('pjax:complete pjax:popstate', function(e) {
  179. tool.addElements();
  180. });
  181. });
  182.