diff --git a/ext/css/display.css b/ext/css/display.css index 631c4811dd..19b613e049 100644 --- a/ext/css/display.css +++ b/ext/css/display.css @@ -1934,6 +1934,15 @@ button.footer-notification-close-button { :root[data-anki-enabled=false] .action-button[data-action=save-note] { display: none; } + +:root[data-average-frequency=false] .frequency-group-item:last-child { + display: none; +} + +:root[data-average-frequency=true] .frequency-group-item:not(:last-child){ + display: none; +} + :root[data-audio-enabled=false] .action-button[data-action=play-audio] { display: none; } diff --git a/ext/data/schemas/options-schema.json b/ext/data/schemas/options-schema.json index acbee8eeec..09931fb7be 100644 --- a/ext/data/schemas/options-schema.json +++ b/ext/data/schemas/options-schema.json @@ -102,6 +102,7 @@ "showGuide", "enableContextMenuScanSelected", "compactTags", + "averageFrequency", "glossaryLayoutMode", "mainDictionary", "popupTheme", @@ -236,6 +237,10 @@ "type": "boolean", "default": false }, + "averageFrequency": { + "type": "boolean", + "default": false + }, "glossaryLayoutMode": { "type": "string", "enum": ["default", "compact"], diff --git a/ext/js/dictionary/dictionary-data-util.js b/ext/js/dictionary/dictionary-data-util.js index 634fa24a90..9dbd608089 100644 --- a/ext/js/dictionary/dictionary-data-util.js +++ b/ext/js/dictionary/dictionary-data-util.js @@ -82,35 +82,39 @@ export function groupTermFrequencies(dictionaryEntry) { } const results = []; + + /** @type {import('dictionary').AverageFrequencyListTerm} */ const averages = {}; for (const [dictionary, map2] of map1.entries()) { const frequencies = []; const dictionaryAlias = aliasMap.get(dictionary) ?? dictionary; - for (const {term, reading, values} of map2.values()) { + for (let {term, reading, values} of map2.values()) { frequencies.push({ term, reading, values: [...values.values()], }); const valuesArray = [...values.values()]; - let { currentAvg, count} = averages[term]?.[reading] ?? {currentAvg:1, count:0}; + // console.log(valuesArray); + if (reading === null) { reading = ''; } + let {currentAvg, count} = averages[term]?.[reading] ?? {currentAvg: 1, count: 0}; if (valuesArray[0].frequency === null) { continue; } - currentAvg = (count/(currentAvg))+(1/(valuesArray[0].frequency)) - currentAvg = (count +1)/currentAvg - count += 1 + currentAvg = (count / (currentAvg)) + (1 / (valuesArray[0].frequency)); + currentAvg = (count + 1) / currentAvg; + count += 1; averages[term] = { ...averages[term], [reading]: { - currentAvg, count - } - } + currentAvg, count, + }, + }; } results.push({dictionary, frequencies, dictionaryAlias}); } - const avgFrequencies = Object.keys(averages).flatMap(termName => Object.keys(averages[termName]).map(readingName => ({term: termName, reading: readingName, values: [{frequency: Math.round(averages[termName][readingName].currentAvg), displayValue: Math.round(averages[termName][readingName].currentAvg).toString()}]}))) - results.push({dictionary:'Average', frequencies: avgFrequencies, dictionaryAlias:'Average'}) + const avgFrequencies = Object.keys(averages).flatMap((termName) => Object.keys(averages[termName]).map((readingName) => ({term: termName, reading: readingName, values: [{frequency: Math.round(averages[termName][readingName].currentAvg), displayValue: Math.round(averages[termName][readingName].currentAvg).toString()}]}))); + results.push({dictionary: 'Average', frequencies: avgFrequencies, dictionaryAlias: 'Average'}); return results; } diff --git a/ext/js/display/display.js b/ext/js/display/display.js index 2f90189d90..09bfc7ba4c 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -1175,6 +1175,7 @@ export class Display extends EventDispatcher { data.resultOutputMode = `${options.general.resultOutputMode}`; data.glossaryLayoutMode = `${options.general.glossaryLayoutMode}`; data.compactTags = `${options.general.compactTags}`; + data.averageFrequency = `${options.general.averageFrequency}`; data.frequencyDisplayMode = `${options.general.frequencyDisplayMode}`; data.termDisplayMode = `${options.general.termDisplayMode}`; data.enableSearchTags = `${options.scanning.enableSearchTags}`; diff --git a/ext/settings.html b/ext/settings.html index cffffc8f38..0c79203cc7 100644 --- a/ext/settings.html +++ b/ext/settings.html @@ -1122,6 +1122,15 @@

Yomitan Settings

+
+
+
Average frequencies
+
Compress frequency tags into one "Average" freqeuncy tag.
+
+
+ +
+
diff --git a/types/ext/dictionary.d.ts b/types/ext/dictionary.d.ts index ac9b7940ca..d3da0638b8 100644 --- a/types/ext/dictionary.d.ts +++ b/types/ext/dictionary.d.ts @@ -544,3 +544,27 @@ export type TermSource = { */ isPrimary: boolean; }; + +/** + * Dictionaries containing the harmonic mean frequency of specific term-reading pairs. + */ +export type AverageFrequencyListTerm = { + /** + * Contains the average frequency of a term, with all its readings. + */ + [term: string]: { + /** + * Contains the average frequency of a reading. + */ + [reading: string]: { + /** + * The current average frequency. + */ + currentAvg: number; + /** + * The number of dictionary frequencies used to compute the average. + */ + count: number; + }; + }; +}; diff --git a/types/ext/settings.d.ts b/types/ext/settings.d.ts index ceffe1e00f..03598f4ec5 100644 --- a/types/ext/settings.d.ts +++ b/types/ext/settings.d.ts @@ -127,6 +127,7 @@ export type GeneralOptions = { showGuide: boolean; enableContextMenuScanSelected: boolean; compactTags: boolean; + averageFrequency: boolean; glossaryLayoutMode: GlossaryLayoutMode; mainDictionary: string; popupTheme: PopupTheme;