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]
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 OrgBuilderT(
kind: orgRawText,
kind: kind,
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

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

View File

@@ -11,9 +11,9 @@ proc tryParseBuild*[T](
builder: Builder[T],
builderFns: seq[tuple[
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,
): BuilderResult[T] =
## 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
var found = false
for builderFn in builderFns:
let (parserFn, concatFn) = builderFn
for fn in builderFns:
let (parserFn, builderFn) = fn
let parseResult = emptyParser.flatMap(parserFn)
if parseResult.isOk():
@@ -50,10 +50,11 @@ proc tryParseBuild*[T](
parserAcc = parseResult.map(emptyTokens)
builderAcc = builder.initBuilder(
okParser,
concatFn(
okParser.tokens,
builderAcc[1] & defaultBuilderTokens,
),
concat(
builderAcc[1],
defaultBuilderTokens,
builderFn(okParser.tokens),
)
)
break
@@ -68,5 +69,8 @@ proc tryParseBuild*[T](
BuilderResult[T].ok(builder.initBuilder(
builderAcc[0],
builderAcc[1] & defaultBuilderTokens,
concat(
builderAcc[1],
defaultBuilderTokens,
),
))