ccat-parse
Version:
Parse CCAT morph codes
115 lines (102 loc) • 2.63 kB
JavaScript
const { pronouns, numbers, tenses, voices, moods, cases, genders, degrees } = require('./constants.js')
const tenseVoiceMood = ({t,v,m}) => {
return {
"tense": tenses[t],
"voice": voices[v],
"mood": moods[m]
}
}
const personNumber = ({p,n}) => {
return {
"person": p,
"number": numbers[n]
}
}
const caseNumberGender = ({c,n,g}) => {
return {
"case": cases[c],
"number": numbers[n],
"gender": genders[g]
}
}
// Case/Number/Gender
const cngObjectFromString = (cng_string) => {
return {
c: cng_string[0],
n: cng_string[1],
g: cng_string[2]
}
}
//Tense/Voice/Mood
const tvmObjectFromString = (tvmx_string) => {
return {
t: tvmx_string[0],
v: tvmx_string[1],
m: tvmx_string[2]
}
}
//Person/Number
const pnObjectFromString = (xxxpn_string) => {
return {
p: xxxpn_string[3],
n: xxxpn_string[4]
}
}
const ccatParse = (code_string) => {
const part_of_speech = code_string.indexOf(" ") > -1 ? code_string.substr(0, code_string.indexOf(" ")) : code_string
const parse_code = code_string.substr(code_string.indexOf(" ") + 1)
const return_object = {}
switch (part_of_speech[0]) {
case "N": /* NOUN */
return_object.part_of_speech = "noun"
if (part_of_speech[1])
return_object.declension = part_of_speech[1]
else
return_object.declension = "indeclinable proper"
Object.assign(return_object, caseNumberGender(cngObjectFromString(parse_code)))
break
case "R": /* PRONOUN */
return_object.part_of_speech = pronouns[part_of_speech[1]]
Object.assign(return_object, caseNumberGender(cngObjectFromString(parse_code)))
break
case "A":
return_object.part_of_speech= "adj"
Object.assign(return_object, caseNumberGender(cngObjectFromString(parse_code)))
if (parse_code[3]) {
return_object.degree = degrees[parse_code[3]]
}
break
case "C":
case "X":
case "I":
case "M":
case "P":
case "D":
const unmorphed_parts_of_speech = {
"C": "conj",
"X": "part",
"I": "intj",
"M": "indc", //indeclinable number
"P": "prep",
"D": "adv"
}
return_object.part_of_speech = unmorphed_parts_of_speech[part_of_speech]
break
case "V":
return_object.part_of_speech = "verb"
Object.assign(return_object, tenseVoiceMood(tvmObjectFromString(parse_code)))
if (return_object.mood === 'ptcp') {
Object.assign(return_object, caseNumberGender(cngObjectFromString(parse_code.substr(3))))
}
else {
Object.assign(return_object, personNumber(pnObjectFromString(parse_code)))
}
break
default:
console.log("not ready:", code_string)
}
return return_object
}
module.exports = {
ccatParse
}