Gitmind批量导出文件为pdf

Gitmind在目录页面将文件批量导出为pdf

当前为 2020-08-17 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Gitmind批量导出文件为pdf
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Gitmind在目录页面将文件批量导出为pdf
// @author       Ctrl+T
// @match         https://gitmind.cn/app/doc/*
// @match         https://gitmind.cn/app/my/dir/*
// @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;
}