From da13a2ebff76f00a0338e2e9d8fb5e8f1587fade Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Mon, 5 Jul 2021 15:08:11 -0400 Subject: [PATCH] DisplayAnki note requirements (#1799) * Update how errors are collected from _formatField * Expose requirements --- ext/js/data/anki-note-builder.js | 27 +++++++++++++++++++-------- ext/js/display/display-anki.js | 8 ++++---- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ext/js/data/anki-note-builder.js b/ext/js/data/anki-note-builder.js index 4427c276..6077eec1 100644 --- a/ext/js/data/anki-note-builder.js +++ b/ext/js/data/anki-note-builder.js @@ -52,20 +52,27 @@ class AnkiNoteBuilder { duplicateScopeCheckChildren = true; } - const errors = []; const commonData = this._createData(dictionaryEntry, mode, context, resultOutputMode, glossaryLayoutMode, compactTags, injectedMedia); const formattedFieldValuePromises = []; for (const [, fieldValue] of fields) { - const formattedFieldValuePromise = this._formatField(fieldValue, commonData, template, errors); + const formattedFieldValuePromise = this._formatField(fieldValue, commonData, template); formattedFieldValuePromises.push(formattedFieldValuePromise); } const formattedFieldValues = await Promise.all(formattedFieldValuePromises); + const errors = []; + const uniqueRequirements = new Map(); const noteFields = {}; for (let i = 0, ii = fields.length; i < ii; ++i) { const fieldName = fields[i][0]; - const formattedFieldValue = formattedFieldValues[i]; - noteFields[fieldName] = formattedFieldValue; + const {value, errors: fieldErrors, requirements} = formattedFieldValues[i]; + noteFields[fieldName] = value; + errors.push(...fieldErrors); + for (const requirement of requirements) { + const key = JSON.stringify(requirement); + if (uniqueRequirements.has(key)) { continue; } + uniqueRequirements.set(key, requirement); + } } const note = { @@ -82,7 +89,7 @@ class AnkiNoteBuilder { } } }; - return {note, errors}; + return {note, errors, requirements: [...uniqueRequirements.values()]}; } async getRenderingData({ @@ -113,10 +120,13 @@ class AnkiNoteBuilder { }; } - async _formatField(field, commonData, template, errors) { - return await this._stringReplaceAsync(field, this._markerPattern, async (g0, marker) => { + async _formatField(field, commonData, template) { + const errors = []; + const requirements = []; + const value = await this._stringReplaceAsync(field, this._markerPattern, async (g0, marker) => { try { - const {result} = await this._renderTemplateBatched(template, commonData, marker); + const {result, requirements: fieldRequirements} = await this._renderTemplateBatched(template, commonData, marker); + requirements.push(...fieldRequirements); return result; } catch (e) { const error = new Error(`Template render error for {${marker}}`); @@ -125,6 +135,7 @@ class AnkiNoteBuilder { return `{${marker}-render-error}`; } }); + return {value, errors, requirements}; } async _stringReplaceAsync(str, regex, replacer) { diff --git a/ext/js/display/display-anki.js b/ext/js/display/display-anki.js index aedf33c7..a2732c66 100644 --- a/ext/js/display/display-anki.js +++ b/ext/js/display/display-anki.js @@ -498,13 +498,13 @@ class DisplayAnki { const results = []; for (let i = 0, ii = noteInfoList.length; i < ii; ++i) { - const {note, errors} = noteInfoList[i]; + const {note, errors, requirements} = noteInfoList[i]; const {canAdd, valid, noteIds, noteInfos} = infos[i]; const {mode, index} = noteTargets[i]; while (index >= results.length) { results.push([]); } - results[index].push({mode, note, errors, canAdd, valid, noteIds, noteInfos, ankiError}); + results[index].push({mode, note, errors, requirements, canAdd, valid, noteIds, noteInfos, ankiError}); } return results; } @@ -536,7 +536,7 @@ class DisplayAnki { } } - const {note, errors: createNoteErrors} = await this._ankiNoteBuilder.createNote({ + const {note, errors: createNoteErrors, requirements} = await this._ankiNoteBuilder.createNote({ dictionaryEntry, mode, context, @@ -554,7 +554,7 @@ class DisplayAnki { errors }); errors.push(...createNoteErrors); - return {note, errors}; + return {note, errors, requirements}; } async _injectAnkiNoteMedia(dictionaryEntry, fields) {