From 8b9b46317b872504550bbdc73759301e83d0435d Mon Sep 17 00:00:00 2001 From: "diamondburned (Forefront)" Date: Thu, 18 Jun 2020 18:53:09 -0700 Subject: [PATCH] Tweaks to more properly align block elements --- segments/blockquote.go | 3 +++ segments/codeblock.go | 3 +++ segments/md.go | 31 ++++++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/segments/blockquote.go b/segments/blockquote.go index afb9e64..ad0d646 100644 --- a/segments/blockquote.go +++ b/segments/blockquote.go @@ -13,6 +13,9 @@ var _ text.Quoteblocker = (*BlockquoteSegment)(nil) func (r *TextRenderer) blockquote(n *ast.Blockquote, enter bool) ast.WalkStatus { if enter { + r.startBlock() + defer r.endBlock() + // Create a segment. var seg = BlockquoteSegment{start: r.i()} diff --git a/segments/codeblock.go b/segments/codeblock.go index 2f24f10..dfa3fa7 100644 --- a/segments/codeblock.go +++ b/segments/codeblock.go @@ -14,6 +14,9 @@ var _ text.Codeblocker = (*CodeblockSegment)(nil) func (r *TextRenderer) codeblock(n *ast.FencedCodeBlock, enter bool) ast.WalkStatus { if enter { + r.startBlock() + defer r.endBlock() + // Create a segment. seg := CodeblockSegment{ start: r.i(), diff --git a/segments/md.go b/segments/md.go index 1da393b..a3d571b 100644 --- a/segments/md.go +++ b/segments/md.go @@ -2,6 +2,7 @@ package segments import ( "bytes" + "strings" "github.com/diamondburned/arikawa/discord" "github.com/diamondburned/arikawa/state" @@ -44,7 +45,7 @@ func RenderNode(source []byte, n ast.Node) text.Rich { ast.Walk(n, r.renderNode) return text.Rich{ - Content: buf.String(), + Content: string(bytes.TrimSpace(buf.Bytes())), Segments: r.segs, } } @@ -54,6 +55,34 @@ func (r *TextRenderer) i() int { return r.buf.Len() } +// startBlock guarantees enough indentation to start a new block. +func (r *TextRenderer) startBlock() { + var maxNewlines = 2 + + // Peek twice. + if r.peekLast(0) == '\n' { + maxNewlines-- + } + if r.peekLast(1) == '\n' { + maxNewlines-- + } + + // Write the padding. + r.buf.WriteString(strings.Repeat("\n", maxNewlines)) +} + +func (r *TextRenderer) endBlock() { + // Do the same thing as starting a block. + r.startBlock() +} + +func (r *TextRenderer) peekLast(offset int) byte { + if i := r.buf.Len() - offset - 1; i > 0 { + return r.buf.Bytes()[i] + } + return 0 +} + func (r *TextRenderer) append(segs ...text.Segment) { r.segs = append(r.segs, segs...) }