diff --git a/form.js b/form.js index 9832e5d..e50faf7 100644 --- a/form.js +++ b/form.js @@ -89,6 +89,7 @@ const CONSONANTS = [ { i: 'nh!', o: 'n%9', name: 'Voiceless n sound' }, { i: 'nG~', o: 'n4', name: 'Velarized n sound' }, { i: 'nh~', o: 'n%', name: 'Aspirated n sound' }, + { i: 'ny~h!', o: 'n%93', name: 'Voiceless palatalized n sound' }, { i: 'ny~', o: 'n3', name: 'Palatalized n sound' }, { i: 'n~', o: 'n7', name: 'Dental n sound' }, { i: 'n', o: 'n', name: 'N sound' }, diff --git a/package.json b/package.json index 36d19b3..eb3fd7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@drumwork/tone", - "version": "4.3.2", + "version": "4.3.4", "main": "form.js", "dependencies": { "@lancejpollard/script-tree": "^1.1.0" diff --git a/pronunciation.js b/pronunciation.js index b800c6b..d80c31f 100644 --- a/pronunciation.js +++ b/pronunciation.js @@ -50,6 +50,8 @@ function convertIPAToCall(ipa, options = { tones: true }) { while (i < parts.length) { const part = parts[i++] switch (part) { + case '\u200c': // non-width joiner + break case 'ʰ': addFeature('aspiration') break @@ -281,7 +283,7 @@ function convertIPAToCall(ipa, options = { tones: true }) { addConsonant('p*') break case 'r': - addConsonant('rr') + addConsonant('r') break case 'ɾ': addConsonant('r') @@ -367,7 +369,7 @@ function convertIPAToCall(ipa, options = { tones: true }) { } break case 'ʕ': - addConsonant('Q~') + addConsonant('Q') break case 'ʱ': addConsonant('hh~') @@ -390,9 +392,24 @@ function convertIPAToCall(ipa, options = { tones: true }) { case 'ĕ': addVowel('e') break + case 'ḛ': + addVowel('e') + addFeature('nasalization') + break + case '\u030a': + addFeature('voiceless') + break case `${m.d.tilde}`: addFeature(`nasalization`) break + case 'ṵ': + addVowel('u') + addFeature('nasalization') + break + case 'ḭ': + addVowel('i') + addFeature('nasalization') + break case '̚': addFeature('stop') break @@ -461,6 +478,8 @@ function convertIPAToCall(ipa, options = { tones: true }) { case '\u0329': // syllabic case '\u02FD': // apical case '\u033A': // apical + case '+': + case "'": break case '(': case ')': @@ -579,6 +598,11 @@ function convertIPAToCall(ipa, options = { tones: true }) { case '\u032F': // non-syllabic addFeature('non-syllabic') break + case '\u031f': + break + case 'ï': + addVowel('i') + break case 'è': addVowel('e') captureAllTones('˨') @@ -662,6 +686,10 @@ function convertIPAToCall(ipa, options = { tones: true }) { case '\u0361': // tie case '\u035C': // bottom tie break + case '\u0300': + captureAllTones('˨') + result.last.vowels = [] + break default: throw new Error(part) } @@ -884,6 +912,9 @@ function serialize(result) { if (node.dental) { out.push('~') } + if (node.pharyngealization) { + out.push('Q~') + } if (node.palatalization) { out.push('y~') }