Support styled indents for block elements

This commit is contained in:
Christian Muehlhaeuser
2019-11-30 06:43:13 +01:00
parent f70d879a63
commit d37d023d5d
6 changed files with 69 additions and 25 deletions
+10 -2
View File
@@ -14,13 +14,21 @@ type CodeBlockElement struct {
func (e *CodeBlockElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error { func (e *CodeBlockElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error {
var theme string var theme string
var indent uint
rules := tr.style[CodeBlock] rules := tr.style[CodeBlock]
if rules != nil { if rules != nil {
indent = rules.Indent
theme = rules.Theme theme = rules.Theme
} }
iw := &IndentWriter{
Indent: indent,
Forward: w,
}
if len(theme) > 0 { 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 // fallback rendering
@@ -28,5 +36,5 @@ func (e *CodeBlockElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer)
Token: string(e.Code), Token: string(e.Code),
Style: CodeBlock, Style: CodeBlock,
} }
return el.Render(w, node, tr) return el.Render(iw, node, tr)
} }
+6 -3
View File
@@ -49,9 +49,11 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
Renderer: &ItemElement{}, Renderer: &ItemElement{},
} }
case bf.Paragraph: case bf.Paragraph:
pe := &ParagraphElement{}
return Element{ return Element{
Exiting: "\n", Exiting: "\n",
Renderer: &ParagraphElement{}, Renderer: pe,
Finisher: pe,
} }
case bf.Heading: case bf.Heading:
return Element{ return Element{
@@ -149,10 +151,11 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
}, },
} }
case bf.Table: case bf.Table:
te := &TableElement{}
return Element{ return Element{
Entering: "\n", Entering: "\n",
Renderer: &TableElement{}, Renderer: te,
Finisher: &TableElement{}, Finisher: te,
} }
case bf.TableCell: case bf.TableCell:
return Element{ return Element{
+21 -19
View File
@@ -11,7 +11,6 @@ import (
"os" "os"
"github.com/microcosm-cc/bluemonday" "github.com/microcosm-cc/bluemonday"
"github.com/muesli/reflow"
bf "gopkg.in/russross/blackfriday.v2" bf "gopkg.in/russross/blackfriday.v2"
) )
@@ -25,7 +24,7 @@ type TermRenderer struct {
style map[StyleType]*ElementStyle style map[StyleType]*ElementStyle
table TableElement table TableElement
paragraph bytes.Buffer paragraph *bytes.Buffer
} }
func Render(in string, stylePath string) ([]byte, error) { 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 { 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) e := tr.NewElement(node)
if entering { if entering {
if node.Type == bf.Paragraph { if e.Entering != "" {
_, _ = w.Write(tr.paragraph.Bytes()) _, _ = w.Write([]byte(e.Entering))
tr.paragraph.Reset()
}
if isChild(node) {
return bf.GoToNext
} }
if e.Entering != "" { writeTo := w
tr.paragraph.WriteString(e.Entering) if node.Type == bf.Paragraph {
tr.paragraph = &bytes.Buffer{}
} }
if tr.paragraph != nil {
writeTo = tr.paragraph
}
if e.Renderer != nil { if e.Renderer != nil {
err := e.Renderer.Render(&tr.paragraph, node, tr) err := e.Renderer.Render(writeTo, node, tr)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return bf.Terminate return bf.Terminate
@@ -110,19 +112,19 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf
} }
} else { } else {
if e.Finisher != nil { if e.Finisher != nil {
err := e.Finisher.Finish(&tr.paragraph, node, tr) err := e.Finisher.Finish(w, node, tr)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return bf.Terminate return bf.Terminate
} }
} }
if e.Exiting != "" {
tr.paragraph.WriteString(e.Exiting)
}
if node.Type == bf.Paragraph { if node.Type == bf.Paragraph {
_, _ = w.Write(reflow.ReflowBytes(tr.paragraph.Bytes(), tr.WordWrap)) _, _ = w.Write(tr.paragraph.Bytes())
tr.paragraph.Reset() tr.paragraph = nil
}
if e.Exiting != "" {
_, _ = w.Write([]byte(e.Exiting))
} }
} }
+17
View File
@@ -3,6 +3,7 @@ package gold
import ( import (
"io" "io"
"github.com/muesli/reflow"
bf "gopkg.in/russross/blackfriday.v2" 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) 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
}
+4
View File
@@ -26,6 +26,7 @@ const (
CodeBlock CodeBlock
Softbreak Softbreak
Hardbreak Hardbreak
Indent
Code Code
HTMLSpan HTMLSpan
Table Table
@@ -47,6 +48,7 @@ type ElementStyle struct {
Overlined bool `json:"overlined"` Overlined bool `json:"overlined"`
Inverse bool `json:"inverse"` Inverse bool `json:"inverse"`
Blink bool `json:"blink"` Blink bool `json:"blink"`
Indent uint `json:"indent"`
Theme string `json:"theme"` Theme string `json:"theme"`
Prefix string `json:"prefix"` Prefix string `json:"prefix"`
Suffix string `json:"suffix"` Suffix string `json:"suffix"`
@@ -92,6 +94,8 @@ func keyToType(key string) (StyleType, error) {
return Softbreak, nil return Softbreak, nil
case "hardbreak": case "hardbreak":
return Hardbreak, nil return Hardbreak, nil
case "indent":
return Indent, nil
case "code": case "code":
return Code, nil return Code, nil
case "html_span": case "html_span":
+11 -1
View File
@@ -23,7 +23,17 @@ type TableCellElement struct {
} }
func (e *TableElement) Render(w io.Writer, node *bf.Node, tr *TermRenderer) error { 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 return nil
} }