diff --git a/public/script.js b/public/script.js index 06d7c1045..dd77a6e8b 100644 --- a/public/script.js +++ b/public/script.js @@ -107,7 +107,7 @@ import { setPoeOnlineStatus, } from "./scripts/poe.js"; -import { debounce, delay, restoreCaretPosition, saveCaretPosition, end_trim_to_sentence } from "./scripts/utils.js"; +import { debounce, delay, restoreCaretPosition, saveCaretPosition, end_trim_to_sentence, countOccurrences, isOdd } from "./scripts/utils.js"; import { extension_settings, loadExtensionSettings } from "./scripts/extensions.js"; import { executeSlashCommands, getSlashCommandsHelp, registerSlashCommand } from "./scripts/slash-commands.js"; import { @@ -1516,6 +1516,12 @@ class StreamingProcessor { let isName = result.this_mes_is_name; processedText = result.getMessage; + // Predict unbalanced asterisks during streaming + if (!isFinal && isOdd(countOccurrences(processedText, '*'))) { + // Add asterisk at the end to balance it + processedText = processedText.trimEnd() + '*'; + } + if (isImpersonate) { $('#send_textarea').val(processedText).trigger('input'); } diff --git a/public/scripts/utils.js b/public/scripts/utils.js index dc84a357d..77763b536 100644 --- a/public/scripts/utils.js +++ b/public/scripts/utils.js @@ -216,3 +216,19 @@ export function end_trim_to_sentence(input, include_newline = false) { return input.substring(0, last + 1).trimEnd(); } + +export function countOccurrences(string, character) { + let count = 0; + + for (let i = 0; i < string.length; i++) { + if (string[i] === character) { + count++; + } + } + + return count; +} + +export function isOdd(number) { + return number % 2 !== 0; +} \ No newline at end of file