From 8c92c1cbc246001e27a1e31e53c2ce992bf72fbd Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sun, 3 Jan 2021 19:40:12 -0500 Subject: [PATCH] Refactor anki note generation (#1202) * Create _injectAnkiNoteMedia function * Remove unused code path * Simplify modeOptions --- ext/bg/js/anki-note-builder.js | 27 +++----- .../js/settings/anki-templates-controller.js | 10 +-- ext/mixed/js/display.js | 64 +++++++++++-------- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/ext/bg/js/anki-note-builder.js b/ext/bg/js/anki-note-builder.js index 71ef5b25..ae608bed 100644 --- a/ext/bg/js/anki-note-builder.js +++ b/ext/bg/js/anki-note-builder.js @@ -26,42 +26,35 @@ class AnkiNoteBuilder { } async createNote({ - anki=null, definition, mode, context, templates, + deckName, + modelName, + fields, tags=[], checkForDuplicates=true, duplicateScope='collection', resultOutputMode='split', glossaryLayoutMode='default', compactTags=false, - modeOptions: {fields, deck, model}, - audioDetails=null, - screenshotDetails=null, - clipboardDetails=null, errors=null }) { - if (anki !== null) { - await this._injectMedia(anki, definition, fields, mode, audioDetails, screenshotDetails, clipboardDetails); - } - let duplicateScopeDeckName = null; let duplicateScopeCheckChildren = false; if (duplicateScope === 'deck-root') { duplicateScope = 'deck'; - duplicateScopeDeckName = this.getRootDeckName(deck); + duplicateScopeDeckName = this.getRootDeckName(deckName); duplicateScopeCheckChildren = true; } - const fieldEntries = Object.entries(fields); const noteFields = {}; const note = { fields: noteFields, tags, - deckName: deck, - modelName: model, + deckName, + modelName, options: { allowDuplicate: !checkForDuplicates, duplicateScope, @@ -74,14 +67,14 @@ class AnkiNoteBuilder { const data = this._createNoteData(definition, mode, context, resultOutputMode, glossaryLayoutMode, compactTags); const formattedFieldValuePromises = []; - for (const [, fieldValue] of fieldEntries) { + for (const [, fieldValue] of fields) { const formattedFieldValuePromise = this._formatField(fieldValue, data, templates, errors); formattedFieldValuePromises.push(formattedFieldValuePromise); } const formattedFieldValues = await Promise.all(formattedFieldValuePromises); - for (let i = 0, ii = fieldEntries.length; i < ii; ++i) { - const fieldName = fieldEntries[i][0]; + for (let i = 0, ii = fields.length; i < ii; ++i) { + const fieldName = fields[i][0]; const formattedFieldValue = formattedFieldValues[i]; noteFields[fieldName] = formattedFieldValue; } @@ -91,7 +84,7 @@ class AnkiNoteBuilder { containsMarker(fields, marker) { marker = `{${marker}}`; - for (const fieldValue of Object.values(fields)) { + for (const [, fieldValue] of fields) { if (fieldValue.includes(marker)) { return true; } diff --git a/ext/bg/js/settings/anki-templates-controller.js b/ext/bg/js/settings/anki-templates-controller.js index 5e40b7db..72f1a175 100644 --- a/ext/bg/js/settings/anki-templates-controller.js +++ b/ext/bg/js/settings/anki-templates-controller.js @@ -189,14 +189,14 @@ class AnkiTemplatesController { mode, context, templates, + deckName: '', + modelName: '', + fields: [ + ['field', field] + ], resultOutputMode, glossaryLayoutMode, compactTags, - modeOptions: { - fields: {field}, - deck: '', - model: '' - }, errors: exceptions }); result = note.fields.field; diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index a3b70764..c36a0c1c 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -1545,33 +1545,15 @@ class Display extends EventDispatcher { async _createNote(definition, mode, context, options, templates, injectMedia) { const { general: {resultOutputMode, glossaryLayoutMode, compactTags}, - anki: {tags, checkForDuplicates, duplicateScope, kanji, terms, screenshot: {format, quality}}, - audio: {sources, customSourceUrl} + anki: ankiOptions } = options; - const modeOptions = (mode === 'kanji') ? kanji : terms; + const {tags, checkForDuplicates, duplicateScope} = ankiOptions; + const modeOptions = (mode === 'kanji') ? ankiOptions.kanji : ankiOptions.terms; + const {deck: deckName, model: modelName} = modeOptions; + const fields = Object.entries(modeOptions.fields); if (injectMedia) { - const timestamp = Date.now(); - const ownerFrameId = this._ownerFrameId; - const {fields} = modeOptions; - const definitionDetails = this._getDefinitionDetailsForNote(definition); - const audioDetails = (mode !== 'kanji' && this._ankiNoteBuilder.containsMarker(fields, 'audio') ? {sources, customSourceUrl} : null); - const screenshotDetails = (this._ankiNoteBuilder.containsMarker(fields, 'screenshot') ? {ownerFrameId, format, quality} : null); - const clipboardDetails = { - image: this._ankiNoteBuilder.containsMarker(fields, 'clipboard-image'), - text: this._ankiNoteBuilder.containsMarker(fields, 'clipboard-text') - }; - const {screenshotFileName, clipboardImageFileName, clipboardText, audioFileName} = await api.injectAnkiNoteMedia( - timestamp, - definitionDetails, - audioDetails, - screenshotDetails, - clipboardDetails - ); - if (screenshotFileName !== null) { definition.screenshotFileName = screenshotFileName; } - if (clipboardImageFileName !== null) { definition.clipboardImageFileName = clipboardImageFileName; } - if (audioFileName !== null) { definition.audioFileName = audioFileName; } - if (clipboardText !== null) { definition.clipboardText = clipboardText; } + await this._injectAnkiNoteMedia(definition, mode, options, fields); } return await this._ankiNoteBuilder.createNote({ @@ -1579,16 +1561,46 @@ class Display extends EventDispatcher { mode, context, templates, + deckName, + modelName, + fields, tags, checkForDuplicates, duplicateScope, resultOutputMode, glossaryLayoutMode, - compactTags, - modeOptions + compactTags }); } + async _injectAnkiNoteMedia(definition, mode, options, fields) { + const { + anki: {screenshot: {format, quality}}, + audio: {sources, customSourceUrl} + } = options; + + const timestamp = Date.now(); + const ownerFrameId = this._ownerFrameId; + const definitionDetails = this._getDefinitionDetailsForNote(definition); + const audioDetails = (mode !== 'kanji' && this._ankiNoteBuilder.containsMarker(fields, 'audio') ? {sources, customSourceUrl} : null); + const screenshotDetails = (this._ankiNoteBuilder.containsMarker(fields, 'screenshot') ? {ownerFrameId, format, quality} : null); + const clipboardDetails = { + image: this._ankiNoteBuilder.containsMarker(fields, 'clipboard-image'), + text: this._ankiNoteBuilder.containsMarker(fields, 'clipboard-text') + }; + const {screenshotFileName, clipboardImageFileName, clipboardText, audioFileName} = await api.injectAnkiNoteMedia( + timestamp, + definitionDetails, + audioDetails, + screenshotDetails, + clipboardDetails + ); + if (screenshotFileName !== null) { definition.screenshotFileName = screenshotFileName; } + if (clipboardImageFileName !== null) { definition.clipboardImageFileName = clipboardImageFileName; } + if (audioFileName !== null) { definition.audioFileName = audioFileName; } + if (clipboardText !== null) { definition.clipboardText = clipboardText; } + } + _getDefinitionDetailsForNote(definition) { const {type} = definition; if (type === 'kanji') {