summaryrefslogtreecommitdiff
path: root/ext/js/templates
diff options
context:
space:
mode:
Diffstat (limited to 'ext/js/templates')
-rw-r--r--ext/js/templates/anki-template-renderer.js17
-rw-r--r--ext/js/templates/template-renderer-media-provider.js2
-rw-r--r--ext/js/templates/template-renderer.js2
3 files changed, 15 insertions, 6 deletions
diff --git a/ext/js/templates/anki-template-renderer.js b/ext/js/templates/anki-template-renderer.js
index ae3e7a36..888be9b0 100644
--- a/ext/js/templates/anki-template-renderer.js
+++ b/ext/js/templates/anki-template-renderer.js
@@ -659,12 +659,19 @@ export class AnkiTemplateRenderer {
}
/**
+ * @param {import('template-renderer').HelperOptions} options
+ * @returns {import('anki-templates').NoteData}
+ */
+ _getNoteDataFromOptions(options) {
+ return options.data.root;
+ }
+
+ /**
* @type {import('template-renderer').HelperFunction<string>}
*/
_formatGlossary(args, _context, options) {
const [dictionary, content] = /** @type {[dictionary: string, content: import('dictionary-data').TermGlossaryContent]} */ (args);
- /** @type {import('anki-templates').NoteData} */
- const data = options.data.root;
+ const data = this._getNoteDataFromOptions(options);
if (typeof content === 'string') { return this._safeString(this._stringToMultiLineHtml(content)); }
if (!(typeof content === 'object' && content !== null)) { return ''; }
switch (content.type) {
@@ -703,8 +710,7 @@ export class AnkiTemplateRenderer {
* @type {import('template-renderer').HelperFunction<boolean>}
*/
_hasMedia(args, _context, options) {
- /** @type {import('anki-templates').NoteData} */
- const data = options.data.root;
+ const data = this._getNoteDataFromOptions(options);
return this._mediaProvider.hasMedia(data, args, options.hash);
}
@@ -712,8 +718,7 @@ export class AnkiTemplateRenderer {
* @type {import('template-renderer').HelperFunction<?string>}
*/
_getMedia(args, _context, options) {
- /** @type {import('anki-templates').NoteData} */
- const data = options.data.root;
+ const data = this._getNoteDataFromOptions(options);
return this._mediaProvider.getMedia(data, args, options.hash);
}
diff --git a/ext/js/templates/template-renderer-media-provider.js b/ext/js/templates/template-renderer-media-provider.js
index 2f238e20..c4b07369 100644
--- a/ext/js/templates/template-renderer-media-provider.js
+++ b/ext/js/templates/template-renderer-media-provider.js
@@ -81,6 +81,8 @@ export class TemplateRendererMediaProvider {
let {value} = data;
const {escape = true} = namedArgs;
if (escape) {
+ // Handlebars is a custom version of the library without type information, so it's assumed to be "any".
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
value = Handlebars.Utils.escapeExpression(value);
}
return value;
diff --git a/ext/js/templates/template-renderer.js b/ext/js/templates/template-renderer.js
index 7bb93aa2..c5b7cd63 100644
--- a/ext/js/templates/template-renderer.js
+++ b/ext/js/templates/template-renderer.js
@@ -117,6 +117,8 @@ export class TemplateRenderer {
let instance = cache.get(template);
if (typeof instance === 'undefined') {
this._updateCacheSize(this._cacheMaxSize - 1);
+ // Handlebars is a custom version of the library without type information, so it's assumed to be "any".
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
instance = /** @type {import('handlebars').TemplateDelegate<import('anki-templates').NoteData>} */ (Handlebars.compileAST(template));
cache.set(template, instance);
}