Greasy Fork 还支持 简体中文。

Gitmind批量导出文件为pdf

在Gitmind目录页一键导出当前目录下文件为pdf

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Gitmind批量导出文件为pdf
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  在Gitmind目录页一键导出当前目录下文件为pdf
// @author       Ctrl+T
// @match         https://gitmind.cn/app/doc/*
// @match         https://gitmind.cn/app/my/dir/*
// @match         https://gitmind.cn/app/my
// @grant        GM_openInTab
// ==/UserScript==

(function () {
    let url = window.location.href;
    if (url.includes('my')) { // 目录页
        addButton();
    } else if (url.includes('doc') && url.includes('export')) { // 文件页
        download();
    }
})();

/**
 * 增加按钮“批量导出”到“多选”之后
 */
function addButton() {
    let parentDom = document.querySelector('.tool-bar > div');
    let buttonDom = document.createElement('div');
    let batchButtonDom = document.querySelector('.tool-bar .batch-btn');
    buttonDom.innerText = '批量导出'
    buttonDom.className = 'mind-btn fr';
    buttonDom.onclick = function() {
        getDirGuid();
    }
    parentDom.insertBefore(buttonDom, batchButtonDom);
}

/**
 * 第一步:获取目录号
 */
function getDirGuid() {
    let url = window.location.href;
    if (url.includes('dir')) { // 非根页面,直接从url获取dirguid
        getLs(url.substring(url.lastIndexOf("\/")+1, url.length));
    } else { // 根页面,使用ajax获取
        let xhr = customXMLHttpRequest('post','https://api.gitmind.cn/api/get_root_dir',true);
        xhr.send('{"naotu_type":0}');
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                getLs(xhr.response['data']['file_guid']);
            }
        }
    }
}

/**
 * 第二步:使用目录号获取本页面所有文件信息
 * @param {String} dirGuid 目录号
 */
function getLs(dirGuid) {
    let xhr = customXMLHttpRequest('post','https://api.gitmind.cn/api/ls',true);
    let payLoad = {
        'dir_guid': dirGuid,
        'naotu_type': 0
    }
    xhr.send(JSON.stringify(payLoad));
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            openFiles(xhr.response.data)
        }
    }
}

/**
 * 第三步:根据文件列表打开对应网页进行下载
 * @param {List} files 文件列表
 */
function openFiles(files) {
    for (let file of files) {
        if (file['file_type'] == 'directory') {
            getLs(file['file_guid']);
        } else if (file['file_type'] == 'file') {
            GM_openInTab('https://gitmind.cn/app/doc/' + file['file_guid'] + '?export')
        }
    }
}

/**
 * 自定义XHR对象闭包,提前设定好token
 */
let customXMLHttpRequest = (function (jwtoken) {

    function getXMLHttpRequest(method, url, async){
        var xmlHttpRequest = new XMLHttpRequest();
        xmlHttpRequest.open(method, url, async);
        xmlHttpRequest.setRequestHeader('Authorization', 'Bearer ' + jwtoken);
        xmlHttpRequest.setRequestHeader('Content-Type', 'application/json;charset=UTF-8')
        xmlHttpRequest.responseType = 'json';
        return xmlHttpRequest;
    }

    return getXMLHttpRequest;
})(localStorage.getItem('mindmap_api_token'));

/**
 * 文件页的下载脚本
 */
function download() {
    // 替换XHR函数
    replaceXHR();

    // 外轮询,等待界面上的“导出”按钮出现
    let outerInterval = setInterval(function () {
        let exportBtn = document.querySelector('.editor-header-right button:last-child');
        if (exportBtn) {
            exportBtn.click()
            clearInterval(outerInterval);

            // 内轮询,等待模态框中的单选按钮出现
            let innerInterval = setInterval(function () {
                let radios = document.querySelectorAll('.dialog-body .radio-item');
                if (radios.length) {
                    clearInterval(innerInterval);
                    for (let radio of radios) {
                        if (radio.getElementsByClassName('el-radio__label')[0].textContent == 'PDF') { // 选择类别为pdf
                            radio.click();
                            let modalExportBtn = document.querySelector('.dialog-btns button')
                            modalExportBtn.click();
                            break;
                        }
                    }
                }
            }, 20)
        }
    }, 20)
}

/**
 * 替换XHR函数,使得下载完成后自动关闭页面
 */
function replaceXHR() {
    var open = window.XMLHttpRequest.prototype.open,
        send = window.XMLHttpRequest.prototype.send;

    function openReplacement(method, url, async, user, password) {
        this._url = url;
        return open.apply(this, arguments);
    }

    function sendReplacement(data) {
        if (this.onreadystatechange) {
            this._onreadystatechange = this.onreadystatechange;
        }
        this.onreadystatechange = onReadyStateChangeReplacement;
        return send.apply(this, arguments);
    }

    function onReadyStateChangeReplacement() {
        // 下载完成后自动关闭页面
        if (this._url == "https://api.gitmind.cn/api/export-pdf" && this.readyState == 4) {
            window.open(location, '_self').close();
        }

        if (this._onreadystatechange) {
            return this._onreadystatechange.apply(this, arguments);
        }
    }

    window.XMLHttpRequest.prototype.open = openReplacement;
    window.XMLHttpRequest.prototype.send = sendReplacement;
}