small text tool fixes

This commit is contained in:
Gamosoft 2026-05-11 10:52:15 +02:00
parent c058ee47b0
commit a706ab2e12
1 changed files with 22 additions and 2 deletions

View File

@ -3747,6 +3747,18 @@ function noteApp() {
});
},
/**
* Normalize text-tool input: ctx.fillText doesn't honor line breaks (renders them
* as literal LF glyphs / tofu), and Firefox treats contenteditable="plaintext-only"
* as plain "true" so multi-line paste sneaks newlines into textContent. Also clamp
* length defensively so a giant paste can't bloat the op / autosave payload.
*/
_drawingTextSanitize(s) {
if (typeof s !== 'string' || s.length === 0) return '';
const collapsed = s.replace(/[\r\n\t\v\f]+/g, ' ');
return collapsed.length > 1024 ? collapsed.slice(0, 1024) : collapsed;
},
/**
* Live-preview handler for the text tool. The contenteditable div is invisible
* (color: transparent), so the only thing the user actually SEES of their typing
@ -3756,7 +3768,7 @@ function noteApp() {
*/
drawingTextOnInput(e) {
if (!this.drawingTextActive) return;
const text = (e.target.textContent || '');
const text = this._drawingTextSanitize(e.target.textContent || '');
this.drawingTextValue = text;
if (text.length === 0) {
this.drawingDraft = null;
@ -3779,7 +3791,7 @@ function noteApp() {
// @input event hasn't fired yet (it usually has, but Enter can race it).
const el = document.getElementById('drawing-text-input');
const raw = el ? (el.textContent || '') : (this.drawingTextValue || '');
const text = raw.trim();
const text = this._drawingTextSanitize(raw).trim();
const docX = this.drawingTextDocX;
const docY = this.drawingTextDocY;
const fontSize = this.drawingTextDocFontSize;
@ -3823,6 +3835,14 @@ function noteApp() {
*/
async drawingSave() {
if (!this.currentMedia || this.currentMediaType !== 'drawing') return;
// Commit any in-progress text BEFORE the in-flight guard so the typed value
// makes it into drawingOps before the next line wipes drawingDraft. Otherwise
// Ctrl+S (or autosave) mid-typing would silently drop whatever the user just
// typed from the saved PNG. drawingTextCommit will trigger another autosave,
// but that's harmless — the next save just re-uploads the same bytes.
if (this.drawingTextActive) {
this.drawingTextCommit();
}
if (this._drawingSaveInFlight) {
this._drawingSaveQueued = true;
return;