From e1d454085a975b7ba732dd20fd40f1aaa258ef3b Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Tue, 29 Mar 2022 06:53:36 +0200 Subject: [PATCH] fix codeblock ending --- element/codeblock.go | 8 ++++---- element/codeblock_test.go | 14 ++++++++++++++ parser/parser_test.go | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/element/codeblock.go b/element/codeblock.go index 5a0c01b..effc627 100644 --- a/element/codeblock.go +++ b/element/codeblock.go @@ -30,16 +30,16 @@ func NewCodeBlockFromTokens(p ReadUnreader) (ParseResult, bool) { return ParseResult{}, false } for { - ntoks, ok := p.Read(1) + ntoks, ok := p.Read(2) if !ok { p.Unread(len(toks)) return ParseResult{}, false } - tok := ntoks[0] - if tok.Equal(delimiter) { + if ntoks[0].Equal(delimiter) && (ntoks[1].Type == token.TYPE_NEWLINE || ntoks[1].Equal(token.TOKEN_EOF)) { break } - toks = append(toks, tok) + p.Unread(1) + toks = append(toks, ntoks[0]) } cb := CodeBlock{} diff --git a/element/codeblock_test.go b/element/codeblock_test.go index 38cb719..7d63e48 100644 --- a/element/codeblock_test.go +++ b/element/codeblock_test.go @@ -42,6 +42,20 @@ more }}, }, }, + { + name: "with newline at end", + input: `---- +code +---- +`, + exp: &adoc.ADoc{ + Attributes: map[string]string{}, + Content: []element.Element{element.CodeBlock{ + element.Word("code"), + element.WhiteSpace("\n"), + }}, + }, + }, { name: "missing end", input: `---- diff --git a/parser/parser_test.go b/parser/parser_test.go index 4322655..f4d8699 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -5,6 +5,7 @@ import ( "testing" "ewintr.nl/adoc" + "ewintr.nl/adoc/element" "ewintr.nl/adoc/parser" "ewintr.nl/go-kit/test" ) @@ -19,6 +20,41 @@ func TestParser(t *testing.T) { name: "empty", exp: adoc.New(), }, + { + name: "codeblock paragraph edge", + input: `= some title + +---- +a code block +---- + +And then some text`, + exp: &adoc.ADoc{ + Title: "some title", + Attributes: map[string]string{}, + Content: []element.Element{ + element.CodeBlock{ + element.Word("a"), + element.WhiteSpace(" "), + element.Word("code"), + element.WhiteSpace(" "), + element.Word("block"), + element.WhiteSpace("\n"), + }, + element.Paragraph{ + Elements: []element.Element{ + element.Word("And"), + element.WhiteSpace(" "), + element.Word("then"), + element.WhiteSpace(" "), + element.Word("some"), + element.WhiteSpace(" "), + element.Word("text"), + }, + }, + }, + }, + }, } { t.Run(tc.name, func(t *testing.T) { par := parser.New(strings.NewReader(tc.input))