明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖
楼主: edata

明经复制代码篡改猴扩展

  [复制链接]
发表于 昨天 09:43 | 显示全部楼层
看不懂啊e大这个是干嘛的
回复 支持 反对

使用道具 举报

发表于 昨天 17:48 | 显示全部楼层
本帖最后由 senry 于 2025-8-31 17:50 编辑

我让Gemini给按钮增加一个样式
  1. // ==UserScript==
  2. // @name         明经复制代码扩展 (优化版)
  3. // @namespace    http://tampermonkey.net/
  4. // @version      2025-08-31
  5. // @description  为明经论坛的代码区添加一个美观且功能更强大的复制按钮。
  6. // @author       edata (优化 by Gemini)
  7. // @match        *://*.mjtd.com/*
  8. // @icon         http://bbs.mjtd.com/favicon.ico
  9. // @grant        GM_addStyle
  10. // @grant        GM_setClipboard
  11. // ==/UserScript==

  12. (function() {
  13.     'use strict';

  14.     // 使用油猴的 @grant 命令添加CSS样式,让按钮更美观
  15.     GM_addStyle(`
  16.         .copy-btn {
  17.             margin-left: 15px;      /* 与标题保持一些距离 */
  18.             padding: 2px 8px;       /* 增加内边距,让按钮看起来更大 */
  19.             color: #1e90ff;         /* 设置漂亮的蓝色字体 */
  20.             font-weight: bold;      /* 字体加粗 */
  21.             cursor: pointer;        /* 鼠标悬停时显示小手图标 */
  22.             border: 1px solid #1e90ff; /* 添加一个边框 */
  23.             border-radius: 4px;     /* 圆角 */
  24.             user-select: none;      /* 防止双击时选中文本 */
  25.             transition: all 0.2s;   /* 添加过渡动画效果 */
  26.         }
  27.         .copy-btn:hover {
  28.             background-color: #1e90ff; /* 鼠标悬停时改变背景色 */
  29.             color: white;             /* 鼠标悬停时改变文字颜色 */
  30.         }
  31.         .copy-btn:active {
  32.             transform: scale(0.95); /* 鼠标点击时有轻微的缩小效果 */
  33.         }
  34.         .copy-btn.copied {
  35.             background-color: #28a745; /* 复制成功后的绿色 */
  36.             color: white;
  37.             border-color: #28a745;
  38.         }
  39.     `);

  40.     // 转换HTML转义字符为正常字符
  41.     // 这个函数基本正确,但可以扩展以处理更多转义字符
  42.     function unescapeHTML(str) {
  43.         if (!str) return "";
  44.         // 使用一个div元素来解码,这是最安全和全面的方法
  45.         const tempDiv = document.createElement('div');
  46.         tempDiv.innerHTML = str;
  47.         return tempDiv.textContent || tempDiv.innerText || "";
  48.     }

  49.     // 主处理函数
  50.     function addCopyButtons() {
  51.         // 【优化#1】使用 querySelectorAll 获取所有代码块,更健壮
  52.         // 选择所有ID以 "mc_code" 开头的元素
  53.         const codeBlocks = document.querySelectorAll('[id^="mc_code"]');

  54.         codeBlocks.forEach(block => {
  55.             const titleElement = block.querySelector('.jssccodetitle');
  56.             if (!titleElement) return;

  57.             // 检查是否已添加按钮,防止重复添加
  58.             if (titleElement.querySelector('.copy-btn')) return;

  59.             // 创建复制按钮
  60.             const copyBtn = document.createElement('span');
  61.             copyBtn.className = 'copy-btn';
  62.             copyBtn.textContent = '复制代码'; // "复制代码" 可能比 "格式复制" 更直观

  63.             // 添加点击事件
  64.             copyBtn.addEventListener('click', () => {
  65.                 const textarea = block.querySelector('textarea');
  66.                 if (!textarea) return;

  67.                 // 【优化#2】使用 .value 获取 textarea 的内容,更规范
  68.                 let textToCopy = textarea.value;

  69.                 // 论坛的<textarea>里可能还有转义的HTML,先解码
  70.                 textToCopy = unescapeHTML(textToCopy);

  71.                 // 明经论坛的代码块里有很多不必要的 <br />,这里可以直接替换为换行符
  72.                 textToCopy = textToCopy.replace(/<br\s*\/?>/gi, '\n');

  73.                 // 检查页面是否存在原生的 setCopy 函数
  74.                 if (typeof setCopy === 'function') {
  75.                     // 【优化#3】直接调用原生函数,可以利用网站自带的提示
  76.                     setCopy(textToCopy, "代码已复制到剪贴板");
  77.                 } else {
  78.                     // 如果原生函数不存在,使用油猴提供的API作为备用,更可靠
  79.                     GM_setClipboard(textToCopy);
  80.                 }

  81.                 // 提供视觉反馈
  82.                 copyBtn.textContent = '复制成功!';
  83.                 copyBtn.classList.add('copied');
  84.                 setTimeout(() => {
  85.                     copyBtn.textContent = '复制代码';
  86.                     copyBtn.classList.remove('copied');
  87.                 }, 2000); // 2秒后恢复原状
  88.             });

  89.             // 将按钮插入到标题栏
  90.             titleElement.appendChild(copyBtn);
  91.         });
  92.     }

  93.     // 【优化#4】使用 MutationObserver 监听DOM变化,以处理动态加载的内容
  94.     const observer = new MutationObserver((mutations) => {
  95.         // 简单地重新运行函数,它会跳过已经添加按钮的元素
  96.         addCopyButtons();
  97.     });

  98.     // 配置观察器:观察子节点的变化
  99.     const config = { childList: true, subtree: true };

  100.     // 启动观察器,监视整个文档的body
  101.     observer.observe(document.body, config);

  102.     // 页面首次加载时先立即运行一次
  103.     addCopyButtons();

  104. })();
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-9-1 04:39 , Processed in 0.140075 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表