diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-03-07 17:55:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-07 17:55:51 -0500 |
commit | 19f6bf5a3a669cda311e5a3f162131d8a9823aef (patch) | |
tree | b9e57be07764a782fa914a1faa877b2670d0e850 /ext/js | |
parent | 7793e14e57639426cb9ca64c82004151f9eaba05 (diff) |
Refactor furigana segment data (#1502)
* Remove redundant language assignment
* Segment furigana from DisplayGenerator
* Remove furiganaSegments from translator data
* Add backwards compatibility for furiganaSegments
* Update tests
Diffstat (limited to 'ext/js')
-rw-r--r-- | ext/js/data/anki-note-data.js | 48 | ||||
-rw-r--r-- | ext/js/display/display-generator.js | 13 | ||||
-rw-r--r-- | ext/js/language/translator.js | 21 | ||||
-rw-r--r-- | ext/js/templates/template-renderer-frame-main.js | 2 |
4 files changed, 60 insertions, 24 deletions
diff --git a/ext/js/data/anki-note-data.js b/ext/js/data/anki-note-data.js index a7d0f9f6..529bad18 100644 --- a/ext/js/data/anki-note-data.js +++ b/ext/js/data/anki-note-data.js @@ -24,7 +24,7 @@ * The public properties and data should be backwards compatible. */ class AnkiNoteData { - constructor({ + constructor(japaneseUtil, marker, { definition, resultOutputMode, mode, @@ -32,7 +32,8 @@ class AnkiNoteData { compactTags, context, injectedMedia=null - }, marker) { + }) { + this._japaneseUtil = japaneseUtil; this._definition = definition; this._resultOutputMode = resultOutputMode; this._mode = mode; @@ -47,6 +48,7 @@ class AnkiNoteData { this._uniqueReadings = null; this._publicContext = null; this._cloze = null; + this._furiganaSegmentsCache = null; this._prepareDefinition(definition, injectedMedia, context); } @@ -236,5 +238,47 @@ class AnkiNoteData { enumerable: true, get: this._getClozeCached.bind(this) }); + + for (const definition2 of this._getAllDefinitions(definition)) { + if (definition2.type === 'term') { + this._defineFuriganaSegments(definition2); + } + for (const expression of definition2.expressions) { + this._defineFuriganaSegments(expression); + } + } + } + + _defineFuriganaSegments(object) { + Object.defineProperty(object, 'furiganaSegments', { + configurable: true, + enumerable: true, + get: this._getFuriganaSegments.bind(this, object) + }); + } + + _getFuriganaSegments(object) { + if (this._furiganaSegmentsCache !== null) { + const cachedResult = this._furiganaSegmentsCache.get(object); + if (typeof cachedResult !== 'undefined') { return cachedResult; } + } else { + this._furiganaSegmentsCache = new Map(); + } + + const {expression, reading} = object; + const result = this._japaneseUtil.distributeFurigana(expression, reading); + this._furiganaSegmentsCache.set(object, result); + return result; + } + + _getAllDefinitions(definition) { + const definitions = [definition]; + for (let i = 0; i < definitions.length; ++i) { + const childDefinitions = definitions[i].definitions; + if (Array.isArray(childDefinitions)) { + definitions.push(...childDefinitions); + } + } + return definitions; } } diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js index d8ae566e..c0945781 100644 --- a/ext/js/display/display-generator.js +++ b/ext/js/display/display-generator.js @@ -190,11 +190,9 @@ class DisplayGenerator { disambiguationContainer.dataset[attribute] = value; } for (const {expression, reading} of disambiguation) { - const segments = this._japaneseUtil.distributeFurigana(expression, reading); const disambiguationItem = document.createElement('span'); disambiguationItem.className = 'tag-details-disambiguation'; - disambiguationItem.lang = 'ja'; - this._appendFurigana(disambiguationItem, segments, (container, text) => { + this._appendFurigana(disambiguationItem, expression, reading, (container, text) => { container.appendChild(document.createTextNode(text)); }); disambiguationContainer.appendChild(disambiguationItem); @@ -232,7 +230,7 @@ class DisplayGenerator { // Private _createTermExpression(details) { - const {termFrequency, furiganaSegments, expression, reading, termTags, pitches} = details; + const {termFrequency, expression, reading, termTags, pitches} = details; const searchQueries = []; if (expression) { searchQueries.push(expression); } @@ -253,7 +251,7 @@ class DisplayGenerator { this._setTextContent(node.querySelector('.expression-reading'), reading); - this._appendFurigana(expressionContainer, furiganaSegments, this._appendKanjiLinks.bind(this)); + this._appendFurigana(expressionContainer, expression, reading, this._appendKanjiLinks.bind(this)); this._appendMultiple(tagContainer, this._createTag.bind(this), termTags); this._appendMultiple(tagContainer, this._createSearchTag.bind(this), searchQueries); @@ -651,7 +649,6 @@ class DisplayGenerator { } _appendKanjiLinks(container, text) { - container.lang = 'ja'; const jp = this._japaneseUtil; let part = ''; for (const c of text) { @@ -692,7 +689,9 @@ class DisplayGenerator { return count; } - _appendFurigana(container, segments, addText) { + _appendFurigana(container, expression, reading, addText) { + container.lang = 'ja'; + const segments = this._japaneseUtil.distributeFurigana(expression, reading); for (const {text, furigana} of segments) { if (furigana) { const ruby = document.createElement('ruby'); diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js index 18668306..5aa8ee9c 100644 --- a/ext/js/language/translator.js +++ b/ext/js/language/translator.js @@ -1080,8 +1080,7 @@ class Translator { this._sortTags(definitionTagsExpanded); this._sortTags(termTagsExpanded); - const furiganaSegments = this._japaneseUtil.distributeFurigana(expression, reading); - const termDetailsList = [this._createTermDetails(sourceTerm, expression, reading, furiganaSegments, termTagsExpanded)]; + const termDetailsList = [this._createTermDetails(sourceTerm, expression, reading, termTagsExpanded)]; const sourceTermExactMatchCount = (sourceTerm === expression ? 1 : 0); return { @@ -1100,7 +1099,6 @@ class Translator { expression, reading, expressions: termDetailsList, - furiganaSegments, glossary, definitionTags: definitionTagsExpanded, termTags: termTagsExpanded, @@ -1118,12 +1116,12 @@ class Translator { * @returns A single 'termGrouped' definition. */ _createGroupedTermDefinition(definitions) { - const {reasons, source, rawSource, sourceTerm, expressions: [{expression, reading, furiganaSegments}]} = definitions[0]; + const {reasons, source, rawSource, sourceTerm, expressions: [{expression, reading}]} = definitions[0]; const score = this._getMaxDefinitionScore(definitions); const dictionaryOrder = this._getBestDictionaryOrder(definitions); const dictionaryNames = this._getUniqueDictionaryNames(definitions); const termTags = this._getUniqueTermTags(definitions); - const termDetailsList = [this._createTermDetails(sourceTerm, expression, reading, furiganaSegments, termTags)]; + const termDetailsList = [this._createTermDetails(sourceTerm, expression, reading, termTags)]; const sourceTermExactMatchCount = (sourceTerm === expression ? 1 : 0); return { type: 'termGrouped', @@ -1141,7 +1139,6 @@ class Translator { expression, reading, expressions: termDetailsList, - furiganaSegments, // Contains duplicate data // glossary // definitionTags termTags, @@ -1173,7 +1170,6 @@ class Translator { expression: expressions, reading: readings, expressions: termDetailsList, - // furiganaSegments // glossary // definitionTags // termTags @@ -1221,7 +1217,6 @@ class Translator { expression: [...expressions], reading: [...readings], expressions: termDetailsList, - // furiganaSegments glossary: [...glossary], definitionTags, // termTags @@ -1240,7 +1235,7 @@ class Translator { */ _createTermDetailsList(definitions) { const termInfoMap = new Map(); - for (const {expression, reading, sourceTerm, furiganaSegments, termTags} of definitions) { + for (const {expression, reading, sourceTerm, termTags} of definitions) { let readingMap = termInfoMap.get(expression); if (typeof readingMap === 'undefined') { readingMap = new Map(); @@ -1251,7 +1246,6 @@ class Translator { if (typeof termInfo === 'undefined') { termInfo = { sourceTerm, - furiganaSegments, termTagsMap: new Map() }; readingMap.set(reading, termInfo); @@ -1267,22 +1261,21 @@ class Translator { const termDetailsList = []; for (const [expression, readingMap] of termInfoMap.entries()) { - for (const [reading, {termTagsMap, sourceTerm, furiganaSegments}] of readingMap.entries()) { + for (const [reading, {termTagsMap, sourceTerm}] of readingMap.entries()) { const termTags = [...termTagsMap.values()]; this._sortTags(termTags); - termDetailsList.push(this._createTermDetails(sourceTerm, expression, reading, furiganaSegments, termTags)); + termDetailsList.push(this._createTermDetails(sourceTerm, expression, reading, termTags)); } } return termDetailsList; } - _createTermDetails(sourceTerm, expression, reading, furiganaSegments, termTags) { + _createTermDetails(sourceTerm, expression, reading, termTags) { const termFrequency = this._scoreToTermFrequency(this._getTermTagsScoreSum(termTags)); return { sourceTerm, expression, reading, - furiganaSegments, // Contains duplicate data termTags, termFrequency, frequencies: [], diff --git a/ext/js/templates/template-renderer-frame-main.js b/ext/js/templates/template-renderer-frame-main.js index a3892002..bfa18c82 100644 --- a/ext/js/templates/template-renderer-frame-main.js +++ b/ext/js/templates/template-renderer-frame-main.js @@ -26,7 +26,7 @@ const japaneseUtil = new JapaneseUtil(null); const templateRenderer = new TemplateRenderer(japaneseUtil); templateRenderer.registerDataType('ankiNote', { - modifier: ({data, marker}) => new AnkiNoteData(data, marker).createPublic() + modifier: ({data, marker}) => new AnkiNoteData(japaneseUtil, marker, data).createPublic() }); const templateRendererFrameApi = new TemplateRendererFrameApi(templateRenderer); templateRendererFrameApi.prepare(); |