ref: 714abd5ce0be9fc1ae6b3f4026eb75fcd3ff0948
parent: 9150a98f3ed0f9b7732e80eb181194532bc2e189
author: bep <[email protected]>
date: Thu Jan 15 07:21:15 EST 2015
Fix issue with nested shortcodes Fixes #797
--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -163,26 +163,11 @@
return fmt.Sprintf("{@{@%s-%d@}@}", shortcodePlaceholderPrefix, id)
}
-func renderShortcodes(sc shortcode, p *Page, t tpl.Template) string {
-
- tokenizedRenderedShortcodes := make(map[string](string))
- startCount := 0
-
- shortcodes := renderShortcode(sc, tokenizedRenderedShortcodes, startCount, p, t)
-
- // placeholders will be numbered from 1.. and top down
- for i := 1; i <= len(tokenizedRenderedShortcodes); i++ {
- placeHolder := createShortcodePlaceholder(i)
- shortcodes = strings.Replace(shortcodes, placeHolder, tokenizedRenderedShortcodes[placeHolder], 1)
- }
- return shortcodes
-}
-
const innerNewlineRegexp = "\n"
const innerCleanupRegexp = `\A<p>(.*)</p>\n\z`
const innerCleanupExpand = "$1"
-func renderShortcode(sc shortcode, tokenizedShortcodes map[string](string), cnt int, p *Page, t tpl.Template) string {
+func renderShortcode(sc shortcode, p *Page, t tpl.Template) string {
var data = &ShortcodeWithPage{Params: sc.params, Page: p}
tmpl := GetTemplate(sc.name, t)
@@ -198,12 +183,7 @@
case string:
inner += innerData.(string)
case shortcode:
- // nested shortcodes will be rendered individually, replace them with temporary numbered tokens
- cnt++
- placeHolder := createShortcodePlaceholder(cnt)
- renderedContent := renderShortcode(innerData.(shortcode), tokenizedShortcodes, cnt, p, t)
- tokenizedShortcodes[placeHolder] = renderedContent
- inner += placeHolder
+ inner += renderShortcode(innerData.(shortcode), p, t)
default:
jww.ERROR.Printf("Illegal state on shortcode rendering of '%s' in page %s. Illegal type in inner data: %s ",
sc.name, p.BaseFileName(), reflect.TypeOf(innerData))
@@ -265,7 +245,7 @@
// need to have something to replace with
renderedShortcodes[key] = ""
} else {
- renderedShortcodes[key] = renderShortcodes(sc, p, t)
+ renderedShortcodes[key] = renderShortcode(sc, p, t)
}
}
@@ -418,7 +398,6 @@
currShortcode.params = make([]string, 0)
}
- // wrap it in a block level element to let it be left alone by the markup engine
placeHolder := createShortcodePlaceholder(id)
result.WriteString(placeHolder)
shortCodes[placeHolder] = currShortcode
--- a/hugolib/shortcode_test.go
+++ b/hugolib/shortcode_test.go
@@ -111,7 +111,7 @@
tem.AddInternalShortcode("scn1.html", `<div>Outer, inner is {{ .Inner }}</div>`)
tem.AddInternalShortcode("scn2.html", `<div>SC2</div>`)
- CheckShortCodeMatch(t, `{{% scn1 %}}{{% scn2 %}}{{% /scn1 %}}`, "<div>Outer, inner is <div>SC2</div></div>", tem)
+ CheckShortCodeMatch(t, `{{% scn1 %}}{{% scn2 %}}{{% /scn1 %}}`, "<div>Outer, inner is <div>SC2</div>\n</div>", tem)
CheckShortCodeMatch(t, `{{< scn1 >}}{{% scn2 %}}{{< /scn1 >}}`, "<div>Outer, inner is <div>SC2</div></div>", tem)
}
@@ -123,11 +123,11 @@
tem.AddInternalShortcode("aside.html", `-aside-{{ .Inner }}-asideStop-`)
CheckShortCodeMatch(t, `{{< row >}}1-s{{% column %}}2-**s**{{< aside >}}3-**s**{{< /aside >}}4-s{{% /column %}}5-s{{< /row >}}6-s`,
- "-row-1-s-col-2-<strong>s</strong>-aside-3-**s**-asideStop-4-s-colStop-5-s-rowStop-6-s", tem)
+ "-row-1-s-col-2-<strong>s</strong>-aside-3-<strong>s</strong>-asideStop-4-s-colStop-5-s-rowStop-6-s", tem)
// turn around the markup flag
CheckShortCodeMatch(t, `{{% row %}}1-s{{< column >}}2-**s**{{% aside %}}3-**s**{{% /aside %}}4-s{{< /column >}}5-s{{% /row %}}6-s`,
- "-row-1-s-col-2-**s**-aside-3-<strong>s</strong>-asideStop-4-s-colStop-5-s-rowStop-6-s", tem)
+ "-row-1-s-col-2-<strong>s</strong>-aside-3-<strong>s</strong>-asideStop-4-s-colStop-5-s-rowStop-6-s", tem)
}
func TestFigureImgWidth(t *testing.T) {