diff options
Diffstat (limited to 'ext/js/language/sandbox/dictionary-data-util.js')
| -rw-r--r-- | ext/js/language/sandbox/dictionary-data-util.js | 161 | 
1 files changed, 126 insertions, 35 deletions
diff --git a/ext/js/language/sandbox/dictionary-data-util.js b/ext/js/language/sandbox/dictionary-data-util.js index 1b71346a..a54b043b 100644 --- a/ext/js/language/sandbox/dictionary-data-util.js +++ b/ext/js/language/sandbox/dictionary-data-util.js @@ -17,6 +17,10 @@   */  export class DictionaryDataUtil { +    /** +     * @param {import('dictionary').TermDictionaryEntry} dictionaryEntry +     * @returns {import('dictionary-data-util').TagGroup[]} +     */      static groupTermTags(dictionaryEntry) {          const {headwords} = dictionaryEntry;          const headwordCount = headwords.length; @@ -27,8 +31,8 @@ export class DictionaryDataUtil {              const {tags} = headwords[i];              for (const tag of tags) {                  if (uniqueCheck) { -                    const {name, category, notes, dictionary} = tag; -                    const key = this._createMapKey([name, category, notes, dictionary]); +                    const {name, category, content, dictionaries} = tag; +                    const key = this._createMapKey([name, category, content, dictionaries]);                      const index = resultsIndexMap.get(key);                      if (typeof index !== 'undefined') {                          const existingItem = results[index]; @@ -45,11 +49,16 @@ export class DictionaryDataUtil {          return results;      } +    /** +     * @param {import('dictionary').TermDictionaryEntry} dictionaryEntry +     * @returns {import('dictionary-data-util').DictionaryFrequency<import('dictionary-data-util').TermFrequency>[]} +     */      static groupTermFrequencies(dictionaryEntry) { -        const {headwords, frequencies} = dictionaryEntry; +        const {headwords, frequencies: sourceFrequencies} = dictionaryEntry; +        /** @type {import('dictionary-data-util').TermFrequenciesMap1} */          const map1 = new Map(); -        for (const {headwordIndex, dictionary, hasReading, frequency, displayValue} of frequencies) { +        for (const {headwordIndex, dictionary, hasReading, frequency, displayValue} of sourceFrequencies) {              const {term, reading} = headwords[headwordIndex];              let map2 = map1.get(dictionary); @@ -68,12 +77,30 @@ export class DictionaryDataUtil {              frequencyData.values.set(this._createMapKey([frequency, displayValue]), {frequency, displayValue});          } -        return this._createFrequencyGroupsFromMap(map1); + +        const results = []; +        for (const [dictionary, map2] of map1.entries()) { +            const frequencies = []; +            for (const {term, reading, values} of map2.values()) { +                frequencies.push({ +                    term, +                    reading, +                    values: [...values.values()] +                }); +            } +            results.push({dictionary, frequencies}); +        } +        return results;      } -    static groupKanjiFrequencies(frequencies) { +    /** +     * @param {import('dictionary').KanjiFrequency[]} sourceFrequencies +     * @returns {import('dictionary-data-util').DictionaryFrequency<import('dictionary-data-util').KanjiFrequency>[]} +     */ +    static groupKanjiFrequencies(sourceFrequencies) { +        /** @type {import('dictionary-data-util').KanjiFrequenciesMap1} */          const map1 = new Map(); -        for (const {dictionary, character, frequency, displayValue} of frequencies) { +        for (const {dictionary, character, frequency, displayValue} of sourceFrequencies) {              let map2 = map1.get(dictionary);              if (typeof map2 === 'undefined') {                  map2 = new Map(); @@ -88,9 +115,25 @@ export class DictionaryDataUtil {              frequencyData.values.set(this._createMapKey([frequency, displayValue]), {frequency, displayValue});          } -        return this._createFrequencyGroupsFromMap(map1); + +        const results = []; +        for (const [dictionary, map2] of map1.entries()) { +            const frequencies = []; +            for (const {character, values} of map2.values()) { +                frequencies.push({ +                    character, +                    values: [...values.values()] +                }); +            } +            results.push({dictionary, frequencies}); +        } +        return results;      } +    /** +     * @param {import('dictionary').TermDictionaryEntry} dictionaryEntry +     * @returns {import('dictionary-data-util').DictionaryGroupedPronunciations[]} +     */      static getGroupedPronunciations(dictionaryEntry) {          const {headwords, pronunciations} = dictionaryEntry; @@ -101,6 +144,7 @@ export class DictionaryDataUtil {              allReadings.add(reading);          } +        /** @type {Map<string, import('dictionary-data-util').GroupedPronunciationInternal[]>} */          const groupedPronunciationsMap = new Map();          for (const {headwordIndex, dictionary, pitches} of pronunciations) {              const {term, reading} = headwords[headwordIndex]; @@ -118,9 +162,7 @@ export class DictionaryDataUtil {                          position,                          nasalPositions,                          devoicePositions, -                        tags, -                        exclusiveTerms: [], -                        exclusiveReadings: [] +                        tags                      };                      dictionaryGroupedPronunciationList.push(groupedPronunciation);                  } @@ -128,27 +170,39 @@ export class DictionaryDataUtil {              }          } +        /** @type {import('dictionary-data-util').DictionaryGroupedPronunciations[]} */ +        const results2 = [];          const multipleReadings = (allReadings.size > 1); -        for (const dictionaryGroupedPronunciationList of groupedPronunciationsMap.values()) { +        for (const [dictionary, dictionaryGroupedPronunciationList] of groupedPronunciationsMap.entries()) { +            /** @type {import('dictionary-data-util').GroupedPronunciation[]} */ +            const pronunciations2 = [];              for (const groupedPronunciation of dictionaryGroupedPronunciationList) { -                const {terms, reading, exclusiveTerms, exclusiveReadings} = groupedPronunciation; -                if (!this._areSetsEqual(terms, allTerms)) { -                    exclusiveTerms.push(...this._getSetIntersection(terms, allTerms)); -                } +                const {terms, reading, position, nasalPositions, devoicePositions, tags} = groupedPronunciation; +                const exclusiveTerms = !this._areSetsEqual(terms, allTerms) ? this._getSetIntersection(terms, allTerms) : []; +                const exclusiveReadings = [];                  if (multipleReadings) {                      exclusiveReadings.push(reading);                  } -                groupedPronunciation.terms = [...terms]; +                pronunciations2.push({ +                    terms: [...terms], +                    reading, +                    position, +                    nasalPositions, +                    devoicePositions, +                    tags, +                    exclusiveTerms, +                    exclusiveReadings +                });              } -        } - -        const results2 = []; -        for (const [dictionary, pronunciations2] of groupedPronunciationsMap.entries()) {              results2.push({dictionary, pronunciations: pronunciations2});          }          return results2;      } +    /** +     * @param {import('dictionary').Tag[]|import('anki-templates').Tag[]} termTags +     * @returns {import('dictionary-data-util').TermFrequencyType} +     */      static getTermFrequency(termTags) {          let totalScore = 0;          for (const {score} of termTags) { @@ -163,10 +217,19 @@ export class DictionaryDataUtil {          }      } +    /** +     * @param {import('dictionary').TermHeadword[]} headwords +     * @param {number[]} headwordIndices +     * @param {Set<string>} allTermsSet +     * @param {Set<string>} allReadingsSet +     * @returns {string[]} +     */      static getDisambiguations(headwords, headwordIndices, allTermsSet, allReadingsSet) {          if (allTermsSet.size <= 1 && allReadingsSet.size <= 1) { return []; } +        /** @type {Set<string>} */          const terms = new Set(); +        /** @type {Set<string>} */          const readings = new Set();          for (const headwordIndex of headwordIndices) {              const {term, reading} = headwords[headwordIndex]; @@ -174,6 +237,7 @@ export class DictionaryDataUtil {              readings.add(reading);          } +        /** @type {string[]} */          const disambiguations = [];          const addTerms = !this._areSetsEqual(terms, allTermsSet);          const addReadings = !this._areSetsEqual(readings, allReadingsSet); @@ -191,6 +255,10 @@ export class DictionaryDataUtil {          return disambiguations;      } +    /** +     * @param {string[]} wordClasses +     * @returns {boolean} +     */      static isNonNounVerbOrAdjective(wordClasses) {          let isVerbOrAdjective = false;          let isSuruVerb = false; @@ -218,19 +286,15 @@ export class DictionaryDataUtil {      // Private -    static _createFrequencyGroupsFromMap(map) { -        const results = []; -        for (const [dictionary, map2] of map.entries()) { -            const frequencies = []; -            for (const frequencyData of map2.values()) { -                frequencyData.values = [...frequencyData.values.values()]; -                frequencies.push(frequencyData); -            } -            results.push({dictionary, frequencies}); -        } -        return results; -    } - +    /** +     * @param {string} reading +     * @param {number} position +     * @param {number[]} nasalPositions +     * @param {number[]} devoicePositions +     * @param {import('dictionary').Tag[]} tags +     * @param {import('dictionary-data-util').GroupedPronunciationInternal[]} groupedPronunciationList +     * @returns {?import('dictionary-data-util').GroupedPronunciationInternal} +     */      static _findExistingGroupedPronunciation(reading, position, nasalPositions, devoicePositions, tags, groupedPronunciationList) {          for (const pitchInfo of groupedPronunciationList) {              if ( @@ -246,6 +310,12 @@ export class DictionaryDataUtil {          return null;      } +    /** +     * @template [T=unknown] +     * @param {T[]} array1 +     * @param {T[]} array2 +     * @returns {boolean} +     */      static _areArraysEqual(array1, array2) {          const ii = array1.length;          if (ii !== array2.length) { return false; } @@ -255,6 +325,11 @@ export class DictionaryDataUtil {          return true;      } +    /** +     * @param {import('dictionary').Tag[]} tagList1 +     * @param {import('dictionary').Tag[]} tagList2 +     * @returns {boolean} +     */      static _areTagListsEqual(tagList1, tagList2) {          const ii = tagList1.length;          if (tagList2.length !== ii) { return false; } @@ -262,7 +337,7 @@ export class DictionaryDataUtil {          for (let i = 0; i < ii; ++i) {              const tag1 = tagList1[i];              const tag2 = tagList2[i]; -            if (tag1.name !== tag2.name || tag1.dictionary !== tag2.dictionary) { +            if (tag1.name !== tag2.name || !this._areArraysEqual(tag1.dictionaries, tag2.dictionaries)) {                  return false;              }          } @@ -270,6 +345,12 @@ export class DictionaryDataUtil {          return true;      } +    /** +     * @template [T=unknown] +     * @param {Set<T>} set1 +     * @param {Set<T>} set2 +     * @returns {boolean} +     */      static _areSetsEqual(set1, set2) {          if (set1.size !== set2.size) {              return false; @@ -284,6 +365,12 @@ export class DictionaryDataUtil {          return true;      } +    /** +     * @template [T=unknown] +     * @param {Set<T>} set1 +     * @param {Set<T>} set2 +     * @returns {T[]} +     */      static _getSetIntersection(set1, set2) {          const result = [];          for (const value of set1) { @@ -294,6 +381,10 @@ export class DictionaryDataUtil {          return result;      } +    /** +     * @param {unknown[]} array +     * @returns {string} +     */      static _createMapKey(array) {          return JSON.stringify(array);      }  |