Skip to content

Commit 6cd5db5

Browse files
committed
implement preverb translation
1 parent 2758f28 commit 6cd5db5

File tree

2 files changed

+90
-8
lines changed

2 files changed

+90
-8
lines changed

src/translator/phrase.ts

Lines changed: 89 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ import {
1010
import { extractNegativeFromMultipleAdverbs, NOT } from "./adverb.ts";
1111
import * as English from "./ast.ts";
1212
import { getNumber } from "./determiner.ts";
13-
import {
14-
ExhaustedError,
15-
FilteredError,
16-
TranslationTodoError,
17-
UntranslatableError,
18-
} from "./error.ts";
13+
import { ExhaustedError, FilteredError, UntranslatableError } from "./error.ts";
1914
import { CONJUNCTION } from "./misc.ts";
2015
import {
2116
AdjectivalModifier,
@@ -268,6 +263,83 @@ function prepositionAsVerb(
268263
emphasis: false,
269264
};
270265
}
266+
function preverb(
267+
preverb: TokiPona.Phrase & { type: "preverb" },
268+
): IterableResult<PartialSimpleVerb> {
269+
const emphasis = preverb.emphasis != null;
270+
const verb = IterableResult.combine(
271+
wordUnit({
272+
wordUnit: preverb.preverb,
273+
place: "object",
274+
includeGerund: false,
275+
}),
276+
multipleModifiers(preverb.modifiers),
277+
)
278+
.filterMap(([verb, modifier]) =>
279+
verb.type === "verb" && modifier.type === "adverbial"
280+
? verbPhrase({ verb, modifier, emphasis: false })
281+
: null
282+
);
283+
return IterableResult.combine(
284+
verb,
285+
translatePhrase({
286+
phrase: preverb.phrase,
287+
place: "object",
288+
includeGerund: false,
289+
includeVerb: true,
290+
}),
291+
)
292+
.filterMap(([verb, predicate]): null | PartialSimpleVerb => {
293+
if (
294+
verb.predicateType === "noun adjective" &&
295+
(predicate.type === "noun" || predicate.type === "adjective")
296+
) {
297+
let subjectComplement: English.Complement;
298+
switch (predicate.type) {
299+
case "noun":
300+
subjectComplement = { type: "noun", noun: predicate.noun };
301+
break;
302+
case "adjective":
303+
subjectComplement = {
304+
type: "adjective",
305+
adjective: predicate.adjective,
306+
};
307+
break;
308+
}
309+
return { ...verb, subjectComplement, emphasis };
310+
} else if (
311+
verb.predicateType === "verb" && predicate.type === "verb" &&
312+
predicate.verb.type === "simple"
313+
) {
314+
const first = predicate.verb.first;
315+
let predicateVerb: English.Verb;
316+
switch (first.type) {
317+
case "modal":
318+
return null;
319+
case "non-modal":
320+
predicateVerb = {
321+
preAdverbs: first.adverbs,
322+
verb: word({
323+
...first,
324+
word: first.presentPlural,
325+
emphasis: false,
326+
}),
327+
postAdverb: null,
328+
};
329+
}
330+
return {
331+
...predicate.verb,
332+
first: verb.first,
333+
rest: [...verb.rest, predicateVerb, ...predicate.verb.rest],
334+
emphasis,
335+
};
336+
} else {
337+
return null;
338+
}
339+
})
340+
.addErrorWhenNone(() => new ExhaustedError(Composer.phrase(preverb)));
341+
}
342+
const translatePhrase = phrase;
271343
export function phrase(
272344
options: Readonly<{
273345
phrase: TokiPona.Phrase;
@@ -294,7 +366,17 @@ export function phrase(
294366
]);
295367
}
296368
case "preverb":
297-
return IterableResult.errors([new TranslationTodoError(phrase.type)]);
369+
if (includeVerb) {
370+
return preverb(phrase)
371+
.map((verb): PhraseTranslation => ({
372+
type: "verb",
373+
verb: { ...verb, type: "simple" },
374+
}));
375+
} else {
376+
return IterableResult.errors([
377+
new UntranslatableError("preverb", "noun or adjective"),
378+
]);
379+
}
298380
}
299381
}
300382
export function phraseAsVerb(

src/translator/word_unit.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ function defaultWordUnit(
9595
objectComplement: null,
9696
prepositions: [],
9797
forObject: false,
98-
predicateType: null,
98+
predicateType: "verb",
9999
emphasis: false,
100100
});
101101
default:

0 commit comments

Comments
 (0)