mirror of
https://github.com/rwinkhart/glamour-temp-MUTN.git
synced 2026-09-06 08:57:14 -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 {
|
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
@@ -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{
|
||||||
|
|||||||
@@ -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)
|
|
||||||
e := tr.NewElement(node)
|
|
||||||
|
|
||||||
if entering {
|
|
||||||
if node.Type == bf.Paragraph {
|
|
||||||
_, _ = w.Write(tr.paragraph.Bytes())
|
|
||||||
tr.paragraph.Reset()
|
|
||||||
}
|
|
||||||
if isChild(node) {
|
if isChild(node) {
|
||||||
return bf.GoToNext
|
return bf.GoToNext
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e := tr.NewElement(node)
|
||||||
|
if entering {
|
||||||
if e.Entering != "" {
|
if e.Entering != "" {
|
||||||
tr.paragraph.WriteString(e.Entering)
|
_, _ = w.Write([]byte(e.Entering))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
writeTo := w
|
||||||
|
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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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":
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user