working with basic verbs with participles - testing totally broken and needs to be redone
This commit is contained in:
parent
ed4e494e54
commit
76f9158e2a
|
@ -35,45 +35,45 @@ const labels = (role: "subject" | "object" | "ergative" | "possesor") => ({
|
||||||
far: [
|
far: [
|
||||||
["زه", "مونږ"],
|
["زه", "مونږ"],
|
||||||
["ته", "تاسو"],
|
["ته", "تاسو"],
|
||||||
["هغه", "هغوي"],
|
["هغه", "هغوی"],
|
||||||
],
|
],
|
||||||
near: [
|
near: [
|
||||||
["زه", "مونږ"],
|
["زه", "مونږ"],
|
||||||
["ته", "تاسو"],
|
["ته", "تاسو"],
|
||||||
[{ masc: "دی", fem: "دا" }, "دوي"],
|
[{ masc: "دی", fem: "دا" }, "دوی"],
|
||||||
],
|
],
|
||||||
} : role === "object" ? {
|
} : role === "object" ? {
|
||||||
far: [
|
far: [
|
||||||
["زه", "مونږ"],
|
["زه", "مونږ"],
|
||||||
["ته", "تاسو"],
|
["ته", "تاسو"],
|
||||||
[{ masc: "هغهٔ", fem: "هغې" }, "هغوي"],
|
[{ masc: "هغهٔ", fem: "هغې" }, "هغوی"],
|
||||||
],
|
],
|
||||||
near: [
|
near: [
|
||||||
["زه", "مونږ"],
|
["زه", "مونږ"],
|
||||||
["ته", "تاسو"],
|
["ته", "تاسو"],
|
||||||
[{ masc: "دهٔ", fem: "دې" }, "دوي"],
|
[{ masc: "دهٔ", fem: "دې" }, "دوی"],
|
||||||
],
|
],
|
||||||
} : role === "possesor" ? {
|
} : role === "possesor" ? {
|
||||||
far: [
|
far: [
|
||||||
["زما", "زمونږ"],
|
["زما", "زمونږ"],
|
||||||
["ستا", "ستاسو"],
|
["ستا", "ستاسو"],
|
||||||
[{ masc: "د هغهٔ", fem: "د هغې" }, "د هغوي"],
|
[{ masc: "د هغهٔ", fem: "د هغې" }, "د هغوی"],
|
||||||
],
|
],
|
||||||
near: [
|
near: [
|
||||||
["زما", "زمونږ"],
|
["زما", "زمونږ"],
|
||||||
["ستا", "ستاسو"],
|
["ستا", "ستاسو"],
|
||||||
[{ masc: "د دهٔ", fem: "د دې" }, "د دوي"],
|
[{ masc: "د دهٔ", fem: "د دې" }, "د دوی"],
|
||||||
],
|
],
|
||||||
} : {
|
} : {
|
||||||
far: [
|
far: [
|
||||||
["ما", "مونږ"],
|
["ما", "مونږ"],
|
||||||
["تا", "تاسو"],
|
["تا", "تاسو"],
|
||||||
[{ masc: "هغهٔ", fem: "هغې" }, "هغوي"],
|
[{ masc: "هغهٔ", fem: "هغې" }, "هغوی"],
|
||||||
],
|
],
|
||||||
near: [
|
near: [
|
||||||
["ما", "مونږ"],
|
["ما", "مونږ"],
|
||||||
["تا", "تاسو"],
|
["تا", "تاسو"],
|
||||||
[{ masc: "دهٔ", fem: "دې" }, "دوي"],
|
[{ masc: "دهٔ", fem: "دې" }, "دوی"],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -95,7 +95,8 @@ function renderPerfectVerb({ tense, verb, voice, person }: {
|
||||||
verb: T.VerbEntry,
|
verb: T.VerbEntry,
|
||||||
voice: T.Voice,
|
voice: T.Voice,
|
||||||
person: T.Person,
|
person: T.Person,
|
||||||
}): { hasBa: boolean, vbs: [[], [T.VBGenNum, T.VBE]] } {
|
// TODO: Tighter typing on the output for T.VB (enforce genderNumber?)
|
||||||
|
}): { hasBa: boolean, vbs: [[], [T.VB, T.VBE]] } {
|
||||||
const hasBa = tenseHasBa(tense);
|
const hasBa = tenseHasBa(tense);
|
||||||
const genderNumber = {
|
const genderNumber = {
|
||||||
gender: personGender(person),
|
gender: personGender(person),
|
||||||
|
|
|
@ -31,7 +31,7 @@ const shVB: T.VBBasic = {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: kuRee shuwey etc
|
// TODO: kuRee shuwey etc
|
||||||
export function getPastParticiple(verb: T.VerbEntry, voice: T.Voice, { gender, number }: { gender: T.Gender, number: T.NounNumber }): T.VBGenNum {
|
export function getPastParticiple(verb: T.VerbEntry, voice: T.Voice, { gender, number }: { gender: T.Gender, number: T.NounNumber }): T.VBGenNum | T.WeldedGN {
|
||||||
const v = removeFVarientsFromVerb(verb);
|
const v = removeFVarientsFromVerb(verb);
|
||||||
if (voice === "passive") {
|
if (voice === "passive") {
|
||||||
return getPassivePp(v, { gender, number });
|
return getPassivePp(v, { gender, number });
|
||||||
|
@ -47,21 +47,22 @@ export function getPastParticiple(verb: T.VerbEntry, voice: T.Voice, { gender, n
|
||||||
}
|
}
|
||||||
const [_, [basicRoot]] = getImperfectiveRoot(removeFVarientsFromVerb(verb));
|
const [_, [basicRoot]] = getImperfectiveRoot(removeFVarientsFromVerb(verb));
|
||||||
const longRoot = getLongVB(basicRoot);
|
const longRoot = getLongVB(basicRoot);
|
||||||
|
const rootWLengths = possiblePPartLengths(longRoot);
|
||||||
|
|
||||||
if ("right" in longRoot) {
|
if ("right" in rootWLengths) {
|
||||||
return {
|
return {
|
||||||
...longRoot,
|
...rootWLengths,
|
||||||
right: {
|
right: {
|
||||||
...longRoot.right,
|
...rootWLengths.right,
|
||||||
ps: addTail(longRoot.right.ps),
|
ps: addTail(rootWLengths.right.ps),
|
||||||
|
gender,
|
||||||
|
number,
|
||||||
},
|
},
|
||||||
gender,
|
|
||||||
number,
|
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
...longRoot,
|
...rootWLengths,
|
||||||
ps: addTail(longRoot.ps),
|
ps: addTail(rootWLengths.ps),
|
||||||
gender,
|
gender,
|
||||||
number,
|
number,
|
||||||
};
|
};
|
||||||
|
@ -79,6 +80,36 @@ export function getPastParticiple(verb: T.VerbEntry, voice: T.Voice, { gender, n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function possiblePPartLengths(vba: T.VBNoLenghts<T.VBBasic>): T.VBBasic;
|
||||||
|
function possiblePPartLengths(vba: T.VBNoLenghts<T.VBA>): T.VBA;
|
||||||
|
function possiblePPartLengths(vba: T.VBNoLenghts<T.VBA>): T.VBA {
|
||||||
|
const shortenableEndings = ["ښتل", "ستل", "وتل"];
|
||||||
|
const wrul = ["وړل", "راوړل", "وروړل", "دروړل"];
|
||||||
|
if ("right" in vba) {
|
||||||
|
return {
|
||||||
|
...vba,
|
||||||
|
right: possiblePPartLengths(vba.right),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const infinitive = vba.ps[0];
|
||||||
|
const [trimP, trimF] = (infinitive.p.slice(-4) === "ښودل" && infinitive.p.length > 4 && infinitive.p !== "کېښودل" && infinitive.p !== "کښېښودل")
|
||||||
|
// special thing for اېښودل - پرېښودل
|
||||||
|
? [3, 4]
|
||||||
|
: (wrul.includes(infinitive.p) || (shortenableEndings.includes(infinitive.p.slice(-3)) && infinitive.p.slice(-4) !== "استل"))
|
||||||
|
? [1, 2]
|
||||||
|
: [0, 0];
|
||||||
|
if (trimP) {
|
||||||
|
return {
|
||||||
|
type: "VB",
|
||||||
|
ps: {
|
||||||
|
long: [infinitive],
|
||||||
|
short: [accentOnNFromEnd(trimOffPs(infinitive, trimP, trimF), 0)],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return vba;
|
||||||
|
}
|
||||||
|
|
||||||
export function getRootStem({ verb, rs, aspect, type, genderNumber, voice }: {
|
export function getRootStem({ verb, rs, aspect, type, genderNumber, voice }: {
|
||||||
verb: T.VerbEntry,
|
verb: T.VerbEntry,
|
||||||
rs: "root" | "stem",
|
rs: "root" | "stem",
|
||||||
|
@ -128,17 +159,14 @@ function getAbilityRs(
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPassivePp(verb: T.VerbEntryNoFVars, genderNumber: T.GenderNumber): T.VBGenNum {
|
function getPassivePp(verb: T.VerbEntryNoFVars, genderNumber: T.GenderNumber): T.WeldedGN {
|
||||||
const [_, [basicRoot]] = getImperfectiveRoot(verb);
|
const [_, [basicRoot]] = getImperfectiveRoot(verb);
|
||||||
const longRoot = getLongVB(basicRoot);
|
const longRoot = getLongVB(basicRoot);
|
||||||
const kedulVbGenNum = getPastParticiple(kedulStat, "active", genderNumber) as T.VBBasic & T.GenderNumber;
|
const kedulVb: T.VBGenNum = getPastParticiple(kedulStat, "active", genderNumber) as T.VBGenNum;
|
||||||
const kedulVb: T.VBBasic = {
|
return weld(longRoot, kedulVb);
|
||||||
type: "VB",
|
|
||||||
ps: kedulVbGenNum.ps,
|
|
||||||
};
|
|
||||||
return weld(longRoot, kedulVb, genderNumber);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: could combine these two functions...
|
||||||
function getPassiveRs(verb: T.VerbEntryNoFVars, aspect: T.Aspect, rs: "root" | "stem"): [[] | [T.VHead], [T.VBA]] {
|
function getPassiveRs(verb: T.VerbEntryNoFVars, aspect: T.Aspect, rs: "root" | "stem"): [[] | [T.VHead], [T.VBA]] {
|
||||||
const [vHead, [basicRoot]] = (aspect === "imperfective"
|
const [vHead, [basicRoot]] = (aspect === "imperfective"
|
||||||
? getImperfectiveRoot
|
? getImperfectiveRoot
|
||||||
|
|
|
@ -67,26 +67,19 @@ export function verbEndingConcat(ps: T.PsString[], end: T.PsString[]): T.PsStrin
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: better to have the genderNumber included and inferred in the right?
|
export function weld(left: T.Welded["left"], right: T.VBGenNum): T.WeldedGN;
|
||||||
export function weld(left: T.Welded["left"], right: T.Welded["right"]): T.Welded;
|
export function weld(left: T.Welded["left"], right: T.VBBasic): T.Welded;
|
||||||
export function weld(left: T.Welded["left"], right: T.Welded["right"], genderNum: T.GenderNumber): T.Welded & T.GenderNumber;
|
export function weld(left: T.Welded["left"], right: T.VBBasic | T.VBGenNum): T.Welded | T.WeldedGN {
|
||||||
export function weld(left: T.Welded["left"], right: T.Welded["right"], genderNum?: T.GenderNumber): T.Welded {
|
|
||||||
return {
|
return {
|
||||||
type: "welded",
|
type: "welded",
|
||||||
left: removeAccentsFromLeft(left),
|
left: removeAccentsFromLeft(left),
|
||||||
right,
|
right,
|
||||||
...genderNum ? {
|
};
|
||||||
...genderNum,
|
|
||||||
} : {},
|
|
||||||
}
|
|
||||||
function removeAccentsFromLeft(left: T.Welded["left"]): T.Welded["left"] {
|
function removeAccentsFromLeft(left: T.Welded["left"]): T.Welded["left"] {
|
||||||
if (left.type === "VB") {
|
if (left.type === "VB") {
|
||||||
return {
|
return {
|
||||||
...left,
|
...left,
|
||||||
ps: removeAccentsWLength(left.ps),
|
ps: removeAccentsWLength(left.ps),
|
||||||
...genderNum ? {
|
|
||||||
...genderNum,
|
|
||||||
} : {},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (left.type === "NComp") {
|
if (left.type === "NComp") {
|
||||||
|
@ -96,9 +89,6 @@ export function weld(left: T.Welded["left"], right: T.Welded["right"], genderNum
|
||||||
...left.comp,
|
...left.comp,
|
||||||
ps: removeAccents(left.comp.ps),
|
ps: removeAccents(left.comp.ps),
|
||||||
},
|
},
|
||||||
...genderNum ? {
|
|
||||||
...genderNum,
|
|
||||||
} : {},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
@ -107,9 +97,6 @@ export function weld(left: T.Welded["left"], right: T.Welded["right"], genderNum
|
||||||
...left.right,
|
...left.right,
|
||||||
ps: removeAccentsWLength(left.right.ps),
|
ps: removeAccentsWLength(left.right.ps),
|
||||||
},
|
},
|
||||||
...genderNum ? {
|
|
||||||
...genderNum,
|
|
||||||
} : {},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,11 +161,13 @@ export function addToVBBasicEnd(vb: T.VBBasic, end: T.PsString[]): T.VBBasic {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getLongVB(vb: T.VBA): T.VBA {
|
export function getLongVB(vb: T.VBBasic): T.VBNoLenghts<T.VBBasic>;
|
||||||
|
export function getLongVB(vb: T.VBA): T.VBNoLenghts<T.VBA>;
|
||||||
|
export function getLongVB(vb: T.VBA): T.VBNoLenghts<T.VBA> {
|
||||||
if (vb.type === "welded") {
|
if (vb.type === "welded") {
|
||||||
return {
|
return {
|
||||||
...vb,
|
...vb,
|
||||||
right: getLongVB(vb) as T.VBBasic,
|
right: getLongVB(vb.right),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
|
12
src/types.ts
12
src/types.ts
|
@ -1077,14 +1077,18 @@ export type MiniPronoun = {
|
||||||
export type VerbRenderedOutput = [[VHead] | [], [VB, VBE] | [VBE]];
|
export type VerbRenderedOutput = [[VHead] | [], [VB, VBE] | [VBE]];
|
||||||
export type RootsStemsOutput = [[VHead] | [], [VB, VBA] | [VBA]]; // or perfect / equative
|
export type RootsStemsOutput = [[VHead] | [], [VB, VBA] | [VBA]]; // or perfect / equative
|
||||||
|
|
||||||
export type VB = VBBasic | VBGenNum | Welded;
|
export type VB = VBBasic | VBGenNum | Welded | WeldedGN;
|
||||||
/** A VB block that can have endings attached to it */
|
/** A VB block that can have endings attached to it */
|
||||||
export type VBA = Exclude<VB, VBGenNum>;
|
export type VBA = Exclude<VB, VBGenNum | WeldedGN>;
|
||||||
/** A VB block that has had a person verb ending attached */
|
/** A VB block that has had a person verb ending attached */
|
||||||
export type VBE = (VBBasic | Welded) & {
|
export type VBE = (VBBasic | Welded) & {
|
||||||
person: Person,
|
person: Person,
|
||||||
}; // or equative
|
}; // or equative
|
||||||
|
|
||||||
|
export type VBNoLenghts<V extends VB> = V extends VBBasic
|
||||||
|
? Omit<VBBasic, "ps"> & { ps: PsString[] }
|
||||||
|
: Omit<Welded, "right"> & { right: VBNoLenghts<Exclude<VB, Welded>> };
|
||||||
|
|
||||||
export type VBBasic = {
|
export type VBBasic = {
|
||||||
type: "VB",
|
type: "VB",
|
||||||
ps: SingleOrLengthOpts<PsString[]>,
|
ps: SingleOrLengthOpts<PsString[]>,
|
||||||
|
@ -1092,7 +1096,7 @@ export type VBBasic = {
|
||||||
|
|
||||||
// TODO: might be a better design decision to keep the GenderNuber stuff
|
// TODO: might be a better design decision to keep the GenderNuber stuff
|
||||||
// in the RIGHT side of the weld
|
// in the RIGHT side of the weld
|
||||||
export type VBGenNum = (VBBasic | Welded) & GenderNumber;
|
export type VBGenNum = VBBasic & GenderNumber;
|
||||||
|
|
||||||
export type GenderNumber = {
|
export type GenderNumber = {
|
||||||
gender: Gender,
|
gender: Gender,
|
||||||
|
@ -1105,6 +1109,8 @@ export type Welded = {
|
||||||
right: VBBasic,
|
right: VBBasic,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type WeldedGN = Omit<Welded, "right"> & { right: VBGenNum };
|
||||||
|
|
||||||
export type VHead = PH | NComp;
|
export type VHead = PH | NComp;
|
||||||
|
|
||||||
/** perfective head block */
|
/** perfective head block */
|
||||||
|
|
Loading…
Reference in New Issue