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()