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:
pe := &ParagraphElement{}
return Element{
Exiting: "\n",
Renderer: pe,
Finisher: pe,
}
+35 -18
View File
@@ -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
}