From bec0742e51b162e7ce20a5ad4e0c7a00ced807e4 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Thu, 20 Jan 2022 17:00:00 +0100 Subject: [PATCH] Finsih builder for all formatting options --- src/org/org_text_delimiter.nim | 56 ++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/src/org/org_text_delimiter.nim b/src/org/org_text_delimiter.nim index 48d5eae..f11a790 100644 --- a/src/org/org_text_delimiter.nim +++ b/src/org/org_text_delimiter.nim @@ -16,28 +16,11 @@ let parseBetweenDelimiter* = proc(delimiterParser: (Parser -> ParserResult)): (P let boldParser* = parseBetweenDelimiter(ch('*')) let italicParser* = parseBetweenDelimiter(ch('/')) -let underlinedParser* = parseBetweenDelimiter(ch('_')) +let underlineParser* = parseBetweenDelimiter(ch('_')) let verbatimParser* = parseBetweenDelimiter(ch('=')) let codeParser* = parseBetweenDelimiter(ch('~')) let strikeThroughParser* = parseBetweenDelimiter(ch('+')) - -# until parser != delimiterparser -# takeChar and save to current parser -# else: -# saveTokens to new text block -# saveBlock delimiterparser - -# let delimiterParser* = anyUntil(choice(@[ -# boldParser, -# italicParser, -# underlinedParser, -# verbatimParser, -# codeParser, -# strikeThroughParser, -# ]), newline) - - type OrgBuilderT* = OrgElement type OrgBuilder* = Builder[OrgBuilderT] type OrgBuilderResult* = BuilderResult[OrgBuilderT] @@ -54,6 +37,36 @@ proc makeBoldToken*(content: string): OrgBuilderT = content: content, ) +proc makeItalicToken*(content: string): OrgBuilderT = + OrgBuilderT( + kind: orgItalicText, + content: content, + ) + +proc makeUnderlineToken*(content: string): OrgBuilderT = + OrgBuilderT( + kind: orgUnderlineText, + content: content, + ) + +proc makeVerbatimToken*(content: string): OrgBuilderT = + OrgBuilderT( + kind: orgVerbatimText, + content: content, + ) + +proc makeCodeToken*(content: string): OrgBuilderT = + OrgBuilderT( + kind: orgCodeText, + content: content, + ) + +proc makeStrikeThroughToken*(content: string): OrgBuilderT = + OrgBuilderT( + kind: orgStrikeThroughText, + content: content, + ) + proc makeOrgToken*(orgTokenFn: string -> OrgBuilderT): (seq[ParserToken], seq[OrgBuilderT]) -> seq[OrgBuilderT] = return proc(parserTokens: seq[ParserToken], builderTokens: seq[OrgBuilderT]): seq[OrgBuilderT] = return builderTokens & parserTokens.foldl(a & b.tokenStringValue(), "").orgTokenFn() @@ -125,13 +138,18 @@ proc makeRawTokenOrEmpty(xs: seq[ParserToken]): seq[OrgBuilderT] = when isMainModule: let foo = OrgBuilderResult.ok(OrgBuilder(( - parser: initParser("Just *some text* here *right*"), + parser: initParser("Regular *bold* /italic/ _underline_ =verbatim= ~code~ +strikethrough+"), tree: newSeq[OrgBuilderT](), ))) .flatMap((builder: OrgBuilder) => parseText( builder = builder, builderFns = @[ (boldParser, makeOrgToken(makeBoldToken)), + (italicParser, makeOrgToken(makeItalicToken)), + (underlineParser, makeOrgToken(makeUnderlineToken)), + (verbatimParser, makeOrgToken(makeVerbatimToken)), + (codeParser, makeOrgToken(makeCodeToken)), + (strikeThroughParser, makeOrgToken(makeStrikeThroughToken)), ], otherWiseFn = makeRawTokenOrEmpty, ))