From 714abd5ce0be9fc1ae6b3f4026eb75fcd3ff0948 Mon Sep 17 00:00:00 2001 From: bep Date: Thu, 15 Jan 2015 12:21:15 +0100 Subject: [PATCH] Fix issue with nested shortcodes Fixes #797 --- hugolib/shortcode.go | 27 +++------------------------ hugolib/shortcode_test.go | 6 +++--- 2 files changed, 6 insertions(+), 27 deletions(-) diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index 4cf2f84c0..8743cc321 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -163,26 +163,11 @@ func createShortcodePlaceholder(id int) string { 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

(.*)

\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 @@ func renderShortcode(sc shortcode, tokenizedShortcodes map[string](string), cnt 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 @@ func extractAndRenderShortcodes(stringToParse string, p *Page, t tpl.Template) ( // 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 @@ Loop: 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 diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go index 777384159..06f36aebd 100644 --- a/hugolib/shortcode_test.go +++ b/hugolib/shortcode_test.go @@ -111,7 +111,7 @@ func TestNestedSC(t *testing.T) { tem.AddInternalShortcode("scn1.html", `
Outer, inner is {{ .Inner }}
`) tem.AddInternalShortcode("scn2.html", `
SC2
`) - CheckShortCodeMatch(t, `{{% scn1 %}}{{% scn2 %}}{{% /scn1 %}}`, "
Outer, inner is
SC2
", tem) + CheckShortCodeMatch(t, `{{% scn1 %}}{{% scn2 %}}{{% /scn1 %}}`, "
Outer, inner is
SC2
\n
", tem) CheckShortCodeMatch(t, `{{< scn1 >}}{{% scn2 %}}{{< /scn1 >}}`, "
Outer, inner is
SC2
", tem) } @@ -123,11 +123,11 @@ func TestNestedComplexSC(t *testing.T) { 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-s-aside-3-**s**-asideStop-4-s-colStop-5-s-rowStop-6-s", tem) + "-row-1-s-col-2-s-aside-3-s-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-s-asideStop-4-s-colStop-5-s-rowStop-6-s", tem) + "-row-1-s-col-2-s-aside-3-s-asideStop-4-s-colStop-5-s-rowStop-6-s", tem) } func TestFigureImgWidth(t *testing.T) {