// ==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 = "
" + x.innerHTML + "
"; 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"); } } })();