diff options
Diffstat (limited to 'ext/js/display')
| -rw-r--r-- | ext/js/display/display-generator.js | 141 | 
1 files changed, 75 insertions, 66 deletions
| diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js index 3977815b..be5d5e66 100644 --- a/ext/js/display/display-generator.js +++ b/ext/js/display/display-generator.js @@ -60,23 +60,20 @@ class DisplayGenerator {          const definitionsContainer = node.querySelector('.definition-list');          const termTagsContainer = node.querySelector('.expression-list-tag-list'); -        const {expressions, type, reasons, frequencies} = details; -        const definitions = (type === 'term' ? [details] : details.definitions); -        const merged = (type === 'termMerged' || type === 'termMergedByGlossary'); +        const {headwords: expressions, type, inflections: reasons, definitions, frequencies, pronunciations} = details;          const pitches = DictionaryDataUtil.getPitchAccentInfos(details);          const pitchCount = pitches.reduce((i, v) => i + v.pitches.length, 0); -        const groupedFrequencies = DictionaryDataUtil.groupTermFrequencies(frequencies); +        const groupedFrequencies = DictionaryDataUtil.groupTermFrequencies(details);          const termTags = DictionaryDataUtil.groupTermTags(details);          const uniqueExpressions = new Set();          const uniqueReadings = new Set(); -        for (const {expression, reading} of expressions) { +        for (const {term: expression, reading} of expressions) {              uniqueExpressions.add(expression);              uniqueReadings.add(reading);          }          node.dataset.format = type; -        node.dataset.expressionMulti = `${merged}`;          node.dataset.expressionCount = `${expressions.length}`;          node.dataset.definitionCount = `${definitions.length}`;          node.dataset.pitchAccentDictionaryCount = `${pitches.length}`; @@ -86,7 +83,13 @@ class DisplayGenerator {          node.dataset.frequencyCount = `${frequencies.length}`;          node.dataset.groupedFrequencyCount = `${groupedFrequencies.length}`; -        this._appendMultiple(expressionsContainer, this._createTermExpression.bind(this), expressions); +        for (let i = 0, ii = expressions.length; i < ii; ++i) { +            const node2 = this._createTermExpression(expressions[i], i, pronunciations); +            node2.dataset.index = `${i}`; +            expressionsContainer.appendChild(node2); +        } +        expressionsContainer.dataset.count = `${expressions.length}`; +          this._appendMultiple(reasonsContainer, this._createTermReason.bind(this), reasons);          this._appendMultiple(frequencyGroupListContainer, this._createFrequencyGroup.bind(this), groupedFrequencies, false);          this._appendMultiple(pitchesContainer, this._createPitches.bind(this), pitches); @@ -114,7 +117,7 @@ class DisplayGenerator {                  dictionaryTag.name = dictionary;              } -            const node2 = this._createTermDefinitionItem(definition, dictionaryTag); +            const node2 = this._createTermDefinitionItem(definition, dictionaryTag, expressions, uniqueExpressions, uniqueReadings);              node2.dataset.index = `${i}`;              definitionsContainer.appendChild(node2);          } @@ -144,7 +147,7 @@ class DisplayGenerator {          this._appendMultiple(frequencyGroupListContainer, this._createFrequencyGroup.bind(this), groupedFrequencies, true);          this._appendMultiple(tagContainer, this._createTag.bind(this), [...details.tags, dictionaryTag]); -        this._appendMultiple(glossaryContainer, this._createKanjiGlossaryItem.bind(this), details.glossary); +        this._appendMultiple(glossaryContainer, this._createKanjiGlossaryItem.bind(this), details.definitions);          this._appendMultiple(chineseReadingsContainer, this._createKanjiReading.bind(this), details.onyomi);          this._appendMultiple(japaneseReadingsContainer, this._createKanjiReading.bind(this), details.kunyomi); @@ -229,8 +232,8 @@ class DisplayGenerator {      // Private -    _createTermExpression(details) { -        const {expression, reading, termTags, pitches} = details; +    _createTermExpression(headword, headwordIndex, pronunciations) { +        const {term: expression, reading, tags: termTags} = headword;          const searchQueries = [];          if (expression) { searchQueries.push(expression); } @@ -244,7 +247,7 @@ class DisplayGenerator {          node.dataset.readingIsSame = `${reading === expression}`;          node.dataset.frequency = DictionaryDataUtil.getTermFrequency(termTags); -        const pitchAccentCategories = this._getPitchAccentCategories(pitches); +        const pitchAccentCategories = this._getPitchAccentCategories(reading, pronunciations, headwordIndex);          if (pitchAccentCategories !== null) {              node.dataset.pitchAccentCategories = pitchAccentCategories;          } @@ -266,19 +269,21 @@ class DisplayGenerator {          return fragment;      } -    _createTermDefinitionItem(details, dictionaryTag) { +    _createTermDefinitionItem(details, dictionaryTag, headwords, uniqueTerms, uniqueReadings) { +        const {dictionary, tags, headwordIndices, entries} = details; +        const disambiguations = DictionaryDataUtil.getDisambiguations(headwords, headwordIndices, uniqueTerms, uniqueReadings); +          const node = this._templates.instantiate('definition-item');          const tagListContainer = node.querySelector('.definition-tag-list');          const onlyListContainer = node.querySelector('.definition-disambiguation-list');          const glossaryContainer = node.querySelector('.glossary-list'); -        const {dictionary, definitionTags} = details;          node.dataset.dictionary = dictionary; -        this._appendMultiple(tagListContainer, this._createTag.bind(this), [...definitionTags, dictionaryTag]); -        this._appendMultiple(onlyListContainer, this._createTermDisambiguation.bind(this), details.only); -        this._appendMultiple(glossaryContainer, this._createTermGlossaryItem.bind(this), details.glossary, dictionary); +        this._appendMultiple(tagListContainer, this._createTag.bind(this), [...tags, dictionaryTag]); +        this._appendMultiple(onlyListContainer, this._createTermDisambiguation.bind(this), disambiguations); +        this._appendMultiple(glossaryContainer, this._createTermGlossaryItem.bind(this), entries, dictionary);          return node;      } @@ -406,11 +411,12 @@ class DisplayGenerator {      }      _createKanjiInfoTableItem(details) { +        const {content, name, value} = details;          const node = this._templates.instantiate('kanji-info-table-item');          const nameNode = node.querySelector('.kanji-info-table-item-header');          const valueNode = node.querySelector('.kanji-info-table-item-value'); -        this._setTextContent(nameNode, details.notes || details.name); -        this._setTextContent(valueNode, details.value); +        this._setTextContent(nameNode, content.length > 0 ? content : name); +        this._setTextContent(valueNode, value);          return node;      } @@ -419,37 +425,46 @@ class DisplayGenerator {      }      _createTag(details) { -        const {notes, name, category, redundant} = details; +        const {content, name, category, redundant} = details;          const node = this._templates.instantiate('tag');          const inner = node.querySelector('.tag-label-content'); -        node.title = notes; +        const contentString = content.join('\n'); + +        node.title = contentString;          this._setTextContent(inner, name); -        node.dataset.details = notes || name; +        node.dataset.details = contentString.length > 0 ? contentString : name;          node.dataset.category = category;          if (redundant) { node.dataset.redundant = 'true'; }          return node;      } -    _createTermTag(details, totalExpressionCount) { -        const {tag, expressions} = details; +    _createTermTag(details, totalHeadwordCount) { +        const {tag, headwordIndices} = details;          const node = this._createTag(tag); -        node.dataset.disambiguation = `${JSON.stringify(expressions)}`; -        node.dataset.totalExpressionCount = `${totalExpressionCount}`; -        node.dataset.matchedExpressionCount = `${expressions.length}`; -        node.dataset.unmatchedExpressionCount = `${Math.max(0, totalExpressionCount - expressions.length)}`; +        node.dataset.headwords = headwordIndices.join(' '); +        node.dataset.totalExpressionCount = `${totalHeadwordCount}`; +        node.dataset.matchedExpressionCount = `${headwordIndices.length}`; +        node.dataset.unmatchedExpressionCount = `${Math.max(0, totalHeadwordCount - headwordIndices.length)}`;          return node;      } -    _createSearchTag(text) { -        return this._createTag({ -            notes: '', -            name: text, -            category: 'search', +    _createTagData(name, category) { +        return { +            name, +            category, +            order: 0, +            score: 0, +            content: [], +            dictionaries: [],              redundant: false -        }); +        }; +    } + +    _createSearchTag(text) { +        return this._createTag(this._createTagData(text, 'search'));      }      _createPitches(details) { @@ -462,7 +477,7 @@ class DisplayGenerator {          node.dataset.pitchesMulti = 'true';          node.dataset.pitchesCount = `${pitches.length}`; -        const tag = this._createTag({notes: '', name: dictionary, category: 'pitch-accent-dictionary'}); +        const tag = this._createTag(this._createTagData(dictionary, 'pitch-accent-dictionary'));          node.querySelector('.pitch-accent-group-tag-list').appendChild(tag);          let hasTags = false; @@ -482,7 +497,7 @@ class DisplayGenerator {      _createPitch(details) {          const jp = this._japaneseUtil; -        const {reading, position, tags, exclusiveExpressions, exclusiveReadings} = details; +        const {reading, position, tags, exclusiveTerms, exclusiveReadings} = details;          const morae = jp.getKanaMorae(reading);          const node = this._templates.instantiate('pitch-accent'); @@ -497,7 +512,7 @@ class DisplayGenerator {          this._appendMultiple(n, this._createTag.bind(this), tags);          n = node.querySelector('.pitch-accent-disambiguation-list'); -        this._createPitchAccentDisambiguations(n, exclusiveExpressions, exclusiveReadings); +        this._createPitchAccentDisambiguations(n, exclusiveTerms, exclusiveReadings);          n = node.querySelector('.pitch-accent-characters');          for (let i = 0, ii = morae.length; i < ii; ++i) { @@ -523,9 +538,9 @@ class DisplayGenerator {          return node;      } -    _createPitchAccentDisambiguations(container, exclusiveExpressions, exclusiveReadings) { +    _createPitchAccentDisambiguations(container, exclusiveTerms, exclusiveReadings) {          const templateName = 'pitch-accent-disambiguation'; -        for (const exclusiveExpression of exclusiveExpressions) { +        for (const exclusiveExpression of exclusiveTerms) {              const node = this._templates.instantiate(templateName);              node.dataset.type = 'expression';              this._setTextContent(node, exclusiveExpression, 'ja'); @@ -539,8 +554,8 @@ class DisplayGenerator {              container.appendChild(node);          } -        container.dataset.count = `${exclusiveExpressions.length + exclusiveReadings.length}`; -        container.dataset.expressionCount = `${exclusiveExpressions.length}`; +        container.dataset.count = `${exclusiveTerms.length + exclusiveReadings.length}`; +        container.dataset.expressionCount = `${exclusiveTerms.length}`;          container.dataset.readingCount = `${exclusiveReadings.length}`;      } @@ -586,7 +601,7 @@ class DisplayGenerator {      }      _createFrequencyGroup(details, kanji) { -        const {dictionary, frequencyData} = details; +        const {dictionary, frequencies} = details;          const node = this._templates.instantiate('frequency-group-item');          const body = node.querySelector('.tag-body-content'); @@ -594,36 +609,37 @@ class DisplayGenerator {          this._setTextContent(node.querySelector('.tag-label-content'), dictionary);          node.dataset.details = dictionary; -        for (let i = 0, ii = frequencyData.length; i < ii; ++i) { -            const item = frequencyData[i]; +        const ii = frequencies.length; +        for (let i = 0; i < ii; ++i) { +            const item = frequencies[i];              const itemNode = (kanji ? this._createKanjiFrequency(item, dictionary) : this._createTermFrequency(item, dictionary));              itemNode.dataset.index = `${i}`;              body.appendChild(itemNode);          } -        body.dataset.count = `${frequencyData.length}`; -        node.dataset.count = `${frequencyData.length}`; +        body.dataset.count = `${ii}`; +        node.dataset.count = `${ii}`;          node.dataset.details = dictionary;          return node;      }      _createTermFrequency(details, dictionary) { -        const {expression, reading, frequencies} = details; +        const {term, reading, values} = details;          const node = this._templates.instantiate('term-frequency-item');          this._setTextContent(node.querySelector('.tag-label-content'), dictionary); -        const frequency = frequencies.join(', '); +        const frequency = values.join(', '); -        this._setTextContent(node.querySelector('.frequency-disambiguation-expression'), expression, 'ja'); +        this._setTextContent(node.querySelector('.frequency-disambiguation-expression'), term, 'ja');          this._setTextContent(node.querySelector('.frequency-disambiguation-reading'), (reading !== null ? reading : ''), 'ja');          this._setTextContent(node.querySelector('.frequency-value'), frequency, 'ja'); -        node.dataset.expression = expression; +        node.dataset.expression = term;          node.dataset.reading = reading;          node.dataset.hasReading = `${reading !== null}`; -        node.dataset.readingIsSame = `${reading === expression}`; +        node.dataset.readingIsSame = `${reading === term}`;          node.dataset.dictionary = dictionary;          node.dataset.frequency = `${frequency}`;          node.dataset.details = dictionary; @@ -632,10 +648,10 @@ class DisplayGenerator {      }      _createKanjiFrequency(details, dictionary) { -        const {character, frequencies} = details; +        const {character, values} = details;          const node = this._templates.instantiate('kanji-frequency-item'); -        const frequency = frequencies.join(', '); +        const frequency = values.join(', ');          this._setTextContent(node.querySelector('.tag-label-content'), dictionary);          this._setTextContent(node.querySelector('.frequency-value'), frequency, 'ja'); @@ -707,15 +723,7 @@ class DisplayGenerator {      }      _createDictionaryTag(dictionary) { -        return { -            name: dictionary, -            category: 'dictionary', -            notes: '', -            order: 100, -            score: 0, -            dictionary, -            redundant: false -        }; +        return this._createTagData(dictionary, 'dictionary');      }      _setTextContent(node, value, language) { @@ -751,11 +759,12 @@ class DisplayGenerator {          }      } -    _getPitchAccentCategories(pitches) { -        if (pitches.length === 0) { return null; } +    _getPitchAccentCategories(reading, pronunciations, headwordIndex) { +        if (pronunciations.length === 0) { return null; }          const categories = new Set(); -        for (const {reading, pitches: pitches2} of pitches) { -            for (const {position} of pitches2) { +        for (const pronunciation of pronunciations) { +            if (pronunciation.headwordIndex !== headwordIndex) { continue; } +            for (const {position} of pronunciation.pitches) {                  const category = this._japaneseUtil.getPitchCategory(reading, position, false);                  if (category !== null) {                      categories.add(category); |