WIP Working seq parsing
This commit is contained in:
@@ -49,6 +49,7 @@ let parseHeadingText = @[
|
||||
# # builder.level = token.tokenStringValue().len
|
||||
# token
|
||||
|
||||
|
||||
let buildStars = func(tokens: seq[ParserToken], org: OrgBlock): OrgBlock {.closure.}=
|
||||
org.level = tokens.len
|
||||
org
|
||||
@@ -101,31 +102,53 @@ let headingParser = choice(@[
|
||||
endOfStream,
|
||||
])
|
||||
|
||||
let newlineParser: seq[Parser -> ParserResult] = @[newline + newline]
|
||||
|
||||
let buildNewline = func(tokens: seq[ParserToken], org: OrgBlock): OrgBlock {.closure.} =
|
||||
OrgBlock(
|
||||
kind: orgNewline
|
||||
)
|
||||
|
||||
proc concatOrgBlock(xs: seq[OrgBlock], ys: seq[OrgBlock]): seq[OrgBlock] = xs & ys
|
||||
|
||||
let contentParsersSeq: seq[tuple[
|
||||
parsers: seq[Parser -> ParserResult],
|
||||
tokenFoldFn: (seq[ParserToken], OrgBlock) -> OrgBlock,
|
||||
ignoreEmpty: bool,
|
||||
# concatFn: (seq[OrgBlock], seq[OrgBlock]) -> seq[OrgBlock],
|
||||
]] = @[
|
||||
(newlineParser, buildNewline, false),
|
||||
# (newlineParser, buildNewline, false),
|
||||
]
|
||||
|
||||
proc parseHeadlineChildren(builder: OrgBuilder): OrgBuilderResult =
|
||||
var headingBlock = builder.tree[0]
|
||||
|
||||
var parserAcc: ParserResult = ParserResult.ok(builder.parser)
|
||||
var builderAcc: OrgBuilderResult = OrgBuilderResult.ok(builder)
|
||||
|
||||
# echo parserAcc
|
||||
while builderAcc.isOk() and builderAcc.tryParser(headingParser).isErr():
|
||||
builderAcc = builderAcc
|
||||
.applyParsersSeqToSeq(
|
||||
contentParsersSeq
|
||||
)
|
||||
|
||||
while parserAcc.isOk() and parserAcc.flatMap(headingParser).isErr():
|
||||
parserAcc = parserAcc.flatMap(anyCh)
|
||||
builderAcc
|
||||
|
||||
let content = parserAcc.foldTokens(
|
||||
(err) => "",
|
||||
(xs: seq[ParserToken]) => xs.tokensToString(),
|
||||
)
|
||||
headingBlock.content = content
|
||||
# let content = builderAcc.fold(
|
||||
# (_err) => "",
|
||||
# (builder: OrgBuilder) => builder.tree,
|
||||
# )
|
||||
# headingBlock.content = content
|
||||
|
||||
let res = parserAcc.fold(
|
||||
(err) => OrgBuilderResult.err((builder, "Could not parse content")),
|
||||
(parser: Parser) => OrgBuilderResult.ok((
|
||||
parser: parser.emptyTokens(),
|
||||
tree: @[headingBlock],
|
||||
))
|
||||
)
|
||||
# let res = builderAcc.fold(
|
||||
# (_err) => OrgBuilderResult.err((builder, "Could not parse content")),
|
||||
# (builder: OrgBuilder) => OrgBuilderResult.ok((
|
||||
# parser: builder.parser.emptyTokens(),
|
||||
# tree: @[headingBlock],
|
||||
# ))
|
||||
# )
|
||||
|
||||
res
|
||||
# res
|
||||
|
||||
proc makeOrg*(x: string): OrgBuilderResult =
|
||||
var acc = initOrgBuilder(x)
|
||||
|
||||
Reference in New Issue
Block a user