@@ -10,12 +10,7 @@ import {
10
10
import { extractNegativeFromMultipleAdverbs , NOT } from "./adverb.ts" ;
11
11
import * as English from "./ast.ts" ;
12
12
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" ;
19
14
import { CONJUNCTION } from "./misc.ts" ;
20
15
import {
21
16
AdjectivalModifier ,
@@ -268,6 +263,83 @@ function prepositionAsVerb(
268
263
emphasis : false ,
269
264
} ;
270
265
}
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 ;
271
343
export function phrase (
272
344
options : Readonly < {
273
345
phrase : TokiPona . Phrase ;
@@ -294,7 +366,17 @@ export function phrase(
294
366
] ) ;
295
367
}
296
368
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
+ }
298
380
}
299
381
}
300
382
export function phraseAsVerb (
0 commit comments