Source File
renderer.go
Belonging Package
github.com/yuin/goldmark/renderer
package renderer
import (
)
type Config struct {
Options map[OptionName]interface{}
NodeRenderers util.PrioritizedSlice
}
func () *Config {
return &Config{
Options: map[OptionName]interface{}{},
NodeRenderers: util.PrioritizedSlice{},
}
}
type OptionName string
type Option interface {
SetConfig(*Config)
}
type withNodeRenderers struct {
value []util.PrioritizedValue
}
func ( *withNodeRenderers) ( *Config) {
.NodeRenderers = append(.NodeRenderers, .value...)
}
func ( ...util.PrioritizedValue) Option {
return &withNodeRenderers{}
}
type withOption struct {
name OptionName
value interface{}
}
func ( *withOption) ( *Config) {
.Options[.name] = .value
}
func ( OptionName, interface{}) Option {
return &withOption{, }
}
SetOption(name OptionName, value interface{})
}
type NodeRendererFunc func(writer util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error)
RegisterFuncs(NodeRendererFuncRegisterer)
}
Register(ast.NodeKind, NodeRendererFunc)
}
AddOptions(...Option)
}
type renderer struct {
config *Config
options map[OptionName]interface{}
nodeRendererFuncsTmp map[ast.NodeKind]NodeRendererFunc
maxKind int
nodeRendererFuncs []NodeRendererFunc
initSync sync.Once
}
func ( ...Option) Renderer {
:= NewConfig()
for , := range {
.SetConfig()
}
:= &renderer{
options: map[OptionName]interface{}{},
config: ,
nodeRendererFuncsTmp: map[ast.NodeKind]NodeRendererFunc{},
}
return
}
func ( *renderer) ( ...Option) {
for , := range {
.SetConfig(.config)
}
}
func ( *renderer) ( ast.NodeKind, NodeRendererFunc) {
.nodeRendererFuncsTmp[] =
if int() > .maxKind {
.maxKind = int()
}
}
func ( *renderer) ( io.Writer, []byte, ast.Node) error {
.initSync.Do(func() {
.options = .config.Options
.config.NodeRenderers.Sort()
:= len(.config.NodeRenderers)
for := - 1; >= 0; -- {
:= .config.NodeRenderers[]
, := .Value.(NodeRenderer)
if , := .Value.(SetOptioner); {
for , := range .options {
.SetOption(, )
}
}
.RegisterFuncs()
}
.nodeRendererFuncs = make([]NodeRendererFunc, .maxKind+1)
for , := range .nodeRendererFuncsTmp {
.nodeRendererFuncs[] =
}
.config = nil
.nodeRendererFuncsTmp = nil
})
, := .(util.BufWriter)
if ! {
= bufio.NewWriter()
}
:= ast.Walk(, func( ast.Node, bool) (ast.WalkStatus, error) {
:= ast.WalkStatus(ast.WalkContinue)
var error
:= .nodeRendererFuncs[.Kind()]
if != nil {
, = (, , , )
}
return ,
})
if != nil {
return
}
return .Flush()
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |