diff options
| author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-09-09 11:54:40 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-09 11:54:40 -0400 | 
| commit | 2aa86cc5f8cda022076f7fa047f17fdcca4a0f5e (patch) | |
| tree | d89d3776d46e76fc818b3ac4ba420d38c024002e | |
| parent | b687870a55eae43a71ea3adc41be0ab341a8721f (diff) | |
Anki API refactor (#790)
* Add function guiBrowseNote
* Assign default server as null
* Use get/set properties for server/enabled
* Refactor option values
* Refactor createNote/Data functions to not use options format directly
* Use createNote for testing
* Add errors
| -rw-r--r-- | ext/bg/js/anki-note-builder.js | 51 | ||||
| -rw-r--r-- | ext/bg/js/anki.js | 24 | ||||
| -rw-r--r-- | ext/bg/js/backend.js | 27 | ||||
| -rw-r--r-- | ext/bg/js/settings/anki-templates.js | 18 | 
4 files changed, 80 insertions, 40 deletions
| diff --git a/ext/bg/js/anki-note-builder.js b/ext/bg/js/anki-note-builder.js index d69a4fea..4afb2d40 100644 --- a/ext/bg/js/anki-note-builder.js +++ b/ext/bg/js/anki-note-builder.js @@ -27,41 +27,46 @@ class AnkiNoteBuilder {          this._getClipboardImage = getClipboardImage;      } -    async createNote(definition, mode, context, options, templates) { -        const isKanji = (mode === 'kanji'); -        const tags = options.anki.tags; -        const modeOptions = isKanji ? options.anki.kanji : options.anki.terms; -        const modeOptionsFieldEntries = Object.entries(modeOptions.fields); - -        const fields = {}; +    async createNote({ +        definition, +        mode, +        context, +        templates, +        tags=[], +        duplicateScope='collection', +        resultOutputMode='split', +        compactGlossaries=false, +        modeOptions: {fields, deck, model}, +        errors=null +    }) { +        const fieldEntries = Object.entries(fields); +        const noteFields = {};          const note = { -            fields, +            fields: noteFields,              tags, -            deckName: modeOptions.deck, -            modelName: modeOptions.model, -            options: { -                duplicateScope: options.anki.duplicateScope -            } +            deckName: deck, +            modelName: model, +            options: {duplicateScope}          }; -        const data = this.createNoteData(definition, mode, context, options); +        const data = this.createNoteData(definition, mode, context, resultOutputMode, compactGlossaries);          const formattedFieldValuePromises = []; -        for (const [, fieldValue] of modeOptionsFieldEntries) { -            const formattedFieldValuePromise = this.formatField(fieldValue, data, templates, null); +        for (const [, fieldValue] of fieldEntries) { +            const formattedFieldValuePromise = this.formatField(fieldValue, data, templates, errors);              formattedFieldValuePromises.push(formattedFieldValuePromise);          }          const formattedFieldValues = await Promise.all(formattedFieldValuePromises); -        for (let i = 0, ii = modeOptionsFieldEntries.length; i < ii; ++i) { -            const fieldName = modeOptionsFieldEntries[i][0]; +        for (let i = 0, ii = fieldEntries.length; i < ii; ++i) { +            const fieldName = fieldEntries[i][0];              const formattedFieldValue = formattedFieldValues[i]; -            fields[fieldName] = formattedFieldValue; +            noteFields[fieldName] = formattedFieldValue;          }          return note;      } -    createNoteData(definition, mode, context, options) { +    createNoteData(definition, mode, context, resultOutputMode, compactGlossaries) {          const pitches = DictionaryDataUtil.getPitchAccentInfos(definition);          const pitchCount = pitches.reduce((i, v) => i + v.pitches.length, 0);          return { @@ -69,12 +74,12 @@ class AnkiNoteBuilder {              definition,              pitches,              pitchCount, -            group: options.general.resultOutputMode === 'group', -            merge: options.general.resultOutputMode === 'merge', +            group: resultOutputMode === 'group', +            merge: resultOutputMode === 'merge',              modeTermKanji: mode === 'term-kanji',              modeTermKana: mode === 'term-kana',              modeKanji: mode === 'kanji', -            compactGlossaries: options.general.compactGlossaries, +            compactGlossaries,              context          };      } diff --git a/ext/bg/js/anki.js b/ext/bg/js/anki.js index b1e1f7b4..182b4ded 100644 --- a/ext/bg/js/anki.js +++ b/ext/bg/js/anki.js @@ -16,30 +16,30 @@   */  class AnkiConnect { -    constructor(server) { +    constructor() {          this._enabled = false; -        this._server = server; +        this._server = null;          this._localVersion = 2;          this._remoteVersion = 0;          this._versionCheckPromise = null;      } -    setServer(server) { -        this._server = server; -    } - -    getServer() { +    get server() {          return this._server;      } -    setEnabled(enabled) { -        this._enabled = enabled; +    set server(value) { +        this._server = value;      } -    isEnabled() { +    get enabled() {          return this._enabled;      } +    set enabled(value) { +        this._enabled = value; +    } +      async addNote(note) {          if (!this._enabled) { return null; }          await this._checkVersion(); @@ -76,6 +76,10 @@ class AnkiConnect {          return await this._invoke('guiBrowse', {query});      } +    async guiBrowseNote(noteId) { +        return await this.guiBrowse(`nid:${noteId}`); +    } +      async storeMediaFile(fileName, dataBase64) {          if (!this._enabled) {              throw new Error('AnkiConnect not enabled'); diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index e9f3fbec..832dbc3a 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -471,7 +471,7 @@ class Backend {              );          } -        const note = await this._ankiNoteBuilder.createNote(definition, mode, context, options, templates); +        const note = await this._createNote(definition, mode, context, options, templates);          return this._anki.addNote(note);      } @@ -484,7 +484,7 @@ class Backend {              const notePromises = [];              for (const definition of definitions) {                  for (const mode of modes) { -                    const notePromise = this._ankiNoteBuilder.createNote(definition, mode, context, options, templates); +                    const notePromise = this._createNote(definition, mode, context, options, templates);                      notePromises.push(notePromise);                  }              } @@ -524,7 +524,7 @@ class Backend {      }      async _onApiNoteView({noteId}) { -        return await this._anki.guiBrowse(`nid:${noteId}`); +        return await this._anki.guiBrowseNote(noteId);      }      async _onApiTemplateRender({template, data, marker}) { @@ -1023,8 +1023,8 @@ class Backend {          const options = this.getOptions({current: true});          this._updateBadge(); -        this._anki.setServer(options.anki.server); -        this._anki.setEnabled(options.anki.enable); +        this._anki.server = options.anki.server; +        this._anki.enabled = options.anki.enable;          if (options.parsing.enableMecabParser) {              this._mecab.startListener(); @@ -1609,4 +1609,21 @@ class Backend {              reader.readAsDataURL(file);          });      } + +    async _createNote(definition, mode, context, options, templates) { +        const {general: {resultOutputMode, compactGlossaries}, anki: ankiOptions} = options; +        const {tags, duplicateScope} = ankiOptions; +        const modeOptions = (mode === 'kanji') ? ankiOptions.kanji : ankiOptions.terms; +        return await this._ankiNoteBuilder.createNote({ +            definition, +            mode, +            context, +            templates, +            tags, +            duplicateScope, +            resultOutputMode, +            compactGlossaries, +            modeOptions +        }); +    }  } diff --git a/ext/bg/js/settings/anki-templates.js b/ext/bg/js/settings/anki-templates.js index fb03ef14..87f13100 100644 --- a/ext/bg/js/settings/anki-templates.js +++ b/ext/bg/js/settings/anki-templates.js @@ -147,8 +147,22 @@ class AnkiTemplatesController {                      renderTemplate: api.templateRender.bind(api),                      getClipboardImage: api.clipboardGetImage.bind(api)                  }); -                const data = ankiNoteBuilder.createNoteData(definition, mode, context, options); -                result = await ankiNoteBuilder.formatField(field, data, templates, exceptions); +                const {general: {resultOutputMode, compactGlossaries}} = options; +                const note = await ankiNoteBuilder.createNote({ +                    definition, +                    mode, +                    context, +                    templates, +                    resultOutputMode, +                    compactGlossaries, +                    modeOptions: { +                        fields: {field}, +                        deck: '', +                        model: '' +                    }, +                    errors: exceptions +                }); +                result = note.fields.field;              }          } catch (e) {              exceptions.push(e); |