// ==UserScript== // @name 复制格式转换(Markdown) // @namespace http://tampermonkey.net/ // @version 2.1 // @description 选中内容后浮现按钮,点击自动复制为完整 Markdown 格式,确保排版与原文一致。支持数学公式、代码块语言标识、表格对齐。 // @author KiwiFruit // @match *://*/* // @grant GM_setClipboard // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/532490/%E5%A4%8D%E5%88%B6%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2%EF%BC%88Markdown%EF%BC%89.user.js // @updateURL https://update.greasyfork.icu/scripts/532490/%E5%A4%8D%E5%88%B6%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2%EF%BC%88Markdown%EF%BC%89.meta.js // ==/UserScript== (function () { 'use strict'; const config = { preserveEmptyLines: false, // 是否保留空行 addSeparators: true, // 数学公式使用 $$ 分隔符 mathSelector: '.math-formula', // 数学公式自定义选择器 }; // 创建浮动按钮 const floatingButton = createFloatingButton(); // 创建预览窗口 const previewWindow = createPreviewWindow(); function createFloatingButton() { const button = document.createElement('button'); button.id = 'markdownCopyButton'; button.innerText = '复制为 MD (Ctrl+Shift+C)'; Object.assign(button.style, { position: 'fixed', top: '20px', right: '20px', padding: '10px 20px', backgroundColor: '#007bff', color: '#fff', border: 'none', borderRadius: '5px', cursor: 'pointer', zIndex: '9999', display: 'none', boxShadow: '0 4px 6px rgba(0,0,0,0.1)', transition: 'opacity 0.3s ease-in-out' }); document.body.appendChild(button); return button; } function createPreviewWindow() { const preview = document.createElement('div'); preview.id = 'markdownPreview'; Object.assign(preview.style, { position: 'fixed', top: '60px', right: '20px', width: '300px', maxHeight: '400px', overflowY: 'auto', padding: '10px', backgroundColor: '#fff', border: '1px solid #ddd', boxShadow: '0 4px 6px rgba(0,0,0,0.1)', zIndex: '9999', display: 'none', fontFamily: 'monospace', fontSize: '14px', whiteSpace: 'pre-wrap', wordWrap: 'break-word' }); document.body.appendChild(preview); return preview; } function showFloatingButton() { floatingButton.style.display = 'block'; } function hideFloatingButton() { floatingButton.style.display = 'none'; previewWindow.style.display = 'none'; } function convertToMarkdown(node) { if (node.nodeType === Node.TEXT_NODE) { let text = node.textContent; return config.preserveEmptyLines ? text : text.trim() || ''; } if (node.nodeType === Node.ELEMENT_NODE) { const tagName = node.tagName.toLowerCase(); switch (tagName) { // 标题(h1-h6):前后加空行 case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': return `\n\n${formatHeader(node)}\n\n`; // 换行符:
转换为单个换行 case 'br': return '\n'; // 段落:

前后加空行 case 'p': return `\n\n${formatParagraph(node)}\n\n`; // 列表: