diff options
Diffstat (limited to 'ext/bg/js/backend.js')
| -rw-r--r-- | ext/bg/js/backend.js | 46 | 
1 files changed, 21 insertions, 25 deletions
diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 810370c4..7f85d9a5 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -28,13 +28,11 @@   * Mecab   * ObjectPropertyAccessor   * OptionsUtil + * ProfileConditions   * RequestBuilder   * TemplateRenderer   * Translator - * conditionsTestValue   * jp - * profileConditionsDescriptor - * profileConditionsDescriptorPromise   */  class Backend { @@ -49,6 +47,8 @@ class Backend {          this._options = null;          this._optionsSchema = null;          this._optionsSchemaValidator = new JsonSchemaValidator(); +        this._profileConditionsSchemaCache = []; +        this._profileConditionsUtil = new ProfileConditions();          this._defaultAnkiFieldTemplates = null;          this._requestBuilder = new RequestBuilder();          this._audioUriBuilder = new AudioUriBuilder({ @@ -200,8 +200,6 @@ class Backend {              }              await this._translator.prepare(); -            await profileConditionsDescriptorPromise; -              this._optionsSchema = await this._fetchAsset('/bg/data/options-schema.json', true);              this._defaultAnkiFieldTemplates = (await this._fetchAsset('/bg/data/default-anki-field-templates.handlebars')).trim();              this._options = await OptionsUtil.load(); @@ -397,6 +395,7 @@ class Backend {      }      async _onApiOptionsSave({source}) { +        this._clearProfileConditionsSchemaCache();          const options = this.getFullOptions();          await OptionsUtil.save(options);          this._applyOptions(source); @@ -1006,35 +1005,32 @@ class Backend {      }      _getProfileFromContext(options, optionsContext) { +        optionsContext = this._profileConditionsUtil.normalizeContext(optionsContext); + +        let index = 0;          for (const profile of options.profiles) {              const conditionGroups = profile.conditionGroups; -            if (conditionGroups.length > 0 && this._testConditionGroups(conditionGroups, optionsContext)) { -                return profile; -            } -        } -        return null; -    } -    _testConditionGroups(conditionGroups, data) { -        if (conditionGroups.length === 0) { return false; } +            let schema; +            if (index < this._profileConditionsSchemaCache.length) { +                schema = this._profileConditionsSchemaCache[index]; +            } else { +                schema = this._profileConditionsUtil.createSchema(conditionGroups); +                this._profileConditionsSchemaCache.push(schema); +            } -        for (const conditionGroup of conditionGroups) { -            const conditions = conditionGroup.conditions; -            if (conditions.length > 0 && this._testConditions(conditions, data)) { -                return true; +            if (conditionGroups.length > 0 && this._optionsSchemaValidator.isValid(optionsContext, schema)) { +                return profile;              } +            ++index;          } -        return false; +        return null;      } -    _testConditions(conditions, data) { -        for (const condition of conditions) { -            if (!conditionsTestValue(profileConditionsDescriptor, condition.type, condition.operator, condition.value, data)) { -                return false; -            } -        } -        return true; +    _clearProfileConditionsSchemaCache() { +        this._profileConditionsSchemaCache = []; +        this._optionsSchemaValidator.clearCache();      }      _checkLastError() {  |