inflecting adverbs

This commit is contained in:
adueck 2022-11-01 19:30:05 +05:00
parent 3303920b8c
commit 64265e9e20
9 changed files with 45 additions and 29 deletions

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "pashto-inflector", "name": "pashto-inflector",
"version": "5.1.3", "version": "5.1.5",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pashto-inflector", "name": "pashto-inflector",
"version": "5.1.3", "version": "5.1.5",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

View File

@ -1,6 +1,6 @@
{ {
"name": "pashto-inflector", "name": "pashto-inflector",
"version": "5.1.4", "version": "5.1.5",
"author": "lingdocs.com", "author": "lingdocs.com",
"description": "A Pashto inflection and verb conjugation engine, inculding React components for displaying Pashto text, inflections, and conjugations", "description": "A Pashto inflection and verb conjugation engine, inculding React components for displaying Pashto text, inflections, and conjugations",
"homepage": "https://verbs.lingdocs.com", "homepage": "https://verbs.lingdocs.com",

View File

@ -1,6 +1,6 @@
{ {
"name": "@lingdocs/ps-react", "name": "@lingdocs/ps-react",
"version": "5.1.3", "version": "5.1.4",
"description": "Pashto inflector library module with React components", "description": "Pashto inflector library module with React components",
"main": "dist/components/library.js", "main": "dist/components/library.js",
"module": "dist/components/library.js", "module": "dist/components/library.js",

View File

@ -1,6 +1,6 @@
{ {
"name": "@lingdocs/inflect", "name": "@lingdocs/inflect",
"version": "5.1.3", "version": "5.1.4",
"description": "Pashto inflector library", "description": "Pashto inflector library",
"main": "dist/index.js", "main": "dist/index.js",
"types": "dist/lib/library.d.ts", "types": "dist/lib/library.d.ts",

View File

@ -19,7 +19,7 @@ function chooseInflection(inflections: T.UnisexSet<T.InflectionSet>, pers: T.Per
return inflections[gender][infNumber]; return inflections[gender][infNumber];
} }
export function inflectAdjective(a: T.AdjectiveSelection, person: T.Person, inflected: boolean): T.ArrayOneOrMore<T.PsString> { export function inflectAdvAdj(a: T.AdjectiveSelection | T.AdverbSelection, person: T.Person, inflected: boolean): T.ArrayOneOrMore<T.PsString> {
const infs = inflectWord(a.entry); const infs = inflectWord(a.entry);
if (!infs) { if (!infs) {
return [psStringFromEntry(a.entry)]; return [psStringFromEntry(a.entry)];
@ -30,6 +30,10 @@ export function inflectAdjective(a: T.AdjectiveSelection, person: T.Person, infl
return chooseInflection(infs.inflections, person, inflected); return chooseInflection(infs.inflections, person, inflected);
} }
export function inflectAdjective(a: T.AdjectiveSelection, person: T.Person, inflected: boolean): T.ArrayOneOrMore<T.PsString> {
return inflectAdvAdj(a, person, inflected)
}
export function renderAdjectiveSelection(a: T.AdjectiveSelection, person: T.Person, inflected: boolean, isLocationSingSandwich?: boolean): T.Rendered<T.AdjectiveSelection> { export function renderAdjectiveSelection(a: T.AdjectiveSelection, person: T.Person, inflected: boolean, isLocationSingSandwich?: boolean): T.Rendered<T.AdjectiveSelection> {
const eWord = getEnglishWord(a.entry); const eWord = getEnglishWord(a.entry);
const e = !eWord const e = !eWord

View File

@ -1,10 +1,11 @@
import * as T from "../../../types"; import * as T from "../../../types";
import { getEnglishWord } from "../get-english-word"; import { getEnglishWord } from "../get-english-word";
import { psStringFromEntry } from "../p-text-helpers"; import { psStringFromEntry } from "../p-text-helpers";
import { renderAdverbSelection } from "./render-ep"; import { isAdjectiveEntry } from "../type-predicates";
import { inflectAdvAdj } from "./render-adj";
import { renderSandwich } from "./render-sandwich"; import { renderSandwich } from "./render-sandwich";
export function renderAPSelection({ selection }: T.APSelection): T.Rendered<T.APSelection> { export function renderAPSelection({ selection }: T.APSelection, person: T.Person): T.Rendered<T.APSelection> {
if (selection.type === "sandwich") { if (selection.type === "sandwich") {
return { return {
type: "AP", type: "AP",
@ -13,7 +14,7 @@ export function renderAPSelection({ selection }: T.APSelection): T.Rendered<T.AP
} }
return { return {
type: "AP", type: "AP",
selection: renderAdverbSelection(selection), selection: renderAdverbSelection(selection, person),
}; };
} }
@ -32,4 +33,22 @@ export function renderLocativeAdverbSelection({ entry }: T.LocativeAdverbSelecti
person: T.Person.FirstSingMale, person: T.Person.FirstSingMale,
role: "none", role: "none",
}; };
}
export function renderAdverbSelection(a: T.AdverbSelection, person: T.Person): T.Rendered<T.AdverbSelection> {
const ew = getEnglishWord(a.entry);
const e = typeof ew === "object"
? (ew.singular || "")
: !ew
? ""
: ew;
return {
type: "adverb",
entry: a.entry,
ps: isAdjectiveEntry(a.entry)
? inflectAdvAdj(a, person, false)
: [psStringFromEntry(a.entry)],
person,
e,
};
} }

View File

@ -6,8 +6,7 @@ import {
import { renderNPSelection } from "./render-np"; import { renderNPSelection } from "./render-np";
import { getPersonFromVerbForm } from "../misc-helpers"; import { getPersonFromVerbForm } from "../misc-helpers";
import { getVerbBlockPosFromPerson } from "../misc-helpers"; import { getVerbBlockPosFromPerson } from "../misc-helpers";
import { getEnglishWord } from "../get-english-word"; import { renderAdverbSelection } from "./render-ap";
import { psStringFromEntry } from "../p-text-helpers";
import { renderSandwich } from "./render-sandwich"; import { renderSandwich } from "./render-sandwich";
import { EPSBlocksAreComplete, getSubjectSelection, makeBlock, makeKid } from "./blocks-utils"; import { EPSBlocksAreComplete, getSubjectSelection, makeBlock, makeKid } from "./blocks-utils";
import { removeAccentsWLength } from "../accent-helpers"; import { removeAccentsWLength } from "../accent-helpers";
@ -102,12 +101,14 @@ export function getEquativeForm(tense: T.EquativeTense): { hasBa: boolean, form:
} }
function renderEPSBlocks(blocks: T.EPSBlockComplete[]): T.Block[] { function renderEPSBlocks(blocks: T.EPSBlockComplete[]): T.Block[] {
const subject = getSubjectSelection(blocks).selection;
const subjectPerson = getPersonFromNP(subject);
return blocks.map(({ block }): T.Block => { return blocks.map(({ block }): T.Block => {
if (block.type === "AP") { if (block.type === "AP") {
if (block.selection.type === "adverb") { if (block.selection.type === "adverb") {
return makeBlock({ return makeBlock({
type: "AP", type: "AP",
selection: renderAdverbSelection(block.selection), selection: renderAdverbSelection(block.selection, subjectPerson),
}); });
} }
// if (block.selection.type === "sandwich") { // if (block.selection.type === "sandwich") {
@ -135,21 +136,6 @@ function renderEquative(es: T.EquativeSelection, person: T.Person): T.EquativeRe
}; };
} }
export function renderAdverbSelection(a: T.AdverbSelection): T.Rendered<T.AdverbSelection> {
const ew = getEnglishWord(a.entry);
const e = typeof ew === "object"
? (ew.singular || "")
: !ew
? ""
: ew;
return {
type: "adverb",
entry: a.entry,
ps: [psStringFromEntry(a.entry)],
e,
};
}
const equativeBuilders: Record<T.EquativeTense, (p: T.Person, n: boolean) => string[]> = { const equativeBuilders: Record<T.EquativeTense, (p: T.Person, n: boolean) => string[]> = {
present: (p, n) => { present: (p, n) => {
return [ return [

View File

@ -281,12 +281,18 @@ function shrinkServant(np: T.NPSelection): T.MiniPronoun {
}; };
} }
function renderVPBlocks(blocks: T.VPSBlockComplete[], config: { function renderVPBlocks(blocks: T.VPSBlockComplete[], config: {
inflectSubject: boolean, inflectSubject: boolean,
inflectObject: boolean, inflectObject: boolean,
king: "subject" | "object", king: "subject" | "object",
complementPerson: T.Person | undefined, complementPerson: T.Person | undefined,
}): T.Block[] { }): T.Block[] {
const object = getObjectSelection(blocks);
const subject = getSubjectSelection(blocks);
const adverbPerson = typeof object.selection === "object"
? getPersonFromNP(object.selection)
: getPersonFromNP(subject.selection);
return blocks.reduce((blocks, { block }): T.Block[] => { return blocks.reduce((blocks, { block }): T.Block[] => {
if (block.type === "subjectSelection") { if (block.type === "subjectSelection") {
return [ return [
@ -320,7 +326,7 @@ function renderVPBlocks(blocks: T.VPSBlockComplete[], config: {
if (block.type === "AP") { if (block.type === "AP") {
return [ return [
...blocks, ...blocks,
makeBlock(renderAPSelection(block)), makeBlock(renderAPSelection(block, adverbPerson ?? 0)),
]; ];
} }
return [ return [

View File

@ -744,7 +744,7 @@ export type Rendered<
: T extends APSelection : T extends APSelection
? { ? {
type: "AP", type: "AP",
selection: Rendered<APSelection["selection"]> selection: Rendered<APSelection["selection"]>,
} }
: T extends ComplementSelection : T extends ComplementSelection
? { ? {
@ -768,6 +768,7 @@ export type Rendered<
? { ? {
type: "adverb", type: "adverb",
entry: AdverbEntry, entry: AdverbEntry,
person: Person,
ps: PsString[], ps: PsString[],
e?: string, e?: string,
} }