Greasy Fork 支持简体中文。

Github Gist Share

Share your GitHub Gist to Twitter, Dabblet & as userscript.

目前為 2016-02-20 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Github Gist Share
  3. // @namespace https://github.com/jerone/UserScripts/
  4. // @description Share your GitHub Gist to Twitter, Dabblet & as userscript.
  5. // @author jerone
  6. // @copyright 2014+, jerone (http://jeroenvanwarmerdam.nl)
  7. // @license GNU GPLv3
  8. // @homepage https://github.com/jerone/UserScripts/tree/master/Github_Gist_Share
  9. // @homepageURL https://github.com/jerone/UserScripts/tree/master/Github_Gist_Share
  10. // @supportURL https://github.com/jerone/UserScripts/issues
  11. // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VCYMHWQ7ZMBKW
  12. // @include *://gist.github.com/*
  13. // @version 4.5
  14. // @grant none
  15. // ==/UserScript==
  16. /* global unsafeWindow */
  17.  
  18. (function() {
  19.  
  20. String.format = function(string) {
  21. var args = Array.prototype.slice.call(arguments, 1, arguments.length);
  22. return string.replace(/{(\d+)}/g, function(match, number) {
  23. return typeof args[number] !== 'undefined' ? args[number] : match;
  24. });
  25. };
  26.  
  27. var socials = {
  28. Twitter: {
  29. show: function( /*url, user, description, files, stars, forks, revisions*/ ) {
  30. return true;
  31. },
  32. submit: function(url, user, description, files, stars, forks, revisions) {
  33. var stats = [];
  34. if (files > 1) {
  35. stats.push(files + ' files');
  36. }
  37. if (stars === 1) {
  38. stats.push(stars + ' star');
  39. } else if (stars > 1) {
  40. stats.push(stars + ' stars');
  41. }
  42. if (forks === 1) {
  43. stats.push(forks + ' fork');
  44. } else if (forks > 1) {
  45. stats.push(forks + ' forks');
  46. }
  47. if (revisions > 1) {
  48. stats.push(revisions + ' revisions');
  49. }
  50.  
  51. var tweet = String.format('Check out {0} #gist {1} on @github{2} |',
  52. user === document.querySelector('.name').textContent.trim() ? 'my' : user + '\'s',
  53. description ? '"' + description + '"' : '',
  54. stats.length > 0 ? ' | ' + stats.join(', ') : '');
  55.  
  56. return 'https://twitter.com/intent/tweet?original_referer=' + encodeURIComponent(url) +
  57. '&source=tweetbutton&url=' + encodeURIComponent(url) +
  58. '&text=' + encodeURIComponent(tweet);
  59. },
  60. icon: 'https://si0.twimg.com/favicons/favicon.ico'
  61. },
  62. Dabblet: {
  63. /*
  64. * The following urls should be converted to dabblet:
  65. * _______
  66. * - https://gist.github.com/jerone/3810309
  67. * _______
  68. * - https://gist.github.com/jerone/3810309/revisions
  69. * _______
  70. * - https://gist.github.com/jerone/3810309/forks
  71. * _______
  72. * - https://gist.github.com/jerone/3810309/stars
  73. * ________________________________________________
  74. * - https://gist.github.com/jerone/3810309/f2815cc6796ea985f74b8f5f3c717e8de3b12d37
  75. * ________________________________________________
  76. * - https://gist.github.com/3810309/f2815cc6796ea985f74b8f5f3c717e8de3b12d37
  77. *
  78. */
  79. show: function( /*url, user, description, files, stars, forks, revisions*/ ) {
  80. return true;
  81. },
  82. submit: function(url, user /*, description, files, stars, forks, revisions*/ ) {
  83. var linkLong;
  84. if ((linkLong = document.querySelector('.site-container.js-site-container')) && linkLong.dataset.url) {
  85. var linkLongParts = linkLong.dataset.url.split('/');
  86. linkLongParts.shift();
  87. if (/^(?:revisions|forks|stars)$/gi.test(linkLongParts[linkLongParts.length - 1])) {
  88. linkLongParts.pop();
  89. }
  90. if (new RegExp(user, 'gi').test(linkLongParts[0])) {
  91. linkLongParts.shift();
  92. }
  93. url = '/' + linkLongParts.join('/');
  94. } else {
  95. url = url.replace(new RegExp('https?:\/\/gist.github.com/' + user, 'gi'), '');
  96. }
  97. return 'http://dabblet.com/gist' + url;
  98. },
  99. icon: 'http://dabblet.com/favicon.ico'
  100. },
  101. UserScript: {
  102. show: function( /*url, user, description, files, stars, forks, revisions*/ ) {
  103. return !!document.querySelector('.file[id^="file-"] .raw-url[href$=".user.js"]');
  104. },
  105. submit: function( /*url, user, description, files, stars, forks, revisions*/ ) {
  106. return (document.querySelector('.file[id^="file-"] .raw-url[href$=".user.js"]') || {
  107. href: ''
  108. }).href.trim();
  109. },
  110. icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKwSURBVHjabJNJTBNRGID/mc5MQYVWVNCGTbEtNZGDBj1ogolEMR5UJA2LBmMoIokxERIj8ehJjx6MYIQoJgq4JIa6gEARkKJFTa2iFFtKWwp2oeDCzNQ+31DQCc5L/nmT/P/3749ACAFBECBxiEPFFds0Ws399DRVhtX2udc97ig0PmgOLBkIbOwjAR8uMRRdvXF7pqv/NfrqnEAOlxsdLas6j3Wk2AEpCRcbKvLydrdu1WUr0lXrITEhAZKUSkhQKvKwXiY2ppbDRzCcv29P/ZZsDaSqUkCJYVJGwKMnHTDlmWgTZ/CvjkW4sKTScP1WC+oZsKAxpwv5gyEUnAkj2xc70p88Y8Y2a8VBxT0gispOGa413UVDb23IMe6OwaEw+jTqQKMOF3pptqBSw7k74hLEPaDUOu0VmpFDV58ZCJIAkiDB5fUBz0eApmjQqbOgrqa69HhVbZO4jKUfmiBJBctysHJFPPiDYbA7J4DjeJDLaWAYGVAyErIy0uDs6RPH9OXVtULWYgfEmN3emJK8BlYrEsHl8cEvloX4ODnEyRlgKGZhV1iOhcz0VNixM7dOCCp2EBkeMF3u6DaNqDasg1U4CzlFxxSRKMyz8xjmsPAQwNmRsc2jxGPkR0esHp7n9RBFrYbyUi1DUzh1GujFG0UBQrNz8P7DR3j+9NklqTEK3VVkbNLkVNZc9AwNW5Hb60PT/gCamg6gEbsT3XvYjvIP6i9gu2ShhOWb+BvLD13O9o3azWrVdy4K3wKhv5HfWW1Q39BY19nechPbzQrVwX9bhU+iIqnyQMF+mPvJQr/FCsHwDJgG30ADhl8Y2wQ4jIUVkpdaZRnPcd6AfxomJ32AIhEwdvaC8XG7JLwwvmXPmVFn52Tu2lvQjN9Crn3M6bWY+6otr3oGpWCB/SPAAJaJRguGUxB0AAAAAElFTkSuQmCC'
  111. },
  112. 'bl.ocks.org': {
  113. show: function( /*url, user, description, files, stars, forks, revisions*/ ) {
  114. return true;
  115. },
  116. submit: function(url, user /*, description, files, stars, forks, revisions*/ ) {
  117. var linkLong;
  118. if ((linkLong = document.querySelector('.site-container.js-site-container')) && linkLong.dataset.url) {
  119. var linkLongParts = linkLong.dataset.url.split('/');
  120. linkLongParts.shift();
  121. if (/^(?:revisions|forks|stars)$/gi.test(linkLongParts[linkLongParts.length - 1])) {
  122. linkLongParts.pop();
  123. }
  124. url = '/' + linkLongParts.join('/');
  125. } else {
  126. url = url.replace(new RegExp('https?:\/\/gist.github.com/' + user, 'gi'), '');
  127. }
  128. return 'http://bl.ocks.org' + url;
  129. },
  130. icon: 'http://bl.ocks.org/favicon.png'
  131. }
  132. };
  133.  
  134. function addMenuItem() {
  135. var temp, link, url, menu, li, user, description, files, stars, forks, revisions;
  136.  
  137. if ((link = document.querySelector('.js-current-repository')) && (menu = document.querySelector('.sunken-menu-group'))) { // check if we're on an actual gists;
  138. url = link.href;
  139. user = document.querySelector('.author.vcard').textContent.trim();
  140. description = (temp = (document.querySelector('.gist-description') || link)) && temp.textContent.trim() || '';
  141. files = document.querySelectorAll('.file[id^="file-"]').length;
  142. stars = (temp = menu.querySelector('a[href$="/stars"] .counter')) && parseInt(temp.textContent.trim(), 10) || 0;
  143. forks = (temp = menu.querySelector('a[href$="/forks"] .counter')) && parseInt(temp.textContent.trim(), 10) || 0;
  144. revisions = (temp = menu.querySelector('a[href$="/revisions"] .counter')) && parseInt(temp.textContent.trim(), 10) || 0;
  145.  
  146. menu.appendChild(li = document.createElement('li'));
  147. li.id = 'Github_Gist_Share';
  148.  
  149. for (var key in socials) {
  150. if (socials.hasOwnProperty(key)) {
  151. var social = socials[key],
  152. socialA = document.createElement('a'),
  153. socialImg = document.createElement('img');
  154.  
  155. if (social.show(url, user, description, files, stars, forks, revisions) !== true) {
  156. continue;
  157. }
  158.  
  159. li.appendChild(socialA);
  160. socialA.appendChild(socialImg);
  161. socialA.id = (li.id + '_' + key).replace(/\s+/g, '_');
  162. socialA.classList.add('sunken-menu-item');
  163. socialA.href = social.submit && social.submit(url, user, description, files, stars, forks, revisions);
  164. socialA.title = String.format('[{0}] {1}', key, socialA.href);
  165. socialA.style.display = 'inline-block';
  166. socialA.target = '_blank';
  167. socialImg.src = social.icon;
  168. socialImg.alt = key;
  169. }
  170. }
  171. }
  172. }
  173.  
  174. // init;
  175. addMenuItem();
  176.  
  177. // on pjax;
  178. unsafeWindow.$(document).on('pjax:success', addMenuItem);
  179.  
  180. })();