Github Gist Share

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

目前為 2015-03-05 提交的版本,檢視 最新版本

  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.4
  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*/) { return true; },
  30. submit: function(url, user, description, files, stars, forks, revisions) {
  31. var stats = [];
  32. if (files > 1) {
  33. stats.push(files + " files");
  34. }
  35. if (stars === 1) {
  36. stats.push(stars + " star");
  37. } else if (stars > 1) {
  38. stats.push(stars + " stars");
  39. }
  40. if (forks === 1) {
  41. stats.push(forks + " fork");
  42. } else if (forks > 1) {
  43. stats.push(forks + " forks");
  44. }
  45. if (revisions > 1) {
  46. stats.push(revisions + " revisions");
  47. }
  48.  
  49. var tweet = String.format("Check out {0} #gist {1} on @github{2} |",
  50. user === document.querySelector(".name").textContent.trim() ? "my" : user + "'s",
  51. description ? "\"" + description + "\"" : "",
  52. stats.length > 0 ? " | " + stats.join(", ") : "");
  53.  
  54. return "https://twitter.com/intent/tweet?original_referer=" + encodeURIComponent(url) +
  55. "&source=tweetbutton&url=" + encodeURIComponent(url) +
  56. "&text=" + encodeURIComponent(tweet);
  57. },
  58. icon: "https://si0.twimg.com/favicons/favicon.ico"
  59. },
  60. Dabblet: {
  61. /*
  62. * The following urls should be converted to dabblet:
  63. * _______
  64. * - https://gist.github.com/jerone/3810309
  65. * _______
  66. * - https://gist.github.com/jerone/3810309/revisions
  67. * _______
  68. * - https://gist.github.com/jerone/3810309/forks
  69. * _______
  70. * - https://gist.github.com/jerone/3810309/stars
  71. * ________________________________________________
  72. * - https://gist.github.com/jerone/3810309/f2815cc6796ea985f74b8f5f3c717e8de3b12d37
  73. * ________________________________________________
  74. * - https://gist.github.com/3810309/f2815cc6796ea985f74b8f5f3c717e8de3b12d37
  75. *
  76. */
  77. show: function(/*url, user, description, files, stars, forks, revisions*/) { return true; },
  78. submit: function(url, user/*, description, files, stars, forks, revisions*/) {
  79. var linkLong;
  80. if ((linkLong = document.querySelector(".site-container.js-site-container")) && linkLong.dataset.url) {
  81. var linkLongParts = linkLong.dataset.url.split("/");
  82. linkLongParts.shift();
  83. if (/^(?:revisions|forks|stars)$/gi.test(linkLongParts[linkLongParts.length - 1])) {
  84. linkLongParts.pop();
  85. }
  86. if (new RegExp(user, "gi").test(linkLongParts[0])) {
  87. linkLongParts.shift();
  88. }
  89. url = "/" + linkLongParts.join("/");
  90. } else {
  91. url = url.replace(new RegExp("https?:\/\/gist.github.com/" + user, "gi"), "");
  92. }
  93. return "http://dabblet.com/gist" + url;
  94. },
  95. icon: "http://dabblet.com/favicon.ico"
  96. },
  97. UserScript: {
  98. show: function(/*url, user, description, files, stars, forks, revisions*/) {
  99. return !!document.querySelector(".file[id^='file-'] .raw-url[href$='.user.js']");
  100. },
  101. submit: function(/*url, user, description, files, stars, forks, revisions*/) {
  102. return (document.querySelector(".file[id^='file-'] .raw-url[href$='.user.js']") || { href: "" }).href.trim();
  103. },
  104. 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"
  105. }
  106. };
  107.  
  108. function addMenuItem() {
  109. var link, url, menu, li, user, description, files, stars, forks, revisions;
  110.  
  111. if ((link = document.querySelector(".js-current-repository")) && (menu = document.querySelector('.sunken-menu-group'))) { // check if we're on an actual gists;
  112. url = link.href;
  113. user = document.querySelector(".author.vcard").textContent.trim();
  114. description = (document.querySelector(".gist-description") || link || { textContent: "" }).textContent.trim();
  115. files = document.querySelectorAll(".file[id^='file-']").length;
  116. stars = parseInt((menu.querySelector("a[href$='/stars'] .counter") || { textContent: "0" }).textContent.trim(), 10);
  117. forks = parseInt((menu.querySelector("a[href$='/forks'] .counter") || { textContent: "0" }).textContent.trim(), 10);
  118. revisions = parseInt((menu.querySelector("a[href$='/revisions'] .counter") || { textContent: "0" }).textContent.trim(), 10);
  119.  
  120. menu.appendChild(li = document.createElement("li"));
  121. li.id = "Github_Gist_Share";
  122.  
  123. for (var key in socials) {
  124. if (socials.hasOwnProperty(key)) {
  125. var social = socials[key],
  126. socialA = document.createElement("a"),
  127. socialImg = document.createElement("img");
  128.  
  129. if (social.show(url, user, description, files, stars, forks, revisions) !== true) { continue; }
  130.  
  131. li.appendChild(socialA);
  132. socialA.appendChild(socialImg);
  133. socialA.id = String.format("{0}_{1}", li.id, key.replace(/\s+/g, "_"));
  134. socialA.classList.add("sunken-menu-item");
  135. socialA.href = social.submit && social.submit(url, user, description, files, stars, forks, revisions);
  136. socialA.title = String.format("[{0}] {1}", key, socialA.href);
  137. socialA.style.display = "inline-block";
  138. socialA.target = "_blank";
  139. socialImg.src = social.icon;
  140. socialImg.alt = key;
  141. }
  142. }
  143. }
  144. }
  145.  
  146. // init;
  147. addMenuItem();
  148.  
  149. // on pjax;
  150. unsafeWindow.$(document).on("pjax:success", addMenuItem);
  151.  
  152. })();