From e876a487f581850619a2ade1b351c838a5145e6d Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Sun, 28 Aug 2022 14:53:01 +0200 Subject: [PATCH] Restore link parser --- src_v2/org/org_builder_link.nim | 59 ++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src_v2/org/org_builder_link.nim b/src_v2/org/org_builder_link.nim index 5c1b5de..62d2f1b 100644 --- a/src_v2/org/org_builder_link.nim +++ b/src_v2/org/org_builder_link.nim @@ -1,5 +1,6 @@ import std/[ collections/sequtils, + strformat, sugar, ] import fp/[ @@ -7,6 +8,7 @@ import fp/[ resultM, ] import fusion/matching +import ./org_types import ./org_builder_api import ../parser/parser import ../utils/fp @@ -19,7 +21,6 @@ import ../utils/fp # option, # ] # import ./org_builder_api -# import ./org_types # import ../parser/parser_internals # import ../parser/parser_types @@ -56,31 +57,37 @@ let linkParser* = proc(parser: Parser): ParserResult {.closure.} = 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}]]" +# -- Tokenizers -# 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, -# ) +proc linkStringifier*(linkUrl: string, linkDescription: Option[string]): string = + case (linkUrl, linkDescription): + of (@linkUrl, Some(@linkDescription)): + return &"[[{linkUrl}][{linkDescription}]]" + of (@linkUrl, None()): + return &"[[{linkUrl}]]" -# let linkTokenizerSeq* = proc(parserTokens: seq[ParserToken]): seq[OrgInlineBuilderT] {.closure.} = -# return @[linkTokenizer(parserTokens)] +proc linkTokenizer*(parserTokens: seq[ParserToken]): seq[OrgInlineBuilderT] = + [@linkUrl, @linkDescription] := parserTokens.map(toString) + let linkDescriptionOption = linkDescription.some().notEmpty() + return @[ + OrgInlineBuilderT( + kind: orgLink, + content: linkStringifier(linkUrl, linkDescriptionOption), + linkUrl: linkUrl, + linkDescription: linkDescriptionOption, + ) + ] -# 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), -# ) +when isMainModule: + block testParsers: + proc testParser(str: string, parser: parserFnT): string = + initParserResult(str).flatMap(parser).tokensToString() + + assert testParser("[[placeholder.com]]", linkParser) == "placeholder.com" + assert testParser("[[placeholder.com][ - title]]", linkParser) == "placeholder.com - title" + + # .linkParser() + # .foldTokens( + # onError = xs => newSeq[OrgInlineBuilderT](), + # onSuccess = linkTokenizer, + # )