more correct? modal and perfect ordering
This commit is contained in:
parent
d94b1d3d71
commit
7449e8d4ad
|
@ -5,7 +5,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-free": "^5.15.4",
|
"@fortawesome/fontawesome-free": "^5.15.4",
|
||||||
"@lingdocs/lingdocs-main": "^0.2.0",
|
"@lingdocs/lingdocs-main": "^0.2.0",
|
||||||
"@lingdocs/pashto-inflector": "^1.6.2",
|
"@lingdocs/pashto-inflector": "^1.6.3",
|
||||||
"@testing-library/jest-dom": "^5.11.4",
|
"@testing-library/jest-dom": "^5.11.4",
|
||||||
"@testing-library/react": "^11.1.0",
|
"@testing-library/react": "^11.1.0",
|
||||||
"@testing-library/user-event": "^12.1.10",
|
"@testing-library/user-event": "^12.1.10",
|
||||||
|
|
|
@ -6,16 +6,16 @@ import {
|
||||||
getVerbBlockPosFromPerson,
|
getVerbBlockPosFromPerson,
|
||||||
makePsString,
|
makePsString,
|
||||||
} from "@lingdocs/pashto-inflector";
|
} from "@lingdocs/pashto-inflector";
|
||||||
import { removeBa } from "./vp-tools";
|
import {
|
||||||
|
removeBa,
|
||||||
|
removeDuplicates,
|
||||||
|
} from "./vp-tools";
|
||||||
|
|
||||||
// also
|
// TODO: get the past tense order right
|
||||||
// nú dey me leeduley
|
// ویې نه کړای شو
|
||||||
|
// ویې نه شو کړای
|
||||||
|
// add modal to the passive
|
||||||
|
|
||||||
// نه مې دی لیدلی - nú me dey leeduley
|
|
||||||
// لیدلی مې نه دی - leeduley me nú dey
|
|
||||||
//
|
|
||||||
// TODO: make it an option to include O S V order ?
|
|
||||||
// TODO: tu ba laaR nu she hyphens all messed up
|
|
||||||
type Form = FormVersion & { OSV?: boolean };
|
type Form = FormVersion & { OSV?: boolean };
|
||||||
export function compileVP(VP: VPRendered, form: Form): { ps: T.SingleOrLengthOpts<T.PsString[]>, e?: string [] };
|
export function compileVP(VP: VPRendered, form: Form): { ps: T.SingleOrLengthOpts<T.PsString[]>, e?: string [] };
|
||||||
export function compileVP(VP: VPRendered, form: Form, combineLengths: true): { ps: T.PsString[], e?: string [] };
|
export function compileVP(VP: VPRendered, form: Form, combineLengths: true): { ps: T.PsString[], e?: string [] };
|
||||||
|
@ -26,9 +26,7 @@ export function compileVP(VP: VPRendered, form: Form, combineLengths?: true): {
|
||||||
NPs,
|
NPs,
|
||||||
kids,
|
kids,
|
||||||
verb,
|
verb,
|
||||||
hasLeapfrog: VP.verb.tenseCategory !== "basic",
|
VP,
|
||||||
negative: VP.verb.negative,
|
|
||||||
isCompound: VP.isCompound,
|
|
||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
ps: combineLengths ? flattenLengths(psResult) : psResult,
|
ps: combineLengths ? flattenLengths(psResult) : psResult,
|
||||||
|
@ -43,25 +41,23 @@ type CompilePsInput = {
|
||||||
head: T.PsString | undefined,
|
head: T.PsString | undefined,
|
||||||
rest: T.SingleOrLengthOpts<T.PsString[]>,
|
rest: T.SingleOrLengthOpts<T.PsString[]>,
|
||||||
},
|
},
|
||||||
isCompound: "stative" | "dynamic" | false,
|
VP: VPRendered,
|
||||||
hasLeapfrog: boolean,
|
|
||||||
negative: boolean,
|
|
||||||
}
|
}
|
||||||
function compilePs({ NPs, kids, verb: { head, rest }, isCompound, hasLeapfrog, negative }: CompilePsInput): T.SingleOrLengthOpts<T.PsString[]> {
|
function compilePs({ NPs, kids, verb: { head, rest }, VP }: CompilePsInput): T.SingleOrLengthOpts<T.PsString[]> {
|
||||||
if ("long" in rest) {
|
if ("long" in rest) {
|
||||||
return {
|
return {
|
||||||
long: compilePs({ NPs, verb: { head, rest: rest.long }, negative, hasLeapfrog, isCompound, kids }) as T.PsString[],
|
long: compilePs({ NPs, verb: { head, rest: rest.long }, VP, kids }) as T.PsString[],
|
||||||
short: compilePs({ NPs, verb: { head, rest: rest.short }, negative, hasLeapfrog, isCompound, kids }) as T.PsString[],
|
short: compilePs({ NPs, verb: { head, rest: rest.short }, VP, kids }) as T.PsString[],
|
||||||
...rest.mini ? {
|
...rest.mini ? {
|
||||||
mini: compilePs({ NPs, verb: { head, rest: rest.mini }, negative, hasLeapfrog, isCompound, kids }) as T.PsString[],
|
mini: compilePs({ NPs, verb: { head, rest: rest.mini }, VP, kids }) as T.PsString[],
|
||||||
} : {},
|
} : {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const verbWNegativeVersions = arrangeVerbWNegative(head, rest, negative, isCompound, hasLeapfrog);
|
const verbWNegativeVersions = arrangeVerbWNegative(head, rest, VP.verb);
|
||||||
|
|
||||||
// put together all the different possible permutations based on:
|
// put together all the different possible permutations based on:
|
||||||
// a. potential different versions of where the nu goes
|
// a. potential different versions of where the nu goes
|
||||||
return verbWNegativeVersions.flatMap((verbSegments) => (
|
return removeDuplicates(verbWNegativeVersions.flatMap((verbSegments) => (
|
||||||
// b. potential reordering of NPs
|
// b. potential reordering of NPs
|
||||||
NPs.flatMap(NP => {
|
NPs.flatMap(NP => {
|
||||||
// for each permutation of the possible ordering of NPs and Verb + nu
|
// for each permutation of the possible ordering of NPs and Verb + nu
|
||||||
|
@ -72,7 +68,7 @@ function compilePs({ NPs, kids, verb: { head, rest }, isCompound, hasLeapfrog, n
|
||||||
// 3. throw it all together into a PsString for each permutation
|
// 3. throw it all together into a PsString for each permutation
|
||||||
return combineSegments(withProperSpaces);
|
return combineSegments(withProperSpaces);
|
||||||
})
|
})
|
||||||
));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSegmentsAndKids(VP: VPRendered, form: Form): { kids: Segment[], NPs: Segment[][] } {
|
function getSegmentsAndKids(VP: VPRendered, form: Form): { kids: Segment[], NPs: Segment[][] } {
|
||||||
|
@ -134,7 +130,8 @@ function putKidsInKidsSection(segments: Segment[], kids: Segment[]): Segment[] {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
function arrangeVerbWNegative(head: T.PsString | undefined, restRaw: T.PsString[], negative: boolean, isCompound: "stative" | "dynamic" | false, hasLeapfrog: boolean): Segment[][] {
|
function arrangeVerbWNegative(head: T.PsString | undefined, restRaw: T.PsString[], V: VerbRendered): Segment[][] {
|
||||||
|
const hasLeapfrog = V.tenseCategory === "modal" || V.tenseCategory === "perfect";
|
||||||
const rest = (() => {
|
const rest = (() => {
|
||||||
if (hasLeapfrog) {
|
if (hasLeapfrog) {
|
||||||
const [restF, restLast] = splitOffLeapfrogWord(restRaw);
|
const [restF, restLast] = splitOffLeapfrogWord(restRaw);
|
||||||
|
@ -153,7 +150,7 @@ function arrangeVerbWNegative(head: T.PsString | undefined, restRaw: T.PsString[
|
||||||
? ["isVerbHead", "isOoOrWaaHead"]
|
? ["isVerbHead", "isOoOrWaaHead"]
|
||||||
: ["isVerbHead"]
|
: ["isVerbHead"]
|
||||||
);
|
);
|
||||||
if (!negative) {
|
if (!V.negative) {
|
||||||
if ("front" in rest) {
|
if ("front" in rest) {
|
||||||
return [
|
return [
|
||||||
headSegment ? [headSegment, rest.front, rest.last] : [rest.front, rest.last],
|
headSegment ? [headSegment, rest.front, rest.last] : [rest.front, rest.last],
|
||||||
|
@ -195,7 +192,7 @@ function arrangeVerbWNegative(head: T.PsString | undefined, restRaw: T.PsString[
|
||||||
if ("front" in rest) {
|
if ("front" in rest) {
|
||||||
return [
|
return [
|
||||||
[
|
[
|
||||||
...headSegment ? [headSegment.adjust({ ps: removeAccents })] : [],
|
headSegment.adjust({ ps: removeAccents }),
|
||||||
rest.last.adjust({
|
rest.last.adjust({
|
||||||
ps: r => concatPsString(nu, " ", removeAccents(r)),
|
ps: r => concatPsString(nu, " ", removeAccents(r)),
|
||||||
desc: ["isNu"],
|
desc: ["isNu"],
|
||||||
|
@ -205,23 +202,24 @@ function arrangeVerbWNegative(head: T.PsString | undefined, restRaw: T.PsString[
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
...headSegment ? [headSegment.adjust({ ps: removeAccents })] : [],
|
headSegment.adjust({ ps: removeAccents }),
|
||||||
rest.front.adjust({
|
rest.front.adjust({
|
||||||
ps: r => removeAccents(r),
|
|
||||||
}),
|
|
||||||
rest.last.adjust({
|
|
||||||
ps: r => concatPsString(nu, " ", removeAccents(r)),
|
ps: r => concatPsString(nu, " ", removeAccents(r)),
|
||||||
desc: ["isNu"],
|
desc: ["isNu"],
|
||||||
}),
|
}),
|
||||||
|
rest.last.adjust({
|
||||||
|
ps: r => removeAccents(r),
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
// TODO: do something like this with the leapfrog?
|
...(!headSegment.isOoOrWaaHead && !V.isCompound) ? [[
|
||||||
// // verbs that have a perfective prefix that is not و or وا can put the
|
mergeSegments(headSegment, rest.front, "no space").adjust({
|
||||||
// // nu *before* the prefix as well // TODO: also وي prefixes?
|
ps: r => concatPsString(nu, " ", removeAccents(r)),
|
||||||
// ...(!headSegment.isOoOrWaaHead && !isCompound) ? [[
|
desc: ["isNu"],
|
||||||
// makeSegment(nu, ["isNu"]),
|
}),
|
||||||
// headSegment.adjust({ ps: removeAccents }),
|
rest.last.adjust({
|
||||||
// rest.adjust({ ps: removeAccents }),
|
ps: r => removeAccents(r),
|
||||||
// ]] : [],
|
}),
|
||||||
|
]] : [],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
return [
|
return [
|
||||||
|
@ -234,7 +232,7 @@ function arrangeVerbWNegative(head: T.PsString | undefined, restRaw: T.PsString[
|
||||||
],
|
],
|
||||||
// verbs that have a perfective prefix that is not و or وا can put the
|
// verbs that have a perfective prefix that is not و or وا can put the
|
||||||
// nu *before* the prefix as well // TODO: also وي prefixes?
|
// nu *before* the prefix as well // TODO: also وي prefixes?
|
||||||
...(!headSegment.isOoOrWaaHead && !isCompound) ? [[
|
...(!headSegment.isOoOrWaaHead && !V.isCompound) ? [[
|
||||||
makeSegment(nu, ["isNu"]),
|
makeSegment(nu, ["isNu"]),
|
||||||
headSegment.adjust({ ps: removeAccents }),
|
headSegment.adjust({ ps: removeAccents }),
|
||||||
rest.adjust({ ps: removeAccents }),
|
rest.adjust({ ps: removeAccents }),
|
||||||
|
@ -247,7 +245,10 @@ function shrinkNP(np: Rendered<NPSelection>): Segment {
|
||||||
return makeSegment(grammarUnits.pronouns.mini[row][col], ["isKid", "isMiniPronoun"]);
|
return makeSegment(grammarUnits.pronouns.mini[row][col], ["isKid", "isMiniPronoun"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function mergeSegments(s1: Segment, s2: Segment): Segment {
|
function mergeSegments(s1: Segment, s2: Segment, noSpace?: "no space"): Segment {
|
||||||
|
if (noSpace) {
|
||||||
|
return s2.adjust({ ps: (p) => concatPsString(s1.ps[0], p) });
|
||||||
|
}
|
||||||
return s2.adjust({ ps: (p) => concatPsString(s1.ps[0], " ", p) });
|
return s2.adjust({ ps: (p) => concatPsString(s1.ps[0], " ", p) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,4 +385,4 @@ function splitOffLeapfrogWord(psVs: T.PsString[]): [T.PsString[], T.PsString[]]
|
||||||
);
|
);
|
||||||
return [[...tp[0], beginning], [...tp[1], end]];
|
return [[...tp[0], beginning], [...tp[1], end]];
|
||||||
}, [[], []] as [T.PsString[], T.PsString[]]);
|
}, [[], []] as [T.PsString[], T.PsString[]]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import {
|
||||||
grammarUnits,
|
grammarUnits,
|
||||||
psRemove,
|
psRemove,
|
||||||
} from "@lingdocs/pashto-inflector";
|
} from "@lingdocs/pashto-inflector";
|
||||||
|
import { psStringEquals } from "@lingdocs/pashto-inflector/dist/lib/p-text-helpers";
|
||||||
|
|
||||||
export function getPersonFromNP(np: NPSelection): T.Person;
|
export function getPersonFromNP(np: NPSelection): T.Person;
|
||||||
export function getPersonFromNP(np: NPSelection | ObjectNP): T.Person | undefined;
|
export function getPersonFromNP(np: NPSelection | ObjectNP): T.Person | undefined;
|
||||||
|
@ -46,4 +47,12 @@ export function isPerfectTense(t: VerbTense | EquativeTense | PerfectTense): t i
|
||||||
export function isPastTense(tense: VerbTense | PerfectTense): boolean {
|
export function isPastTense(tense: VerbTense | PerfectTense): boolean {
|
||||||
if (isPerfectTense(tense)) return true;
|
if (isPerfectTense(tense)) return true;
|
||||||
return tense.toLowerCase().includes("past");
|
return tense.toLowerCase().includes("past");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function removeDuplicates(psv: T.PsString[]): T.PsString[] {
|
||||||
|
return psv.filter((ps, i, arr) => (
|
||||||
|
i === arr.findIndex(t => (
|
||||||
|
psStringEquals(t, ps)
|
||||||
|
))
|
||||||
|
));
|
||||||
}
|
}
|
Loading…
Reference in New Issue