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
}
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
}
+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 {
switch node.Type {
case bf.Document:
de := &DocumentElement{}
return Element{
Renderer: &BaseElement{
Style: Document,
},
Renderer: de,
Finisher: de,
}
case bf.BlockQuote:
return Element{
+11 -6
View File
@@ -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))
}
}
+16 -5
View File
@@ -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,