From fa0130539331f934f8c8526cb7523738edc78d72 Mon Sep 17 00:00:00 2001 From: lingdocs <71590811+lingdocs@users.noreply.github.com> Date: Wed, 2 Mar 2022 16:41:47 +0400 Subject: [PATCH] pronoun picker with subjObj combos --- src/components/np-picker/PronounPicker.tsx | 15 +++- src/content/practice-tools/pronoun-picker.mdx | 71 +++++++++++++++---- src/lib/np-tools.ts | 32 ++++++++- 3 files changed, 100 insertions(+), 18 deletions(-) diff --git a/src/components/np-picker/PronounPicker.tsx b/src/components/np-picker/PronounPicker.tsx index 9b24390..3ca9dd8 100644 --- a/src/components/np-picker/PronounPicker.tsx +++ b/src/components/np-picker/PronounPicker.tsx @@ -20,6 +20,11 @@ const labels = { ["You", "You pl."], [{ masc: "He/It", fem: "She/It"}, "They"], ], + eObject: [ + ["I", "Us"], + ["You", "You pl."], + [{ masc: "Him/It", fem: "Her/It"}, "Them"], + ], p: { far: [ ["زه", "مونږ"], @@ -50,7 +55,11 @@ function pickerStateToPerson(s: PickerState): T.Person { + (6 * s.col); } -function PronounPicker({ onChange, pronoun }: { pronoun: Pronoun, onChange: (p: Pronoun) => void }) { +function PronounPicker({ onChange, pronoun, isObject }: { + pronoun: Pronoun, + onChange: (p: Pronoun) => void, + isObject?: boolean, +}) { const [display, setDisplay] = useStickyState<"persons" | "p" | "e">("persons", "prounoun-picker-display"); const p = personToPickerState(pronoun.person); @@ -87,7 +96,7 @@ function PronounPicker({ onChange, pronoun }: { pronoun: Pronoun, onChange: (p: : "persons"; setDisplay(newPerson); } - const prs = labels[display]; + const prs = labels[(display === "e" && isObject) ? "eObject" : display]; const pSpec = "near" in prs ? prs[pronoun.pronounType] : prs; return
@@ -100,7 +109,7 @@ function PronounPicker({ onChange, pronoun }: { pronoun: Pronoun, onChange: (p: value={pronoun.pronounType} handleChange={(g) => handlePronounTypeChange(g as "far" | "near")} /> - +
diff --git a/src/content/practice-tools/pronoun-picker.mdx b/src/content/practice-tools/pronoun-picker.mdx index 168f358..9c5c3a1 100644 --- a/src/content/practice-tools/pronoun-picker.mdx +++ b/src/content/practice-tools/pronoun-picker.mdx @@ -6,24 +6,72 @@ import PronounPicker from "../../components/np-picker/PronounPicker"; import { defaultTextOptions as opts, InlinePs, + ButtonSelect, } from "@lingdocs/pashto-inflector"; import { useState } from "react"; import { randomPerson, + randomSubjObj, } from "../../lib/np-tools"; export function RPicker() { - const [pronoun, setPronoun] = useState({ type: "pronoun", pronounType: "far", person: randomPerson() }); + const startSubjObj = randomSubjObj(); + const [subject, setSubject] = useState({ type: "pronoun", pronounType: "far", person: startSubjObj.subj }); + const [object, setObject] = useState({ type: "pronoun", pronounType: "far", person: startSubjObj.obj }); + const [mode, setMode] = useState("single"); + function setRandomSubjObj() { + const { subj, obj } = randomSubjObj(); + setSubject(s => ({ + ...s, + person: subj, + })); + setObject(s => ({ + ...s, + person: obj, + })); + } function handleRandom() { - const person = randomPerson(pronoun.person); - setPronoun({ - ...pronoun, - person, - }); + if (mode === "single") { + const person = randomPerson(subject.person); + setSubject(s => ({ + ...s, + person, + })); + } else { + setRandomSubjObj(); + } + } + function handleModeChange(m) { + if (m === "subjObj") { + setRandomSubjObj(); + } + setMode(m); } return
-
- +
+ +
+
+
+ {mode === "subjObj" &&
Subject
} + +
+ {mode === "subjObj" && +
+
Object
+ +
+ }
diff --git a/src/lib/np-tools.ts b/src/lib/np-tools.ts index 84d058a..7ce1c0b 100644 --- a/src/lib/np-tools.ts +++ b/src/lib/np-tools.ts @@ -11,14 +11,44 @@ import { psStringFromEntry, } from "./text-tools"; +function getRandPers(): T.Person { + return Math.floor(Math.random() * 12); +} + export function randomPerson(p?: T.Person) { let newP = 0; do { - newP = Math.floor(Math.random() * 12); + newP = getRandPers(); } while (newP === p); return newP; } +function isInvalidSubjObjCombo(subj: T.Person, obj: T.Person): boolean { + // subject is first person + if ([0, 1, 6, 7].includes(subj)) { + return [0, 1, 6, 7].includes(obj); + } + // subject is second person + if ([2, 3, 8, 9].includes(subj)) { + return [2, 3, 8, 9].includes(obj); + } + return false; +} + +export function randomSubjObj(old?: { subj: T.Person, obj: T.Person }): { subj: T.Person, obj: T.Person } { + let subj = 0; + let obj = 0; + do { + subj = getRandPers(); + obj = getRandPers(); + } while ( + (old && ((old.subj === subj) || (old.obj === obj))) + || + isInvalidSubjObjCombo(subj, obj) + ); + return { subj, obj }; +} + export function personFromNP(np: NounPhrase): T.Person { if (np.type === "participle") { return T.Person.ThirdPlurMale;