Github Gist Share

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

目前为 2018-01-27 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Github Gist Share
  3. // @namespace https://github.com/jerone/UserScripts/
  4. // @description Share your GitHub Gist to Twitter, Dabblet, Bl.ocks & as userscript.
  5. // @author jerone
  6. // @copyright 2014+, jerone (http://jeroenvanwarmerdam.nl)
  7. // @license GPL-3.0
  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. // @icon https://github.com/fluidicon.png
  13. // @include *://gist.github.com/*
  14. // @version 5.0
  15. // @grant none
  16. // ==/UserScript==
  17.  
  18. (function() {
  19.  
  20. String.format = function(string) {
  21. const 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. function Menu(container) {
  28. const div$0$0 = document.createElement('div')
  29. div$0$0.classList.add('file-navigation-option')
  30. div$0$0.id = 'Github_Gist_Share'
  31. container.insertBefore(div$0$0, container.firstChild)
  32.  
  33. const div$1$0 = document.createElement('div')
  34. div$1$0.classList.add('select-menu', 'js-menu-container', 'select-menu-modal-left', 'js-select-menu')
  35. div$0$0.appendChild(div$1$0)
  36.  
  37. const button$2$0 = document.createElement('button')
  38. button$2$0.classList.add('btn', 'btn-sm', 'select-menu-button', 'icon-only', 'js-menu-target')
  39. button$2$0.setAttribute('type', 'button')
  40. div$1$0.appendChild(button$2$0)
  41.  
  42. const svg$3$0 = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
  43. svg$3$0.classList.add('octicon', 'octicon-link-external')
  44. svg$3$0.setAttributeNS(null, 'height', 16)
  45. svg$3$0.setAttributeNS(null, 'version', '1.1')
  46. svg$3$0.setAttributeNS(null, 'viewBox', '0 0 12 16')
  47. svg$3$0.setAttributeNS(null, 'width', 12)
  48. button$2$0.appendChild(svg$3$0)
  49.  
  50. const path$4$0 = document.createElementNS('http://www.w3.org/2000/svg', 'path')
  51. path$4$0.setAttributeNS(null, 'd', 'M11 10h1v3c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h3v1H1v10h10v-3zM6 2l2.25 2.25L5 7.5 6.5 9l3.25-3.25L12 8V2H6z')
  52. svg$3$0.appendChild(path$4$0)
  53.  
  54. button$2$0.appendChild(document.createTextNode(' Share '))
  55.  
  56. const div$2$1 = document.createElement('div')
  57. div$2$1.classList.add('select-menu-modal-holder')
  58. div$1$0.appendChild(div$2$1)
  59.  
  60. const div$3$0 = document.createElement('div')
  61. div$3$0.classList.add('select-menu-modal', 'select-menu-modal', 'js-menu-content')
  62. div$2$1.appendChild(div$3$0)
  63.  
  64. const div$4$0 = document.createElement('div')
  65. div$4$0.classList.add('select-menu-header')
  66. div$3$0.appendChild(div$4$0)
  67.  
  68. const svg$5$0 = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
  69. svg$5$0.classList.add('octicon', 'octicon-x', 'js-menu-close')
  70. svg$5$0.setAttributeNS(null, 'height', 16)
  71. svg$5$0.setAttributeNS(null, 'version', '1.1')
  72. svg$5$0.setAttributeNS(null, 'viewBox', '0 0 12 16')
  73. svg$5$0.setAttributeNS(null, 'width', 12)
  74. div$4$0.appendChild(svg$5$0)
  75.  
  76. const path$6$0 = document.createElementNS('http://www.w3.org/2000/svg', 'path')
  77. path$6$0.setAttributeNS(null, 'd', 'M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z')
  78. svg$5$0.appendChild(path$6$0)
  79.  
  80. const span$5$1 = document.createElement('span')
  81. span$5$1.classList.add('select-menu-title')
  82. div$4$0.appendChild(span$5$1)
  83.  
  84. span$5$1.appendChild(document.createTextNode('Share Gist with…'))
  85.  
  86. const div$4$1 = document.createElement('div')
  87. div$4$1.classList.add('select-menu-list', 'js-navigation-container')
  88. div$3$0.appendChild(div$4$1)
  89.  
  90. this.itemsContainer = div$4$1
  91. }
  92.  
  93. Menu.prototype.AddItem = function(text, title, href, icon, newTab) {
  94. const a = document.createElement('a')
  95. a.classList.add('select-menu-item', 'js-navigation-item')
  96. a.setAttribute('href', href)
  97. if (title) a.setAttribute('title', title)
  98. if (newTab) a.setAttribute('target', '_blank')
  99. this.itemsContainer.appendChild(a)
  100.  
  101. const i = document.createElement('img')
  102. i.classList.add('select-menu-item-icon')
  103. i.setAttribute('src', icon)
  104. a.appendChild(i)
  105.  
  106. const s = document.createElement('span')
  107. s.classList.add('select-menu-item-text')
  108. a.appendChild(s)
  109.  
  110. s.appendChild(document.createTextNode(text))
  111. }
  112.  
  113. function getValue(elm) {
  114. return elm ? elm.textContent.trim() : ''
  115. }
  116.  
  117. function getIntValue(elm) {
  118. return elm ? parseInt(elm.textContent.trim(), 10) : 0
  119. }
  120.  
  121. function addMenu() {
  122. const link = document.querySelector('.gist-header-title a')
  123. const nav = document.querySelector('.file-navigation-options')
  124. if (link && nav) { // Check if we're on an actual gist
  125. const data = {
  126. url: link.href,
  127. user: getValue(document.querySelector('.header-nav-current-user strong')),
  128. author: getValue(document.querySelector('.author [itemprop="author"]')),
  129. description: getValue(document.querySelector('.repository-meta-content') || link),
  130. files: document.querySelectorAll('.file').length,
  131. stars: getIntValue(document.querySelector('a[href$="/stargazers"] .counter, form[action$="/star"] .social-count')),
  132. forks: getIntValue(document.querySelector('a[href$="/forks"] .counter, form[action$="/fork"] .social-count')),
  133. revisions: getIntValue(document.querySelector('a[href$="/revisions"] .counter'))
  134. }
  135.  
  136. console.log(data)
  137.  
  138. const menu = new Menu(nav)
  139.  
  140. // Twitter
  141. if (true) {
  142. const stats = []
  143. if (data.files > 1) {
  144. stats.push(data.files + ' files')
  145. }
  146. if (data.stars === 1) {
  147. stats.push(data.stars + ' star')
  148. } else if (data.stars > 1) {
  149. stats.push(data.stars + ' stars')
  150. }
  151. if (data.forks === 1) {
  152. stats.push(data.forks + ' fork')
  153. } else if (data.forks > 1) {
  154. stats.push(data.forks + ' forks')
  155. }
  156. if (data.revisions > 1) {
  157. stats.push(data.revisions + ' revisions')
  158. }
  159.  
  160. const tweet = String.format('Check out {0} #gist {1} on @github {2}',
  161. data.author === data.user ? 'my' : data.author + "'s",
  162. data.description ? '"' + data.description + '"' : '',
  163. stats.length > 0 ? String.format('- {0} -', stats.join(', ')) : '-')
  164.  
  165. const link = 'https://twitter.com/intent/tweet' +
  166. '?original_referer=' + encodeURIComponent(data.url) +
  167. '&source=tweetbutton&url=' + encodeURIComponent(data.url) +
  168. '&text=' + encodeURIComponent(tweet)
  169.  
  170. const icon = 'data:image/vnd.microsoft.icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////A////xT///8f////K////yj///8f////FP///wP///8A////AP///wD///8A////AP///wD///8A////H/357kj55K589tV+ofPFUML0y1+29tV+ofnkrnz9+e5I////H////wP///8A////AP///wD///8A////ANi/foG2iBDuvYkA/9CWAP/npwD/7qwA/+6sAP/urAD/7rAP8/bVfqH9+e8/////A////wD///8A////AP///wD///8A////APDnzjDjx36N3Kcf5e6sAP/urAD/7qwA/+6sAP/urAD/8bww2/357z////8D////AP///wD///8A////AP///wP///8z+N+eifTLX7burAD/7qwA/+6sAP/urAD/7qwA/+6sAP/xvDDb/PjvM////wD///8A////AP///wD69+8V2Kkw1eqpAP/urAD/7qwA/+6sAP/urAD/7qwA/+6sAP/urAD/7qwA//TLX7b///8H////AP///wD///8A+fLfPvbVfqHusA/z7qwA/+6sAP/urAD/7qwA/+6sAP/urAD/7qwA/+6sAP/urAD/+fLfPv///wD///8A////DPXQcKvurAD/7qwA/+6sAP/urAD/7qwA/+6sAP/urAD/7qwA/+6sAP/urAD/7qwA/+/Lb6f///8A////APPpzzzUmQD/7qwA/+6sAP/urAD/7qwA/+enAP/npwD/7qwA/+6sAP/urAD/7qwA/+6sAP/xvDDb////AP///wDt4L5G9dBwq+6sAP/urAD/2JwA/7qGAP+7kCDe1qMf4+6sAP/urAD/7qwA/+6sAP/urAD/7qwA/////yT///8A9/DeLu6sAP/npwD/vYkA/8+wYJ/1794f////AOXIfo7urAD/7qwA/+6sAP/urAD/7qwA/+6sAP/zznCo////KO7hv0jjpAD/vpIf4PDnzjD///8A////AP///wDeyI5x46QA/+6sAP/urAD/7qwA/+qpAP/UmQD/5KkO89u4YKfw584ww5ov0Pr37g////8A////AP///wD///8A+vfuD8OaL9DUmQD/36EA/9icAP+9jA/w07hwjsCYMM/p2a9U////APr37g////8A////AP///wD///8A////AP///wD69+4P07hwjsWgQL/PsGCf9e/eH////wD///8A9e/eH////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAOH/AAAAPwAA4B8AAOAPAADABwAAwAcAAIADAACAAwAAgAMAAIYBAACfAAAAvwEAAP+PAAD//wAA//8AAA==';
  171.  
  172. menu.AddItem('Twitter', tweet + ' ' + data.url, link, icon, true)
  173. }
  174.  
  175. // Userscripts
  176. if (document.querySelector('.file .file-actions a[href$=".user.js" i]')) {
  177. const 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';
  178. const userscripts = document.querySelectorAll('.file .file-actions a[href$=".user.js"]')
  179. Array.prototype.forEach.call(userscripts, function(userscript) {
  180. const text = String.format('Userscript "{0}"', userscript.href.split('/').pop())
  181. menu.AddItem(text, null, userscript.href, icon, false)
  182. })
  183. }
  184.  
  185. // Dabblet
  186. if (document.querySelector('.file .type-css, .file .type-html, .file .type-javascript')) {
  187. const link = 'http://dabblet.com/gist/' + data.url.split('/').pop()
  188. const icon = 'data:image/vnd.microsoft.icon;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////AQAAAAMAAAAPAAAAHwAAACcAAAAfAAAADwAAAAP///8B////AQAAAAUAAAARAAAAHwAAAB0AAAAJ////AQAAAAcAAAAjqqqqb9vb28Xn5+fb29vbxaqqqm8AAAAjAAAABwAAAAkAAAApvLy8hd7e3snl5eXBAAAAIwAAAAMAAAAjzc3Nqf39/f/////////////////9/f3/0NDQqQAAACEAAAAp2NjYvf///////////////wAAADEAAAAPra2tc/39/f////////////b29vn///////////39/f8AAABFvLy8jf///////////f39/97e3r8AAAAhAAAAIdzc3Mf//////////66urp8AAABNrq6un///////////AAAAXePj49v//////Pz8/YqKin0AAAAlAAAACQAAACnq6urj//////Hx8fUAAABJAAAADQAAAEnv7+/z/////wAAAGXx8fHz/////+Tk5N8AAAAzAAAAA////wEAAAAh3d3dy///////////l5eXjQAAAEWXl5eN//////////8AAABp9fX19f/////g4ODVAAAAKf///wH///8BAAAAEbm5uYP///////////39/f/u7u7x/f39////////////AAAAafX19fX/////4ODg1QAAACn///8B////AQAAAAUAAAAn19fXu////////////////////////////////wAAAGn19fX1/////93d3dtoaGhXXFxcJwAAAAv///8BAAAABwAAACe5ubmF4+Pj1e/v7+nd3d3f8/Pz+f////8AAABp9fX19f/////c3Nzl7e3t5+zs7M0AAAAh////Af///wEAAAAFAAAAEwAAACUAAAAtAAAAU+np6ev/////AAAAafX19fX/////3Nzc5e3t7efs7OzNAAAAIf///wH///8B////Af///wH///8B////AQAAAC/r6+vn/////wAAAGn19fX1/////93d3dtpaWlVXFxcJwAAAAv///8B////Af///wH///8B////Af///wEAAAAh5ubm0/////8AAABd9fX18f/////i4uLLAAAAH////wH///8B////Af///wH///8B////Af///wH///8BAAAADXR0dEXs7Oy/AAAANbm5uXvz8/PjkpKSVQAAAA3///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAALAAAAFQAAAA0AAAAVAAAAHwAAAA////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w=='
  189. menu.AddItem('Dabblet', link, link, icon, true)
  190. }
  191.  
  192. // Bl.ocks
  193. if (document.querySelector('.file .file-actions a[href$="index.html" i], .file .file-actions a[href$="README.md" i]')) {
  194. const link = data.url.replace('https://gist.github.com/', 'https://bl.ocks.org/')
  195. const icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC0klEQVQ4jaWTTWhcZRSGn++7f3PnTqaTtrRJp4OVlmkzYbRRSQUJrkQoFEVw5UJQGRcVhO66KAxdihXdCFkWusrSIliIESuFRrASf2slY2xDaZN2Mpm5P3P/vq+LEAIprnyXh8Nzznl5D/xPid2Fq+120Yt7UypJjhzvRVe039tq9MrcrnjvGo69HDiVn8+02yGAuRtwaDhYeCZSp3ScobTCefY4ZBlxd52Tsb4stGZFbS4CLwPI3YDyvyvT9kiZ0uQU2BaDlTsMVjtgW5ROPIftjTDS+Xv663Nn6wBme7ZVDJLi1DBLjhTHzSvWXAdZrxP8eBOR5ux/5TUA+r//xODXW+RphCsNYRm6CGDGZnmhUi2citOEJIsRUmLt2YtoTBL+tkTQuQ1Ck/kh0pJIYYDYWVxuGhvTRbvIsYNHMaWFMLZ81UjciSbm4RpZt4u0JGLbc612AKlOxPOHX+Sx3yXTOYk06V/7ChBopSDP0VpvTQbSsE+YxXrebexrtWeLpiEMvEKJxqEm1T09Ft6qMHF9hdr1b/AqB3AnmximTTKMGEab3B09yPf1t0U6Wp031+8tmkJIsiwlyWIcy6FUq3F15hGFpZc4ff8G1RvfkivNA9dlvv46d8cmmTh6gGwjYLlvTZtCodcGD0Wuc/I8I85TlFYsiXFe+PAi1/68x2o3plEfxwNYXuOvzjrDOMV0CsJ0NrxX529+NyfKaqxZa+I5HqZhI6WgVHBoHKtSC2L+WffpBwlhnGIKgTQNpNyJsvj4s4/eC2z/C7tseForHi6/SeuNkzweREggTDJ++GUVlEYYAiEkvV709C+0Pm3tT/zED9SZ8PTMCaERqDxnmCoW/7iPZRlorQj8hHAQ6qcA2/rg/JczkXTncnvf2FRjnJJrc+vOGlGcMOiFuPnGI1cM3/lPwPZprQuz728mhc+1O+plKkeE/agk/QuXPzl7CeAJlkc5xMckqesAAAAASUVORK5CYII='
  196. menu.AddItem('Bl.ocks', link, link, icon, true)
  197. }
  198. }
  199. }
  200.  
  201. // Init
  202. addMenu()
  203.  
  204. // Pjax
  205. document.addEventListener('pjax:end', addMenu)
  206.  
  207. })()