From 6e0aa3c46ce10790d3ca716b746170485d4cc158 Mon Sep 17 00:00:00 2001 From: retoor Date: Sun, 29 Jun 2025 00:04:42 +0200 Subject: [PATCH] So closegit diff --- src/snek/static/stt.js | 67 +++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/src/snek/static/stt.js b/src/snek/static/stt.js index 0184c4f..5392fec 100644 --- a/src/snek/static/stt.js +++ b/src/snek/static/stt.js @@ -2,6 +2,47 @@ class STTButton extends HTMLElement { /** monitor target attribute so it can change on-the-fly */ static get observedAttributes() { return ['target']; } + simulateTypingWithEvents(element, text, delay = 100) { + let index = 0; + + function triggerEvent(type, key) { + const event = new KeyboardEvent(type, { + key: key, + bubbles: true, + cancelable: true, + }); + element.dispatchEvent(event); + } + + const interval = setInterval(() => { + if (index < text.length) { + const char = text.charAt(index); + + // Trigger keydown + triggerEvent('keydown', char); + + // Update the value + if (element.isContentEditable) { + // For contentEditable elements + document.execCommand('insertText', false, char); + } else { + // For input or textarea + element.value += char; + } + + // Trigger keypress + triggerEvent('keypress', char); + + // Trigger keyup + triggerEvent('keyup', char); + + index++; + } else { + clearInterval(interval); + } + }, delay); +} + constructor() { super(); this.attachShadow({mode: 'open'}); @@ -55,20 +96,19 @@ this.recog.onresult = (e) => { txt.charAt(0).toUpperCase() + txt.slice(1); // 2) Ensure closing punctuation - const punctuated = + let punctuated = /[.!?]$/.test(sentence) ? sentence : sentence + '.'; committed += punctuated + ' '; // add to permanent text - } else { - interim += txt + ' '; // live but volatile - } - } - - /* --- paint to DOM --- */ - if (this.targetEl) { + if (this.targetEl) { this.targetEl.focus() - - this.targetEl.value = committed + interim + punctuated = punctuated.replace(/\./g, ".\n") + punctuated = punctuated.replace(/\?/g, "?\n") + punctuated = punctuated.replace(/\!/g, "!\n") + this.simulateTypingWithEvents(this.targetEl, punctuated,50) + triggerEvent('keydown', "Enter"); + triggerEvent('keydown', "Return"); + //this.targetEl.value = committed + interim /*this.targetElement.dispatchEvent(new ChangeEvent('change', { bubbles: true, @@ -76,6 +116,13 @@ this.recog.onresult = (e) => { }));*/ } + + } else { + interim += txt + ' '; // live but volatile + } + } + + /* --- paint to DOM --- */ }; /* const transcript = Array.from(e.results)