极客时间文章保存

在极客时间文字课程页面增加一个保存按钮,点击后将正文以markdown格式下载保存

目前為 2019-12-31 提交的版本,檢視 最新版本

// ==UserScript==
// @name         极客时间文章保存
// @namespace    https://github.com/LazyBug1E0CF
// @version      0.4
// @description  在极客时间文字课程页面增加一个保存按钮,点击后将正文以markdown格式下载保存
// @author       L
// @match        *://time.geekbang.org/column/article/*
// @grant        none
// @require      https://unpkg.com/ajax-hook/dist/ajaxhook.min.js
// @require      https://unpkg.com/showdown/dist/showdown.min.js
// ==/UserScript==

(function() {
    'use strict';

    const KEY_CONTENT = "mdContent";
    const KEY_TITLE = "mdTitle";
    const FILE_TYPE = "application/md";
    const articleRequestUrlRegex = /^https?:\/\/time\.geekbang\.org\/serv\/v\d\/article/;
    const mdService = new showdown.Converter();


    hookAjax({
        //拦截回调
        onreadystatechange:function(xhr){
            //console.log("onreadystatechange called: %O",xhr)
            if (xhr.readyState === 4 && articleRequestUrlRegex.test(xhr.responseURL)) {
                console.log(xhr.response);
                let resJson = JSON.parse(xhr.response);
                let title = resJson.data.article_title;
                let data = resJson.data.article_content;
                const mdContent = mdService.makeMarkdown("<h1>" + title + "</h1>" + data);
                sessionStorage.setItem(KEY_TITLE, title);
                sessionStorage.setItem(KEY_CONTENT, mdContent);

                let intv = setInterval(() => {
                    let rightTools = document.querySelector("div.ps");
                    if (rightTools) {
                        clearInterval(intv);
                        genSaveBtn();
                    }
                }, 1000);
            }
        }
    });

    const genSaveBtn = () => {
        let saveBtn = document.querySelector("#save_btn");
        if (saveBtn) {
//             saveBtn.onclick = () => {
//                 createAndDownloadFile("正文.md", sessionStorage.getItem(KEY_CONTENT));
//             }
        }
        else {
            // 找到页面右侧的工具栏
            const rightTools = document.querySelector("div.ps").nextElementSibling;
            // 取得第一个工具按钮的class,用于拷贝
            let firstTool = rightTools.firstElementChild;
            const cpClass = firstTool.className;
            // 生成保存按钮
            saveBtn = document.createElement("div");
            saveBtn.id = "save_btn";
            saveBtn.className = cpClass;
            saveBtn.style.top = firstTool.offsetTop - 60 + "px";
            saveBtn.style.border = 0;
            saveBtn.textContent = "存";
            saveBtn.onclick = () => {
                createAndDownloadFile(sessionStorage.getItem(KEY_TITLE) + ".md", sessionStorage.getItem(KEY_CONTENT));
            };
            rightTools.insertBefore(saveBtn, firstTool);
        }
    }

    const createAndDownloadFile = (fileName, content) => {
        let aTag = document.createElement('a');
        let blob = new Blob([content], {type: FILE_TYPE});
        aTag.download = fileName;
        aTag.href = URL.createObjectURL(blob);
        aTag.click();
        URL.revokeObjectURL(blob);
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址