Adding support for TOML, updating documentation - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d2a6267ad7664be33363bbe9e0502beca8f2c56d
 (DIR) parent 3c80cd323c89641c3f11a0126affc70f8ab6df19
 (HTM) Author: spf13 <steve.francia@gmail.com>
       Date:   Mon,  8 Jul 2013 22:23:54 -0400
       
       Adding support for TOML, updating documentation
       
       Diffstat:
         M README.md                           |      98 ++++++++++++++++++++++---------
         M docs/content/doc/contributors.md    |       2 +-
         M docs/content/doc/example.md         |       2 +-
         M docs/content/doc/front-matter.md    |      79 +++++++++++++++++++++++--------
         M docs/content/doc/roadmap.md         |       4 ++--
         M docs/content/doc/rst.rst            |       2 +-
         M hugolib/page.go                     |      44 ++++++++++++++++++++++++-------
       
       7 files changed, 168 insertions(+), 63 deletions(-)
       ---
 (DIR) diff --git a/README.md b/README.md
       @@ -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
 (DIR) diff --git 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:
 (DIR) diff --git a/docs/content/doc/example.md b/docs/content/doc/example.md
       @@ -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
        
 (DIR) diff --git 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.*
        
 (DIR) diff --git a/docs/content/doc/roadmap.md b/docs/content/doc/roadmap.md
       @@ -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
        
        
 (DIR) diff --git a/docs/content/doc/rst.rst b/docs/content/doc/rst.rst
       @@ -1,6 +1,6 @@
        ---
        Markup: 'rst'
       -...
       +---
        
        
        ==============
 (DIR) diff --git a/hugolib/page.go b/hugolib/page.go
       @@ -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,15 +195,17 @@ func splitPageContent(data []byte, start string, end string) ([]string, []string
                                        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 (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 page.parseYamlMetaData(data)
                }
                return nil, nil
        }