helpers: Delete RenderingContext.getConfig

This commit is contained in:
Albert Nigmatzianov 2017-04-06 22:24:27 +02:00 committed by Bjørn Erik Pedersen
parent b5b6e81c02
commit 6498d73c08
3 changed files with 45 additions and 57 deletions

View file

@ -19,6 +19,7 @@ package helpers
import ( import (
"bytes" "bytes"
"fmt"
"html/template" "html/template"
"os/exec" "os/exec"
"unicode" "unicode"
@ -33,7 +34,6 @@ import (
jww "github.com/spf13/jwalterweatherman" jww "github.com/spf13/jwalterweatherman"
"strings" "strings"
"sync"
) )
// SummaryLength is the length of the summary that Hugo extracts from a content. // SummaryLength is the length of the summary that Hugo extracts from a content.
@ -78,7 +78,6 @@ type Blackfriday struct {
// NewBlackfriday creates a new Blackfriday filled with site config or some sane defaults. // NewBlackfriday creates a new Blackfriday filled with site config or some sane defaults.
func (c ContentSpec) NewBlackfriday() *Blackfriday { func (c ContentSpec) NewBlackfriday() *Blackfriday {
defaultParam := map[string]interface{}{ defaultParam := map[string]interface{}{
"smartypants": true, "smartypants": true,
"angledQuotes": false, "angledQuotes": false,
@ -212,9 +211,11 @@ func (c ContentSpec) getHTMLRenderer(defaultFlags int, ctx *RenderingContext) bl
b := len(ctx.DocumentID) != 0 b := len(ctx.DocumentID) != 0
config := ctx.getConfig() if ctx.Config == nil {
panic(fmt.Sprintf("RenderingContext of %q doesn't have a config", ctx.DocumentID))
}
if b && !config.PlainIDAnchors { if b && !ctx.Config.PlainIDAnchors {
renderParameters.FootnoteAnchorPrefix = ctx.DocumentID + ":" + renderParameters.FootnoteAnchorPrefix renderParameters.FootnoteAnchorPrefix = ctx.DocumentID + ":" + renderParameters.FootnoteAnchorPrefix
renderParameters.HeaderIDSuffix = ":" + ctx.DocumentID renderParameters.HeaderIDSuffix = ":" + ctx.DocumentID
} }
@ -223,27 +224,27 @@ func (c ContentSpec) getHTMLRenderer(defaultFlags int, ctx *RenderingContext) bl
htmlFlags |= blackfriday.HTML_USE_XHTML htmlFlags |= blackfriday.HTML_USE_XHTML
htmlFlags |= blackfriday.HTML_FOOTNOTE_RETURN_LINKS htmlFlags |= blackfriday.HTML_FOOTNOTE_RETURN_LINKS
if config.Smartypants { if ctx.Config.Smartypants {
htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS
} }
if config.AngledQuotes { if ctx.Config.AngledQuotes {
htmlFlags |= blackfriday.HTML_SMARTYPANTS_ANGLED_QUOTES htmlFlags |= blackfriday.HTML_SMARTYPANTS_ANGLED_QUOTES
} }
if config.Fractions { if ctx.Config.Fractions {
htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS
} }
if config.HrefTargetBlank { if ctx.Config.HrefTargetBlank {
htmlFlags |= blackfriday.HTML_HREF_TARGET_BLANK htmlFlags |= blackfriday.HTML_HREF_TARGET_BLANK
} }
if config.SmartDashes { if ctx.Config.SmartDashes {
htmlFlags |= blackfriday.HTML_SMARTYPANTS_DASHES htmlFlags |= blackfriday.HTML_SMARTYPANTS_DASHES
} }
if config.LatexDashes { if ctx.Config.LatexDashes {
htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES
} }
@ -271,12 +272,16 @@ func getMarkdownExtensions(ctx *RenderingContext) int {
blackfriday.EXTENSION_AUTO_HEADER_IDS | blackfriday.EXTENSION_AUTO_HEADER_IDS |
blackfriday.EXTENSION_FOOTNOTES blackfriday.EXTENSION_FOOTNOTES
for _, extension := range ctx.getConfig().Extensions { if ctx.Config == nil {
panic(fmt.Sprintf("RenderingContext of %q doesn't have a config", ctx.DocumentID))
}
for _, extension := range ctx.Config.Extensions {
if flag, ok := blackfridayExtensionMap[extension]; ok { if flag, ok := blackfridayExtensionMap[extension]; ok {
flags |= flag flags |= flag
} }
} }
for _, extension := range ctx.getConfig().ExtensionsMask { for _, extension := range ctx.Config.ExtensionsMask {
if flag, ok := blackfridayExtensionMap[extension]; ok { if flag, ok := blackfridayExtensionMap[extension]; ok {
flags &= ^flag flags &= ^flag
} }
@ -303,7 +308,11 @@ func (c ContentSpec) getMmarkHTMLRenderer(defaultFlags int, ctx *RenderingContex
b := len(ctx.DocumentID) != 0 b := len(ctx.DocumentID) != 0
if b && !ctx.getConfig().PlainIDAnchors { if ctx.Config == nil {
panic(fmt.Sprintf("RenderingContext of %q doesn't have a config", ctx.DocumentID))
}
if b && !ctx.Config.PlainIDAnchors {
renderParameters.FootnoteAnchorPrefix = ctx.DocumentID + ":" + renderParameters.FootnoteAnchorPrefix renderParameters.FootnoteAnchorPrefix = ctx.DocumentID + ":" + renderParameters.FootnoteAnchorPrefix
// renderParameters.HeaderIDSuffix = ":" + ctx.DocumentId // renderParameters.HeaderIDSuffix = ":" + ctx.DocumentId
} }
@ -333,7 +342,11 @@ func getMmarkExtensions(ctx *RenderingContext) int {
flags |= mmark.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK flags |= mmark.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK
flags |= mmark.EXTENSION_INCLUDE flags |= mmark.EXTENSION_INCLUDE
for _, extension := range ctx.getConfig().Extensions { if ctx.Config == nil {
panic(fmt.Sprintf("RenderingContext of %q doesn't have a config", ctx.DocumentID))
}
for _, extension := range ctx.Config.Extensions {
if flag, ok := mmarkExtensionMap[extension]; ok { if flag, ok := mmarkExtensionMap[extension]; ok {
flags |= flag flags |= flag
} }
@ -384,6 +397,7 @@ func ExtractTOC(content []byte) (newcontent []byte, toc []byte) {
// RenderingContext holds contextual information, like content and configuration, // RenderingContext holds contextual information, like content and configuration,
// for a given content rendering. // for a given content rendering.
// By creating you must set the Config, otherwise it will panic.
type RenderingContext struct { type RenderingContext struct {
Content []byte Content []byte
PageFmt string PageFmt string
@ -394,22 +408,6 @@ type RenderingContext struct {
FileResolver FileResolverFunc FileResolver FileResolverFunc
LinkResolver LinkResolverFunc LinkResolver LinkResolverFunc
Cfg config.Provider Cfg config.Provider
configInit sync.Once
}
func newRenderingContext(cfg config.Provider) *RenderingContext {
return &RenderingContext{Cfg: cfg}
}
func (c *RenderingContext) getConfig() *Blackfriday {
// TODO(bep) get rid of this
c.configInit.Do(func() {
if c.Config == nil {
cs := NewContentSpec(c.Cfg)
c.Config = cs.NewBlackfriday()
}
})
return c.Config
} }
// RenderBytes renders a []byte. // RenderBytes renders a []byte.

View file

@ -23,7 +23,7 @@ import (
// Renders a codeblock using Blackfriday // Renders a codeblock using Blackfriday
func (c ContentSpec) render(input string) string { func (c ContentSpec) render(input string) string {
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
render := c.getHTMLRenderer(0, ctx) render := c.getHTMLRenderer(0, ctx)
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
@ -33,7 +33,7 @@ func (c ContentSpec) render(input string) string {
// Renders a codeblock using Mmark // Renders a codeblock using Mmark
func (c ContentSpec) renderWithMmark(input string) string { func (c ContentSpec) renderWithMmark(input string) string {
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
render := c.getMmarkHTMLRenderer(0, ctx) render := c.getMmarkHTMLRenderer(0, ctx)
buf := &bytes.Buffer{} buf := &bytes.Buffer{}

View file

@ -37,12 +37,12 @@ func TestStripHTML(t *testing.T) {
{"</br> strip br2<br />", " strip br2\n"}, {"</br> strip br2<br />", " strip br2\n"},
{"This <strong>is</strong> a\nnewline", "This is a newline"}, {"This <strong>is</strong> a\nnewline", "This is a newline"},
{"No Tags", "No Tags"}, {"No Tags", "No Tags"},
{`<p>Summary Next Line. {`<p>Summary Next Line.
<figure > <figure >
<img src="/not/real" /> <img src="/not/real" />
</figure> </figure>
. .
More text here.</p> More text here.</p>
@ -152,7 +152,7 @@ func TestTruncateWordsByRune(t *testing.T) {
func TestGetHTMLRendererFlags(t *testing.T) { func TestGetHTMLRendererFlags(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
renderer := c.getHTMLRenderer(blackfriday.HTML_USE_XHTML, ctx) renderer := c.getHTMLRenderer(blackfriday.HTML_USE_XHTML, ctx)
flags := renderer.GetFlags() flags := renderer.GetFlags()
if flags&blackfriday.HTML_USE_XHTML != blackfriday.HTML_USE_XHTML { if flags&blackfriday.HTML_USE_XHTML != blackfriday.HTML_USE_XHTML {
@ -178,8 +178,7 @@ func TestGetHTMLRendererAllFlags(t *testing.T) {
{blackfriday.HTML_SMARTYPANTS_LATEX_DASHES}, {blackfriday.HTML_SMARTYPANTS_LATEX_DASHES},
} }
defaultFlags := blackfriday.HTML_USE_XHTML defaultFlags := blackfriday.HTML_USE_XHTML
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Config = ctx.getConfig()
ctx.Config.AngledQuotes = true ctx.Config.AngledQuotes = true
ctx.Config.Fractions = true ctx.Config.Fractions = true
ctx.Config.HrefTargetBlank = true ctx.Config.HrefTargetBlank = true
@ -202,9 +201,8 @@ func TestGetHTMLRendererAllFlags(t *testing.T) {
func TestGetHTMLRendererAnchors(t *testing.T) { func TestGetHTMLRendererAnchors(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.DocumentID = "testid" ctx.DocumentID = "testid"
ctx.Config = ctx.getConfig()
ctx.Config.PlainIDAnchors = false ctx.Config.PlainIDAnchors = false
actualRenderer := c.getHTMLRenderer(0, ctx) actualRenderer := c.getHTMLRenderer(0, ctx)
@ -227,9 +225,8 @@ func TestGetHTMLRendererAnchors(t *testing.T) {
func TestGetMmarkHTMLRenderer(t *testing.T) { func TestGetMmarkHTMLRenderer(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.DocumentID = "testid" ctx.DocumentID = "testid"
ctx.Config = ctx.getConfig()
ctx.Config.PlainIDAnchors = false ctx.Config.PlainIDAnchors = false
actualRenderer := c.getMmarkHTMLRenderer(0, ctx) actualRenderer := c.getMmarkHTMLRenderer(0, ctx)
@ -252,8 +249,7 @@ func TestGetMmarkHTMLRenderer(t *testing.T) {
func TestGetMarkdownExtensionsMasksAreRemovedFromExtensions(t *testing.T) { func TestGetMarkdownExtensionsMasksAreRemovedFromExtensions(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Config = ctx.getConfig()
ctx.Config.Extensions = []string{"headerId"} ctx.Config.Extensions = []string{"headerId"}
ctx.Config.ExtensionsMask = []string{"noIntraEmphasis"} ctx.Config.ExtensionsMask = []string{"noIntraEmphasis"}
@ -268,8 +264,7 @@ func TestGetMarkdownExtensionsByDefaultAllExtensionsAreEnabled(t *testing.T) {
testFlag int testFlag int
} }
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Config = ctx.getConfig()
ctx.Config.Extensions = []string{""} ctx.Config.Extensions = []string{""}
ctx.Config.ExtensionsMask = []string{""} ctx.Config.ExtensionsMask = []string{""}
allExtensions := []data{ allExtensions := []data{
@ -301,8 +296,7 @@ func TestGetMarkdownExtensionsByDefaultAllExtensionsAreEnabled(t *testing.T) {
func TestGetMarkdownExtensionsAddingFlagsThroughRenderingContext(t *testing.T) { func TestGetMarkdownExtensionsAddingFlagsThroughRenderingContext(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Config = ctx.getConfig()
ctx.Config.Extensions = []string{"definitionLists"} ctx.Config.Extensions = []string{"definitionLists"}
ctx.Config.ExtensionsMask = []string{""} ctx.Config.ExtensionsMask = []string{""}
@ -314,9 +308,8 @@ func TestGetMarkdownExtensionsAddingFlagsThroughRenderingContext(t *testing.T) {
func TestGetMarkdownRenderer(t *testing.T) { func TestGetMarkdownRenderer(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Content = []byte("testContent") ctx.Content = []byte("testContent")
ctx.Config = ctx.getConfig()
actualRenderedMarkdown := c.markdownRender(ctx) actualRenderedMarkdown := c.markdownRender(ctx)
expectedRenderedMarkdown := []byte("<p>testContent</p>\n") expectedRenderedMarkdown := []byte("<p>testContent</p>\n")
if !bytes.Equal(actualRenderedMarkdown, expectedRenderedMarkdown) { if !bytes.Equal(actualRenderedMarkdown, expectedRenderedMarkdown) {
@ -326,9 +319,8 @@ func TestGetMarkdownRenderer(t *testing.T) {
func TestGetMarkdownRendererWithTOC(t *testing.T) { func TestGetMarkdownRendererWithTOC(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := &RenderingContext{RenderTOC: true, Cfg: c.cfg} ctx := &RenderingContext{RenderTOC: true, Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Content = []byte("testContent") ctx.Content = []byte("testContent")
ctx.Config = ctx.getConfig()
actualRenderedMarkdown := c.markdownRender(ctx) actualRenderedMarkdown := c.markdownRender(ctx)
expectedRenderedMarkdown := []byte("<nav>\n</nav>\n\n<p>testContent</p>\n") expectedRenderedMarkdown := []byte("<nav>\n</nav>\n\n<p>testContent</p>\n")
if !bytes.Equal(actualRenderedMarkdown, expectedRenderedMarkdown) { if !bytes.Equal(actualRenderedMarkdown, expectedRenderedMarkdown) {
@ -342,8 +334,7 @@ func TestGetMmarkExtensions(t *testing.T) {
testFlag int testFlag int
} }
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Config = ctx.getConfig()
ctx.Config.Extensions = []string{"tables"} ctx.Config.Extensions = []string{"tables"}
ctx.Config.ExtensionsMask = []string{""} ctx.Config.ExtensionsMask = []string{""}
allExtensions := []data{ allExtensions := []data{
@ -372,9 +363,8 @@ func TestGetMmarkExtensions(t *testing.T) {
func TestMmarkRender(t *testing.T) { func TestMmarkRender(t *testing.T) {
c := newTestContentSpec() c := newTestContentSpec()
ctx := newRenderingContext(c.cfg) ctx := &RenderingContext{Cfg: c.cfg, Config: c.NewBlackfriday()}
ctx.Content = []byte("testContent") ctx.Content = []byte("testContent")
ctx.Config = ctx.getConfig()
actualRenderedMarkdown := c.mmarkRender(ctx) actualRenderedMarkdown := c.mmarkRender(ctx)
expectedRenderedMarkdown := []byte("<p>testContent</p>\n") expectedRenderedMarkdown := []byte("<p>testContent</p>\n")
if !bytes.Equal(actualRenderedMarkdown, expectedRenderedMarkdown) { if !bytes.Equal(actualRenderedMarkdown, expectedRenderedMarkdown) {