明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4618|回复: 24

明经复制代码篡改猴扩展

  [复制链接]
发表于 2025-8-24 11:23:42 | 显示全部楼层 |阅读模式
本帖最后由 edata 于 2025-9-1 13:02 编辑

论坛的代码区复制功能在chrome这类浏览器上复制不是很理想,可能有一些非法字符,导致复制后的格式不理想,没有换行效果。
使用篡改猴插件可以增加一个格式复制的功能,方便复制,
如果明经论坛能够自己修复这个问题是最好的,凑合用吧。
我使用的edge浏览器,安装了篡改猴扩展插件(tampermonkey),新建一个脚本替换内容保存即可。
edge使用篡改猴插件可能需要勾选开发者模式,才能生效。


  1. // ==UserScript==
  2. // @name         明经复制代码扩展
  3. // @namespace    http://tampermonkey.net/
  4. // @version      2025-08-24
  5. // @description  复制明经论坛代码区的代码
  6. // @author       edata
  7. // @match        *://*.mjtd.com/*
  8. // @icon         http://bbs.mjtd.com/favicon.ico
  9. // @grant        none
  10. // ==/UserScript==

  11. (function() {
  12.     'use strict';
  13.     // 复制到剪贴板函数(未使用)
  14.     function copyToClipboard(text) {
  15.         return new Promise((resolve, reject) => {
  16.             if (navigator.clipboard)  {
  17.                 navigator.clipboard.writeText(text).then(resolve).catch(reject);
  18.             } else {
  19.                 // 兼容旧版浏览器的备用方法
  20.                 const textarea = document.createElement('textarea');
  21.                 textarea.value  = text;
  22.                 textarea.style.position  = 'fixed';
  23.                 document.body.appendChild(textarea);
  24.                 textarea.select();

  25.                 try {
  26.                     const successful = document.execCommand('copy');
  27.                     document.body.removeChild(textarea);
  28.                     successful ? resolve() : reject(new Error('复制失败'));
  29.                 } catch (err) {
  30.                     document.body.removeChild(textarea);
  31.                     reject(err);
  32.                 }
  33.             }
  34.         });
  35.     }
  36.     //转换html转义字符为正常字符
  37.     function unescapeHTML(str) {
  38.         return str.replace(/&(nbsp|lt|gt|amp|quot);/g, function(_, entity) {
  39.             return {'nbsp':' ', 'lt': '<', 'gt': '>', 'amp': '&', 'quot': '"' }[entity];
  40.         });
  41.     }
  42.     //移除html标记(未使用)
  43.     function removeTags(str) {
  44.         if ((str === null) || (str === "")) {
  45.             return false;
  46.         } else {
  47.             str = str.toString();
  48.         }
  49.         return str.replace(/<[^>]*>/g, "");
  50.     }
  51.      //移除换行<br />标记
  52.     function removeBrTags(str) {
  53.         if ((str === null) || (str === "")) {
  54.             return false;
  55.         } else {
  56.             str = str.toString();
  57.         }
  58.         return str.replace(/<br.\/>/g, "");
  59.     }

  60.     // 主处理函数
  61.     function addCopyButtons() {
  62.         // 获取所有以"mc_code"开头的元素
  63.         const elements = [];
  64.         let index = 0;

  65.         while (true) {
  66.             const element = document.getElementById(`mc_code${index}`);
  67.             if (!element) break;
  68.             elements.push(element);
  69.             index++;
  70.         }

  71.         // 处理每个找到的元素
  72.         elements.forEach(element  => {
  73.             const titleElement = element.querySelector('.jssccodetitle');
  74.             if (!titleElement) return;

  75.             // 检查是否已添加按钮
  76.             if (titleElement.querySelector('.copy-btn'))  return;

  77.             // 创建复制按钮
  78.             const copyBtn = document.createElement('span');
  79.             copyBtn.className  = 'copy-btn';
  80.             copyBtn.textContent  = '格式复制';

  81.             // 添加点击事件
  82.             copyBtn.addEventListener('click',  async () => {
  83.                 const textarea = element.querySelector('textarea');
  84.                 if (!textarea) return;
  85.                 var textStr=textarea.innerHTML;
  86.                 textStr=unescapeHTML(textStr);
  87.                 textStr=removeBrTags(textStr);
  88.                 try {
  89.                     //await copyToClipboard(textStr);
  90.                     //调用明经原有的复制函数,有成功提示
  91.                     setCopy(textStr,"代码已复制到剪贴板");
  92.                 } catch (err) {
  93.                     console.error(' 复制失败:', err);
  94.                     alert('复制失败,请手动复制内容');
  95.                 }
  96.             });

  97.             // 插入按钮
  98.             titleElement.appendChild(copyBtn);
  99.         });
  100.     }
  101. <blockquote>    //添加复制按钮
浏览器使用edge,插件使用的是篡改猴5.3.3


使用效果参考



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 7明经币 +7 金钱 +5 收起 理由
llsheng_73 + 1 很给力!
biya + 1 很给力!
gzxl + 1 赞一个!
windlkx + 1 很给力!
zhoupeng220 + 1 很给力!
maiko + 1 + 5 很给力!
橡皮 + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2025-8-24 11:28:09 | 显示全部楼层
附上导出的zip文件,可以导入篡改猴

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 金钱 +5 收起 理由
tigcat + 1 + 5 很给力!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2025-8-31 17:48:14 | 显示全部楼层
本帖最后由 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. })();

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
edata + 1 + 50 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2025-8-24 14:54:18 | 显示全部楼层


GetE

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 金钱 +35 收起 理由
e2002 + 1 + 30 很给力!
tigcat + 1 + 5 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2025-8-24 17:58:02 | 显示全部楼层
感谢大佬分享
回复 支持 反对

使用道具 举报

发表于 2025-8-25 08:41:50 | 显示全部楼层
非常好用   
回复 支持 反对

使用道具 举报

发表于 2025-8-25 10:08:47 | 显示全部楼层
本帖最后由 czb203 于 2025-8-25 15:55 编辑

太好用了,终于不需要从头拉到尾巴了。
e大看看【K:SendToBack】块内目标对象置底
http://bbs.mjtd.com/forum.php?mo ... 3356&fromuid=354577
(出处: 明经CAD社区)

坐标集就质心
http://bbs.mjtd.com/forum.php?mo ... 3462&fromuid=354577
(出处: 明经CAD社区)
这个代码格式复制有bug

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-8-25 10:45:53 | 显示全部楼层
这个问题一直是本坛痛点...感谢大佬分享!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-25 12:06:16 | 显示全部楼层
czb203 发表于 2025-8-25 10:08
太好用了,终于不需要从头拉到尾巴了。
e大看看【K:SendToBack】块内目标对象置底
http://bbs.mjtd.com/f ...

能具体说说吗,我没看出来.
回复 支持 反对

使用道具 举报

发表于 2025-8-25 13:08:00 | 显示全部楼层
本帖最后由 lxl217114 于 2025-8-25 13:09 编辑

1.点击+号 新建  脚本
2.删除文本框现有的所有文本
3.把e大分享的脚本代码复制到文本框
4.保存并关闭


5.享受脚本带来的快乐






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-8-25 14:08:01 | 显示全部楼层
大神666,非常的好用
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-8 05:00 , Processed in 0.171697 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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