From 178bbed09d54a73c3b593c4d817a8c3eeb299be3 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Wed, 4 May 2022 17:00:00 +0200 Subject: [PATCH] Parsing org tree --- src/org/org_block_heading.nim | 41 ++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/org/org_block_heading.nim b/src/org/org_block_heading.nim index cd0461c..e51adcb 100644 --- a/src/org/org_block_heading.nim +++ b/src/org/org_block_heading.nim @@ -35,6 +35,10 @@ let parseContentText = @[ anyUntil(choice(@[endOfStream, str("\n*")])), ] +let parseHeadlineNewline = @[ + ignore(newline) +] + let parseHeadingText = @[ anyUntil(newline), ] @@ -70,7 +74,11 @@ let buildHeadlineChildren = func(tokens: seq[ParserToken], org: OrgBlock): OrgBl org.headlineChildrenText = tokens.tokensToString() org +let buildHeadlineNewline = func(tokens: seq[ParserToken], org: OrgBlock): OrgBlock {.closure.}= + org + proc tryBuildHeading(builder: OrgBuilderResult): OrgBuilderResult = + # echo builder builder .applyParsersSeqToSingle( OrgBlock(kind: orgHeading), @@ -82,20 +90,37 @@ proc tryBuildHeading(builder: OrgBuilderResult): OrgBuilderResult = (parseHeadingText, buildHeadlineContent, false), - (parseContentText, buildHeadlineChildren, true) + (parseContentText, buildHeadlineChildren, true), + + (parseHeadlineNewline, buildHeadlineContent, true), + + (parseHeadlineNewline, buildHeadlineNewline, false), ] ) when isMainModule: - let test = initOrgBuilder("""* TODO Level 1""") - .tryBuildHeading() - .fold( - x => "Nothing", - x => $x.tree - ) - echo test + var acc = initOrgBuilder("""* TODO Level 1 +** TODO Level 2 +""") + + while acc.isOk() and acc.tryParser(endOfStream).isErr(): + let unsafeAcc = acc.unsafeGet() + + let item = acc + .tryBuildHeading() + .fold( + err => OrgBuilderResult.err((unsafeAcc, "Error")), + (x: OrgBuilder) => OrgBuilderResult.ok(OrgBuilder(( + parser: x.parser, + tree: unsafeAcc.tree & x.tree, + ))) + ) + + acc = item + + echo acc # let sampleBuilder = StringBuilderResult # .ok(StringBuilder((