Move text sanitizing to RenderContext

This commit is contained in:
Christian Muehlhaeuser
2019-12-10 17:32:49 +01:00
parent 9e615ab474
commit 50046dd6b3
3 changed files with 35 additions and 18 deletions
+31 -2
View File
@@ -1,8 +1,37 @@
package gold package gold
import (
"html"
"strings"
"github.com/microcosm-cc/bluemonday"
)
type RenderContext struct { type RenderContext struct {
style map[StyleType]ElementStyle options Options
style map[StyleType]ElementStyle
blockStack *BlockStack blockStack *BlockStack
table *TableElement table *TableElement
options Options
stripper *bluemonday.Policy
}
func NewRenderContext(options Options) RenderContext {
return RenderContext{
options: options,
style: make(map[StyleType]ElementStyle),
blockStack: &BlockStack{},
table: &TableElement{},
stripper: bluemonday.StrictPolicy(),
}
}
func (ctx RenderContext) SanitizeHTML(s string, trimSpaces bool) string {
s = ctx.stripper.Sanitize(s)
if trimSpaces {
s = strings.TrimSpace(s)
}
return html.UnescapeString(s)
} }
+3 -5
View File
@@ -1,9 +1,7 @@
package gold package gold
import ( import (
"html"
"io" "io"
"strings"
bf "gopkg.in/russross/blackfriday.v2" bf "gopkg.in/russross/blackfriday.v2"
) )
@@ -140,14 +138,14 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
case bf.Text: case bf.Text:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: html.UnescapeString(stripper.Sanitize(string(node.Literal))), Token: tr.context.SanitizeHTML(string(node.Literal), false),
Style: ctx.style[Text], Style: ctx.style[Text],
}, },
} }
case bf.HTMLBlock: case bf.HTMLBlock:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n", Token: tr.context.SanitizeHTML(string(node.Literal), true) + "\n",
Style: ctx.style[HTMLBlock], Style: ctx.style[HTMLBlock],
}, },
} }
@@ -185,7 +183,7 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element {
case bf.HTMLSpan: case bf.HTMLSpan:
return Element{ return Element{
Renderer: &BaseElement{ Renderer: &BaseElement{
Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n", Token: tr.context.SanitizeHTML(string(node.Literal), true) + "\n",
Style: ctx.style[HTMLSpan], Style: ctx.style[HTMLSpan],
}, },
} }
+1 -11
View File
@@ -8,14 +8,9 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/microcosm-cc/bluemonday"
bf "gopkg.in/russross/blackfriday.v2" bf "gopkg.in/russross/blackfriday.v2"
) )
var (
stripper = bluemonday.StrictPolicy()
)
type Options struct { type Options struct {
BaseURL string BaseURL string
WordWrap int WordWrap int
@@ -66,12 +61,7 @@ func NewTermRendererFromBytes(b []byte, options Options) (*TermRenderer, error)
} }
tr := &TermRenderer{ tr := &TermRenderer{
context: RenderContext{ context: NewRenderContext(options),
style: make(map[StyleType]ElementStyle),
blockStack: &BlockStack{},
table: &TableElement{},
options: options,
},
} }
for k, v := range e { for k, v := range e {