diff --git a/javascript/ext_wildcards.js b/javascript/ext_wildcards.js index 515e982..045cd15 100644 --- a/javascript/ext_wildcards.js +++ b/javascript/ext_wildcards.js @@ -1,14 +1,14 @@ // Regex -const WC_REGEX = /\b__([^,]+)__([^, ]*)\b/g; +const WC_REGEX = new RegExp(/__([^,]+)__([^, ]*)/g); // Trigger conditions -const WC_TRIGGER = () => TAC_CFG.useWildcards && [...tagword.matchAll(WC_REGEX)].length > 0; -const WC_FILE_TRIGGER = () => TAC_CFG.useWildcards && (tagword.startsWith("__") && !tagword.endsWith("__") || tagword === "__"); +const WC_TRIGGER = () => TAC_CFG.useWildcards && [...tagword.matchAll(new RegExp(WC_REGEX.source.replaceAll("__", escapeRegExp(TAC_CFG.wcWrap)), "g"))].length > 0; +const WC_FILE_TRIGGER = () => TAC_CFG.useWildcards && (tagword.startsWith(TAC_CFG.wcWrap) && !tagword.endsWith(TAC_CFG.wcWrap) || tagword === TAC_CFG.wcWrap); class WildcardParser extends BaseTagParser { async parse() { // Show wildcards from a file with that name - let wcMatch = [...tagword.matchAll(WC_REGEX)] + let wcMatch = [...tagword.matchAll(new RegExp(WC_REGEX.source.replaceAll("__", escapeRegExp(TAC_CFG.wcWrap)), "g"))]; let wcFile = wcMatch[0][1]; let wcWord = wcMatch[0][2]; @@ -64,8 +64,8 @@ class WildcardFileParser extends BaseTagParser { parse() { // Show available wildcard files let tempResults = []; - if (tagword !== "__") { - let lmb = (x) => x[1].toLowerCase().includes(tagword.replace("__", "")) + if (tagword !== TAC_CFG.wcWrap) { + let lmb = (x) => x[1].toLowerCase().includes(tagword.replace(TAC_CFG.wcWrap, "")) tempResults = wildcardFiles.filter(lmb).concat(wildcardExtFiles.filter(lmb)) // Filter by tagword } else { tempResults = wildcardFiles.concat(wildcardExtFiles); @@ -151,7 +151,7 @@ async function load() { function sanitize(tagType, text) { if (tagType === ResultType.wildcardFile || tagType === ResultType.yamlWildcard) { - return `__${text}__`; + return `${TAC_CFG.wcWrap}${text}${TAC_CFG.wcWrap}`; } else if (tagType === ResultType.wildcardTag) { return text; } diff --git a/javascript/tagAutocomplete.js b/javascript/tagAutocomplete.js index 01f1634..ec5c754 100644 --- a/javascript/tagAutocomplete.js +++ b/javascript/tagAutocomplete.js @@ -241,6 +241,7 @@ async function syncOptions() { wildcardCompletionMode: opts["tac_wildcardCompletionMode"], modelKeywordCompletion: opts["tac_modelKeywordCompletion"], modelKeywordLocation: opts["tac_modelKeywordLocation"], + wcWrap: opts["dp_parser_wildcard_wrap"] || "__", // to support custom wrapper chars set by dp_parser // Alias settings alias: { searchByAlias: opts["tac_alias.searchByAlias"], @@ -413,7 +414,7 @@ const COMPLETED_WILDCARD_REGEX = /__[^\s,_][^\t\n\r,_]*[^\s,_]__[^\s,_]*/g; const STYLE_VAR_REGEX = /\$\(?[^$|\[\],\s]*\)?/g; const NORMAL_TAG_REGEX = /[^\s,|<>\[\]:]+_\([^\s,|<>\[\]:]*\)?|[^\s,|<>():\[\]]+|?/g; -const TAG_REGEX = new RegExp(`${POINTY_REGEX.source}|${COMPLETED_WILDCARD_REGEX.source}|${STYLE_VAR_REGEX.source}|${NORMAL_TAG_REGEX.source}`, "g"); +const TAG_REGEX = () => { return new RegExp(`${POINTY_REGEX.source}|${COMPLETED_WILDCARD_REGEX.source.replaceAll("__", escapeRegExp(TAC_CFG.wcWrap))}|${STYLE_VAR_REGEX.source}|${NORMAL_TAG_REGEX.source}`, "g"); } // On click, insert the tag into the prompt textbox with respect to the cursor position async function insertTextAtCursor(textArea, result, tagword, tabCompletedWithoutChoice = false) { @@ -469,7 +470,7 @@ async function insertTextAtCursor(textArea, result, tagword, tabCompletedWithout // Don't cut off the __ at the end if it is already the full path if (firstDifference > 0 && firstDifference < longestResult) { // +2 because the sanitized text already has the __ at the start but the matched text doesn't - sanitizedText = sanitizedText.substring(0, firstDifference + 2); + sanitizedText = sanitizedText.substring(0, firstDifference + TAC_CFG.wcWrap.length); } else if (firstDifference === 0) { sanitizedText = tagword; } @@ -484,7 +485,7 @@ async function insertTextAtCursor(textArea, result, tagword, tabCompletedWithout case ResultType.wildcardFile: case ResultType.yamlWildcard: // We only want to update the frequency for a full wildcard, not partial paths - if (sanitizedText.endsWith("__")) + if (sanitizedText.endsWith(TAC_CFG.wcWrap)) name = text break; case ResultType.chant: @@ -622,7 +623,7 @@ async function insertTextAtCursor(textArea, result, tagword, tabCompletedWithout // Update previous tags with the edited prompt to prevent re-searching the same term let weightedTags = [...newPrompt.matchAll(WEIGHT_REGEX)] .map(match => match[1]); - let tags = newPrompt.match(TAG_REGEX) + let tags = newPrompt.match(TAG_REGEX()) if (weightedTags !== null) { tags = tags.filter(tag => !weightedTags.some(weighted => tag.includes(weighted))) .concat(weightedTags); @@ -1040,7 +1041,7 @@ async function autocomplete(textArea, prompt, fixedTag = null) { // We also match for the weighting format (e.g. "tag:1.0") here, and combine the two to get the full tag word set let weightedTags = [...prompt.matchAll(WEIGHT_REGEX)] .map(match => match[1]); - let tags = prompt.match(TAG_REGEX) + let tags = prompt.match(TAG_REGEX()) if (weightedTags !== null && tags !== null) { tags = tags.filter(tag => !weightedTags.some(weighted => tag.includes(weighted) && !tag.startsWith("<[") && !tag.startsWith("$("))) .concat(weightedTags);