From abacfda37192159bdc566667ef0870095d07bf40 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Thu, 20 Jan 2022 17:00:00 +0100 Subject: [PATCH] Add link parser --- src/org/org_text_link.nim | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/org/org_text_link.nim diff --git a/src/org/org_text_link.nim b/src/org/org_text_link.nim new file mode 100644 index 0000000..a975547 --- /dev/null +++ b/src/org/org_text_link.nim @@ -0,0 +1,35 @@ +import results +import fusion/matching +import ../utils/fp +import ../parser/parser_internals +import ../parser/parser_types + +{.experimental: "caseStmtMacros".} + +let linkStartParser* = ignore(str("[[")) + anyUntil(choice(@[str("]["), str("]]")])) + optional(ignore(str("]["))) +let linkEndParser* = anyUntil(str("]]")) + ignore(str("]]")) + +let linkParser* = proc(parser: Parser): ParserResult {.closure.} = + let linkUrl = linkStartParser(parser) + .flatMap(flattenParserTokens) + + let linkValue = linkUrl + .map(emptyTokens) + .flatMap(linkEndParser) + .flatMap(flattenParserTokens) + + case (linkUrl, linkValue): + of (Some(@key), Some(@value)): + ok(Parser( + state: value.state, + tokens: @[ + key.tokens[0], + value.tokens[0], + ] + )) + else: + linkValue + +when isMainModule: + echo initParser("[[]]").linkParser() + echo initParser("[[Foo][Bar]]").linkParser()