Restore delimiter parsers

This commit is contained in:
Florian Schroedl
2022-08-27 15:53:41 +02:00
parent 67e5a44d49
commit 19d2cae392
4 changed files with 354 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
import std/[
collections/sequtils,
strformat,
strutils,
sugar,
]
import fp/[
resultM,
]
import ./org_types
import ./org_builder
import ../parser/parser
# import ./org_text_link
# import ../utils/fp
# import ../parser/parser_internals
# import ../parser/parser_types
# import ../parser/builder_api
# -- Parsers
let boldParser* = anyBetweenPair(ch('*'))
let italicParser* = anyBetweenPair(ch('/'))
let underlineParser* = anyBetweenPair(ch('_'))
let verbatimParser* = anyBetweenPair(ch('='))
let codeParser* = anyBetweenPair(ch('~'))
let strikeThroughParser* = anyBetweenPair(ch('+'))
# let rawTokenizer* = rawTextTokenizer(orgRawText)
# let boldTokenizer* = textTokenizer(orgBoldText)
# let italicTokenizer* = textTokenizer(orgItalicText)
# let underlineTokenizer* = textTokenizer(orgUnderlineText)
# let verbatimTokenizer* = textTokenizer(orgVerbatimText)
# let codeTokenizer* = textTokenizer(orgCodeText)
# let strikeThroughTokenizer* = textTokenizer(orgStrikeThroughText)
# let tok = linkTokenizerSeq
# let orgStyledTextBuilders = @[
# (boldParser, boldTokenizer),
# (italicParser, italicTokenizer),
# (underlineParser, underlineTokenizer),
# (verbatimParser, verbatimTokenizer),
# (codeParser, codeTokenizer),
# (strikeThroughParser, strikeThroughTokenizer),
# (linkParser, linkTokenizerSeq),
# ]
# proc makeRawTokenOrEmpty(tokens: seq[ParserToken]): seq[OrgInlineBuilderT] =
# ## Merge all parser `tokens` into a string to tokenize for the builder.
# ## Unless the string is empty, in this case return an empty list.
# let str = tokens.foldl(a & b.tokenStringValue(), "")
# if str.len == 0: @[]
# else: @[rawTokenizer(str)]
# proc tryBuildInline*(content: string): OrgInlineBuilderResult =
# initOrgInlineBuilder(content)
# .flatMap((builder: OrgInlineBuilder) => tryParseBuild(
# builder = builder,
# builderFns = orgStyledTextBuilders,
# defaultBuilderFn = makeRawTokenOrEmpty,
# ))
# when isMainModule:
# let test = tryBuildInline(
# "Regular *bold* [[placeholder.com]] /italic/ _underline_ =verbatim= ~code~ +strikethrough+ [[https://placeholder.com][title]]"
# )
# echo test
when isMainModule:
block testParsers:
proc testParser(str: string, parser: parserFnT): string =
initParserResult(str).flatMap(parser).tokensToString()
assert testParser("*bold*", boldParser) == "bold"
assert testParser("/italic/", italicParser) == "italic"
assert testParser("_underline_", underlineParser) == "underline"
assert testParser("=verbatim=", verbatimParser) == "verbatim"
assert testParser("~code~", codeParser) == "code"
assert testParser("+strikeThrough+", strikeThroughParser) == "strikeThrough"