From dbad870d981a695fc1c8061e96c7800b7d7fee91 Mon Sep 17 00:00:00 2001 From: Cohee Date: Thu, 8 Jun 2023 22:03:49 +0300 Subject: [PATCH] #386 Match whole word option for world info --- public/index.html | 12 +++++++++-- public/script.js | 2 ++ public/scripts/world-info.js | 40 +++++++++++++++++++++++++++++++----- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/public/index.html b/public/index.html index adc975d69..821c60803 100644 --- a/public/index.html +++ b/public/index.html @@ -1768,7 +1768,7 @@ -
+
+
@@ -3059,4 +3067,4 @@ - \ No newline at end of file + diff --git a/public/script.js b/public/script.js index 8be370225..ad48923fa 100644 --- a/public/script.js +++ b/public/script.js @@ -27,6 +27,7 @@ import { deleteWorldInfo, world_info_recursive, world_info_case_sensitive, + world_info_match_whole_words, } from "./scripts/world-info.js"; import { @@ -4080,6 +4081,7 @@ async function saveSettings(type) { world_info_budget: world_info_budget, world_info_recursive: world_info_recursive, world_info_case_sensitive: world_info_case_sensitive, + world_info_match_whole_words: world_info_match_whole_words, textgenerationwebui_settings: textgenerationwebui_settings, swipes: swipes, horde_settings: horde_settings, diff --git a/public/scripts/world-info.js b/public/scripts/world-info.js index 20277f10b..6a89ad98d 100644 --- a/public/scripts/world-info.js +++ b/public/scripts/world-info.js @@ -8,6 +8,7 @@ export { world_info_depth, world_info_recursive, world_info_case_sensitive, + world_info_match_whole_words, world_names, imported_world_name, checkWorldInfo, @@ -25,6 +26,7 @@ let world_info_budget = 128; let is_world_edit_open = false; let world_info_recursive = false; let world_info_case_sensitive = false; +let world_info_match_whole_words = false; let imported_world_name = ""; const saveWorldDebounced = debounce(async () => await _save(), 500); const saveSettingsDebounced = debounce(() => saveSettings(), 500); @@ -55,6 +57,8 @@ function setWorldInfoSettings(settings, data) { world_info_recursive = Boolean(settings.world_info_recursive); if (settings.world_info_case_sensitive !== undefined) world_info_case_sensitive = Boolean(settings.world_info_case_sensitive); + if (settings.world_info_match_whole_words !== undefined) + world_info_match_whole_words = Boolean(settings.world_info_match_whole_words); $("#world_info_depth_counter").text(world_info_depth); $("#world_info_depth").val(world_info_depth); @@ -64,6 +68,7 @@ function setWorldInfoSettings(settings, data) { $("#world_info_recursive").prop('checked', world_info_recursive); $("#world_info_case_sensitive").prop('checked', world_info_case_sensitive); + $("#world_info_match_whole_words").prop('checked', world_info_match_whole_words); world_names = data.world_names?.length ? data.world_names : []; @@ -517,7 +522,7 @@ function checkWorldInfo(chat) { if (Array.isArray(entry.key) && entry.key.length) { primary: for (let key of entry.key) { const substituted = substituteParams(key); - if (substituted && textToScan.includes(transformString(substituted.trim()))) { + if (substituted && matchKeys(textToScan, substituted.trim())) { if ( entry.selective && Array.isArray(entry.keysecondary) && @@ -525,10 +530,7 @@ function checkWorldInfo(chat) { ) { secondary: for (let keysecondary of entry.keysecondary) { const secondarySubstituted = substituteParams(keysecondary); - if ( - secondarySubstituted && - textToScan.includes(transformString(secondarySubstituted.trim())) - ) { + if (secondarySubstituted && matchKeys(textToScan, secondarySubstituted.trim())) { activatedNow.add(entry.uid); break secondary; } @@ -576,6 +578,29 @@ function checkWorldInfo(chat) { return { worldInfoBefore, worldInfoAfter }; } +function matchKeys(haystack, needle) { + const transformedString = transformString(needle); + + if (world_info_match_whole_words) { + const keyWords = transformedString.split(/\s+/); + + if (keyWords.length > 1) { + return haystack.includes(transformedString); + } + else { + const regex = new RegExp(`\\b${transformedString}\\b`); + if (regex.test(haystack)) { + return true; + } + } + + } else { + return haystack.includes(transformedString); + } + + return false; +} + function selectImportedWorldInfo() { if (!imported_world_name) { return; @@ -699,4 +724,9 @@ jQuery(() => { world_info_case_sensitive = !!$(this).prop('checked'); saveSettingsDebounced(); }) + + $('#world_info_match_whole_words').on('input', function () { + world_info_match_whole_words = !!$(this).prop('checked'); + saveSettingsDebounced(); + }); });