#386 Match whole word option for world info

This commit is contained in:
Cohee
2023-06-08 22:03:49 +03:00
parent e7464a223a
commit dbad870d98
3 changed files with 47 additions and 7 deletions

View File

@ -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();
});
});