From 50046dd6b358920ef043f4f9247c022a2c2ddaa9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 10 Dec 2019 17:32:49 +0100 Subject: [PATCH] Move text sanitizing to RenderContext --- context.go | 33 +++++++++++++++++++++++++++++++-- elements.go | 8 +++----- gold.go | 12 +----------- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/context.go b/context.go index 2bc12a7..80536b3 100644 --- a/context.go +++ b/context.go @@ -1,8 +1,37 @@ package gold +import ( + "html" + "strings" + + "github.com/microcosm-cc/bluemonday" +) + type RenderContext struct { - style map[StyleType]ElementStyle + options Options + style map[StyleType]ElementStyle + blockStack *BlockStack 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) } diff --git a/elements.go b/elements.go index 151122c..c3d6f0e 100644 --- a/elements.go +++ b/elements.go @@ -1,9 +1,7 @@ package gold import ( - "html" "io" - "strings" bf "gopkg.in/russross/blackfriday.v2" ) @@ -140,14 +138,14 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element { case bf.Text: return Element{ Renderer: &BaseElement{ - Token: html.UnescapeString(stripper.Sanitize(string(node.Literal))), + Token: tr.context.SanitizeHTML(string(node.Literal), false), Style: ctx.style[Text], }, } case bf.HTMLBlock: return Element{ 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], }, } @@ -185,7 +183,7 @@ func (tr *TermRenderer) NewElement(node *bf.Node) Element { case bf.HTMLSpan: return Element{ 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], }, } diff --git a/gold.go b/gold.go index b6ee338..f0f2425 100644 --- a/gold.go +++ b/gold.go @@ -8,14 +8,9 @@ import ( "net/url" "strings" - "github.com/microcosm-cc/bluemonday" bf "gopkg.in/russross/blackfriday.v2" ) -var ( - stripper = bluemonday.StrictPolicy() -) - type Options struct { BaseURL string WordWrap int @@ -66,12 +61,7 @@ func NewTermRendererFromBytes(b []byte, options Options) (*TermRenderer, error) } tr := &TermRenderer{ - context: RenderContext{ - style: make(map[StyleType]ElementStyle), - blockStack: &BlockStack{}, - table: &TableElement{}, - options: options, - }, + context: NewRenderContext(options), } for k, v := range e {