shithub: hugo

Download patch

ref: d2a6267ad7664be33363bbe9e0502beca8f2c56d
parent: 3c80cd323c89641c3f11a0126affc70f8ab6df19
author: spf13 <[email protected]>
date: Mon Jul 8 18:23:54 EDT 2013

Adding support for TOML, updating documentation

--- a/README.md
+++ b/README.md
@@ -262,35 +262,78 @@
 
 The front matter is one of the features that gives Hugo it's strength. It enables
 you to include the meta data of the content right with it. Hugo supports a few 
-different formats. The main format supported is JSON. Here is an example:
+different formats each with their own identifying tokens. 
 
+Supported formats: <br>
+  **YAML**, identified by '\-\-\-'. <br>
+  **TOML**, indentified with '+++'.<br>
+  **JSON**, a single JSON object which is surrounded by '{' and '}' each on their own line.
+
+### YAML Example
+
+    ---
+    title: "spf13-vim 3.0 release and new website"
+    description: "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
+    tags: [ ".vimrc", "plugins", "spf13-vim", "vim" ]
+    pubdate: "2012-04-06"
+    categories:
+      - "Development"
+      - "VIM"
+    slug: "spf13-vim-3-0-release-and-new-website"
+    ---
+    Content of the file goes Here 
+
+### TOML Example
+
+    +++
+    title = "spf13-vim 3.0 release and new website"
+    description = "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
+    tags = [ ".vimrc", "plugins", "spf13-vim", "vim" ]
+    Pubdate = "2012-04-06"
+    categories = [
+      "Development",
+      "VIM"
+    ]
+    slug = "spf13-vim-3-0-release-and-new-website"
+    +++
+    Content of the file goes Here 
+
+### JSON Example
+
     {
-        "Title": "spf13-vim 3.0 release and new website",
-        "Description": "spf13-vim is a cross platform distribution of vim plugins and resources for Vim.",
-        "Tags": [ ".vimrc", "plugins", "spf13-vim", "vim" ],
-        "Pubdate": "2012-04-06",
-        "Categories": [ "Development", "VIM" ],
-        "Slug": "spf13-vim-3-0-release-and-new-website"
+    "title": "spf13-vim 3.0 release and new website",
+    "description": "spf13-vim is a cross platform distribution of vim plugins and resources for Vim.",
+    "tags": [ ".vimrc", "plugins", "spf13-vim", "vim" ],
+    "date": "2012-04-06",
+    "categories": [
+        "Development",
+        "VIM"
+    ],
+    "slug": "spf13-vim-3-0-release-and-new-website",
     }
+    Content of the file goes Here 
 
 ### Variables
 There are a few predefined variables that Hugo is aware of and utilizes. The user can also create
 any variable they want to. These will be placed into the `.Params` variable available to the templates.
+**Field names are case insensitive.**
 
 #### Required
 
-**Title**  The title for the content. <br>
-**Description** The description for the content.<br>
-**Pubdate** The date the content will be sorted by.<br>
-**Indexes** These will use the field name of the plural form of the index (see tags and categories above)
+**title**  The title for the content. <br>
+**description** The description for the content.<br>
+**date** The date the content will be sorted by.<br>
+**indexes** These will use the field name of the plural form of the index (see tags and categories above)
 
 #### Optional
 
-**Draft** If true the content will not be rendered unless `hugo` is called with -d<br>
-**Type** The type of the content (will be derived from the directory automatically if unset).<br>
-**Slug** The token to appear in the tail of the url.<br>
+**draft** If true the content will not be rendered unless `hugo` is called with -d<br>
+**type** The type of the content (will be derived from the directory automatically if unset).<br>
+**markup** (Experimental) Specify "rst" for reStructuredText (requires
+           `rst2html`,) or "md" (default) for the Markdown.<br>
+**slug** The token to appear in the tail of the url.<br>
   *or*<br>
-**Url** The full path to the content from the web root.<br>
+**url** The full path to the content from the web root.<br>
 *If neither is present the filename will be used.*
 
 ## Example
@@ -298,16 +341,16 @@
 
 **mysite/project/nitro.md  <- http://mysite.com/project/nitro.html**
 
