Use PaddingWriter to render paragraphs

This commit is contained in:
Christian Muehlhaeuser
2019-12-04 05:21:37 +01:00
parent c2a1ec4ccd
commit 92e1c2dde8
2 changed files with 35 additions and 19 deletions
-1
View File
@@ -51,7 +51,6 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
case bf.Paragraph: case bf.Paragraph:
pe := &ParagraphElement{} pe := &ParagraphElement{}
return Element{ return Element{
Exiting: "\n",
Renderer: pe, Renderer: pe,
Finisher: pe, Finisher: pe,
} }
+34 -17
View File
@@ -14,22 +14,16 @@ type ParagraphElement struct {
func (e *ParagraphElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error { func (e *ParagraphElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error {
tr.paragraph = &bytes.Buffer{} tr.paragraph = &bytes.Buffer{}
rules := tr.style[Paragraph] rules := tr.style[Paragraph]
pre := "\n"
if node.Prev == nil || (node.Parent != nil && node.Parent.Type == bf.Item) {
pre = ""
rules.Indent = 0
}
if rules == nil {
_, _ = w.Write([]byte(pre))
} else {
tr.blockStyle.Push(rules) tr.blockStyle.Push(rules)
renderText(w, rules, pre)
if rules.Prefix != "" { if node.Prev == nil || (node.Parent != nil && node.Parent.Type == bf.Item) {
renderText(w, rules, rules.Prefix) // list item
} else {
_, _ = w.Write([]byte("\n"))
} }
if rules != nil && rules.Prefix != "" {
renderText(w, tr.blockStyle.Current(), rules.Prefix)
} }
return nil return nil
} }
@@ -37,23 +31,46 @@ func (e *ParagraphElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer)
func (e *ParagraphElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) error { func (e *ParagraphElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) error {
var indent uint var indent uint
suffix := "" suffix := ""
rules := tr.style[Paragraph] rules := tr.blockStyle.Current()
if rules != nil { if rules != nil {
indent = rules.Indent indent = rules.Indent
suffix = rules.Suffix suffix = rules.Suffix
if node.Prev == nil || (node.Parent != nil && node.Parent.Type == bf.Item) {
indent = 0
}
} }
if suffix != "" { if suffix != "" {
renderText(tr.paragraph, rules, suffix) renderText(tr.paragraph, rules, suffix)
} }
pw := &PaddingWriter{
Padding: uint(tr.WordWrap + int(indent) - int(tr.blockStyle.Indent())),
PadFunc: func(wr io.Writer) {
renderText(w, rules, " ")
},
Forward: &AnsiWriter{
Forward: w,
},
}
iw := &IndentWriter{ iw := &IndentWriter{
Indent: indent, Indent: indent,
Forward: w, Forward: &AnsiWriter{
Forward: pw,
},
} }
_, err := iw.Write(reflow.ReflowBytes(tr.paragraph.Bytes(), tr.WordWrap-int(indent))) _, err := iw.Write(reflow.ReflowBytes(tr.paragraph.Bytes(), tr.WordWrap-int(tr.blockStyle.Indent())))
if err != nil {
return err
}
_, _ = pw.Write([]byte("\n"))
tr.paragraph.Reset() tr.paragraph.Reset()
tr.paragraph = nil tr.paragraph = nil
if rules != nil {
tr.blockStyle.Pop() tr.blockStyle.Pop()
return err }
return nil
} }