解决犇犇回复时丢失 Markdown 的问题
a_small_OIer · · 科技·工程
众所周知,在回复犇犇的时候会丢失已有的 Markdown 格式, 于是写了一个脚本修复 Markdown 格式。
具体实现:在回复犇犇的时候自动在回复框中识别回复的内容,然后用正确的 Markdown 格式覆盖错误的文本,流程如下:
修复了除 #、>、折叠框、表格等以外常见的 Markdown 格式,比如删除线、加粗以及链接、图床等。
出现问题欢迎反馈。
现在你可以在 github 上发现这个项目了。
::::info[
-
-
-
- 在回复中包含链接时,不再使用 `[]()` 语法; - 优化了回复格式,使其不再丢失原有回复格式中的空格; - 优化了“回复”按钮的匹配逻辑; -
感谢@[limaotong](https://www.luogu.com.cn/user/1417265) 反馈的 bug,现在可以正常使用 `[![]()]()` 语法了;同时感谢@[_zyx2012 ](https://www.luogu.com.cn/user/1934210) 的提醒,补充了 MIT 开源协议声明。 现在你可以在 [github](https://github.com/a-small-OIer/benben-better/) 上下载脚本了。 :::: ::::info[代码($3.1.2$ 版)] ```javascript // ==UserScript== // @name benben-better // @namespace http://tampermonkey.net/ // @version 3.1.2 // @description 解决犇犇回复时丢失 LaTeX 和 Markdown 格式的问题 // @author a_small_OIer // @match www.luogu.com.cn // @grant none // @license MIT // ==/UserScript==
/*
- MIT License
- Copyright (c) 2026 a_small_OIer
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE. */
(function(){
'use strict';
const REPLY_TEXT_MATCH = /回复|reply/i;
function generateMarkdown(node) {
let result = '';
const stack = [node];
while (stack.length) {
const n = stack.shift();
if (n.nodeType === Node.TEXT_NODE) {
result += n.textContent;
} else if (n.nodeType === Node.ELEMENT_NODE) {
const tag = n.tagName.toLowerCase();
if (n.classList && n.classList.contains('katex')) {
const ann = n.querySelector('annotation[encoding="application/x-tex"]');
const raw = ann ? ann.textContent.trim() : '';
result += raw ? '' + n.textContent + '';
} else if (tag === 'code') {
result += '' + n.textContent + '';
} else {
for (let i = n.childNodes.length - 1; i >= 0; i--) {
stack.unshift(n.childNodes[i]);
}
}
}
}
return result.trim();
}
document.addEventListener('click', function(event) {
const target = event.target;
if (!target.closest('a[name="feed-reply"]')) return;
if (!REPLY_TEXT_MATCH.test(target.innerText.trim())) return;
let commentItem = target.closest('.am-comment-main');
if (!commentItem) return;
commentItem = commentItem.querySelector('.am-comment-bd');
if (!commentItem) return;
commentItem = commentItem.querySelector('.feed-comment');
if (!commentItem) return;
const mdContent = generateMarkdown(commentItem);
if (!mdContent) return;
function fillSource() {
const textarea = document.querySelector('.am-form-group.am-form textarea, textarea');
if (!textarea) {
setTimeout(fillSource, 100);
return;
}
const oldVal = textarea.value;
const prefixMatch = oldVal.match(/^(.+?[:] ?)/);
const prefix = prefixMatch ? prefixMatch[1] : '';
textarea.value = prefix + mdContent;
textarea.focus();
}
setTimeout(fillSource, 200);
});
})();
::::
::::info[一句闲话]
这个脚本同时支持修复 [$\LaTeX$](https://www.luogu.com.cn/article/x9dpta33) 文本。
::::