Skip to content
This repository has been archived by the owner on Feb 25, 2023. It is now read-only.

Commit

Permalink
Anki template regex helper updates (#1934)
Browse files Browse the repository at this point in the history
* Update regexReplace and regexMatch to support content arguments

* Update documentation
  • Loading branch information
toasted-nutbread committed Sep 11, 2021
1 parent 39a704e commit b52f244
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 10 deletions.
8 changes: 6 additions & 2 deletions docs/templates.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,8 @@ Uses a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScr
<details>
<summary>Syntax:</summary>

<code>{{#regexReplace <i>regex</i> <i>replacement</i> <i>[flags]</i>}}<i>text-to-modify</i>{{/regexReplace}}</code>
<code>{{#regexReplace <i>regex</i> <i>replacement</i> <i>[flags]</i>}}<i>text-to-modify</i>{{/regexReplace}}</code><br>
<code>{{#regexReplace <i>regex</i> <i>replacement</i> <i>[flags]</i> <i>[text-to-modify]...</i>}}{{/regexReplace}}</code><br>

* _`regex`_ <br>
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.
Expand All @@ -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`_ <br>
The text that the regular expression is applied to.
If multiple arguments are present, they are all concatenated.
</details>
<details>
<summary>Example:</summary>
Expand All @@ -178,14 +180,16 @@ Uses a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScr
<details>
<summary>Syntax:</summary>

<code>{{#regexMatch <i>regex</i> <i>[flags]</i>}}<i>text-to-modify</i>{{/regexMatch}}</code>
<code>{{#regexMatch <i>regex</i> <i>[flags]</i>}}<i>text-to-modify</i>{{/regexMatch}}</code><br>
<code>{{#regexMatch <i>regex</i> <i>[flags]</i> <i>[text-to-modify]...</i>}}{{/regexMatch}}</code><br>

* _`regex`_ <br>
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.
* _`flags`_ _(optional)_ <br>
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`_ <br>
The text that the regular expression is applied to.
If multiple arguments are present, they are all concatenated.
</details>
<details>
<summary>Example:</summary>
Expand Down
26 changes: 18 additions & 8 deletions ext/js/templates/sandbox/anki-template-renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -206,15 +206,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) {
Expand All @@ -226,14 +231,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));
Expand Down

0 comments on commit b52f244

Please sign in to comment.