shithub: hugo

Download patch

ref: 22b213b1a4fb1803d798232ce94339732a604857
parent: 11e5d456e8bca845a43ba13b39cd26c60d26eb1c
parent: e81208265bb3cdb7606d051a23d83aeebcb7d34d
author: Bjørn Erik Pedersen <[email protected]>
date: Sun Aug 6 13:24:51 EDT 2017

Merge commit 'e81208265bb3cdb7606d051a23d83aeebcb7d34d'

--- a/docs/config.toml
+++ b/docs/config.toml
@@ -57,6 +57,8 @@
   removefromexternalsearch = false
   ## Gh repo for site footer (include trailing slash)
   ghrepo = "https://github.com/gohugoio/hugoDocs/"
+  ## GH Repo for filing a new issue
+  github_repo = "https://github.com/gohugoio/hugo/issues/new"
   ### Edit content repo (set to automatically enter "edit" mode; this is good for "improve this page" links)
   ghdocsrepo = "https://github.com/gohugoio/hugoDocs/tree/master/docs"
   ## Gitter URL
--- a/docs/content/content-management/cross-references.md
+++ b/docs/content/content-management/cross-references.md
@@ -96,8 +96,8 @@
 
 ### Examples
 
-* `{{</* ref "blog/post.md" */>}}` => `http://example.com/blog/post/`
-* `{{</* ref "post.md#tldr" */>}}` => `http://example.com/blog/post/#tldr:caffebad`
+* `{{</* ref "blog/post.md" */>}}` => `https://example.com/blog/post/`
+* `{{</* ref "post.md#tldr" */>}}` => `https://example.com/blog/post/#tldr:caffebad`
 * `{{</* relref "post.md" */>}}` => `/blog/post/`
 * `{{</* relref "blog/post.md#tldr" */>}}` => `/blog/post/#tldr:caffebad`
 * `{{</* ref "#tldr" */>}}` => `#tldr:badcaffe`
--- a/docs/content/content-management/front-matter.md
+++ b/docs/content/content-management/front-matter.md
@@ -54,7 +54,7 @@
 ---
 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" ]
+tags: [ ".vimrc", "plugins", "spf13-vim", "vim" ]
 lastmod: 2015-12-23
 date: "2012-04-06"
 categories:
--- a/docs/content/content-management/menus.md
+++ b/docs/content/content-management/menus.md
@@ -153,7 +153,7 @@
 {{< /code >}}
 
 {{% note %}}
-The URLs must be relative to the context root. If the `baseURL` is `http://example.com/mysite/`, then the URLs in the menu must not include the context root `mysite`. Using an absolute URL will overide the baseURL. If the value used for `URL` in the above example is `http://subdomain.example.com/`, the output will be `http://subdomain.example.com`.
+The URLs must be relative to the context root. If the `baseURL` is `https://example.com/mysite/`, then the URLs in the menu must not include the context root `mysite`. Using an absolute URL will overide the baseURL. If the value used for `URL` in the above example is `https://subdomain.example.com/`, the output will be `https://subdomain.example.com`.
 {{% /note %}}
 
 ## Nesting
--- a/docs/content/content-management/organization.md
+++ b/docs/content/content-management/organization.md
@@ -34,20 +34,20 @@
 .
 └── content
     └── about
-    |   └── _index.md  // <- http://example.com/about/
+    |   └── _index.md  // <- https://example.com/about/
     ├── post
-    |   ├── firstpost.md   // <- http://example.com/post/firstpost/
+    |   ├── firstpost.md   // <- https://example.com/post/firstpost/
     |   ├── happy
-    |   |   └── ness.md  // <- http://example.com/post/happy/ness/
-    |   └── secondpost.md  // <- http://example.com/post/secondpost/
+    |   |   └── ness.md  // <- https://example.com/post/happy/ness/
+    |   └── secondpost.md  // <- https://example.com/post/secondpost/
     └── quote
