shithub: hugo

Download patch

ref: 35bb72c83efbdd868af9b32af034993c245b4584
parent: 2805a6f80e1e68d2d3df4ba7f63e7455c3802899
author: Bjørn Erik Pedersen <[email protected]>
date: Fri Aug 7 15:21:26 EDT 2015

Do not panic on index out of range in shortcode.Get

Fixes #1335

--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -60,7 +60,13 @@
 		if reflect.TypeOf(scp.Params).Kind() == reflect.Map {
 			return "error: cannot access named params by position"
 		} else if reflect.TypeOf(scp.Params).Kind() == reflect.Slice {
-			x = reflect.ValueOf(scp.Params).Index(int(reflect.ValueOf(key).Int()))
+			idx := int(reflect.ValueOf(key).Int())
+			ln := reflect.ValueOf(scp.Params).Len()
+			if idx > ln-1 {
+				helpers.DistinctErrorLog.Printf("No shortcode param at .Get %d in page %s, have params: %v", idx, scp.Page.FullFilePath(), scp.Params)
+				return fmt.Sprintf("error: index out of range for positional param at position %d", idx)
+			}
+			x = reflect.ValueOf(scp.Params).Index(idx)
 		}
 	case string:
 		if reflect.TypeOf(scp.Params).Kind() == reflect.Map {
--- a/hugolib/shortcode_test.go
+++ b/hugolib/shortcode_test.go
@@ -85,6 +85,12 @@
 	CheckShortCodeMatch(t, "{{<   video   47238zzb    >}}", "Playing Video 47238zzb", tem)
 }
 
+func TestPositionalParamIndexOutOfBounds(t *testing.T) {
+	tem := tpl.New()
+	tem.AddInternalShortcode("video.html", `Playing Video {{ .Get 1 }}`)
+	CheckShortCodeMatch(t, "{{< video 47238zzb >}}", "Playing Video error: index out of range for positional param at position 1", tem)
+}
+
 func TestNamedParamSC(t *testing.T) {
 	tem := tpl.New()
 	tem.AddInternalShortcode("img.html", `<img{{ with .Get "src" }} src="{{.}}"{{end}}{{with .Get "class"}} class="{{.}}"{{end}}>`)