// ==UserScript== // @name 一键复制HTML表格/网页代码/latex公式 // @namespace https://greasyfork.org/zh-CN/scripts/454641 // @version 0.8.2 // @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 https://c.biancheng.net/* // @match https://juejin.cn/* // @match https://www.statology.org/* // @match https://stats.stackexchange.com/* // @run-at document-end // @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");

    // 设置延迟,防止elements还未创建
    setTimeout(init, 1000);


    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 = "复制成功"; navigator.clipboard.writeText(markdownResults) .then(() => { console.log('文本已经成功复制到剪切板'); }) .catch(err => { // 如果用户没有授权,则抛出异常 console.error('无法复制此文本:', err); }); // GM.setClipboard(markdownResults); x.parentNode.insertBefore(p, x); } else { console.log('No table found'); } } function copyCode(x) { let text = window.location.href.includes("juejin") ? x.innerText.replace(/^.*\n.*复制代码/g, "") : x.innerText; navigator.clipboard.writeText(text) .then(() => { console.log('文本已经成功复制到剪切板'); }) .catch(err => { // 如果用户没有授权,则抛出异常 console.error('无法复制此文本:', err); }); } function copyMathFormula(x) { navigator.clipboard.writeText(x.innerText) .then(() => { console.log('文本已经成功复制到剪切板'); }) .catch(err => { // 如果用户没有授权,则抛出异常 console.error('无法复制此文本:', err); }); } function createButtons(x, type) { [...x].forEach((value, index) => { let button = document.createElement("button"); button.innerText = `Copy ${type}`; // button.style.zIndex = '999'; button.addEventListener('click', () => (type === "Table") ? convertTable(x[index]) : (type === "Code") ? copyCode(x[index]) : copyMathFormula(x[index]) ) x[index].parentNode.insertBefore(button, x[index]); }) } function init() { createButtons(table, "Table"); createButtons(pre, "Code"); // 获取使用MathJax渲染的latex公式 createButtons(document.querySelectorAll('script[type^="math/tex"]'), "Math"); let url = window.location.href if (url.includes("runoob")) { // 菜鸟教程的代码块 let example_code = document.getElementsByClassName("example_code"); createButtons(example_code, "Code"); } else if (url.includes("cnblogs") || url.includes("www.geeksforgeeks.org")) { let cn_blogs = document.getElementsByClassName("code"); createButtons(cn_blogs, "Code"); } } })();