// ==UserScript== // @name GitHub 文件夹下载 // @namespace https://github.com/the-eric-kwok/my_userscripts // @version 0.6 // @description 为 GitHub 文件夹增加一个下载按钮,可以方便地下载某个文件夹 // @author EricKwok // @supportURL https://github.com/the-eric-kwok/my_userscripts/issues // @match *://github.com/* // @icon https://i.loli.net/2021/03/30/ULV9XunaHesqGIR.png // @run-at document-idle // @grant none // @license GPLv3 // @downloadURL https://update.greasyfork.icu/scripts/434592/GitHub%20%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E8%BD%BD.user.js // @updateURL https://update.greasyfork.icu/scripts/434592/GitHub%20%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E8%BD%BD.meta.js // ==/UserScript== // 记录页面宽度是否允许 GitHub 展开完整页面的变量 var isFold = false; // 注入下载文件夹按钮 function injectDownloadFolderBtn() { if (document.querySelector('.github-folder-download')) return; if (isFold) { // 收起状态(移动端) let devider = document.querySelector("details.d-block > div > ul > li.dropdown-divider"); if (devider) { let _html = `
  • Download folder with...

  • download-directory
  • DownGit
  • `; devider.insertAdjacentHTML("afterend", _html); } } else { // 展开状态(PC端) let html = document.querySelector(".btn.mr-2.d-none.d-md-block"); if (html) { let _html = `
    Download folder `; html.insertAdjacentHTML("beforebegin", _html); } } } function removeAllInjectedElem() { document.querySelectorAll(".github-folder-download").forEach(elem => elem.remove()); } function detectFoldUnfold() { if (document.body.clientWidth <= 767 && !isFold) { console.log("收起" + document.body.clientWidth); isFold = true; } else if (document.body.clientWidth > 767 && isFold) { console.log("展开" + document.body.clientWidth); isFold = false; } } function reinject() { if (document.querySelector(".file-navigation") && document.querySelector('[title="Go to parent directory"]')) { // 仅当处于文件夹内时注入按钮 removeAllInjectedElem(); injectDownloadFolderBtn(); } } function main() { detectFoldUnfold(); reinject(); } (function () { 'use strict'; /** * 在浏览器窗口大小改变时自动重新定位设置菜单 */ window.onresize = function () { // 监听窗口大小改变 main(); } let oldPushState = history.pushState; history.pushState = function pushState() { let ret = oldPushState.apply(this, arguments); window.dispatchEvent(new Event('pushstate')); window.dispatchEvent(new Event('locationchange')); return ret; }; let oldReplaceState = history.replaceState; history.replaceState = function replaceState() { let ret = oldReplaceState.apply(this, arguments); window.dispatchEvent(new Event('replacestate')); window.dispatchEvent(new Event('locationchange')); return ret; }; window.addEventListener('popstate', () => { window.dispatchEvent(new Event('locationchange')); }); document.addEventListener('pjax:success', function () { // 由于 GitHub 使用 pjax 而不是页面跳转的方式在仓库内导航,因此将 main 函数绑定到 pjax 监听器上 window.dispatchEvent(new Event('locationchange')); }); window.addEventListener('locationchange', function () { console.log('locationchange!'); main(); }); main(); })();