diff options
Diffstat (limited to 'ext/bg')
-rw-r--r-- | ext/bg/js/util.js | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index 52a52cf8..3fa01a10 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -91,6 +91,71 @@ function undupeTermDefs(definitions) { return definitionsUnique; } +function groupTermDefs(definitions) { + const groups = {}; + let groupCount = 0; + + for (const definition of definitions) { + const key = [definition.source, definition.expression].concat(definition.reasons); + if (definition.reading) { + key.push(definition.reading); + } + + const group = groups[key]; + if (group) { + group.push(definition); + } else { + groups[key] = [definition]; + ++groupCount; + } + } + + const results = []; + for (const key in groups) { + const groupDefs = sortTermDefs(groups[key]); + + const tagCounts = {}; + for (const tag of groupDefs.map(def => def.tags)) { + const count = tagsGlobal[tag.name] || 0; + tagCounts[tag.name] = count + 1; + } + + const tagsGlobal = []; + const tagsGlobalAdded = {}; + let maxScore = Number.MIN_SAFE_INTEGER; + + for (const definition of groupDefs) { + const tagsLocal = []; + for (const tag of definition.tags) { + if (tagCounts[tag.name] === groupCount) { + if (!tagsGlobalAdded[tag.name]) { + tagsGlobalAdded[tag.name] = true; + tagsGlobal.push(tag); + } + } else { + tagsLocal.push(tag); + } + } + + definition.tags = tagsLocal; + maxScore = Math.max(maxScore, definition.score); + } + + const firstDef = groupDefs[0]; + results.push({ + definitions: groupDefs, + expression: firstDef.expression, + reading: firstDef.reading, + reasons: firstDef.reasons, + score: maxScore, + source: firstDef.source, + tags: sortTags(tagsGlobal), + }); + } + + return sortTermDefs(results); +} + function buildDictTag(name) { return sanitizeTag({name, category: 'dictionary', order: 100}); } |