Add link parser

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent c96e9244ea
commit abacfda371

35
src/org/org_text_link.nim Normal file
View File

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