// ==UserScript== // @name 极客时间文章正文 // @namespace https://github.com/LazyBug1E0CF // @version 0.3 // @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/turndown/dist/turndown.js // @downloadURL none // ==/UserScript== (function() { 'use strict'; const KEY_CONTENT = "mdContent"; const KEY_TITLE = "mdTitle"; const articleRequestUrlRegex = /^https?:\/\/time\.geekbang\.org\/serv\/v\d\/article/; const mdService = new TurndownService(); 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.turndown("

" + title + "

" + 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]); aTag.download = fileName; aTag.href = URL.createObjectURL(blob); aTag.click(); URL.revokeObjectURL(blob); } })();