Fix issue with nested shortcodes
authorbep <bjorn.erik.pedersen@gmail.com>
Thu, 15 Jan 2015 11:21:15 +0000 (12:21 +0100)
committerbep <bjorn.erik.pedersen@gmail.com>
Thu, 15 Jan 2015 11:21:15 +0000 (12:21 +0100)
Fixes #797

hugolib/shortcode.go
hugolib/shortcode_test.go

index 4cf2f84c03213b0bae2eb0ea093797033aaeab84..8743cc321417532175d9720fc95a0f57a7460983 100644 (file)
@@ -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<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 @@ 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
index 777384159048f4f2109ea5866e8ff5257e8d93c9..06f36aebd67b9264ebda3ad9dba75935a2c11c65 100644 (file)
@@ -111,7 +111,7 @@ func TestNestedSC(t *testing.T) {
        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 @@ 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-<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) {