diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-03-25 20:54:39 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-25 20:54:39 -0400 |
commit | 6af0ee26b943d87e25b5d7ff9b8cade6999b3660 (patch) | |
tree | f2f2438dc1ae34d802bd3a6c5a991d750eadb59a /ext | |
parent | 4be5c8fd9f7860e701d0b7d3c8c0ee934bc60a4f (diff) |
Fix tag disambiguation (#1556)
* Update display generator to use new data format for tag disambiguation
* Add separator for multiple disambiguations
Diffstat (limited to 'ext')
-rw-r--r-- | ext/css/display.css | 3 | ||||
-rw-r--r-- | ext/js/display/display-generator.js | 53 | ||||
-rw-r--r-- | ext/js/display/display.js | 5 |
3 files changed, 35 insertions, 26 deletions
diff --git a/ext/css/display.css b/ext/css/display.css index 626f78bd..887a04a6 100644 --- a/ext/css/display.css +++ b/ext/css/display.css @@ -1823,6 +1823,9 @@ button.footer-notification-close-button { height: calc(16em / var(--font-size-no-units)); background-color: var(--button-content-color); } +.tag-details-disambiguation-list>.tag-details-disambiguation:not(:last-child)::after { + content: var(--disambiguation-separator); +} /* Overlays */ 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(); } |