diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-07-06 19:43:53 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-06 19:43:53 -0400 |
commit | e88d63fc6d251bc298eb721fee1cbb9f5f4b752e (patch) | |
tree | f24b38bd421da53f84ab6b47ddff3c6492d44087 /ext/js/templates/template-renderer.js | |
parent | e15513208584764526e2348ca7796ea665925086 (diff) |
Template renderer media updates (#1802)
* Add TemplateRendererMediaProvider to abstract media-related functionality
* Update representation of injected media
* Update templates
* Update upgrade file
* Update tests
* Update test data
* Force media to be an object
* Update test data
Diffstat (limited to 'ext/js/templates/template-renderer.js')
-rw-r--r-- | ext/js/templates/template-renderer.js | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/ext/js/templates/template-renderer.js b/ext/js/templates/template-renderer.js index f9fbdeb5..02471c97 100644 --- a/ext/js/templates/template-renderer.js +++ b/ext/js/templates/template-renderer.js @@ -19,12 +19,14 @@ * DictionaryDataUtil * Handlebars * StructuredContentGenerator + * TemplateRendererMediaProvider */ class TemplateRenderer { constructor(japaneseUtil, cssStyleApplier) { this._japaneseUtil = japaneseUtil; this._cssStyleApplier = cssStyleApplier; + this._mediaProvider = new TemplateRendererMediaProvider(); this._cache = new Map(); this._cacheMaxSize = 5; this._helpersRegistered = false; @@ -94,6 +96,7 @@ class TemplateRenderer { try { this._stateStack = [new Map()]; this._requirements = requirements; + this._mediaProvider.requirements = requirements; this._cleanupCallbacks = cleanupCallbacks; const result = instance(data).trim(); return {result, requirements}; @@ -101,6 +104,7 @@ class TemplateRenderer { for (const callback of cleanupCallbacks) { callback(); } this._stateStack = null; this._requirements = null; + this._mediaProvider.requirements = null; this._cleanupCallbacks = null; } } @@ -162,7 +166,9 @@ class TemplateRenderer { ['join', this._join.bind(this)], ['concat', this._concat.bind(this)], ['pitchCategories', this._pitchCategories.bind(this)], - ['formatGlossary', this._formatGlossary.bind(this)] + ['formatGlossary', this._formatGlossary.bind(this)], + ['hasMedia', this._hasMedia.bind(this)], + ['getMedia', this._getMedia.bind(this)] ]; for (const [name, helper] of helpers) { @@ -563,33 +569,13 @@ class TemplateRenderer { parentNode.replaceChild(fragment, textNode); } - _getDictionaryMedia(data, dictionary, path) { - const {media} = data; - if (typeof media === 'object' && media !== null && Object.prototype.hasOwnProperty.call(media, 'dictionaryMedia')) { - const {dictionaryMedia} = media; - if (typeof dictionaryMedia === 'object' && dictionaryMedia !== null && Object.prototype.hasOwnProperty.call(dictionaryMedia, dictionary)) { - const dictionaryMedia2 = dictionaryMedia[dictionary]; - if (Object.prototype.hasOwnProperty.call(dictionaryMedia2, path)) { - return dictionaryMedia2[path]; - } - } - } - return null; - } - _createStructuredContentGenerator(data) { const mediaLoader = { loadMedia: async (path, dictionary, onLoad, onUnload) => { - const imageUrl = this._getDictionaryMedia(data, dictionary, path); + const imageUrl = this._mediaProvider.getMedia(data, ['dictionaryMedia', path], {dictionary, format: 'fileName', default: null}); if (imageUrl !== null) { onLoad(imageUrl); this._cleanupCallbacks.push(() => onUnload(true)); - } else { - this._requirements.push({ - type: 'dictionaryMedia', - dictionary, - path - }); } } }; @@ -619,4 +605,16 @@ class TemplateRenderer { const node = structuredContentGenerator.createStructuredContent(content.content, dictionary); return node !== null ? this._getHtml(node) : ''; } + + _hasMedia(context, ...args) { + const ii = args.length - 1; + const options = args[ii]; + return this._mediaProvider.hasMedia(options.data.root, args.slice(0, ii), options.hash); + } + + _getMedia(context, ...args) { + const ii = args.length - 1; + const options = args[ii]; + return this._mediaProvider.getMedia(options.data.root, args.slice(0, ii), options.hash); + } } |