From 64997b6c39c3a9c1d13527bcc351762a02a024c2 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Fri, 16 Oct 2026 20:23:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=BC=96=E8=BE=91=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BC=96=E8=BE=91=E6=96=87=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/webui/ofdgo_edit.js | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/assets/webui/ofdgo_edit.js b/assets/webui/ofdgo_edit.js index b73136f..63a0fa3 100644 --- a/assets/webui/ofdgo_edit.js +++ b/assets/webui/ofdgo_edit.js @@ -1553,6 +1553,7 @@ export class CanvasEditor { if (editing.rich) editing.rich.beforeCaret = editing.rich.selection(); this.rememberSourceSelection(); editing.composing = true; + if (editing.source) this.paintSourceDraft(); }); input.addEventListener("compositionend", () => { editing.composing = false; @@ -1755,7 +1756,9 @@ export class CanvasEditor { async previewSourceText() { const editing = this.input; - if (!editing?.source || editing.composing || editing.saving) return; + if (!editing?.source || editing.saving) return; + this.paintSourceDraft(); + if (editing.composing) return; const value = editTextValue(editing.input), font = editing.fontData, size = editing.style?.size || editing.item.size, reflow = !!editing.reflow; if (value === "") { this.setTextError(null); @@ -1774,6 +1777,26 @@ export class CanvasEditor { } } + paintSourceDraft() { + const editing = this.input, input = editing.input; + for (const span of input.querySelectorAll("[data-glyph]")) span.removeAttribute("data-glyph"); + if (editing.composing) return; + const value = editTextValue(input), caret = editTextSelection(input, editing.range); + const fragment = document.createDocumentFragment(), positions = []; + let position = 0; + for (const text of value.split("\n")) { + const line = document.createElement("div"), node = document.createTextNode(text); + line.append(node); + if (!text) line.append(document.createElement("br")); + fragment.append(line); + positions.push({ node, start: position, end: position + text.length }); + position += text.length + 1; + } + input.replaceChildren(fragment); + Object.assign(input.style, { width: "max-content", height: "auto", minWidth: `${(editing.style?.size || editing.item.size) * PX_PER_MM + 4}px` }); + restoreTextSelection(positions, caret, editing.range); + } + paintSourceText(source) { const editing = this.input, { input, item, face, frame } = editing; const caret = editTextSelection(input, editing.range);