diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/bg/js/translator.js | 135 | 
1 files changed, 62 insertions, 73 deletions
| diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index cdcdda28..6134c725 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -151,113 +151,102 @@ class Translator {          return this.processKanji(definitions);      } -    processTerm(groups, source, tags, rules=[], root='') { -        for (let entry of this.dictionary.findTerm(root)) { +    processTerm(groups, dfSource, dfTags, dfRules=[], dfRoot='') { +        for (let entry of this.dictionary.findTerm(dfRoot)) {              if (entry.id in groups) {                  continue;              } -            let matched = tags.length == 0; -            for (let tag of tags) { -                if (entry.tags.indexOf(tag) !== -1) { +            let matched = dfTags.length === 0; +            for (let t of dfTags) { +                if (entry.tags.indexOf(t) !== -1) {                      matched = true;                      break;                  }              } +            if (!matched) { +                continue; +            } +              let popular = false; -            let tagItems = []; -            for (let tag of entry.tags) { -                const tagItem = { -                    class: 'default', -                    order: Number.MAX_SAFE_INTEGER, -                    desc:  entry.entities[tag] || '', -                    name:  tag -                }; - -                const tagMeta = this.tagMeta[tag]; -                if (tagMeta) { -                    for (const tagProp in tagMeta) { -                        tagItem[tagProp] = tagMeta[tagProp] || tagItem[tagProp]; -                    } -                } -                tagItems.push(tagItem); +            let tags = []; +            for (let t of entry.tags) { +                const tag = {class: 'default', order: Number.MAX_SAFE_INTEGER, desc: entry.entities[t] || '', name: t}; +                this.applyTagMeta(tag); +                tags.push(tag);                  //                  // TODO: Handle tagging as popular through data.                  // -                if (tag === 'P') { +                if (t === 'P') {                      popular = true;                  }              } -            tagItems = tagItems.sort((v1, v2) => { -                const order1 = v1.order; -                const order2 = v2.order; -                if (order1 < order2) { -                    return -1; -                } else if (order1 > order2) { -                    return 1; -                } - -                const name1 = v1.name; -                const name2 = v2.name; -                if (name1 < name2) { -                    return -1; -                } else if (name1 > name2) { -                    return 1; -                } - -                return 0; -            }); - -            if (matched) { -                groups[entry.id] = { -                    expression: entry.expression, -                    reading:    entry.reading, -                    glossary:   entry.glossary, -                    tags:       tagItems, -                    source:     source, -                    rules:      rules, -                    popular:    popular -                }; -            } +            groups[entry.id] = { +                expression: entry.expression, +                reading:    entry.reading, +                glossary:   entry.glossary, +                tags:       Translator.sortTags(tags), +                source:     dfSource, +                rules:      dfRules, +                popular:    popular +            };          }      }      processKanji(entries) { -        const results = []; -        for (let entry of entries) { -            const tagItems = []; -            for (let tag of entry.tags) { -                const tagItem = { -                    class: 'default', -                    order: Number.MAX_SAFE_INTEGER, -                    name:  tag -                }; - -                const tagMeta = this.tagMeta[tag]; -                if (tagMeta) { -                    for (const tagProp in tagMeta) { -                        tagItem[tagProp] = tagMeta[tagProp] || tagItem[tagProp]; -                    } -                } +        const processed = []; -                tagItems.push(tagItem); +        for (let entry of entries) { +            const tags = []; +            for (let t of entry.tags) { +                const tag = {class: 'default', order: Number.MAX_SAFE_INTEGER, desc: '', name: t}; +                this.applyTagMeta(tag); +                tags.push(tag);              } -            results.push({ +            processed.push({                  character: entry.character,                  kunyomi:   entry.kunyomi,                  onyomi:    entry.onyomi, -                tags:      tagItems, +                tags:      Translator.sortTags(tags),                  glossary:  entry.glossary              });          } -        return results; +        return processed; +    } + +    applyTagMeta(tag) { +        for (const prop in this.tagMeta[tag.name] || {}) { +            tag[prop] = this.tagMeta[tag.name][prop] || tag[prop]; +        } +    } + +    static sortTags(tags) { +        return tags.sort((v1, v2) => { +            const order1 = v1.order; +            const order2 = v2.order; +            if (order1 < order2) { +                return -1; +            } else if (order1 > order2) { +                return 1; +            } + +            const name1 = v1.name; +            const name2 = v2.name; +            if (name1 < name2) { +                return -1; +            } else if (name1 > name2) { +                return 1; +            } + +            return 0; +        });      }      static isKanji(c) { |