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
}