-    {
-        "Title": "Nitro : A quick and simple profiler for golang",
-        "Description": "",
-        "Keywords": [ "Development", "golang", "profiling" ],
-        "Tags": [ "Development", "golang", "profiling" ],
-        "Pubdate": "2013-06-19",
-        "Topics": [ "Development", "GoLang" ],
-        "Slug": "nitro",
-        "project_url": "http://github.com/spf13/nitro"
-    }
+    ---
+    Title: "Nitro : A quick and simple profiler for golang"
+    Description": ""
+    Keywords": [ "Development", "golang", "profiling" ]
+    Tags": [ "Development", "golang", "profiling" ]
+    Pubdate": "2013-06-19"
+    Topics": [ "Development", "GoLang" ]
+    Slug": "nitro"
+    project_url": "http://github.com/spf13/nitro"
+    ---
 
     # Nitro
 
@@ -329,7 +372,6 @@
     Next include nitro in your application.
 
 
-
 # Extras
 
 ## Shortcodes
@@ -423,8 +465,8 @@
  * Syntax highlighting
  * Previous & Next
  * Related Posts
- * Support for TOML front matter
- * Proper YAML support for front matter
+ * Support for TOML front matter -- in head
+ * Proper YAML support for front matter -- in head
  * Support for other formats
 
 ## Contributing
--- a/docs/content/doc/contributors.md
+++ b/docs/content/doc/contributors.md
@@ -1,6 +1,6 @@
 ---
 title: "Contributors"
-Pubdate: "2013-07-01"
+date: "2013-07-01"
 ---
 
 Hugo was built with love and golang by:
--- a/docs/content/doc/example.md
+++ b/docs/content/doc/example.md
@@ -16,7 +16,7 @@
     Topics": [ "Development", "GoLang" ]
     Slug": "nitro"
     project_url": "http://github.com/spf13/nitro"
-    ...
+    ---
 
     # Nitro
 
--- a/docs/content/doc/front-matter.md
+++ b/docs/content/doc/front-matter.md
@@ -1,43 +1,82 @@
----
-title: "Front Matter"
-Pubdate: "2013-07-01"
----
++++
+title = "Front Matter"
+date = "2013-07-01"
++++
 
 The front matter is one of the features that gives Hugo it's strength. It enables
 you to include the meta data of the content right with it. Hugo supports a few 
-different formats. The main format supported is YAML. Here is an example:
+different formats each with their own identifying tokens. 
 
+Supported formats: <br>
+  **YAML**, identified by '\-\-\-'. <br>
+  **TOML**, indentified with '+++'.<br>
+  **JSON**, a single JSON object which is surrounded by '{' and '}' each on their own line.
+
+### YAML Example
+
     ---
-    Title: "spf13-vim 3.0 release and new website"
-    Description: "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
-    Tags: [ ".vimrc", "plugins", "spf13-vim", "vim" ]
-    Pubdate: "2012-04-06"
-    Categories:
+    title: "spf13-vim 3.0 release and new website"
+    description: "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
+    tags: [ ".vimrc", "plugins", "spf13-vim", "vim" ]
+    pubdate: "2012-04-06"
+    categories:
       - "Development"
       - "VIM"
-    Slug: "spf13-vim-3-0-release-and-new-website"
+    slug: "spf13-vim-3-0-release-and-new-website"
     ---
+    Content of the file goes Here 
 
+### TOML Example
+
+    +++
+    title = "spf13-vim 3.0 release and new website"
+    description = "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
+    tags = [ ".vimrc", "plugins", "spf13-vim", "vim" ]
+    Pubdate = "2012-04-06"
+    categories = [
+      "Development",
+      "VIM"
+    ]
+    slug = "spf13-vim-3-0-release-and-new-website"
+    +++
+    Content of the file goes Here 
+
+### JSON Example
+
+    {
+    "title": "spf13-vim 3.0 release and new website",
+    "description": "spf13-vim is a cross platform distribution of vim plugins and resources for Vim.",
+    "tags": [ ".vimrc", "plugins", "spf13-vim", "vim" ],
+    "date": "2012-04-06",
+    "categories": [
+        "Development",
+        "VIM"
+    ],
+    "slug": "spf13-vim-3-0-release-and-new-website",
+    }
+    Content of the file goes Here 
+
 ### Variables
 
 There are a few predefined variables that Hugo is aware of and utilizes. The user can also create
 any variable they want to. These will be placed into the `.Params` variable available to the templates.
+**Field names are case insensitive.**
 
 #### Required
 
