Remove concatination from the builder, it's now the duty of the internal method

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent 6fe5df066a
commit ff1d6845eb
3 changed files with 47 additions and 37 deletions

View File

@@ -8,12 +8,19 @@ type OrgBuilder* = Builder[OrgBuilderT]
type OrgBuilderResult* = BuilderResult[OrgBuilderT] type OrgBuilderResult* = BuilderResult[OrgBuilderT]
func makeOrgBuilderToken*(kind: orgElementKind): string -> OrgBuilderT = func makeOrgBuilderToken*(kind: orgElementKind): string -> OrgBuilderT =
func textTokenizer*(kind: orgElementKind): seq[ParserToken] -> seq[OrgBuilderT] =
return func(tokens: seq[ParserToken]): seq[OrgBuilderT] =
return @[
OrgBuilderT(
kind: kind,
content: tokens.tokensToString(),
)
]
func rawTextTokenizer*(kind: orgElementKind): string -> OrgBuilderT =
return func(content: string): OrgBuilderT = return func(content: string): OrgBuilderT =
return OrgBuilderT( return OrgBuilderT(
kind: orgRawText, kind: kind,
content: content, content: content,
) )
proc mergeOrgTokens*(tokenizer: string -> OrgBuilderT): (seq[ParserToken], seq[OrgBuilderT]) -> seq[OrgBuilderT] =
return proc(parserTokens: seq[ParserToken], builderTokens: seq[OrgBuilderT]): seq[OrgBuilderT] =
return builderTokens & tokenizer(parserTokens.tokensToString())

View File

@@ -18,21 +18,21 @@ let verbatimParser* = parseBetweenPair(ch('='))
let codeParser* = parseBetweenPair(ch('~')) let codeParser* = parseBetweenPair(ch('~'))
let strikeThroughParser* = parseBetweenPair(ch('+')) let strikeThroughParser* = parseBetweenPair(ch('+'))
let rawTokenizer* = makeOrgBuilderToken(orgRawText) let rawTokenizer* = rawTextTokenizer(orgRawText)
let boldTokenizer* = makeOrgBuilderToken(orgBoldText) let boldTokenizer* = textTokenizer(orgBoldText)
let italicTokenizer* = makeOrgBuilderToken(orgItalicText) let italicTokenizer* = textTokenizer(orgItalicText)
let underlineTokenizer* = makeOrgBuilderToken(orgUnderlineText) let underlineTokenizer* = textTokenizer(orgUnderlineText)
let verbatimTokenizer* = makeOrgBuilderToken(orgVerbatimText) let verbatimTokenizer* = textTokenizer(orgVerbatimText)
let codeTokenizer* = makeOrgBuilderToken(orgCodeText) let codeTokenizer* = textTokenizer(orgCodeText)
let strikeThroughTokenizer* = makeOrgBuilderToken(orgStrikeThroughText) let strikeThroughTokenizer* = textTokenizer(orgStrikeThroughText)
let orgStyledTextBuilders = @[ let orgStyledTextBuilders = @[
(boldParser, mergeOrgTokens(boldTokenizer)), (boldParser, boldTokenizer),
(italicParser, mergeOrgTokens(italicTokenizer)), (italicParser, italicTokenizer),
(underlineParser, mergeOrgTokens(underlineTokenizer)), (underlineParser, underlineTokenizer),
(verbatimParser, mergeOrgTokens(verbatimTokenizer)), (verbatimParser, verbatimTokenizer),
(codeParser, mergeOrgTokens(codeTokenizer)), (codeParser, codeTokenizer),
(strikeThroughParser, mergeOrgTokens(strikeThroughTokenizer)), (strikeThroughParser, strikeThroughTokenizer),
] ]
proc makeRawTokenOrEmpty(tokens: seq[ParserToken]): seq[OrgBuilderT] = proc makeRawTokenOrEmpty(tokens: seq[ParserToken]): seq[OrgBuilderT] =
@@ -43,10 +43,9 @@ proc makeRawTokenOrEmpty(tokens: seq[ParserToken]): seq[OrgBuilderT] =
else: @[rawTokenizer(str)] else: @[rawTokenizer(str)]
when isMainModule: when isMainModule:
let test = OrgBuilderResult.ok(OrgBuilder(( let test = initOrgBuilder(
parser: initParser("Regular *bold* /italic/ _underline_ =verbatim= ~code~ +strikethrough+"), "Regular *bold* /italic/ _underline_ =verbatim= ~code~ +strikethrough+"
tree: newSeq[OrgBuilderT](), )
)))
.flatMap((builder: OrgBuilder) => tryParseBuild( .flatMap((builder: OrgBuilder) => tryParseBuild(
builder = builder, builder = builder,
builderFns = orgStyledTextBuilders, builderFns = orgStyledTextBuilders,

View File

@@ -11,9 +11,9 @@ proc tryParseBuild*[T](
builder: Builder[T], builder: Builder[T],
builderFns: seq[tuple[ builderFns: seq[tuple[
parserFn: Parser -> ParserResult, parserFn: Parser -> ParserResult,
concatFn: (seq[ParserToken], seq[T]) -> seq[T], builderFn: seq[ParserToken] -> seq[T],
]], ]],
defaultBuilderFn: (seq[ParserToken]) -> seq[T], defaultBuilderFn: seq[ParserToken] -> seq[T],
stopAtParserFn = newline, stopAtParserFn = newline,
): BuilderResult[T] = ): BuilderResult[T] =
## Parse remaining text in `builder` by going checking in the `builderFns` list for a sucessful `parserFn`. ## Parse remaining text in `builder` by going checking in the `builderFns` list for a sucessful `parserFn`.
@@ -32,8 +32,8 @@ proc tryParseBuild*[T](
# Find the first matching parser and convert its tokens # Find the first matching parser and convert its tokens
var found = false var found = false
for builderFn in builderFns: for fn in builderFns:
let (parserFn, concatFn) = builderFn let (parserFn, builderFn) = fn
let parseResult = emptyParser.flatMap(parserFn) let parseResult = emptyParser.flatMap(parserFn)
if parseResult.isOk(): if parseResult.isOk():
@@ -50,10 +50,11 @@ proc tryParseBuild*[T](
parserAcc = parseResult.map(emptyTokens) parserAcc = parseResult.map(emptyTokens)
builderAcc = builder.initBuilder( builderAcc = builder.initBuilder(
okParser, okParser,
concatFn( concat(
okParser.tokens, builderAcc[1],
builderAcc[1] & defaultBuilderTokens, defaultBuilderTokens,
), builderFn(okParser.tokens),
)
) )
break break
@@ -68,5 +69,8 @@ proc tryParseBuild*[T](
BuilderResult[T].ok(builder.initBuilder( BuilderResult[T].ok(builder.initBuilder(
builderAcc[0], builderAcc[0],
builderAcc[1] & defaultBuilderTokens, concat(
builderAcc[1],
defaultBuilderTokens,
),
)) ))