summaryrefslogtreecommitdiff
path: root/vendor/github.com/yuin/goldmark/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/yuin/goldmark/renderer')
-rw-r--r--vendor/github.com/yuin/goldmark/renderer/html/html.go34
-rw-r--r--vendor/github.com/yuin/goldmark/renderer/renderer.go14
2 files changed, 28 insertions, 20 deletions
diff --git a/vendor/github.com/yuin/goldmark/renderer/html/html.go b/vendor/github.com/yuin/goldmark/renderer/html/html.go
index 903dc68..c0b72ce 100644
--- a/vendor/github.com/yuin/goldmark/renderer/html/html.go
+++ b/vendor/github.com/yuin/goldmark/renderer/html/html.go
@@ -34,7 +34,7 @@ func NewConfig() Config {
}
// SetOption implements renderer.NodeRenderer.SetOption.
-func (c *Config) SetOption(name renderer.OptionName, value interface{}) {
+func (c *Config) SetOption(name renderer.OptionName, value any) {
switch name {
case optHardWraps:
c.HardWraps = value.(bool)
@@ -273,6 +273,10 @@ func (r *Renderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
reg.Register(ast.KindParagraph, r.renderParagraph)
reg.Register(ast.KindTextBlock, r.renderTextBlock)
reg.Register(ast.KindThematicBreak, r.renderThematicBreak)
+ reg.Register(ast.KindLinkReferenceDefinition, func(
+ _ util.BufWriter, _ []byte, _ ast.Node, _ bool) (ast.WalkStatus, error) {
+ return ast.WalkSkipChildren, nil
+ })
// inlines
@@ -288,7 +292,7 @@ func (r *Renderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
func (r *Renderer) writeLines(w util.BufWriter, source []byte, n ast.Node) {
l := n.Lines().Len()
- for i := 0; i < l; i++ {
+ for i := range l {
line := n.Lines().At(i)
r.Writer.RawWrite(w, line.Value(source))
}
@@ -378,7 +382,7 @@ func (r *Renderer) renderHTMLBlock(
if entering {
if r.Unsafe {
l := n.Lines().Len()
- for i := 0; i < l; i++ {
+ for i := range l {
line := n.Lines().At(i)
r.Writer.SecureWrite(w, line.Value(source))
}
@@ -497,7 +501,7 @@ func (r *Renderer) renderThematicBreak(
}
// LinkAttributeFilter defines attribute names which link elements can have.
-var LinkAttributeFilter = GlobalAttributeFilter.ExtendString(`download,hreflang,media,ping,referrerpolicy,rel,shape,target`) // nolint:lll
+var LinkAttributeFilter = GlobalAttributeFilter.ExtendString(`download,href,lang,media,ping,referrerpolicy,rel,shape,target`) // nolint:lll
func (r *Renderer) renderAutoLink(
w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
@@ -506,12 +510,14 @@ func (r *Renderer) renderAutoLink(
return ast.WalkContinue, nil
}
_, _ = w.WriteString(`<a href="`)
- url := n.URL(source)
+ url := util.URLEscape(n.URL(source), false)
label := n.Label(source)
if n.AutoLinkType == ast.AutoLinkEmail && !bytes.HasPrefix(bytes.ToLower(url), []byte("mailto:")) {
_, _ = w.WriteString("mailto:")
}
- _, _ = w.Write(util.EscapeHTML(util.URLEscape(url, false)))
+ if r.Unsafe || !IsDangerousURL(url) {
+ _, _ = w.Write(util.EscapeHTML(url))
+ }
if n.Attributes() != nil {
_ = w.WriteByte('"')
RenderAttributes(w, n, LinkAttributeFilter)
@@ -581,8 +587,9 @@ func (r *Renderer) renderLink(w util.BufWriter, source []byte, node ast.Node, en
n := node.(*ast.Link)
if entering {
_, _ = w.WriteString("<a href=\"")
- if r.Unsafe || !IsDangerousURL(n.Destination) {
- _, _ = w.Write(util.EscapeHTML(util.URLEscape(n.Destination, true)))
+ dest := util.URLEscape(n.Destination, true)
+ if r.Unsafe || !IsDangerousURL(dest) {
+ _, _ = w.Write(util.EscapeHTML(dest))
}
_ = w.WriteByte('"')
if n.Title != nil {
@@ -609,8 +616,9 @@ func (r *Renderer) renderImage(w util.BufWriter, source []byte, node ast.Node, e
}
n := node.(*ast.Image)
_, _ = w.WriteString("<img src=\"")
- if r.Unsafe || !IsDangerousURL(n.Destination) {
- _, _ = w.Write(util.EscapeHTML(util.URLEscape(n.Destination, true)))
+ dest := util.URLEscape(n.Destination, true)
+ if r.Unsafe || !IsDangerousURL(dest) {
+ _, _ = w.Write(util.EscapeHTML(dest))
}
_, _ = w.WriteString(`" alt="`)
r.renderTexts(w, source, n)
@@ -639,7 +647,7 @@ func (r *Renderer) renderRawHTML(
if r.Unsafe {
n := node.(*ast.RawHTML)
l := n.Segments.Len()
- for i := 0; i < l; i++ {
+ for i := range l {
segment := n.Segments.At(i)
_, _ = w.Write(segment.Value(source))
}
@@ -802,7 +810,7 @@ func escapeRune(writer util.BufWriter, r rune) {
func (d *defaultWriter) SecureWrite(writer util.BufWriter, source []byte) {
n := 0
l := len(source)
- for i := 0; i < l; i++ {
+ for i := range l {
if source[i] == '\u0000' {
_, _ = writer.Write(source[i-n : i])
n = 0
@@ -819,7 +827,7 @@ func (d *defaultWriter) SecureWrite(writer util.BufWriter, source []byte) {
func (d *defaultWriter) RawWrite(writer util.BufWriter, source []byte) {
n := 0
l := len(source)
- for i := 0; i < l; i++ {
+ for i := range l {
v := util.EscapeHTMLByte(source[i])
if v != nil {
_, _ = writer.Write(source[i-n : i])
diff --git a/vendor/github.com/yuin/goldmark/renderer/renderer.go b/vendor/github.com/yuin/goldmark/renderer/renderer.go
index 5b40465..8f1c912 100644
--- a/vendor/github.com/yuin/goldmark/renderer/renderer.go
+++ b/vendor/github.com/yuin/goldmark/renderer/renderer.go
@@ -12,14 +12,14 @@ import (
// A Config struct is a data structure that holds configuration of the Renderer.
type Config struct {
- Options map[OptionName]interface{}
+ Options map[OptionName]any
NodeRenderers util.PrioritizedSlice
}
// NewConfig returns a new Config.
func NewConfig() *Config {
return &Config{
- Options: map[OptionName]interface{}{},
+ Options: map[OptionName]any{},
NodeRenderers: util.PrioritizedSlice{},
}
}
@@ -48,7 +48,7 @@ func WithNodeRenderers(ps ...util.PrioritizedValue) Option {
type withOption struct {
name OptionName
- value interface{}
+ value any
}
func (o *withOption) SetConfig(c *Config) {
@@ -57,7 +57,7 @@ func (o *withOption) SetConfig(c *Config) {
// WithOption is a functional option that allow you to set
// an arbitrary option to the parser.
-func WithOption(name OptionName, value interface{}) Option {
+func WithOption(name OptionName, value any) Option {
return &withOption{name, value}
}
@@ -66,7 +66,7 @@ type SetOptioner interface {
// SetOption sets given option to the object.
// Unacceptable options may be passed.
// Thus implementations must ignore unacceptable options.
- SetOption(name OptionName, value interface{})
+ SetOption(name OptionName, value any)
}
// NodeRendererFunc is a function that renders a given node.
@@ -95,7 +95,7 @@ type Renderer interface {
type renderer struct {
config *Config
- options map[OptionName]interface{}
+ options map[OptionName]any
nodeRendererFuncsTmp map[ast.NodeKind]NodeRendererFunc
maxKind int
nodeRendererFuncs []NodeRendererFunc
@@ -110,7 +110,7 @@ func NewRenderer(options ...Option) Renderer {
}
r := &renderer{
- options: map[OptionName]interface{}{},
+ options: map[OptionName]any{},
config: config,
nodeRendererFuncsTmp: map[ast.NodeKind]NodeRendererFunc{},
}