// ==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 https://greasyfork.org/users/552924 // @downloadURL https://update.greasyfork.icu/scripts/576814/Plusai%20Fix.user.js // @updateURL https://update.greasyfork.icu/scripts/576814/Plusai%20Fix.meta.js // ==/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); })();