本帖最后由 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


使用效果参考





网友答: 附上导出的zip文件,可以导入篡改猴


网友答: 本帖最后由 senry 于 2025-10-18 14:58 编辑

我让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.         /* ... (CSS部分不变) */
  17.         .copy-btn {
  18.             margin-left: 15px;
  19.             padding: 2px 8px;
  20.             color: #1e90ff;
  21.             font-weight: bold;
  22.             cursor: pointer;
  23.             border: 1px solid #1e90ff;
  24.             border-radius: 4px;
  25.             user-select: none;
  26.             transition: all 0.2s;
  27.         }
  28.         .copy-btn:hover {
  29.             background-color: #1e90ff;
  30.             color: white;
  31.         }
  32.         .copy-btn:active {
  33.             transform: scale(0.95);
  34.         }
  35.         .copy-btn.copied {
  36.             background-color: #28a745;
  37.             color: white;
  38.             border-color: #28a745;
  39.         }
  40.     `);

  41.     // 主处理函数
  42.     function addCopyButtons() {
  43.         const codeBlocks = document.querySelectorAll('[id^="mc_code"]');

  44.         codeBlocks.forEach(block => {
  45.             const titleElement = block.querySelector('.jssccodetitle');
  46.             if (!titleElement) return;

  47.             if (titleElement.querySelector('.copy-btn')) return;

  48.             const copyBtn = document.createElement('span');
  49.             copyBtn.className = 'copy-btn';
  50.             copyBtn.textContent = '复制代码';

  51.             copyBtn.addEventListener('click', () => {
  52.                 const textarea = block.querySelector('textarea');
  53.                 if (!textarea) return;

  54.                 let textToCopy = textarea.value;

  55.                 // ----------------------------------------------------
  56.                 // 【最终修复V3】处理换行和实体解码
  57.                 // ----------------------------------------------------

  58.                 // 1. 将所有 <br /> 替换为单个换行符 \n
  59.                 // 注意:这里可能需要处理原始数据中存在的原始换行符 \n 或 \r\n,
  60.                 // 以便它们不会与 <br /> 转换的 \n 产生重复空行。
  61.                 // 最安全的方法是先标准化所有换行符为 \n,然后处理 <br />。
  62.                 textToCopy = textToCopy.replace(/\r\n|\r/g, '\n'); // 标准化换行符

  63.                 // 替换 <br /> 及其周围的零个或一个换行符为一个换行符 \n
  64.                 // 这样可以避免 <br /> 旁边紧跟着的原始换行符导致双重空行。
  65.                 textToCopy = textToCopy.replace(/\n?<br\s*\/?>\n?/gi, '\n');

  66.                 // 2. 替换所有 HTML 实体为实际字符
  67.                 textToCopy = textToCopy.replace(/&quot;/g, '"')
  68.                                        .replace(/&lt;/g, '<')
  69.                                        .replace(/&gt;/g, '>')
  70.                                        .replace(/&#10005;/g, '&#10005;');

  71.                 // 3. 替换 &nbsp; 为普通空格
  72.                 textToCopy = textToCopy.replace(/&nbsp;/g, ' ');

  73.                 // 4. 清理连续的空行:将 3 个或更多连续换行符替换为 2 个换行符(保留一行空行)
  74.                 // 这样可以保留代码块之间的空行,但移除多余的空行。
  75.                 textToCopy = textToCopy.replace(/\n{3,}/g, '\n\n');

  76.                 // 5. 移除开头或结尾的空白行和空格
  77.                 textToCopy = textToCopy.trim();

  78.                 // 检查页面是否存在原生的 setCopy 函数
  79.                 if (typeof setCopy === 'function') {
  80.                     setCopy(textToCopy, "代码已复制到剪贴板");
  81.                 } else {
  82.                     GM_setClipboard(textToCopy);
  83.                 }

  84.                 // 提供视觉反馈
  85.                 copyBtn.textContent = '复制成功!';
  86.                 copyBtn.classList.add('copied');
  87.                 setTimeout(() => {
  88.                     copyBtn.textContent = '复制代码';
  89.                     copyBtn.classList.remove('copied');
  90.                 }, 2000);
  91.             });

  92.             // 将按钮插入到标题栏
  93.             titleElement.appendChild(copyBtn);
  94.         });
  95.     }

  96.     // 使用 MutationObserver 监听DOM变化
  97.     const observer = new MutationObserver((mutations) => {
  98.         addCopyButtons();
  99.     });

  100.     const config = { childList: true, subtree: true };
  101.     observer.observe(document.body, config);

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

  104. })();


网友答:

GetE



网友答: 感谢大佬分享

网友答: 非常好用   

网友答: 本帖最后由 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



网友答: 这个问题一直是本坛痛点...感谢大佬分享!

网友答:
czb203 发表于 2025-8-25 10:08
太好用了,终于不需要从头拉到尾巴了。
e大看看【K:SendToBack】块内目标对象置底
http://bbs.mjtd.com/f ...

能具体说说吗,我没看出来.

网友答: 本帖最后由 lxl217114 于 2025-8-25 13:09 编辑

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


5.享受脚本带来的快乐








网友答: 大神666,非常的好用
  • 上一篇:没有了
  • 下一篇:没有了