ref: f3c816eabdaddc0939ddc70ac4e2aa3c16abcc11
parent: 3558e3d6f031a8a537750b20e4445699e9dba528
author: spf13 <[email protected]>
date: Thu Oct 24 10:31:04 EDT 2013
Adding support for more front matter types (int, float & date)
--- a/hugolib/metadata.go
+++ b/hugolib/metadata.go
@@ -70,10 +70,40 @@
return a
}
+func interfaceToFloat64(i interface{}) float64 {
+ switch s := i.(type) {
+ case float64:
+ return s
+ case float32:
+ return float64(s)
+
+ case string:
+ v, err := strconv.ParseFloat(s, 64)
+ if err == nil {
+ return float64(v)
+ } else {
+ errorf("Only Floats are supported for this key\nErr:", err)
+ }
+
+ default:
+ errorf("Only Floats are supported for this key")
+ }
+
+ return 0.0
+}
+
func interfaceToInt(i interface{}) int {
switch s := i.(type) {
case int:
return s
+ case int64:
+ return int(s)
+ case int32:
+ return int(s)
+ case int16:
+ return int(s)
+ case int8:
+ return int(s)
case string:
v, err := strconv.ParseInt(s, 0, 0)
if err == nil {
@@ -88,12 +118,23 @@
return 0
}
+func interfaceToTime(i interface{}) time.Time {
+ switch s := i.(type) {
+ case time.Time:
+ return s
+ default:
+ errorf("Only Time is supported for this key")
+ }
+
+ return *new(time.Time)
+}
+
func interfaceToString(i interface{}) string {
switch s := i.(type) {
case string:
return s
default:
- errorf("Only Strings are supported for this YAML key")
+ errorf("Only Strings are supported for this key")
}
return ""
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -330,7 +330,8 @@
m := f.(map[string]interface{})
for k, v := range m {
- switch strings.ToLower(k) {
+ loki := strings.ToLower(k)
+ switch loki {
case "title":
page.Title = interfaceToString(v)
case "description":
@@ -368,8 +369,14 @@
default:
// If not one of the explicit values, store in Params
switch vv := v.(type) {
- case string: // handle string values
- page.Params[strings.ToLower(k)] = vv
+ case string:
+ page.Params[loki] = vv
+ case int64, int32, int16, int8, int:
+ page.Params[loki] = vv
+ case float64, float32:
+ page.Params[loki] = vv
+ case time.Time:
+ page.Params[loki] = vv
default: // handle array of strings as well
switch vvv := vv.(type) {
case []interface{}:
@@ -396,6 +403,12 @@
switch v.(type) {
case string:
return interfaceToString(v)
+ case int64, int32, int16, int8, int:
+ return interfaceToInt(v)
+ case float64, float32:
+ return interfaceToFloat64(v)
+ case time.Time:
+ return interfaceToTime(v)
case []string:
return v
}
--- a/hugolib/page_test.go
+++ b/hugolib/page_test.go
@@ -141,6 +141,14 @@
`
)
+var PAGE_WITH_VARIOUS_FRONTMATTER_TYPES = `+++
+a_string = "bar"
+an_integer = 1
+a_float = 1.3
+a_date = 1979-05-27T07:32:00Z
++++
+Front Matter with various frontmatter types`
+
func checkError(t *testing.T, err error, expected string) {
if err == nil {
t.Fatalf("err is nil. Expected: %s", expected)
@@ -329,6 +337,24 @@
if p.IsRenderable() != test.render {
t.Errorf("expected p.IsRenderable() == %t, got %t", test.render, p.IsRenderable())
}
+ }
+}
+
+func TestDifferentFrontMatterVarTypes(t *testing.T) {
+ page, _ := ReadFrom(strings.NewReader(PAGE_WITH_VARIOUS_FRONTMATTER_TYPES), "test/file1.md")
+
+ dateval, _ := time.Parse(time.RFC3339, "1979-05-27T07:32:00Z")
+ if page.GetParam("a_string") != "bar" {
+ t.Errorf("frontmatter not handling strings correctly should be %s, got: %s", "bar", page.GetParam("a_string"))
+ }
+ if page.GetParam("an_integer") != 1 {
+ t.Errorf("frontmatter not handling ints correctly should be %s, got: %s", "1", page.GetParam("an_integer"))
+ }
+ if page.GetParam("a_float") != 1.3 {
+ t.Errorf("frontmatter not handling floats correctly should be %s, got: %s", 1.3, page.GetParam("a_float"))
+ }
+ if page.GetParam("a_date") != dateval {
+ t.Errorf("frontmatter not handling dates correctly should be %s, got: %s", dateval, page.GetParam("a_date"))
}
}