-        ├── first.md       // <- http://example.com/quote/first/
-        └── second.md      // <- http://example.com/quote/second/
+        ├── first.md       // <- https://example.com/quote/first/
+        └── second.md      // <- https://example.com/quote/second/
 ```
 
 ## Path Breakdown in Hugo
 
-The following demonstrates the relationships between your content organization and the output URL structure for your Hugo website when it renders. These examples assume you are [using pretty URLs][pretty], which is the default behavior for Hugo. The examples also assume a key-value of `baseurl = "http://example.com"` in your [site's configuration file][config].
+The following demonstrates the relationships between your content organization and the output URL structure for your Hugo website when it renders. These examples assume you are [using pretty URLs][pretty], which is the default behavior for Hugo. The examples also assume a key-value of `baseurl = "https://example.com"` in your [site's configuration file][config].
 
 ### Index Pages: `_index.md`
 
@@ -76,7 +76,7 @@
 ⊢--------^---------⊣⊢-^-⊣
         permalink
 ⊢----------^-------------⊣
-http://example.com/posts/index.html
+https://example.com/posts/index.html
 ```
 
 ### Single Pages in Sections
@@ -102,7 +102,7 @@
 ⊢--------^--------⊣⊢-^--⊣⊢-------^---------⊣
                  permalink
 ⊢--------------------^---------------------⊣
-http://example.com/posts/my-first-hugo-post/index.html
+https://example.com/posts/my-first-hugo-post/index.html
 ```
 
 ### Section with Nested Directories
@@ -120,7 +120,7 @@
 ⊢--------^--------⊣ ⊢------^-----⊣⊢----^------⊣
                   permalink
 ⊢----------------------^-----------------------⊣
-http://example.com/events/chicago/lollapalooza/
+https://example.com/events/chicago/lollapalooza/
 ```
 
 {{% note %}}
@@ -201,9 +201,9 @@
 ---
 {{< /code >}}
 <!-- See https://discourse.gohugo.io/t/path-not-works/6387 -->
-<!-- ### `path`
+<!-- ### `path`-->
 
-`path` can be provided in the front matter. This will replace the actual path to the file on disk. Destination will create the destination with the same path, including the section. -->
+<!--`path` can be provided in the front matter. This will replace the actual path to the file on disk. Destination will create the destination with the same path, including the section. -->
 
 ### `url`
 
--- a/docs/content/content-management/taxonomies.md
+++ b/docs/content/content-management/taxonomies.md
@@ -163,7 +163,7 @@
 ```
 ---
 title: "Hugo: A fast and flexible static site generator"
-#tags: ["Development", "Go", "fast", "Blogging"]
+tags: ["Development", "Go", "fast", "Blogging"]
 categories: ["Development"]
 series: ["Go Web Dev"]
 slug: "hugo"
@@ -216,7 +216,7 @@
 ```
 ---
 title: foo
-#tags: [ "a", "b", "c" ]
+tags: [ "a", "b", "c" ]
 tags_weight: 22
 categories: ["d"]
 categories_weight: 44
--- a/docs/content/content-management/urls.md
+++ b/docs/content/content-management/urls.md
@@ -43,7 +43,7 @@
   post = "/:year/:month/:title/"
 {{< /code >}}
 
-Only the content under `post/` will have the new URL structure. For example, the file `content/post/sample-entry.md` with `date: 2017-02-27T19:20:00-05:00` in its front matter will render to `public/2017/02/sample-entry/index.html` at build time and therefore be reachable at `http://example.com/2013/11/sample-entry/`.
+Only the content under `post/` will have the new URL structure. For example, the file `content/post/sample-entry.md` with `date: 2017-02-27T19:20:00-05:00` in its front matter will render to `public/2017/02/sample-entry/index.html` at build time and therefore be reachable at `https://example.com/2013/11/sample-entry/`.
 
 ### Permalink Configuration Values
 
@@ -147,11 +147,11 @@
 <!DOCTYPE html>
 <html>
   <head>
-    <title>http://example.com/posts/my-intended-url</title>
-    <link rel="canonical" href="http://example.com/posts/my-intended-url"/>
+    <title>https://example.com/posts/my-intended-url</title>
+    <link rel="canonical" href="https://example.com/posts/my-intended-url"/>
     <meta name=\"robots\" content=\"noindex\">
     <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
