From 7b28c2c5329b0bb0fa74872f160ec6b2974654d0 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Mon, 8 Feb 2021 17:53:07 -0500 Subject: Auto-fill Anki card fields when possible (#1355) --- ext/bg/js/settings/anki-controller.js | 60 +++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) (limited to 'ext') diff --git a/ext/bg/js/settings/anki-controller.js b/ext/bg/js/settings/anki-controller.js index a594fc8b..cb6922b8 100644 --- a/ext/bg/js/settings/anki-controller.js +++ b/ext/bg/js/settings/anki-controller.js @@ -52,6 +52,10 @@ class AnkiController { this._validateFieldsToken = null; } + get settingsController() { + return this._settingsController; + } + async prepare() { this._ankiErrorContainer = document.querySelector('#anki-error'); this._ankiErrorMessageNode = document.querySelector('#anki-error-message'); @@ -606,9 +610,11 @@ class AnkiCardController { if (this._model === value) { return; } let fieldNames; + let options; try { this._modelChangingTo = value; fieldNames = await this._ankiController.getModelFieldNames(value); + options = await this._ankiController.settingsController.getOptions(); } catch (e) { // Revert this._ankiCardModelSelect.value = this._model; @@ -617,9 +623,14 @@ class AnkiCardController { this._modelChangingTo = null; } + const cardType = this._cardType; + const cardOptions = this._getCardOptions(options.anki, cardType); + const oldFields = cardOptions !== null ? cardOptions.fields : null; + const fields = {}; - for (const fieldName of fieldNames) { - fields[fieldName] = ''; + for (let i = 0, ii = fieldNames.length; i < ii; ++i) { + const fieldName = fieldNames[i]; + fields[fieldName] = this._getDefaultFieldValue(fieldName, i, cardType, oldFields); } const targets = [ @@ -690,4 +701,49 @@ class AnkiCardController { this._validateField(inputField, i); } } + + _getDefaultFieldValue(fieldName, index, cardType, oldFields) { + if ( + typeof oldFields === 'object' && + oldFields !== null && + Object.prototype.hasOwnProperty.call(oldFields, fieldName) + ) { + return oldFields[fieldName]; + } + + if (index === 0) { + return (cardType === 'kanji' ? '{character}' : '{expression}'); + } + + const markers = this._ankiController.getFieldMarkers(cardType); + const markerAliases = new Map([ + ['glossary', ['definition', 'meaning']], + ['audio', ['sound']], + ['dictionary', ['dict']] + ]); + + const hyphenPattern = /-/g; + for (const marker of markers) { + const names = [marker]; + const aliases = markerAliases.get(marker); + if (typeof aliases !== 'undefined') { + names.push(...aliases); + } + + let pattern = '^(?:'; + for (let i = 0, ii = names.length; i < ii; ++i) { + const name = names[i]; + if (i > 0) { pattern += '|'; } + pattern += name.replace(hyphenPattern, '[-_ ]*'); + } + pattern += ')$'; + pattern = new RegExp(pattern, 'i'); + + if (pattern.test(fieldName)) { + return `{${marker}}`; + } + } + + return ''; + } } -- cgit v1.2.3