Greasy Fork is available in English.
修复复制含 LaTeX 内容时产生大量换行的问题,保留 LaTeX 格式,以及粘贴内容过多时的卡顿
// ==UserScript==
// @name Plusai Fix
// @version 1.3
// @description 修复复制含 LaTeX 内容时产生大量换行的问题,保留 LaTeX 格式,以及粘贴内容过多时的卡顿
// @author xyan9
// @match https://ns01.plusai.io/c/*
// @grant none
// @run-at document-idle
// @license MIT
// @namespace http://greasyfork.icu/users/552924
// ==/UserScript==
(function () {
'use strict';
function getLatex(katexEl) {
var ann = katexEl.querySelector('.katex-mathml annotation');
if (!ann) return katexEl.textContent;
var isDisplay = katexEl.classList.contains('katex-display');
var src = ann.textContent;
return isDisplay ? '$$' + src + '$$' : '$' + src + '$';
}
function cleanSelection() {
var sel = window.getSelection();
if (!sel || sel.isCollapsed || sel.rangeCount === 0) return null;
var range = sel.getRangeAt(0);
var frag = range.cloneContents();
var katexList = frag.querySelectorAll('.katex');
if (katexList.length === 0) return null;
katexList.forEach(function (el) {
var latex = getLatex(el);
var span = document.createElement('span');
span.textContent = latex;
el.parentNode.replaceChild(span, el);
});
return frag.textContent || '';
}
document.addEventListener('keydown', function (e) {
if ((e.ctrlKey || e.metaKey) && e.key === 'c') {
var text = cleanSelection();
if (text) {
e.preventDefault();
e.stopPropagation();
navigator.clipboard.writeText(text);
}
}
}, true);
// CSS containment:隔离侧栏和编辑器,减少 reflow 范围
var style = document.createElement('style');
style.textContent = [
'nav[aria-label] { contain: layout paint style; }',
'.wcDTda_prosemirror-parent { contain: layout paint style; }'
].join('\n');
document.head.appendChild(style);
document.addEventListener('paste', function(e) {
var editor = document.querySelector('#prompt-textarea, .ProseMirror');
if (!editor || !editor.contains(e.target)) return;
var text = e.clipboardData.getData('text/plain');
if (!text) return;
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
editor.focus();
var sel = window.getSelection();
if (!sel.rangeCount) return;
var range = sel.getRangeAt(0);
range.deleteContents();
// 用 DocumentFragment 一次性构建所有节点(0ms)
var lines = text.split('\n');
var fragment = document.createDocumentFragment();
for (var i = 0; i < lines.length; i++) {
if (i > 0) fragment.appendChild(document.createElement('br'));
if (lines[i]) fragment.appendChild(document.createTextNode(lines[i]));
}
range.insertNode(fragment);
// 移动光标到插入内容之后
var lastNode = range.endContainer.nodeType === 3
? range.endContainer
: range.endContainer.lastChild;
if (lastNode && lastNode.nodeType === 3) {
range.setStart(lastNode, lastNode.textContent.length);
} else if (lastNode) {
range.setStartAfter(lastNode);
}
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}, true);
})();