From f6d289b223c1402738c259ea435f3e7922b16b8c Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Sun, 28 Aug 2022 14:40:03 +0200 Subject: [PATCH] Restore link parser --- src_v2/org/org_builder_link.nim | 86 +++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src_v2/org/org_builder_link.nim diff --git a/src_v2/org/org_builder_link.nim b/src_v2/org/org_builder_link.nim new file mode 100644 index 0000000..5c1b5de --- /dev/null +++ b/src_v2/org/org_builder_link.nim @@ -0,0 +1,86 @@ +import std/[ + collections/sequtils, + sugar, +] +import fp/[ + option, + resultM, +] +import fusion/matching +import ./org_builder_api +import ../parser/parser +import ../utils/fp +# import std/strformat +# import std/sugar +# import std/collections/sequtils +# import results +# import fp/[ +# maybe, +# option, +# ] +# import ./org_builder_api +# import ./org_types +# import ../parser/parser_internals +# import ../parser/parser_types + +{.experimental: "caseStmtMacros".} + +# -- Parsers + +let linkStartParser* = ignore(str("[[")) + anyUntil(choice(@[str("]["), str("]]")])) + optional(ignore(str("]["))) +let linkEndParser* = anyUntil(str("]]")) + ignore(str("]]")) + +let linkParser* = proc(parser: Parser): ParserResult {.closure.} = + # Parse an an org link in the `parser` state. + # Return two tokens for a link with description: [[url][description]] + # Return one token for a link without description : [[url]] + let linkUrl = linkStartParser(parser) + .map(flattenTokens) + + let linkValue = linkUrl + .map(emptyTokens) + .flatMap(linkEndParser) + .map(flattenTokens) + + case (linkUrl, linkValue): + of (Some(@key), Some(@value)): + ParserResult.ok( + Parser( + state: value.state, + tokens: @[ + key.tokens[0], + value.tokens[0], + ], + ) + ) + else: + linkValue + +# proc linkStringifier*(linkUrl: string, linkDescription: Option[string]): string = +# case (linkUrl, linkDescription): +# of (@linkUrl, Some(@linkDescription)): +# return &"[[{linkUrl}][{linkDescription}]]" +# of (@linkUrl, None()): +# return &"[[{linkUrl}]]" + +# func linkTokenizer*(parserTokens: seq[ParserToken]): OrgInlineBuilderT = +# [@linkUrl, @linkDescription] := parserTokens.map(tokenStringValue) +# let maybeLinkDescription = linkDescription.some().notEmpty() +# return OrgInlineBuilderT( +# kind: orgLink, +# content: linkStringifier(linkUrl, maybeLinkDescription), +# linkUrl: linkUrl, +# linkDescription: maybeLinkDescription, +# ) + +# let linkTokenizerSeq* = proc(parserTokens: seq[ParserToken]): seq[OrgInlineBuilderT] {.closure.} = +# return @[linkTokenizer(parserTokens)] + +# when isMainModule: +# # echo initParser("[[https://florianschroedl.com]]").linkParser() +# echo initParser("[[https://florianschroedl.com][My blog]]") +# .linkParser() +# .foldTokens( +# onError = (x) => newSeq[OrgInlineBuilderT](), +# onSuccess = proc(xs: seq[ParserToken]): seq[OrgInlineBuilderT] = linkTokenizerSeq(xs), +# )