latvian-grammar
Version:
Latvian grammar library
146 lines (136 loc) • 2.55 kB
JavaScript
// http://valoda.ailab.lv/latval/vidusskolai/morfol/lietv-mija.htm
const palatalize = (word, { declensionCase, suffix }) => {
const base = word.slice(0, -suffix.length);
if (
!table[declensionCase] ||
exceptions[declensionCase].includes(word) ||
exceptionSuffixes[declensionCase].some((x) => word.endsWith(x))
) {
return base;
}
for (const [from, to] of entryTable[declensionCase]) {
if (base.endsWith(from)) {
return `${base.slice(0, -from.length)}${to}`;
}
}
};
export default palatalize;
// NB: relies on key order to be in descending length
export const table = {
2: {
dz: "dž",
sn: "šņ",
zn: "žņ",
sl: "šļ",
zl: "žļ",
ln: "ļņ",
b: "bj",
m: "mj",
p: "pj",
v: "vj",
t: "š",
d: "ž",
c: "č",
s: "š",
z: "ž",
n: "ņ",
l: "ļ",
},
5: {
sn: "šņ",
zn: "žņ",
dz: "dž",
kst: "kp",
b: "bj",
m: "mj",
p: "pj",
v: "vj",
c: "č",
t: "š",
d: "ž",
s: "š",
z: "ž",
n: "ņ",
l: "ļ",
},
6: {
sn: "šņ",
st: "š",
v: "vj",
t: "š",
d: "ž",
s: "š",
z: "ž",
n: "ņ",
l: "ļ",
},
};
const entryTable = Object.fromEntries(
Object.entries(table).map(([k, v]) => [k, Object.entries(v)])
);
const exceptionSuffixes = {
2: ["astis", "jis", "ķis", "ģis", "ris", "skatis"],
5: ["aste", "fe", "ģe", "ķe", "mate", "pēde", "ste"],
};
const exceptions = {
2: ["tētis", "viesis"],
5: [
"apaļmute",
"apšaude",
"balamute",
"balle (mērvienība)",
"bāze",
"bise",
"bote",
"brīze",
"flote",
"fronte",
"gāze (vielas stāvoklis)",
"gide",
"kase",
"kušete",
"mise",
"mute",
"pase",
"piešaude",
"planšete",
"rase",
"sarakste",
"šprote",
"takse",
"tirāde",
],
6: [
"acs",
"aktis",
"ass",
"auss",
"balss",
"brokastis",
"Cēsis",
"dakts",
"debess",
"dzelzs",
"kūts",
"maksts",
"pirts",
"šalts",
"takts (mūzikā)",
"uts",
"uzacs",
"valsts",
"vēsts",
"zoss",
"žults",
],
};
for (const i of Array.from({ length: 6 }, (_, i) => i + 1)) {
if (!exceptionSuffixes[i]) {
exceptionSuffixes[i] = [];
}
if (!exceptions[i]) {
exceptions[i] = [];
}
}
// const masculinePluralOnly = ["akmens", "asmens", "rudens", "zibens", "ūdens", "mēness", "sāls"];
// const masculineTwoSyllableSuffixes = ["tis", "dis"];