107 lines
2.5 KiB
Nim
107 lines
2.5 KiB
Nim
import std/[
|
|
collections/sequtils,
|
|
sugar,
|
|
]
|
|
import fp/[
|
|
option,
|
|
resultM,
|
|
]
|
|
import ./org_types
|
|
import ./org_builder_api
|
|
import ./org_builder_link.nim
|
|
import ../parser/parser
|
|
import ../utils/fp
|
|
|
|
import fusion/matching
|
|
{.experimental: "caseStmtMacros".}
|
|
|
|
# let lineTokenizer = (builder: OrgInlineBuilder) => tryTokenize(
|
|
# builder = builder,
|
|
# builderFns = styledTextTokenizers,
|
|
# defaultTokenizerFn = tryTokenizeRawText,
|
|
# )
|
|
|
|
# OrgDocucment
|
|
|
|
# -> Seq [Builder -> Builder]
|
|
|
|
# One of OrgBlock
|
|
|
|
# @[
|
|
|
|
# OrgBuilderResult -> OrgBuilderResult
|
|
# ]
|
|
# with default OrgBuilder -> OrgBuilder
|
|
# until Eol
|
|
|
|
let listTypesParser = choice(@[
|
|
ch('-'),
|
|
ch('+'),
|
|
choice(@[letter, digit]) + choice(@[ch('.'), ch(')')]),
|
|
])
|
|
|
|
let listStartParser = manyUntil(space, listTypesParser)
|
|
let listTypeParser = listTypesParser + ignore(space)
|
|
let listContentParser = anyUntil(newlineOrEol) + ignore(newlineOrEol)
|
|
|
|
proc buildListItem(builder: OrgBuilder): OrgBuilderResult =
|
|
|
|
let (parser, tree) = builder
|
|
|
|
# let initialParser = ParserResult.ok(parser)
|
|
|
|
let beforeSpaces = ParserResult.ok(parser)
|
|
.flatMap(listStartParser)
|
|
.map(flattenTokens)
|
|
|
|
let listType = beforeSpaces
|
|
.map(emptyTokens)
|
|
.flatMap(listTypeParser)
|
|
.map(flattenTokens)
|
|
|
|
let listContent = listType
|
|
.map(emptyTokens)
|
|
.flatMap(listContentParser)
|
|
.map(flattenTokens)
|
|
|
|
let y = case (beforeSpaces, listType, listContent):
|
|
of (Some(@a), Some(@b), Some(@c)): c.tokens.tokensToString()
|
|
else: ""
|
|
echo y
|
|
|
|
builder.ok()
|
|
|
|
discard initOrgBuilder(" 1. foo bar").map(buildListItem)
|
|
|
|
|
|
# proc buildParagraph*(
|
|
# builder: OrgBuilder,
|
|
# builderFns: seq[tuple[
|
|
# builderFn: OrgBuilder -> OrgBuilderResult,
|
|
# concatFn: OrgBuilder -> OrgBuilder,
|
|
# ]],
|
|
# stopAtParserFn = endOfStream,
|
|
# ): OrgBuilderResult =
|
|
|
|
# var builderAcc = OrgBuilderResult.ok(builder)
|
|
|
|
# while builderAcc.isOk() and builderAcc.applyParser(stopAtParserFn).isErr():
|
|
# var found = false
|
|
|
|
# for fn in builderFns:
|
|
# let builderResult = builderAcc.flatMap(fn)
|
|
|
|
# if builderResult.isOk():
|
|
# found = true
|
|
|
|
# builderAcc = builderAcc.map((x: OrgBuilder) => x.concat(builderResult.unsafeGet()))
|
|
# break
|
|
|
|
# when isMainModule:
|
|
# block testParsers:
|
|
# proc testParser(str: string, parser: parserFnT): string =
|
|
# initParserResult(str).flatMap(parser).tokensToString()
|
|
|
|
# assert testParser("- List item", listItemParser) == "- List item"
|
|
# assert testParser(" - List item", listItemParser) == " - List item"
|