11import * as English from "./ast.ts" ;
22import { AdjectiveWithInWay } from "./adjective.ts" ;
33import { AdjectivalModifier } from "./modifier.ts" ;
4- import { ExhaustedError , FilteredError } from "./error.ts" ;
4+ import {
5+ ExhaustedError ,
6+ FilteredError ,
7+ TranslationTodoError ,
8+ } from "./error.ts" ;
59import { mapNullable , nullableAsArray } from "../../misc/misc.ts" ;
610import { nounAsPreposition } from "./preposition.ts" ;
711import { AdverbialModifier } from "./modifier.ts" ;
@@ -10,6 +14,8 @@ import { IterableResult } from "../compound.ts";
1014import { wordUnit } from "./word_unit.ts" ;
1115import { multipleModifiers } from "./modifier.ts" ;
1216import * as Composer from "../parser/composer.ts" ;
17+ import { verb } from "./verb.ts" ;
18+ import { word } from "./word.ts" ;
1319
1420export type PhraseTranslation =
1521 | Readonly < { type : "noun" ; noun : English . NounPhrase } >
@@ -186,3 +192,118 @@ function defaultPhrase(
186192 } )
187193 . addErrorWhenNone ( ( ) => new ExhaustedError ( Composer . phrase ( phrase ) ) ) ;
188194}
195+ function prepositionAsVerb (
196+ preposition : English . Preposition ,
197+ ) : English . SimpleVerbPhrase {
198+ return {
199+ verb : [ {
200+ preAdverbs : [ ] ,
201+ verb : {
202+ type : "non-modal" ,
203+ presentPlural : "are" ,
204+ presentSingular : "is" ,
205+ past : "were" ,
206+ reduplicationCount : 1 ,
207+ emphasis : false ,
208+ } ,
209+ postAdverb : null ,
210+ } ] ,
211+ subjectComplement : null ,
212+ contentClause : null ,
213+ object : null ,
214+ objectComplement : null ,
215+ prepositions : [ preposition ] ,
216+ forObject : false ,
217+ predicateType : null ,
218+ emphasis : false ,
219+ hideVerb : false ,
220+ } ;
221+ }
222+ function preverb (
223+ preverb : TokiPona . Phrase & { type : "preverb" } ,
224+ ) : IterableResult < English . SimpleVerbPhrase > {
225+ const emphasis = preverb . emphasis != null ;
226+ const verb = IterableResult . combine (
227+ wordUnit ( {
228+ wordUnit : preverb . preverb ,
229+ includeGerund : false ,
230+ } ) ,
231+ multipleModifiers ( preverb . modifiers ) ,
232+ )
233+ . filterMap ( ( [ verb , modifier ] ) =>
234+ verb . type === "verb" && modifier . type === "adverbial"
235+ ? verbPhrase ( { verb, modifier, emphasis : false } )
236+ : null
237+ ) ;
238+ return IterableResult . combine (
239+ verb ,
240+ translatePhrase ( {
241+ phrase : preverb . phrase ,
242+ includeGerund : false ,
243+ } ) ,
244+ )
245+ . filterMap ( ( [ verb , predicate ] ) : null | English . SimpleVerbPhrase => {
246+ if (
247+ verb . predicateType === "noun adjective" &&
248+ ( predicate . type === "noun" || predicate . type === "adjective" )
249+ ) {
250+ let subjectComplement : English . Complement ;
251+ switch ( predicate . type ) {
252+ case "noun" :
253+ subjectComplement = { type : "noun" , noun : predicate . noun } ;
254+ break ;
255+ case "adjective" :
256+ subjectComplement = {
257+ type : "adjective" ,
258+ adjective : predicate . adjective ,
259+ } ;
260+ break ;
261+ }
262+ return { ...verb , subjectComplement, emphasis } ;
263+ } else if (
264+ verb . predicateType === "verb" && predicate . type === "verb" &&
265+ predicate . verb . type === "simple"
266+ ) {
267+ const first = predicate . verb . verb [ 0 ] ;
268+ // TODO: filter out modal verb when found in the middle
269+ const predicateVerb : English . AdverbVerb = {
270+ preAdverbs : first . preAdverbs ,
271+ verb : first . verb ,
272+ postAdverb : null ,
273+ } ;
274+ return {
275+ ...predicate . verb ,
276+ verb : [
277+ ...verb . verb ,
278+ predicateVerb ,
279+ ...predicate . verb . verb . slice ( 1 ) ,
280+ ] ,
281+ emphasis,
282+ } ;
283+ } else {
284+ return null ;
285+ }
286+ } )
287+ . addErrorWhenNone ( ( ) => new ExhaustedError ( Composer . phrase ( preverb ) ) ) ;
288+ }
289+ const translatePhrase = phrase ;
290+ export function phrase (
291+ options : Readonly < {
292+ phrase : TokiPona . Phrase ;
293+ includeGerund : boolean ;
294+ } > ,
295+ ) : IterableResult < PhraseTranslation > {
296+ const { phrase } = options ;
297+ switch ( phrase . type ) {
298+ case "simple" :
299+ return defaultPhrase ( { ...options , phrase } ) ;
300+ case "preposition" :
301+ return IterableResult . errors ( [ new TranslationTodoError ( "preposition" ) ] ) ;
302+ case "preverb" :
303+ return preverb ( phrase )
304+ . map ( ( verb ) : PhraseTranslation => ( {
305+ type : "verb" ,
306+ verb : { ...verb , type : "simple" } ,
307+ } ) ) ;
308+ }
309+ }
0 commit comments