summaryrefslogtreecommitdiff
path: root/ext/js/language
diff options
context:
space:
mode:
authorStefanVukovic99 <stefanvukovic44@gmail.com>2024-06-17 19:13:16 +0200
committerGitHub <noreply@github.com>2024-06-17 17:13:16 +0000
commitb57e1f52e34ec6f87163c8697c29330c61c245ae (patch)
tree8a5b3253829513154d86a5590b86f3c8b7d4d63e /ext/js/language
parent1d2a91523604cce7dd608408da65bea5645fc7d4 (diff)
use only longest substring that deinflects to headword (#1075)
* show only deinflection for longest matched text * cleanup * cleanup
Diffstat (limited to 'ext/js/language')
-rw-r--r--ext/js/language/translator.js44
1 files changed, 34 insertions, 10 deletions
diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js
index f84328d9..f4f3449b 100644
--- a/ext/js/language/translator.js
+++ b/ext/js/language/translator.js
@@ -243,26 +243,50 @@ export class Translator {
for (const databaseEntry of databaseEntries) {
const {id} = databaseEntry;
if (ids.has(id)) {
- const existingEntry = dictionaryEntries.find((entry) => {
- return entry.definitions.some((definition) => definition.id === id);
- });
+ const existingEntryInfo = this._findExistingEntry(dictionaryEntries, id);
+ if (!existingEntryInfo) {
+ continue;
+ }
+ const {existingEntry, existingIndex} = existingEntryInfo;
- if (existingEntry && transformedText.length >= existingEntry.headwords[0].sources[0].transformedText.length) {
+ const existingTransformedLength = existingEntry.headwords[0].sources[0].transformedText.length;
+ if (transformedText.length < existingTransformedLength) {
+ continue;
+ }
+ if (transformedText.length > existingTransformedLength) {
+ dictionaryEntries.splice(existingIndex, 1, this._createTermDictionaryEntryFromDatabaseEntry(databaseEntry, originalText, transformedText, deinflectedText, inflectionRuleChainCandidates, true, enabledDictionaryMap, tagAggregator));
+ } else {
this._mergeInflectionRuleChains(existingEntry, inflectionRuleChainCandidates);
}
-
- continue;
+ } else {
+ const dictionaryEntry = this._createTermDictionaryEntryFromDatabaseEntry(databaseEntry, originalText, transformedText, deinflectedText, inflectionRuleChainCandidates, true, enabledDictionaryMap, tagAggregator);
+ dictionaryEntries.push(dictionaryEntry);
+ ids.add(id);
}
-
- const dictionaryEntry = this._createTermDictionaryEntryFromDatabaseEntry(databaseEntry, originalText, transformedText, deinflectedText, inflectionRuleChainCandidates, true, enabledDictionaryMap, tagAggregator);
- dictionaryEntries.push(dictionaryEntry);
- ids.add(id);
}
}
return {dictionaryEntries, originalTextLength};
}
/**
+ * @param {import('translation-internal').TermDictionaryEntry[]} dictionaryEntries
+ * @param {number} id
+ * @returns {{existingEntry: import('translation-internal').TermDictionaryEntry, existingIndex: number} | null}
+ */
+ _findExistingEntry(dictionaryEntries, id) {
+ let existingIndex = null;
+ let existingEntry = null;
+ for (const [index, entry] of dictionaryEntries.entries()) {
+ if (entry.definitions.some((definition) => definition.id === id)) {
+ existingIndex = index;
+ existingEntry = entry;
+ return {existingEntry, existingIndex};
+ }
+ }
+ return null;
+ }
+
+ /**
* @param {import('translation-internal').TermDictionaryEntry} existingEntry
* @param {import('translation-internal').InflectionRuleChainCandidate[]} inflectionRuleChainCandidates
*/