// ==UserScript==
// @name HTML表格转化为Markdown表格
// @namespace http://tampermonkey.net/
// @version 0.6
// @description 在指定网站的表格上方添加按钮,点击将表格以Markdown格式复制到剪贴板
// @author lsovaber
// @match https://blog.csdn.net/*
// @match https://www.cnblogs.com/*
// @match https://www.runoob.com/*
// @match https://www.jianshu.com/*
// @match https://*.zhihu.com/*
// @match https://www.quanxiaoha.com/*
// @match https://www.geeksforgeeks.org/*
// @match https://online.stat.psu.edu/stat800/*
// @match https://www.javatpoint.com/*
// @match https://cloud.tencent.com/*
// @match https://scikit-learn.org/*
// @match https://www.w3school.com.cn/*
// @match https://www.w3cschool.cn/*
// @match http://c.biancheng.net/*
// @match https://juejin.cn/*
// @grant GM.setClipboard
// @license MIT
// @downloadURL none
// ==/UserScript==
(function () {
'use strict';
const NL = "\n";
// 存放Markdown表格
let processor = document.createElement("processor");
// 获取
let table = document.getElementsByTagName("table");
// 大多数网站块代码在里
let pre = document.getElementsByTagName("pre");
setTimeout(init, 500);
function convertTableElementToMarkdown(tableEl) {
const rows = [];
const trEls = tableEl.getElementsByTagName('tr');
for (let i = 0; i < trEls.length; i++) {
const tableRow = trEls[i];
const markdownRow = convertTableRowElementToMarkdown(tableRow, i);
rows.push(markdownRow);
}
return rows.join(NL);
}
function convertTableRowElementToMarkdown(tableRowEl, rowNumber) {
const cells = [];
const cellEls = tableRowEl.children;
for (let i = 0; i < cellEls.length; i++) {
const cell = cellEls[i];
cells.push(cell.innerText + ' |');
}
let row = '| ' + cells.join(" ");
if (rowNumber === 0) {
row = row + NL + createMarkdownDividerRow(cellEls.length);
}
return row;
}
function createMarkdownDividerRow(cellCount) {
const dividerCells = [];
for (let i = 0; i < cellCount; i++) {
dividerCells.push('---' + ' |');
}
return '| ' + dividerCells.join(" ");
}
function convertTable(x) {
const content = "
";
processor.innerHTML = content.replace(/\s+/g, ' ');
const tables = processor.getElementsByTagName('table');
let markdownResults = '';
if (tables) {
for (let e of tables) {
const markdownTable = convertTableElementToMarkdown(e);
markdownResults += markdownTable + NL + NL;
}
let p = document.createElement("p");
p.innerHTML = "复制成功";
GM.setClipboard(markdownResults);
x.parentNode.insertBefore(p, x);
} else {
console.log('No table found');
}
}
function copyCode(x) {
let text;
if (window.location.href.indexOf("juejin") !== -1) {
text = x.innerText.replace("javascript.*复制代码", "");
} else {
text = x.innerText;
}
GM.setClipboard(text);
}
function createButtons(x, type) {
for (let i = 0; i < x.length; i++) {
let button = document.createElement("button");
button.innerText = `Copy ${type}`;
button.style.zIndex = '999';
// 点击按钮,进行转化
button.addEventListener('click', function () {
if (type === "Table") {
convertTable(x[i])
} else {
copyCode(x[i]);
}
})
x[i].parentNode.insertBefore(button, x[i]);
}
}
function init() {
createButtons(table, "Table");
createButtons(pre, "Code");
if (window.location.href.indexOf("runoob") !== -1) {
// 菜鸟教程的代码块
let example_code = document.getElementsByClassName("example_code");
createButtons(example_code, "Code");
} else if (window.location.href.indexOf("cnblogs") !== -1) {
let cn_blogs = document.getElementsByClassName("code");
createButtons(cn_blogs, "Code");
}
}
})();