diff options
| -rw-r--r-- | ext/bg/js/dictionary.js | 44 | ||||
| -rw-r--r-- | ext/bg/js/translator.js | 51 | 
2 files changed, 48 insertions, 47 deletions
| diff --git a/ext/bg/js/dictionary.js b/ext/bg/js/dictionary.js index 41c90b1c..7d6d176c 100644 --- a/ext/bg/js/dictionary.js +++ b/ext/bg/js/dictionary.js @@ -170,9 +170,31 @@ function dictTermsMergeBySequence(definitions, mainDictionary) {      return definitionsBySequence;  } -function dictTermsMergeByGloss(result, definitions) { -    const definitionsByGloss = {}; -    for (const definition of definitions) { +function dictTermsMergeByGloss(result, definitions, appendTo, mergedIndices) { +    const definitionsByGloss = appendTo || {}; +    for (const [index, definition] of definitions.entries()) { +        if (appendTo) { +            let match = false; +            for (const expression of result.expressions.keys()) { +                if (definition.expression === expression) { +                    for (const reading of result.expressions.get(expression).keys()) { +                        if (definition.reading === reading) { +                            match = true; +                            break; +                        } +                    } +                } +                if (match) { +                    break; +                } +            } + +            if (!match) { +                continue; +            } else if (mergedIndices) { +                mergedIndices.add(index); +            } +        }          const gloss = JSON.stringify(definition.glossary);          if (!definitionsByGloss[gloss]) { @@ -180,6 +202,7 @@ function dictTermsMergeByGloss(result, definitions) {                  expression: new Set(),                  reading: new Set(),                  tags: new Set(), +                glossary: definition.glossary,                  source: result.source,                  reasons: [],                  score: definition.score, @@ -212,6 +235,21 @@ function dictTermsMergeByGloss(result, definitions) {          }      } +    for (const gloss in definitionsByGloss) { +        const definition = definitionsByGloss[gloss]; +        definition.only = []; +        if (!utilSetEqual(definition.expression, result.expression)) { +            for (const expression of utilSetIntersection(definition.expression, result.expression)) { +                definition.only.push(expression); +            } +        } +        if (!utilSetEqual(definition.reading, result.reading)) { +            for (const reading of utilSetIntersection(definition.reading, result.reading)) { +                definition.only.push(reading); +            } +        } +    } +      return definitionsByGloss;  } diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index f50c5725..f959ea35 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -55,8 +55,8 @@ class Translator {          const definitionsBySequence = dictTermsMergeBySequence(definitions, options.dictionary.main); -        // const definitionsMerged = dictTermsGroup(definitionsBySequence['-1'], dictionaries);          const definitionsMerged = []; +        const mergedByTermIndices = new Set();          for (const sequence in definitionsBySequence) {              if (!(sequence > 0)) {                  continue; @@ -66,32 +66,19 @@ class Translator {              const rawDefinitionsBySequence = await this.database.findTermsBySequence(Number(sequence), options.dictionary.main);              const definitionsByGloss = dictTermsMergeByGloss(result, rawDefinitionsBySequence); +            dictTermsMergeByGloss(result, definitionsBySequence['-1'], definitionsByGloss, mergedByTermIndices); -            // postprocess glossaries              for (const gloss in definitionsByGloss) {                  const definition = definitionsByGloss[gloss]; -                definition.glossary = JSON.parse(gloss);                  const tags = await this.expandTags(definition.tags, definition.dictionary);                  tags.push(dictTagBuildSource(definition.dictionary));                  definition.tags = dictTagsSort(tags); -                definition.only = []; -                if (!utilSetEqual(definition.expression, result.expression)) { -                    for (const expression of utilSetIntersection(definition.expression, result.expression)) { -                        definition.only.push(expression); -                    } -                } -                if (!utilSetEqual(definition.reading, result.reading)) { -                    for (const reading of utilSetIntersection(definition.reading, result.reading)) { -                        definition.only.push(reading); -                    } -                } -                  result.definitions.push(definition);              } -            result.definitions.sort(definition => -definition.id); +            dictTermsSort(result.definitions, dictionaries);              // turn the Map()/Set() mess to [{expression: E1, reading: R1}, {...}] and tag popular/normal/rare instead of actual tags              const expressions = []; @@ -120,34 +107,7 @@ class Translator {              definitionsMerged.push(result);          } -        const postMergedIndices = new Set(); -        const mergeeIndicesByGloss = {}; -        for (const [i, definition] of definitionsBySequence['-1'].entries()) { -            for (const [j, mergedDefinition] of definitionsMerged.entries()) { -                if (mergedDefinition.expression.has(definition.expression)) { -                    if (mergedDefinition.reading.has(definition.reading) || (definition.reading === '' && mergedDefinition.reading.size === 0)) { -                        if (!mergeeIndicesByGloss[definition.glossary]) { -                            mergeeIndicesByGloss[definition.glossary] = new Set(); -                        } -                        if (mergeeIndicesByGloss[definition.glossary].has(j)) { -                            continue; -                        } -                        mergedDefinition.definitions.push(definition); -                        mergeeIndicesByGloss[definition.glossary].add(j); -                        postMergedIndices.add(i); -                    } -                } -            } -        } - -        const strayDefinitions = []; -        for (const [i, definition] of definitionsBySequence['-1'].entries()) { -            if (postMergedIndices.has(i)) { -                continue; -            } -            strayDefinitions.push(definition); -        } - +        const strayDefinitions = definitionsBySequence['-1'].filter((definition, index) => !mergedByTermIndices.has(index));          for (const groupedDefinition of dictTermsGroup(strayDefinitions, dictionaries)) {              definitionsMerged.push(groupedDefinition);          } @@ -294,6 +254,9 @@ class Translator {      async expandTags(names, title) {          const tags = [];          for (const name of names) { +            if (typeof name !== 'string') { +                continue; +            }              const base = name.split(':')[0];              const meta = await this.database.findTagForTitle(base, title); |