mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	#386 Match whole word option for world info
This commit is contained in:
		| @@ -1768,7 +1768,7 @@ | |||||||
|                             </div> |                             </div> | ||||||
|                         </div> |                         </div> | ||||||
|  |  | ||||||
|                         <div class="flex1 range-block flex-container flexFlowColumn"> |                         <div class="flex1 range-block flex-container"> | ||||||
|                             <label title="Entries can activate other entries by mentioning their keywords" class="checkbox_label"> |                             <label title="Entries can activate other entries by mentioning their keywords" class="checkbox_label"> | ||||||
|                                 <input id="world_info_recursive" type="checkbox" /> |                                 <input id="world_info_recursive" type="checkbox" /> | ||||||
|                                 <span> |                                 <span> | ||||||
| @@ -1787,6 +1787,14 @@ | |||||||
|                                     </a> |                                     </a> | ||||||
|                                 </span> |                                 </span> | ||||||
|                             </label> |                             </label> | ||||||
|  |                             <label title="If the entry key consists of only one word, it would not be matched as part of other words" class="checkbox_label"> | ||||||
|  |                                 <input id="world_info_match_whole_words" type="checkbox" /> | ||||||
|  |                                 <span> | ||||||
|  |                                     Match whole words | ||||||
|  |                                     <a href="https://docs.sillytavern.app/usage/guidebook/#match-whole-words" class="notes-link" target="_blank"> | ||||||
|  |                                         <span class="note-link-span">?</span> | ||||||
|  |                                     </a> | ||||||
|  |                             </label> | ||||||
|                         </div> |                         </div> | ||||||
|                     </div> |                     </div> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ import { | |||||||
|     deleteWorldInfo, |     deleteWorldInfo, | ||||||
|     world_info_recursive, |     world_info_recursive, | ||||||
|     world_info_case_sensitive, |     world_info_case_sensitive, | ||||||
|  |     world_info_match_whole_words, | ||||||
| } from "./scripts/world-info.js"; | } from "./scripts/world-info.js"; | ||||||
|  |  | ||||||
| import { | import { | ||||||
| @@ -4080,6 +4081,7 @@ async function saveSettings(type) { | |||||||
|             world_info_budget: world_info_budget, |             world_info_budget: world_info_budget, | ||||||
|             world_info_recursive: world_info_recursive, |             world_info_recursive: world_info_recursive, | ||||||
|             world_info_case_sensitive: world_info_case_sensitive, |             world_info_case_sensitive: world_info_case_sensitive, | ||||||
|  |             world_info_match_whole_words: world_info_match_whole_words, | ||||||
|             textgenerationwebui_settings: textgenerationwebui_settings, |             textgenerationwebui_settings: textgenerationwebui_settings, | ||||||
|             swipes: swipes, |             swipes: swipes, | ||||||
|             horde_settings: horde_settings, |             horde_settings: horde_settings, | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ export { | |||||||
|     world_info_depth, |     world_info_depth, | ||||||
|     world_info_recursive, |     world_info_recursive, | ||||||
|     world_info_case_sensitive, |     world_info_case_sensitive, | ||||||
|  |     world_info_match_whole_words, | ||||||
|     world_names, |     world_names, | ||||||
|     imported_world_name, |     imported_world_name, | ||||||
|     checkWorldInfo, |     checkWorldInfo, | ||||||
| @@ -25,6 +26,7 @@ let world_info_budget = 128; | |||||||
| let is_world_edit_open = false; | let is_world_edit_open = false; | ||||||
| let world_info_recursive = false; | let world_info_recursive = false; | ||||||
| let world_info_case_sensitive = false; | let world_info_case_sensitive = false; | ||||||
|  | let world_info_match_whole_words = false; | ||||||
| let imported_world_name = ""; | let imported_world_name = ""; | ||||||
| const saveWorldDebounced = debounce(async () => await _save(), 500); | const saveWorldDebounced = debounce(async () => await _save(), 500); | ||||||
| const saveSettingsDebounced = debounce(() => saveSettings(), 500); | const saveSettingsDebounced = debounce(() => saveSettings(), 500); | ||||||
| @@ -55,6 +57,8 @@ function setWorldInfoSettings(settings, data) { | |||||||
|         world_info_recursive = Boolean(settings.world_info_recursive); |         world_info_recursive = Boolean(settings.world_info_recursive); | ||||||
|     if (settings.world_info_case_sensitive !== undefined) |     if (settings.world_info_case_sensitive !== undefined) | ||||||
|         world_info_case_sensitive = Boolean(settings.world_info_case_sensitive); |         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_counter").text(world_info_depth); | ||||||
|     $("#world_info_depth").val(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_recursive").prop('checked', world_info_recursive); | ||||||
|     $("#world_info_case_sensitive").prop('checked', world_info_case_sensitive); |     $("#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 : []; |     world_names = data.world_names?.length ? data.world_names : []; | ||||||
|  |  | ||||||
| @@ -517,7 +522,7 @@ function checkWorldInfo(chat) { | |||||||
|             if (Array.isArray(entry.key) && entry.key.length) { |             if (Array.isArray(entry.key) && entry.key.length) { | ||||||
|                 primary: for (let key of entry.key) { |                 primary: for (let key of entry.key) { | ||||||
|                     const substituted = substituteParams(key); |                     const substituted = substituteParams(key); | ||||||
|                     if (substituted && textToScan.includes(transformString(substituted.trim()))) { |                     if (substituted && matchKeys(textToScan, substituted.trim())) { | ||||||
|                         if ( |                         if ( | ||||||
|                             entry.selective && |                             entry.selective && | ||||||
|                             Array.isArray(entry.keysecondary) && |                             Array.isArray(entry.keysecondary) && | ||||||
| @@ -525,10 +530,7 @@ function checkWorldInfo(chat) { | |||||||
|                         ) { |                         ) { | ||||||
|                             secondary: for (let keysecondary of entry.keysecondary) { |                             secondary: for (let keysecondary of entry.keysecondary) { | ||||||
|                                 const secondarySubstituted = substituteParams(keysecondary); |                                 const secondarySubstituted = substituteParams(keysecondary); | ||||||
|                                 if ( |                                 if (secondarySubstituted && matchKeys(textToScan, secondarySubstituted.trim())) { | ||||||
|                                     secondarySubstituted && |  | ||||||
|                                     textToScan.includes(transformString(secondarySubstituted.trim())) |  | ||||||
|                                 ) { |  | ||||||
|                                     activatedNow.add(entry.uid); |                                     activatedNow.add(entry.uid); | ||||||
|                                     break secondary; |                                     break secondary; | ||||||
|                                 } |                                 } | ||||||
| @@ -576,6 +578,29 @@ function checkWorldInfo(chat) { | |||||||
|     return { worldInfoBefore, worldInfoAfter }; |     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() { | function selectImportedWorldInfo() { | ||||||
|     if (!imported_world_name) { |     if (!imported_world_name) { | ||||||
|         return; |         return; | ||||||
| @@ -699,4 +724,9 @@ jQuery(() => { | |||||||
|         world_info_case_sensitive = !!$(this).prop('checked'); |         world_info_case_sensitive = !!$(this).prop('checked'); | ||||||
|         saveSettingsDebounced(); |         saveSettingsDebounced(); | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|  |     $('#world_info_match_whole_words').on('input', function () { | ||||||
|  |         world_info_match_whole_words = !!$(this).prop('checked'); | ||||||
|  |         saveSettingsDebounced(); | ||||||
|  |     }); | ||||||
| }); | }); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user