// ==UserScript== // @name 复制格式转换 (Markdown) // @namespace http://tampermonkey.net/ // @version 0.1 // @description 将选中内容复制为 Markdown 格式(支持数学公式)。 // @author KiwiFruit // @match *://*/* // @grant GM_setClipboard // @license MIT // @downloadURL none // ==/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); }); } } })();