diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-05-19 18:24:50 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-19 18:24:50 -0400 |
commit | eddd0288643f08d2a2c85f73575bc7ee1c157539 (patch) | |
tree | bbcc7dd1279f4954324eccc34d6bf718ff1899aa /ext/js/language/dictionary-importer.js | |
parent | ae89a8f2ad6274f77afbc0c8c202c0fbc0dc8757 (diff) |
Add support for definitions with structured content (#1689)
* Add structured content to schema
* Add support for generating custom content
* Update importer
* Update test data
* Add verticalAlign property
Diffstat (limited to 'ext/js/language/dictionary-importer.js')
-rw-r--r-- | ext/js/language/dictionary-importer.js | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/ext/js/language/dictionary-importer.js b/ext/js/language/dictionary-importer.js index 051375a0..4d885a74 100644 --- a/ext/js/language/dictionary-importer.js +++ b/ext/js/language/dictionary-importer.js @@ -300,20 +300,58 @@ class DictionaryImporter { return data.text; case 'image': return await this._formatDictionaryTermGlossaryImage(data, context, entry); + case 'structured-content': + return await this._formatStructuredContent(data, context, entry); default: throw new Error(`Unhandled data type: ${data.type}`); } } async _formatDictionaryTermGlossaryImage(data, context, entry) { + return await this._createImageData(data, context, entry, {type: 'image'}); + } + + async _formatStructuredContent(data, context, entry) { + const content = await this._prepareStructuredContent(data.content, context, entry); + return { + type: 'structured-content', + content + }; + } + + async _prepareStructuredContent(content, context, entry) { + if (typeof content === 'string' || !(typeof content === 'object' && content !== null)) { + return content; + } + if (Array.isArray(content)) { + for (let i = 0, ii = content.length; i < ii; ++i) { + content[i] = await this._prepareStructuredContent(content[i], context, entry); + } + return content; + } + const {tag} = content; + switch (tag) { + case 'img': + return await this._prepareStructuredContentImage(content, context, entry); + } + const childContent = content.content; + if (typeof childContent !== 'undefined') { + content.content = await this._prepareStructuredContent(childContent, context, entry); + } + return content; + } + + async _prepareStructuredContentImage(content, context, entry) { + const {verticalAlign} = content; + const result = await this._createImageData(content, context, entry, {tag: 'img'}); + if (typeof verticalAlign === 'string') { result.verticalAlign = verticalAlign; } + return result; + } + + async _createImageData(data, context, entry, attributes) { const {path, width: preferredWidth, height: preferredHeight, title, description, pixelated, collapsed, collapsible} = data; const {width, height} = await this._getImageMedia(path, context, entry); - const newData = { - type: 'image', - path, - width, - height - }; + const newData = Object.assign({}, attributes, {path, width, height}); if (typeof preferredWidth === 'number') { newData.preferredWidth = preferredWidth; } if (typeof preferredHeight === 'number') { newData.preferredHeight = preferredHeight; } if (typeof title === 'string') { newData.title = title; } |