-**Title**  The title for the content. <br>
-**Description** The description for the content.<br>
-**Pubdate** The date the content will be sorted by.<br>
-**Indexes** These will use the field name of the plural form of the index (see tags and categories above)
+**title**  The title for the content. <br>
+**description** The description for the content.<br>
+**date** The date the content will be sorted by.<br>
+**indexes** These will use the field name of the plural form of the index (see tags and categories above)
 
 #### Optional
 
-**Draft** If true the content will not be rendered unless `hugo` is called with -d<br>
-**Type** The type of the content (will be derived from the directory automatically if unset).<br>
-**Markup** (Experimental) Specify "rst" for reStructuredText (requires
+**draft** If true the content will not be rendered unless `hugo` is called with -d<br>
+**type** The type of the content (will be derived from the directory automatically if unset).<br>
+**markup** (Experimental) Specify "rst" for reStructuredText (requires
            `rst2html`,) or "md" (default) for the Markdown.<br>
-**Slug** The token to appear in the tail of the url.<br>
+**slug** The token to appear in the tail of the url.<br>
   *or*<br>
-**Url** The full path to the content from the web root.<br>
+**url** The full path to the content from the web root.<br>
 *If neither is present the filename will be used.*
 
--- a/docs/content/doc/roadmap.md
+++ b/docs/content/doc/roadmap.md
@@ -11,8 +11,8 @@
  * Syntax highlighting
  * Previous & Next
  * Related Posts
- * Support for TOML front matter
- * Proper YAML support for front matter
+ * Support for TOML front matter -- in head
+ * Proper YAML support for front matter -- in head
  * Support for other formats
 
 
--- a/docs/content/doc/rst.rst
+++ b/docs/content/doc/rst.rst
@@ -1,6 +1,6 @@
 ---
 Markup: 'rst'
-...
+---
 
 
 ==============
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -17,6 +17,7 @@
 	"bytes"
 	"encoding/json"
 	"fmt"
+	"github.com/BurntSushi/toml"
 	"github.com/theplant/blackfriday"
 	"html/template"
 	"io/ioutil"
@@ -154,6 +155,15 @@
 	return lines, err
 }
 
+func (page *Page) parseTomlMetaData(data []byte) ([]string, error) {
+	var err error
+
+	datum, lines := splitPageContent(data, "+++", "+++")
+
+	err = page.handleMetaData(page.handleTomlMetaData([]byte(strings.Join(datum, "\n"))))
+	return lines, err
+}
+
 func (page *Page) parseJsonMetaData(data []byte) ([]string, error) {
 	var err error
 
@@ -185,15 +195,17 @@
 				break
 			}
 		}
-	} else {
-		if found == 0 && strings.HasPrefix(line, start) {
-			found += 1
-		}
+	} else { // Start token & end token are the same
+		for i, line := range lines {
+			if found == 1 && strings.HasPrefix(line, end) {
+				datum = lines[1:i]
+				lines = lines[i+1:]
+				break
+			}
 
-		if found == 0 && strings.HasPrefix(line, end) {
-			datum = lines[1 : i+1]
-			lines = lines[i+1:]
-			break
+			if found == 0 && strings.HasPrefix(line, start) {
+				found = 1
+			}
 		}
 	}
 	return datum, lines
@@ -211,6 +223,14 @@
 	}
 }
 
+func (page *Page) handleTomlMetaData(datum []byte) interface{} {
+	m := map[string]interface{}{}
+	if _, err := toml.Decode(string(datum), &m); err != nil {
+		return fmt.Errorf("Invalid TOML in %s \nError parsing page meta data: %s", page.FileName, err)
+	}
+	return m
+}
+
 func (page *Page) handleYamlMetaData(datum []byte) interface{} {
 	m := map[string]interface{}{}
 	if err := goyaml.Unmarshal(datum, &m); err != nil {
@@ -304,10 +324,14 @@
 	if len(data) == 0 {
 		page.Err("Empty File, skipping")
 	} else {
-		if data[0] == '{' {
+		switch data[0] {
+		case '{':
 			return page.parseJsonMetaData(data)
+		case '-':
+			return page.parseYamlMetaData(data)
+		case '+':
+			return page.parseTomlMetaData(data)
 		}
-		return page.parseYamlMetaData(data)
 	}
 	return nil, nil
 }