summaryrefslogtreecommitdiff
path: root/ext/js/language/sandbox/dictionary-data-util.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/js/language/sandbox/dictionary-data-util.js')
-rw-r--r--ext/js/language/sandbox/dictionary-data-util.js161
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);
}