From db4b7a5c6742c75f9cd9627d3b054d3a72802ec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 16 Dec 2017 18:56:58 +0100 Subject: [PATCH] Reuse the BlackFriday instance when possible This is in heavy use in rendering, so this makes a difference: ```bash benchmark old ns/op new ns/op delta BenchmarkSiteBuilding/TOML,num_langs=1,num_pages=500,tags_per_page=5,shortcodes,render-4 124551144 107743429 -13.49% benchmark old allocs new allocs delta BenchmarkSiteBuilding/TOML,num_langs=1,num_pages=500,tags_per_page=5,shortcodes,render-4 528684 435118 -17.70% benchmark old bytes new bytes delta BenchmarkSiteBuilding/TOML,num_langs=1,num_pages=500,tags_per_page=5,shortcodes,render-4 53306848 45147832 -15.31% ``` --- helpers/content.go | 19 ++++++++++--------- helpers/content_renderer_test.go | 6 +++--- helpers/content_test.go | 22 +++++++++++----------- hugolib/config.go | 2 +- hugolib/page.go | 18 ++++++++++-------- tpl/transform/transform.go | 2 +- 6 files changed, 36 insertions(+), 33 deletions(-) diff --git a/helpers/content.go b/helpers/content.go index b776d0813..ca93d7d9e 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -41,7 +41,7 @@ var SummaryDivider = []byte("") // ContentSpec provides functionality to render markdown content. type ContentSpec struct { - blackfriday map[string]interface{} + BlackFriday *BlackFriday footnoteAnchorPrefix string footnoteReturnLinkContents string // SummaryLength is the length of the summary that Hugo extracts from a content. @@ -56,8 +56,9 @@ type ContentSpec struct { // NewContentSpec returns a ContentSpec initialized // with the appropriate fields from the given config.Provider. func NewContentSpec(cfg config.Provider) (*ContentSpec, error) { + bf := newBlackfriday(cfg.GetStringMap("blackfriday")) spec := &ContentSpec{ - blackfriday: cfg.GetStringMap("blackfriday"), + BlackFriday: bf, footnoteAnchorPrefix: cfg.GetString("footnoteAnchorPrefix"), footnoteReturnLinkContents: cfg.GetString("footnoteReturnLinkContents"), summaryLength: cfg.GetInt("summaryLength"), @@ -93,8 +94,8 @@ func NewContentSpec(cfg config.Provider) (*ContentSpec, error) { return spec, nil } -// Blackfriday holds configuration values for Blackfriday rendering. -type Blackfriday struct { +// BlackFriday holds configuration values for BlackFriday rendering. +type BlackFriday struct { Smartypants bool SmartypantsQuotesNBSP bool AngledQuotes bool @@ -109,7 +110,7 @@ type Blackfriday struct { } // NewBlackfriday creates a new Blackfriday filled with site config or some sane defaults. -func (c ContentSpec) NewBlackfriday() *Blackfriday { +func newBlackfriday(config map[string]interface{}) *BlackFriday { defaultParam := map[string]interface{}{ "smartypants": true, "angledQuotes": false, @@ -130,13 +131,13 @@ func (c ContentSpec) NewBlackfriday() *Blackfriday { siteConfig[k] = v } - if c.blackfriday != nil { - for k, v := range c.blackfriday { + if config != nil { + for k, v := range config { siteConfig[k] = v } } - combinedConfig := &Blackfriday{} + combinedConfig := &BlackFriday{} if err := mapstructure.Decode(siteConfig, combinedConfig); err != nil { jww.FATAL.Printf("Failed to get site rendering config\n%s", err.Error()) } @@ -434,7 +435,7 @@ type RenderingContext struct { PageFmt string DocumentID string DocumentName string - Config *Blackfriday + Config *BlackFriday RenderTOC bool Cfg config.Provider } diff --git a/helpers/content_renderer_test.go b/helpers/content_renderer_test.go index 698e3a151..a01014b4e 100644 --- a/helpers/content_renderer_test.go +++ b/helpers/content_renderer_test.go @@ -24,7 +24,7 @@ import ( // Renders a codeblock using Blackfriday func (c ContentSpec) render(input string) string { - ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()} + ctx := &RenderingContext{Cfg: c.cfg, Config: c.BlackFriday} render := c.getHTMLRenderer(0, ctx) buf := &bytes.Buffer{} @@ -34,7 +34,7 @@ func (c ContentSpec) render(input string) string { // Renders a codeblock using Mmark func (c ContentSpec) renderWithMmark(input string) string { - ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()} + ctx := &RenderingContext{Cfg: c.cfg, Config: c.BlackFriday} render := c.getMmarkHTMLRenderer(0, ctx) buf := &bytes.Buffer{} @@ -128,7 +128,7 @@ END`, true, `