@@ -10,12 +10,7 @@ import {
1010import { extractNegativeFromMultipleAdverbs , NOT } from "./adverb.ts" ;
1111import * as English from "./ast.ts" ;
1212import { 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" ;
1914import { CONJUNCTION } from "./misc.ts" ;
2015import {
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 ;
271343export 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}
300382export function phraseAsVerb (
0 commit comments