明经复制代码篡改猴扩展
本帖最后由 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
使用效果参考
Get,感谢E大分享优秀代码!
附上导出的zip文件,可以导入篡改猴
本帖最后由 senry 于 2025-10-18 14:58 编辑
我让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(`
/* ... (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('');
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();
})(); 感谢大佬分享 非常好用 本帖最后由 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,非常的好用