From 92e1c2dde86cef7e547cb7364508b4024a226318 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Dec 2019 05:21:37 +0100 Subject: [PATCH] Use PaddingWriter to render paragraphs --- elements.go | 1 - paragraph.go | 53 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/elements.go b/elements.go index d1429a7..c814479 100644 --- a/elements.go +++ b/elements.go @@ -51,7 +51,6 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element { case bf.Paragraph: pe := &ParagraphElement{} return Element{ - Exiting: "\n", Renderer: pe, Finisher: pe, } diff --git a/paragraph.go b/paragraph.go index ccb2a49..4db2acb 100644 --- a/paragraph.go +++ b/paragraph.go @@ -14,22 +14,16 @@ type ParagraphElement struct { func (e *ParagraphElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error { tr.paragraph = &bytes.Buffer{} rules := tr.style[Paragraph] + tr.blockStyle.Push(rules) - pre := "\n" if node.Prev == nil || (node.Parent != nil && node.Parent.Type == bf.Item) { - pre = "" - rules.Indent = 0 + // list item + } else { + _, _ = w.Write([]byte("\n")) } - if rules == nil { - _, _ = w.Write([]byte(pre)) - } else { - tr.blockStyle.Push(rules) - renderText(w, rules, pre) - - if rules.Prefix != "" { - renderText(w, rules, rules.Prefix) - } + if rules != nil && rules.Prefix != "" { + renderText(w, tr.blockStyle.Current(), rules.Prefix) } 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 { var indent uint suffix := "" - rules := tr.style[Paragraph] + rules := tr.blockStyle.Current() if rules != nil { indent = rules.Indent suffix = rules.Suffix + + if node.Prev == nil || (node.Parent != nil && node.Parent.Type == bf.Item) { + indent = 0 + } } if 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{ - Indent: indent, - Forward: w, + Indent: indent, + 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 = nil - tr.blockStyle.Pop() - return err + if rules != nil { + tr.blockStyle.Pop() + } + + return nil }