fix up phrase builder, accent issue, and issue w catorgorize skipping the loc. adv. etc
This commit is contained in:
parent
9236bad240
commit
c6ef12b451
|
@ -1,16 +0,0 @@
|
|||
import {
|
||||
Types as T,
|
||||
EPExplorer,
|
||||
} from "@lingdocs/pashto-inflector";
|
||||
import entryFeeder from "../lib/entry-feeder";
|
||||
|
||||
function EPBuilder({ opts }: { opts: T.TextOptions }) {
|
||||
return <div className="mb-4">
|
||||
<EPExplorer
|
||||
entryFeeder={entryFeeder}
|
||||
opts={opts}
|
||||
/>
|
||||
</div>;
|
||||
}
|
||||
|
||||
export default EPBuilder;
|
|
@ -0,0 +1,76 @@
|
|||
import { useStickyState } from "@lingdocs/pashto-inflector";
|
||||
import {
|
||||
Types as T,
|
||||
ButtonSelect,
|
||||
EPExplorer,
|
||||
defaultTextOptions as opts,
|
||||
EntrySelect,
|
||||
VPExplorer,
|
||||
} from "@lingdocs/pashto-inflector";
|
||||
import { useEffect } from "react";
|
||||
import entryFeeder from "../lib/entry-feeder";
|
||||
|
||||
function PhraseBuilder() {
|
||||
const [type, setType] = useStickyState<"EP" | "VP">("VP", "phraseBuilderType");
|
||||
const [entry, setEntry] = useStickyState<T.VerbEntry | undefined>(
|
||||
undefined,
|
||||
"vEntrySelect",
|
||||
);
|
||||
useEffect(() => {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const vp = params.get("vp");
|
||||
const ep = params.get("ep");
|
||||
if (vp) {
|
||||
setType("VP");
|
||||
} else if (ep) {
|
||||
setType("EP");
|
||||
}
|
||||
}, [setType]);
|
||||
return <div style={{ maxWidth: "1250px", margin: "0 auto 200px auto" }}>
|
||||
<div className="text-center mb-3 mt-3">
|
||||
<ButtonSelect
|
||||
options={[
|
||||
{ label: "Verb Phrase", value: "VP" },
|
||||
{ label: "Equative Phrase", value: "EP" },
|
||||
]}
|
||||
value={type}
|
||||
handleChange={setType}
|
||||
/>
|
||||
</div>
|
||||
{type === "EP" ? <div>
|
||||
<h3 className="mb-4">Equative Phrase Builder</h3>
|
||||
<EPExplorer
|
||||
opts={opts}
|
||||
entryFeeder={entryFeeder}
|
||||
/>
|
||||
</div>
|
||||
: <div>
|
||||
<h3 className="mb-4">Verb Phrase Builder</h3>
|
||||
<div style={{ maxWidth: "300px" }}>
|
||||
<div className="h5">Verb:</div>
|
||||
<EntrySelect
|
||||
value={entry}
|
||||
onChange={setEntry}
|
||||
entryFeeder={entryFeeder.verbs}
|
||||
opts={opts}
|
||||
isVerbSelect
|
||||
name="Verb"
|
||||
/>
|
||||
</div>
|
||||
<div style={{ margin: "0 auto" }}>
|
||||
{entry
|
||||
? <VPExplorer
|
||||
verb={entry}
|
||||
opts={opts}
|
||||
entryFeeder={entryFeeder}
|
||||
handleLinkClick="none"
|
||||
/>
|
||||
: <div className="lead">
|
||||
Choose a verb to start building
|
||||
</div>}
|
||||
</div>
|
||||
</div>}
|
||||
</div>
|
||||
}
|
||||
|
||||
export default PhraseBuilder;
|
|
@ -1,40 +0,0 @@
|
|||
import {
|
||||
defaultTextOptions,
|
||||
VPExplorer,
|
||||
EntrySelect,
|
||||
Types as T,
|
||||
} from "@lingdocs/pashto-inflector";
|
||||
import { useStickyState } from "@lingdocs/pashto-inflector";
|
||||
import entryFeeder from "../lib/entry-feeder";
|
||||
|
||||
function VPBuilder() {
|
||||
const [entry, setEntry] = useStickyState<T.VerbEntry | undefined>(undefined, "vEntrySelect");
|
||||
return <div>
|
||||
<div style={{ maxWidth: "300px" }}>
|
||||
<div className="h5">Verb:</div>
|
||||
<EntrySelect
|
||||
value={entry}
|
||||
onChange={setEntry}
|
||||
entryFeeder={entryFeeder.verbs}
|
||||
opts={defaultTextOptions}
|
||||
isVerbSelect
|
||||
name="Verb"
|
||||
/>
|
||||
</div>
|
||||
<div style={{ margin: "0 auto" }}>
|
||||
{entry
|
||||
? <VPExplorer
|
||||
verb={entry}
|
||||
opts={defaultTextOptions}
|
||||
entryFeeder={entryFeeder}
|
||||
handleLinkClick="none"
|
||||
/>
|
||||
: <div className="lead">
|
||||
Choose a verb to start building
|
||||
</div>}
|
||||
</div>
|
||||
</div>;
|
||||
|
||||
}
|
||||
|
||||
export default VPBuilder;
|
|
@ -1,11 +0,0 @@
|
|||
---
|
||||
title: Equative Explorer 🌎
|
||||
fullWidth: true
|
||||
---
|
||||
|
||||
import {
|
||||
defaultTextOptions,
|
||||
} from "@lingdocs/pashto-inflector";
|
||||
import EPBuilder from "../../components/EPBuilder";
|
||||
|
||||
<EPBuilder opts={defaultTextOptions} />
|
|
@ -557,3 +557,7 @@ This is used to talk about:
|
|||
<h5>8. <Link to="/equatives/other-equatives/#would-have-been-equative">"Would have been" Equative</Link></h5>
|
||||
|
||||
- (given some hypothetical condition) A would have been B
|
||||
|
||||
<hr />
|
||||
|
||||
You can explore how all the equatives by browsing the charts and building equative phrases in the <Link to="/phrase-builder">phrase builder</Link>.
|
|
@ -16,8 +16,6 @@ import * as presentEquative from "!babel-loader!@lingdocs/mdx-loader!./equatives
|
|||
import * as habitualEquative from "!babel-loader!@lingdocs/mdx-loader!./equatives/habitual-equative.mdx";
|
||||
// @ts-ignore
|
||||
import * as otherEquatives from "!babel-loader!@lingdocs/mdx-loader!./equatives/other-equatives.mdx";
|
||||
// @ts-ignore
|
||||
import * as equativeExplorer from "!babel-loader!@lingdocs/mdx-loader!./equatives/equative-explorer.mdx";
|
||||
|
||||
// @ts-ignore
|
||||
import * as nounsGender from "!babel-loader!@lingdocs/mdx-loader!./nouns/nouns-gender.mdx";
|
||||
|
@ -123,7 +121,7 @@ import * as games from "!babel-loader!@lingdocs/mdx-loader!./games.mdx";
|
|||
// @ts-ignore
|
||||
import * as pronounPicker from "!babel-loader!@lingdocs/mdx-loader!./practice-tools/pronoun-picker.mdx";
|
||||
// @ts-ignore
|
||||
import * as phraseBuilder from "!babel-loader!@lingdocs/mdx-loader!./practice-tools/phrase-builder.mdx";
|
||||
import * as phraseBuilder from "!babel-loader!@lingdocs/mdx-loader!./phrase-builder.mdx";
|
||||
|
||||
type ChapterSection = {
|
||||
import: any,
|
||||
|
@ -144,6 +142,10 @@ const contentTree: (ChapterSection | ChaptersSection)[] = [
|
|||
import: games,
|
||||
slug: "games",
|
||||
},
|
||||
{
|
||||
import: phraseBuilder,
|
||||
slug: "phrase-builder",
|
||||
},
|
||||
{
|
||||
heading: "Equatives",
|
||||
subdirectory: "equatives",
|
||||
|
@ -160,10 +162,6 @@ const contentTree: (ChapterSection | ChaptersSection)[] = [
|
|||
import: otherEquatives,
|
||||
slug: "other-equatives",
|
||||
},
|
||||
{
|
||||
import: equativeExplorer,
|
||||
slug: "equative-explorer",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: Phrase Builder
|
||||
fullWidth: true
|
||||
---
|
||||
|
||||
import PhraseBuilder from "../components/PhraseBuilder";
|
||||
|
||||
<p className="small mb-4">To build phrases with a full dictionary of words, see the phrase builder included in the <a href="https://dictionary.lingdocs.com">LingDocs Pashto Dictionary</a>.</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<PhraseBuilder />
|
|
@ -1,8 +0,0 @@
|
|||
---
|
||||
title: Phrase Builder
|
||||
fullWidth: true
|
||||
---
|
||||
|
||||
import VPBuilder from "../../components/VPBuilder";
|
||||
|
||||
<VPBuilder />
|
|
@ -62,15 +62,16 @@ export function categorize<I, X extends Record<string, I[]>>(
|
|||
// go through each item in the array and add it to the category based on
|
||||
// the first predicate it matches
|
||||
arr.forEach((item) => {
|
||||
let placed: boolean = false;
|
||||
for (const p of Object.keys(preds)) {
|
||||
// @ts-ignore
|
||||
if ((preds[p] !== "leftovers") && preds[p](item)) {
|
||||
o[p].push(item);
|
||||
return;
|
||||
placed = true;
|
||||
}
|
||||
}
|
||||
// doesn't fit a predicate, add it to the leftovers
|
||||
if (leftoverKey) {
|
||||
if (!placed && leftoverKey) {
|
||||
o[leftoverKey].push(item);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -7,6 +7,8 @@ import {
|
|||
adverbs,
|
||||
} from "../words/words";
|
||||
|
||||
console.log({ locativeAdverbs });
|
||||
|
||||
const entryFeeder: T.EntryFeeder = {
|
||||
nouns,
|
||||
verbs,
|
||||
|
|
|
@ -6,6 +6,7 @@ import {
|
|||
standardizePhonetics,
|
||||
flattenLengths,
|
||||
} from "@lingdocs/pashto-inflector";
|
||||
import { removeAShort } from "./misc-helpers";
|
||||
|
||||
export function getPercentageDone(current: number, total: number): number {
|
||||
return Math.round(
|
||||
|
@ -22,12 +23,14 @@ export function getPercentageDone(current: number, total: number): number {
|
|||
* @param answer - the correct answer in phonetics
|
||||
*/
|
||||
export function compareF(input: string, answer: string): boolean {
|
||||
return input === (hasAccents(input) ? answer : removeAccents(answer));
|
||||
const inp = removeAShort(input);
|
||||
const ans = removeAShort(answer);
|
||||
return inp === (hasAccents(inp) ? ans : removeAccents(ans));
|
||||
}
|
||||
|
||||
export function comparePs(input: string, answer: T.SingleOrLengthOpts<T.PsString | T.PsString[]>): boolean {
|
||||
if ("long" in answer) {
|
||||
return comparePs(input, flattenLengths(answer))
|
||||
return comparePs(input, flattenLengths(answer));
|
||||
}
|
||||
if (Array.isArray(answer)) {
|
||||
return answer.some(a => comparePs(input, a));
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
/**
|
||||
* Removes ă and replaces with a
|
||||
*/
|
||||
export function removeAShort(s: string): string {
|
||||
return s.replace(/ă/g, "a");
|
||||
}
|
|
@ -33,7 +33,7 @@ const content: {
|
|||
title: "Experiment with the Phrase Builder 🧪",
|
||||
subTitle: "Interactive Phrase Structure Analysis",
|
||||
description: "Build your own phrases in the interactive phrase builder. See how the words change and interact as you explore different tenses and forms.",
|
||||
link: "/practice-tools/phrase-builder/",
|
||||
link: "/phrase-builder/",
|
||||
linkDescription: "Phrase Builder",
|
||||
},
|
||||
];
|
||||
|
|
|
@ -6,6 +6,7 @@ import {
|
|||
Types as T,
|
||||
} from "@lingdocs/pashto-inflector";
|
||||
import { categorize } from "../lib/categorize";
|
||||
import { removeAShort } from "../lib/misc-helpers";
|
||||
|
||||
|
||||
// TODO: BIG ISSUE WITH THE LOC ADVERBS BEING LUMPED INTO THE ADVERBS!
|
||||
|
@ -36,6 +37,9 @@ export function wordQuery(
|
|||
category: "nouns" | "adjectives" | "adverbs" | "locativeAdverbs" | "verbs",
|
||||
w: string[],
|
||||
): T.NounEntry[] | T.AdjectiveEntry[] | T.AdverbEntry[] | T.LocativeAdverbEntry[] | T.VerbEntry[] {
|
||||
function queryRemoveAccents(s: string): string {
|
||||
return removeAShort(removeAccents(s));
|
||||
}
|
||||
if (category === "verbs") {
|
||||
return w.map(word => {
|
||||
const l = words[category];
|
||||
|
@ -46,11 +50,11 @@ export function wordQuery(
|
|||
}
|
||||
function vMatches(x: T.VerbEntry, y: string) {
|
||||
return (y === x.entry.p)
|
||||
|| (removeAccents(y) === removeAccents(removeFVarients(x.entry.f)));
|
||||
|| (queryRemoveAccents(y) === queryRemoveAccents(removeFVarients(x.entry.f)));
|
||||
}
|
||||
function wMatches(x: T.DictionaryEntry, y: string) {
|
||||
return (y === x.p)
|
||||
|| (removeAccents(y) === removeAccents(removeFVarients(x.f)));
|
||||
|| (queryRemoveAccents(y) === queryRemoveAccents(removeFVarients(x.f)));
|
||||
}
|
||||
return w.map(word => {
|
||||
const l = words[category];
|
||||
|
|
Loading…
Reference in New Issue