From c91831a81722345ef7b4d20bd87c855903a7bca7 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sun, 5 Sep 2021 22:59:46 -0400 Subject: [PATCH] Anki template regex helper updates (#1934) * Update regexReplace and regexMatch to support content arguments * Update documentation --- docs/templates.md | 8 ++++-- .../sandbox/anki-template-renderer.js | 26 +++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/docs/templates.md b/docs/templates.md index 1cc7e210..638c79a6 100644 --- a/docs/templates.md +++ b/docs/templates.md @@ -146,7 +146,8 @@ Uses a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScr
Syntax: - {{#regexReplace regex replacement [flags]}}text-to-modify{{/regexReplace}} + {{#regexReplace regex replacement [flags]}}text-to-modify{{/regexReplace}}
+ {{#regexReplace regex replacement [flags] [text-to-modify]...}}{{/regexReplace}}
* _`regex`_
The raw string used to create the regular expression. This value is passed to the [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) constructor. @@ -156,6 +157,7 @@ Uses a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScr Optional flags to pass to the [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) constructor. * _`text-to-modify`_
The text that the regular expression is applied to. + If multiple arguments are present, they are all concatenated.
Example: @@ -178,7 +180,8 @@ Uses a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScr
Syntax: - {{#regexMatch regex [flags]}}text-to-modify{{/regexMatch}} + {{#regexMatch regex [flags]}}text-to-modify{{/regexMatch}}
+ {{#regexMatch regex [flags] [text-to-modify]...}}{{/regexMatch}}
* _`regex`_
The raw string used to create the regular expression. This value is passed to the [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) constructor. @@ -186,6 +189,7 @@ Uses a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScr Optional flags to pass to the [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp) constructor. * _`text-to-modify`_
The text that the regular expression is applied to. + If multiple arguments are present, they are all concatenated.
Example: diff --git a/ext/js/templates/sandbox/anki-template-renderer.js b/ext/js/templates/sandbox/anki-template-renderer.js index 10283761..e15fdba7 100644 --- a/ext/js/templates/sandbox/anki-template-renderer.js +++ b/ext/js/templates/sandbox/anki-template-renderer.js @@ -207,15 +207,20 @@ class AnkiTemplateRenderer { _regexReplace(context, ...args) { // Usage: - // {{#regexReplace regex string [flags]}}content{{/regexReplace}} + // {{#regexReplace regex string [flags] [content]...}}content{{/regexReplace}} // regex: regular expression string // string: string to replace // flags: optional flags for regular expression // e.g. "i" for case-insensitive, "g" for replace all - let value = args[args.length - 1].fn(context); - if (args.length >= 3) { + const argCount = args.length - 1; + const options = args[argCount]; + let value = options.fn(context); + if (argCount > 3) { + value = `${args.slice(3).join('')}${value}`; + } + if (argCount > 1) { try { - const flags = args.length > 3 ? args[2] : 'g'; + const flags = argCount > 2 ? args[2] : 'g'; const regex = new RegExp(args[0], flags); value = value.replace(regex, args[1]); } catch (e) { @@ -227,14 +232,19 @@ class AnkiTemplateRenderer { _regexMatch(context, ...args) { // Usage: - // {{#regexMatch regex [flags]}}content{{/regexMatch}} + // {{#regexMatch regex [flags] [content]...}}content{{/regexMatch}} // regex: regular expression string // flags: optional flags for regular expression // e.g. "i" for case-insensitive, "g" for match all - let value = args[args.length - 1].fn(context); - if (args.length >= 2) { + const argCount = args.length - 1; + const options = args[argCount]; + let value = options.fn(context); + if (argCount > 2) { + value = `${args.slice(2).join('')}${value}`; + } + if (argCount > 0) { try { - const flags = args.length > 2 ? args[1] : ''; + const flags = argCount > 1 ? args[1] : ''; const regex = new RegExp(args[0], flags); const parts = []; value.replace(regex, (g0) => parts.push(g0));