Make document indentable

This commit is contained in:
Christian Muehlhaeuser
2019-11-30 08:07:40 +01:00
parent fca5fd91d6
commit d6d52829bb
5 changed files with 80 additions and 18 deletions
+4 -4
View File
@@ -15,7 +15,7 @@ type BaseElement struct {
Style StyleType 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) out := aurora.Reset(s)
if rules.Color != "" { if rules.Color != "" {
i, err := strconv.Atoi(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 != "" { if rules.Prefix != "" {
e.renderText(w, rules, rules.Prefix) renderText(w, rules, rules.Prefix)
} }
defer func() { defer func() {
if rules.Suffix != "" { 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 return nil
} }
+46
View File
@@ -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
}
+3 -3
View File
@@ -26,10 +26,10 @@ type Element struct {
func (tr *TermRenderer) NewElement(node *bf.Node) Element { func (tr *TermRenderer) NewElement(node *bf.Node) Element {
switch node.Type { switch node.Type {
case bf.Document: case bf.Document:
de := &DocumentElement{}
return Element{ return Element{
Renderer: &BaseElement{ Renderer: de,
Style: Document, Finisher: de,
},
} }
case bf.BlockQuote: case bf.BlockQuote:
return Element{ return Element{
+11 -6
View File
@@ -23,8 +23,9 @@ type TermRenderer struct {
WordWrap int WordWrap int
style map[StyleType]*ElementStyle style map[StyleType]*ElementStyle
table TableElement document bytes.Buffer
paragraph *bytes.Buffer paragraph *bytes.Buffer
table TableElement
} }
func Render(in string, stylePath string) ([]byte, error) { 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 { func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus {
writeTo := io.Writer(&tr.document)
if isChild(node) { if isChild(node) {
return bf.GoToNext return bf.GoToNext
} }
@@ -92,10 +95,9 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf
e := tr.NewElement(node) e := tr.NewElement(node)
if entering { if entering {
if e.Entering != "" { if e.Entering != "" {
_, _ = w.Write([]byte(e.Entering)) _, _ = tr.document.Write([]byte(e.Entering))
} }
writeTo := w
if node.Type == bf.Paragraph { if node.Type == bf.Paragraph {
tr.paragraph = &bytes.Buffer{} tr.paragraph = &bytes.Buffer{}
} }
@@ -111,8 +113,12 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf
} }
} }
} else { } else {
if node.Type == bf.Document {
writeTo = w
}
if e.Finisher != nil { if e.Finisher != nil {
err := e.Finisher.Finish(w, node, tr) err := e.Finisher.Finish(writeTo, node, tr)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return bf.Terminate 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 { if node.Type == bf.Paragraph {
_, _ = w.Write(tr.paragraph.Bytes())
tr.paragraph = nil tr.paragraph = nil
} }
if e.Exiting != "" { if e.Exiting != "" {
_, _ = w.Write([]byte(e.Exiting)) _, _ = tr.document.Write([]byte(e.Exiting))
} }
} }
+16 -5
View File
@@ -16,20 +16,31 @@ func (e *ParagraphElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer)
pre = "" pre = ""
} }
el := &BaseElement{ rules := tr.style[Paragraph]
Prefix: pre, if rules == nil {
Token: string(node.Literal), _, _ = w.Write([]byte(pre))
Style: Paragraph, } 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 { func (e *ParagraphElement) Finish(w io.Writer, node *bf.Node, tr *TermRenderer) error {
var indent uint var indent uint
suffix := ""
rules := tr.style[Paragraph] rules := tr.style[Paragraph]
if rules != nil { if rules != nil {
indent = rules.Indent indent = rules.Indent
suffix = rules.Suffix
} }
if suffix != "" {
renderText(tr.paragraph, rules, suffix)
}
iw := &IndentWriter{ iw := &IndentWriter{
Indent: indent, Indent: indent,
Forward: w, Forward: w,