mirror of
https://github.com/rwinkhart/glamour-temp-MUTN.git
synced 2026-08-31 22:26:41 -04:00
Support styled indents for block elements
This commit is contained in:
+10
-2
@@ -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)
|
||||
}
|
||||
|
||||
+6
-3
@@ -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{
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user