-    <meta http-equiv="refresh" content="0; url=http://example.com/posts/my-intended-url"/>
+    <meta http-equiv="refresh" content="0; url=https://example.com/posts/my-intended-url"/>
   </head>
 </html>
 ```
@@ -190,7 +190,7 @@
 
 ## Ugly URLs
 
-If you would like to have are often referred to as "ugly URLs" (e.g., example.com/urls.html), set `uglyurls = true` or `uglyurls: true` in your site's `config.toml` or `config.yaml`, respectively. You can also use the `--uglyURLs=true` [flag from the command line][usage] with `hugo` or `hugo server`..
+If you would like to have what are often referred to as "ugly URLs" (e.g., example.com/urls.html), set `uglyurls = true` or `uglyurls: true` in your site's `config.toml` or `config.yaml`, respectively. You can also use the `--uglyURLs=true` [flag from the command line][usage] with `hugo` or `hugo server`..
 
 If you want a specific piece of content to have an exact URL, you can specify this in the [front matter][] under the `url` key. The following are examples of the same content directory and what the eventual URL structure will be when Hugo runs with its default behavior.
 
@@ -200,15 +200,15 @@
 .
 └── content
     └── about
-    |   └── _index.md  // <- http://example.com/about/
+    |   └── _index.md  // <- https://example.com/about/
     ├── post
-    |   ├── firstpost.md   // <- http://example.com/post/firstpost/
+    |   ├── firstpost.md   // <- https://example.com/post/firstpost/
     |   ├── happy
-    |   |   └── ness.md  // <- http://example.com/post/happy/ness/
-    |   └── secondpost.md  // <- http://example.com/post/secondpost/
+    |   |   └── ness.md  // <- https://example.com/post/happy/ness/
+    |   └── secondpost.md  // <- https://example.com/post/secondpost/
     └── quote
-        ├── first.md       // <- http://example.com/quote/first/
-        └── second.md      // <- http://example.com/quote/second/
+        ├── first.md       // <- https://example.com/quote/first/
+        └── second.md      // <- https://example.com/quote/second/
 ```
 
 Here's the same organization run with `hugo --uglyURLs`:
@@ -217,15 +217,15 @@
 .
 └── content
     └── about
-    |   └── _index.md  // <- http://example.com/about/index.html
+    |   └── _index.md  // <- https://example.com/about/index.html
     ├── post
-    |   ├── firstpost.md   // <- http://example.com/post/firstpost.html
+    |   ├── firstpost.md   // <- https://example.com/post/firstpost.html
     |   ├── happy
-    |   |   └── ness.md    // <- http://example.com/post/happy/ness.html
-    |   └── secondpost.md  // <- http://example.com/post/secondpost.html
+    |   |   └── ness.md    // <- https://example.com/post/happy/ness.html
+    |   └── secondpost.md  // <- https://example.com/post/secondpost.html
     └── quote
-        ├── first.md       // <- http://example.com/quote/first.html
-        └── second.md      // <- http://example.com/quote/second.html
+        ├── first.md       // <- https://example.com/quote/first.html
+        └── second.md      // <- https://example.com/quote/second.html
 ```
 
 
@@ -233,7 +233,7 @@
 
 By default, all relative URLs encountered in the input are left unmodified, e.g. `/css/foo.css` would stay as `/css/foo.css`. The `canonifyURLs` field in your site `config` has a default value of `false`.
 
-By setting `canonifyURLs` to `true`, all relative URLs would instead be *canonicalized* using `baseURL`.  For example, assuming you have `baseURL = https://example.com/`, the relative URL `/css/foo.css` would be turned into the absolute URL `http://example.com/css/foo.css`.
+By setting `canonifyURLs` to `true`, all relative URLs would instead be *canonicalized* using `baseURL`.  For example, assuming you have `baseURL = https://example.com/`, the relative URL `/css/foo.css` would be turned into the absolute URL `https://example.com/css/foo.css`.
 
 Benefits of canonicalization include fixing all URLs to be absolute, which may aid with some parsing tasks. Note, however, that all modern browsers handle this on the client without issue.
 
