diff options
author | Cameron Moore <moorereason@gmail.com> | 2015-11-20 18:59:54 -0600 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2015-11-23 17:17:18 +0100 |
commit | fde47c5eb9435083cc492b8648517b374eb60c6b (patch) | |
tree | c587a2f5a77a976b982cb64e7feee7674e401fcf /hugolib | |
parent | 3d09de891072985e6c59f899f09132a76d44f7cd (diff) |
Add shortcode IsNamedParams property
It would be helpful to know whether a shortcode was called with positional or
named parameters. This commit adds a boolean `IsNamedParams` property to the
`ShortcodeWithPage` struct.
Diffstat (limited to 'hugolib')
-rw-r--r-- | hugolib/shortcode.go | 13 | ||||
-rw-r--r-- | hugolib/shortcode_test.go | 14 |
2 files changed, 23 insertions, 4 deletions
diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index a306023a7..0b2e9f78e 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -31,9 +31,10 @@ import ( ) type ShortcodeWithPage struct { - Params interface{} - Inner template.HTML - Page *Page + Params interface{} + Inner template.HTML + Page *Page + IsNamedParams bool } func (scp *ShortcodeWithPage) Ref(ref string) (string, error) { @@ -189,7 +190,6 @@ const innerCleanupRegexp = `\A<p>(.*)</p>\n\z` const innerCleanupExpand = "$1" func renderShortcode(sc shortcode, p *Page, t tpl.Template) string { - var data = &ShortcodeWithPage{Params: sc.params, Page: p} tmpl := getShortcodeTemplate(sc.name, t) if tmpl == nil { @@ -197,6 +197,11 @@ func renderShortcode(sc shortcode, p *Page, t tpl.Template) string { return "" } + data := &ShortcodeWithPage{Params: sc.params, Page: p} + if sc.params != nil { + data.IsNamedParams = reflect.TypeOf(sc.params).Kind() == reflect.Map + } + if len(sc.inner) > 0 { var inner string for _, innerData := range sc.inner { diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go index 3527bbdf1..7a670ba81 100644 --- a/hugolib/shortcode_test.go +++ b/hugolib/shortcode_test.go @@ -119,6 +119,20 @@ func TestNamedParamSC(t *testing.T) { CheckShortCodeMatch(t, `{{< img src = "one" class = "aspen grove" >}}`, `<img src="one" class="aspen grove">`, tem) } +func TestIsNamedParamsSC(t *testing.T) { + tem := tpl.New() + tem.AddInternalShortcode("byposition.html", `<div id="{{ .Get 0 }}">`) + tem.AddInternalShortcode("byname.html", `<div id="{{ .Get "id" }}">`) + tem.AddInternalShortcode("ifnamedparams.html", `<div id="{{ if .IsNamedParams }}{{ .Get "id" }}{{ else }}{{ .Get 0 }}{{end}}">`) + + CheckShortCodeMatch(t, `{{< ifnamedparams id="name" >}}`, `<div id="name">`, tem) + CheckShortCodeMatch(t, `{{< ifnamedparams position >}}`, `<div id="position">`, tem) + CheckShortCodeMatch(t, `{{< byname id="name" >}}`, `<div id="name">`, tem) + CheckShortCodeMatch(t, `{{< byname position >}}`, `<div id="error: cannot access positional params by string name">`, tem) + CheckShortCodeMatch(t, `{{< byposition position >}}`, `<div id="position">`, tem) + CheckShortCodeMatch(t, `{{< byposition id="name" >}}`, `<div id="error: cannot access named params by position">`, tem) +} + func TestInnerSC(t *testing.T) { tem := tpl.New() tem.AddInternalShortcode("inside.html", `<div{{with .Get "class"}} class="{{.}}"{{end}}>{{ .Inner }}</div>`) |