Adding support for TOML, updating documentation
authorspf13 <steve.francia@gmail.com>
Tue, 9 Jul 2013 02:23:54 +0000 (22:23 -0400)
committerspf13 <steve.francia@gmail.com>
Tue, 9 Jul 2013 02:23:54 +0000 (22:23 -0400)
README.md
docs/content/doc/contributors.md
docs/content/doc/example.md
docs/content/doc/front-matter.md
docs/content/doc/roadmap.md
docs/content/doc/rst.rst
hugolib/page.go

index c56dc315da08cacd6512000aa3a26989fb1597ee..555e7fa654b35badbe1e48cc6c8bbc7f4771081b 100644 (file)
--- 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
index 3a7d7e647d35418d6248f1a6838bcf611ecfed37..4bc5a9d31dd0969a2a064eef95038c0fcd831910 100644 (file)
@@ -1,6 +1,6 @@
 ---
 title: "Contributors"
-Pubdate: "2013-07-01"
+date: "2013-07-01"
 ---
 
 Hugo was built with love and golang by:
index ab409c5954e3cb6e28bd0b48de7e0d7242f1c8be..51e3c160e04a73a99c89b64946032a4bd8bcaa5f 100644 (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
 
index e4342099fcc0839f13ab6ff0a05dbec45789f387..0fb03b4439b5cc40878ba4f4326c070e4bbbcd71 100644 (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.*
 
index 93a7a83d40f25399a4e4bcaa6085db65632fb39a..1db9f2d7949aac1bcf76fc5077ccdd6cf565fb1f 100644 (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
 
 
index c2838eb0a4b86ed5a21491f6adb94ce4ce9f4489..37e1357cb35f72472764e1c44e72bc89638cbff5 100644 (file)
@@ -1,6 +1,6 @@
 ---
 Markup: 'rst'
-...
+---
 
 
 ==============
index 0adcb4957139773a05b8ba793787492e19e0a3a8..c21c1c3579eb5641ad985379a577db65bea61803 100644 (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,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
 }