--- a/docs/content/contribute/development.md
+++ b/docs/content/contribute/development.md
@@ -139,6 +139,12 @@
 go get -v -u github.com/gohugoio/hugo
 ```
 
+Hugo relies on [Testify](https://github.com/stretchr/testify) for testing Go code. If you don't already have it, get the Testify testing tools:
+
+```
+go get github.com/stretchr/testify
+```
+
 ### Fork the repository
 
 If you're not fimiliar with this term, GitHub's [help pages](https://help.github.com/articles/fork-a-repo/) provide again a simple explanation:
--- a/docs/content/contribute/themes.md
+++ b/docs/content/contribute/themes.md
@@ -64,7 +64,7 @@
 license = "MIT"
 licenselink = "https://github.com/<YOURNAME>/<YOURTHEME>/blob/master/LICENSE.md"
 description = ""
-homepage = "http://example.com/"
+homepage = "https://example.com/"
 tags = []
 features = []
 min_version = 0.19
--- a/docs/content/functions/abslangurl.md
+++ b/docs/content/functions/abslangurl.md
@@ -20,9 +20,9 @@
 
 Both `absLangURL` and [`relLangURL`](/functions/rellangurl/) are similar to their [`absURL`](/functions/absurl/) and [`relURL`](/functions/relurl) relatives but will add the correct language prefix when the site is configured with more than one language.
 
-So for a site  `baseURL` set to `http://example.com/hugo/` and the current language is `en`:
+So for a site  `baseURL` set to `https://example.com/hugo/` and the current language is `en`:
 
 ```
-{{ "blog/" | absLangURL }} → "http://example.com/hugo/en/blog/"
+{{ "blog/" | absLangURL }} → "https://example.com/hugo/en/blog/"
 {{ "blog/" | relLangURL }} → "/hugo/en/blog/"
 ```
--- a/docs/content/functions/absurl.md
+++ b/docs/content/functions/absurl.md
@@ -18,10 +18,10 @@
 aliases: []
 ---
 
-Both `absURL` and `relURL` consider the configured value of `baseURL` in your site's [`config` file][configuration]. Given a `baseURL` set to `http://example.com/hugo/`:
+Both `absURL` and `relURL` consider the configured value of `baseURL` in your site's [`config` file][configuration]. Given a `baseURL` set to `https://example.com/hugo/`:
 
 ```
-{{ "mystyle.css" | absURL }} → "http://example.com/hugo/mystyle.css"
+{{ "mystyle.css" | absURL }} → "https://example.com/hugo/mystyle.css"
 {{ "mystyle.css" | relURL }} → "/hugo/mystyle.css"
 {{ "http://gohugo.io/" | relURL }} →  "http://gohugo.io/"
 {{ "http://gohugo.io/" | absURL }} →  "http://gohugo.io/"
--- a/docs/content/functions/math.md
+++ b/docs/content/functions/math.md
@@ -38,7 +38,7 @@
 For example, social media sharing with [Twitter Cards][cards] requires the following `meta` link in your site's `<head>` to display Twitter's ["Summary Card with Large Image"][twtsummary]:
 
 ```
-<meta name="twitter:image" content="http://example.com/images/my-twitter-image.jpg">
+<meta name="twitter:image" content="https://example.com/images/my-twitter-image.jpg">
 ```
 
 Let's assume you have an `image` field in the front matter of each of your content files:
--- a/docs/content/functions/relLangURL.md
+++ b/docs/content/functions/relLangURL.md
@@ -20,10 +20,10 @@
 
 `absLangURL` and `relLangURL` functions are similar to their [`absURL`](/functions/absurl/) and [`relURL`](/functions/relurl/) relatives but will add the correct language prefix when the site is configured with more than one language. (See [Configuring Multilingual][multiliconfig].)
 
-So for a site  `baseURL` set to `http://example.com/hugo/` and the current language is `en`:
+So for a site  `baseURL` set to `https://example.com/hugo/` and the current language is `en`:
 
 ```
-{{ "blog/" | absLangURL }} → "http://example.com/hugo/en/blog/"
+{{ "blog/" | absLangURL }} → "https://example.com/hugo/en/blog/"
 {{ "blog/" | relLangURL }} → "/hugo/en/blog/"
 ```
 
