您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a button that contains a list of gist raw file links
当前为
- // ==UserScript==
- // @name Gist Raw Links
- // @version 0.1.1
- // @description Add a button that contains a list of gist raw file links
- // @license MIT
- // @author Rob Garrison
- // @namespace https://github.com/Mottie
- // @include https://gist.github.com/*
- // @run-at document-idle
- // @grant GM_addStyle
- // @grant GM_xmlhttpRequest
- // @connect api.github.com
- // @icon https://github.com/fluidicon.png
- // ==/UserScript==
- (() => {
- "use strict";
- GM_addStyle(`
- .ghrl-get-list * { pointer-events:none; }
- .ghrl-files > div { text-align:center; pointer-events:none; }
- .ghrl-files a { cursor:pointer; }
- `);
- const item = document.createElement("li");
- item.className = "dropdown js-menu-container";
- function addButton(node) {
- const button = item.cloneNode();
- button.innerHTML = `
- <a href="#" class="js-menu-target tooltipped tooltipped-n ghrl-get-list" aria-label="Open list of raw urls">
- ? Raw urls <span class="dropdown-caret"></span>
- </a>
- <div class="dropdown-menu-content">
- <ul class="dropdown-menu dropdown-menu-sw ghrl-files">
- <div>
- <img src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif" width="32" alt="">
- </div>
- </ul>
- </div>`;
- node.insertBefore(button, node.childNodes[0]);
- }
- function update() {
- const gists = $$(".gist-snippet");
- let indx = gists.length;
- if (indx) {
- while (indx--) {
- // only save dabblet files from list
- if (!$(".ghrl-get-list", gists[indx])) {
- addButton($(".gist-count-links", gists[indx]));
- }
- }
- }
- }
- function loadFileList(link) {
- let url,
- el = closest(".dropdown", link);
- el = $("a", el.nextElementSibling);
- if (el) {
- url = el.href.split("/");
- GM_xmlhttpRequest({
- method : 'GET',
- url : `https://api.github.com/gists/${url.pop()}`,
- onload : function(response) {
- var json = false;
- try {
- json = JSON.parse(response.responseText);
- } catch (err) {
- console.error(`Invalid JSON for gist ${gistid}`);
- return false;
- }
- if (json && json.files) {
- addList(link, json.files);
- }
- }
- });
- }
- }
- function addList(link, files) {
- let html = "";
- Object.keys(files).forEach(file => {
- html += `
- <a class="dropdown-item ghrl-file" href="${files[file].raw_url}">
- ${file}
- </a>`;
- });
- $(".ghrl-files", link.parentNode).innerHTML = html;
- }
- function removeBackdrop(event) {
- event.preventDefault();
- const el = $(".modal-backdrop");
- if (el) {
- el.removeEventListener("click", removeBackdrop);
- el.parentNode.removeChild(el);
- $$(".ghrl-get-list").forEach(el => {
- el.classList.remove("selected");
- el.parentNode.classList.remove("active");
- });
- }
- }
- function addBindings() {
- document.addEventListener("click", function(event) {
- let flag;
- const target = event.target;
- if (target.classList.contains("ghrl-get-list")) {
- event.preventDefault();
- if (!$(".dropdown-item", target.parentNode)) {
- loadFileList(target);
- }
- // let GitHub process the elements
- setTimeout(() => {
- flag = !target.classList.contains("selected");
- const el = $(".modal-backdrop");
- if (el) {
- el.addEventListener("click", removeBackdrop);
- }
- }, 100);
- } else if (
- target.classList.contains("ghrl-file") &&
- // left mouse click only
- event.button === 0 &&
- // check for keyboard modifier + left click - the browser handles these
- // clicks differently
- !(event.shiftKey || event.ctrlKey || event.metaKey)
- ) {
- // allow left click to pass through
- window.location.href = target.href;
- }
- }, false);
- }
- function $(str, el) {
- return (el || document).querySelector(str);
- }
- function $$(str, el) {
- return Array.from((el || document).querySelectorAll(str));
- }
- function closest(selector, el) {
- while (el && el.nodeType === 1) {
- if (el.matches(selector)) {
- return el;
- }
- el = el.parentNode;
- }
- return null;
- }
- document.addEventListener("pjax:end", update);
- update();
- addBindings();
- })();