From ca97e38bd22875e23cfe6f70d1803ea31d6f0e89 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Fri, 2 Jul 2021 22:46:38 -0400 Subject: Anki support for structured-content (#1786) * Update how glossary text is formatted * Update structured content and image generation * Pass root data to _createStructuredContentGenerator * Implement media URLs * Update documentation * Update options util * Apply styles to content * Improve HTML normalization * Update DatabaseVM.fetch function * Update test * Update test data --- test/data/anki-note-builder-test-results.json | 12 +++++----- test/test-anki-note-builder.js | 21 +++++++++++++----- test/test-options-util.js | 32 ++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 17 deletions(-) (limited to 'test') diff --git a/test/data/anki-note-builder-test-results.json b/test/data/anki-note-builder-test-results.json index c6405439..c8357cb3 100644 --- a/test/data/anki-note-builder-test-results.json +++ b/test/data/anki-note-builder-test-results.json @@ -587,9 +587,9 @@ "frequencies": "", "furigana": "画像がぞう", "furigana-plain": "画像[がぞう]", - "glossary": "
(n, Test Dictionary 2)
", - "glossary-brief": "
", - "glossary-no-dictionary": "
(n)
", + "glossary": "
(n, Test Dictionary 2)
", + "glossary-brief": "
", + "glossary-no-dictionary": "
(n)
", "part-of-speech": "Noun", "pitch-accents": "No pitch accent data", "pitch-accent-graphs": "No pitch accent data", @@ -1042,9 +1042,9 @@ "frequencies": "", "furigana": "画像がぞう", "furigana-plain": "画像[がぞう]", - "glossary": "
(n, Test Dictionary 2)
", - "glossary-brief": "
", - "glossary-no-dictionary": "
(n)
", + "glossary": "
(n, Test Dictionary 2)
", + "glossary-brief": "
", + "glossary-no-dictionary": "
(n)
", "part-of-speech": "Noun", "pitch-accents": "No pitch accent data", "pitch-accent-graphs": "No pitch accent data", diff --git a/test/test-anki-note-builder.js b/test/test-anki-note-builder.js index d7045254..2517e521 100644 --- a/test/test-anki-note-builder.js +++ b/test/test-anki-note-builder.js @@ -29,9 +29,13 @@ function clone(value) { async function createVM() { const dom = new JSDOM(); - const {document} = dom.window; + const {Node, NodeFilter, document} = dom.window; - const vm = new TranslatorVM({document}); + const vm = new TranslatorVM({ + Node, + NodeFilter, + document + }); const dictionaryDirectory = path.join(__dirname, 'data', 'dictionaries', 'valid-dictionary1'); await vm.prepare(dictionaryDirectory, 'Test Dictionary 2'); @@ -39,6 +43,8 @@ async function createVM() { vm.execute([ 'js/data/anki-note-builder.js', 'js/data/anki-util.js', + 'js/dom/css-style-applier.js', + 'js/display/structured-content-generator.js', 'js/templates/template-renderer.js', 'lib/handlebars.min.js' ]); @@ -46,11 +52,13 @@ async function createVM() { const [ JapaneseUtil, TemplateRenderer, - AnkiNoteBuilder + AnkiNoteBuilder, + CssStyleApplier ] = vm.get([ 'JapaneseUtil', 'TemplateRenderer', - 'AnkiNoteBuilder' + 'AnkiNoteBuilder', + 'CssStyleApplier' ]); const ankiNoteDataCreator = vm.ankiNoteDataCreator; @@ -58,7 +66,8 @@ async function createVM() { constructor() { this._preparePromise = null; this._japaneseUtil = new JapaneseUtil(null); - this._templateRenderer = new TemplateRenderer(this._japaneseUtil); + this._cssStyleApplier = new CssStyleApplier('/data/structured-content-style.json'); + this._templateRenderer = new TemplateRenderer(this._japaneseUtil, this._cssStyleApplier); this._templateRenderer.registerDataType('ankiNote', { modifier: ({marker, commonData}) => ankiNoteDataCreator.create(marker, commonData), composeData: (marker, commonData) => ({marker, commonData}) @@ -83,7 +92,7 @@ async function createVM() { } async _prepareInternal() { - // Empty + await this._cssStyleApplier.prepare(); } _serializeError(error) { diff --git a/test/test-options-util.js b/test/test-options-util.js index 47b09b94..7d86743b 100644 --- a/test/test-options-util.js +++ b/test/test-options-util.js @@ -589,7 +589,7 @@ function createOptionsUpdatedTestData1() { } ], profileCurrent: 0, - version: 12, + version: 13, global: { database: { prefixWildcardsSupported: false @@ -655,7 +655,8 @@ async function testFieldTemplatesUpdate(extDir) { {version: 6, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v6.handlebars')}, {version: 8, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v8.handlebars')}, {version: 10, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v10.handlebars')}, - {version: 12, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v12.handlebars')} + {version: 12, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v12.handlebars')}, + {version: 13, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v13.handlebars')} ]; const getUpdateAdditions = (startVersion=0) => { let value = ''; @@ -875,11 +876,11 @@ ${getUpdateAdditions()} {{~#if only~}}({{#each only}}{{.}}{{#unless @last}}, {{/unless}}{{/each}} only) {{/if~}} {{~/unless~}} {{~#if (op "<=" glossary.length 1)~}} - {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{/each}} + {{#each glossary}}{{#formatGlossary ../dictionary}}{{{.}}}{{/formatGlossary}}{{/each}} {{~else if @root.compactGlossaries~}} - {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{#unless @last}} | {{/unless}}{{/each}} + {{#each glossary}}{{#formatGlossary ../dictionary}}{{{.}}}{{/formatGlossary}}{{#unless @last}} | {{/unless}}{{/each}} {{~else~}} - + {{~/if~}} {{~#set "previousDictionary" dictionary~}}{{~/set~}} {{/inline}} @@ -920,6 +921,27 @@ ${getUpdateAdditions()} ${getUpdateAdditions(7)} {{~> (lookup . "marker") ~}}`.trimStart() + }, + // formatGlossary update + { + oldVersion: 12, + old: ` + {{~#if (op "<=" glossary.length 1)~}} + {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{/each}} + {{~else if @root.compactGlossaries~}} + {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{#unless @last}} | {{/unless}}{{/each}} + {{~else~}} + + {{~/if~}}`.trimStart(), + + expected: ` + {{~#if (op "<=" glossary.length 1)~}} + {{#each glossary}}{{#formatGlossary ../dictionary}}{{{.}}}{{/formatGlossary}}{{/each}} + {{~else if @root.compactGlossaries~}} + {{#each glossary}}{{#formatGlossary ../dictionary}}{{{.}}}{{/formatGlossary}}{{#unless @last}} | {{/unless}}{{/each}} + {{~else~}} + + {{~/if~}}`.trimStart() } ]; -- cgit v1.2.3