--- a/docs/content/functions/relurl.md
+++ b/docs/content/functions/relurl.md
@@ -18,10 +18,10 @@
 aliases: []
 ---
 
-Both `absURL` and `relURL` consider the configured value of `baseURL` in your site's [`config` file][configuration]. Given a `baseURL` set to `http://example.com/hugo/`:
+Both `absURL` and `relURL` consider the configured value of `baseURL` in your site's [`config` file][configuration]. Given a `baseURL` set to `https://example.com/hugo/`:
 
 ```
-{{ "mystyle.css" | absURL }} → "http://example.com/hugo/mystyle.css"
+{{ "mystyle.css" | absURL }} → "https://example.com/hugo/mystyle.css"
 {{ "mystyle.css" | relURL }} → "/hugo/mystyle.css"
 {{ "http://gohugo.io/" | relURL }} →  "http://gohugo.io/"
 {{ "http://gohugo.io/" | absURL }} →  "http://gohugo.io/"
--- a/docs/content/functions/title.md
+++ b/docs/content/functions/title.md
@@ -23,3 +23,11 @@
 ```
 {{title "BatMan"}}` → "Batman"
 ```
+
+Can be combined in pipes. In the following snippet, the link text is cleaned up using `humanize` to remove dashes and `title` to convert the value of `$name` to Intial Caps.
+
+```
+{{ range $name, $items := .Site.Taxonomies.categories }}
+    <li><a href="{{ printf "%s/%s" "categories" ($name | urlize | lower) | absURL }}">{{ $name | humanize | title }} ({{ len $items }})</a></li>
+{{ end }}
+```
--- a/docs/content/getting-started/quick-start.md
+++ b/docs/content/getting-started/quick-start.md
@@ -118,7 +118,7 @@
 Open up `config.toml` in a text editor:
 
 ```
-baseURL = "http://example.org/"
+baseURL = "https://example.org/"
 languageCode = "en-us"
 title = "My New Hugo Site"
 theme = "ananke"
--- a/docs/content/templates/output-formats.md
+++ b/docs/content/templates/output-formats.md
@@ -26,7 +26,7 @@
 
 This is the full set of built-in media types in Hugo:
 
-{{< datatable "media" "types" "Type" "Suffix" >}}
+{{< datatable "media" "types" "type" "suffix" >}}
 
 **Note:**
 
@@ -55,7 +55,7 @@
 
 This is the full set of Hugo's built-in output formats:
 
-{{< datatable "output" "formats" "Name" "MediaType" "Path" "BaseName" "Rel" "Protocol" "IsPlainText" "IsHTML" "NoUgly">}}
+{{< datatable "output" "formats" "name" "mediaType" "path" "baseName" "rel" "protocol" "isPlainText" "isHTML" "noUgly">}}
 
 * A page can be output in as many output formats as you want, and you can have an infinite amount of output formats defined **as long as they resolve to a unique path on the file system**. In the above table, the best example of this is `AMP` vs. `HTML`. `AMP` has the value `amp` for `Path` so it doesn't overwrite the `HTML` version; e.g. we can now have both `/index.html` and `/amp/index.html`.
 * The `MediaType` must match the `Type` of an already defined media type.
@@ -71,40 +71,40 @@
 protocol = "bep://"
 ```
 
-The above example is fictional, but if used for the homepage on a site with `baseURL` `http://example.org`, it will produce a plain text homepage with the URL `bep://example.org/myindex.enr`.
+The above example is fictional, but if used for the homepage on a site with `baseURL` `https://example.org`, it will produce a plain text homepage with the URL `bep://example.org/myindex.enr`.
 
 ### Configure Output Formats
 
 The following is the full list of configuration options for output formats and their default values:
 
-`Name`
+`name`
 : the output format identifier. This is used to define what output format(s) you want for your pages.
 
-`MediaType`
+`mediaType`
 : this must match the `Type` of a defined media type.
 
