From 6af0ee26b943d87e25b5d7ff9b8cade6999b3660 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Thu, 25 Mar 2021 20:54:39 -0400 Subject: Fix tag disambiguation (#1556) * Update display generator to use new data format for tag disambiguation * Add separator for multiple disambiguations --- ext/js/display/display-generator.js | 53 ++++++++++++++++++++----------------- ext/js/display/display.js | 5 +++- 2 files changed, 32 insertions(+), 26 deletions(-) (limited to 'ext/js/display') diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js index be5d5e66..19e88b8a 100644 --- a/ext/js/display/display-generator.js +++ b/ext/js/display/display-generator.js @@ -163,7 +163,7 @@ class DisplayGenerator { return this._templates.instantiate('footer-notification'); } - createTagFooterNotificationDetails(tagNode) { + createTagFooterNotificationDetails(tagNode, dictionaryEntry) { const node = this._templates.instantiateFragment('footer-notification-tag-details'); let details = tagNode.dataset.details; @@ -173,32 +173,35 @@ class DisplayGenerator { } this._setTextContent(node.querySelector('.tag-details'), details); - let disambiguation = null; - try { - let a = tagNode.dataset.disambiguation; - if (typeof a !== 'undefined') { - a = JSON.parse(a); - if (Array.isArray(a)) { disambiguation = a; } + if (dictionaryEntry !== null) { + const {headwords} = dictionaryEntry; + const disambiguationHeadwords = []; + const {headwords: headwordIndices} = tagNode.dataset; + if (typeof headwordIndices === 'string' && headwordIndices.length > 0) { + for (let headwordIndex of headwordIndices.split(' ')) { + headwordIndex = Number.parseInt(headwordIndex, 10); + if (!Number.isNaN(headwordIndex) && headwordIndex >= 0 && headwordIndex < headwords.length) { + disambiguationHeadwords.push(headwords[headwordIndex]); + } + } } - } catch (e) { - // NOP - } - if (disambiguation !== null) { - const disambiguationContainer = node.querySelector('.tag-details-disambiguation-list'); - const copyAttributes = ['totalExpressionCount', 'matchedExpressionCount', 'unmatchedExpressionCount']; - for (const attribute of copyAttributes) { - const value = tagNode.dataset[attribute]; - if (typeof value === 'undefined') { continue; } - disambiguationContainer.dataset[attribute] = value; - } - for (const {expression, reading} of disambiguation) { - const disambiguationItem = document.createElement('span'); - disambiguationItem.className = 'tag-details-disambiguation'; - this._appendFurigana(disambiguationItem, expression, reading, (container, text) => { - container.appendChild(document.createTextNode(text)); - }); - disambiguationContainer.appendChild(disambiguationItem); + if (disambiguationHeadwords.length > 0 && disambiguationHeadwords.length < headwords.length) { + const disambiguationContainer = node.querySelector('.tag-details-disambiguation-list'); + const copyAttributes = ['totalExpressionCount', 'matchedExpressionCount', 'unmatchedExpressionCount']; + for (const attribute of copyAttributes) { + const value = tagNode.dataset[attribute]; + if (typeof value === 'undefined') { continue; } + disambiguationContainer.dataset[attribute] = value; + } + for (const {term, reading} of disambiguationHeadwords) { + const disambiguationItem = document.createElement('span'); + disambiguationItem.className = 'tag-details-disambiguation'; + this._appendFurigana(disambiguationItem, term, reading, (container, text) => { + container.appendChild(document.createTextNode(text)); + }); + disambiguationContainer.appendChild(disambiguationItem); + } } } diff --git a/ext/js/display/display.js b/ext/js/display/display.js index 65cc579f..1142f36f 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -806,7 +806,10 @@ class Display extends EventDispatcher { this._tagNotification = new DisplayNotification(this._footerNotificationContainer, node); } - const content = this._displayGenerator.createTagFooterNotificationDetails(tagNode); + const index = this._getClosestDefinitionIndex(tagNode); + const dictionaryEntry = (index >= 0 && index < this._definitions.length ? this._definitions[index] : null); + + const content = this._displayGenerator.createTagFooterNotificationDetails(tagNode, dictionaryEntry); this._tagNotification.setContent(content); this._tagNotification.open(); } -- cgit v1.2.3