diff options
Diffstat (limited to 'vendor/github.com/yuin/goldmark/renderer')
| -rw-r--r-- | vendor/github.com/yuin/goldmark/renderer/html/html.go | 34 | ||||
| -rw-r--r-- | vendor/github.com/yuin/goldmark/renderer/renderer.go | 14 |
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{}, } |
