- {createElement(
- `h${hLev}`,
- {
- onClick: props.handleChange,
- className: classNames(
- "clickable",
- extraMargin,
- ),
- },
-
-
- {props.showing ? caretDown : caretRight}
-
- {` `}
- {props.aspect
- ?
- : ""}
-
- {props.label}
-
-
,
- )}
- {props.showing && props.children}
+ }, [parent]);
+ const hLev = Math.min(props.hLevel ? props.hLevel : defaultLevel, 6);
+ const extraMargin =
+ props.hLevel && props.hLevel > indentAfterLevel
+ ? `ml-${props.hLevel - indentAfterLevel + 1}`
+ : "";
+ if (props.ignore) {
+ return <>{props.children}>;
+ }
+ return (
+
+ {createElement(
+ `h${hLev}`,
+ {
+ onClick: props.handleChange,
+ className: classNames("clickable", extraMargin),
+ },
+
+
+ {props.showing ? caretDown : caretRight}
+
+ {` `}
+ {props.aspect ? (
+
+ ) : (
+ ""
+ )}
+
{props.label}
+
+ )}
+ {props.showing && props.children}
+ );
}
-export default Hider;
\ No newline at end of file
+export default Hider;
diff --git a/src/components/src/InlinePs.tsx b/src/components/src/InlinePs.tsx
deleted file mode 100644
index df9ccab..0000000
--- a/src/components/src/InlinePs.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Copyright (c) 2021 lingdocs.com
- *
- * This source code is licensed under the GPL3 license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-
-import Pashto from "./Pashto";
-import Phonetics from "./Phonetics";
-import * as T from "../../types";
-
-function InlinePs ({
- children,
- ps,
- opts,
-}: ({
- ps: T.PsString | (T.PsJSX & { e?: string }),
- children?: T.PsString | (T.PsJSX & { e?: string }),
- opts: T.TextOptions,
-} | {
- ps?: T.PsString | (T.PsJSX & { e?: string }),
- children: T.PsString | (T.PsJSX & { e?: string }),
- opts: T.TextOptions,
-})) {
- const text = children || ps as T.PsString | (T.PsJSX & { e?: string });
- return (
-
- {text}
- {opts.phonetics !== "none" && " - "}
- {text}
- {text.e && ({text.e}) }
-
- );
-}
-
-export default InlinePs;
\ No newline at end of file
diff --git a/src/components/src/PersonSelection.tsx b/src/components/src/PersonSelection.tsx
deleted file mode 100644
index 8ff2d9b..0000000
--- a/src/components/src/PersonSelection.tsx
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Copyright (c) 2021 lingdocs.com
- *
- * This source code is licensed under the GPL3 license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-
-import { persons } from "../../lib/src/grammar-units";
-import InlinePs from "./InlinePs";
-import * as T from "../../types";
-
-function PersonSelect(props: {
- setting: "subject" | "object",
- value: T.Person,
- locked?: boolean,
- handleChange: (person: T.Person) => void,
- handleRandom: () => void,
-}) {
- return (
- !props.locked ?
-
props.handleChange(
- parseInt(e.target.value) as T.Person
- )}
- >
- {persons.map((p) => (
-
- {p.label[props.setting]}
-
- ))}
-
-
-
-
-
-
-
:
- );
-}
-
-function PersonSelection(props: {
- subject: T.Person,
- object: T.Person,
- info: T.NonComboVerbInfo,
- handleRandom: (setting: "subject" | "object") => void,
- handleChange: (payload: { setting: "subject" | "object", person: T.Person }) => void,
- textOptions: T.TextOptions,
-}) {
- function getComp(comp: T.ObjComplement) {
- const c = comp.plural
- ? comp.plural
- : comp.entry;
- return
{c} ;
- }
- return (
-
-
-
- {/* TODO: Should I put the Subject/Agent label back in for non-transitive verbs?? */}
- Subject
-
-
props.handleChange({ setting: "subject", person })}
- handleRandom={() => props.handleRandom("subject")}
- />
-
- {(props.info.type === "dynamic compound" || props.info.type === "generative stative compound") ?
-
Object is the complement ({getComp(props.info.objComplement)})
-
props.handleChange({ setting: "object", person })}
- handleRandom={() => props.handleRandom("object")}
- />
- : props.info.transitivity === "transitive" ?
-
Object
-
props.handleChange({ setting: "object", person })}
- handleRandom={() => props.handleRandom("object")}
- />
- : props.info.transitivity === "grammatically transitive" ?
-
Object is unspoken
-
props.handleChange({ setting: "object", person })}
- handleRandom={() => props.handleRandom("object")}
- />
- : null}
-
- );
-}
-
-export default PersonSelection;
\ No newline at end of file
diff --git a/src/components/src/Phonetics.tsx b/src/components/src/Phonetics.tsx
deleted file mode 100644
index d44864b..0000000
--- a/src/components/src/Phonetics.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Copyright (c) 2021 lingdocs.com
- *
- * This source code is licensed under the GPL3 license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-
-import {
- translatePhonetics,
-} from "../../lib/src/translate-phonetics";
-import { psJSXMap } from "./jsx-map";
-import * as T from "../../types";
-
-const Phonetics = ({ opts, children: text }: {
- opts: T.TextOptions,
- children: T.PsJSX | T.PsString | string,
-}) => {
- if (opts.phonetics === "none") {
- return null;
- }
- const handleText = (f: string) => (
- opts.phonetics === "lingdocs"
- ? f
- : translatePhonetics(f, {
- dialect: opts.dialect,
- // @ts-ignore - weird TS not picking up the elimination of "none herre"
- system: opts.phonetics,
- })
- );
- return
- {(typeof text !== "string" && typeof text.f !== "string")
- ? psJSXMap(text as T.PsJSX, "f", ({f}) => handleText(f))
- : handleText(typeof text === "string" ? text : text.f as string)}
-
-};
-
-export default Phonetics;
diff --git a/src/components/src/RenderedBlocksDisplay.tsx b/src/components/src/RenderedBlocksDisplay.tsx
deleted file mode 100644
index 2dde1f8..0000000
--- a/src/components/src/RenderedBlocksDisplay.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { useState } from "react";
-import { filterForVisibleBlocksEP, filterForVisibleBlocksVP } from "../../lib/src/phrase-building/compile";
-import * as T from "../../types";
-import Block from "./blocks/Block";
-import KidDisplay from "./blocks/KidDisplay";
-
-function RenderedBlocksDisplay({ opts, rendered, justify, script }: {
- script: "p" | "f",
- opts: T.TextOptions,
- rendered: T.EPRendered | T.VPRendered,
- justify?: "left" | "right" | "center",
-}) {
- const [variation, setVariation] = useState
(0);
- // not using autoAnimate here because we need a way to persist the keys in the blocks first
- // const parent = useRef(null);
- // useEffect(() => {
- // parent.current && autoAnimate(parent.current)
- // }, [parent]);
- const blocksWVars: T.Block[][] = Array.isArray(rendered)
- ? rendered
- : ("omitSubject" in rendered)
- ? filterForVisibleBlocksEP(rendered.blocks, rendered.omitSubject)
- : filterForVisibleBlocksVP(rendered.blocks, rendered.form, rendered.king);
- const king = "king" in rendered ? rendered.king : undefined;
- const blocks = blocksWVars[variation];
- function handleVariationChange() {
- setVariation(ov => ((ov + 1) % blocksWVars.length));
- }
- return
-
-
-
-
-
- {blocks.slice(1).map((block) => (
-
-
-
- ))}
-
- {blocksWVars.length > 1 && V. {variation + 1}/{blocksWVars.length} }
-
-
-
-}
-
-function KidsSection({ opts, kids, script }: {
- opts: T.TextOptions,
- kids: T.Kid[],
- script: "p" | "f",
-}) {
- // not using autoAnimate here because we need a way to persist the keys in the blocks first
- // const parent = useRef(null);
- // useEffect(() => {
- // parent.current && autoAnimate(parent.current)
- // }, [parent]);
- return kids.length > 0 ?
-
- {kids.map(kid => (
-
- ))}
-
-
kids
-
: null;
-}
-
-export default RenderedBlocksDisplay;
\ No newline at end of file
diff --git a/src/components/src/SingleItemDisplay.tsx b/src/components/src/SingleItemDisplay.tsx
deleted file mode 100644
index 530bcb6..0000000
--- a/src/components/src/SingleItemDisplay.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright (c) 2021 lingdocs.com
- *
- * This source code is licensed under the GPL3 license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-
-import Pashto from "./Pashto";
-import Phonetics from "./Phonetics";
-import * as T from "../../types";
-
-function SingleItemDisplay({ item, textOptions, english }: {
- item: T.PsString,
- textOptions: T.TextOptions,
- english?: T.EnglishBlock | string,
-}) {
- const eng = Array.isArray(english) ? english[0][0] : english;
- return ;
-}
-
-export default SingleItemDisplay;
\ No newline at end of file
diff --git a/src/components/src/VerbFormDisplay.tsx b/src/components/src/VerbFormDisplay.tsx
index 9e1e730..0a9408d 100644
--- a/src/components/src/VerbFormDisplay.tsx
+++ b/src/components/src/VerbFormDisplay.tsx
@@ -7,11 +7,11 @@
*/
import { useEffect, useState } from "react";
-import PersonInfsPicker from "./PersInfsPicker";
-import InflectionsTable from "./InflectionsTable";
-import SingleItemDisplay from "./SingleItemDisplay";
-import ButtonSelect from "./ButtonSelect";
-import VerbTable from "./VerbTable";
+import PersonInfsPicker from "./selects/PersInfsPicker";
+import InflectionsTable from "./tables/InflectionsTable";
+import SingleItemDisplay from "./text-display/SingleItemDisplay";
+import ButtonSelect from "./selects/ButtonSelect";
+import VerbTable from "./tables/VerbTable";
import {
getEnglishPersonInfo,
isSentenceForm,
diff --git a/src/components/src/VerbTable.tsx b/src/components/src/VerbTable.tsx
deleted file mode 100644
index de74967..0000000
--- a/src/components/src/VerbTable.tsx
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * Copyright (c) 2021 lingdocs.com
- *
- * This source code is licensed under the GPL3 license found in the
- * LICENSE file in the root directory of this source tree.
- *
- */
-
-import TableCell from "./TableCell";
-import {
- psStringEquals,
- isAllOne,
- addEnglish,
-} from "../../lib/src/p-text-helpers";
-import { isSentenceForm } from "../../lib/src/misc-helpers";
-import * as T from "../../types";
-import genderColors from "./gender-colors";
-
-const genderAbbrev = (gender: "masc" | "fem" | undefined): " m." | " f." | "" => (
- gender === "masc"
- ? " m."
- : gender === "fem"
- ? " f."
- : ""
-);
-
-const minifyTableGender = (block: T.VerbBlock | T.ImperativeBlock): Array => {
- // @ts-ignore
- return block.reduce((table, person, i, src) => {
- const isFem = i % 2 !== 0;
- if (isFem) {
- return table;
- }
- const femPersAhead = src[i+1];
- const femPersIsTheSame = (
- psStringEquals(person[0][0], femPersAhead[0][0]) &&
- psStringEquals(person[1][0], femPersAhead[1][0])
- );
- if (femPersAhead && !femPersIsTheSame) {
- return [...table, {
- masc: person,
- fem: femPersAhead,
- }];
- }
- return [...table, person];
- }, []);
-};
-
-function VerbTable({ block, textOptions, english }: {
- block: T.VerbBlock | T.ImperativeBlock | T.ArrayOneOrMore,
- english?: T.EnglishBlock | string,
- textOptions: T.TextOptions,
-}) {
- const blockWEng = english ? addEnglish(english, block) : block;
- if (isSentenceForm(blockWEng) || isAllOne(blockWEng as T.VerbBlock | T.ImperativeBlock)) {
- const item = isSentenceForm(blockWEng)
- ? block as unknown as T.ArrayOneOrMore
- : (() => {
- const b = block as T.ImperativeBlock | T.VerbBlock
- return b[0][0];
- })();
- return
- }
- const bl = blockWEng as T.VerbBlock | T.ImperativeBlock;
- const b = minifyTableGender(bl);
- return
-
-
- Pers.
- Singular
- Plural
-
-
-
- {b.reduce((rows: React.ReactNode[], person, i, arr) => {
- function drawRow({ line, gender }: { line: T.PersonLine, gender?: "masc" | "fem" }) {
- const pers = arr.length > 1 ? ["1st", "2nd", "3rd"] : ["2nd"];
- const rowLabel = `${pers[i]}${genderAbbrev(gender)}`;
- const color = !gender
- ? "inherit"
- : genderColors[gender];
- return (
-
- {rowLabel}
-
-
-
- );
- }
- return "masc" in person
- ? [
- ...rows,
- drawRow({ line: person.masc, gender: "masc" }),
- drawRow({ line: person.fem, gender: "fem" }),
- ]
- : [...rows, drawRow({ line: person })];
- }, [])}
-
-
-}
-
-export default VerbTable;
\ No newline at end of file
diff --git a/src/components/src/ap-picker/AdverbPicker.tsx b/src/components/src/ap-picker/AdverbPicker.tsx
deleted file mode 100644
index 99cc745..0000000
--- a/src/components/src/ap-picker/AdverbPicker.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { makeAdverbSelection } from "../../../lib/src/phrase-building/make-selections";
-import * as T from "../../../types";
-import EntrySelect from "../EntrySelect";
-
-function AdverbPicker(props: {
- entryFeeder: T.EntryFeederSingleType,
- adjective: T.AdverbSelection | undefined,
- onChange: (p: T.AdverbSelection | undefined) => void,
- opts: T.TextOptions,
-}) {
- function onEntrySelect(entry: T.AdverbEntry | undefined) {
- if (!entry) {
- return props.onChange(undefined);
- }
- props.onChange(makeAdverbSelection(entry));
- }
- return ;
-}
-
-export default AdverbPicker;
\ No newline at end of file
diff --git a/src/components/src/ap-picker/APPicker.tsx b/src/components/src/block-pickers/APPicker.tsx
similarity index 98%
rename from src/components/src/ap-picker/APPicker.tsx
rename to src/components/src/block-pickers/APPicker.tsx
index d220ec4..51eaaca 100644
--- a/src/components/src/ap-picker/APPicker.tsx
+++ b/src/components/src/block-pickers/APPicker.tsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
import * as T from "../../../types";
-import SandwichPicker from "../np-picker/SandwichPicker";
+import SandwichPicker from "../block-pickers/SandwichPicker";
import AdverbPicker from "./AdverbPicker";
type APType = "adverb" | "sandwich";
const types: APType[] = ["adverb", "sandwich"];
diff --git a/src/components/src/np-picker/AdjectiveManager.tsx b/src/components/src/block-pickers/AdjectiveManager.tsx
similarity index 100%
rename from src/components/src/np-picker/AdjectiveManager.tsx
rename to src/components/src/block-pickers/AdjectiveManager.tsx
diff --git a/src/components/src/np-picker/AdjectivePicker.tsx b/src/components/src/block-pickers/AdjectivePicker.tsx
similarity index 98%
rename from src/components/src/np-picker/AdjectivePicker.tsx
rename to src/components/src/block-pickers/AdjectivePicker.tsx
index cad2ed0..06f3945 100644
--- a/src/components/src/np-picker/AdjectivePicker.tsx
+++ b/src/components/src/block-pickers/AdjectivePicker.tsx
@@ -1,7 +1,7 @@
import { useState } from "react";
import { makeAdjectiveSelection } from "../../../lib/src/phrase-building/make-selections";
import * as T from "../../../types";
-import EntrySelect from "../EntrySelect";
+import EntrySelect from "../selects/EntrySelect";
import SandwichPicker from "./SandwichPicker";
function AdjectivePicker(props: {
diff --git a/src/components/src/block-pickers/AdverbPicker.tsx b/src/components/src/block-pickers/AdverbPicker.tsx
new file mode 100644
index 0000000..5ef1f5c
--- /dev/null
+++ b/src/components/src/block-pickers/AdverbPicker.tsx
@@ -0,0 +1,33 @@
+import { makeAdverbSelection } from "../../../lib/src/phrase-building/make-selections";
+import * as T from "../../../types";
+import EntrySelect from "../selects/EntrySelect";
+
+function AdverbPicker(props: {
+ entryFeeder: T.EntryFeederSingleType;
+ adjective: T.AdverbSelection | undefined;
+ onChange: (p: T.AdverbSelection | undefined) => void;
+ opts: T.TextOptions;
+}) {
+ function onEntrySelect(entry: T.AdverbEntry | undefined) {
+ if (!entry) {
+ return props.onChange(undefined);
+ }
+ props.onChange(makeAdverbSelection(entry));
+ }
+ return (
+
+ );
+}
+
+export default AdverbPicker;
diff --git a/src/components/src/ComplementPicker.tsx b/src/components/src/block-pickers/ComplementPicker.tsx
similarity index 94%
rename from src/components/src/ComplementPicker.tsx
rename to src/components/src/block-pickers/ComplementPicker.tsx
index 5ce4d25..458b9e4 100644
--- a/src/components/src/ComplementPicker.tsx
+++ b/src/components/src/block-pickers/ComplementPicker.tsx
@@ -1,8 +1,8 @@
import { useState, useEffect } from "react";
-import * as T from "../../types";
-import AdjectivePicker from "./np-picker/AdjectivePicker";
-import LocativeAdverbPicker from "./ep-explorer/eq-comp-picker/LocativeAdverbPicker";
-import SandwichPicker from "./np-picker/SandwichPicker";
+import * as T from "../../../types";
+import AdjectivePicker from "./AdjectivePicker";
+import LocativeAdverbPicker from "./LocativeAdverbPicker";
+import SandwichPicker from "./SandwichPicker";
const compTypes: T.ComplementType[] = [
"adjective",
"loc. adv.",
diff --git a/src/components/src/np-picker/DeterminersPicker.tsx b/src/components/src/block-pickers/DeterminersPicker.tsx
similarity index 98%
rename from src/components/src/np-picker/DeterminersPicker.tsx
rename to src/components/src/block-pickers/DeterminersPicker.tsx
index 90c0125..54c11aa 100644
--- a/src/components/src/np-picker/DeterminersPicker.tsx
+++ b/src/components/src/block-pickers/DeterminersPicker.tsx
@@ -1,5 +1,5 @@
import * as T from "../../../types";
-import { DeterminerSelect } from "../EntrySelect";
+import { DeterminerSelect } from "../selects/EntrySelect";
export default function DeterminersPicker({
determiners,
diff --git a/src/components/src/block-pickers/LocativeAdverbPicker.tsx b/src/components/src/block-pickers/LocativeAdverbPicker.tsx
new file mode 100644
index 0000000..7a84987
--- /dev/null
+++ b/src/components/src/block-pickers/LocativeAdverbPicker.tsx
@@ -0,0 +1,33 @@
+import { makeLocativeAdverbSelection } from "../../../lib/src/phrase-building/make-selections";
+import * as T from "../../../types";
+import EntrySelect from "../selects/EntrySelect";
+
+function LocativeAdverbPicker(props: {
+ entryFeeder: T.EntryFeederSingleType;
+ adjective: T.LocativeAdverbSelection | undefined;
+ onChange: (p: T.LocativeAdverbSelection | undefined) => void;
+ opts: T.TextOptions;
+}) {
+ function onEntrySelect(entry: T.LocativeAdverbEntry | undefined) {
+ if (!entry) {
+ return props.onChange(undefined);
+ }
+ props.onChange(makeLocativeAdverbSelection(entry));
+ }
+ return (
+
+
Locative Adverb
+
+
+
+
+ );
+}
+
+export default LocativeAdverbPicker;
diff --git a/src/components/src/np-picker/NPNounPicker.tsx b/src/components/src/block-pickers/NPNounPicker.tsx
similarity index 96%
rename from src/components/src/np-picker/NPNounPicker.tsx
rename to src/components/src/block-pickers/NPNounPicker.tsx
index b7fd350..37b77bf 100644
--- a/src/components/src/np-picker/NPNounPicker.tsx
+++ b/src/components/src/block-pickers/NPNounPicker.tsx
@@ -1,10 +1,10 @@
import { makeNounSelection } from "../../../lib/src/phrase-building/make-selections";
import * as T from "../../../types";
-import ButtonSelect from "../ButtonSelect";
-import InlinePs from "../InlinePs";
+import ButtonSelect from "../selects/ButtonSelect";
+import InlinePs from "../text-display/InlinePs";
// import { isFemNounEntry, isPattern1Entry, isPattern2Entry, isPattern3Entry, isPattern4Entry, isPattern5Entry, isPattern6FemEntry } from "../../lib/type-predicates";
-import EntrySelect from "../EntrySelect";
+import EntrySelect from "../selects/EntrySelect";
import AdjectiveManager from "./AdjectiveManager";
import { useState } from "react";
import DeterminersPicker from "./DeterminersPicker";
@@ -192,9 +192,10 @@ function NPNounPicker(props: {
Compound: