Adding support for TOML, updating documentation

This commit is contained in:
spf13 2013-07-08 22:23:54 -04:00
parent 3c80cd323c
commit d2a6267ad7
7 changed files with 168 additions and 63 deletions

View file

@ -262,35 +262,78 @@ Without any additional configuration the following will just work.
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 @@ Somethings are better shown than explained. The following is a very basic exampl
**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 @@ Somethings are better shown than explained. The following is a very basic exampl
Next include nitro in your application.
# Extras
## Shortcodes
@ -423,8 +465,8 @@ In no particular order, here is what I'm working on:
* 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

View file

@ -1,6 +1,6 @@
---
title: "Contributors"
Pubdate: "2013-07-01"
date: "2013-07-01"
---
Hugo was built with love and golang by:

View file

@ -16,7 +16,7 @@ Somethings are better shown than explained. The following is a very basic exampl
Topics": [ "Development", "GoLang" ]
Slug": "nitro"
project_url": "http://github.com/spf13/nitro"
...
---
# Nitro

View file

@ -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.*

View file

@ -11,8 +11,8 @@ In no particular order, here is what I'm working on:
* 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

View file

@ -1,6 +1,6 @@
---
Markup: 'rst'
...
---
==============

View file

@ -17,6 +17,7 @@ import (
"bytes"
"encoding/json"
"fmt"
"github.com/BurntSushi/toml"
"github.com/theplant/blackfriday"
"html/template"
"io/ioutil"
@ -154,6 +155,15 @@ func (page *Page) parseYamlMetaData(data []byte) ([]string, error) {
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,16 +195,18 @@ func splitPageContent(data []byte, start string, end string) ([]string, []string
break
}
}
} else {
if found == 0 && strings.HasPrefix(line, start) {
found += 1
}
if found == 0 && strings.HasPrefix(line, end) {
datum = lines[1 : i+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, start) {
found = 1
}
}
}
return datum, lines
}
@ -211,6 +223,14 @@ func (p *Page) Permalink() template.HTML {
}
}
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 @@ func (page *Page) parseFileHeading(data []byte) ([]string, error) {
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 nil, nil
}