-`Path`
+`path`
 : sub path to save the output files.
 
-`BaseName`
+`baseName`
 : the base filename for the list filenames (homepage, etc.). **Default:** `index`.
 
-`Rel`
+`rel`
 : can be used to create `rel` values in `link` tags. **Default:** `alternate`.
 
-`Protocol`
+`protocol`
 : will replace the "http://" or "https://" in your `baseURL` for this output format.
 
-`IsPlainText`
+`isPlainText`
 : use Go's plain text templates parser for the templates. **Default:** `false`.
 
-`IsHTML`
+`isHTML`
 : used in situations only relevant for `HTML`-type formats; e.g., page aliases.
 
-`NoUgly`
+`noUgly`
 : used to turn off ugly URLs If `uglyURLs` is set to `true` in your site. **Default:** `false`.
 
-`NotAlternative`
+`notAlternative`
 : enable if it doesn't make sense to include this format in an `AlternativeOutputFormats` format listing on `Page` (e.g., with `CSS`). Note that we use the term *alternative* and not *alternate* here, as it does not necessarily replace the other format. **Default:** `false`.
 
 ## Output Formats for Pages
--- a/docs/content/templates/rss.md
+++ b/docs/content/templates/rss.md
@@ -84,9 +84,9 @@
 ```
 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
-    <title>{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}</title>
+    <title>{{ if eq  .Title  .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
     <link>{{ .Permalink }}</link>
-    <description>Recent content {{ with .Title }}in {{.}} {{ end }}on {{ .Site.Title }}</description>
+    <description>Recent content {{ if ne  .Title  .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
     <generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
     <language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
     <managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
@@ -93,8 +93,10 @@
     <webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
     <copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
     <lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
-    <atom:link href="{{.URL}}" rel="self" type="application/rss+xml" />
-    {{ range first 15 .Data.Pages }}
+    {{ with .OutputFormats.Get "RSS" }}
+        {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
+    {{ end }}
+    {{ range .Data.Pages }}
     <item>
       <title>{{ .Title }}</title>
       <link>{{ .Permalink }}</link>
@@ -101,7 +103,7 @@
       <pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
       {{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
       <guid>{{ .Permalink }}</guid>
-      <description>{{ .Content | html }}</description>
+      <description>{{ .Summary | html }}</description>
     </item>
     {{ end }}
   </channel>
--- a/docs/content/variables/page.md
+++ b/docs/content/variables/page.md
@@ -179,7 +179,7 @@
 title: My First Post
 date: date: 2017-02-20T15:26:23-06:00
 categories: [one]
-#tags: [two,three,four]
+tags: [two,three,four]
 ```
 
 With the above front matter, the `tags` and `categories` taxonomies are accessible via the following:
