diff --git a/baselement.go b/baselement.go index c299934..90d337b 100644 --- a/baselement.go +++ b/baselement.go @@ -15,7 +15,7 @@ type BaseElement struct { Style StyleType } -func (e *BaseElement) renderText(w io.Writer, rules *ElementStyle, s string) { +func renderText(w io.Writer, rules *ElementStyle, s string) { out := aurora.Reset(s) if rules.Color != "" { i, err := strconv.Atoi(rules.Color) @@ -72,14 +72,14 @@ func (e *BaseElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error } if rules.Prefix != "" { - e.renderText(w, rules, rules.Prefix) + renderText(w, rules, rules.Prefix) } defer func() { if rules.Suffix != "" { - e.renderText(w, rules, rules.Suffix) + renderText(w, rules, rules.Suffix) } }() - e.renderText(w, rules, e.Token) + renderText(w, rules, e.Token) return nil } diff --git a/document.go b/document.go new file mode 100644 index 0000000..2a9014c --- /dev/null +++ b/document.go @@ -0,0 +1,46 @@ +package gold + +import ( + "io" + + bf "gopkg.in/russross/blackfriday.v2" +) + +type DocumentElement struct { +} + +func (e *DocumentElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error { + rules := tr.style[Document] + if rules != nil { + if rules.Prefix != "" { + renderText(w, rules, rules.Prefix) + } + } + return nil +} + +func (e *DocumentElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) error { + var indent uint + suffix := "" + rules := tr.style[Document] + if rules != nil { + indent = rules.Indent + suffix = rules.Suffix + } + + iw := &IndentWriter{ + Indent: indent, + Forward: w, + } + + _, err := iw.Write(tr.document.Bytes()) + if err != nil { + return err + } + tr.document.Reset() + + if suffix != "" { + renderText(iw, rules, suffix) + } + return nil +} diff --git a/elements.go b/elements.go index 34069bd..d1429a7 100644 --- a/elements.go +++ b/elements.go @@ -26,10 +26,10 @@ type Element struct { func (tr *TermRenderer) NewElement(node *bf.Node) Element { switch node.Type { case bf.Document: + de := &DocumentElement{} return Element{ - Renderer: &BaseElement{ - Style: Document, - }, + Renderer: de, + Finisher: de, } case bf.BlockQuote: return Element{ diff --git a/gold.go b/gold.go index 6a61f07..3597919 100644 --- a/gold.go +++ b/gold.go @@ -23,8 +23,9 @@ type TermRenderer struct { WordWrap int style map[StyleType]*ElementStyle - table TableElement + document bytes.Buffer paragraph *bytes.Buffer + table TableElement } func Render(in string, stylePath string) ([]byte, error) { @@ -85,6 +86,8 @@ func (tr *TermRenderer) RenderBytes(in []byte) []byte { } func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { + writeTo := io.Writer(&tr.document) + if isChild(node) { return bf.GoToNext } @@ -92,10 +95,9 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf e := tr.NewElement(node) if entering { if e.Entering != "" { - _, _ = w.Write([]byte(e.Entering)) + _, _ = tr.document.Write([]byte(e.Entering)) } - writeTo := w if node.Type == bf.Paragraph { tr.paragraph = &bytes.Buffer{} } @@ -111,8 +113,12 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf } } } else { + if node.Type == bf.Document { + writeTo = w + } + if e.Finisher != nil { - err := e.Finisher.Finish(w, node, tr) + err := e.Finisher.Finish(writeTo, node, tr) if err != nil { fmt.Println(err) return bf.Terminate @@ -120,11 +126,10 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf } if node.Type == bf.Paragraph { - _, _ = w.Write(tr.paragraph.Bytes()) tr.paragraph = nil } if e.Exiting != "" { - _, _ = w.Write([]byte(e.Exiting)) + _, _ = tr.document.Write([]byte(e.Exiting)) } } diff --git a/paragraph.go b/paragraph.go index 931aeb9..a45e153 100644 --- a/paragraph.go +++ b/paragraph.go @@ -16,20 +16,31 @@ func (e *ParagraphElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) pre = "" } - el := &BaseElement{ - Prefix: pre, - Token: string(node.Literal), - Style: Paragraph, + rules := tr.style[Paragraph] + if rules == nil { + _, _ = w.Write([]byte(pre)) + } else { + renderText(w, rules, pre) + + if rules.Prefix != "" { + renderText(w, rules, rules.Prefix) + } } - return el.Render(w, node, tr) + return nil } func (e *ParagraphElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) error { var indent uint + suffix := "" rules := tr.style[Paragraph] if rules != nil { indent = rules.Indent + suffix = rules.Suffix } + if suffix != "" { + renderText(tr.paragraph, rules, suffix) + } + iw := &IndentWriter{ Indent: indent, Forward: w,