appview/pages/markup: add description filter #507

merged
opened by oppi.li targeting master from push-sssuxsytslts

this sanitizer only renders a tiny subset of markdown, to be used in inline elements like PR titles and repo descriptions etc.

Signed-off-by: oppiliappan me@oppi.li

Changed files
+38 -4
appview
+6 -1
appview/pages/funcmap.go
···
}
return v.Slice(0, min(n, v.Len())).Interface()
},
-
"markdown": func(text string) template.HTML {
p.rctx.RendererType = markup.RendererTypeDefault
htmlString := p.rctx.RenderMarkdown(text)
sanitized := p.rctx.SanitizeDefault(htmlString)
return template.HTML(sanitized)
},
+
"description": func(text string) template.HTML {
+
p.rctx.RendererType = markup.RendererTypeDefault
+
htmlString := p.rctx.RenderMarkdown(text)
+
sanitized := p.rctx.SanitizeDescription(htmlString)
+
return template.HTML(sanitized)
+
},
"isNil": func(t any) bool {
// returns false for other "zero" values
return t == nil
+5 -1
appview/pages/markup/markdown.go
···
}
func (rctx *RenderContext) SanitizeDefault(html string) string {
-
return rctx.Sanitizer.defaultPolicy.Sanitize(html)
+
return rctx.Sanitizer.SanitizeDefault(html)
+
}
+
+
func (rctx *RenderContext) SanitizeDescription(html string) string {
+
return rctx.Sanitizer.SanitizeDescription(html)
}
type MarkdownTransformer struct {
+27 -2
appview/pages/markup/sanitizer.go
···
)
type Sanitizer struct {
-
defaultPolicy *bluemonday.Policy
+
defaultPolicy *bluemonday.Policy
+
descriptionPolicy *bluemonday.Policy
}
func NewSanitizer() Sanitizer {
return Sanitizer{
-
defaultPolicy: defaultPolicy(),
+
defaultPolicy: defaultPolicy(),
+
descriptionPolicy: descriptionPolicy(),
}
}
+
func (s *Sanitizer) SanitizeDefault(html string) string {
+
return s.defaultPolicy.Sanitize(html)
+
}
+
func (s *Sanitizer) SanitizeDescription(html string) string {
+
return s.descriptionPolicy.Sanitize(html)
+
}
+
func defaultPolicy() *bluemonday.Policy {
policy := bluemonday.UGCPolicy()
···
return policy
}
+
+
func descriptionPolicy() *bluemonday.Policy {
+
policy := bluemonday.NewPolicy()
+
policy.AllowStandardURLs()
+
+
// allow italics and bold.
+
policy.AllowElements("i", "b", "em", "strong")
+
+
// allow code.
+
policy.AllowElements("code")
+
+
// allow links
+
policy.AllowAttrs("href", "target", "rel").OnElements("a")
+
+
return policy
+
}