From ee6a6603a3b5a7c5e37f096888fa623b2f3eef64 Mon Sep 17 00:00:00 2001 From: kingbri Date: Tue, 4 Jul 2023 02:00:03 -0400 Subject: [PATCH] Regex: Add trimStrings option Sometimes the matched regex string needs to be pruned before replacement. Add a method for the user to provide strings which globally trims a regex match before any replacement is done. Example without trim: input - regex - /<([^>]*)>/g output - With trim: input - regex - /<([^>]*)>/g trim - ["{{char}}'s thoughts: "] output - Signed-off-by: kingbri --- public/scripts/extensions/regex/editor.html | 21 ++++++++++++---- public/scripts/extensions/regex/engine.js | 27 ++++++++++++++++++--- public/scripts/extensions/regex/index.js | 6 +++-- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/public/scripts/extensions/regex/editor.html b/public/scripts/extensions/regex/editor.html index 7c81ed717..dbf7b553a 100644 --- a/public/scripts/extensions/regex/editor.html +++ b/public/scripts/extensions/regex/editor.html @@ -8,7 +8,7 @@ Script Name
- +
@@ -16,19 +16,30 @@ Find Regex
- +
-
+
+ +
+
diff --git a/public/scripts/extensions/regex/engine.js b/public/scripts/extensions/regex/engine.js index 74c197fa6..e2296f610 100644 --- a/public/scripts/extensions/regex/engine.js +++ b/public/scripts/extensions/regex/engine.js @@ -30,9 +30,19 @@ function runRegexScript(regexScript, rawString) { const fencedMatch = match[0]; const capturedMatch = match[1]; + let trimCapturedMatch; + let trimFencedMatch; + if (capturedMatch) { + const tempTrimCapture = filterString(capturedMatch, regexScript.trimStrings); + trimFencedMatch = fencedMatch.replaceAll(capturedMatch, tempTrimCapture); + trimCapturedMatch = tempTrimCapture; + } else { + trimFencedMatch = filterString(fencedMatch, regexScript.trimStrings); + } + // TODO: Use substrings for replacement. But not necessary at this time. // A substring is from match.index to match.index + match[0].length or fencedMatch.length - const subReplaceString = substituteRegexParams(regexScript.replaceString, { regexMatch: capturedMatch ?? fencedMatch }); + const subReplaceString = substituteRegexParams(regexScript.replaceString, trimCapturedMatch ?? trimFencedMatch); if (!newString) { newString = rawString.replace(fencedMatch, subReplaceString); } else { @@ -48,8 +58,19 @@ function runRegexScript(regexScript, rawString) { return newString; } -// Substitutes parameters -function substituteRegexParams(rawString, { regexMatch }) { +// Filters anything to trim from the regex match +function filterString(rawString, trimStrings) { + let finalString = rawString; + trimStrings.forEach((trimString) => { + const subTrimString = substituteParams(trimString); + finalString = finalString.replaceAll(subTrimString, ""); + }); + + return finalString; +} + +// Substitutes regex-specific and normal parameters +function substituteRegexParams(rawString, regexMatch) { let finalString = rawString; finalString = finalString.replace("{{match}}", regexMatch); finalString = substituteParams(finalString); diff --git a/public/scripts/extensions/regex/index.js b/public/scripts/extensions/regex/index.js index 24317e025..e7bb56b11 100644 --- a/public/scripts/extensions/regex/index.js +++ b/public/scripts/extensions/regex/index.js @@ -87,9 +87,10 @@ async function onRegexEditorOpenClick(existingId) { editorHtml.find(`.regex_script_name`).val(existingScript.scriptName); editorHtml.find(`.find_regex`).val(existingScript.findRegex); editorHtml.find(`.regex_replace_string`).val(existingScript.replaceString); + editorHtml.find(`.regex_trim_strings`).val(existingScript.trimStrings?.join("\n") || []); editorHtml .find(`input[name="disabled"]`) - .prop("checked", existingScript.disabled); + .prop("checked", existingScript.disabled ?? false); editorHtml .find(`input[name="run_on_edit"]`) .prop("checked", existingScript.runOnEdit); @@ -116,13 +117,14 @@ async function onRegexEditorOpenClick(existingId) { scriptName: editorHtml.find(".regex_script_name").val(), findRegex: editorHtml.find(".find_regex").val(), replaceString: editorHtml.find(".regex_replace_string").val(), + trimStrings: editorHtml.find(".regex_trim_strings").val().split("\n").filter((e) => e.length !== 0) || [], placement: editorHtml .find(`input[name="replace_position"]`) .filter(":checked") .map(function() { return parseInt($(this).val()) }) .get() - .filter((e) => e !== NaN) ?? [], + .filter((e) => e !== NaN) || [], disabled: editorHtml .find(`input[name="disabled"]`)