diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-07-15 22:39:33 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-15 22:39:33 -0400 |
commit | 41fc76d6fd6af9a880ac8b75e7b03afd1395780a (patch) | |
tree | 902d1d44e83123fdc2fc4eefda9923c9ac500aac /ext/js/language | |
parent | 25d74140ce9843b4bcb86b1b2bbf644602cdb3d0 (diff) |
Devoice and nasal pronunciation info (#1832)
* Update schema to support information about nasal and devoiced mora
* Expose nasalPositions and devoicePositions in dictionary entry data
* Expose nasalPositions, devoicePositions in grouped pitch info
* Update display generator
* Update test dictionary data
* Update test data
Diffstat (limited to 'ext/js/language')
-rw-r--r-- | ext/js/language/dictionary-data-util.js | 19 | ||||
-rw-r--r-- | ext/js/language/translator.js | 10 |
2 files changed, 24 insertions, 5 deletions
diff --git a/ext/js/language/dictionary-data-util.js b/ext/js/language/dictionary-data-util.js index 81d1c290..951e10ff 100644 --- a/ext/js/language/dictionary-data-util.js +++ b/ext/js/language/dictionary-data-util.js @@ -108,13 +108,15 @@ class DictionaryDataUtil { dictionaryPitchAccentInfoList = []; pitchAccentInfoMap.set(dictionary, dictionaryPitchAccentInfoList); } - for (const {position, tags} of pitches) { - let pitchAccentInfo = this._findExistingPitchAccentInfo(reading, position, tags, dictionaryPitchAccentInfoList); + for (const {position, nasalPositions, devoicePositions, tags} of pitches) { + let pitchAccentInfo = this._findExistingPitchAccentInfo(reading, position, nasalPositions, devoicePositions, tags, dictionaryPitchAccentInfoList); if (pitchAccentInfo === null) { pitchAccentInfo = { terms: new Set(), reading, position, + nasalPositions, + devoicePositions, tags, exclusiveTerms: [], exclusiveReadings: [] @@ -228,11 +230,13 @@ class DictionaryDataUtil { return results; } - static _findExistingPitchAccentInfo(reading, position, tags, pitchAccentInfoList) { + static _findExistingPitchAccentInfo(reading, position, nasalPositions, devoicePositions, tags, pitchAccentInfoList) { for (const pitchInfo of pitchAccentInfoList) { if ( pitchInfo.reading === reading && pitchInfo.position === position && + this._areArraysEqual(pitchInfo.nasalPositions, nasalPositions) && + this._areArraysEqual(pitchInfo.devoicePositions, devoicePositions) && this._areTagListsEqual(pitchInfo.tags, tags) ) { return pitchInfo; @@ -241,6 +245,15 @@ class DictionaryDataUtil { return null; } + static _areArraysEqual(array1, array2) { + const ii = array1.length; + if (ii !== array2.length) { return false; } + for (let i = 0; i < ii; ++i) { + if (array1[i] !== array2[i]) { return false; } + } + return true; + } + static _areTagListsEqual(tagList1, tagList2) { const ii = tagList1.length; if (tagList2.length !== ii) { return false; } diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js index 8519b728..c35d2203 100644 --- a/ext/js/language/translator.js +++ b/ext/js/language/translator.js @@ -828,12 +828,14 @@ class Translator { { if (data.reading !== reading) { continue; } const pitches = []; - for (const {position, tags} of data.pitches) { + for (const {position, tags, nasal, devoice} of data.pitches) { const tags2 = []; if (Array.isArray(tags) && tags.length > 0) { tags2.push(this._createTagGroup(dictionary, tags)); } - pitches.push({position, tags: tags2}); + const nasalPositions = this._toNumberArray(nasal); + const devoicePositions = this._toNumberArray(devoice); + pitches.push({position, nasalPositions, devoicePositions, tags: tags2}); } for (const {pronunciations, headwordIndex} of targets) { pronunciations.push(this._createTermPronunciation( @@ -968,6 +970,10 @@ class Translator { return JSON.stringify(array); } + _toNumberArray(value) { + return Array.isArray(value) ? value : (typeof value === 'number' ? [value] : []); + } + // Kanji data _createKanjiStat(name, value, databaseInfo, dictionary) { |