diff --git a/codeblock.go b/codeblock.go index 616043f..baba628 100644 --- a/codeblock.go +++ b/codeblock.go @@ -14,13 +14,21 @@ type CodeBlockElement struct { func (e *CodeBlockElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error { var theme string + var indent uint + rules := tr.style[CodeBlock] if rules != nil { + indent = rules.Indent theme = rules.Theme } + iw := &IndentWriter{ + Indent: indent, + Forward: w, + } + if len(theme) > 0 { - return quick.Highlight(w, e.Code, e.Language, "terminal16m", theme) + return quick.Highlight(iw, e.Code, e.Language, "terminal16m", theme) } // fallback rendering @@ -28,5 +36,5 @@ func (e *CodeBlockElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) Token: string(e.Code), Style: CodeBlock, } - return el.Render(w, node, tr) + return el.Render(iw, node, tr) } diff --git a/elements.go b/elements.go index 4e5404a..34069bd 100644 --- a/elements.go +++ b/elements.go @@ -49,9 +49,11 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element { Renderer: &ItemElement{}, } case bf.Paragraph: + pe := &ParagraphElement{} return Element{ Exiting: "\n", - Renderer: &ParagraphElement{}, + Renderer: pe, + Finisher: pe, } case bf.Heading: return Element{ @@ -149,10 +151,11 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element { }, } case bf.Table: + te := &TableElement{} return Element{ Entering: "\n", - Renderer: &TableElement{}, - Finisher: &TableElement{}, + Renderer: te, + Finisher: te, } case bf.TableCell: return Element{ diff --git a/gold.go b/gold.go index d8d3636..6a61f07 100644 --- a/gold.go +++ b/gold.go @@ -11,7 +11,6 @@ import ( "os" "github.com/microcosm-cc/bluemonday" - "github.com/muesli/reflow" bf "gopkg.in/russross/blackfriday.v2" ) @@ -25,7 +24,7 @@ type TermRenderer struct { style map[StyleType]*ElementStyle table TableElement - paragraph bytes.Buffer + paragraph *bytes.Buffer } func Render(in string, stylePath string) ([]byte, error) { @@ -86,23 +85,26 @@ func (tr *TermRenderer) RenderBytes(in []byte) []byte { } func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { - // fmt.Fprintf(w, "%s %t", node.Type, entering) + if isChild(node) { + return bf.GoToNext + } + e := tr.NewElement(node) - if entering { - if node.Type == bf.Paragraph { - _, _ = w.Write(tr.paragraph.Bytes()) - tr.paragraph.Reset() - } - if isChild(node) { - return bf.GoToNext + if e.Entering != "" { + _, _ = w.Write([]byte(e.Entering)) } - if e.Entering != "" { - tr.paragraph.WriteString(e.Entering) + writeTo := w + if node.Type == bf.Paragraph { + tr.paragraph = &bytes.Buffer{} } + if tr.paragraph != nil { + writeTo = tr.paragraph + } + if e.Renderer != nil { - err := e.Renderer.Render(&tr.paragraph, node, tr) + err := e.Renderer.Render(writeTo, node, tr) if err != nil { fmt.Println(err) return bf.Terminate @@ -110,19 +112,19 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf } } else { if e.Finisher != nil { - err := e.Finisher.Finish(&tr.paragraph, node, tr) + err := e.Finisher.Finish(w, node, tr) if err != nil { fmt.Println(err) return bf.Terminate } } - if e.Exiting != "" { - tr.paragraph.WriteString(e.Exiting) - } if node.Type == bf.Paragraph { - _, _ = w.Write(reflow.ReflowBytes(tr.paragraph.Bytes(), tr.WordWrap)) - tr.paragraph.Reset() + _, _ = w.Write(tr.paragraph.Bytes()) + tr.paragraph = nil + } + if e.Exiting != "" { + _, _ = w.Write([]byte(e.Exiting)) } } diff --git a/paragraph.go b/paragraph.go index dda4fb5..931aeb9 100644 --- a/paragraph.go +++ b/paragraph.go @@ -3,6 +3,7 @@ package gold import ( "io" + "github.com/muesli/reflow" bf "gopkg.in/russross/blackfriday.v2" ) @@ -22,3 +23,19 @@ func (e *ParagraphElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) } return el.Render(w, node, tr) } + +func (e *ParagraphElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) error { + var indent uint + rules := tr.style[Paragraph] + if rules != nil { + indent = rules.Indent + } + iw := &IndentWriter{ + Indent: indent, + Forward: w, + } + + _, err := iw.Write(reflow.ReflowBytes(tr.paragraph.Bytes(), tr.WordWrap-int(indent))) + tr.paragraph.Reset() + return err +} diff --git a/style.go b/style.go index 0bf6499..96b5df9 100644 --- a/style.go +++ b/style.go @@ -26,6 +26,7 @@ const ( CodeBlock Softbreak Hardbreak + Indent Code HTMLSpan Table @@ -47,6 +48,7 @@ type ElementStyle struct { Overlined bool `json:"overlined"` Inverse bool `json:"inverse"` Blink bool `json:"blink"` + Indent uint `json:"indent"` Theme string `json:"theme"` Prefix string `json:"prefix"` Suffix string `json:"suffix"` @@ -92,6 +94,8 @@ func keyToType(key string) (StyleType, error) { return Softbreak, nil case "hardbreak": return Hardbreak, nil + case "indent": + return Indent, nil case "code": return Code, nil case "html_span": diff --git a/table.go b/table.go index 7869db5..5e69381 100644 --- a/table.go +++ b/table.go @@ -23,7 +23,17 @@ type TableCellElement struct { } func (e *TableElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error { - tr.table.writer = tablewriter.NewWriter(w) + var indent uint + rules := tr.style[Table] + if rules != nil { + indent = rules.Indent + } + iw := &IndentWriter{ + Indent: indent, + Forward: w, + } + + tr.table.writer = tablewriter.NewWriter(iw) return nil }