aboutsummaryrefslogtreecommitdiff
path: root/ext/js/data
diff options
context:
space:
mode:
Diffstat (limited to 'ext/js/data')
-rw-r--r--ext/js/data/anki-template-util.js51
-rw-r--r--ext/js/data/anki-util.js4
-rw-r--r--ext/js/data/options-util.js12
3 files changed, 64 insertions, 3 deletions
diff --git a/ext/js/data/anki-template-util.js b/ext/js/data/anki-template-util.js
index 380d87f9..b9c5ba84 100644
--- a/ext/js/data/anki-template-util.js
+++ b/ext/js/data/anki-template-util.js
@@ -93,3 +93,54 @@ export function getStandardFieldMarkers(type) {
throw new Error(`Unsupported type: ${type}`);
}
}
+
+/**
+ * @param {import('settings').ProfileOptions} options
+ * @returns {string}
+ */
+export function getDynamicTemplates(options) {
+ let dynamicTemplates = '\n';
+ for (const dictionary of options.dictionaries) {
+ if (!dictionary.enabled) { continue; }
+ dynamicTemplates += `
+{{#*inline "single-glossary-${getKebabCase(dictionary.name)}"}}
+ {{~> glossary selectedDictionary='${dictionary.name}'}}
+{{/inline}}
+
+{{#*inline "single-glossary-${getKebabCase(dictionary.name)}-no-dictionary"}}
+ {{~> glossary selectedDictionary='${dictionary.name}' noDictionaryTag=true}}
+{{/inline}}
+
+{{#*inline "single-glossary-${getKebabCase(dictionary.name)}-brief"}}
+ {{~> glossary selectedDictionary='${dictionary.name}' brief=true}}
+{{/inline}}
+`;
+ }
+ return dynamicTemplates;
+}
+
+/**
+ * @param {import('settings').DictionariesOptions} dictionaries
+ * @returns {string[]} The list of field markers.
+ */
+export function getDynamicFieldMarkers(dictionaries) {
+ const markers = [];
+ for (const dictionary of dictionaries) {
+ if (!dictionary.enabled) { continue; }
+ markers.push(`single-glossary-${getKebabCase(dictionary.name)}`);
+ }
+ return markers;
+}
+
+/**
+ * @param {string} str
+ * @returns {string}
+ */
+function getKebabCase(str) {
+ return str
+ .replace(/[\s_\u3000]/g, '-')
+ .replace(/[^\p{L}\p{N}-]/gu, '')
+ .replace(/--+/g, '-')
+ .replace(/^-|-$/g, '')
+ .toLowerCase();
+}
diff --git a/ext/js/data/anki-util.js b/ext/js/data/anki-util.js
index a063980f..c076c482 100644
--- a/ext/js/data/anki-util.js
+++ b/ext/js/data/anki-util.js
@@ -19,7 +19,7 @@
import {isObjectNotArray} from '../core/object-utilities.js';
/** @type {RegExp} @readonly */
-const markerPattern = /\{([\w-]+)\}/g;
+const markerPattern = /\{([\p{Letter}\p{Number}_-]+)\}/gu;
/**
* Gets the root deck name of a full deck name. If the deck is a root deck,
@@ -65,7 +65,7 @@ export function getFieldMarkers(string) {
* @returns {RegExp} A new `RegExp` instance.
*/
export function cloneFieldMarkerPattern(global) {
- return new RegExp(markerPattern.source, global ? 'g' : '');
+ return new RegExp(markerPattern.source, global ? 'gu' : 'u');
}
/**
diff --git a/ext/js/data/options-util.js b/ext/js/data/options-util.js
index d6c667aa..b6fb6686 100644
--- a/ext/js/data/options-util.js
+++ b/ext/js/data/options-util.js
@@ -539,7 +539,8 @@ export class OptionsUtil {
this._updateVersion30,
this._updateVersion31,
this._updateVersion32,
- this._updateVersion33
+ this._updateVersion33,
+ this._updateVersion34
];
/* eslint-enable @typescript-eslint/unbound-method */
if (typeof targetVersion === 'number' && targetVersion < result.length) {
@@ -1268,6 +1269,15 @@ export class OptionsUtil {
}
/**
+ * - Added dynamic handlebars for single dictionaries.
+ * @type {import('options-util').UpdateFunction}
+ */
+ async _updateVersion34(options) {
+ await this._applyAnkiFieldTemplatesPatch(options, '/data/templates/anki-field-templates-upgrade-v34.handlebars');
+ }
+
+
+ /**
* @param {string} url
* @returns {Promise<chrome.tabs.Tab>}
*/