Greasy Fork

复制格式转换 (Markdown)

将选中内容复制为 Markdown 格式(支持数学公式)。

目前为 2025-04-11 提交的版本。查看 最新版本

// ==UserScript==
// @name         复制格式转换 (Markdown)
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  将选中内容复制为 Markdown 格式(支持数学公式)。
// @author       KiwiFruit
// @match        *://*/*
// @grant        GM_setClipboard
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // 监听鼠标释放事件
    document.addEventListener('mouseup', handleMouseUp);

    // 处理鼠标释放事件
    function handleMouseUp() {
        const selection = window.getSelection();
        if (selection && !selection.isCollapsed) {
            // 弹出确认提示框
            const shouldConvert = confirm('将内容复制为 Markdown 格式?');
            if (shouldConvert) {
                // 获取选中的范围
                const range = selection.getRangeAt(0);
                const selectedContent = extractSelectedContent(range);
                const markdownContent = convertToMarkdown(selectedContent);

                // 复制到剪贴板
                copyToClipboard(markdownContent);
                alert('内容已复制为 Markdown 格式!');
            }
        }
    }

    // 提取选中内容
    function extractSelectedContent(range) {
        const fragment = range.cloneContents(); // 克隆选中的 DOM 内容
        const tempDiv = document.createElement('div');
        tempDiv.appendChild(fragment);

        // 提取文本、图片和链接
        const text = tempDiv.innerText.trim();
        const images = Array.from(tempDiv.querySelectorAll('img')).map(img => img.src);
        const links = Array.from(tempDiv.querySelectorAll('a')).map(a => ({ text: a.innerText, href: a.href }));

        // 提取数学公式
        const mathElements = Array.from(tempDiv.querySelectorAll('.MathJax, .katex-mathml'));
        const formulas = mathElements.map(mathElement => {
            const latex = mathElement.getAttribute('data-latex') || mathElement.textContent.trim();
            return latex ? latex : null;
        }).filter(Boolean); // 过滤掉空值

        return { text, images, links, formulas };
    }

    // 转换为 Markdown 格式
    function convertToMarkdown(content) {
        let markdown = '';

        // 添加文本内容
        if (content.text) {
            markdown += `${content.text}\n\n`;
        }

        // 添加图片
        content.images.forEach(image => {
            markdown += `![Image](${image})\n\n`;
        });

        // 添加链接
        content.links.forEach(link => {
            markdown += `[${link.text}](${link.href})\n\n`;
        });

        // 添加数学公式
        content.formulas.forEach(formula => {
            markdown += `$$${formula}$$\n\n`; // 块级公式
        });

        return markdown.trim();
    }

    // 复制到剪贴板
    function copyToClipboard(text) {
        if (typeof GM_setClipboard === 'function') {
            GM_setClipboard(text); // 使用油猴的剪贴板 API
        } else {
            navigator.clipboard.writeText(text).then(() => {
                console.log('Markdown 已复制到剪贴板');
            }).catch(err => {
                console.error('复制失败:', err);
            });
        }
    }
})();