edata 发表于 2025-8-24 11:23:42

明经复制代码篡改猴扩展

本帖最后由 edata 于 2025-9-1 13:02 编辑

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


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

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

                try {
                  const successful = document.execCommand('copy');
                  document.body.removeChild(textarea);
                  successful ? resolve() : reject(new Error('复制失败'));
                } catch (err) {
                  document.body.removeChild(textarea);
                  reject(err);
                }
            }
      });
    }
    //转换html转义字符为正常字符
    function unescapeHTML(str) {
      return str.replace(/&(nbsp|lt|gt|amp|quot);/g, function(_, entity) {
            return {'nbsp':' ', 'lt': '<', 'gt': '>', 'amp': '&', 'quot': '"' };
      });
    }
    //移除html标记(未使用)
    function removeTags(str) {
      if ((str === null) || (str === "")) {
            return false;
      } else {
            str = str.toString();
      }
      return str.replace(/<[^>]*>/g, "");
    }
   //移除换行<br />标记
    function removeBrTags(str) {
      if ((str === null) || (str === "")) {
            return false;
      } else {
            str = str.toString();
      }
      return str.replace(/<br.\/>/g, "");
    }

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

      while (true) {
            const element = document.getElementById(`mc_code${index}`);
            if (!element) break;
            elements.push(element);
            index++;
      }

      // 处理每个找到的元素
      elements.forEach(element=> {
            const titleElement = element.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',async () => {
                const textarea = element.querySelector('textarea');
                if (!textarea) return;
                var textStr=textarea.innerHTML;
                textStr=unescapeHTML(textStr);
                textStr=removeBrTags(textStr);
                try {
                  //await copyToClipboard(textStr);
                  //调用明经原有的复制函数,有成功提示
                  setCopy(textStr,"代码已复制到剪贴板");
                } catch (err) {
                  console.error(' 复制失败:', err);
                  alert('复制失败,请手动复制内容');
                }
            });

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


使用效果参考



edata 发表于 2025-8-24 11:28:09

附上导出的zip文件,可以导入篡改猴

senry 发表于 2025-8-31 17:48:14

本帖最后由 senry 于 2025-8-31 17:50 编辑

我让Gemini给按钮增加一个样式:lol
// ==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(`
      .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;
      }
    `);

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

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

      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;

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

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

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

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

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

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

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

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

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

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

})();

Bao_lai 发表于 2025-8-24 14:54:18



Get,感谢E大分享优秀代码!

magicheno 发表于 2025-8-24 17:58:02

感谢大佬分享

429014673 发表于 2025-8-25 08:41:50

非常好用   

czb203 发表于 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

e2002 发表于 2025-8-25 10:45:53

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

edata 发表于 2025-8-25 12:06:16

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

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

lxl217114 发表于 2025-8-25 13:08:00

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

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


5.享受脚本带来的快乐






yegucheng0129 发表于 2025-8-25 14:08:01

大神666,非常的好用
页: [1] 2 3
查看完整版本: 明经复制代码篡改猴扩展