--- a/docs/content/variables/site.md
+++ b/docs/content/variables/site.md
@@ -109,7 +109,7 @@
 The following `config.toml` defines a site-wide param for `description`:
 
 ```
-baseURL = "http://yoursite.example.com/"
+baseURL = "https://yoursite.example.com/"
 
 [params]
   description = "Tesla's Awesome Hugo Site"
--- a/docs/data/docs.json
+++ b/docs/data/docs.json
@@ -2,76 +2,76 @@
   "media": {
     "types": [
       {
-        "Type": "application/javascript",
-        "String": "application/javascript+js",
-        "MainType": "application",
-        "SubType": "javascript",
-        "Suffix": "js",
-        "Delimiter": "."
+        "type": "application/javascript",
+        "string": "application/javascript+js",
+        "mainType": "application",
+        "subType": "javascript",
+        "suffix": "js",
+        "delimiter": "."
       },
       {
-        "Type": "application/json",
-        "String": "application/json+json",
-        "MainType": "application",
-        "SubType": "json",
-        "Suffix": "json",
-        "Delimiter": "."
+        "type": "application/json",
+        "string": "application/json+json",
+        "mainType": "application",
+        "subType": "json",
+        "suffix": "json",
+        "delimiter": "."
       },
       {
-        "Type": "application/rss",
-        "String": "application/rss+xml",
-        "MainType": "application",
-        "SubType": "rss",
-        "Suffix": "xml",
-        "Delimiter": "."
+        "type": "application/rss",
+        "string": "application/rss+xml",
+        "mainType": "application",
+        "subType": "rss",
+        "suffix": "xml",
+        "delimiter": "."
       },
       {
-        "Type": "application/xml",
-        "String": "application/xml+xml",
-        "MainType": "application",
-        "SubType": "xml",
-        "Suffix": "xml",
-        "Delimiter": "."
+        "type": "application/xml",
+        "string": "application/xml+xml",
+        "mainType": "application",
+        "subType": "xml",
+        "suffix": "xml",
+        "delimiter": "."
       },
       {
-        "Type": "text/calendar",
-        "String": "text/calendar+ics",
-        "MainType": "text",
-        "SubType": "calendar",
-        "Suffix": "ics",
-        "Delimiter": "."
+        "type": "text/calendar",
+        "string": "text/calendar+ics",
+        "mainType": "text",
+        "subType": "calendar",
+        "suffix": "ics",
+        "delimiter": "."
       },
       {
-        "Type": "text/css",
-        "String": "text/css+css",
-        "MainType": "text",
-        "SubType": "css",
-        "Suffix": "css",
-        "Delimiter": "."
+        "type": "text/css",
+        "string": "text/css+css",
+        "mainType": "text",
+        "subType": "css",
+        "suffix": "css",
+        "delimiter": "."
       },
       {
-        "Type": "text/csv",
-        "String": "text/csv+csv",
-        "MainType": "text",
-        "SubType": "csv",
-        "Suffix": "csv",
-        "Delimiter": "."
+        "type": "text/csv",
+        "string": "text/csv+csv",
+        "mainType": "text",
+        "subType": "csv",
+        "suffix": "csv",
+        "delimiter": "."
       },
       {
-        "Type": "text/html",
-        "String": "text/html+html",
-        "MainType": "text",
-        "SubType": "html",
-        "Suffix": "html",
-        "Delimiter": "."
+        "type": "text/html",
+        "string": "text/html+html",
+        "mainType": "text",
+        "subType": "html",
+        "suffix": "html",
+        "delimiter": "."
       },
       {
-        "Type": "text/plain",
-        "String": "text/plain+txt",
-        "MainType": "text",
-        "SubType": "plain",
-        "Suffix": "txt",
-        "Delimiter": "."
+        "type": "text/plain",
+        "string": "text/plain+txt",
+        "mainType": "text",
+        "subType": "plain",
+        "suffix": "txt",
+        "delimiter": "."
       }
     ]
   },
@@ -79,87 +79,143 @@
     "formats": [
       {
         "MediaType": "text/html+html",
-        "Name": "AMP",
-        "Path": "amp",
-        "BaseName": "index",
-        "Rel": "amphtml",
-        "Protocol": "",
-        "IsPlainText": false,
-        "IsHTML": true,
-        "NoUgly": false,
-        "NotAlternative": false
+        "name": "AMP",
+        "mediaType": {
+          "type": "text/html",
+          "string": "text/html+html",
+          "mainType": "text",
+          "subType": "html",
+          "suffix": "html",
+          "delimiter": "."
+        },
+        "path": "amp",
+        "baseName": "index",
+        "rel": "amphtml",
+        "protocol": "",
+        "isPlainText": false,
+        "isHTML": true,
+        "noUgly": false,
+        "notAlternative": false
       },
       {
         "MediaType": "text/css+css",
-        "Name": "CSS",
-        "Path": "",
-        "BaseName": "styles",
-        "Rel": "stylesheet",
-        "Protocol": "",
-        "IsPlainText": true,
-        "IsHTML": false,
-        "NoUgly": false,
-        "NotAlternative": true
+        "name": "CSS",
+        "mediaType": {
+          "type": "text/css",
+          "string": "text/css+css",
+          "mainType": "text",
+          "subType": "css",
+          "suffix": "css",
+          "delimiter": "."
+        },
+        "path": "",
+        "baseName": "styles",
+        "rel": "stylesheet",
+        "protocol": "",
+        "isPlainText": true,
+        "isHTML": false,
+        "noUgly": false,
+        "notAlternative": true
       },
       {
         "MediaType": "text/csv+csv",
-        "Name": "CSV",
-        "Path": "",
-        "BaseName": "index",
-        "Rel": "alternate",
-        "Protocol": "",
-        "IsPlainText": true,
-        "IsHTML": false,
-        "NoUgly": false,
-        "NotAlternative": false
+        "name": "CSV",
+        "mediaType": {
+          "type": "text/csv",
+          "string": "text/csv+csv",
+          "mainType": "text",
+          "subType": "csv",
+          "suffix": "csv",
+          "delimiter": "."
+        },
+        "path": "",
+        "baseName": "index",
+        "rel": "alternate",
+        "protocol": "",
+        "isPlainText": true,
+        "isHTML": false,
+        "noUgly": false,
+        "notAlternative": false
       },
       {
         "MediaType": "text/calendar+ics",
-        "Name": "Calendar",
-        "Path": "",
-        "BaseName": "index",
-        "Rel": "alternate",
-        "Protocol": "webcal://",
-        "IsPlainText": true,
-        "IsHTML": false,
-        "NoUgly": false,
-        "NotAlternative": false
+        "name": "Calendar",
+        "mediaType": {
+          "type": "text/calendar",
+          "string": "text/calendar+ics",
+          "mainType": "text",
+          "subType": "calendar",
+          "suffix": "ics",
+          "delimiter": "."
+        },
+        "path": "",
+        "baseName": "index",
+        "rel": "alternate",
+        "protocol": "webcal://",
+        "isPlainText": true,
+        "isHTML": false,
+        "noUgly": false,
+        "notAlternative": false
       },
       {
         "MediaType": "text/html+html",
-        "Name": "HTML",
-        "Path": "",
-        "BaseName": "index",
-        "Rel": "canonical",
-        "Protocol": "",
-        "IsPlainText": false,
-        "IsHTML": true,
-        "NoUgly": false,
-        "NotAlternative": false
+        "name": "HTML",
+        "mediaType": {
+          "type": "text/html",
+          "string": "text/html+html",
+          "mainType": "text",
+          "subType": "html",
+          "suffix": "html",
+          "delimiter": "."
+        },
+        "path": "",
+        "baseName": "index",
+        "rel": "canonical",
+        "protocol": "",
+        "isPlainText": false,
+        "isHTML": true,
+        "noUgly": false,
+        "notAlternative": false
       },
       {
         "MediaType": "application/json+json",
-        "Name": "JSON",
-        "Path": "",
-        "BaseName": "index",
-        "Rel": "alternate",
-        "Protocol": "",
-        "IsPlainText": true,
-        "IsHTML": false,
-        "NoUgly": false,
-        "NotAlternative": false
+        "name": "JSON",
+        "mediaType": {
+          "type": "application/json",
+          "string": "application/json+json",
+          "mainType": "application",
+          "subType": "json",
+          "suffix": "json",
+          "delimiter": "."
+        },
+        "path": "",
+        "baseName": "index",
+        "rel": "alternate",
+        "protocol": "",
+        "isPlainText": true,
+        "isHTML": false,
+        "noUgly": false,
+        "notAlternative": false
       },
       {
         "MediaType": "application/rss+xml",
-        "Name": "RSS",
-        "Path": "",
-        "BaseName": "index",
-        "Rel": "alternate",
-        "Protocol": "",
-        "IsPlainText": false,
-        "IsHTML": false,
-        "NoUgly": true,
-        "NotAlternative": false
+        "name": "RSS",
+        "mediaType": {
+          "type": "application/rss",
+          "string": "application/rss+xml",
+          "mainType": "application",
+          "subType": "rss",
+          "suffix": "xml",
+          "delimiter": "."
+        },
+        "path": "",
+        "baseName": "index",
+        "rel": "alternate",
+        "protocol": "",
+        "isPlainText": false,
+        "isHTML": false,
+        "noUgly": true,
+        "notAlternative": false
       }
     ],
     "layouts": [