Parsing org tree
This commit is contained in:
@@ -35,6 +35,10 @@ let parseContentText = @[
|
|||||||
anyUntil(choice(@[endOfStream, str("\n*")])),
|
anyUntil(choice(@[endOfStream, str("\n*")])),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
let parseHeadlineNewline = @[
|
||||||
|
ignore(newline)
|
||||||
|
]
|
||||||
|
|
||||||
let parseHeadingText = @[
|
let parseHeadingText = @[
|
||||||
anyUntil(newline),
|
anyUntil(newline),
|
||||||
]
|
]
|
||||||
@@ -70,7 +74,11 @@ let buildHeadlineChildren = func(tokens: seq[ParserToken], org: OrgBlock): OrgBl
|
|||||||
org.headlineChildrenText = tokens.tokensToString()
|
org.headlineChildrenText = tokens.tokensToString()
|
||||||
org
|
org
|
||||||
|
|
||||||
|
let buildHeadlineNewline = func(tokens: seq[ParserToken], org: OrgBlock): OrgBlock {.closure.}=
|
||||||
|
org
|
||||||
|
|
||||||
proc tryBuildHeading(builder: OrgBuilderResult): OrgBuilderResult =
|
proc tryBuildHeading(builder: OrgBuilderResult): OrgBuilderResult =
|
||||||
|
# echo builder
|
||||||
builder
|
builder
|
||||||
.applyParsersSeqToSingle(
|
.applyParsersSeqToSingle(
|
||||||
OrgBlock(kind: orgHeading),
|
OrgBlock(kind: orgHeading),
|
||||||
@@ -82,20 +90,37 @@ proc tryBuildHeading(builder: OrgBuilderResult): OrgBuilderResult =
|
|||||||
|
|
||||||
(parseHeadingText, buildHeadlineContent, false),
|
(parseHeadingText, buildHeadlineContent, false),
|
||||||
|
|
||||||
(parseContentText, buildHeadlineChildren, true)
|
(parseContentText, buildHeadlineChildren, true),
|
||||||
|
|
||||||
|
(parseHeadlineNewline, buildHeadlineContent, true),
|
||||||
|
|
||||||
|
(parseHeadlineNewline, buildHeadlineNewline, false),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
when isMainModule:
|
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
|
# let sampleBuilder = StringBuilderResult
|
||||||
# .ok(StringBuilder((
|
# .ok(StringBuilder((
|
||||||
|
|||||||
Reference in New Issue
Block a user