- 积分
- 894
- 明经币
- 个
- 注册时间
- 2025-4-17
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2025-8-31 17:48:14
|
显示全部楼层
本帖最后由 senry 于 2025-10-18 14:58 编辑
我让Gemini给按钮增加一个样式
 - // ==UserScript==
- // @name 明经复制代码扩展 (优化版)
- // @namespace http://tampermonkey.net/
- // @version 2025-08-31
- // @description 为明经论坛的代码区添加一个美观且功能更强大的复制按钮。
- // @author edata (优化 by Gemini)
- // @match *://*.mjtd.com/*
- // @icon http://bbs.mjtd.com/favicon.ico
- // @grant GM_addStyle
- // @grant GM_setClipboard
- // ==/UserScript==
- (function() {
- 'use strict';
- // 使用油猴的 @grant 命令添加CSS样式,让按钮更美观
- GM_addStyle(`
- /* ... (CSS部分不变) */
- .copy-btn {
- margin-left: 15px;
- padding: 2px 8px;
- color: #1e90ff;
- font-weight: bold;
- cursor: pointer;
- border: 1px solid #1e90ff;
- border-radius: 4px;
- user-select: none;
- transition: all 0.2s;
- }
- .copy-btn:hover {
- background-color: #1e90ff;
- color: white;
- }
- .copy-btn:active {
- transform: scale(0.95);
- }
- .copy-btn.copied {
- background-color: #28a745;
- color: white;
- border-color: #28a745;
- }
- `);
- // 主处理函数
- function addCopyButtons() {
- const codeBlocks = document.querySelectorAll('[id^="mc_code"]');
- codeBlocks.forEach(block => {
- const titleElement = block.querySelector('.jssccodetitle');
- if (!titleElement) return;
- if (titleElement.querySelector('.copy-btn')) return;
- const copyBtn = document.createElement('span');
- copyBtn.className = 'copy-btn';
- copyBtn.textContent = '复制代码';
- copyBtn.addEventListener('click', () => {
- const textarea = block.querySelector('textarea');
- if (!textarea) return;
- let textToCopy = textarea.value;
- // ----------------------------------------------------
- // 【最终修复V3】处理换行和实体解码
- // ----------------------------------------------------
- // 1. 将所有 <br /> 替换为单个换行符 \n
- // 注意:这里可能需要处理原始数据中存在的原始换行符 \n 或 \r\n,
- // 以便它们不会与 <br /> 转换的 \n 产生重复空行。
- // 最安全的方法是先标准化所有换行符为 \n,然后处理 <br />。
- textToCopy = textToCopy.replace(/\r\n|\r/g, '\n'); // 标准化换行符
- // 替换 <br /> 及其周围的零个或一个换行符为一个换行符 \n
- // 这样可以避免 <br /> 旁边紧跟着的原始换行符导致双重空行。
- textToCopy = textToCopy.replace(/\n?<br\s*\/?>\n?/gi, '\n');
- // 2. 替换所有 HTML 实体为实际字符
- textToCopy = textToCopy.replace(/"/g, '"')
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/✕/g, '✕');
- // 3. 替换 为普通空格
- textToCopy = textToCopy.replace(/ /g, ' ');
- // 4. 清理连续的空行:将 3 个或更多连续换行符替换为 2 个换行符(保留一行空行)
- // 这样可以保留代码块之间的空行,但移除多余的空行。
- textToCopy = textToCopy.replace(/\n{3,}/g, '\n\n');
- // 5. 移除开头或结尾的空白行和空格
- textToCopy = textToCopy.trim();
- // 检查页面是否存在原生的 setCopy 函数
- if (typeof setCopy === 'function') {
- setCopy(textToCopy, "代码已复制到剪贴板");
- } else {
- GM_setClipboard(textToCopy);
- }
- // 提供视觉反馈
- copyBtn.textContent = '复制成功!';
- copyBtn.classList.add('copied');
- setTimeout(() => {
- copyBtn.textContent = '复制代码';
- copyBtn.classList.remove('copied');
- }, 2000);
- });
- // 将按钮插入到标题栏
- titleElement.appendChild(copyBtn);
- });
- }
- // 使用 MutationObserver 监听DOM变化
- const observer = new MutationObserver((mutations) => {
- addCopyButtons();
- });
- const config = { childList: true, subtree: true };
- observer.observe(document.body, config);
- // 页面首次加载时先立即运行一次
- addCopyButtons();
- })();
|
评分
-
查看全部评分
|