mirror of
https://github.com/rwinkhart/glamour-temp-MUTN.git
synced 2026-09-06 00:47:15 -04:00
Switch to goldmark parser
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package gold
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -8,6 +9,13 @@ import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/yuin/goldmark"
|
||||
"github.com/yuin/goldmark/ast"
|
||||
"github.com/yuin/goldmark/extension"
|
||||
astext "github.com/yuin/goldmark/extension/ast"
|
||||
"github.com/yuin/goldmark/parser"
|
||||
"github.com/yuin/goldmark/renderer"
|
||||
"github.com/yuin/goldmark/util"
|
||||
bf "gopkg.in/russross/blackfriday.v2"
|
||||
)
|
||||
|
||||
@@ -83,21 +91,83 @@ func (tr *TermRenderer) Render(in string) string {
|
||||
|
||||
// RenderBytes returns the markdown rendered into a byte slice.
|
||||
func (tr *TermRenderer) RenderBytes(in []byte) []byte {
|
||||
return bf.Run(in, bf.WithRenderer(tr))
|
||||
md := goldmark.New(
|
||||
goldmark.WithExtensions(extension.GFM),
|
||||
goldmark.WithParserOptions(
|
||||
parser.WithAutoHeadingID(),
|
||||
),
|
||||
)
|
||||
md.SetRenderer(
|
||||
renderer.NewRenderer(
|
||||
renderer.WithNodeRenderers(util.Prioritized(tr, 1000))))
|
||||
|
||||
var buf bytes.Buffer
|
||||
if err := md.Convert(in, &buf); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return buf.Bytes()
|
||||
}
|
||||
|
||||
// RenderNode renders a single markdown node.
|
||||
func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus {
|
||||
// RegisterFuncs implements NodeRenderer.RegisterFuncs .
|
||||
func (r *TermRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
|
||||
// blocks
|
||||
reg.Register(ast.KindDocument, r.renderNode)
|
||||
reg.Register(ast.KindHeading, r.renderNode)
|
||||
reg.Register(ast.KindBlockquote, r.renderNode)
|
||||
reg.Register(ast.KindCodeBlock, r.renderNode)
|
||||
reg.Register(ast.KindFencedCodeBlock, r.renderNode)
|
||||
reg.Register(ast.KindHTMLBlock, r.renderNode)
|
||||
reg.Register(ast.KindList, r.renderNode)
|
||||
reg.Register(ast.KindListItem, r.renderNode)
|
||||
reg.Register(ast.KindParagraph, r.renderNode)
|
||||
reg.Register(ast.KindTextBlock, r.renderNode)
|
||||
reg.Register(ast.KindThematicBreak, r.renderNode)
|
||||
|
||||
// inlines
|
||||
reg.Register(ast.KindAutoLink, r.renderNode)
|
||||
reg.Register(ast.KindCodeSpan, r.renderNode)
|
||||
reg.Register(ast.KindEmphasis, r.renderNode)
|
||||
reg.Register(ast.KindImage, r.renderNode)
|
||||
reg.Register(ast.KindLink, r.renderNode)
|
||||
reg.Register(ast.KindRawHTML, r.renderNode)
|
||||
reg.Register(ast.KindText, r.renderNode)
|
||||
reg.Register(ast.KindString, r.renderNode)
|
||||
|
||||
// tables
|
||||
reg.Register(astext.KindTable, r.renderNode)
|
||||
reg.Register(astext.KindTableHeader, r.renderNode)
|
||||
reg.Register(astext.KindTableRow, r.renderNode)
|
||||
reg.Register(astext.KindTableCell, r.renderNode)
|
||||
|
||||
// definitions
|
||||
reg.Register(astext.KindDefinitionList, r.renderNode)
|
||||
reg.Register(astext.KindDefinitionTerm, r.renderNode)
|
||||
reg.Register(astext.KindDefinitionDescription, r.renderNode)
|
||||
|
||||
// footnotes
|
||||
reg.Register(astext.KindFootnote, r.renderNode)
|
||||
reg.Register(astext.KindFootnoteList, r.renderNode)
|
||||
reg.Register(astext.KindFootnoteLink, r.renderNode)
|
||||
reg.Register(astext.KindFootnoteBackLink, r.renderNode)
|
||||
|
||||
// checkboxes
|
||||
reg.Register(astext.KindTaskCheckBox, r.renderNode)
|
||||
|
||||
// strikethrough
|
||||
reg.Register(astext.KindStrikethrough, r.renderNode)
|
||||
}
|
||||
|
||||
func (tr *TermRenderer) renderNode(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
|
||||
// _, _ = w.Write([]byte(node.Type.String()))
|
||||
writeTo := w
|
||||
writeTo := io.Writer(w)
|
||||
bs := tr.context.blockStack
|
||||
|
||||
// children get rendered by their parent
|
||||
if isChild(node) {
|
||||
return bf.GoToNext
|
||||
return ast.WalkContinue, nil
|
||||
}
|
||||
|
||||
e := tr.NewElement(node)
|
||||
e := tr.NewElement(node, source)
|
||||
if entering {
|
||||
// everything below the Document element gets rendered into a block buffer
|
||||
if bs.Len() > 0 {
|
||||
@@ -108,8 +178,7 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf
|
||||
if e.Renderer != nil {
|
||||
err := e.Renderer.Render(writeTo, tr.context)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return bf.Terminate
|
||||
return ast.WalkStop, err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -120,21 +189,20 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf
|
||||
|
||||
// if we're finished rendering the entire document,
|
||||
// flush to the real writer
|
||||
if node.Type == bf.Document {
|
||||
if node.Type() == ast.TypeDocument {
|
||||
writeTo = w
|
||||
}
|
||||
|
||||
if e.Finisher != nil {
|
||||
err := e.Finisher.Finish(writeTo, tr.context)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return bf.Terminate
|
||||
return ast.WalkStop, err
|
||||
}
|
||||
}
|
||||
_, _ = writeTo.Write([]byte(e.Exiting))
|
||||
_, _ = bs.Current().Block.Write([]byte(e.Exiting))
|
||||
}
|
||||
|
||||
return bf.GoToNext
|
||||
return ast.WalkContinue, nil
|
||||
}
|
||||
|
||||
// RenderHeader renders the markdown's header.
|
||||
@@ -145,14 +213,14 @@ func (tr *TermRenderer) RenderHeader(w io.Writer, ast *bf.Node) {
|
||||
func (tr *TermRenderer) RenderFooter(w io.Writer, ast *bf.Node) {
|
||||
}
|
||||
|
||||
func isChild(node *bf.Node) bool {
|
||||
if node.Parent == nil {
|
||||
func isChild(node ast.Node) bool {
|
||||
if node.Parent() == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// These types are already rendered by their parent
|
||||
switch node.Parent.Type {
|
||||
case bf.Heading, bf.Link, bf.Image, bf.TableCell, bf.Emph, bf.Strong:
|
||||
switch node.Parent().Kind() {
|
||||
case ast.KindLink, ast.KindImage, ast.KindEmphasis, ast.KindBlockquote, astext.KindTableCell:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
|
||||
Reference in New Issue
Block a user