Convert tokens before
This commit is contained in:
@@ -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}",
|
||||||
|
|||||||
Reference in New Issue
Block a user