// ==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);
}
})();