Add link parser
This commit is contained in:
35
src/org/org_text_link.nim
Normal file
35
src/org/org_text_link.nim
Normal 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()
|
||||
Reference in New Issue
Block a user