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