Convert tokens before

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent 7ba1a9591f
commit 912a834af6

View File

@@ -42,6 +42,12 @@ type OrgBuilderT* = OrgElement
type OrgBuilder* = Builder[OrgBuilderT] type OrgBuilder* = Builder[OrgBuilderT]
type OrgBuilderResult* = BuilderResult[OrgBuilderT] type OrgBuilderResult* = BuilderResult[OrgBuilderT]
proc makeRawToken*(content: string): OrgBuilderT =
OrgBuilderT(
kind: orgRawText,
content: content,
)
proc makeBoldToken*(content: string): OrgBuilderT = proc makeBoldToken*(content: string): OrgBuilderT =
OrgBuilderT( OrgBuilderT(
kind: orgBoldText, kind: orgBoldText,
@@ -58,6 +64,7 @@ proc parseText[T](
parserFn: Parser -> ParserResult, parserFn: Parser -> ParserResult,
tokenFoldFn: (seq[ParserToken], seq[T]) -> seq[T], tokenFoldFn: (seq[ParserToken], seq[T]) -> seq[T],
]], ]],
otherWiseFn: (seq[ParserToken]) -> seq[T],
stopFn = newline, stopFn = newline,
): BuilderResult[T] = ): BuilderResult[T] =
let (parser, tree) = builder let (parser, tree) = builder
@@ -79,11 +86,20 @@ proc parseText[T](
if parseResult.isOk(): if parseResult.isOk():
let okParser = parseResult.unsafeGet() let okParser = parseResult.unsafeGet()
let textTokens = parserAcc
.foldTokens(
onError = _ => newSeq[T](),
onSuccess = otherWiseFn,
)
found = true found = true
parserAcc = parseResult parserAcc = parseResult
builderAcc = builder.initBuilder( builderAcc = builder.initBuilder(
okParser, okParser,
tokenFoldFn(okParser.tokens, builderAcc[1]), tokenFoldFn(
okParser.tokens,
builderAcc[1] & textTokens,
),
) )
break break
@@ -92,16 +108,23 @@ proc parseText[T](
BuilderResult[T].ok(builderAcc) BuilderResult[T].ok(builderAcc)
proc makeRawTokenOrEmpty(xs: seq[ParserToken]): seq[OrgBuilderT] =
let str = xs.foldl(a & b.tokenStringValue(), "")
if str.len == 0: @[]
else: @[makeRawToken(str)]
when isMainModule: when isMainModule:
let foo = OrgBuilderResult.ok(OrgBuilder(( let foo = OrgBuilderResult.ok(OrgBuilder((
parser: initParser("Just *some* text"), parser: initParser("Just *some text* here"),
tree: newSeq[OrgBuilderT](), tree: newSeq[OrgBuilderT](),
))) )))
.flatMap((builder: OrgBuilder) => parseText( .flatMap((builder: OrgBuilder) => parseText(
builder = builder, builder = builder,
builderFns = @[ builderFns = @[
(boldParser, makeOrgToken(makeBoldToken)), (boldParser, makeOrgToken(makeBoldToken)),
] ],
otherWiseFn = makeRawTokenOrEmpty,
)) ))
# .foldBuilder( # .foldBuilder(
# err => &"Error Parsing: {err}", # err => &"Error Parsing: {err}",