Finsih builder for all formatting options

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent 7f6d75a11e
commit bec0742e51

View File

@@ -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,
))