diff options
Diffstat (limited to 'ext/mixed/js')
| -rw-r--r-- | ext/mixed/js/api.js | 4 | ||||
| -rw-r--r-- | ext/mixed/js/display-generator.js | 74 | ||||
| -rw-r--r-- | ext/mixed/js/display.js | 10 | 
3 files changed, 72 insertions, 16 deletions
| diff --git a/ext/mixed/js/api.js b/ext/mixed/js/api.js index 8ed1d996..9f0835b0 100644 --- a/ext/mixed/js/api.js +++ b/ext/mixed/js/api.js @@ -101,6 +101,10 @@ function apiClipboardGet() {      return _apiInvoke('clipboardGet');  } +function apiGetDisplayTemplatesHtml() { +    return _apiInvoke('getDisplayTemplatesHtml'); +} +  function _apiInvoke(action, params={}) {      const data = {action, params};      return new Promise((resolve, reject) => { diff --git a/ext/mixed/js/display-generator.js b/ext/mixed/js/display-generator.js index 44b250e7..8eb699e0 100644 --- a/ext/mixed/js/display-generator.js +++ b/ext/mixed/js/display-generator.js @@ -19,22 +19,39 @@  class DisplayGenerator {      constructor() { -        this._termEntryTemplate = document.querySelector('#term-entry-template'); -        this._termExpressionTemplate = document.querySelector('#term-expression-template'); -        this._termDefinitionItemTemplate = document.querySelector('#term-definition-item-template'); -        this._termDefinitionOnlyTemplate = document.querySelector('#term-definition-only-template'); -        this._termGlossaryItemTemplate = document.querySelector('#term-glossary-item-template'); -        this._termReasonTemplate = document.querySelector('#term-reason-template'); - -        this._kanjiEntryTemplate = document.querySelector('#kanji-entry-template'); -        this._kanjiInfoTableTemplate = document.querySelector('#kanji-info-table-template'); -        this._kanjiInfoTableItemTemplate = document.querySelector('#kanji-info-table-item-template'); -        this._kanjiInfoTableEmptyTemplate = document.querySelector('#kanji-info-table-empty-template'); -        this._kanjiGlossaryItemTemplate = document.querySelector('#kanji-glossary-item-template'); -        this._kanjiReadingTemplate = document.querySelector('#kanji-reading-template'); - -        this._tagTemplate = document.querySelector('#tag-template'); -        this._tagFrequencyTemplate = document.querySelector('#tag-frequency-template'); +        this._isInitialized = false; +        this._initializationPromise = null; + +        this._termEntryTemplate = null; +        this._termExpressionTemplate = null; +        this._termDefinitionItemTemplate = null; +        this._termDefinitionOnlyTemplate = null; +        this._termGlossaryItemTemplate = null; +        this._termReasonTemplate = null; + +        this._kanjiEntryTemplate = null; +        this._kanjiInfoTableTemplate = null; +        this._kanjiInfoTableItemTemplate = null; +        this._kanjiInfoTableEmptyTemplate = null; +        this._kanjiGlossaryItemTemplate = null; +        this._kanjiReadingTemplate = null; + +        this._tagTemplate = null; +        this._tagFrequencyTemplate = null; +    } + +    isInitialized() { +        return this._isInitialized; +    } + +    initialize() { +        if (this._isInitialized) { +            return Promise.resolve(); +        } +        if (this._initializationPromise === null) { +            this._initializationPromise = this._initializeInternal(); +        } +        return this._initializationPromise;      }      createTermEntry(details) { @@ -259,6 +276,31 @@ class DisplayGenerator {          return node;      } +    async _initializeInternal() { +        const html = await apiGetDisplayTemplatesHtml(); +        const doc = new DOMParser().parseFromString(html, 'text/html'); +        this._setTemplates(doc); +    } + +    _setTemplates(doc) { +        this._termEntryTemplate = doc.querySelector('#term-entry-template'); +        this._termExpressionTemplate = doc.querySelector('#term-expression-template'); +        this._termDefinitionItemTemplate = doc.querySelector('#term-definition-item-template'); +        this._termDefinitionOnlyTemplate = doc.querySelector('#term-definition-only-template'); +        this._termGlossaryItemTemplate = doc.querySelector('#term-glossary-item-template'); +        this._termReasonTemplate = doc.querySelector('#term-reason-template'); + +        this._kanjiEntryTemplate = doc.querySelector('#kanji-entry-template'); +        this._kanjiInfoTableTemplate = doc.querySelector('#kanji-info-table-template'); +        this._kanjiInfoTableItemTemplate = doc.querySelector('#kanji-info-table-item-template'); +        this._kanjiInfoTableEmptyTemplate = doc.querySelector('#kanji-info-table-empty-template'); +        this._kanjiGlossaryItemTemplate = doc.querySelector('#kanji-glossary-item-template'); +        this._kanjiReadingTemplate = doc.querySelector('#kanji-reading-template'); + +        this._tagTemplate = doc.querySelector('#tag-template'); +        this._tagFrequencyTemplate = doc.querySelector('#tag-frequency-template'); +    } +      _appendKanjiLinks(container, text) {          let part = '';          for (const c of text) { diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index eabb73ca..75b43aa0 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -356,6 +356,11 @@ class Display {              window.focus();          } +        if (!this.displayGenerator.isInitialized()) { +            await this.displayGenerator.initialize(); +            if (this.setContentToken !== token) { return; } +        } +          this.definitions = definitions;          if (context.disableHistory) {              delete context.disableHistory; @@ -415,6 +420,11 @@ class Display {              window.focus();          } +        if (!this.displayGenerator.isInitialized()) { +            await this.displayGenerator.initialize(); +            if (this.setContentToken !== token) { return; } +        } +          this.definitions = definitions;          if (context.disableHistory) {              delete context.disableHistory; |