taipa
Version:
Taiwanese morphological parsing library
121 lines • 5.25 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getToneEndingNumbersThree = exports.getToneEndingNumbersTwo = exports.getToneEndingNumber = exports.extractTones = exports.LexicalTone = void 0;
const morpheme_1 = require("../unchange/morpheme");
const unit_1 = require("../unit");
const analyzer_1 = require("../unchange/analyzer");
const tonalres_1 = require("./tonalres");
/** Tone letters and stop finals of the syllables of a word. */
class LexicalTone {
/** Tone letters of all syllables. A transfix is comprised of its tone affixes. */
toneLetters = [];
/** Stop finals of all syllables. */
stopFinals = [];
/** Return the last tone letter of a word. */
getInflectionalEnding() {
return this.toneLetters[this.toneLetters.length - 1];
}
/** Return the tone of a word. */
getAllomorphicEnding() {
return (this.stopFinals[this.stopFinals.length - 1] +
this.toneLetters[this.toneLetters.length - 1]);
}
/** Return tone numbers for all syllables. */
getToneNumbers() {
const numbers = [];
for (let i = 0; i < this.toneLetters.length; i++) {
if (this.toneLetters[i] === '' && this.stopFinals[i] === '')
numbers.push(1);
else if (this.toneLetters[i] === '' && this.stopFinals[i] !== '') {
if (this.stopFinals[i].length == 1)
numbers.push(4);
else if (this.stopFinals[i].length == 2)
numbers.push(8);
}
else if (this.toneLetters[i] !== '') {
if (this.toneLetters[i] === tonalres_1.TonalLetterTags.f)
numbers.push(1);
if (this.toneLetters[i] === tonalres_1.TonalLetterTags.y)
numbers.push(2);
if (this.toneLetters[i] === tonalres_1.TonalLetterTags.w)
numbers.push(3);
if (this.toneLetters[i] === tonalres_1.TonalLetterTags.x)
numbers.push(5);
if (this.toneLetters[i] === tonalres_1.TonalLetterTags.z)
numbers.push(7);
if (this.toneLetters[i] === tonalres_1.TonalLetterTags.xx)
numbers.push(9);
}
}
return numbers;
}
}
exports.LexicalTone = LexicalTone;
/** Given a word, populate and return a LexicalTone object. */
function extractTones(token) {
const gs = (0, analyzer_1.graphAnalyzeTonal)(token);
const ltrs = gs.map((it) => it.letter);
const ptrns = (0, unit_1.makeMatchedPatterns)(ltrs, morpheme_1.syllabifyTonal);
const tone = new LexicalTone();
const ptn = ptrns.map((it) => it.pattern);
const stps = ptn.map((it) => it
.map((it) => it.name === tonalres_1.TonalSpellingTags.stopFinalConsonant ? it.toString() : '')
.filter((it) => it.length > 0));
const tnls = ptn.map((it) => it
.map((it) => it.name === tonalres_1.TonalSpellingTags.freeTone ||
it.name === tonalres_1.TonalSpellingTags.checkedTone
? it.toString()
: '')
.filter((it) => it.length > 0));
stps.map((it) => it.length > 0 ? tone.stopFinals.push(it[0]) : tone.stopFinals.push(''));
tnls.map((it) => it.length > 0 ? tone.toneLetters.push(it[0]) : tone.toneLetters.push(''));
return tone;
}
exports.extractTones = extractTones;
/** Return tone ending number for 1 word. */
function getToneEndingNumber(token) {
const tone = extractTones(token);
if (tone.getInflectionalEnding() === '' && tone.getAllomorphicEnding() === '')
return 1;
if (tone.getInflectionalEnding() === '' &&
tone.getAllomorphicEnding() !== '') {
// p, t, k, h
if (tone.getAllomorphicEnding().length == 1)
return 4;
// pp, tt, kk, hh
if (tone.getAllomorphicEnding().length == 2)
return 8;
}
if (tone.getInflectionalEnding() !== '') {
// -f, -y, -w, -x, -z, -xx. -pf, -tf, -kf, -hf.
if (tone.getInflectionalEnding() === tonalres_1.TonalLetterTags.f)
return 1;
if (tone.getInflectionalEnding() === tonalres_1.TonalLetterTags.y)
return 2;
if (tone.getInflectionalEnding() === tonalres_1.TonalLetterTags.w)
return 3;
if (tone.getInflectionalEnding() === tonalres_1.TonalLetterTags.x)
return 5;
if (tone.getInflectionalEnding() === tonalres_1.TonalLetterTags.z)
return 7;
if (tone.getInflectionalEnding() === tonalres_1.TonalLetterTags.xx)
return 9;
}
return -1;
}
exports.getToneEndingNumber = getToneEndingNumber;
/** Return tone ending numbers for 2 words. */
function getToneEndingNumbersTwo(token1, token2) {
return [getToneEndingNumber(token1), getToneEndingNumber(token2)];
}
exports.getToneEndingNumbersTwo = getToneEndingNumbersTwo;
/** Return tone ending numbers for 3 words. */
function getToneEndingNumbersThree(token1, token2, token3) {
return [
getToneEndingNumber(token1),
getToneEndingNumber(token2),
getToneEndingNumber(token3),
];
}
exports.getToneEndingNumbersThree = getToneEndingNumbersThree;
//# sourceMappingURL=tone.js.map