parent
5515f28105
commit
da42d0a47a
|
@ -89,7 +89,7 @@
|
||||||
* @property {boolean} markdownOnly - Whether the script only applies to Markdown
|
* @property {boolean} markdownOnly - Whether the script only applies to Markdown
|
||||||
* @property {boolean} promptOnly - Whether the script only applies to prompts
|
* @property {boolean} promptOnly - Whether the script only applies to prompts
|
||||||
* @property {boolean} runOnEdit - Whether the script runs on edit
|
* @property {boolean} runOnEdit - Whether the script runs on edit
|
||||||
* @property {boolean} substituteRegex - Whether the regex should be substituted
|
* @property {number} substituteRegex - Whether the regex should be substituted
|
||||||
* @property {number} minDepth - The minimum depth
|
* @property {number} minDepth - The minimum depth
|
||||||
* @property {number} maxDepth - The maximum depth
|
* @property {number} maxDepth - The maximum depth
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -121,12 +121,16 @@
|
||||||
<input type="checkbox" name="run_on_edit" />
|
<input type="checkbox" name="run_on_edit" />
|
||||||
<span data-i18n="Run On Edit">Run On Edit</span>
|
<span data-i18n="Run On Edit">Run On Edit</span>
|
||||||
</label>
|
</label>
|
||||||
<label class="checkbox flex-container" data-i18n="[title]ext_regex_substitute_regex_desc" title="Substitute {{macros}} in Find Regex before running it">
|
<label class="checkbox flex-container flexNoGap marginBot5" data-i18n="[title]ext_regex_substitute_regex_desc" title="Substitute {{macros}} in Find Regex before running it">
|
||||||
<input type="checkbox" name="substitute_regex" />
|
|
||||||
<span>
|
<span>
|
||||||
<span data-i18n="Substitute Regex">Substitute Regex</span>
|
<small data-i18n="Macro in Find Regex">Macros in Find Regex</small>
|
||||||
<span class="fa-solid fa-circle-question note-link-span"></span>
|
<span class="fa-solid fa-circle-question note-link-span"></span>
|
||||||
</span>
|
</span>
|
||||||
|
<select name="substitute_regex" class="text_pole textarea_compact margin0">
|
||||||
|
<option value="0" data-i18n="Don't substitute">Don't substitute</option>
|
||||||
|
<option value="1" data-i18n="Substitute (raw)">Substitute (raw)</option>
|
||||||
|
<option value="2" data-i18n="Substitute (escaped)">Substitute (escaped)</option>
|
||||||
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<span>
|
<span>
|
||||||
<small data-i18n="ext_regex_other_options" data-i18n="Ephemerality">Ephemerality</small>
|
<small data-i18n="ext_regex_other_options" data-i18n="Ephemerality">Ephemerality</small>
|
||||||
|
|
|
@ -22,6 +22,12 @@ const regex_placement = {
|
||||||
WORLD_INFO: 5,
|
WORLD_INFO: 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const substitute_find_regex = {
|
||||||
|
NONE: 0,
|
||||||
|
RAW: 1,
|
||||||
|
ESCAPED: 2,
|
||||||
|
};
|
||||||
|
|
||||||
function sanitizeRegexMacro(x) {
|
function sanitizeRegexMacro(x) {
|
||||||
return (x && typeof x === 'string') ?
|
return (x && typeof x === 'string') ?
|
||||||
x.replaceAll(/[\n\r\t\v\f\0.^$*+?{}[\]\\/|()]/gs, function (s) {
|
x.replaceAll(/[\n\r\t\v\f\0.^$*+?{}[\]\\/|()]/gs, function (s) {
|
||||||
|
@ -131,9 +137,20 @@ function runRegexScript(regexScript, rawString, { characterOverride } = {}) {
|
||||||
return newString;
|
return newString;
|
||||||
}
|
}
|
||||||
|
|
||||||
const regexString = regexScript.substituteRegex
|
const getRegexString = () => {
|
||||||
? substituteParamsExtended(regexScript.findRegex, {}, sanitizeRegexMacro)
|
switch(Number(regexScript.substituteRegex)) {
|
||||||
: regexScript.findRegex;
|
case substitute_find_regex.NONE:
|
||||||
|
return regexScript.findRegex;
|
||||||
|
case substitute_find_regex.RAW:
|
||||||
|
return substituteParamsExtended(regexScript.findRegex);
|
||||||
|
case substitute_find_regex.ESCAPED:
|
||||||
|
return substituteParamsExtended(regexScript.findRegex, {}, sanitizeRegexMacro);
|
||||||
|
default:
|
||||||
|
console.warn(`runRegexScript: Unknown substituteRegex value ${regexScript.substituteRegex}. Using raw regex.`);
|
||||||
|
return regexScript.findRegex;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const regexString = getRegexString();
|
||||||
const findRegex = regexFromString(regexString);
|
const findRegex = regexFromString(regexString);
|
||||||
|
|
||||||
// The user skill issued. Return with nothing.
|
// The user skill issued. Return with nothing.
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { enumIcons } from '../../slash-commands/SlashCommandCommonEnumsProvider.
|
||||||
import { SlashCommandEnumValue, enumTypes } from '../../slash-commands/SlashCommandEnumValue.js';
|
import { SlashCommandEnumValue, enumTypes } from '../../slash-commands/SlashCommandEnumValue.js';
|
||||||
import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js';
|
import { SlashCommandParser } from '../../slash-commands/SlashCommandParser.js';
|
||||||
import { download, getFileText, getSortableDelay, uuidv4 } from '../../utils.js';
|
import { download, getFileText, getSortableDelay, uuidv4 } from '../../utils.js';
|
||||||
import { regex_placement, runRegexScript } from './engine.js';
|
import { regex_placement, runRegexScript, substitute_find_regex } from './engine.js';
|
||||||
import { t } from '../../i18n.js';
|
import { t } from '../../i18n.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -227,7 +227,7 @@ async function onRegexEditorOpenClick(existingId, isScoped) {
|
||||||
editorHtml.find('input[name="only_format_display"]').prop('checked', existingScript.markdownOnly ?? false);
|
editorHtml.find('input[name="only_format_display"]').prop('checked', existingScript.markdownOnly ?? false);
|
||||||
editorHtml.find('input[name="only_format_prompt"]').prop('checked', existingScript.promptOnly ?? false);
|
editorHtml.find('input[name="only_format_prompt"]').prop('checked', existingScript.promptOnly ?? false);
|
||||||
editorHtml.find('input[name="run_on_edit"]').prop('checked', existingScript.runOnEdit ?? false);
|
editorHtml.find('input[name="run_on_edit"]').prop('checked', existingScript.runOnEdit ?? false);
|
||||||
editorHtml.find('input[name="substitute_regex"]').prop('checked', existingScript.substituteRegex ?? false);
|
editorHtml.find('select[name="substitute_regex"]').val(existingScript.substituteRegex ?? substitute_find_regex.NONE);
|
||||||
editorHtml.find('input[name="min_depth"]').val(existingScript.minDepth ?? '');
|
editorHtml.find('input[name="min_depth"]').val(existingScript.minDepth ?? '');
|
||||||
editorHtml.find('input[name="max_depth"]').val(existingScript.maxDepth ?? '');
|
editorHtml.find('input[name="max_depth"]').val(existingScript.maxDepth ?? '');
|
||||||
|
|
||||||
|
@ -267,7 +267,7 @@ async function onRegexEditorOpenClick(existingId, isScoped) {
|
||||||
findRegex: editorHtml.find('.find_regex').val(),
|
findRegex: editorHtml.find('.find_regex').val(),
|
||||||
replaceString: editorHtml.find('.regex_replace_string').val(),
|
replaceString: editorHtml.find('.regex_replace_string').val(),
|
||||||
trimStrings: String(editorHtml.find('.regex_trim_strings').val()).split('\n').filter((e) => e.length !== 0) || [],
|
trimStrings: String(editorHtml.find('.regex_trim_strings').val()).split('\n').filter((e) => e.length !== 0) || [],
|
||||||
substituteRegex: editorHtml.find('input[name="substitute_regex"]').prop('checked'),
|
substituteRegex: Number(editorHtml.find('select[name="substitute_regex"]').val()),
|
||||||
};
|
};
|
||||||
const rawTestString = String(editorHtml.find('#regex_test_input').val());
|
const rawTestString = String(editorHtml.find('#regex_test_input').val());
|
||||||
const result = runRegexScript(testScript, rawTestString);
|
const result = runRegexScript(testScript, rawTestString);
|
||||||
|
@ -295,7 +295,7 @@ async function onRegexEditorOpenClick(existingId, isScoped) {
|
||||||
markdownOnly: editorHtml.find('input[name="only_format_display"]').prop('checked'),
|
markdownOnly: editorHtml.find('input[name="only_format_display"]').prop('checked'),
|
||||||
promptOnly: editorHtml.find('input[name="only_format_prompt"]').prop('checked'),
|
promptOnly: editorHtml.find('input[name="only_format_prompt"]').prop('checked'),
|
||||||
runOnEdit: editorHtml.find('input[name="run_on_edit"]').prop('checked'),
|
runOnEdit: editorHtml.find('input[name="run_on_edit"]').prop('checked'),
|
||||||
substituteRegex: editorHtml.find('input[name="substitute_regex"]').prop('checked'),
|
substituteRegex: Number(editorHtml.find('select[name="substitute_regex"]').val()),
|
||||||
minDepth: parseInt(String(editorHtml.find('input[name="min_depth"]').val())),
|
minDepth: parseInt(String(editorHtml.find('input[name="min_depth"]').val())),
|
||||||
maxDepth: parseInt(String(editorHtml.find('input[name="max_depth"]').val())),
|
maxDepth: parseInt(String(editorHtml.find('input[name="max_depth"]').val())),
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue