Merge commit 'd276e901b36d2576ef8350ed96b17f66254eac1b'
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 26 Mar 2022 09:04:57 +0000 (11:04 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 26 Mar 2022 09:04:57 +0000 (11:04 +0200)
28 files changed:
1  2 
docs/.cspell.json
docs/content/en/about/security-model/index.md
docs/content/en/content-management/diagrams.md
docs/content/en/content-management/formats.md
docs/content/en/content-management/image-processing/index.md
docs/content/en/content-management/related.md
docs/content/en/content-management/urls.md
docs/content/en/contribute/development.md
docs/content/en/functions/anchorize.md
docs/content/en/functions/append.md
docs/content/en/functions/apply.md
docs/content/en/functions/group.md
docs/content/en/functions/hugo.md
docs/content/en/functions/relurl.md
docs/content/en/functions/strings.Count.md
docs/content/en/getting-started/configuration-markup.md
docs/content/en/getting-started/configuration.md
docs/content/en/getting-started/installing.md
docs/content/en/hosting-and-deployment/deployment-with-rsync.md
docs/content/en/showcase/over/index.md
docs/content/en/templates/lists.md
docs/content/en/templates/partials.md
docs/content/en/templates/render-hooks.md
docs/content/en/templates/template-debugging.md
docs/content/en/variables/shortcodes.md
docs/layouts/maintenance/list.html
docs/layouts/shortcodes/imgproc.html
docs/netlify.toml

index 70811e5156d35058bf681153cba057f079a164d4,0000000000000000000000000000000000000000..2cac73c022e157dd85e931bd8fd429bd5c322aa4
mode 100644,000000..100644
--- /dev/null
@@@ -1,155 -1,0 +1,276 @@@
 +{
 +  "version": "0.2",
 +  "words": [
++    "aaabaab",
 +    "aabb",
 +    "aabba",
 +    "aabbaa",
 +    "aabbaabb",
 +    "abourget",
++    "absurl",
 +    "adoc",
 +    "algolia",
++    "allowfullscreen",
++    "ananke",
 +    "anchorize",
 +    "anthonyfok",
 +    "asciidoctor",
 +    "attrlink",
++    "azblob",
++    "baseof",
++    "beevelop",
++    "bibtex",
 +    "Bjørn",
 +    "blackfriday",
 +    "blogue",
 +    "bogem",
++    "Bootcamp",
++    "brlink",
 +    "Brotli",
++    "Browsersync",
 +    "canonify",
++    "Catmull",
 +    "Catwoman",
 +    "Cheatsheet",
++    "choco",
 +    "chromastyles",
 +    "clockoon",
 +    "Cloudinary",
 +    "CNAME",
 +    "Codecademy's",
 +    "CODEOWNERS",
++    "Coen",
 +    "Commento",
 +    "Cond",
 +    "Contentful",
++    "copyrighthtml",
++    "corejs",
 +    "countrunes",
 +    "countwords",
 +    "crossreferences",
++    "datatable",
++    "DATOCMS",
++    "debugconfig",
++    "DELIM",
++    "dhersam",
 +    "digitalcraftsman",
 +    "Disqus",
++    "Dmdh",
++    "doas",
 +    "dokuwiki",
++    "dpkg",
 +    "DRING",
 +    "Emojify",
 +    "Enwrite",
++    "eopkg",
 +    "eparis",
 +    "errorf",
++    "erroridf",
++    "Evernote",
++    "exitwp",
++    "Feminella",
 +    "firstpost",
++    "Formspree",
++    "fpath",
 +    "Francia",
 +    "freenode",
++    "frontmatter",
 +    "funcs",
 +    "funcsig",
 +    "Garen",
++    "gcloud",
 +    "Getenv",
++    "getjson",
++    "getpage",
++    "Gmfc",
++    "Goel",
 +    "Gohugo",
 +    "gohugoio",
 +    "goldenbridge",
 +    "Goldmark",
 +    "gomodules",
 +    "GOPATH",
 +    "govendor",
 +    "Gowans",
 +    "Grayscale",
 +    "Gruber",
 +    "gtag",
++    "hidecaption",
 +    "Hokus",
++    "hola",
++    "hügó",
++    "hugodeps",
 +    "hugodoc",
++    "Hugofy",
 +    "hugolang",
 +    "hugoversion",
++    "Hyas",
 +    "Hyvor",
 +    "iframes",
++    "ifttt",
++    "iife",
 +    "imgproc",
++    "importr",
++    "IMWQ",
 +    "indice",
++    "innershortcode",
 +    "Intelli",
 +    "interdoc",
 +    "IPTC",
++    "ismenucurrent",
 +    "Isset",
 +    "Isso",
++    "Jaco",
++    "johnpatitucci",
 +    "Joomla",
++    "JRBR",
 +    "jsonify",
 +    "katex",
++    "keycdn",
++    "KEYVALS",
 +    "kubernetes",
++    "Lanczos",
++    "langformatnumber",
 +    "lastmod",
++    "libwebp",
 +    "linktitle",
++    "Lipi",
++    "lrwxr",
++    "maingo",
 +    "markdownified",
 +    "markdownify",
 +    "mathjax",
++    "mdhender",
++    "mdshortcode",
 +    "mercredi",
 +    "Mittwoch",
++    "mkdir",
 +    "mmark",
 +    "monokai",
 +    "Morling",
++    "mspowerpoint",
++    "Multihost",
 +    "Muut",
++    "myclass",
++    "mydeployment",
++    "myindex",
++    "mylayout",
++    "mypage",
 +    "mypartials",
 +    "mypost",
++    "mysite",
++    "myspa",
++    "mystyle",
++    "mytheme",
++    "NDJSON",
 +    "needsexample",
++    "Netravali",
++    "newparam",
++    "Nikhil",
++    "Njjy",
++    "nlist",
 +    "nobr",
 +    "nocopy",
 +    "Norsk",
++    "nosniff",
++    "NOSQL",
++    "notoc",
 +    "novembre",
++    "NUMWORKERMULTIPLIER",
++    "Obhu",
++    "octohug",
 +    "Octopress",
++    "oldparam",
++    "onrender",
 +    "opengraph",
 +    "OWASP",
 +    "Pandoc",
++    "partialcached",
++    "Pastorius",
++    "Patitucci",
++    "PCRE",
 +    "peaceiris",
 +    "Pedersen",
++    "permalinkable",
 +    "plainify",
++    "POSIX",
++    "postprocess",
 +    "println",
 +    "publishdate",
 +    "Pygments",
 +    "querify",
++    "QVOMC",
++    "rdwatters",
 +    "readfile",
++    "rebinded",
 +    "REDIR",
 +    "reftext",
 +    "relatedfuncs",
 +    "relref",
++    "relurl",
 +    "remarkjs",
 +    "rgba",
 +    "rlimit",
++    "roboto",
++    "rssxml",
++    "rwxrwxrwx",
++    "safehtml",
 +    "safejs",
 +    "Samsa",
++    "Shekhar",
 +    "Shortcode",
 +    "Shortcodes",
 +    "Sindre",
++    "sitemapindex",
++    "sitemapxml",
 +    "Smartcrop",
++    "Sprintf",
++    "Startseite",
++    "strconv",
++    "stringifier",
 +    "struct",
++    "structs",
++    "subdir",
 +    "Talkyard",
 +    "taxo",
 +    "tbody",
 +    "tdewolff",
 +    "testshortcodes",
 +    "thead",
 +    "Thinkful",
++    "TLDR",
 +    "TMPDIR",
 +    "tojson",
 +    "Torikian",
 +    "totoml",
 +    "toyaml",
++    "twitteruser",
++    "Unmarshal",
 +    "Unmarshal",
 +    "urlize",
++    "urlset",
 +    "vimrc",
 +    "wanghc",
 +    "Wappalyzer",
 +    "warnf",
 +    "webp",
++    "Wercker",
 +    "wibble",
++    "wordcount",
 +    "workson",
++    "xvzf",
++    "yoyoyo",
++    "Zgotmpl",
 +    "zzbbaabb"
 +  ],
 +  "language": "en,en-GB,en-US,de,fr",
 +  "files": [
 +    "**/*.md"
 +  ],
 +  "ignorePaths": [
 +    ".cspell.json",
 +    "**/node_modules/**",
 +    "*.min.*"
 +  ],
 +  "useGitignore": true
 +}
index c7e9d35c67891690cd36352fa85796018cd9b42e,0000000000000000000000000000000000000000..461c7fe7782ba4cdf1707b9e36a75798fc1fc2e9
mode 100644,000000..100644
--- /dev/null
@@@ -1,69 -1,0 +1,69 @@@
- HUGO_SECURITY_HTTP_URLS=none hugo 
 +---
 +title: Hugo's Security Model
 +description: A summary of Hugo's security model.
 +date: 2019-10-01
 +layout: single
 +keywords: ["Security", "Privacy"]
 +menu:
 +  docs:
 +    parent: "about"
 +    weight: 4
 +weight: 5
 +sections_weight: 5
 +draft: false
 +aliases: [/security/]
 +toc: true
 +---
 +
 +## Runtime Security
 +
 +Hugo produces static output, so once built, the runtime is the browser (assuming the output is HTML) and any server (API) that you integrate with.
 +
 +But when developing and building your site, the runtime is the `hugo` executable. Securing a runtime can be [a real challenge](https://blog.logrocket.com/how-to-protect-your-node-js-applications-from-malicious-dependencies-5f2e60ea08f9/).
 +
 +**Hugo's main approach is that of sandboxing and a security policy with strict defaults:**
 +
 +* Hugo has a virtual file system and only the main project (not third-party components) is allowed to mount directories or files outside the project root.
 +* Only the main project can walk symbolic links.
 +* User-defined components have read-only access to the filesystem.
 +* We shell out to some external binaries to support [Asciidoctor](/content-management/formats/#list-of-content-formats) and similar, but those binaries and their flags are predefined and disabled by default (see [Security Policy](#security-policy)). General functions to run arbitrary external OS commands have been [discussed](https://github.com/gohugoio/hugo/issues/796), but not implemented because of security concerns.
 +
 +
 +## Security Policy
 +
 +{{< new-in "0.91.0" >}}
 +
 +Hugo has a built-in security policy that restricts access to [os/exec](https://pkg.go.dev/os/exec), remote communication and similar.
 +
 +The default configuration is listed below. Any build using features not in the allow list of the security policy will fail with a detailed message about what needs to be done. Most of these settings are allow lists (string or slice, [Regular Expressions](https://pkg.go.dev/regexp) or `none` which matches nothing).
 +
 +{{< code-toggle config="security" />}}
 +
 +Note that these and other config settings in Hugo can be overridden by the OS environment. If you want to block all remote HTTP fetching of data:
 +
 +```
++HUGO_SECURITY_HTTP_URLS=none hugo
 +```
 +
 +## Dependency Security
 +
 +Hugo is built as a static binary using [Go Modules](https://github.com/golang/go/wiki/Modules) to manage its dependencies. Go Modules have several safeguards, one of them being the `go.sum` file. This is a database of the expected cryptographic checksums of all of your dependencies, including transitive dependencies.
 +
 +[Hugo Modules](/hugo-modules/) is a feature built on top of the functionality of Go Modules. Like Go Modules, a Hugo project using Hugo Modules will have a `go.sum` file. We recommend that you commit this file to your version control system. The Hugo build will fail if there is a checksum mismatch, which would be an indication of [dependency tampering](https://julienrenaux.fr/2019/12/20/github-actions-security-risk/).
 +
 +## Web Application Security
 +
 +These are the security threats as defined by [OWASP](https://en.wikipedia.org/wiki/OWASP).
 +
 +For HTML output, this is the core security model:
 +
 +https://golang.org/pkg/html/template/#hdr-Security_Model
 +
 +In short:
 +
 +Templates authors (you) are trusted, but the data you send in is not.
 +This is why you sometimes need to use the _safe_ functions, such as `safeHTML`, to avoid escaping of data you know is safe.
 +There is one exception to the above, as noted in the documentation: If you enable inline shortcodes, you also say that the shortcodes and data handling in content files are trusted, as those macros are treated as pure text.
 +It may be worth adding that Hugo is a static site generator with no concept of dynamic user input.
 +
 +For content, the default Markdown renderer is [configured](/getting-started/configuration-markup) to remove or escape potentially unsafe content. This behavior can be reconfigured if you trust your content.
index cfc0b3644acef9a1490fc03afb412b7493b81ecf,0000000000000000000000000000000000000000..243a70fd4f0f7b2d0420f5485794339266797a90
mode 100644,000000..100644
--- /dev/null
@@@ -1,277 -1,0 +1,277 @@@
- Hugo supports [GoAT](https://github.com/bep/goat) natively. This means that this code block:
 +---
 +title: Diagrams
 +date: 2022-02-20
 +categories: [content management]
 +keywords: [diagrams,drawing]
 +menu:
 +  docs:
 +    parent: "content-management"
 +    weight: 22
 +weight: 22
 +toc: true
 +---
 +
 +
 +{{< new-in "0.93.0" >}}
 +
 +
 +## GoAT Diagrams (Ascii)
 +
++Hugo! supports [GoAT](https://github.com/bep/goat) natively. This means that this code block:
 +
 +````
 +```goat
 +      .               .                .               .--- 1          .-- 1     / 1
 +     / \              |                |           .---+            .-+         +
 +    /   \         .---+---.         .--+--.        |   '--- 2      |   '-- 2   / \ 2
 +   +     +        |       |        |       |    ---+            ---+          +
 +  / \   / \     .-+-.   .-+-.     .+.     .+.      |   .--- 3      |   .-- 3   \ / 3
 + /   \ /   \    |   |   |   |    |   |   |   |     '---+            '-+         +
 + 1   2 3   4    1   2   3   4    1   2   3   4         '--- 4          '-- 4     \ 4
 +
 +```
 +````
 +
 +Will be rendered as:
 +
 +```goat
 +
 +          .               .                .               .--- 1          .-- 1     / 1
 +         / \              |                |           .---+            .-+         +
 +        /   \         .---+---.         .--+--.        |   '--- 2      |   '-- 2   / \ 2
 +       +     +        |       |        |       |    ---+            ---+          +
 +      / \   / \     .-+-.   .-+-.     .+.     .+.      |   .--- 3      |   .-- 3   \ / 3
 +     /   \ /   \    |   |   |   |    |   |   |   |     '---+            '-+         +
 +     1   2 3   4    1   2   3   4    1   2   3   4         '--- 4          '-- 4     \ 4
 +```
 +
 +
 +
 +
 +
 +## Mermaid Diagrams
 +
 +Hugo currently does not provide default templates for Mermaid diagrams. But you can easily add your own. One way to do it would be to create ` layouts/_default/_markup/render-codeblock-mermaid.html`:
 +
 +
 +```go-html-template
 +<div class="mermaid">
 +  {{- .Inner | safeHTML }}
 +</div>
 +{{ .Page.Store.Set "hasMermaid" true }}
 +```
 +
 +And then include this snippet at the bottom of the content template (below `.Content`):
 +
 +```go-html-template
 +{{ if .Page.Store.Get "hasMermaid" }}
 +  <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
 +  <script>
 +    mermaid.initialize({ startOnLoad: true });
 +  </script>
 +{{ end }}
 +```
 +
 +With that you can use the `mermaid` language in Markdown code blocks:
 +
 +```mermaid
 +sequenceDiagram
 +    participant Alice
 +    participant Bob
 +    Alice->>John: Hello John, how are you?
 +    loop Healthcheck
 +        John->>John: Fight against hypochondria
 +    end
 +    Note right of John: Rational thoughts <br/>prevail!
 +    John-->>Alice: Great!
 +    John->>Bob: How about you?
 +    Bob-->>John: Jolly good!
 +```
 +
 +
 +
 +## Goat Ascii Diagram Examples
 +
 +### Graphics
 +
 +```goat
 +                                                                             .
 +    0       3                          P *              Eye /         ^     /
 +     *-------*      +y                    \                +)          \   /  Reflection
 +  1 /|    2 /|       ^                     \                \           \ v
 +   *-------* |       |                v0    \       v3           --------*--------
 +   | |4    | |7      |                  *----\-----*
 +   | *-----|-*       +-----> +x        /      v X   \          .-.<--------        o
 +   |/      |/       /                 /        o     \        | / | Refraction    / \
 +   *-------*       v                 /                \        +-'               /   \
 +  5       6      +z              v1 *------------------* v2    |                o-----o
 +                                                               v
 +
 +```
 +
 +### Complex
 +
 +```goat
 ++-------------------+                           ^                      .---.
 +|    A Box          |__.--.__    __.-->         |      .-.             |   |
 +|                   |        '--'               v     | * |<---        |   |
 ++-------------------+                                  '-'             |   |
 +                       Round                                       *---(-. |
 +  .-----------------.  .-------.    .----------.         .-------.     | | |
 + |   Mixed Rounded  | |         |  / Diagonals  \        |   |   |     | | |
 + | & Square Corners |  '--. .--'  /              \       |---+---|     '-)-'       .--------.
 + '--+------------+-'  .--. |     '-------+--------'      |   |   |       |        / Search /
 +    |            |   |    | '---.        |               '-------'       |       '-+------'
 +    |<---------->|   |    |      |       v                Interior                 |     ^
 +    '           <---'      '----'   .-----------.              ---.     .---       v     |
 + .------------------.  Diag line    | .-------. +---.              \   /           .     |
 + |   if (a > b)     +---.      .--->| |       | |    | Curved line  \ /           / \    |
 + |   obj->fcn()     |    \    /     | '-------' |<--'                +           /   \   |
 + '------------------'     '--'      '--+--------'      .--. .--.     |  .-.     +Done?+-'
 +    .---+-----.                        |   ^           |\ | | /|  .--+ |   |     \   /
 +    |   |     | Join        \|/        |   | Curved    | \| |/ | |    \    |      \ /
 +    |   |     +---->  o    --o--        '-'  Vertical  '--' '--'  '--  '--'        +  .---.
 + <--+---+-----'       |     /|\                                                    |  | 3 |
 +                      v                             not:line    'quotes'        .-'   '---'
 +  .-.             .---+--------.            /            A || B   *bold*       |        ^
 + |   |           |   Not a dot  |      <---+---<--    A dash--is not a line    v        |
 +  '-'             '---------+--'          /           Nor/is this.            ---
 +
 +```
 +
 +### Process
 +
 +```goat
 +                                      .
 +   .---------.                       / \
 +  |   START   |                     /   \        .-+-------+-.      ___________
 +   '----+----'    .-------.    A   /     \   B   | |COMPLEX| |     /           \      .-.
 +        |        |   END   |<-----+CHOICE +----->| |       | +--->+ PREPARATION +--->| X |
 +        v         '-------'        \     /       | |PROCESS| |     \___________/      '-'
 +    .---------.                     \   /        '-+---+---+-'
 +   /  INPUT  /                       \ /
 +  '-----+---'                         '
 +        |                             ^
 +        v                             |
 +  .-----------.                 .-----+-----.        .-.
 +  |  PROCESS  +---------------->|  PROCESS  |<------+ X |
 +  '-----------'                 '-----------'        '-'
 +```
 +
 +### File tree
 +
 +Created from https://arthursonzogni.com/Diagon/#Tree
 +
 +```goat  { width=300  color="orange" }
 +───Linux─┬─Android
 +         ├─Debian─┬─Ubuntu─┬─Lubuntu
 +         │        │        ├─Kubuntu
 +         │        │        ├─Xubuntu
 +         │        │        └─Xubuntu
 +         │        └─Mint
 +         ├─Centos
 +         └─Fedora
 +```
 +
 +
 +### Sequence Diagram
 +
 +https://arthursonzogni.com/Diagon/#Sequence
 +
 +```goat { class="w-40" }
 +┌─────┐       ┌───┐
 +│Alice│       │Bob│
 +└──┬──┘       └─┬─┘
 +   │            │  
 +   │ Hello Bob! │  
 +   │───────────>│  
 +   │            │  
 +   │Hello Alice!│  
 +   │<───────────│  
 +┌──┴──┐       ┌─┴─┐
 +│Alice│       │Bob│
 +└─────┘       └───┘
 +
 +```
 +
 +
 +### Flowchart
 +
 +https://arthursonzogni.com/Diagon/#Flowchart
 +
 +```goat
 +   _________________                                                              
 +  ╱                 ╲                                                     ┌─────┐ 
 + ╱ DO YOU UNDERSTAND ╲____________________________________________________│GOOD!│ 
 + ╲ FLOW CHARTS?      ╱yes                                                 └──┬──┘ 
 +  ╲_________________╱                                                        │    
 +           │no                                                               │    
 +  _________▽_________                    ______________________              │    
 + ╱                   ╲                  ╱                      ╲    ┌────┐   │    
 +╱ OKAY, YOU SEE THE   ╲________________╱ ... AND YOU CAN SEE    ╲___│GOOD│   │    
 +╲ LINE LABELED 'YES'? ╱yes             ╲ THE ONES LABELED 'NO'? ╱yes└──┬─┘   │    
 + ╲___________________╱                  ╲______________________╱       │     │    
 +           │no                                     │no                 │     │    
 +   ________▽_________                     _________▽__________         │     │    
 +  ╱                  ╲    ┌───────────┐  ╱                    ╲        │     │    
 + ╱ BUT YOU SEE THE    ╲___│WAIT, WHAT?│ ╱ BUT YOU JUST         ╲___    │     │    
 + ╲ ONES LABELED 'NO'? ╱yes└───────────┘ ╲ FOLLOWED THEM TWICE? ╱yes│   │     │    
 +  ╲__________________╱                   ╲____________________╱    │   │     │    
 +           │no                                     │no             │   │     │    
 +       ┌───▽───┐                                   │               │   │     │    
 +       │LISTEN.│                                   └───────┬───────┘   │     │    
 +       └───┬───┘                                    ┌──────▽─────┐     │     │    
 +     ┌─────▽────┐                                   │(THAT WASN'T│     │     │    
 +     │I HATE YOU│                                   │A QUESTION) │     │     │    
 +     └──────────┘                                   └──────┬─────┘     │     │    
 +                                                      ┌────▽───┐       │     │    
 +                                                      │SCREW IT│       │     │    
 +                                                      └────┬───┘       │     │    
 +                                                           └─────┬─────┘     │    
 +                                                                 │           │    
 +                                                                 └─────┬─────┘    
 +                                                               ┌───────▽──────┐   
 +                                                               │LET'S GO DRING│   
 +                                                               └───────┬──────┘   
 +                                                             ┌─────────▽─────────┐
 +                                                             │HEY, I SHOULD TRY  │
 +                                                             │INSTALLING FREEBSD!│
 +                                                             └───────────────────┘
 +
 +```
 +
 +
 +### Table
 +
 +https://arthursonzogni.com/Diagon/#Table
 +
 +```goat { class="w-80 dark-blue" }
 +┌────────────────────────────────────────────────┐
 +│                                                │
 +├────────────────────────────────────────────────┤
 +│SYNTAX     = { PRODUCTION } .                   │
 +├────────────────────────────────────────────────┤
 +│PRODUCTION = IDENTIFIER "=" EXPRESSION "." .    │
 +├────────────────────────────────────────────────┤
 +│EXPRESSION = TERM { "|" TERM } .                │
 +├────────────────────────────────────────────────┤
 +│TERM       = FACTOR { FACTOR } .                │
 +├────────────────────────────────────────────────┤
 +│FACTOR     = IDENTIFIER                         │
 +├────────────────────────────────────────────────┤
 +│          | LITERAL                             │
 +├────────────────────────────────────────────────┤
 +│          | "[" EXPRESSION "]"                  │
 +├────────────────────────────────────────────────┤
 +│          | "(" EXPRESSION ")"                  │
 +├────────────────────────────────────────────────┤
 +│          | "{" EXPRESSION "}" .                │
 +├────────────────────────────────────────────────┤
 +│IDENTIFIER = letter { letter } .                │
 +├────────────────────────────────────────────────┤
 +│LITERAL    = """" character { character } """" .│
 +└────────────────────────────────────────────────┘
 +```
 +
 +
 +
index 1ae20ba583368db0e8845caf0ecd523498e6417a,0000000000000000000000000000000000000000..3c3edfdd496a3d6e60f9cc8160795ff56af9ad16
mode 100644,000000..100644
--- /dev/null
@@@ -1,157 -1,0 +1,154 @@@
- lastmod: 2017-04-06
 +---
 +title: Content Formats
 +linktitle: Content Formats
 +description: Both HTML and Markdown are supported content formats.
 +date: 2017-01-10
 +publishdate: 2017-01-10
- | Name  | Markup identifiers | Comment | 
 +categories: [content management]
 +keywords: [markdown,asciidoc,mmark,pandoc,content format]
 +menu:
 +  docs:
 +    parent: "content-management"
 +    weight: 20
 +weight: 20    #rem
 +draft: false
 +aliases: [/content/markdown-extras/,/content/supported-formats/,/doc/supported-formats/]
 +toc: true
 +---
 +
 +You can put any file type into your `/content` directories, but Hugo uses the `markup` front matter value if set or the file extension (see `Markup identifiers` in the table below) to determine if the markup needs to be processed, e.g.:
 +
 +* Markdown converted to HTML
 +* [Shortcodes](/content-management/shortcodes/) processed
 +* Layout applied
 +
 +## List of content formats
 +
 +The current list of content formats in Hugo:
 +
- |RST|rst|Needs [RST](http://docutils.sourceforge.net/rst.html) installed.|
++| Name  | Markup identifiers | Comment |
 +| ------------- | ------------- |-------------|
 +| Goldmark  | md, markdown, goldmark  |Note that you can set the default handler of `md` and `markdown` to something else, see [Configure Markup](/getting-started/configuration-markup/).{{< new-in "0.60.0" >}} |
 +| Blackfriday | blackfriday  |Blackfriday will eventually be deprecated.|
 +|MMark|mmark|Mmark is deprecated and will be removed in a future release.|
 +|Emacs Org-Mode|org|See [go-org](https://github.com/niklasfasching/go-org).|
 +|AsciiDoc|asciidocext, adoc, ad|Needs [Asciidoctor][ascii] installed.|
++|RST|rst|Needs [RST](https://docutils.sourceforge.net/rst.html) installed.|
 +|Pandoc|pandoc, pdc|Needs [Pandoc](https://www.pandoc.org/) installed.|
 +|HTML|html, htm|To be treated as a content file, with layout, shortcodes etc., it must have front matter. If not, it will be copied as-is.|
 +
 +The `markup identifier` is fetched from either the `markup` variable in front matter or from the file extension. For markup-related configuration, see [Configure Markup](/getting-started/configuration-markup/).
 +
- [mmark]: https://github.com/mmarkdown/mmark
 +## External Helpers
 +
 +Some of the formats in the table above need external helpers installed on your PC. For example, for AsciiDoc files,
 +Hugo will try to call the `asciidoctor` command. This means that you will have to install the associated
 +tool on your machine to be able to use these formats.
 +
 +Hugo passes reasonable default arguments to these external helpers by default:
 +
 +- `asciidoctor`: `--no-header-footer -`
 +- `rst2html`: `--leave-comments --initial-header-level=2`
 +- `pandoc`: `--mathjax`
 +
 +{{% warning "Performance of External Helpers" %}}
 +Because additional formats are external commands, generation performance will rely heavily on the performance of the external tool you are using. As this feature is still in its infancy, feedback is welcome.
 +{{% /warning %}}
 +
 +### External Helper AsciiDoc
 +
 +[AsciiDoc](https://github.com/asciidoc/asciidoc) implementation EOLs in Jan 2020 and is no longer supported. 
 +AsciiDoc development is being continued under [Asciidoctor](https://github.com/asciidoctor). The format AsciiDoc 
 +remains of course. Please continue with the implementation Asciidoctor.
 +
 +### External Helper Asciidoctor
 +
 +The Asciidoctor community offers a wide set of tools for the AsciiDoc format that can be installed additionally to Hugo. 
 +[See the Asciidoctor docs for installation instructions](https://asciidoctor.org/docs/install-toolchain/). Make sure that also all
 +optional extensions like `asciidoctor-diagram` or `asciidoctor-html5s` are installed if required.
 +
 +{{% note %}}
 +External `asciidoctor` command requires Hugo rendering to _disk_ to a specific destination directory. It is required to run Hugo with the command option `--destination`.
 +{{% /note %}}
 +
 +Some [Asciidoctor](https://asciidoctor.org/man/asciidoctor/) parameters can be customized in Hugo:
 +
 +Parameter | Comment
 +--- | ---
 +backend | Don't change this unless you know what you are doing.
 +doctype | Currently, the only document type supported in Hugo is `article`.
 +extensions | Possible extensions are `asciidoctor-html5s`, `asciidoctor-bibtex`, `asciidoctor-diagram`, `asciidoctor-interdoc-reftext`, `asciidoctor-katex`, `asciidoctor-latex`, `asciidoctor-mathematical`, `asciidoctor-question`, `asciidoctor-rouge`.
 +attributes | Variables to be referenced in your AsciiDoc file. This is a list of variable name/value maps. See [Asciidoctor's attributes](https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/#attributes-and-substitutions).
 +noHeaderOrFooter | Output an embeddable document, which excludes the header, the footer, and everything outside the body of the document. Don't change this unless you know what you are doing.
 +safeMode | Safe mode level `unsafe`, `safe`, `server` or `secure`. Don't change this unless you know what you are doing.
 +sectionNumbers | Auto-number section titles.
 +verbose | Verbosely print processing information and configuration file checks to stderr.
 +trace | Include backtrace information on errors.
 +failureLevel | The minimum logging level that triggers a non-zero exit code (failure).
 +
 +Hugo provides additional settings that don't map directly to Asciidoctor's CLI options:
 +
 +workingFolderCurrent
 +: Sets the working directory to be the same as that of the AsciiDoc file being processed, so that [include](https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/#include-files) will work with relative paths. This setting uses the `asciidoctor` cli parameter `--base-dir` and attribute `outdir=`. For rendering diagrams with [asciidoctor-diagram](https://asciidoctor.org/docs/asciidoctor-diagram/), `workingFolderCurrent` must be set to `true`.
 +
 +preserveTOC
 +: By default, Hugo removes the table of contents generated by Asciidoctor and provides it through the built-in variable [`.TableOfContents`](/content-management/toc/) to enable further customization and better integration with the various Hugo themes. This option can be set to `true` to preserve Asciidoctor's TOC in the generated page.
 +
 +Below are all the AsciiDoc related settings in Hugo with their default values:
 +
 +{{< code-toggle config="markup.asciidocExt" />}}
 +
 +Notice that for security concerns only extensions that do not have path separators (either `\`, `/` or `.`) are allowed. That means that extensions can only be invoked if they are in one's ruby's `$LOAD_PATH` (ie. most likely, the extension has been installed by the user). Any extension declared relative to the website's path will not be accepted.
 +
 +Example of how to set extensions and attributes:
 +
 +```
 +[markup.asciidocExt]
 +    extensions = ["asciidoctor-html5s", "asciidoctor-diagram"]
 +    workingFolderCurrent = true
 +    [markup.asciidocExt.attributes]
 +        my-base-url = "https://example.com/"
 +        my-attribute-name = "my value"
 +```
 +
 +In a complex Asciidoctor environment it is sometimes helpful to debug the exact call to your external helper with all 
 +parameters. Run Hugo with `-v`. You will get an output like
 +
 +```
 +INFO 2019/12/22 09:08:48 Rendering book-as-pdf.adoc with C:\Ruby26-x64\bin\asciidoctor.bat using asciidoc args [--no-header-footer -r asciidoctor-html5s -b html5s -r asciidoctor-diagram --base-dir D:\prototypes\hugo_asciidoc_ddd\docs -a outdir=D:\prototypes\hugo_asciidoc_ddd\build -] ...
 +```
 +
 +## Learn Markdown
 +
 +Markdown syntax is simple enough to learn in a single sitting. The following are excellent resources to get you up and running:
 +
 +* [Daring Fireball: Markdown, John Gruber (Creator of Markdown)][fireball]
 +* [Markdown Cheatsheet, Adam Pritchard][mdcheatsheet]
 +* [Markdown Tutorial (Interactive), Garen Torikian][mdtutorial]
 +* [The Markdown Guide, Matt Cone][mdguide]
 +
 +[`emojify` function]: /functions/emojify/
 +[ascii]: https://asciidoctor.org/
 +[bfconfig]: /getting-started/configuration/#configuring-blackfriday-rendering
 +[blackfriday]: https://github.com/russross/blackfriday
 +[mmark]: https://github.com/miekg/mmark
 +[config]: /getting-started/configuration/
 +[developer tools]: /tools/
 +[emojis]: https://www.webpagefx.com/tools/emoji-cheat-sheet/
 +[fireball]: https://daringfireball.net/projects/markdown/
 +[gfmtasks]: https://guides.github.com/features/mastering-markdown/#syntax
 +[helperssource]: https://github.com/gohugoio/hugo/blob/77c60a3440806067109347d04eb5368b65ea0fe8/helpers/general.go#L65
 +[hl]: /content-management/syntax-highlighting/
 +[hlsc]: /content-management/shortcodes/#highlight
 +[hugocss]: /css/style.css
 +[ietf]: https://tools.ietf.org/html/
 +[mathjaxdocs]: https://docs.mathjax.org/en/latest/
 +[mdcheatsheet]: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet
 +[mdguide]: https://www.markdownguide.org/
 +[mdtutorial]: https://www.markdowntutorial.com/
 +[Miek Gieben's website]: https://miek.nl/2016/march/05/mmark-syntax-document/
 +[org]: https://orgmode.org/
 +[pandoc]: https://www.pandoc.org/
 +[rest]: https://docutils.sourceforge.io/rst.html
 +[sc]: /content-management/shortcodes/
 +[sct]: /templates/shortcode-templates/
index 5b8293675690106a76b1a26ff8ca6a6798c3383d,0000000000000000000000000000000000000000..710c260cabb4ba1024e750d5e43bad4c2ee027ce
mode 100644,000000..100644
--- /dev/null
@@@ -1,358 -1,0 +1,462 @@@
- description: "Image Page resources can be resized and cropped."
 +---
 +title: "Image Processing"
- linktitle: "Image Processing"
++description: "Resize, crop, rotate, filter, and convert images."
 +date: 2018-01-24T13:10:00-05:00
- ## The Image Page Resource
 +categories: ["content management"]
 +keywords: [resources, images]
 +weight: 4004
 +draft: false
 +toc: true
 +menu:
 +  docs:
 +    parent: "content-management"
 +    weight: 32
 +---
++## Image Resources
 +
- The `image` is a [Page Resource]({{< relref "/content-management/page-resources" >}}), and the processing methods listed below do not work on images inside your `/static` folder.
++To process an image, you must access the image as either a page resource or a global resource.
 +
- To print all images paths in a [Page Bundle]({{< relref "/content-management/organization#page-bundles" >}}):
++### Page Resources
 +
- {{ with .Resources.ByType "image" }}
- {{ range . }}
- {{ .RelPermalink }}
- {{ end }}
- {{ end }}
++A page resource is a file within a [page bundle]. A page bundle is a directory with an `index.md` or `_index.md` file at its root.
++
++```text
++content/
++└── posts/
++    └── post-1/           <-- page bundle
++        ├── index.md
++        └── sunset.jpg    <-- page resource
++```
++
++To access an image as a page resource:
 +
 +```go-html-template
- ## The Image Resource
++{{ $image := .Resources.GetMatch "sunset.jpg" }}
++```
++
++### Global Resources
++
++A global resource is a file:
++
++- Within the `assets` directory, or
++- Within any directory [mounted] to the `assets` directory, or
++- Located on a remote server accessible via `http` or `https`
++
++```text
++assets/
++└── images/
++    └── sunset.jpg    <-- global resource
++```
++
++To access a local image as a global resource:
 +
++```go-html-template
++{{ $image := resources.Get "images/sunset.jpg" }}
++```
++
++To access a remote image as a global resource:
++
++```go-html-template
++{{ $image := resources.GetRemote "https://gohugo.io/img/hugo-logo.png" }}
++```
++
++## Image Rendering
++
++Once you have accessed an image as either a page resource or a global resource, render it in your templates using the `Permalink`, `RelPermalink`, `Width`, and `Height` properties.
++
++Example 1: Throws an error if the resource is not found.
++
++```go-html-template
++{{ $image := .Resources.GetMatch "sunset.jpg" }}
++<img src="{{ $image.RelPermalink }}" width="{{ $image.Width }}" height="{{ $image.Height }}">
 +```
 +
- The `image` resource can also be retrieved from a [global resource]({{< relref "/hugo-pipes/introduction#from-file-to-resource" >}})
++Example 2: Skips image rendering if the resource is not found.
++
++```go-html-template
++{{ $image := .Resources.GetMatch "sunset.jpg" }}
++{{ with $image }}
++  <img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}">
++{{ end }}
++```
 +
- {{- $image := resources.Get "images/logo.jpg" -}}
++Example 3: A more concise way to skip image rendering if the resource is not found.
 +
 +```go-html-template
- The `image` resource implements the  `Resize`, `Fit`, `Fill`, `Crop`, and `Filter` methods, each returning a transformed image using the specified dimensions and processing options. 
++{{ with .Resources.GetMatch "sunset.jpg" }}
++  <img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}">
++{{ end }}
 +```
 +
 +## Image Processing Methods
 +
- Metadata (EXIF, IPTC, XMP, etc.) is not preserved during image transformation. Use the [`Exif`](#exif) method with the _original_ image to extract EXIF metadata from JPEG or TIFF images.
++The `image` resource implements the  `Resize`, `Fit`, `Fill`, `Crop`, `Filter`, and `Exif` methods.
 +
 +{{% note %}}
- Resizes the image to the specified width and height.
++Metadata (Exif, IPTC, XMP, etc.) is not preserved during image transformation. Use the`Exif` method with the _original_ image to extract Exif metadata from JPEG or TIFF images.
 +{{% /note %}}
 +
 +### Resize
 +
- ```go
- // Resize to a width of 600px and preserve ratio
- {{ $image := $resource.Resize "600x" }}
++Resize an image to the specified width and/or height.
++
++If you specify both width and height, the resulting image will be disproportionally scaled unless the original image has the same aspect ratio.
 +
- // Resize to a height of 400px and preserve ratio
- {{ $image := $resource.Resize "x400" }}
++```go-html-template
++{{/* Resize to a width of 600px and preserve aspect ratio */}}
++{{ $image := $image.Resize "600x" }}
 +
- // Resize to a width 600px and a height of 400px
- {{ $image := $resource.Resize "600x400" }}
++{{/* Resize to a height of 400px and preserve aspect ratio */}}
++{{ $image := $image.Resize "x400" }}
 +
- Scale down the image to fit the given dimensions while maintaining aspect ratio. Both height and width are required.
++{{/* Resize to a width of 600px and a height of 400px */}}
++{{ $image := $image.Resize "600x400" }}
 +```
 +
 +### Fit
 +
- ```go
- {{ $image := $resource.Fit "600x400" }}
++Downscale an image to fit the given dimensions while maintaining aspect ratio. You must provide both width and height.
 +
- Crop and resize the image to match the given dimensions. Both height and width are required.
++```go-html-template
++{{ $image := $image.Fit "600x400" }}
 +```
 +
 +### Fill
 +
- ```go
- {{ $image := $resource.Fill "600x400" }}
++Crop and resize an image to match the given dimensions. You must provide both width and height. Use the [`anchor`] option to change the crop box anchor point.
 +
- Crop the image to match the given dimensions without resizing. Both height and width are required.
++```go-html-template
++{{ $image := $image.Fill "600x400" }}
 +```
 +
 +### Crop
 +
- ```go
- {{ $image := $resource.Crop "400x400" }}
++Crop an image to match the given dimensions without resizing. You must provide both width and height. Use the [`anchor`] option to change the crop box anchor point.
 +
- Apply one or more filters to your image. See [Image Filters](/functions/images/#image-filters) for a full list.
++```go-html-template
++{{ $image := $image.Crop "600x400" }}
 +```
 +
 +### Filter
 +
- {{ $img = $img.Filter (images.GaussianBlur 6) (images.Pixelate 8) }}
++Apply one or more [filters] to an image.
 +
 +```go-html-template
- The above can also be written in a more functional style using pipes:
++{{ $image := $image.Filter (images.GaussianBlur 6) (images.Pixelate 8) }}
 +```
 +
- {{ $img = $img | images.Filter (images.GaussianBlur 6) (images.Pixelate 8) }}
++Write this in a more functional style using pipes. Hugo applies the filters in the order given.
 +
 +```go-html-template
- The filters will be applied in the given order.
- Sometimes it can be useful to create the filter chain once and then reuse it:
++{{ $image := $image | images.Filter (images.GaussianBlur 6) (images.Pixelate 8) }}
 +```
 +
- {{ $img1 = $img1.Filter $filters }}
- {{ $img2 = $img2.Filter $filters }}
++Sometimes it can be useful to create the filter chain once and then reuse it.
 +
 +```go-html-template
 +{{ $filters := slice  (images.GaussianBlur 6) (images.Pixelate 8) }}
- Provides an [Exif](https://en.wikipedia.org/wiki/Exif) object with metadata about the image.
++{{ $image1 := $image1.Filter $filters }}
++{{ $image2 := $image2.Filter $filters }}
 +```
 +
 +### Exif
 +
- Note that this is only supported for JPEG and TIFF images, so it's recommended to wrap the access with a `with`, e.g.:
++Provides an [Exif] object containing image metadata.
 +
- {{ with $img.Exif }}
- Date: {{ .Date }}
- Lat/Long: {{ .Lat}}/{{ .Long }}
- Tags:
- {{ range $k, $v := .Tags }}
- TAG: {{ $k }}: {{ $v }}
- {{ end }}
++You may access Exif data in JPEG and TIFF images. To prevent errors when processing images without Exif data, wrap the access in a `with` statement.
 +
 +```go-html-template
- Or individually access EXIF data with dot access, e.g.:
++{{ with $image.Exif }}
++  Date: {{ .Date }}
++  Lat/Long: {{ .Lat }}/{{ .Long }}
++  Tags:
++  {{ range $k, $v := .Tags }}
++    TAG: {{ $k }}: {{ $v }}
++  {{ end }}
 +{{ end }}
 +```
 +
- {{ with $src.Exif }}
++You may also access Exif fields individually, using the [`lang.FormatNumber`] function to format the fields as needed.
 +
 +```go-html-template
-       {{ with .Date }}<li>Date: {{ .Format "January 02, 2006" }}</li>{{ end }}
-       {{ with .Tags.ApertureValue }}<li>Aperture: {{ lang.NumFmt 2 . }}</li>{{ end }}
-       {{ with .Tags.BrightnessValue }}<li>Brightness: {{ lang.NumFmt 2 . }}</li>{{ end }}
-       {{ with .Tags.ExposureTime }}<li>Exposure Time: {{ . }}</li>{{ end }}
-       {{ with .Tags.FNumber }}<li>F Number: {{ . }}</li>{{ end }}
-       {{ with .Tags.FocalLength }}<li>Focal Length: {{ . }}</li>{{ end }}
-       {{ with .Tags.ISOSpeedRatings }}<li>ISO Speed Ratings: {{ . }}</li>{{ end }}
-       {{ with .Tags.LensModel }}<li>Lens Model: {{ . }}</li>{{ end }}
++{{ with $image.Exif }}
 +  <ul>
- Some fields may need to be formatted with [`lang.FormatNumberCustom`]({{< relref "functions/lang" >}}) function to prevent display like `Aperture: 2.278934289` instead of `Aperture: 2.28`.
- #### Exif fields
++    {{ with .Date }}<li>Date: {{ .Format "January 02, 2006" }}</li>{{ end }}
++    {{ with .Tags.ApertureValue }}<li>Aperture: {{ lang.FormatNumber 2 . }}</li>{{ end }}
++    {{ with .Tags.BrightnessValue }}<li>Brightness: {{ lang.FormatNumber 2 . }}</li>{{ end }}
++    {{ with .Tags.ExposureTime }}<li>Exposure Time: {{ . }}</li>{{ end }}
++    {{ with .Tags.FNumber }}<li>F Number: {{ . }}</li>{{ end }}
++    {{ with .Tags.FocalLength }}<li>Focal Length: {{ . }}</li>{{ end }}
++    {{ with .Tags.ISOSpeedRatings }}<li>ISO Speed Ratings: {{ . }}</li>{{ end }}
++    {{ with .Tags.LensModel }}<li>Lens Model: {{ . }}</li>{{ end }}
 +  </ul>
 +{{ end }}
 +```
 +
- Date
- : "photo taken" date/time
++#### Exif Variables
 +
- Lat
- : "photo taken where", GPS latitude
++.Date
++: Image creation date/time. Format with the [time.Format] function.
 +
- Long
- : "photo taken where", GPS longitude
++.Lat
++: GPS latitude in degrees.
 +
- See [Image Processing Config](#image-processing-config) for how to configure what gets included in Exif.
++.Long
++: GPS longitude in degrees.
 +
- In addition to the dimensions (e.g. `600x400`), Hugo supports a set of additional image options.
++.Tags
++: A collection of the available Exif tags for this image. You may include or exclude specific tags from this collection in the [site configuration](#exif-data).
 +
 +## Image Processing Options
 +
- ### Background Color
- The background color to fill into the transparency layer. This is mostly useful when converting to a format that does not support transparency, e.g. `JPEG`.
++The `Resize`, `Fit`, `Fill`, and `Crop` methods accept a space-separated, case-insensitive list of options. The order of the options within the list is irrelevant.
 +
- You can set the background color to use with a 3 or 6 digit hex code starting with `#`.
++### Dimensions
 +
- ```go
- {{ $image.Resize "600x jpg #b31280" }}
++With the `Resize` method you must specify width, height, or both. The `Fit`, `Fill`, and `Crop` methods require both width and height. All dimensions are in pixels.
 +
- For color codes, see https://www.google.com/search?q=color+picker
++```go-html-template
++{{ $image := $image.Resize "600x" }}
++{{ $image := $image.Resize "x400" }}
++{{ $image := $image.Resize "600x400" }}
++{{ $image := $image.Fit "600x400" }}
++{{ $image := $image.Fill "600x400" }}
++{{ $image := $image.Crop "600x400" }}
 +```
 +
- **Note** that you also set a default background color to use, see [Image Processing Config](#image-processing-config).
++### Rotation
++
++Rotates an image counter-clockwise by the given angle. Hugo performs rotation _before_ scaling. For example, if the original image is 600x400 and you wish to rotate the image 90 degrees counter-clockwise while scaling it by 50%:
 +
- ### JPEG and WebP Quality
++```go-html-template
++{{ $image = $image.Resize "200x r90" }}
++```
 +
- Only relevant for JPEG and WebP images, values 1 to 100 inclusive, higher is better. Default is 75.
++In the example above, the width represents the desired width _after_ rotation.
 +
- ```go
- {{ $image.Resize "600x q50" }}
++To rotate an image without scaling, use the dimensions of the original image:
 +
- {{< new-in "0.83.0" >}} WebP support was added in Hugo 0.83.0.
++```go-html-template
++{{ with .Resources.GetMatch "sunset.jpg" }}
++  {{ with .Resize (printf "%dx%d r90" .Height .Width) }}
++    <img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}">
++  {{ end }}
++{{ end }}
 +```
 +
- ### Hint
++In the example above, on the second line, we have reversed width and height to reflect the desired dimensions _after_ rotation.
 +
-  {{< new-in "0.83.0" >}}
++### Anchor
 +
-  {{< new-in "0.83.0" >}}
++When using the `Crop` or `Fill` method, the _anchor_ determines the placement of the crop box. You may specify `TopLeft`, `Top`, `TopRight`, `Left`, `Center`,`Right`, `BottomLeft`, `Bottom`, `BottomRight`, or `Smart`.
 +
- Hint about what type of image this is. Currently only used when encoding to WebP.
++The default value is `Smart`, which uses [Smartcrop] image analysis to determine the optimal placement of the crop box. You may override the default value in the [site configuration](#processing-options).
 +
- Default value is `photo`.
++For example, if you have a 400x200 image with a bird in the upper left quadrant, you can create a 200x100 thumbnail containing the bird:
 +
- Valid values are `picture`, `photo`, `drawing`, `icon`, or `text`.
++```go-html-template
++{{ $image.Crop "200x100 TopLeft" }}
++```
++
++If you apply rotation when using the `Crop` or `Fill` method, specify the anchor relative to the rotated image.
++
++### Target Format
++
++By default, Hugo encodes the image in the source format. You may convert the image to another format by specifying `bmp`, `gif`, `jpeg`, `jpg`, `png`, `tif`, `tiff`, or `webp`.
++
++```go-html-template
++{{ $image.Resize "600x webp" }}
++```
 +
- ```go
- {{ $image.Resize "600x webp drawing" }}
++To convert an image without scaling, use the dimensions of the original image:
 +
- ### Rotate
++```go-html-template
++{{ with .Resources.GetMatch "sunset.jpg" }}
++  {{ with .Resize (printf "%dx%d webp" .Width .Height) }}
++    <img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}">
++  {{ end }}
++{{ end }}
 +```
 +
- Rotates an image by the given angle counter-clockwise. The rotation will be performed first to get the dimensions correct. The main use of this is to be able to manually correct for [EXIF orientation](https://github.com/golang/go/issues/4341) of JPEG images.
++### Quality
++
++Applicable to JPEG and WebP images, the `q` value determines the quality of the converted image. Higher values produce better quality images, while lower values produce smaller files. Set this value to a whole number between 1 and 100, inclusive.
 +
- ```go
- {{ $image.Resize "600x r90" }}
++The default value is 75. You may override the default value in the [site configuration](#processing-options).
 +
- ### Anchor
++```go-html-template
++{{ $image.Resize "600x webp q50" }}
 +```
 +
- Only relevant for the `Crop` and `Fill` methods. This is useful for thumbnail generation where the main motive is located in, say, the left corner.
++### Hint
++
++<!-- Specifies a libwebp preset, not a libwebp image hint. -->
 +
- Valid values are `Smart`, `Center`, `TopLeft`, `Top`, `TopRight`, `Left`, `Right`, `BottomLeft`, `Bottom`, `BottomRight`.
++Applicable to WebP images, this option corresponds to a set of pre-defined encoding parameters.
 +
- Default value is `Smart`, which uses [Smartcrop](https://github.com/muesli/smartcrop) to determine the best crop.
++Value|Example
++:--|:--
++`drawing`|Hand or line drawing with high-contrast details
++`icon`|Small colorful image
++`photo`|Outdoor photograph with natural lighting
++`picture`|Indoor photograph such as a portrait
++`text`|Image that is primarily text
 +
- ```go
- {{ $image.Fill "300x200 BottomLeft" }}
++The default value is `photo`. You may override the default value in the [site configuration](#processing-options).
 +
- ### Resample Filter
++```go-html-template
++{{ $image.Resize "600x webp picture" }}
 +```
 +
- Filter used in resizing. Default is `Box`, a simple and fast resampling filter appropriate for downscaling.
++### Background Color
 +
- Examples are: `Box`, `NearestNeighbor`, `Linear`, `Gaussian`.
++When converting an image from a format that supports transparency (e.g., PNG) to a format that does _not_ support transparency (e.g., JPEG), you may specify the background color of the resulting image.
 +
- See https://github.com/disintegration/imaging for more. If you want to trade quality for faster processing, this may be a option to test.
++Use either a 3-digit or a 6-digit hexadecimal color code (e.g., `#00f` or `#0000ff`).
 +
- ```go
- {{ $image.Resize "600x400 Gaussian" }}
++The default value is `#ffffff` (white). You may override the default value in the [site configuration](#processing-options).
 +
- ### Target Format
++```go-html-template
++{{ $image.Resize "600x jpg #b31280" }}
 +```
 +
- By default the images is encoded in the source format, but you can set the target format as an option.
++### Resampling Filter
++
++You may specify the resampling filter used when resizing an image. Commonly used resampling filters include:
 +
- Valid values are `bmp`, `gif`, `jpeg`, `jpg`, `png`, `tif`, `tiff`, and `webp`.
++Filter|Description
++:--|:--
++`Box`|Simple and fast averaging filter appropriate for downscaling
++`Lanczos`|High-quality resampling filter for photographic images yielding sharp results
++`CatmullRom`|Sharp cubic filter that is faster than the Lanczos filter while providing similar results
++`MitchellNetravali`|Cubic filter that produces smoother results with less ringing artifacts than CatmullRom
++`Linear`|Bilinear resampling filter, produces smooth output, faster than cubic filters
++`NearestNeighbor`|Fastest resampling filter, no antialiasing
 +
- ```go
- {{ $image.Resize "600x jpg" }}
++The default value is `Box`. You may override the default value in the [site configuration](#processing-options).
 +
- {{< new-in "0.83.0" >}} WebP support was added in Hugo 0.83.0.
++```go-html-template
++{{ $image.Resize "600x400 Lanczos" }}
 +```
 +
- This is the shortcode used in the examples above:
++See [github.com/disintegration/imaging] for the complete list of resampling filters. If you wish to improve image quality at the expense of performance, you may wish to experiment with the alternative filters.
 +
 +## Image Processing Examples
 +
 +_The photo of the sunset used in the examples below is Copyright [Bjørn Erik Pedersen](https://commons.wikimedia.org/wiki/User:Bep) (Creative Commons Attribution-Share Alike 4.0 International license)_
 +
 +{{< imgproc sunset Resize "300x" />}}
 +
 +{{< imgproc sunset Fill "90x120 left" />}}
 +
 +{{< imgproc sunset Fill "90x120 right" />}}
 +
 +{{< imgproc sunset Fit "90x90" />}}
 +
 +{{< imgproc sunset Crop "250x250 center" />}}
 +
 +{{< imgproc sunset Resize "300x q10" />}}
 +
- And it is used like this:
++This is the shortcode used to generate the examples above:
 +
 +{{< code file="layouts/shortcodes/imgproc.html" >}}
 +{{< readfile file="layouts/shortcodes/imgproc.html" >}}  
 +{{< /code >}}
 +
- **Tip:** Note the self-closing shortcode syntax above. The `imgproc` shortcode can be called both with and without **inner content**.
++Call the shortcode from your markdown like this:
 +
 +```go-html-template
 +{{</* imgproc sunset Resize "300x" /*/>}}
 +```
 +
 +{{% note %}}
- ## Image Processing Config
++Note the self-closing shortcode syntax above. You may call the `imgproc` shortcode with or without **inner content**.
 +{{% /note %}}
 +
- You can configure an `imaging` section in `config.toml` with default image processing options:
++## Imaging Configuration
 +
- ```toml
- [imaging]
- # Default resample filter used for resizing. Default is Box,
- # a simple and fast averaging filter appropriate for downscaling.
- # See https://github.com/disintegration/imaging
- resampleFilter = "box"
++### Processing Options
 +
- # Default JPEG or WebP quality setting. Default is 75.
++Define an `imaging` section in your site configuration to set the default [image processing options](#image-processing-options).
 +
- # Default hint about what type of image. Currently only used for WebP encoding.
- # Default is "photo".
- # Valid values are "picture", "photo", "drawing", "icon", or "text".
++{{< code-toggle file="config" copy=true >}}
++[imaging]
++resampleFilter = "Box"
 +quality = 75
- # Anchor used when cropping pictures with either .Fill or .Crop
- # Default is "smart" which does Smart Cropping, using https://github.com/muesli/smartcrop
- # Smart Cropping is content aware and tries to find the best crop for each image.
- # Valid values are Smart, Center, TopLeft, Top, TopRight, Left, Right, BottomLeft, Bottom, BottomRight
- anchor = "smart"
- # Default background color.
- # Hugo will preserve transparency for target formats that supports it,
- # but will fall back to this color for JPEG.
- # Expects a standard HEX color string with 3 or 6 digits.
- # See https://www.google.com/search?q=color+picker
 +hint = "photo"
-  # Regexp matching the fields you want to Exclude from the (massive) set of Exif info
- # available. As we cache this info to disk, this is for performance and
- # disk space reasons more than anything.
- # If you want it all, put ".*" in this config setting.
- # Note that if neither this or ExcludeFields is set, Hugo will return a small
- # default set: GPS|Exif|Exposure[M|P|B]|Contrast|Resolution|Sharp|JPEG|Metering|Sensing|Saturation|ColorSpace|Flash|WhiteBalance
++anchor = "Smart"
 +bgColor = "#ffffff"
++{{< /code-toggle >}}
++
++anchor
++: See image processing options: [anchor](#anchor).
++
++bgColor
++: See image processing options: [background color](#background-color).
++
++hint
++: See image processing options: [hint](#hint).
++
++quality
++: See image processing options: [quality](#quality).
 +
++resampleFilter
++: See image processing options: [resampling filter](#resampling-filter).
++
++### Exif Data
++
++Define an `imaging.exif` section in your site configuration to control the availability of Exif data.
++
++{{< code-toggle file="config" copy=true >}}
 +[imaging.exif]
- # Regexp matching the Exif fields you want to exclude. This may be easier to use
- # than IncludeFields above, depending on what you want.
 +includeFields = ""
- # Hugo extracts the "photo taken" date/time into .Date by default.
- # Set this to true to turn it off.
 +excludeFields = ""
- # Hugo extracts the "photo taken where" (GPS latitude and longitude) into
- # .Long and .Lat. Set this to true to turn it off.
 +disableDate = false
- ```
 +disableLatLong = false
- By default, Hugo will use [Smartcrop](https://github.com/muesli/smartcrop), a library created by [muesli](https://github.com/muesli), when cropping images with `.Fill` or `.Crop`. You can set the anchor point manually, but in most cases the smart option will make a good choice. And we will work with the library author to improve this in the future.
++{{< /code-toggle >}}
++
++disableDate
++: Hugo extracts the image creation date/time into `.Date`. Set this to `true` to disable. Default is `false`.
++
++disableLatLong
++: Hugo extracts the GPS latitude and longitude into `.Lat` and `.Long`. Set this to `true` to disable. Default is `false`.
++
++excludeFields
++: Regular expression matching the Exif tags to exclude from the `.Tags` collection. Default is&nbsp;`""`.
++
++includeFields
++: Regular expression matching the Exif tags to include in the `.Tags` collection. Default is&nbsp;`""`. To include all available tags, set this value to&nbsp;`".*"`.
++
++{{% note %}}
++To improve performance and decrease cache size, if you set neither `excludeFields` nor `includeFields`, Hugo excludes the following tags: `ColorSpace`, `Contrast`, `Exif`, `Exposure[M|P|B]`, `Flash`, `GPS`, `JPEG`, `Metering`, `Resolution`, `Saturation`, `Sensing`, `Sharp`, and `WhiteBalance`.
++{{% /note %}}
 +
 +## Smart Cropping of Images
 +
- Processed images are stored below `<project-dir>/resources` (can be set with `resourceDir` config setting). This folder is deliberately placed in the project, as it is recommended to check these into source control as part of the project. These images are not "Hugo fast" to generate, but once generated they can be reused.
- If you change your image settings (e.g. size), remove or rename images etc., you will end up with unused images taking up space and cluttering your project.
++By default, Hugo uses the [Smartcrop] library when cropping images with the `Crop` or`Fill` methods. You can set the anchor point manually, but in most cases the `Smart` option will make a good choice.
 +
 +Examples using the sunset image from above:
 +
 +{{< imgproc sunset Fill "200x200 smart" />}}
 +
 +{{< imgproc sunset Crop "200x200 smart" />}}
 +
 +## Image Processing Performance Consideration
 +
- To clean up, run:
++Hugo caches processed images in the `resources` directory. If you include this directory in source control, Hugo will not have to regenerate the images in a CI/CD workflow (e.g., GitHub Pages, GitLab Pages, Netlify, etc.). This results in faster builds.
 +
- {{% note %}}
- **GC** is short for **Garbage Collection**.
- {{% /note %}}
++If you change image processing methods or options, or if you rename or remove images, the `resources` directory will contain unused images. To remove the unused images, perform garbage collection with:
 +
 +```bash
 +hugo --gc
 +```
 +
++[`anchor`]: {{< relref "content-management/image-processing#anchor" >}}
++[`lang.FormatNumber`]: {{< relref "functions/lang#langformatnumber" >}}
++[Exif]: <https://en.wikipedia.org/wiki/Exif>
++[filters]: {{< relref "functions/images" >}}
++[github.com/disintegration/imaging]: <https://github.com/disintegration/imaging#image-resizing>
++[mounted]: {{< relref "hugo-modules/configuration#module-config-mounts">}}
++[page bundle]: {{< relref "content-management/page-bundles" >}}
++[Smartcrop]: <https://github.com/muesli/smartcrop#smartcrop>
++[time.Format]: {{< relref "functions/dateformat" >}}
index a42cec32e9211a52e50659b5c61cd6f345cce3f7,0000000000000000000000000000000000000000..9ede15252810bb0ab707f54366a9cb334149aa91
mode 100644,000000..100644
--- /dev/null
@@@ -1,137 -1,0 +1,137 @@@
- {{ $related := .Site.RegularPages.Related . }}
 +---
 +title: Related Content
 +description: List related content in "See Also" sections.
 +date: 2017-09-05
 +categories: [content management]
 +keywords: [content]
 +menu:
 +  docs:
 +    parent: "content-management"
 +    weight: 40
 +weight: 30
 +draft: false
 +aliases: [/content/related/,/related/]
 +toc: true
 +---
 +
 +
 +Hugo uses a set of factors to identify a page's related content based on Front Matter parameters. This can be tuned to the desired set of indices and parameters or left to Hugo's default [Related Content configuration](#configure-related-content).
 +
 +## List Related Content
 +
 +
 +To list up to 5 related pages (which share the same _date_ or _keyword_ parameters) is as simple as including something similar to this partial in your single page template:
 +
 +{{< code file="layouts/partials/related.html" >}}
 +{{ $related := .Site.RegularPages.Related . | first 5 }}
 +{{ with $related }}
 +<h3>See Also</h3>
 +<ul>
 +      {{ range . }}
 +      <li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
 +      {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +### Methods
 +
 +Here is the list of "Related" methods available on a page collection such `.RegularPages`.
 +
 +#### .Related PAGE
 +Returns a collection of pages related the given one.
 +
 +```
- {{ $related := .Site.RegularPages.RelatedIndices . "tags" "date" }}
++{{ $related := site.RegularPages.Related . }}
 +```
 +
 +#### .RelatedIndices PAGE INDICE1 [INDICE2 ...]
 +Returns a collection of pages related to a given one restricted to a list of indices.
 +
 +```
- {{ $related := .Site.RegularPages.RelatedTo ( keyVals "tags" "hugo" "rocks")  ( keyVals "date" .Date ) }}
++{{ $related := site.RegularPages.RelatedIndices . "tags" "date" }}
 +```
 +
 +#### .RelatedTo KEYVALS [KEYVALS2 ...]
 +Returns a collection of pages related together by a set of indices and their match.
 +
 +In order to build those set and pass them as argument, one must use the `keyVals` function where the first argument would be the `indice` and the consecutive ones its potential `matches`.
 +
 +```
++{{ $related := site.RegularPages.RelatedTo ( keyVals "tags" "hugo" "rocks")  ( keyVals "date" .Date ) }}
 +```
 +
 +{{% note %}}
 +Read [this blog article](https://regisphilibert.com/blog/2018/04/hugo-optmized-relashionships-with-related-content/) for a great explanation of more advanced usage of this feature.
 +{{% /note %}}
 +
 +## Configure Related Content
 +Hugo provides a sensible default configuration of Related Content, but you can fine-tune this in your configuration, on the global or language level if needed.
 +
 +### Default configuration
 +
 +Without any `related` configuration set on the project, Hugo's Related Content methods will use the following.
 +
 +{{< code-toggle file="config" >}}
 +related:
 +  threshold: 80
 +  includeNewer: false
 +  toLower: false
 +  indices:
 +  - name: keywords
 +    weight: 100
 +  - name: date
 +    weight: 10
 +{{< /code-toggle >}}
 +
 +Note that if you have configured `tags` as a taxonomy, `tags` will also be added to the default configuration above with the weight of `80`.
 +
 +Custom configuration should be set using the same syntax.
 +
 +{{% note %}}
 +If you add a `related` config section, you need to add a complete configuration. It is not possible to just set, say, `includeNewer` and use the rest  from the Hugo defaults.
 +{{% /note %}}
 +
 +### Top Level Config Options
 +
 +threshold
 +:  A value between 0-100. Lower value will give more, but maybe not so relevant, matches.
 +
 +includeNewer
 +:  Set to true to include **pages newer than the current page** in the related content listing. This will mean that the output for older posts may change as new related content gets added.
 +
 +toLower
 +: Set to true to lower case keywords in both the indexes and the queries. This may give more accurate results at a slight performance penalty. Note that this can also be set per index.
 +
 +### Config Options per Index
 +
 +name
 +:  The index name. This value maps directly to a page param. Hugo supports string values (`author` in the example) and lists (`tags`, `keywords` etc.) and time and date objects.
 +
 +weight
 +: An integer weight that indicates _how important_ this parameter is relative to the other parameters.  It can be 0, which has the effect of turning this index off, or even negative. Test with different values to see what fits your content best.
 +
 +pattern
 +: This is currently only relevant for dates. When listing related content, we may want to list content that is also close in time. Setting "2006" (default value for date indexes) as the pattern for a date index will add weight to pages published in the same year. For busier blogs, "200601" (year and month) may be a better default.
 +
 +toLower
 +: See above.
 +
 +## Performance Considerations
 +
 +**Fast is Hugo's middle name** and we would not have released this feature had it not been blistering fast.
 +
 +This feature has been in the back log and requested by many for a long time. The development got this recent kick start from this Twitter thread:
 +
 +{{< tweet user="scott_lowe" id="898398437527363585" >}}
 +
 +Scott S. Lowe removed the "Related Content" section built using the `intersect` template function on tags, and the build time dropped from 30 seconds to less than 2 seconds on his 1700 content page sized blog.
 +
 +He should now be able to add an improved version of that "Related Content" section without giving up the fast live-reloads. But it's worth noting that:
 +
 +* If you don't use any of the `Related` methods, you will not use the Relate Content feature, and performance will be the same as before.
 +* Calling `.RegularPages.Related` etc. will create one inverted index, also sometimes named posting list, that will be reused for any lookups in that same page collection. Doing that in addition to, as an example, calling `.Pages.Related` will work as expected, but will create one additional inverted index. This should still be very fast, but worth having in mind, especially for bigger sites.
 +
 +{{% note %}}
 +We currently do not index **Page content**. We thought we would release something that will make most people happy before we start solving [Sherlock's last case](https://github.com/joearms/sherlock).
 +{{% /note %}}
index c0eb59d6d4bbbe40c6ccc1003d3b0cd387db88a3,0000000000000000000000000000000000000000..25d0f5d7aa9715f187c48c37b075303abbd0195d
mode 100644,000000..100644
--- /dev/null
@@@ -1,313 -1,0 +1,314 @@@
 +---
 +title: URL Management
 +linktitle: URL Management
 +description: Hugo supports permalinks, aliases, link canonicalization, and multiple options for handling relative vs absolute URLs.
 +date: 2017-02-01
 +publishdate: 2017-02-01
 +lastmod: 2017-03-09
 +keywords: [aliases,redirects,permalinks,urls]
 +categories: [content management]
 +menu:
 +  docs:
 +    parent: "content-management"
 +    weight: 110
 +weight: 110   #rem
 +draft: false
 +aliases: [/extras/permalinks/,/extras/aliases/,/extras/urls/,/doc/redirects/,/doc/alias/,/doc/aliases/]
 +toc: true
 +---
 +
 +## Permalinks
 +
 +The default Hugo target directory for your built website is `public/`. However, you can change this value by specifying a different `publishDir` in your [site configuration][config]. The directories created at build time for a section reflect the position of the content's directory within the `content` folder and namespace matching its layout within the `contentdir` hierarchy.
 +
 +The `permalinks` option in your [site configuration][config] allows you to adjust the directory paths (i.e., the URLs) on a per-section basis. This will change where the files are written to and will change the page's internal "canonical" location, such that template references to `.RelPermalink` will honor the adjustments made as a result of the mappings in this option.
 +
 +{{% note "Default Publish and Content Folders" %}}
 +These examples use the default values for `publishDir` and `contentDir`; i.e., `public` and `content`, respectively. You can override the default values in your [site's `config` file](/getting-started/configuration/).
 +{{% /note %}}
 +
 +For example, if one of your [sections][] is called `posts` and you want to adjust the canonical path to be hierarchical based on the year, month, and post title, you could set up the following configurations in YAML and TOML, respectively.
 +
 +### Permalinks Configuration Example
 +
 +{{< code-toggle file="config" copy="false" >}}
 +permalinks:
 +  posts: /:year/:month/:title/
 +{{< /code-toggle >}}
 +
 +Only the content under `posts/` will have the new URL structure. For example, the file `content/posts/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/2017/02/sample-entry/`.
 +
 +To configure the `permalinks` option for pages in the "root" section, use **/** as the key:
 +
 +{{< code-toggle file="config" copy="false" >}}
 +permalinks:
 +  /: /:year/:month/:filename/
 +{{< /code-toggle >}}
 +
 +If the standard date-based permalink configuration does not meet your needs, you can also format URL segments using [Go time formatting directives](https://golang.org/pkg/time/#Time.Format). For example, a URL structure with two digit years and month and day digits without zero padding can be accomplished with:
 +
 +{{< code-toggle file="config" copy="false" >}}
 +permalinks:
 +  posts: /:06/:1/:2/:title/
 +{{< /code-toggle >}}
 +
 +You can also configure permalinks of taxonomies with the same syntax, by using the plural form of the taxonomy instead of the section. You will probably only want to use the configuration values `:slug` or `:title`.
 +
 +### Permalink Configuration Values
 +
 +The following is a list of values that can be used in a `permalink` definition in your site `config` file. All references to time are dependent on the content's date.
 +
 +`:year`
 +: the 4-digit year
 +
 +`:month`
 +: the 2-digit month
 +
 +`:monthname`
 +: the name of the month
 +
 +`:day`
 +: the 2-digit day
 +
 +`:weekday`
 +: the 1-digit day of the week (Sunday = 0)
 +
 +`:weekdayname`
 +: the name of the day of the week
 +
 +`:yearday`
 +: the 1- to 3-digit day of the year
 +
 +`:section`
 +: the content's section
 +
 +`:sections`
 +: the content's sections hierarchy. {{< new-in "0.83.0" >}} Since Hugo 0.83 you can use a selection of the sections using _slice syntax_: `:sections[1:]` includes all but the first, `:sections[:last]` includes all but the last, `:sections[last]` includes only the last, `:sections[1:2]` includes section 2 and 3. Note that this slice access will not throw any out-of-bounds errors, so you don't have to be exact.
 +
 +`:title`
 +: the content's title
 +
 +`:slug`
 +: the content's slug (or title if no slug is provided in the front matter)
 +
 +`:filename`
 +: the content's filename (without extension)
 +
 +Additionally, a Go time format string prefixed with `:` may be used.
 +
 +## Aliases
 +
 +Aliases can be used to create redirects to your page from other URLs.
 +
 +Aliases comes in two forms:
 +
 +1. Starting with a `/` meaning they are relative to the `BaseURL`, e.g. `/posts/my-blogpost/`
 +2. They are relative to the `Page` they're defined in, e.g. `my-blogpost` or even something like `../blog/my-blogpost` (new in Hugo 0.55).
 +
 +### Example: Aliases
 +
 +Let's assume you create a new piece of content at `content/posts/my-awesome-blog-post.md`. The content is a revision of your previous post at `content/posts/my-original-url.md`. You can create an `aliases` field in the front matter of your new `my-awesome-blog-post.md` where you can add previous paths. The following examples show how to create this field in TOML and YAML front matter, respectively.
 +
 +#### TOML Front Matter
 +
 +{{< code file="content/posts/my-awesome-post.md" copy="false" >}}
 ++++
 +aliases = [
 +    "/posts/my-original-url/",
 +    "/2010/01/01/even-earlier-url.html"
 +]
 ++++
 +{{< /code >}}
 +
 +#### YAML Front Matter
 +
 +{{< code file="content/posts/my-awesome-post.md" copy="false" >}}
 +---
 +aliases:
 +    - /posts/my-original-url/
 +    - /2010/01/01/even-earlier-url.html
 +---
 +{{< /code >}}
 +
 +Now when you visit any of the locations specified in aliases---i.e., *assuming the same site domain*---you'll be redirected to the page they are specified on. For example, a visitor to `example.com/posts/my-original-url/` will be immediately redirected to `example.com/posts/my-awesome-post/`.
 +
 +### Example: Aliases in Multilingual
 +
 +On [multilingual sites][multilingual], each translation of a post can have unique aliases. To use the same alias across multiple languages, prefix it with the language code.
 +
 +In `/posts/my-new-post.es.md`:
 +
 +```
 +---
 +aliases:
 +    - /es/posts/my-original-post/
 +---
 +```
 +
 +From Hugo 0.55 you can also have page-relative aliases, so ` /es/posts/my-original-post/` can be simplified to the more portable `my-original-post/`
 +
 +### How Hugo Aliases Work
 +
 +When aliases are specified, Hugo creates a directory to match the alias entry. Inside the directory, Hugo creates an `.html` file specifying the canonical URL for the page and the new redirect target.
 +
 +For example, a content file at `posts/my-intended-url.md` with the following in the front matter:
 +
 +```
 +---
 +title: My New post
 +aliases: [/posts/my-old-url/]
 +---
 +```
 +
 +Assuming a `baseURL` of `example.com`, the contents of the auto-generated alias `.html` found at `https://example.com/posts/my-old-url/` will contain the following:
 +
 +```
 +<!DOCTYPE html>
 +<html>
 +  <head>
 +    <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=https://example.com/posts/my-intended-url"/>
 +  </head>
 +</html>
 +```
 +
 +The `http-equiv="refresh"` line is what performs the redirect, in 0 seconds in this case. If an end user of your website goes to `https://example.com/posts/my-old-url`, they will now be automatically redirected to the newer, correct URL. The addition of `<meta name="robots" content="noindex">` lets search engine bots know that they should not crawl and index your new alias page.
 +
 +### Customize
++
 +You may customize this alias page by creating an `alias.html` template in the
 +layouts folder of your site (i.e., `layouts/alias.html`). In this case, the data passed to the template is
 +
 +`Permalink`
 +: the link to the page being aliased
 +
 +`Page`
 +: the Page data for the page being aliased
 +
 +### Important Behaviors of Aliases
 +
 +1. Hugo makes no assumptions about aliases. They also do not change based
 +on your UglyURLs setting. You need to provide absolute paths to your web root
 +and the complete filename or directory.
 +2. Aliases are rendered *before* any content are rendered and therefore will be overwritten by any content with the same location.
 +
 +## Pretty URLs
 +
 +Hugo's default behavior is to render your content with "pretty" URLs. No non-standard server-side configuration is required for these pretty URLs to work.
 +
 +The following demonstrates the concept:
 +
 +```
 +content/posts/_index.md
 +=> example.com/posts/
 +content/posts/post-1.md
 +=> example.com/posts/post-1/
 +```
 +
 +## Ugly URLs
 +
 +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 set the `HUGO_UGLYURLS` environment variable to `true` when running `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.
 +
 +See [Content Organization][contentorg] for more details on paths.
 +
 +```
 +.
 +└── content
 +    └── about
 +    |   └── _index.md  // <- https://example.com/about/
 +    ├── posts
 +    |   ├── firstpost.md   // <- https://example.com/posts/firstpost/
 +    |   ├── happy
 +    |   |   └── ness.md  // <- https://example.com/posts/happy/ness/
 +    |   └── secondpost.md  // <- https://example.com/posts/secondpost/
 +    └── quote
 +        ├── first.md       // <- https://example.com/quote/first/
 +        └── second.md      // <- https://example.com/quote/second/
 +```
 +
 +Here's the same organization run with `hugo --uglyURLs`:
 +
 +```
 +.
 +└── content
 +    └── about
 +    |   └── _index.md  // <- https://example.com/about.html
 +    ├── posts
 +    |   ├── firstpost.md   // <- https://example.com/posts/firstpost.html
 +    |   ├── happy
 +    |   |   └── ness.md    // <- https://example.com/posts/happy/ness.html
 +    |   └── secondpost.md  // <- https://example.com/posts/secondpost.html
 +    └── quote
 +        ├── first.md       // <- https://example.com/quote/first.html
 +        └── second.md      // <- https://example.com/quote/second.html
 +```
 +
 +
 +## Canonicalization
 +
 +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 `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.
 +
 +Benefits of non-canonicalization include being able to have scheme-relative resource inclusion; e.g., so that `http` vs `https` can be decided according to how the page was retrieved.
 +
 +{{% note "`canonifyURLs` default change" %}}
 +In the May 2014 release of Hugo v0.11, the default value of `canonifyURLs` was switched from `true` to `false`, which we think is the better default and should continue to be the case going forward. Please verify and adjust your website accordingly if you are upgrading from v0.10 or older versions.
 +{{% /note %}}
 +
 +To find out the current value of `canonifyURLs` for your website, you may use the handy `hugo config` command added in v0.13.
 +
 +```
 +hugo config | grep -i canon
 +```
 +
 +Or, if you are on Windows and do not have `grep` installed:
 +
 +```
 +hugo config | FINDSTR /I canon
 +```
 +
 +## Set URL in Front Matter
 +
 +In addition to specifying permalink values in your site configuration for different content sections, Hugo provides even more granular control for individual pieces of content.
 +
 +Both `slug` and `url` can be defined in individual front matter. For more information on content destinations at build time, see [Content Organization][contentorg].
 +
 +From Hugo 0.55, you can use URLs relative to the current site context (the language), which makes it simpler to maintain. For a Japanese translation, both of the following examples would get the same URL:
 +
 +```markdown
 +---
 +title: "Custom URL!"
 +url: "/jp/custom/foo"
 +---
 +```
 +
 +```markdown
 +---
 +title: "Custom URL!"
 +url: "custom/foo"
 +---
 +```
 +
 +
 +## Relative URLs
 +
 +By default, all relative URLs are left unchanged by Hugo, which can be problematic when you want to make your site browsable from a local file system.
 +
 +Setting `relativeURLs` to `true` in your [site configuration][config] will cause Hugo to rewrite all relative URLs to be relative to the current content.
 +
 +For example, if your `/posts/first/` page contains a link to `/about/`, Hugo will rewrite the URL to `../../about/`.
 +
 +[config]: /getting-started/configuration/
 +[contentorg]: /content-management/organization/
 +[front matter]: /content-management/front-matter/
 +[multilingual]: /content-management/multilingual/
 +[sections]: /content-management/sections/
 +[usage]: /getting-started/usage/
index 27df5c6f77b7f0eb7846f6de13af622d6c5bcc73,0000000000000000000000000000000000000000..dd92ec0a77982eb9227eafe45439ffb1a41da0f4
mode 100644,000000..100644
--- /dev/null
@@@ -1,436 -1,0 +1,436 @@@
- [gobootcamp]: http://www.golangbootcamp.com/book/get_setup
 +---
 +title: Contribute to Hugo Development
 +linktitle: Development
 +description: Hugo relies heavily on contributions from the open source community.
 +date: 2017-02-01
 +publishdate: 2017-02-01
 +lastmod: 2017-02-01
 +categories: [contribute]
 +keywords: [dev,open source]
 +authors: [digitalcraftsman]
 +menu:
 +  docs:
 +    parent: "contribute"
 +    weight: 10
 +weight: 10
 +sections_weight: 10
 +draft: false
 +toc: true
 +---
 +
 +## Introduction
 +
 +Hugo is an open-source project and lives by the work of its [contributors][]. There are plenty of [open issues][issues], and we need your help to make Hugo even more awesome. You don't need to be a Go guru to contribute to the project's development.
 +
 +## Assumptions
 +
 +This contribution guide takes a step-by-step approach in hopes of helping newcomers. Therefore, we only assume the following:
 +
 +* You are new to Git or open-source projects in general
 +* You are a fan of Hugo and enthusiastic about contributing to the project
 +
 +{{% note "Additional Questions?" %}}
 +If you're struggling at any point in this contribution guide, reach out to the Hugo community in [Hugo's Discussion forum](https://discourse.gohugo.io).
 +{{% /note %}}
 +
 +## Install Go
 +
 +The installation of Go should take only a few minutes. You have more than one option to get Go up and running on your machine.
 +
 +If you are having trouble following the installation guides for Go, check out [Go Bootcamp, which contains setups for every platform][gobootcamp] or reach out to the Hugo community in the [Hugo Discussion Forums][forums].
 +
 +### Install Go From Source
 +
 +[Download the latest stable version of Go][godl] and follow the official [Go installation guide][goinstall].
 +
 +Once you're finished installing Go, let's confirm everything is working correctly. Open a terminal---or command line under Windows--and type the following:
 +
 +```
 +go version
 +```
 +
 +You should see something similar to the following written to the console. Note that the version here reflects the most recent version of Go as of the last update for this page:
 +
 +```
 +go version go1.12 darwin/amd64
 +```
 +
 +Next, make sure that you set up your `GOPATH` [as described in the installation guide][setupgopath].
 +
 +You can print the `GOPATH` with `echo $GOPATH`. You should see a non-empty string containing a valid path to your Go workspace; for example:
 +
 +```
 +/Users/<yourusername>/Code/go
 +```
 +
 +### Install Go with Homebrew
 +
 +If you are a MacOS user and have [Homebrew](https://brew.sh/) installed on your machine, installing Go is as simple as the following command:
 +
 +{{< code file="install-go.sh" >}}
 +brew install go
 +{{< /code >}}
 +
 +### Install Go via GVM
 +
 +More experienced users can use the [Go Version Manager][gvm] (GVM). GVM allows you to switch between different Go versions *on the same machine*. If you're a beginner, you probably don't need this feature. However, GVM makes it easy to upgrade to a new released Go version with just a few commands.
 +
 +GVM comes in especially handy if you follow the development of Hugo over a longer period of time. Future versions of Hugo will usually be compiled with the latest version of Go. Sooner or later, you will have to upgrade if you want to keep up.
 +
 +## Create a GitHub Account
 +
 +If you're going to contribute code, you'll need to have an account on GitHub. Go to [www.github.com/join](https://github.com/join) and set up a personal account.
 +
 +## Install Git on Your System
 +
 +You will need to have Git installed on your computer to contribute to Hugo development. Teaching Git is outside the scope of the Hugo docs, but if you're looking for an excellent reference to learn the basics of Git, we recommend the [Git book][gitbook] if you are not sure where to begin. We will include short explanations of the Git commands in this document.
 +
 +Git is a [version control system](https://en.wikipedia.org/wiki/Version_control) to track the changes of source code. Hugo depends on smaller third-party packages that are used to extend the functionality. We use them because we don't want to reinvent the wheel.
 +
 +Go ships with a sub-command called `get` that will download these packages for us when we setup our working environment. The source code of the packages is tracked with Git. `get` will interact with the Git servers of the package hosters in order to fetch all dependencies.
 +
 +Move back to the terminal and check if Git is already installed. Type in `git version` and press enter. You can skip the rest of this section if the command returned a version number. Otherwise [download](https://git-scm.com/downloads) the latest version of Git and follow this [installation guide](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
 +
 +Finally, check again with `git version` if Git was installed successfully.
 +
 +### Git Graphical Front Ends
 +
 +There are several [GUI clients](https://git-scm.com/downloads/guis) that help you to operate Git. Not all are available for all operating systems and maybe differ in their usage. Because of this we will document how to use the command line, since the commands are the same everywhere.
 +
 +### Install Hub on Your System (Optional)
 +
 +Hub is a great tool for working with GitHub. The main site for it is [hub.github.com](https://hub.github.com/). Feel free to install this little Git wrapper.
 +
 +On a Mac, you can install [Hub](https://github.com/github/hub) using [Homebrew](https://brew.sh):
 +
 +```
 +brew install hub
 +```
 +
 +Now we'll create an [alias in Bash](https://tldp.org/LDP/abs/html/aliases.html) so that typing `git` actually runs `Hub`:
 +
 +```
 +echo "alias git='hub'" >> ~/.bash_profile
 +```
 +
 +Confirm the installation:
 +
 +```
 +git version 2.21.0
 +hub version 2.10.0
 +```
 +
 +## Set up your working copy
 +
 +You set up the working copy of the repository locally on your computer. Your local copy of the files is what you'll edit, compile, and end up pushing back to GitHub. The main steps are cloning the repository and creating your fork as a remote.
 +
 +### Clone the repository
 +
 +We assume that you've set up your `GOPATH` (see the section above if you're unsure about this). You should now copy the Hugo repository down to your computer. You'll hear this called "clone the repo". GitHub's [help pages](https://help.github.com/articles/cloning-a-repository/) give us a short explanation:
 +
 +> When you create a repository on GitHub, it exists as a remote repository. You can create a local clone of your repository on your computer and sync between the two locations.
 +
 +We're going to clone the [master Hugo repository](https://github.com/gohugoio/hugo). That seems counter-intuitive, since you won't have commit rights on it. But it's required for the Go workflow. You'll work on a copy of the master and push your changes to your own repository on GitHub.
 +
 +So, let's make a new directory and clone that master repository:
 +
 +```
 +mkdir $HOME/src
 +cd $HOME/src
 +git clone https://github.com/gohugoio/hugo.git
 +```
 +
 +> Since Hugo 0.48, Hugo uses the Go Modules support built into Go 1.11 to build. 
 +> The easiest is to clone Hugo in a directory outside of GOPATH
 +
 +And then, install dependencies of Hugo by running the following in the cloned directory:
 +
 +```
 +cd $HOME/src/hugo
 +go install
 +```
 +
 +
 +Hugo relies on [mage](https://github.com/magefile/mage) for some convenient build and test targets. If you don't already have it, get it:
 +
 +```
 +go install github.com/magefile/mage@latest
 +```
 +
 +### Fork the repository
 +
 +If you're not familiar with this term, GitHub's [help pages](https://help.github.com/articles/fork-a-repo/) provide again a simple explanation:
 +
 +> A fork is a copy of a repository. Forking a repository allows you to freely experiment with changes without affecting the original project.
 +
 +#### Fork by hand
 +
 +Open the [Hugo repository](https://github.com/gohugoio/hugo) on GitHub and click on the "Fork" button in the top right.
 +
 +![Fork button](/images/contribute/development/forking-a-repository.png)
 +
 +Now open your fork repository on GitHub and copy the remote url of your fork. You can choose between HTTPS and SSH as protocol that Git should use for the following operations. HTTPS works always [if you're not sure](https://help.github.com/articles/which-remote-url-should-i-use/).
 +
 +![Copy remote url](/images/contribute/development/copy-remote-url.png)
 +
 +Switch back to the terminal and move into the directory of the cloned master repository from the last step.
 +
 +```
 +cd $HOME/src/hugo
 +```
 +
 +Now Git needs to know that our fork exists by adding the copied remote url:
 +
 +```
 +git remote add <YOUR-GITHUB-USERNAME> <COPIED REMOTE-URL>
 +```
 +
 +#### Fork with Hub
 +
 +Alternatively, you can use the Git wrapper Hub. Hub makes forking a repository easy:
 +
 +```
 +git fork
 +```
 +
 +That command will log in to GitHub using your account, create a fork of the repository that you're currently working in, and add it as a remote to your working copy.
 +
 +#### Trust, but verify
 +
 +Let's check if everything went right by listing all known remotes:
 +
 +```
 +git remote -v
 +```
 +
 +The output should look similar:
 +
 +```
 +digitalcraftsman    git@github.com:digitalcraftsman/hugo.git (fetch)
 +digitalcraftsman    git@github.com:digitalcraftsman/hugo.git (push)
 +origin  https://github.com/gohugoio/hugo (fetch)
 +origin  https://github.com/gohugoio/hugo (push)
 +```
 +
 +## The Hugo Git Contribution Workflow
 +
 +### Create a new branch
 +
 +You should never develop against the "master" branch. The development team will not accept a pull request against that branch. Instead, create a descriptive named branch and work on it.
 +
 +First, you should always pull the latest changes from the master repository:
 +
 +```
 +git checkout master
 +git pull
 +```
 +
 +Now we can create a new branch for your additions:
 +
 +```
 +git checkout -b <BRANCH-NAME>
 +```
 +
 +You can check on which branch you are with `git branch`. You should see a list of all local branches. The current branch is indicated with a little asterisk.
 +
 +### Contribute to Documentation
 +
 +Perhaps you want to start contributing to the Hugo docs. If so, you can ignore most of the following steps and focus on the `/docs` directory within your newly cloned repository. You can change directories into the Hugo docs using `cd docs`.
 +
 +You can start Hugo's built-in server via `hugo server`. Browse the documentation by entering [http://localhost:1313](http://localhost:1313) in the address bar of your browser. The server automatically updates the page whenever you change content.
 +
 +We have developed a [separate Hugo documentation contribution guide][docscontrib] for more information on how the Hugo docs are built, organized, and improved by the generosity of people like you.
 +
 +### Build Hugo
 +
 +While making changes in the codebase it's a good idea to build the binary to test them:
 +
 +```
 +mage hugo
 +```
 +
 +This command generates the binary file at the root of the repository.
 +
 +If you want to install the binary in `$GOPATH/bin`, run
 +
 +```
 +mage install
 +```
 +
 +### Test 
 +Sometimes changes on the codebase can cause unintended side effects. Or they don't work as expected. Most functions have their own test cases. You can find them in files ending with `_test.go`.
 +
 +Make sure the commands 
 +
 +```
 +mage -v check
 +```
 +
 +passes.
 +
 +### Formatting 
 +The Go code styleguide maybe is opinionated but it ensures that the codebase looks the same, regardless who wrote the code. Go comes with its own formatting tool. Let's apply the styleguide to our additions:
 +
 +```
 +mage fmt
 +```
 +
 +Once you made your additions commit your changes. Make sure that you follow our [code contribution guidelines](https://github.com/gohugoio/hugo/blob/master/CONTRIBUTING.md):
 +
 +```
 +# Add all changed files
 +git add --all
 +git commit --message "YOUR COMMIT MESSAGE"
 +```
 +
 +The commit message should describe what the commit does (e.g. add feature XYZ), not how it is done.
 +
 +### Modify commits
 +
 +You noticed some commit messages don't fulfill the code contribution guidelines or you just forget something to add some files? No problem. Git provides the necessary tools to fix such problems. The next two methods cover all common cases.
 +
 +If you are unsure what a command does leave the commit as it is. We can fix your commits later in the pull request.
 +
 +#### Modify the last commit
 +
 +Let's say you want to modify the last commit message. Run the following command and replace the current message:
 +
 +```
 +git commit --amend -m"YOUR NEW COMMIT MESSAGE"
 +```
 +
 +Take a look at the commit log to see the change:
 +
 +```
 +git log
 +# Exit with q
 +```
 +
 +After making the last commit you may have forgot something. There is no need to create a new commit. Just add the latest changes and merge them into the intended commit:
 +
 +```
 +git add --all
 +git commit --amend
 +```
 +
 +#### Modify multiple commits
 +
 +{{% warning "Be Careful Modifying Multiple Commits"%}}
 +Modifications such as those described in this section can have serious unintended consequences. Skip this section if you're not sure!
 +{{% /warning %}}
 +
 +This is a bit more advanced. Git allows you to [rebase](https://git-scm.com/docs/git-rebase) commits interactively. In other words: it allows you to rewrite the commit history.
 +
 +```
 +git rebase --interactive @~6
 +```
 +
 +The `6` at the end of the command represents the number of commits that should be modified. An editor should open and present a list of last six commit messages:
 +
 +```
 +pick 80d02a1 tpl: Add hasPrefix to the template funcs' "smoke test"
 +pick aaee038 tpl: Sort the smoke tests
 +pick f0dbf2c tpl: Add the other test case for hasPrefix
 +pick 911c35b Add "How to contribute to Hugo" tutorial
 +pick 33c8973 Begin workflow
 +pick 3502f2e Refactoring and typo fixes
 +```
 +
 +In the case above we should merge the last two commits in the commit of this tutorial (`Add "How to contribute to Hugo" tutorial`). You can "squash" commits, i.e. merge two or more commits into a single one.
 +
 +All operations are written before the commit message. Replace "pick" with an operation. In this case `squash` or `s` for short:
 +
 +```
 +pick 80d02a1 tpl: Add hasPrefix to the template funcs' "smoke test"
 +pick aaee038 tpl: Sort the smoke tests
 +pick f0dbf2c tpl: Add the other test case for hasPrefix
 +pick 911c35b Add "How to contribute to Hugo" tutorial
 +squash 33c8973 Begin workflow
 +squash 3502f2e Refactoring and typo fixes
 +```
 +
 +We also want to rewrite the commits message of the third last commit. We forgot "docs:" as prefix according to the code contribution guidelines. The operation to rewrite a commit is called `reword` (or `r` as shortcut).
 +
 +You should end up with a similar setup:
 +
 +```
 +pick 80d02a1 tpl: Add hasPrefix to the template funcs' "smoke test"
 +pick aaee038 tpl: Sort the smoke tests
 +pick f0dbf2c tpl: Add the other test case for hasPrefix
 +reword 911c35b Add "How to contribute to Hugo" tutorial
 +squash 33c8973 Begin workflow
 +squash 3502f2e Refactoring and typo fixes
 +```
 +
 +Close the editor. It should open again with a new tab. A text is instructing you to define a new commit message for the last two commits that should be merged (aka "squashed"). Save the file with <kbd>CTRL</kbd>+<kbd>S</kbd> and close the editor again.
 +
 +A last time a new tab opens. Enter a new commit message and save again. Your terminal should contain a status message. Hopefully this one:
 +
 +```
 +Successfully rebased and updated refs/heads/<BRANCHNAME>.
 +```
 +
 +Check the commit log if everything looks as expected. Should an error occur you can abort this rebase with `git rebase --abort`.
 +
 +### Push commits
 +
 +To push our commits to the fork on GitHub we need to specify a destination. A destination is defined by the remote and a branch name. Earlier, the defined that the remote url of our fork is the same as our GitHub handle, in my case `digitalcraftsman`. The branch should have the same as our local one. This makes it easy to identify corresponding branches.
 +
 +```
 +git push --set-upstream <YOUR-GITHUB-USERNAME> <BRANCHNAME>
 +```
 +
 +Now Git knows the destination. Next time when you to push commits you just need to enter `git push`.
 +
 +If you modified your commit history in the last step GitHub will reject your try to push. This is a safety-feature because the commit history isn't the same and new commits can't be appended as usual. You can enforce this push explicitly with `git push --force`.
 +
 +## Open a pull request
 +
 +We made a lot of progress. Good work. In this step we finally open a pull request to submit our additions. Open the [Hugo master repository](https://github.com/gohugoio/hugo/) on GitHub in your browser.
 +
 +You should find a green button labeled with "New pull request". But GitHub is clever and probably suggests you a pull request like in the beige box below:
 +
 +![Open a pull request](/images/contribute/development/open-pull-request.png)
 +
 +The new page summaries the most important information of your pull request. Scroll down and you find the additions of all your commits. Make sure everything looks as expected and click on "Create pull request".
 +
 +### Accept the contributor license agreement
 +
 +Last but not least you should accept the contributor license agreement (CLA). A new comment should be added automatically to your pull request. Click on the yellow badge, accept the agreement and authenticate yourself with your GitHub account. It just takes a few clicks and only needs to be done once.
 +
 +![Accept the CLA](/images/contribute/development/accept-cla.png)
 +
 +### Automatic builds
 +
 +We use a GitHub Actions workflow to build and test. This is a matrix build across combinations of operating system (masOS, Windows, and Ubuntu) and Go versions. The workflow is triggered by the submission of a pull request. If you are a first-time contributor, the workflow requires approval from a project maintainer.
 +
 +## Where to start?
 +
 +Thank you for reading through this contribution guide. Hopefully, we will see you again soon on GitHub. There are plenty of [open issues][issues] for you to help with.
 +
 +Feel free to [open an issue][newissue] if you think you found a bug or you have a new idea to improve Hugo. We are happy to hear from you.
 +
 +## Additional References for Learning Git and Go
 +
 +* [Codecademy's Free "Learn Git" Course][codecademy] (Free)
 +* [Code School and GitHub's "Try Git" Tutorial][trygit] (Free)
 +* [The Git Book][gitbook] (Free)
 +* [Go Bootcamp][gobootcamp]
 +* [GitHub Pull Request Tutorial, Thinkful][thinkful]
 +
 +
 +[codecademy]: https://www.codecademy.com/learn/learn-git
 +[contributors]: https://github.com/gohugoio/hugo/graphs/contributors
 +[docscontrib]: /contribute/documentation/
 +[forums]: https://discourse.gohugo.io
 +[gitbook]: https://git-scm.com/
++[gobootcamp]: https://www.golangbootcamp.com/book/get_setup
 +[godl]: https://golang.org/dl/
 +[goinstall]: https://golang.org/doc/install
 +[gvm]: https://github.com/moovweb/gvm
 +[issues]: https://github.com/gohugoio/hugo/issues
 +[newissue]: https://github.com/gohugoio/hugo/issues/new
 +[releases]: /getting-started/
 +[setupgopath]: https://golang.org/doc/code.html#Workspaces
 +[thinkful]: https://www.thinkful.com/learn/github-pull-request-tutorial/
 +[trygit]: https://try.github.io/levels/1/challenges/1
index 87aea23545ac069efbd72feb5f4397472d0240af,0000000000000000000000000000000000000000..b5bd22e07b164e4cfc09cb75a052ec1646959e66
mode 100644,000000..100644
--- /dev/null
@@@ -1,27 -1,0 +1,27 @@@
- ```
- {{anchorize "This is a header"}} → "this-is-a-header"
- {{anchorize "This is also          a header"}} → "this-is-also-a-header"
- {{anchorize "main.go"}} → "main-go"
- {{anchorize "Article 123"}} → "article-123"
- {{anchorize "<- Let's try this, shall we?"}} → "let-s-try-this-shall-we"
- {{anchorize "Hello, 世界"}} → "hello-世界"
 +---
 +title: anchorize
 +description: Takes a string and sanitizes it the same way as the [`defaultMarkdownHandler`](https://gohugo.io/getting-started/configuration-markup#configure-markup) does for markdown headers.
 +date: 2018-10-13
 +categories: [functions]
 +menu:
 +  docs:
 +    parent: "functions"
 +keywords: [markdown,strings]
 +signature: ["anchorize INPUT"]
 +hugoversion: "0.39"
 +workson: []
 +relatedfuncs: [humanize]
 +---
 +
 +If [Goldmark](https://gohugo.io/getting-started/configuration-markup#goldmark) is set as `defaultMarkdownHandler`, the sanitizing logic adheres to the setting [`markup.goldmark.parser.autoHeadingIDType`](https://gohugo.io/getting-started/configuration-markup#goldmark). If [Blackfriday](https://gohugo.io/getting-started/configuration-markup#blackfriday) is set as `defaultMarkdownHandler`, this template function uses the [`SanitizedAnchorName` logic from Blackfriday](https://github.com/russross/blackfriday#sanitized-anchor-names) (the same applies when `markup.goldmark.parser.autoHeadingIDType` is set to `blackfriday`).
 +
 +Since the `defaultMarkdownHandler` and this template function use the same sanitizing logic, you can use the latter to determine the ID of a header for linking with anchor tags.
 +
++```go-html-template
++{{ anchorize "This is a header" }} --> "this-is-a-header"
++{{ anchorize "This is also    a header" }} --> "this-is-also----a-header"
++{{ anchorize "main.go" }} --> "maingo"
++{{ anchorize "Article 123" }} --> "article-123"
++{{ anchorize "<- Let's try this, shall we?" }} --> "--lets-try-this-shall-we"
++{{ anchorize "Hello, 世界" }} --> "hello-世界"
 +```
index 732ffeaddb4d26aa9d7497e752fdff6ef8649c07,0000000000000000000000000000000000000000..3e2fc13ccc35677102a374387014755e153f2f38
mode 100644,000000..100644
--- /dev/null
@@@ -1,38 -1,0 +1,33 @@@
 +---
 +title: append
 +description: "`append` appends one or more values to a slice and returns the resulting slice."
 +date: 2018-09-14
 +categories: [functions]
 +menu:
 +  docs:
 +    parent: "functions"
 +keywords: [collections]
 +signature: ["COLLECTION | append VALUE [VALUE]...", "COLLECTION | append COLLECTION"]
 +workson: []
 +hugoversion: "0.49"
 +relatedfuncs: [last,first,where,slice]
 +aliases: []
 +---
 +
 +An example appending single values:
 +
 +```go-html-template
 +{{ $s := slice "a" "b" "c" }}
 +{{ $s = $s | append "d" "e" }}
 +{{/* $s now contains a []string with elements "a", "b", "c", "d", and "e" */}}
 +
 +```
 +
 +The same example appending a slice to a slice:
 +
 +```go-html-template
 +{{ $s := slice "a" "b" "c" }}
 +{{ $s = $s | append (slice "d" "e") }}
 +```
 +
 +The `append` function works for all types, including `Pages`.
index 3a507c7f98e619d2294df6bb0337782f9103bc45,0000000000000000000000000000000000000000..7550069a54481bdbf79b0759e47f6faaf79896e2
mode 100644,000000..100644
--- /dev/null
@@@ -1,118 -1,0 +1,118 @@@
-     {{ partial "post-tag-link" (index . 0) }}
 +---
 +title: apply
 +description: Given a map, array, or slice, `apply` returns a new slice with a function applied over it.
 +date: 2017-02-01
 +publishdate: 2017-02-01
 +lastmod: 2017-02-01
 +categories: [functions]
 +menu:
 +  docs:
 +    parent: "functions"
 +keywords: [advanced]
 +signature: ["apply COLLECTION FUNCTION [PARAM...]"]
 +workson: []
 +hugoversion:
 +relatedfuncs: []
 +deprecated: false
 +draft: false
 +aliases: []
 +---
 +
 +{{< todo >}}
 +POTENTIAL NEW CONTENT: see apply/sequence discussion: https://discourse.gohugo.io/t/apply-printf-on-a-sequence/5722;
 +{{< /todo >}}
 +
 +`apply` expects at least three parameters, depending on the function being applied.
 +
 +1. The first parameter is the sequence to operate on.
 +2. The second parameter is the name of the function as a string, which must be the name of a valid [Hugo function][functions].
 +3. After that, the parameters to the applied function are provided, with the string `"."` standing in for each element of the sequence the function is to be applied against.
 +
 +Here is an example of a content file with `names:` as a front matter field:
 +
 +```
 ++++
 +names: [ "Derek Perkins", "Joe Bergevin", "Tanner Linsley" ]
 ++++
 +```
 +
 +You can then use `apply` as follows:
 +
 +```
 +{{ apply .Params.names "urlize" "." }}
 +```
 +
 +Which will result in the following:
 +
 +```
 +"derek-perkins", "joe-bergevin", "tanner-linsley"
 +```
 +
 +This is *roughly* equivalent to using the following with [range][]:
 +
 +```
 +{{ range .Params.names }}{{ . | urlize }}{{ end }}
 +```
 +
 +However, it is not possible to provide the output of a range to the [`delimit` function][delimit], so you need to `apply` it.
 +
 +If you have `post-tag-list.html` and `post-tag-link.html` as [partials][], you *could* use the following snippets, respectively:
 +
 +{{< code file="layouts/partials/post-tag-list.html" copy="false" >}}
 +{{ with .Params.tags }}
 +<div class="tags-list">
 +  Tags:
 +  {{ $len := len . }}
 +  {{ if eq $len 1 }}
-       {{ partial "post-tag-link" . }},
++    {{ partial "post-tag-link.html" (index . 0) }}
 +  {{ else }}
 +    {{ $last := sub $len 1 }}
 +    {{ range first $last . }}
-     {{ partial "post-tag-link" (index . $last) }}
++      {{ partial "post-tag-link.html" . }},
 +    {{ end }}
-       {{ $links := apply $sort "partial" "post-tag-link" "." }}
++    {{ partial "post-tag-link.html" (index . $last) }}
 +  {{ end }}
 +</div>
 +{{ end }}
 +{{< /code >}}
 +
 +{{< code file="layouts/partials/post-tag-link.html" copy="false" >}}
 +<a class="post-tag post-tag-{{ . | urlize }}" href="/tags/{{ . | urlize }}">{{ . }}</a>
 +{{< /code >}}
 +
 +This works, but the complexity of `post-tag-list.html` is fairly high. The Hugo template needs to perform special behavior for the case where there’s only one tag, and it has to treat the last tag as special. Additionally, the tag list will be rendered something like `Tags: tag1 , tag2 , tag3` because of the way that the HTML is generated and then interpreted by a browser.
 +
 +This first version of `layouts/partials/post-tag-list.html` separates all of the operations for ease of reading. The combined and DRYer version is shown next:
 +
 +```
 +{{ with .Params.tags }}
 +    <div class="tags-list">
 +      Tags:
 +      {{ $sort := sort . }}
-       {{ delimit (apply (apply (sort .) "partial" "post-tag-link" ".") "chomp" ".") ", " }}
++      {{ $links := apply $sort "partial" "post-tag-link.html" "." }}
 +      {{ $clean := apply $links "chomp" "." }}
 +      {{ delimit $clean ", " }}
 +    </div>
 +{{ end }}
 +```
 +
 +Now in the completed version, you can sort the tags, convert the tags to links with `layouts/partials/post-tag-link.html`, [chomp][] off stray newlines, and join the tags together in a delimited list for presentation. Here is an even DRYer version of the preceding example:
 +
 +{{< code file="layouts/partials/post-tag-list.html" download="post-tag-list.html" >}}
 +    {{ with .Params.tags }}
 +    <div class="tags-list">
 +      Tags:
++      {{ delimit (apply (apply (sort .) "partial" "post-tag-link.html" ".") "chomp" ".") ", " }}
 +    </div>
 +    {{ end }}
 +{{< /code >}}
 +
 +{{% note %}}
 +`apply` does not work when receiving the sequence as an argument through a pipeline.
 +{{% /note %}}
 +
 +[chomp]: /functions/chomp/ "See documentation for the chomp function"
 +[delimit]: /functions/delimit/ "See documentation for the delimit function"
 +[functions]: /functions/ "See the full list of Hugo functions to see what can be passed as an argument to the apply function."
 +[partials]: /templates/partials/
 +[range]: /functions/range/ "Learn the importance of the range function, a fundamental keyword in both Hugo templates and the Go programming language."
index e1a22ef5d6151dafe4576f0e7b691149ab317625,0000000000000000000000000000000000000000..203498cb11d755595ecd1b8ebf999876048995ec
mode 100644,000000..100644
--- /dev/null
@@@ -1,37 -1,0 +1,31 @@@
 +---
 +title: group
 +description: "`group` groups a list of pages."
 +date: 2018-09-14
 +categories: [functions]
 +menu:
 +  docs:
 +    parent: "functions"
 +keywords: [collections]
 +signature: ["PAGES | group KEY"]
 +hugoversion: "0.49"
 +---
 +
 +{{< code file="layouts/partials/groups.html" >}}
 +{{ $new := .Site.RegularPages | first 10 | group "New" }}
 +{{ $old := .Site.RegularPages | last 10 | group "Old" }}
 +{{ $groups := slice $new $old }}
 +{{ range $groups }}
 +<h3>{{ .Key }}{{/* Prints "New", "Old" */}}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +The page group you get from `group` is of the same type you get from the built-in [group methods](/templates/lists#group-content) in Hugo. The above example can even be [paginated](/templates/pagination/#list-paginator-pages).
index 7602a2e343ab4300309e6c808c8f2a3b852f7a87,0000000000000000000000000000000000000000..a495eae0ad56a57a816678ba8fe7e593cdf4fdea
mode 100644,000000..100644
--- /dev/null
@@@ -1,116 -1,0 +1,115 @@@
- lastmod: 2019-01-31
 +---
 +title: hugo
 +linktitle: hugo
 +description: The `hugo` function provides easy access to Hugo-related data.
 +date: 2019-01-31
 +publishdate: 2019-01-31
- Eeach dependency contains:
 +keywords: []
 +categories: [functions]
 +menu:
 +  docs:
 +    parent: "functions"
 +toc:
 +signature: ["hugo"]
 +workson: []
 +hugoversion:
 +relatedfuncs: []
 +deprecated: false
 +draft: false
 +aliases: []
 +---
 +
 +`hugo` returns an instance that contains the following functions:
 +
 +hugo.Generator
 +: `<meta>` tag for the version of Hugo that generated the site. `hugo.Generator` outputs a *complete* HTML tag; e.g. `<meta name="generator" content="Hugo 0.63.2" />`
 +
 +hugo.Version
 +: the current version of the Hugo binary you are using e.g. `0.63.2`
 +
 +
 +`hugo` returns an instance that contains the following functions:
 +
 +hugo.Environment
 +: the current running environment as defined through the `--environment` cli tag
 +
 +hugo.CommitHash
 +: the git commit hash of the current Hugo binary e.g. `0e8bed9ccffba0df554728b46c5bbf6d78ae5247`
 +
 +hugo.BuildDate
 +: the compile date of the current Hugo binary formatted with RFC 3339 e.g. `2002-10-02T10:00:00-05:00`
 +
 +hugo.IsExtended {{< new-in "0.83.0" >}}
 +: whether this is the extended Hugo binary.
 +
 +hugo.IsProduction
 +: returns true if `hugo.Environment` is set to the production environment
 +
 +{{% note "Use the Hugo Generator Tag" %}}
 +We highly recommend using `hugo.Generator` in your website's `<head>`. `hugo.Generator` is included by default in all themes hosted on [themes.gohugo.io](https://themes.gohugo.io). The generator tag allows the Hugo team to track the usage and popularity of Hugo.
 +{{% /note %}}
 +
 +hugo.Deps
 +: See [hugo.Deps](#hugodeps)
 +
 +
 +## hugo.Deps
 +
 +{{< new-in "0.92.0" >}}
 +
 +`hugo.Deps` returns a list of dependencies for a project (either Hugo Modules or local theme components).
 +
-       
++Each dependency contains:
 +
 +Path (string)
 +: Returns the path to this module. This will either be the module path, e.g. "github.com/gohugoio/myshortcodes", or the path below your /theme folder, e.g. "mytheme".
 +
 +Version (string)
 +:  The module version.
-  
++
 +Vendor (bool)
 +: Whether this dependency is vendored.
++
 +Time (time.Time)
 +: Time version was created.
 +
 +Owner
 +: In the dependency tree, this is the first module that defines this module as a dependency.
 +
 +Replace (*Dependency)
 +: Replaced by this dependency.
 +
 +An example table listing the dependencies:
 +
 +```html
 + <h2>Dependencies</h2>
 +<table class="table table-dark">
 +  <thead>
 +    <tr>
 +      <th scope="col">#</th>
 +      <th scope="col">Owner</th>
 +      <th scope="col">Path</th>
 +      <th scope="col">Version</th>
 +      <th scope="col">Time</th>
 +      <th scope="col">Vendor</th>
 +    </tr>
 +  </thead>
 +  <tbody>
 +    {{ range $index, $element := hugo.Deps }}
 +    <tr>
 +      <th scope="row">{{ add $index 1 }}</th>
 +      <td>{{ with $element.Owner }}{{.Path }}{{ end }}</td>
 +      <td>
 +        {{ $element.Path }}
 +        {{ with $element.Replace}}
 +        => {{ .Path }}
 +        {{ end }}
 +      </td>
 +      <td>{{ $element.Version }}</td>
 +      <td>{{ with $element.Time }}{{ . }}{{ end }}</td>
 +      <td>{{ $element.Vendor }}</td>
 +    </tr>
 +    {{ end }}
 +  </tbody>
 +</table>
 +```
index 71eefb0136ba22219c60d8d1fb7ad696bf39465c,0000000000000000000000000000000000000000..af98c44f4f3e9ae2beb2bcb4afb9b3bd8f7f959a
mode 100644,000000..100644
--- /dev/null
@@@ -1,50 -1,0 +1,49 @@@
- lastmod: 2017-02-01
 +---
 +title: relURL
 +description: Creates a baseURL-relative URL.
 +date: 2017-02-01
 +publishdate: 2017-02-01
-     "@context" : "http://schema.org",
 +categories: [functions]
 +menu:
 +  docs:
 +    parent: "functions"
 +keywords: [urls]
 +signature: ["relURL INPUT"]
 +workson: []
 +hugoversion:
 +relatedfuncs: [absURL]
 +deprecated: false
 +aliases: []
 +---
 +
 +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 }} → "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/"
 +```
 +
 +The last two examples may look strange but can be very useful. For example, the following shows how to use `absURL` in [JSON-LD structured data for SEO][jsonld] where some of your images for a piece of content may or may not be hosted locally:
 +
 +{{< code file="layouts/partials/schemaorg-metadata.html" download="schemaorg-metadata.html" >}}
 +<script type="application/ld+json">
 +{
- [jsonld]: https://developers.google.com/search/docs/guides/intro-structured-data
++    "@context" : "https://schema.org",
 +    "@type" : "BlogPosting",
 +    "image" : {{ apply .Params.images "absURL" "." }}
 +}
 +</script>
 +{{< /code >}}
 +
 +The above uses the [apply function][] and also exposes how the Go template parser JSON-encodes objects inside `<script>` tags. See [the safeJS template function][safejs] for examples of how to tell Hugo not to escape strings inside of such tags.
 +
 +{{% note "Ending Slash" %}}
 +`absURL` and `relURL` are smart about missing slashes, but they will *not* add a closing slash to a URL if it is not present.
 +{{% /note %}}
 +
 +[apply function]: /functions/apply/
 +[configuration]: /getting-started/configuration/
++[jsonld]: https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data
 +[safejs]: /functions/safejs
index 40f7043b6323dcdb58c4aee82ebb57c92e63b64c,0000000000000000000000000000000000000000..f666a784325461606f38e30665cce4d9ef5b4a55
mode 100644,000000..100644
--- /dev/null
@@@ -1,29 -1,0 +1,29 @@@
- `{{ "aaabaab" | strings.Count "a" }}`|5
- `{{ "aaabaab" | strings.Count "aa" }}`|2
- `{{ "aaabaab" | strings.Count "aaa" }}`|1
- `{{ "aaabaab" | strings.Count "" }}`|8
 +---
 +title: strings.Count
 +description: Returns the number of non-overlapping instances of a substring within a string.
 +date: 2020-09-07
 +publishdate: 2020-09-07
 +lastmod: 2020-09-07
 +categories: [functions]
 +menu:
 +  docs:
 +    parent: "functions"
 +keywords: [count, counting, character count]
 +signature: ["strings.Count SUBSTR STRING"]
 +workson: []
 +hugoversion:
 +relatedfuncs: []
 +deprecated: false
 +aliases: []
 +---
 +
 +{{< new-in "0.74.0" >}}
 +
 +If `SUBSTR` is an empty string, this function returns 1 plus the number of Unicode code points in `STRING`.
 +
 +Example|Result
 +:--|:--
++`{{ "aaabaab" \| strings.Count "a" }}`|5
++`{{ "aaabaab" \| strings.Count "aa" }}`|2
++`{{ "aaabaab" \| strings.Count "aaa" }}`|1
++`{{ "aaabaab" \| strings.Count "" }}`|8
index e19bbe47fb65d12918cf93836cc7723d7b32dfc5,0000000000000000000000000000000000000000..b323ba46459ec23e7a1e0ff9eaac34e55fc1975d
mode 100644,000000..100644
--- /dev/null
@@@ -1,237 -1,0 +1,123 @@@
- {{< new-in "0.62.0" >}}
 +---
 +title: Configure Markup
 +description: How to handle Markdown and other markup related configuration.
 +date: 2019-11-15
 +categories: [getting started,fundamentals]
 +keywords: [configuration,highlighting]
 +weight: 65
 +sections_weight: 65
 +slug: configuration-markup
 +toc: true
 +---
 +
 +## Configure Markup
 +
 +{{< new-in "0.60.0" >}}
 +
 +See [Goldmark](#goldmark) for settings related to the default Markdown handler in Hugo.
 +
 +Below are all markup related configuration in Hugo with their default settings:
 +
 +{{< code-toggle config="markup" />}}
 +
 +**See each section below for details.**
 +
 +### Goldmark
 +
 +[Goldmark](https://github.com/yuin/goldmark/) is from Hugo 0.60 the default library used for Markdown. It's fast, it's [CommonMark](https://spec.commonmark.org/0.29/) compliant and it's very flexible. Note that the feature set of Goldmark vs Blackfriday isn't the same; you gain a lot but also lose some, but we will work to bridge any gap in the upcoming Hugo versions.
 +
 +This is the default configuration:
 +
 +{{< code-toggle config="markup.goldmark" />}}
 +
 +For details on the extensions, refer to [this section](https://github.com/yuin/goldmark/#built-in-extensions) of the Goldmark documentation
 +
 +Some settings explained:
 +
 +unsafe
 +: By default, Goldmark does not render raw HTMLs and potentially dangerous links. If you have lots of inline HTML and/or JavaScript, you may need to turn this on.
 +
 +typographer
 +: This extension substitutes punctuations with typographic entities like [smartypants](https://daringfireball.net/projects/smartypants/).
 +
 +attribute
 +: Enable custom attribute support for titles and blocks by adding attribute lists inside single curly brackets (`{.myclass class="class1 class2" }`) and placing it _after the Markdown element it decorates_, on the same line for titles and on a new line directly below for blocks.
 +
 +{{< new-in "0.81.0" >}} In Hugo 0.81.0 we added support for adding attributes (e.g. CSS classes) to Markdown blocks, e.g. tables, lists, paragraphs etc.
 +
 +A blockquote with a CSS class:
 +
 +```md
 +> foo
 +> bar
 +{.myclass}
 +```
 +
 +There are some current limitations: For tables you can currently only apply it to the full table, and for lists the `ul`/`ol`-nodes only, e.g.:
 +
 +```md
 +* Fruit
 +  * Apple
 +  * Orange
 +  * Banana
 +  {.fruits}
 +* Dairy
 +  * Milk
 +  * Cheese
 +  {.dairies}
 +{.list}
 +```
 +
 +Note that attributes in [code fences](/content-management/syntax-highlighting/#highlighting-in-code-fences) must come after the opening tag, with any other highlighting processing instruction, e.g.:
 +
 +````
 +```go {.myclass linenos=table,hl_lines=[8,"15-17"],linenostart=199}
 +// ... code
 +```
 +````
 +
 +autoHeadingIDType ("github") {{< new-in "0.62.2" >}}
 +: The strategy used for creating auto IDs (anchor names). Available types are `github`, `github-ascii` and `blackfriday`. `github` produces GitHub-compatible IDs, `github-ascii` will drop any non-Ascii characters after accent normalization, and `blackfriday` will make the IDs work as with [Blackfriday](#blackfriday), the default Markdown engine before Hugo 0.60. Note that if Goldmark is your default Markdown engine, this is also the strategy used in the [anchorize](/functions/anchorize/) template func.
 +
 +### Blackfriday
 +
 +
 +[Blackfriday](https://github.com/russross/blackfriday) was Hugo's default Markdown rendering engine, now replaced with Goldmark. But you can still use it: Just set `defaultMarkdownHandler` to `blackfriday` in your top level `markup` config.
 +
 +This is the default config:
 +
 +{{< code-toggle config="markup.blackFriday" />}}
 +
 +### Highlight
 +
 +This is the default `highlight` configuration. Note that some of these settings can be set per code block, see [Syntax Highlighting](/content-management/syntax-highlighting/).
 +
 +{{< code-toggle config="markup.highlight" />}}
 +
 +For `style`, see these galleries:
 +
 +* [Short snippets](https://xyproto.github.io/splash/docs/all.html)
 +* [Long snippets](https://xyproto.github.io/splash/docs/longer/all.html)
 +
 +For CSS, see [Generate Syntax Highlighter CSS](/content-management/syntax-highlighting/#generate-syntax-highlighter-css).
 +
 +### Table Of Contents
 +
 +{{< code-toggle config="markup.tableOfContents" />}}
 +
 +These settings only works for the Goldmark renderer:
 +
 +startLevel
 +: The heading level, values starting at 1 (`h1`), to start render the table of contents.
 +
 +endLevel
 +: The heading level, inclusive, to stop render the table of contents.
 +
 +ordered
 +: Whether or not to generate an ordered list instead of an unordered list.
 +
 +
 +## Markdown Render Hooks
 +
- Note that this is only supported with the [Goldmark](#goldmark) renderer.
- Render Hooks allow custom templates to override markdown rendering functionality. You can do this by creating templates with base names `render-{feature}` in `layouts/_default/_markup`.
- You can also create type/section specific hooks in `layouts/[type/section]/_markup`, e.g.: `layouts/blog/_markup`.{{< new-in "0.71.0" >}}
- The features currently supported are:
- * `image`
- * `link`
- * `heading` {{< new-in "0.71.0" >}}
- You can define [Output-Format-](/templates/output-formats) and [language-](/content-management/multilingual/)specific templates if needed. Your `layouts` folder may look like this:
- ```bash
- layouts
- └── _default
-     └── _markup
-         ├── render-image.html
-         ├── render-image.rss.xml
-         └── render-link.html
- ```
- Some use cases for the above:
- * Resolve link references using `.GetPage`. This would make links portable as you could translate `./my-post.md` (and similar constructs that would work on GitHub) into `/blog/2019/01/01/my-post/` etc.
- * Add `target=_blank` to external links.
- * Resolve and [process](/content-management/image-processing/) images.
- * Add [header links](https://remysharp.com/2014/08/08/automatic-permalinks-for-blog-posts).
- ### Render Hook Templates
- The `render-link` and `render-image` templates will receive this context:
- Page
- : The [Page](/variables/page/) being rendered.
- Destination
- : The URL.
- Title
- : The title attribute.
- Text
- : The rendered (HTML) link text.
- PlainText
- : The plain variant of the above.
- The `render-heading` template will receive this context:
- Page
- : The [Page](/variables/page/) being rendered.
- Level
- : The header level (1--6)
- Anchor
- : An auto-generated html id unique to the header within the page
- Text
- : The rendered (HTML) text.
- PlainText
- : The plain variant of the above.
- Attributes (map) {{< new-in "0.82.0" >}}
- : A map of attributes (e.g. `id`, `class`)
- #### Link with title Markdown example:
- ```md
- [Text](https://www.gohugo.io "Title")
- ```
- Here is a code example for how the render-link.html template could look:
- {{< code file="layouts/_default/_markup/render-link.html" >}}
- <a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>
- {{< /code >}}
- #### Image Markdown example:
- ```md
- ![Text](https://d33wubrfki0l68.cloudfront.net/c38c7334cc3f23585738e40334284fddcaf03d5e/2e17c/images/hugo-logo-wide.svg "Title")
- ```
- Here is a code example for how the render-image.html template could look:
- {{< code file="layouts/_default/_markup/render-image.html" >}}
- <p class="md__image">
-   <img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
- </p>
- {{< /code >}}
- #### Heading link example
- Given this template file
- {{< code file="layouts/_default/_markup/render-heading.html" >}}
- <h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }} <a href="#{{ .Anchor | safeURL }}">¶</a></h{{ .Level }}>
- {{< /code >}}
- And this markdown
- ```md
- ### Section A
- ```
- The rendered html will be
- ```html
- <h3 id="section-a">Section A <a href="#section-a">¶</a></h3>
- ```
++See [Markdown Render Hooks](/templates/render-hooks/).
 +
index 2123558d91f191d017422d281cad3f1cb247d275,0000000000000000000000000000000000000000..aed0ea100612351eeed1a8f0d34566cf49521d0d
mode 100644,000000..100644
--- /dev/null
@@@ -1,740 -1,0 +1,756 @@@
 +---
 +title: Configure Hugo
 +linktitle: Configuration
 +description: How to configure your Hugo site.
 +date: 2013-07-01
 +publishdate: 2017-01-02
 +lastmod: 2017-03-05
 +categories: [getting started,fundamentals]
 +keywords: [configuration,toml,yaml,json]
 +menu:
 +  docs:
 +    parent: "getting-started"
 +    weight: 60
 +weight: 60
 +sections_weight: 60
 +draft: false
 +aliases: [/overview/source-directory/,/overview/configuration/]
 +toc: true
 +---
 +
 +
 +## Configuration File
 +
 +Hugo uses the `config.toml`, `config.yaml`, or `config.json` (if found in the
 +site root) as the default site config file.
 +
 +The user can choose to override that default with one or more site config files
 +using the command line `--config` switch.
 +
 +Examples:
 +
 +```
 +hugo --config debugconfig.toml
 +hugo --config a.toml,b.toml,c.toml
 +```
 +
 +{{% note %}}
 +Multiple site config files can be specified as a comma-separated string to the `--config` switch.
 +{{% /note %}}
 +
 +{{< todo >}}TODO: distinct config.toml and others (the root object files){{< /todo >}}
 +
 +## Configuration Directory
 +
 +In addition to using a single site config file, one can use the `configDir` directory (default to `config/`) to maintain easier organization and environment specific settings.
 +
 +- Each file represents a configuration root object, such as `params.toml` for `[Params]`, `menu(s).toml` for `[Menu]`, `languages.toml` for `[Languages]` etc...
 +- Each file's content must be top-level, for example:
 +  
 +{{< code-toggle file="config" >}}
 +[Params]
 +  foo = "bar"
 +{{< /code-toggle >}}
 +
 +{{< code-toggle file="params" >}}
 +foo = "bar"
 +{{< /code-toggle >}}
 +
 +- Each directory holds a group of files containing settings unique to an environment.
 +- Files can be localized to become language specific.
 +
 +
 +```
 +├── config
 +│   ├── _default
 +│   │   ├── config.toml
 +│   │   ├── languages.toml
 +│   │   ├── menus.en.toml
 +│   │   ├── menus.zh.toml
 +│   │   └── params.toml
 +│   ├── production
 +│   │   ├── config.toml
 +│   │   └── params.toml
 +│   └── staging
 +│       ├── config.toml
 +│       └── params.toml
 +```
 +
 +Considering the structure above, when running `hugo --environment staging`, Hugo will use every settings from `config/_default` and merge `staging`'s on top of those.
 +{{% note %}}
 +Default environments are __development__ with `hugo server` and __production__ with `hugo`.
 +{{%/ note %}}
 +
 +## Merge Configuration from Themes
 +
 +{{< new-in "0.84.0" >}} The configuration merge described below was improved in Hugo 0.84.0 and made fully configurable. The big change/improvement was that we now, by default, do deep merging of `params` maps from themes.
 +
 +The configuration value for `_merge` can be one of:
 +
 +none
 +: No merge.
 +
 +shallow
 +: Only add values for new keys.
 +
 +deep
 +: Add values for new keys, merge existing.
 +
 +Note that you don't need to be so verbose as in the default setup below; a `_merge` value higher up will be inherited if not set.
 +
 +{{< code-toggle config="mergeStrategy" skipHeader=true />}}
 +
 +## All Configuration Settings
 +
 +The following is the full list of Hugo-defined variables with their default
 +value in parentheses. Users may choose to override those values in their site
 +config file(s).
 +
 +### archetypeDir 
 +
 +**Default value:** "archetypes"
 +
 +The directory where Hugo finds archetype files (content templates). {{% module-mounts-note %}}
 +
 +### assetDir
 +
 +**Default value:** "assets"
 +
 +The directory where Hugo finds asset files used in [Hugo Pipes](/hugo-pipes/). {{% module-mounts-note %}}
 +
 +### baseURL
 +Hostname (and path) to the root, e.g. https://bep.is/
 +
 +### blackfriday
 +See [Configure Blackfriday](/getting-started/configuration-markup#blackfriday)
 +
 +### build
 +See [Configure Build](#configure-build)
 +
 +### buildDrafts (false)
 +
 +**Default value:** false
 +
 +Include drafts when building.
 +
 +### buildExpired
 +
 +**Default value:** false
 +
 +Include content already expired.
 +
 +### buildFuture
 +
 +**Default value:** false
 +
 +Include content with publishdate in the future.
 +
 +### caches
 +See [Configure File Caches](#configure-file-caches)
 +
 +### cascade
 +
 +{{< new-in "0.86.0" >}}
 +
 +Pass down down default configuration values (front matter) to pages in the content tree. The options in site config is the same as in page front matter, see [Front Matter Cascade](/content-management/front-matter#front-matter-cascade).
 +
 +### canonifyURLs
 +
 +**Default value:** false
 +
 +Enable to turn relative URLs into absolute.
 +
 +### contentDir
 +
 +**Default value:** "content"
 +
 +The directory from where Hugo reads content files. {{% module-mounts-note %}}
 +
 +### copyright
 +
 +**Default value:** ""
 +
 +Copyright notice for your site, typically displayed in the footer.
 +
 +### dataDir
 +
 +**Default value:** "data"
 +
 +The directory from where Hugo reads data files. {{% module-mounts-note %}}
 +
 +### defaultContentLanguage
 +
 +**Default value:** "en"
 +
 +Content without language indicator will default to this language.
 +
 +### defaultContentLanguageInSubdir
 +
 +**Default value:**  false
 +
 +Render the default content language in subdir, e.g. `content/en/`. The site root `/` will then redirect to `/en/`.
 +
 +### disableAliases
 +
 +**Default value:**  false
 +
 +Will disable generation of alias redirects. Note that even if `disableAliases` is set, the aliases themselves are preserved on the page. The motivation with this is to be able to generate 301 redirects in an `.htaccess`, a Netlify `_redirects` file or similar using a custom output format.
 +
 +### disableHugoGeneratorInject
 +
 +**Default value:**  false
 +
 +Hugo will, by default, inject a generator meta tag in the HTML head on the _home page only_. You can turn it off, but we would really appreciate if you don't, as this is a good way to watch Hugo's popularity on the rise.
 +
 +### disableKinds
 +
 +**Default value:**  []
 +
 +Enable disabling of all pages of the specified *Kinds*. Allowed values in this list: `"page"`, `"home"`, `"section"`, `"taxonomy"`, `"term"`, `"RSS"`, `"sitemap"`, `"robotsTXT"`, `"404"`.
 +
 +### disableLiveReload
 +
 +**Default value:**  false
 +
 +Disable automatic live reloading of browser window.
 +
 +### disablePathToLower
 +
 +**Default value:**  false
 +
 +: Do not convert the url/path to lowercase.
 +
 +### enableEmoji 
 +
 +**Default value:**  false
 +
 +Enable Emoji emoticons support for page content; see the [Emoji Cheat Sheet](https://www.webpagefx.com/tools/emoji-cheat-sheet/).
 +
 +### enableGitInfo
 +
 +**Default value:**  false
 +
 +Enable `.GitInfo` object for each page (if the Hugo site is versioned by Git). This will then update the `Lastmod` parameter for each page using the last git commit date for that content file.
 +
 +### enableInlineShortcodes
 +
 +**Default value:**  false
 +
 +Enable inline shortcode support. See [Inline Shortcodes](/templates/shortcode-templates/#inline-shortcodes).
 +
 +### enableMissingTranslationPlaceholders
 +
 +**Default value:**  false
 +
 +Show a placeholder instead of the default value or an empty string if a translation is missing.
 +
 +### enableRobotsTXT
 +
 +**Default value:**  false
 +
 +Enable generation of `robots.txt` file.
 +
 +### frontmatter
 +
 +See [Front matter Configuration](#configure-front-matter).
 +
 +### footnoteAnchorPrefix
 +
 +**Default value:**  ""
 +
 +Prefix for footnote anchors.
 +
 +###  footnoteReturnLinkContents
 +
 +**Default value:**  ""
 +
 +Text to display for footnote return links.
 +
 +### googleAnalytics
 +
 +**Default value:**  ""
 +
 +Google Analytics tracking ID.
 +
 +### hasCJKLanguage
 +
 +**Default value:** false
 +
 +If true, auto-detect Chinese/Japanese/Korean Languages in the content. This will make `.Summary` and `.WordCount` behave correctly for CJK languages.
 +
 +### imaging
 +See [Image Processing Config](/content-management/image-processing/#image-processing-config).
 +
 +### languageCode
 +
 +**Default value:**  ""
 +
 +A language tag as defined by [RFC 5646](https://datatracker.ietf.org/doc/html/rfc5646). The internal [RSS template](https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml) populates its `<language>` element with this value. The value is not used elsewhere.
 +
 +### languages
 +See [Configure Languages](/content-management/multilingual/#configure-languages).
 +
 +### disableLanguages
 +
 +See [Disable a Language](/content-management/multilingual/#disable-a-language)
 +
 +### markup
 +See [Configure Markup](/getting-started/configuration-markup).{{< new-in "0.60.0" >}}
 +
 +### mediaTypes
 +See [Configure Media Types](/templates/output-formats/#media-types).
 +
 +### menus
 +See [Add Non-content Entries to a Menu](/content-management/menus/#add-non-content-entries-to-a-menu).
 +
 +### minify
 +See [Configure Minify](#configure-minify)
 +
 +### module
 +Module config see [Module Config](/hugo-modules/configuration/).{{< new-in "0.56.0" >}}
 +
 +### newContentEditor
++
++**Default value:** ""
++
 +The editor to use when creating new content.
 +
 +### noChmod
++
++**Default value:** false
++
 +Don't sync permission mode of files.
 +
 +### noTimes
++
++**Default value:** false
++
 +Don't sync modification time of files.
 +
 +### outputFormats
 +See [Configure Output Formats](#configure-additional-output-formats).
 +
 +### paginate 
 +
 +**Default value:** 10
 +
 +Default number of elements per page in [pagination](/templates/pagination/).
 +
 +### paginatePath
 +
 +**Default value:** "page"
 +
 +The path element used during pagination (`https://example.com/page/2`).
 +
 +### permalinks
 +See [Content Management](/content-management/urls/#permalinks).
 +
 +### pluralizeListTitles
 +
 +**Default value:** true
 +
 +Pluralize titles in lists.
 +
 +### publishDir
 +
 +**Default value:** "public"
 +
 +The directory to where Hugo will write the final static site (the HTML files etc.).
 +
 +### related
 +: See [Related Content](/content-management/related/#configure-related-content).{{< new-in "0.27" >}}
 +
 +### relativeURLs 
++
++**Default value:** false
++
 +Enable this to make all relative URLs relative to content root. Note that this does not affect absolute URLs.
 +
 +### refLinksErrorLevel
 +
 +**Default value:** "ERROR"
 +
 +When using `ref` or `relref` to resolve page links and a link cannot resolved, it will be logged with this log level. Valid values are `ERROR` (default) or `WARNING`. Any `ERROR` will fail the build (`exit -1`).
 +
 +### refLinksNotFoundURL
 +URL to be used as a placeholder when a page reference cannot be found in `ref` or `relref`. Is used as-is.
 +
 +### removePathAccents
 +
 +**Default value:** false
 +
 +Removes [non-spacing marks](https://www.compart.com/en/unicode/category/Mn) from [composite characters](https://en.wikipedia.org/wiki/Precomposed_character) in content paths.
 +
 +```text
 +content/post/hügó.md --> https://example.org/post/hugo/
 +```
 +
 +
 +### rssLimit
 +
++**Default value:** -1 (unlimited)
++
 +Maximum number of items in the RSS feed.
 +
 +### sectionPagesMenu
 +See ["Section Menu for Lazy Bloggers"](/templates/menu-templates/#section-menu-for-lazy-bloggers).
 +
 +### security
 +
 +See [Security Policy](/about/security-model/#security-policy)
 +
 +### sitemap
 +Default [sitemap configuration](/templates/sitemap-template/#configure-sitemapxml).
 +
 +### summaryLength
 +
 +**Default value:** 70
 +
 +The length of text in words to show in a [`.Summary`](/content-management/summaries/#hugo-defined-automatic-summary-splitting).
 +
 +### taxonomies
 +See [Configure Taxonomies](/content-management/taxonomies#configure-taxonomies).
 +
 +### theme
 +: See [Module Config](/hugo-modules/configuration/#module-config-imports) for how to import a theme.
 +
 +### themesDir
 +
 +**Default value:**  "themes"
 +
 +The directory where Hugo reads the themes from.
 +
 +### timeout 
 +
 +**Default value:** "30s"
 +
 +Timeout for generating page contents, specified as a [duration](https://pkg.go.dev/time#Duration) or in milliseconds. *Note:*&nbsp;this is used to bail out of recursive content generation. You might need to raise this limit if your pages are slow to generate (e.g., because they require large image processing or depend on remote contents).
 +
 +### timeZone 
 +
 +{{< new-in "0.87.0" >}}
 +
 +The time zone (or location), e.g. `Europe/Oslo`,  used to parse front matter dates without such information and in the [`time` function](/functions/time/). The list of valid values may be system dependent, but should include `UTC`, `Local`, and any location in the [IANA Time Zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
 +
 +### title
 +Site title.
 +
 +### titleCaseStyle
 +
 +**Default value:**  "AP"
 +
 +See [Configure Title Case](#configure-title-case)
 +
 +### uglyURLs
 +When enabled, creates URL of the form `/filename.html` instead of `/filename/`.
 +
 +### watch
 +
++**Default value:** false
++
 +Watch filesystem for changes and recreate as needed.
 +
 +{{% note %}}
 +If you are developing your site on a \*nix machine, here is a handy shortcut for finding a configuration option from the command line:
 +```
 +cd ~/sites/yourhugosite
 +hugo config | grep emoji
 +```
 +
 +which shows output like
 +
 +```
 +enableemoji: true
 +```
 +{{% /note %}}
 +
 +## Configure Build
 +
 +{{< new-in "0.66.0" >}}
 +
 +The `build` configuration section contains global build-related configuration options.
 +
 +{{< code-toggle file="config">}}
 +[build]
 +useResourceCacheWhen="fallback"
 +writeStats = false
 +noJSConfigInAssets = false
 +{{< /code-toggle >}}
 +
 +
 +useResourceCacheWhen
 +: When to use the cached resources in `/resources/_gen` for PostCSS and ToCSS. Valid values are `never`, `always` and `fallback`. The last value means that the cache will be tried if PostCSS/extended version is not available.
 +
 +writeStats {{< new-in "0.69.0" >}}
 +: When enabled, a file named `hugo_stats.json` will be written to your project root with some aggregated data about the build, e.g. list of HTML entities published to be used to do [CSS pruning](/hugo-pipes/postprocess/#css-purging-with-postcss). If you're only using this for the production build, you should consider placing it below [config/production](/getting-started/configuration/#configuration-directory). It's also worth mentioning that, due to the nature of the partial server builds, new HTML entities will be added when you add or change them while the server is running, but the old values will not be removed until you restart the server or run a regular `hugo` build.
 +
 +**Note** that the prime use case for this is purging of unused CSS; it is build for speed and there may be false positives (e.g. elements that isn't really a HTML element).
 +
 +noJSConfigInAssets {{< new-in "0.78.0" >}}
 +: Turn off writing a `jsconfig.json` into your `/assets` folder with mapping of imports from running [js.Build](https://gohugo.io/hugo-pipes/js). This file is intended to help with intellisense/navigation inside code editors such as [VS Code](https://code.visualstudio.com/). Note that if you do not use `js.Build`, no file will be written.
 +
 +## Configure Server
 +
 +{{< new-in "0.67.0" >}}
 +
 +This is only relevant when running `hugo server`, and it allows to set HTTP headers during development, which allows you to test out your Content Security Policy and similar. The configuration format matches [Netlify's](https://docs.netlify.com/routing/headers/#syntax-for-the-netlify-configuration-file) with slightly more powerful [Glob matching](https://github.com/gobwas/glob):
 +
 +
 +{{< code-toggle file="config">}}
 +[server]
 +[[server.headers]]
 +for = "/**"
 +
 +[server.headers.values]
 +X-Frame-Options = "DENY"
 +X-XSS-Protection = "1; mode=block"
 +X-Content-Type-Options = "nosniff"
 +Referrer-Policy = "strict-origin-when-cross-origin"
 +Content-Security-Policy = "script-src localhost:1313"
 +{{< /code-toggle >}}
 +
 +Since this is is "development only", it may make sense to put it below the `development` environment:
 +
 +
 +{{< code-toggle file="config/development/server">}}
 +[[headers]]
 +for = "/**"
 +
 +[headers.values]
 +X-Frame-Options = "DENY"
 +X-XSS-Protection = "1; mode=block"
 +X-Content-Type-Options = "nosniff"
 +Referrer-Policy = "strict-origin-when-cross-origin"
 +Content-Security-Policy = "script-src localhost:1313"
 +{{< /code-toggle >}}
 +
 +
 +{{< new-in "0.72.0" >}}
 +
 +You can also specify simple redirects rules for the server. The syntax is again similar to Netlify's. 
 +
 +Note that a `status` code of 200 will trigger a [URL rewrite](https://docs.netlify.com/routing/redirects/rewrites-proxies/), which is what you want in SPA situations, e.g:
 +
 +{{< code-toggle file="config/development/server">}}
 +[[redirects]]
 +from = "/myspa/**"
 +to = "/myspa/"
 +status = 200
 +force = false
 +{{< /code-toggle >}}
 +
 +{{< new-in "0.76.0" >}} Setting `force=true` will make a redirect even if there is existing content in the path. Note that before Hugo 0.76  `force` was the default behaviour, but this is inline with how Netlify does it.
 +
 +## Configure Title Case
 +
 +Set `titleCaseStyle` to specify the title style used by the [title](/functions/title/) template function and the automatic section titles in Hugo. It defaults to [AP Stylebook](https://www.apstylebook.com/) for title casing, but you can also set it to `Chicago` or `Go` (every word starts with a capital letter).
 +
 +## Configuration Environment Variables
 +
 +HUGO_NUMWORKERMULTIPLIER
 +: Can be set to increase or reduce the number of workers used in parallel processing in Hugo. If not set, the number of logical CPUs will be used.
 +
 +## Configuration Lookup Order
 +
 +Similar to the template [lookup order][], Hugo has a default set of rules for searching for a configuration file in the root of your website's source directory as a default behavior:
 +
 +1. `./config.toml`
 +2. `./config.yaml`
 +3. `./config.json`
 +
 +In your `config` file, you can direct Hugo as to how you want your website rendered, control your website's menus, and arbitrarily define site-wide parameters specific to your project.
 +
 +
 +## Example Configuration
 +
 +The following is a typical example of a configuration file. The values nested under `params:` will populate the [`.Site.Params`][] variable for use in [templates][]:
 +
 +{{< code-toggle file="config">}}
 +baseURL: "https://yoursite.example.com/"
 +title: "My Hugo Site"
 +footnoteReturnLinkContents: "↩"
 +permalinks:
 +  posts: /:year/:month/:title/
 +params:
 +  Subtitle: "Hugo is Absurdly Fast!"
 +  AuthorName: "Jon Doe"
 +  GitHubUser: "spf13"
 +  ListOfFoo:
 +    - "foo1"
 +    - "foo2"
 +  SidebarRecentLimit: 5
 +{{< /code-toggle >}}
 +
 +## Configure with Environment Variables
 +
 +In addition to the 3 config options already mentioned, configuration key-values can be defined through operating system environment variables.
 +
 +For example, the following command will effectively set a website's title on Unix-like systems:
 +
 +```
 +$ env HUGO_TITLE="Some Title" hugo
 +```
 +
 +This is really useful if you use a service such as Netlify to deploy your site. Look at the Hugo docs [Netlify configuration file](https://github.com/gohugoio/hugoDocs/blob/master/netlify.toml) for an example.
 +
 +{{% note "Setting Environment Variables" %}}
 +Names must be prefixed with `HUGO_` and the configuration key must be set in uppercase when setting operating system environment variables.
 +
 +To set config params, prefix the name with `HUGO_PARAMS_`
 +{{% /note %}}
 +
 +{{< new-in "0.79.0" >}} If you are using snake_cased variable names, the above will not work, so since Hugo 0.79.0 Hugo determines the delimiter to use by the first character after `HUGO`. This allows you to define environment variables on the form `HUGOxPARAMSxAPI_KEY=abcdefgh`, using any [allowed](https://stackoverflow.com/questions/2821043/allowed-characters-in-linux-environment-variable-names#:~:text=So%20names%20may%20contain%20any,not%20begin%20with%20a%20digit.) delimiter.
 +
 +{{< todo >}}
 +Test and document setting params via JSON env var.
 +{{< /todo >}}
 +
 +## Ignore Content and Data Files when Rendering
 +
 +To exclude specific files from the `content` and `data` directories when rendering your site, set `ignoreFiles` to one or more regular expressions to match against the absolute file path.
 +
 +To ignore files ending with `.foo` or `.boo`:
 +
 +{{< code-toggle copy="false" >}}
 +ignoreFiles = ['\.foo$', '\.boo$']
 +{{< /code-toggle >}}
 +
 +To ignore a file using the absolute file path:
 +
 +{{< code-toggle copy="false" >}}
 +ignoreFiles = ['^/home/user/project/content/test\.md$']
 +{{< /code-toggle >}}
 +
 +## Configure Front Matter
 +
 +### Configure Dates
 +
 +Dates are important in Hugo, and you can configure how Hugo assigns dates to your content pages. You do this by adding a `frontmatter` section to your `config.toml`.
 +
 +
 +The default configuration is:
 +
 +{{< code-toggle file="config" >}}
 +[frontmatter]
 +date = ["date", "publishDate", "lastmod"]
 +lastmod = [":git", "lastmod", "date", "publishDate"]
 +publishDate = ["publishDate", "date"]
 +expiryDate = ["expiryDate"]
 +{{< /code-toggle >}}
 +
 +If you, as an example, have a non-standard date parameter in some of your content, you can override the setting for `date`:
 +
 +{{< code-toggle file="config" >}}
 +[frontmatter]
 +date = ["myDate", ":default"]
 +{{< /code-toggle >}}
 +
 +The `:default` is a shortcut to the default settings. The above will set `.Date` to the date value in `myDate` if present, if not we will look in `date`,`publishDate`, `lastmod` and pick the first valid date.
 +
 +In the list to the right, values starting with ":" are date handlers with a special meaning (see below). The others are just names of date parameters (case insensitive) in your front matter configuration.  Also note that Hugo have some built-in aliases to the above: `lastmod` => `modified`, `publishDate` => `pubdate`, `published` and `expiryDate` => `unpublishdate`. With that, as an example, using `pubDate` as a date in front matter, will, by default, be assigned to `.PublishDate`.
 +
 +The special date handlers are:
 +
 +
 +`:fileModTime`
 +: Fetches the date from the content file's last modification timestamp.
 +
 +An example:
 +
 +{{< code-toggle file="config" >}}
 +[frontmatter]
 +lastmod = ["lastmod", ":fileModTime", ":default"]
 +{{< /code-toggle >}}
 +
 +
 +The above will try first to extract the value for `.Lastmod` starting with the `lastmod` front matter parameter, then the content file's modification timestamp. The last, `:default` should not be needed here, but Hugo will finally look for a valid date in `:git`, `date` and then `publishDate`.
 +
 +
 +`:filename`
 +: Fetches the date from the content file's filename. For example, `2018-02-22-mypage.md` will extract the date `2018-02-22`. Also, if `slug` is not set, `mypage` will be used as the value for `.Slug`.
 +
 +An example:
 +
 +{{< code-toggle file="config" >}}
 +[frontmatter]
 +date  = [":filename", ":default"]
 +{{< /code-toggle >}}
 +
 +The above will try first to extract the value for `.Date` from the filename, then it will look in front matter parameters `date`, `publishDate` and lastly `lastmod`.
 +
 +
 +`:git`
 +: This is the Git author date for the last revision of this content file. This will only be set if `--enableGitInfo` is set or `enableGitInfo = true` is set in site config.
 +
 +## Configure Additional Output Formats
 +
 +Hugo v0.20 introduced the ability to render your content to multiple output formats (e.g., to JSON, AMP html, or CSV). See [Output Formats][] for information on how to add these values to your Hugo project's configuration file.
 +
 +## Configure Minify
 +
 +{{< new-in "0.68.0" >}}
 +
 +Default configuration:
 +
 +{{< code-toggle config="minify" />}}
 +
 +## Configure File Caches
 +
 +Since Hugo 0.52 you can configure more than just the `cacheDir`. This is the default configuration:
 +
 +{{< code-toggle >}}
 +[caches]
 +[caches.getjson]
 +dir = ":cacheDir/:project"
 +maxAge = -1
 +[caches.getcsv]
 +dir = ":cacheDir/:project"
 +maxAge = -1
 +[caches.getresource]
 +dir = ":cacheDir/:project"
 +maxAge = -1
 +[caches.images]
 +dir = ":resourceDir/_gen"
 +maxAge = -1
 +[caches.assets]
 +dir = ":resourceDir/_gen"
 +maxAge = -1
 +[caches.modules]
 +dir = ":cacheDir/modules"
 +maxAge = -1
 +{{< /code-toggle >}}
 +
 +You can override any of these cache settings in your own `config.toml`.
 +
 +### The keywords explained
 +
 +`:cacheDir`
 +: This is the value of the `cacheDir` config option if set (can also be set via OS env variable `HUGO_CACHEDIR`). It will fall back to `/opt/build/cache/hugo_cache/` on Netlify, or a `hugo_cache` directory below the OS temp dir for the others. This means that if you run your builds on Netlify, all caches configured with `:cacheDir` will be saved and restored on the next build. For other CI vendors, please read their documentation. For an CircleCI example, see [this configuration](https://github.com/bep/hugo-sass-test/blob/6c3960a8f4b90e8938228688bc49bdcdd6b2d99e/.circleci/config.yml).
 +
 +`:project`
 +: The base directory name of the current Hugo project. This means that, in its default setting, every project will have separated file caches, which means that when you do `hugo --gc` you will not touch files related to other Hugo projects running on the same PC.
 +
 +`:resourceDir`
 +: This is the value of the `resourceDir` config option.
 +
 +maxAge
 +: This is the duration before a cache entry will be evicted, -1 means forever and 0 effectively turns that particular cache off. Uses Go's `time.Duration`, so valid values are `"10s"` (10 seconds), `"10m"` (10 minutes) and `"10h"` (10 hours).
 +
 +dir
 +: The absolute path to where the files for this cache will be stored. Allowed starting placeholders are `:cacheDir` and `:resourceDir` (see above).
 +
 +## Configuration Format Specs
 +
 +* [TOML Spec][toml]
 +* [YAML Spec][yaml]
 +* [JSON Spec][json]
 +
 +[`.Site.Params`]: /variables/site/
 +[directory structure]: /getting-started/directory-structure
 +[json]: https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf "Specification for JSON, JavaScript Object Notation"
 +[lookup order]: /templates/lookup-order/
 +[Output Formats]: /templates/output-formats/
 +[templates]: /templates/
 +[toml]: https://github.com/toml-lang/toml
 +[yaml]: https://yaml.org/spec/
 +[static-files]: /content-management/static-files/
index 2a9b8fa4b1897aab99fd4d4b572e0ca8af18516e,0000000000000000000000000000000000000000..0fb20c434e7fe147c262b9f2185b586ab2abd391
mode 100644,000000..100644
--- /dev/null
@@@ -1,563 -1,0 +1,563 @@@
- [Windows Environment Variables Editor]: http://eveditor.com/
 +---
 +title: Install Hugo
 +linktitle: Install Hugo
 +description: Install Hugo on macOS, Windows, Linux, OpenBSD, FreeBSD, and on any machine where the Go compiler tool chain can run.
 +date: 2016-11-01
 +publishdate: 2016-11-01
 +lastmod: 2018-01-02
 +categories: [getting started,fundamentals]
 +authors: ["Michael Henderson"]
 +keywords: [install,pc,windows,linux,macos,binary,tarball]
 +menu:
 +  docs:
 +    parent: "getting-started"
 +    weight: 30
 +weight: 30
 +sections_weight: 30
 +draft: false
 +aliases: [/tutorials/installing-on-windows/,/tutorials/installing-on-mac/,/overview/installing/,/getting-started/install,/install/]
 +toc: true
 +---
 +
 +
 +{{% note %}}
 +There is lots of talk about "Hugo being written in Go", but you don't need to install Go to enjoy Hugo. Just grab a precompiled binary!
 +{{% /note %}}
 +
 +Hugo is written in [Go](https://golang.org/) with support for multiple platforms. The latest release can be found at [Hugo Releases][releases].
 +
 +Hugo currently provides pre-built binaries for the following:
 +
 +* macOS (Darwin) for x64, i386, and ARM architectures
 +* Windows
 +* Linux
 +* OpenBSD
 +* FreeBSD
 +
 +Hugo may also be compiled from source wherever the Go toolchain can run; e.g., on other operating systems such as DragonFly BSD, OpenBSD, Plan&nbsp;9, Solaris, and others. See <https://golang.org/doc/install/source> for the full set of supported combinations of target operating systems and compilation architectures.
 +
 +## Quick Install
 +
 +### Binary (Cross-platform)
 +
 +Download the appropriate version for your platform from [Hugo Releases][releases]. Once downloaded, the binary can be run from anywhere. You don't need to install it into a global location. This works well for shared hosts and other systems where you don't have a privileged account.
 +
 +Ideally, you should install it somewhere in your `PATH` for easy use. `/usr/local/bin` is the most probable location.
 +
 +### Docker
 +
 +We currently do not offer official Hugo images for Docker, but we do recommend these up to date distributions: https://hub.docker.com/r/klakegg/hugo/
 +
 +### Homebrew (macOS)
 +
 +If you are on macOS and using [Homebrew][brew], you can install Hugo with the following one-liner:
 +
 +{{< code file="install-with-homebrew.sh" >}}
 +brew install hugo
 +{{< /code >}}
 +
 +For more detailed explanations, read the installation guides that follow for installing on macOS and Windows.
 +
 +### MacPorts (macOS)
 +
 +If you are on macOS and using [MacPorts][macports], you can install Hugo with the following one-liner:
 +
 +{{< code file="install-with-macports.sh" >}}
 +port install hugo
 +{{< /code >}}
 +
 +### Homebrew (Linux)
 +
 +If you are using [Homebrew][linuxbrew] on Linux, you can install Hugo with the following one-liner:
 +
 +{{< code file="install-with-linuxbrew.sh" >}}
 +brew install hugo
 +{{< /code >}}
 +
 +Installation guides for Homebrew on Linux are available on their [website][linuxbrew].
 +
 +### Chocolatey (Windows)
 +
 +If you are on a Windows machine and use [Chocolatey][] for package management, you can install Hugo with the following one-liner:
 +
 +{{< code file="install-with-chocolatey.ps1" >}}
 +choco install hugo -confirm
 +{{< /code >}}
 +
 +Or if you need the “extended” Sass/SCSS version:
 +
 +{{< code file="install-extended-with-chocolatey.ps1" >}}
 +choco install hugo-extended -confirm
 +{{< /code >}}
 +
 +### Scoop (Windows)
 +
 +If you are on a Windows machine and use [Scoop][] for package management, you can install Hugo with the following one-liner:
 +
 +```bash
 +scoop install hugo
 +```
 +
 +Or install the extended version with:
 +
 +```bash
 +scoop install hugo-extended
 +```
 +
 +### Source
 +
 +#### Prerequisite Tools
 +
 +* [Git][installgit]
 +* [Go (at least Go 1.11)](https://golang.org/dl/)
 +
 +#### Fetch from GitHub
 +
 +Since Hugo 0.48, Hugo uses the Go Modules support built into Go 1.11 to build. The easiest way to get started is to clone Hugo in a directory outside of the GOPATH, as in the following example:
 +
 +{{< code file="from-gh.sh" >}}
 +mkdir $HOME/src
 +cd $HOME/src
 +git clone https://github.com/gohugoio/hugo.git
 +cd hugo
 +go install --tags extended
 +{{< /code >}}
 +
 +Remove `--tags extended` if you do not want/need Sass/SCSS support.
 +
 +{{% note %}}
 +If you are a Windows user, substitute the `$HOME` environment variable above with `%USERPROFILE%`.
 +{{% /note %}}
 +
 +## macOS
 +
 +### Assumptions
 +
 +1. You know how to open the macOS terminal.
 +2. You're running a modern 64-bit Mac.
 +3. You will use `~/Sites` as the starting point for your site. (`~/Sites` is used for example purposes. If you are familiar enough with the command line and file system, you should have no issues following along with the instructions.)
 +
 +### Pick Your Method
 +
 +There are three ways to install Hugo on your Mac
 +
 +1. A package manager, like [Homebrew][brew] (`brew`) or [MacPorts][macports] (`port`)
 +2. Distribution (i.e., tarball)
 +3. Building from Source
 +
 +There is no "best" way to install Hugo on your Mac. You should use the method that works best for your use case.
 +
 +#### Pros and Cons
 +
 +There are pros and cons to each of the aforementioned methods:
 +
 +1. **Package Manager.** Using a package manager is the simplest method and will require the least amount of work to maintain. The drawbacks aren't severe. The default package will be for the most recent release, so it will not have bug fixes until the next release (i.e., unless you install it with the `--HEAD` option in Homebrew). Releases may lag a few days behind because it has to be coordinated with another team. Nevertheless, this is the recommended installation method if you want to work from a stable, widely used source. Package managers work well and they are easy to update.
 +
 +2. **Tarball.** Downloading and installing from the tarball is also easy, although it requires a few more command line skills than does Homebrew. Updates are easy as well: you just repeat the process with the new binary. This gives you the flexibility to have multiple versions on your computer. If you don't want to use `brew`, then the tarball/binary is a good choice.
 +
 +3. **Building from Source.** Building from source is the most work. The advantage of building from source is that you don't have to wait for a release to add features or bug fixes. The disadvantage is that you need to spend more time managing the setup, which is manageable but requires more time than the preceding two options.
 +
 +{{% note %}}
 +Since building from source is appealing to more seasoned command line users, this guide will focus more on installing Hugo via Homebrew and Tarball.
 +{{% /note %}}
 +
 +### Install Hugo with Brew
 +
 +{{< youtube WvhCGlLcrF8 >}}
 +
 +#### Step 1: Install `brew` if you haven't already
 +
 +Go to the `brew` website, <https://brew.sh/>, and follow the directions there. The most important step is the installation from the command line:
 +
 +{{< code file="install-brew.sh" >}}
 +ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
 +{{< /code >}}
 +
 +#### Step 2: Run the `brew` Command to Install `hugo`
 +
 +Installing Hugo using `brew` is as easy as the following:
 +
 +{{< code file="install-brew.sh" >}}
 +brew install hugo
 +{{< /code >}}
 +
 +If Homebrew is working properly, you should see something similar to the following:
 +
 +```
 +==> Downloading https://homebrew.bintray.com/bottles/hugo-0.21.sierra.bottle.tar.gz
 +######################################################################### 100.0%
 +==> Pouring hugo-0.21.sierra.bottle.tar.gz
 +🍺  /usr/local/Cellar/hugo/0.21: 32 files, 17.4MB
 +```
 +
 +{{% note "Installing the Latest Hugo with Brew" %}}
 +Replace `brew install hugo` with `brew install hugo --HEAD` if you want the absolute latest in-development version.
 +{{% /note %}}
 +
 +`brew` should have updated your path to include Hugo. You can confirm by opening a new terminal window and running a few commands:
 +
 +```
 +$ # show the location of the hugo executable
 +which hugo
 +/usr/local/bin/hugo
 +
 +# show the installed version
 +ls -l $( which hugo )
 +lrwxr-xr-x  1 mdhender admin  30 Mar 28 22:19 /usr/local/bin/hugo -> ../Cellar/hugo/0.13_1/bin/hugo
 +
 +# verify that hugo runs correctly
 +hugo version
 +Hugo Static Site Generator v0.13 BuildDate: 2015-03-09T21:34:47-05:00
 +```
 +
 +### Install Hugo from Tarball
 +
 +#### Step 1: Decide on the location
 +
 +When installing from the tarball, you have to decide if you're going to install the binary in `/usr/local/bin` or in your home directory. There are three camps on this:
 +
 +1. Install it in `/usr/local/bin` so that all the users on your system have access to it. This is a good idea because it's a fairly standard place for executables. The downside is that you may need elevated privileges to put software into that location. Also, if there are multiple users on your system, they will all run the same version. Sometimes this can be an issue if you want to try out a new release.
 +
 +2. Install it in `~/bin` so that only you can execute it. This is a good idea because it's easy to do, easy to maintain, and doesn't require elevated privileges. The downside is that only you can run Hugo. If there are other users on your site, they have to maintain their own copies. That can lead to people running different versions. Of course, this does make it easier for you to experiment with different releases.
 +
 +3. Install it in your `Sites` directory. This is not a bad idea if you have only one site that you're building. It keeps every thing in a single place. If you want to try out new releases, you can make a copy of the entire site and update the Hugo executable.
 +
 +All three locations will work for you. In the interest of brevity, this guide focuses on option #2.
 +
 +#### Step 2: Download the Tarball
 +
 +1. Open <https://github.com/gohugoio/hugo/releases> in your browser.
 +
 +2. Find the current release by scrolling down and looking for the green tag that reads "Latest Release."
 +
 +3. Download the current tarball for the Mac. The name will be something like `hugo_X.Y_osx-64bit.tgz`, where `X.YY` is the release number.
 +
 +4. By default, the tarball will be saved to your `~/Downloads` directory. If you choose to use a different location, you'll need to change that in the following steps.
 +
 +#### Step 3: Confirm your download
 +
 +Verify that the tarball wasn't corrupted during the download:
 +
 +```
 +tar tvf ~/Downloads/hugo_X.Y_osx-64bit.tgz
 +-rwxrwxrwx  0 0      0           0 Feb 22 04:02 hugo_X.Y_osx-64bit/hugo_X.Y_osx-64bit.tgz
 +-rwxrwxrwx  0 0      0           0 Feb 22 03:24 hugo_X.Y_osx-64bit/README.md
 +-rwxrwxrwx  0 0      0           0 Jan 30 18:48 hugo_X.Y_osx-64bit/LICENSE.md
 +```
 +
 +The `.md` files are documentation for Hugo. The other file is the executable.
 +
 +#### Step 4: Install Into Your `bin` Directory
 +
 +```
 +# create the directory if needed
 +mkdir -p ~/bin
 +
 +# make it the working directory
 +cd ~/bin
 +
 +# extract the tarball
 +tar -xvzf ~/Downloads/hugo_X.Y_osx-64bit.tgz
 +Archive:  hugo_X.Y_osx-64bit.tgz
 +  x ./
 +  x ./hugo
 +  x ./LICENSE.md
 +  x ./README.md
 +
 +# verify that it runs
 +./hugo version
 +Hugo Static Site Generator v0.13 BuildDate: 2015-02-22T04:02:30-06:00
 +```
 +
 +You may need to add your bin directory to your `PATH` environment variable. The `which` command will check for us. If it can find `hugo`, it will print the full path to it. Otherwise, it will not print anything.
 +
 +```
 +# check if hugo is in the path
 +which hugo
 +/Users/USERNAME/bin/hugo
 +```
 +
 +If `hugo` is not in your `PATH`:
 +
 +1. Determine your default shell (zsh or bash).
 +
 +   ```
 +   echo $SHELL
 +   ```
 +
 +2. Edit your profile.
 +
 +   If your default shell is zsh:
 +
 +   ```
 +   nano ~/.zprofile
 +   ```
 +
 +   If your default shell is bash:
 +
 +   ```
 +   nano ~/.bash_profile
 +   ```
 +
 +3. Insert a line to add `$HOME/bin` to your existing `PATH`.
 +
 +   ```
 +   export PATH=$PATH:$HOME/bin
 +   ```
 +
 +4. Save the file by pressing Control-X, then Y.
 +
 +5. Close the terminal and open a new terminal to pick up the changes to your profile. Verify the change by running the `which hugo` command again.
 +
 +You've successfully installed Hugo.
 +
 +### Build from Source on Mac
 +
 +If you want to compile Hugo yourself, you'll need to install Go (aka Golang). You can [install Go directly from the Go website](https://golang.org/dl/) or via Homebrew using the following command:
 +
 +```
 +brew install go
 +```
 +
 +#### Step 1: Get the Source
 +
 +If you want to compile a specific version of Hugo, go to <https://github.com/gohugoio/hugo/releases> and download the source code for the version of your choice. If you want to compile Hugo with all the latest changes (which might include bugs), clone the Hugo repository:
 +
 +```
 +git clone https://github.com/gohugoio/hugo
 +```
 +
 +{{% warning "Sometimes \"Latest\" = \"Bugs\""%}}
 +Cloning the Hugo repository directly means taking the good with the bad. By using the bleeding-edge version of Hugo, you make your development susceptible to the latest features, as well as the latest bugs. Your feedback is appreciated. If you find a bug in the latest release, [please create an issue on GitHub](https://github.com/gohugoio/hugo/issues/new).
 +{{% /warning %}}
 +
 +#### Step 2: Compiling
 +
 +Make the directory containing the source your working directory and then fetch Hugo's dependencies:
 +
 +```
 +mkdir -p src/github.com/gohugoio
 +ln -sf $(pwd) src/github.com/gohugoio/hugo
 +
 +go get
 +```
 +
 +This will fetch the absolute latest version of the dependencies. If Hugo fails to build, it may be the result of a dependency's author introducing a breaking change.
 +
 +Once you have properly configured your directory, you can compile Hugo using the following command:
 +
 +```
 +go build -o hugo main.go
 +```
 +
 +Then place the `hugo` executable somewhere in your `$PATH`. You're now ready to start using Hugo.
 +
 +## Windows
 +
 +The following aims to be a complete guide to installing Hugo on your Windows PC.
 +
 +{{< youtube G7umPCU-8xc >}}
 +
 +### Assumptions
 +
 +1. You will use `C:\Hugo\Sites` as the starting point for your new project.
 +2. You will use `C:\Hugo\bin` to store executable files.
 +
 +### Set up Your Directories
 +
 +You'll need a place to store the Hugo executable, your [content][], and the generated Hugo website:
 +
 +1. Open Windows Explorer.
 +2. Create a new folder: `C:\Hugo`, assuming you want Hugo on your C drive, although this can go anywhere
 +3. Create a subfolder in the Hugo folder: `C:\Hugo\bin`
 +4. Create another subfolder in Hugo: `C:\Hugo\Sites`
 +
 +### Technical Users
 +
 +1. Download the latest zipped Hugo executable from [Hugo Releases][releases].
 +2. Extract all contents to your `..\Hugo\bin` folder.
 +3. In PowerShell or your preferred CLI, add the `hugo.exe` executable to your PATH by navigating to `C:\Hugo\bin` (or the location of your hugo.exe file) and use the command `set PATH=%PATH%;C:\Hugo\bin`. If the `hugo` command does not work after a reboot, you may have to run the command prompt as administrator.
 +
 +### Less-technical Users
 +
 +1. Go to the [Hugo Releases][releases] page.
 +2. The latest release is announced on top. Scroll to the bottom of the release announcement to see the downloads. They're all ZIP files.
 +3. Find the Windows files near the bottom (they're in alphabetical order, so Windows is last) – download either the 32-bit or 64-bit file depending on whether you have 32-bit or 64-bit Windows. (If you don't know, [see here](https://esupport.trendmicro.com/en-us/home/pages/technical-support/1038680.aspx).)
 +4. Move the ZIP file into your `C:\Hugo\bin` folder.
 +5. Double-click on the ZIP file and extract its contents. Be sure to extract the contents into the same `C:\Hugo\bin` folder – Windows will do this by default unless you tell it to extract somewhere else.
 +6. You should now have three new files: The hugo executable (`hugo.exe`), `LICENSE`, and `README.md`.
 +
 +Now you need to add Hugo to your Windows PATH settings:
 +
 +#### For Windows 10 Users:
 +
 +* Right click on the **Start** button.
 +* Click on **System**.
 +* Click on **Advanced System Settings** on the right.
 +* Click on the **Environment Variables...** button on the bottom.
 +* In the User variables section, select the row labeled "Path" and click the **Edit...** button.
 +* Click the **Browse...** button and select the directory to which `hugo.exe` was extracted, which is `C:\Hugo\bin` if you went by the instructions above. *The path entry should be the folder where Hugo lives and not the binary itself.*
 +* Click OK at every window to exit.
 +
 +#### For Windows 7 and 8.x users:
 +
 +Windows 7 and 8.1 do not include the easy path editor included in Windows 10, so non-technical users on those platforms are advised to install a free third-party path editor like [Windows Environment Variables Editor][Windows Environment Variables Editor] or [Path Editor](https://patheditor2.codeplex.com/).
 +
 +### Verify the Executable
 +
 +Run a few commands to verify that the executable is ready to run, and then build a sample site to get started.
 +
 +#### 1. Open a Command Prompt
 +
 +At the prompt, type `hugo help` and press the <kbd>Enter</kbd> key. You should see output that starts with:
 +
 +```
 +hugo is the main command, used to build your Hugo site.
 +
 +Hugo is a Fast and Flexible Static Site Generator
 +built with love by spf13 and friends in Go.
 +
 +Complete documentation is available at https://gohugo.io/.
 +```
 +
 +If you do, then the installation is complete. If you don't, double-check the path that you placed the `hugo.exe` file in and that you typed that path correctly when you added it to your `PATH` variable. If you're still not getting the output, search the [Hugo discussion forum][forum] to see if others have already figured out our problem. If not, add a note---in the "Support" category---and be sure to include your command and the output.
 +
 +At the prompt, change your directory to the `Sites` directory.
 +
 +```
 +C:\Program Files> cd C:\Hugo\Sites
 +C:\Hugo\Sites>
 +```
 +
 +#### 2. Run the Command
 +
 +Run the command to generate a new site. I'm using `example.com` as the name of the site.
 +
 +```
 +C:\Hugo\Sites> hugo new site example.com
 +```
 +
 +You should now have a directory at `C:\Hugo\Sites\example.com`. Change into that directory and list the contents. You should get output similar to the following:
 +
 +```
 +C:\Hugo\Sites> cd example.com
 +C:\Hugo\Sites\example.com> dir
 +Directory of C:\hugo\sites\example.com
 +
 +04/13/2015  10:44 PM    <DIR>          .
 +04/13/2015  10:44 PM    <DIR>          ..
 +04/13/2015  10:44 PM    <DIR>          archetypes
 +04/13/2015  10:44 PM                83 config.toml
 +04/13/2015  10:44 PM    <DIR>          content
 +04/13/2015  10:44 PM    <DIR>          data
 +04/13/2015  10:44 PM    <DIR>          layouts
 +04/13/2015  10:44 PM    <DIR>          static
 +               1 File(s)             83 bytes
 +               7 Dir(s)   6,273,331,200 bytes free
 +```
 +
 +### Troubleshoot Windows Installation
 +
 +[@dhersam][] has created a nice video on common issues:
 +
 +{{< youtube c8fJIRNChmU >}}
 +
 +## Linux
 +
 +### Snap Package
 +
 +In any of the [Linux distributions that support snaps][snaps], you may install the "extended" Sass/SCSS version with this command:
 +
 +    snap install hugo --channel=extended
 +
 +To install the non-extended version without Sass/SCSS support:
 +
 +    snap install hugo
 +
 +To switch between the two, use either `snap refresh hugo --channel=extended` or `snap refresh hugo --channel=stable`.
 +
 +{{% note %}}
 +Hugo installed via Snap can write only inside the user’s `$HOME` directory---and gvfs-mounted directories owned by the user---because of Snaps’ confinement and security model. More information is also available [in this related GitHub issue](https://github.com/gohugoio/hugo/issues/3143).
 +{{% /note %}}
 +
 +### Debian and Ubuntu
 +
 +[@anthonyfok](https://github.com/anthonyfok) and friends in the [Debian Go Packaging Team](https://go-team.pages.debian.net/) maintains an official hugo [Debian package](https://packages.debian.org/hugo) which is shared with [Ubuntu](https://packages.ubuntu.com/hugo) and is installable via `apt-get`:
 +
 +    sudo apt-get install hugo
 +
 +What this installs depends on your Debian/Ubuntu version. On Ubuntu bionic (18.04), this installs the non-extended version without Sass/SCSS support. On Ubuntu disco (19.04), this installs the extended version with Sass/SCSS support.
 +
 +This option is not recommended because the Hugo in Linux package managers for Debian and Ubuntu is usually a few versions behind as described [here](https://github.com/gcushen/hugo-academic/issues/703)
 +
 +### Arch Linux
 +
 +You can also install Hugo from the Arch Linux [community](https://www.archlinux.org/packages/community/x86_64/hugo/) repository. Applies also to derivatives such as Manjaro.
 +
 +```
 +sudo pacman -Syu hugo
 +```
 +
 +### Fedora, Red Hat and CentOS
 +
 +Fedora maintains an [official package for Hugo](https://packages.fedoraproject.org/pkgs/hugo/hugo) which may be installed with:
 +
 +    sudo dnf install hugo
 +
 +For the latest version, the Hugo package maintained by [@daftaupe](https://github.com/daftaupe) at Fedora Copr is recommended:
 +
 +* <https://copr.fedorainfracloud.org/coprs/daftaupe/hugo/>
 +
 +See the [related discussion in the Hugo forums][redhatforum].
 +
 +### openSUSE Tumbleweed
 +
 +openSUSE maintains an [official package](https://software.opensuse.org/package/hugo) for the Tumbleweed rolling release distribution, it may be installed with:
 +
 +````
 +sudo zypper install hugo
 +````
 +
 +### Solus
 +
 +Solus includes Hugo in its package repository, it may be installed with:
 +
 +```
 +sudo eopkg install hugo
 +```
 +
 +## OpenBSD
 +
 +OpenBSD provides a package for Hugo via `pkg_add`:
 +
 +    doas pkg_add hugo
 +
 +
 +## Upgrade Hugo
 +
 +Upgrading Hugo is as easy as downloading and replacing the executable you’ve placed in your `PATH` or run `brew upgrade hugo` if using Homebrew.
 +
 +## Next Steps
 +
 +Now that you've installed Hugo, read the [Quick Start guide][quickstart] and explore the rest of the documentation. If you have questions, ask the Hugo community directly by visiting the [Hugo Discussion Forum][forum].
 +
 +[brew]: https://brew.sh/
 +[macports]: https://www.macports.org/
 +[Chocolatey]: https://chocolatey.org/
 +[content]: /content-management/
 +[@dhersam]: https://github.com/dhersam
 +[forum]: https://discourse.gohugo.io
 +[mage]: https://github.com/magefile/mage
 +[dep]: https://github.com/golang/dep
 +[highlight shortcode]: /content-management/shortcodes/#highlight
 +[installgit]: https://git-scm.com/
 +[installgo]: https://golang.org/dl/
 +[linuxbrew]: https://docs.brew.sh/Homebrew-on-Linux
 +[Path Editor]: https://patheditor2.codeplex.com/
 +[quickstart]: /getting-started/quick-start/
 +[redhatforum]: https://discourse.gohugo.io/t/solved-fedora-copr-repository-out-of-service/2491
 +[releases]: https://github.com/gohugoio/hugo/releases
 +[Scoop]: https://scoop.sh/
 +[snaps]: https://snapcraft.io/docs/installing-snapd
 +[windowsarch]: https://esupport.trendmicro.com/en-us/home/pages/technical-support/1038680.aspx
++[Windows Environment Variables Editor]: https://eveditor.com/
index ed215eea572151113a6b2ffa10b41c37f20fb5a2,0000000000000000000000000000000000000000..ad59b71f1dcd8addb7dada0834fa09b21052d4f2
mode 100644,000000..100644
--- /dev/null
@@@ -1,157 -1,0 +1,148 @@@
- lastmod: 2019-10-03
 +---
 +title: Deployment with Rsync
 +linktitle: Deployment with Rsync
 +description: If you have access to your web host with SSH, you can use a simple rsync one-liner to incrementally deploy your entire Hugo website.
 +date: 2017-02-01
 +publishdate: 2017-02-01
- HOST=my-server.com             
 +categories: [hosting and deployment]
 +keywords: [rsync,deployment]
 +authors: [Adrien Poupin]
 +menu:
 +  docs:
 +    parent: "hosting-and-deployment"
 +    weight: 70
 +weight: 70
 +sections_weight: 70
 +draft: false
 +aliases: [/tutorials/deployment-with-rsync/]
 +toc: true
 +notesforauthors:
 +---
 +
 +## Assumptions
 +
 +* A web host running a web server. This could be a shared hosting environment or a VPS.
 +* Access to your web host with SSH
 +* A functional static website built with Hugo
 +
 +The spoiler is that you can deploy your entire website with a command that looks like the following:
 +
 +```
 +hugo && rsync -avz --delete public/ www-data@ftp.topologix.fr:~/www/
 +```
 +
 +As you will see, we'll put this command in a shell script file, which makes building and deployment as easy as executing `./deploy`.
 +
 +## Copy Your SSH Key to your Host
 +
 +To make logging in to your server more secure and less interactive, you can upload your SSH key. If you have already installed your SSH key to your server, you can move on to the next section.
 +
 +First, install the ssh client. On Debian/Ubuntu/derivates, use the following command:
 +
 +{{< code file="install-openssh.sh" >}}
 +sudo apt-get install openssh-client
 +{{< /code >}}
 +
 +Then generate your ssh key. First, create the `.ssh` directory in your home directory if it doesn't exist:
 +
 +```
 +~$ cd && mkdir .ssh & cd .ssh
 +```
 +
 +Next, execute this command to generate a new keypair called `rsa_id`:
 +
 +```
 +~/.ssh/$ ssh-keygen -t rsa -q -C "For SSH" -f rsa_id
 +```
 +
 +You'll be prompted for a passphrase, which is an extra layer of protection. Enter the passphrase you'd like to use, and then enter it again when prompted, or leave it blank if you don't want to have a passphrase. Not using a passphrase will let you transfer files non-interactively, as you won't be prompted for a password when you log in, but it is slightly less secure.
 +
 +To make logging in easier, add a definition for your web host to the file  `~/.ssh/config` with the following command, replacing `HOST` with the IP address or hostname of your web host, and `USER` with the username you use to log in to your web host when transferring files:
 +
 +```
 +~/.ssh/$ cat >> config <<EOF
 +Host HOST
 +     Hostname HOST
 +     Port 22
 +     User USER
 +     IdentityFile ~/.ssh/rsa_id
 +EOF
 +```
 +
 +Then copy your ssh public key to the remote server with the `ssh-copy-id` command:
 +
 +```
 +~/.ssh/$ ssh-copy-id -i rsa_id.pub USER@HOST.com
 +```
 +
 +Now you can easily connect to the remote server:
 +
 +```
 +~$ ssh user@host
 +Enter passphrase for key '/home/mylogin/.ssh/rsa_id':
 +```
 +
 +Now that you can log in with your SSH key, let's create a script to automate deployment of your Hugo site.
 +
 +## Shell Script
 +
 +Create a new script called `deploy` the root of your Hugo tree:
 +
 +```
 +~/websites/topologix.fr$ editor deploy
 +```
 +
 +Add the following content. Replace the `USER`, `HOST`, and `DIR` values with your own values:
 +
 +```
 +#!/bin/sh
 +USER=my-user
- cours-versailles/index.html
- exercices/index.html
- exercices/index.xml
- exercices/barycentre-et-carres-des-distances/index.html
++HOST=my-server.com
 +DIR=my/directory/to/topologix.fr/   # the directory where your web site files should go
 +
 +hugo && rsync -avz --delete public/ ${USER}@${HOST}:~/${DIR}
 +
 +exit 0
 +```
 +
 +Note that `DIR` is the relative path from the remote user's home. If you have to specify a full path (for instance `/var/www/mysite/`) you must change `~/${DIR}` to `${DIR}` inside the command line. For most cases you should not have to.
 +
 +Save and close, and make the `deploy` file executable:
 +
 +```
 +~/websites/topologix.fr$ chmod +x deploy
 +```
 +
 +Now you only have to enter the following command to deploy and update your website:
 +
 +```
 +~/websites/topologix.fr$ ./deploy
 +```
 +
 +Your site builds and deploys:
 +
 +```
 +Started building sites ...
 +Built site for language en:
 +0 draft content
 +0 future content
 +0 expired content
 +5 pages created
 +0 non-page files copied
 +0 paginator pages created
 +0 tags created
 +0 categories created
 +total in 56 ms
 +sending incremental file list
 +404.html
 +index.html
 +index.xml
 +sitemap.xml
- sujets/index.html
- sujets/index.xml
- sujets/2016-09_supelec-jp/index.html
- tarifs-contact/index.html
 +posts/
 +posts/index.html
 +
 +sent 9,550 bytes  received 1,708 bytes  7,505.33 bytes/sec
 +total size is 966,557  speedup is 85.86
 +```
 +
 +You can incorporate other proprocessing tasks into this deployment script as well.
index 9640198db0d59efc49c001e458b304b78558ac45,0000000000000000000000000000000000000000..137bb2a55279ccb19c42c04e55b107ceb3ec6b47
mode 100644,000000..100644
--- /dev/null
@@@ -1,17 -1,0 +1,17 @@@
- We use [Wercker](https://www.wercker.com/) for continuous integration and deployments, [GitHub](https://github.com/) for contributing to and writing markdown and [Firebase](https://firebase.google.com/docs/hosting/) for hosting.
 +---
 +title: Over
 +date: 2018-09-12
 +description: "Showcase: \"People from all disciplines contribute to our website; Hugo’s single static binary makes that possible.\""
 +siteURL: https://madewithover.com/
 +
 +---
 +
 +At Over we're into creativity, and technology should not get in the way. We want it to be easy for everyone to create, and Hugo does the same for us. That's one of the reasons many of us are fond of using it.
 +
 +People from all disciplines contribute to our website, be it legal documentation, layout and design, recruiting, marketing and of course… engineering. Hugo allows us to do this with as little friction as possible. A lot of this comes down to Hugo being distributed as a single static binary. Copy, paste, run... and you're up and running!
 +
++We use Wercker for continuous integration and deployments, [GitHub](https://github.com/) for contributing to and writing markdown and [Firebase](https://firebase.google.com/docs/hosting/) for hosting.
 +
 +This infrastructure takes all the pressure off our engineers, anyone can contribute to our website. Anyone else can review the changes, and of course anyone with permission can deploy those approved changes as well!
 +
 +We're busy working on a few new features for our website, and Hugo continues to deliver above and beyond. We're so happy with the choice we made to use Hugo and to us it has become the de-facto static site generator.
index 2c0e383fbb792e7c0156db97dbc9868525d8ba3f,0000000000000000000000000000000000000000..ace5d6ab97fec44fb0884ffa2f9d7887d46dfd5d
mode 100644,000000..100644
--- /dev/null
@@@ -1,593 -1,0 +1,593 @@@
- This list template has been modified slightly from a template originally used in [spf13.com](http://spf13.com/). It makes use of [partial templates][partials] for the chrome of the rendered page rather than using a [base template][base]. The examples that follow also use the [content view templates][views] `li.html` or `summary.html`.
 +---
 +title: Lists of Content in Hugo
 +linktitle: List Templates
 +description: Lists have a specific meaning and usage in Hugo when it comes to rendering your site homepage, section page, taxonomy list, or taxonomy terms list.
 +date: 2017-02-01
 +publishdate: 2017-02-01
 +lastmod: 2017-02-01
 +categories: [templates]
 +keywords: [lists,sections,rss,taxonomies,terms]
 +menu:
 +  docs:
 +    parent: "templates"
 +    weight: 22
 +weight: 22
 +sections_weight: 22
 +draft: false
 +aliases: [/templates/list/,/layout/indexes/]
 +toc: true
 +---
 +
 +## What is a List Page Template?
 +
 +{{< youtube 8b2YTSMdMps >}}
 +
 +A list page template is a template used to render multiple pieces of content in a single HTML page. The exception to this rule is the homepage, which is still a list but has its own [dedicated template][homepage].
 +
 +Hugo uses the term *list* in its truest sense; i.e. a sequential arrangement of material, especially in alphabetical or numerical order. Hugo uses list templates on any output HTML page where content is traditionally listed:
 +
 +* [Taxonomy terms pages][taxterms]
 +* [Taxonomy list pages][taxlists]
 +* [Section list pages][sectiontemps]
 +* [RSS][rss]
 +
 +For template lookup order, see [Template Lookup](/templates/lookup-order/).
 +
 +The idea of a list page comes from the [hierarchical mental model of the web][mentalmodel] and is best demonstrated visually:
 +
 +[![Image demonstrating a hierarchical website sitemap.](/images/site-hierarchy.svg)](/images/site-hierarchy.svg)
 +
 +## List Defaults
 +
 +### Default Templates
 +
 +Since section lists and taxonomy lists (N.B., *not* [taxonomy terms lists][taxterms]) are both *lists* with regards to their templates, both have the same terminating default of `_default/list.html` or `themes/<THEME>/layouts/_default/list.html` in their lookup order. In addition, both [section lists][sectiontemps] and [taxonomy lists][taxlists] have their own default list templates in `_default`.
 +
 +See [Template Lookup Order](/templates/lookup-order/) for the complete reference.
 +
 +## Add Content and Front Matter to List Pages
 +
 +Since v0.18, [everything in Hugo is a `Page`][bepsays]. This means list pages and the homepage can have associated content files (i.e. `_index.md`) that contain page metadata (i.e., front matter) and content.
 +
 +This new model allows you to include list-specific front matter via `.Params` and also means that list templates (e.g., `layouts/_default/list.html`) have access to all [page variables][pagevars].
 +
 +{{% note %}}
 +It is important to note that all `_index.md` content files will render according to a *list* template and not according to a [single page template](/templates/single-page-templates/).
 +{{% /note %}}
 +
 +### Example Project Directory
 +
 +The following is an example of a typical Hugo project directory's content:
 +
 +```
 +.
 +...
 +├── content
 +|   ├── posts
 +|   |   ├── _index.md
 +|   |   ├── post-01.md
 +|   |   └── post-02.md
 +|   └── quote
 +|   |   ├── quote-01.md
 +|   |   └── quote-02.md
 +...
 +```
 +
 +Using the above example, let's assume you have the following in `content/posts/_index.md`:
 +
 +{{< code file="content/posts/_index.md" >}}
 +---
 +title: My Go Journey
 +date: 2017-03-23
 +publishdate: 2017-03-24
 +---
 +
 +I decided to start learning Go in March 2017.
 +
 +Follow my journey through this new blog.
 +{{< /code >}}
 +
 +You can now access this `_index.md`'s' content in your list template:
 +
 +{{< code file="layouts/_default/list.html" download="list.html" >}}
 +{{ define "main" }}
 +<main>
 +    <article>
 +        <header>
 +            <h1>{{.Title}}</h1>
 +        </header>
 +        <!-- "{{.Content}}" pulls from the markdown content of the corresponding _index.md -->
 +        {{.Content}}
 +    </article>
 +    <ul>
 +    <!-- Ranges through content/posts/*.md -->
 +    {{ range .Pages }}
 +        <li>
 +            <a href="{{.Permalink}}">{{.Date.Format "2006-01-02"}} | {{.Title}}</a>
 +        </li>
 +    {{ end }}
 +    </ul>
 +</main>
 +{{ end }}
 +{{< /code >}}
 +
 +This above will output the following HTML:
 +
 +{{< code file="example.com/posts/index.html" copy="false" >}}
 +<!--top of your baseof code-->
 +<main>
 +    <article>
 +        <header>
 +            <h1>My Go Journey</h1>
 +        </header>
 +        <p>I decided to start learning Go in March 2017.</p>
 +        <p>Follow my journey through this new blog.</p>
 +    </article>
 +    <ul>
 +        <li><a href="/posts/post-01/">Post 1</a></li>
 +        <li><a href="/posts/post-02/">Post 2</a></li>
 +    </ul>
 +</main>
 +<!--bottom of your baseof-->
 +{{< /code >}}
 +
 +### List Pages Without `_index.md`
 +
 +You do *not* have to create an `_index.md` file for every list page (i.e. section, taxonomy, taxonomy terms, etc) or the homepage. If Hugo does not find an `_index.md` within the respective content section when rendering a list template, the page will be created but with no `{{.Content}}` and only the default values for `.Title` etc.
 +
 +Using this same `layouts/_default/list.html` template and applying it to the `quotes` section above will render the following output. Note that `quotes` does not have an `_index.md` file to pull from:
 +
 +{{< code file="example.com/quote/index.html" copy="false" >}}
 +<!--baseof-->
 +<main>
 +    <article>
 +        <header>
 +        <!-- Hugo assumes that .Title is the name of the section since there is no _index.md content file from which to pull a "title:" field -->
 +            <h1>Quotes</h1>
 +        </header>
 +    </article>
 +    <ul>
 +        <li><a href="https://example.com/quote/quotes-01/">Quote 1</a></li>
 +        <li><a href="https://example.com/quote/quotes-02/">Quote 2</a></li>
 +    </ul>
 +</main>
 +<!--baseof-->
 +{{< /code >}}
 +
 +{{% note %}}
 +The default behavior of Hugo is to pluralize list titles; hence the inflection of the `quote` section to "Quotes" when called with the `.Title` [page variable](/variables/page/). You can change this via the `pluralizeListTitles` directive in your [site configuration](/getting-started/configuration/).
 +{{% /note %}}
 +
 +## Example List Templates
 +
 +### Section Template
 +
++This list template has been modified slightly from a template originally used in [spf13.com](https://spf13.com/). It makes use of [partial templates][partials] for the chrome of the rendered page rather than using a [base template][base]. The examples that follow also use the [content view templates][views] `li.html` or `summary.html`.
 +
 +{{< code file="layouts/section/posts.html" >}}
 +{{ partial "header.html" . }}
 +{{ partial "subheader.html" . }}
 +<main>
 +  <div>
 +   <h1>{{ .Title }}</h1>
 +        <ul>
 +        <!-- Renders the li.html content view for each content/posts/*.md -->
 +            {{ range .Pages }}
 +                {{ .Render "li"}}
 +            {{ end }}
 +        </ul>
 +  </div>
 +</main>
 +{{ partial "footer.html" . }}
 +{{< /code >}}
 +
 +### Taxonomy Template
 +
 +{{< code file="layouts/_default/taxonomy.html" download="taxonomy.html" >}}
 +{{ define "main" }}
 +<main>
 +  <div>
 +   <h1>{{ .Title }}</h1>
 +   <!-- ranges through each of the content files associated with a particular taxonomy term and renders the summary.html content view -->
 +    {{ range .Pages }}
 +        {{ .Render "summary"}}
 +    {{ end }}
 +  </div>
 +</main>
 +{{ end }}
 +{{< /code >}}
 +
 +## Order Content
 +
 +Hugo lists render the content based on metadata you provide in [front matter][]. In addition to sane defaults, Hugo also ships with multiple methods to make quick work of ordering content inside list templates:
 +
 +### Default: Weight > Date > LinkTitle > FilePath
 +
 +{{< code file="layouts/partials/default-order.html" >}}
 +<ul>
 +    {{ range .Pages }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Weight
 +
 +Lower weight gets higher precedence. So content with lower weight will come first.
 +
 +{{< code file="layouts/partials/by-weight.html" >}}
 +<ul>
 +    {{ range .Pages.ByWeight }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Date
 +
 +{{< code file="layouts/partials/by-date.html" >}}
 +<ul>
 +    <!-- orders content according to the "date" field in front matter -->
 +    {{ range .Pages.ByDate }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Publish Date
 +
 +{{< code file="layouts/partials/by-publish-date.html" >}}
 +<ul>
 +    <!-- orders content according to the "publishdate" field in front matter -->
 +    {{ range .Pages.ByPublishDate }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Expiration Date
 +
 +{{< code file="layouts/partials/by-expiry-date.html" >}}
 +<ul>
 +    {{ range .Pages.ByExpiryDate }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Last Modified Date
 +
 +{{< code file="layouts/partials/by-last-mod.html" >}}
 +<ul>
 +    <!-- orders content according to the "lastmod" field in front matter -->
 +    {{ range .Pages.ByLastmod }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Length
 +
 +{{< code file="layouts/partials/by-length.html" >}}
 +<ul>
 +    <!-- orders content according to content length in ascending order (i.e., the shortest content will be listed first) -->
 +    {{ range .Pages.ByLength }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Title
 +
 +{{< code file="layouts/partials/by-title.html" >}}
 +<ul>
 +    <!-- ranges through content in ascending order according to the "title" field set in front matter -->
 +    {{ range .Pages.ByTitle }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Link Title
 +
 +{{< code file="layouts/partials/by-link-title.html" >}}
 +<ul>
 +    <!-- ranges through content in ascending order according to the "linktitle" field in front matter. If a "linktitle" field is not set, the range will start with content that only has a "title" field and use that value for .LinkTitle -->
 +    {{ range .Pages.ByLinkTitle }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .LinkTitle }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +### By Parameter
 +
 +Order based on the specified front matter parameter. Content that does not have the specified front matter field  will use the site's `.Site.Params` default. If the parameter is not found at all in some entries, those entries will appear together at the end of the ordering.
 +
 +{{< code file="layouts/partials/by-rating.html" >}}
 +<!-- Ranges through content according to the "rating" field set in front matter -->
 +{{ range (.Pages.ByParam "rating") }}
 +  <!-- ... -->
 +{{ end }}
 +{{< /code >}}
 +
 +If the targeted front matter field is nested beneath another field, you can access the field using dot notation.
 +
 +{{< code file="layouts/partials/by-nested-param.html" >}}
 +{{ range (.Pages.ByParam "author.last_name") }}
 +  <!-- ... -->
 +{{ end }}
 +{{< /code >}}
 +
 +### Reverse Order
 +
 +Reversing order can be applied to any of the above methods. The following uses `ByDate` as an example:
 +
 +{{< code file="layouts/partials/by-date-reverse.html" >}}
 +<ul>
 +    {{ range .Pages.ByDate.Reverse }}
 +        <li>
 +            <h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
 +            <time>{{ .Date.Format "Mon, Jan 2, 2006" }}</time>
 +        </li>
 +    {{ end }}
 +</ul>
 +{{< /code >}}
 +
 +## Group Content
 +
 +Hugo provides some functions for grouping pages by Section, Type, Date, etc.
 +
 +### By Page Field
 +
 +{{< code file="layouts/partials/by-page-field.html" >}}
 +<!-- Groups content according to content section. The ".Key" in this instance will be the section's title. -->
 +{{ range .Pages.GroupBy "Section" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +In the above example, you may want `{{.Title}}` to point the `title` field you have added to your `_index.md` file instead. You can access this value using the [`.GetPage` function][getpage]:
 +
 +{{< code file="layouts/partials/by-page-field.html" >}}
 +<!-- Groups content according to content section.-->
 +{{ range .Pages.GroupBy "Section" }}
 +<!-- Checks for existence of _index.md for a section; if available, pulls from "title" in front matter -->
 +{{ with $.Site.GetPage "section" .Key }}
 +<h3>{{.Title}}</h3>
 +{{ else }}
 +<!-- If no _index.md is available, ".Key" defaults to the section title and filters to title casing -->
 +<h3>{{ .Key | title }}</h3>
 +{{ end }}
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +### By Date
 +
 +{{< code file="layouts/partials/by-page-date.html" >}}
 +<!-- Groups content by month according to the "date" field in front matter -->
 +{{ range .Pages.GroupByDate "2006-01" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +### By Publish Date
 +
 +{{< code file="layouts/partials/by-page-publish-date.html" >}}
 +<!-- Groups content by month according to the "publishDate" field in front matter -->
 +{{ range .Pages.GroupByPublishDate "2006-01" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .PublishDate.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +
 +### By Lastmod
 +
 +{{< code file="layouts/partials/by-page-lastmod.html" >}}
 +<!-- Groups content by month according to the "lastMod" field in front matter -->
 +{{ range .Pages.GroupByLastmod "2006-01" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Lastmod.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +### By Expiry Date
 +
 +{{< code file="layouts/partials/by-page-expiry-date.html" >}}
 +<!-- Groups content by month according to the "expiryDate" field in front matter -->
 +{{ range .Pages.GroupByExpiryDate "2006-01" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .ExpiryDate.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +### By Page Parameter
 +
 +{{< code file="layouts/partials/by-page-param.html" >}}
 +<!-- Groups content according to the "param_key" field in front matter -->
 +{{ range .Pages.GroupByParam "param_key" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +### By Page Parameter in Date Format
 +
 +The following template takes grouping by `date` a step further and uses Go's layout string. See the [`Format` function][] for more examples of how to use Go's layout string to format dates in Hugo.
 +
 +{{< code file="layouts/partials/by-page-param-as-date.html" >}}
 +<!-- Groups content by month according to the "param_key" field in front matter -->
 +{{ range .Pages.GroupByParamDate "param_key" "2006-01" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +### Reverse Key Order
 +
 +Ordering of groups is performed by keys in alphanumeric order (A–Z, 1–100) and in reverse chronological order (i.e., with the newest first) for dates.
 +
 +While these are logical defaults, they are not always the desired order. There are two different syntaxes to change Hugo's default ordering for groups, both of which work the same way.
 +
 +#### 1. Adding the Reverse Method
 +
 +```
 +{{ range (.Pages.GroupBy "Section").Reverse }}
 +```
 +
 +```
 +{{ range (.Pages.GroupByDate "2006-01").Reverse }}
 +```
 +
 +#### 2. Providing the Alternate Direction
 +
 +```
 +{{ range .Pages.GroupByDate "2006-01" "asc" }}
 +```
 +
 +```
 +{{ range .Pages.GroupBy "Section" "desc" }}
 +```
 +
 +### Order Within Groups
 +
 +Because Grouping returns a `{{.Key}}` and a slice of pages, all of the ordering methods listed above are available.
 +
 +Here is the ordering for the example that follows:
 +
 +1. Content is grouped by month according to the `date` field in front matter.
 +2. Groups are listed in ascending order (i.e., the oldest groups first)
 +3. Pages within each respective group are ordered alphabetically according to the `title`.
 +
 +{{< code file="layouts/partials/by-group-by-page.html" >}}
 +{{ range .Pages.GroupByDate "2006-01" "asc" }}
 +<h3>{{ .Key }}</h3>
 +<ul>
 +    {{ range .Pages.ByTitle }}
 +    <li>
 +    <a href="{{ .Permalink }}">{{ .Title }}</a>
 +    <div class="meta">{{ .Date.Format "Mon, Jan 2, 2006" }}</div>
 +    </li>
 +    {{ end }}
 +</ul>
 +{{ end }}
 +{{< /code >}}
 +
 +## Filtering and Limiting Lists {#filtering-and-limiting-lists}
 +
 +Sometimes you only want to list a subset of the available content. A
 +common is to only display posts from [**main sections**][mainsections]
 +on the blog's homepage.
 +
 +See the documentation on [`where` function][wherefunction] and
 +[`first` function][firstfunction] for further details.
 +
 +[base]: /templates/base/
 +[bepsays]: https://bepsays.com/en/2016/12/19/hugo-018/
 +[directorystructure]: /getting-started/directory-structure/
 +[`Format` function]: /functions/format/
 +[front matter]: /content-management/front-matter/
 +[getpage]: /functions/getpage/
 +[homepage]: /templates/homepage/
 +[homepage]: /templates/homepage/
 +[mentalmodel]: https://webstyleguide.com/wsg3/3-information-architecture/3-site-structure.html
 +[pagevars]: /variables/page/
 +[partials]: /templates/partials/
 +[RSS 2.0]: https://cyber.harvard.edu/rss/rss.html "RSS 2.0 Specification"
 +[rss]: /templates/rss/
 +[sections]: /content-management/sections/
 +[sectiontemps]: /templates/section-templates/
 +[sitevars]: /variables/site/
 +[taxlists]: /templates/taxonomy-templates/#taxonomy-list-templates
 +[taxterms]: /templates/taxonomy-templates/#taxonomy-terms-templates
 +[taxvars]: /variables/taxonomy/
 +[views]: /templates/views/
 +[wherefunction]: /functions/where/
 +[firstfunction]: /functions/first/
 +[mainsections]: /functions/where/#mainsections
index c80c276487e1c7c80c6db20de17128e8119203ab,0000000000000000000000000000000000000000..2d1e9edf2e070e0ff9541c24bb81018fc5918600
mode 100644,000000..100644
--- /dev/null
@@@ -1,208 -1,0 +1,208 @@@
- Value: {{ partial "my-inline-partial" . }}
 +---
 +title: Partial Templates
 +linktitle: Partial Templates
 +description: Partials are smaller, context-aware components in your list and page templates that can be used economically to keep your templating DRY.
 +date: 2017-02-01
 +publishdate: 2017-02-01
 +lastmod: 2017-02-01
 +categories: [templates]
 +keywords: [lists,sections,partials]
 +menu:
 +  docs:
 +    parent: "templates"
 +    weight: 90
 +weight: 90
 +sections_weight: 90
 +draft: false
 +aliases: [/templates/partial/,/layout/chrome/,/extras/analytics/]
 +toc: true
 +---
 +
 +{{< youtube pjS4pOLyB7c >}}
 +
 +## Partial Template Lookup Order
 +
 +Partial templates---like [single page templates][singletemps] and [list page templates][listtemps]---have a specific [lookup order][]. However, partials are simpler in that Hugo will only check in two places:
 +
 +1. `layouts/partials/*<PARTIALNAME>.html`
 +2. `themes/<THEME>/layouts/partials/*<PARTIALNAME>.html`
 +
 +This allows a theme's end user to copy a partial's contents into a file of the same name for [further customization][customize].
 +
 +## Use Partials in your Templates
 +
 +All partials for your Hugo project are located in a single `layouts/partials` directory. For better organization, you can create multiple subdirectories within `partials` as well:
 +
 +```txt
 +layouts/
 +└── partials/
 +    ├── footer/
 +    │   ├── scripts.html
 +    │   └── site-footer.html
 +    ├── head/
 +    │   ├── favicons.html
 +    │   ├── metadata.html
 +    │   ├── prerender.html
 +    │   └── twitter.html
 +    └── header/
 +        ├── site-header.html
 +        └── site-nav.html
 +```
 +
 +All partials are called within your templates using the following pattern:
 +
 +```go-html-template
 +{{ partial "<PATH>/<PARTIAL>.html" . }}
 +```
 +
 +{{% note %}}
 +One of the most common mistakes with new Hugo users is failing to pass a context to the partial call. In the pattern above, note how "the dot" (`.`) is required as the second argument to give the partial context. You can read more about "the dot" in the [Hugo templating introduction](/templates/introduction/).
 +{{% /note %}}
 +
 +{{% note %}}
 +`<PARTIAL>` including `baseof` is reserved. ([#5373](https://github.com/gohugoio/hugo/issues/5373))
 +{{% /note %}}
 +
 +As shown in the above example directory structure, you can nest your directories within `partials` for better source organization. You only need to call the nested partial's path relative to the `partials` directory:
 +
 +```go-html-template
 +{{ partial "header/site-header.html" . }}
 +{{ partial "footer/scripts.html" . }}
 +```
 +
 +### Variable Scoping
 +
 +The second argument in a partial call is the variable being passed down. The above examples are passing the `.`, which tells the template receiving the partial to apply the current [context][context].
 +
 +This means the partial will *only* be able to access those variables. The partial is isolated and *has no access to the outer scope*. From within the partial, `$.Var` is equivalent to `.Var`.
 +
 +## Returning a value from a Partial
 +
 +In addition to outputting markup, partials can be used to return a value of any type. In order to return a value, a partial must include a lone `return` statement.
 +
 +### Example GetFeatured
 +
 +```go-html-template
 +{{/* layouts/partials/GetFeatured.html */}}
 +{{ return first . (where site.RegularPages "Params.featured" true) }}
 +```
 +
 +```go-html-template
 +{{/* layouts/index.html */}}
 +{{ range partial "GetFeatured.html" 5 }}
 +  [...]
 +{{ end }}
 +```
 +
 +### Example GetImage
 +
 +```go-html-template
 +{{/* layouts/partials/GetImage.html */}}
 +{{ $image := false }}
 +{{ with .Params.gallery }}
 +  {{ $image = index . 0 }}
 +{{ end }}
 +{{ with .Params.image }}
 +  {{ $image = . }}
 +{{ end }}
 +{{ return $image }}
 +```
 +
 +```go-html-template
 +{{/* layouts/_default/single.html */}}
 +{{ with partial "GetImage.html" . }}
 +  [...]
 +{{ end }}
 +```
 +
 +{{% note %}}
 +Only one `return` statement is allowed per partial file.
 +{{% /note %}}
 +
 +## Inline Partials
 +
 +{{< new-in "0.74.0" >}}
 +
 +You can also define partials inline in the template. But remember that template namespace is global, so you need to make sure that the names are unique to avoid conflicts.
 +
 +```go-html-template
- {{ define "partials/my-inline-partial" }}
++Value: {{ partial "my-inline-partial.html" . }}
 +
++{{ define "partials/my-inline-partial.html" }}
 +{{ $value := 32 }}
 +{{ return $value }}
 +{{ end }}
 +```
 +
 +## Cached Partials
 +
 +The [`partialCached` template function][partialcached] can offer significant performance gains for complex templates that don't need to be re-rendered on every invocation. The simplest usage is as follows:
 +
 +```go-html-template
 +{{ partialCached "footer.html" . }}
 +```
 +
 +You can also pass additional parameters to `partialCached` to create *variants* of the cached partial.
 +
 +For example, you can tell Hugo to only render the partial `footer.html` once per section:
 +
 +```go-html-template
 +{{ partialCached "footer.html" . .Section }}
 +```
 +
 +If you need to pass additional parameters to create unique variants, you can pass as many variant parameters as you need:
 +
 +```go-html-template
 +{{ partialCached "footer.html" . .Params.country .Params.province }}
 +```
 +
 +Note that the variant parameters are not made available to the underlying partial template. They are only use to create a unique cache key.
 +
 +### Example `header.html`
 +
 +The following `header.html` partial template is used for [spf13.com](https://spf13.com/):
 +
 +{{< code file="layouts/partials/header.html" download="header.html" >}}
 +<!DOCTYPE html>
 +<html class="no-js" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
 +<head>
 +    <meta charset="utf-8">
 +
 +    {{ partial "meta.html" . }}
 +
 +    <base href="{{ .Site.BaseURL }}">
 +    <title> {{ .Title }} : spf13.com </title>
 +    <link rel="canonical" href="{{ .Permalink }}">
 +    {{ if .RSSLink }}<link href="{{ .RSSLink }}" rel="alternate" type="application/rss+xml" title="{{ .Title }}" />{{ end }}
 +
 +    {{ partial "head_includes.html" . }}
 +</head>
 +{{< /code >}}
 +
 +{{% note %}}
 +The `header.html` example partial was built before the introduction of block templates to Hugo. Read more on [base templates and blocks](/templates/base/) for defining the outer chrome or shell of your master templates (i.e., your site's head, header, and footer). You can even combine blocks and partials for added flexibility.
 +{{% /note %}}
 +
 +### Example `footer.html`
 +
 +The following `footer.html` partial template is used for [spf13.com](https://spf13.com/):
 +
 +{{< code file="layouts/partials/footer.html" download="footer.html" >}}
 +<footer>
 +  <div>
 +    <p>
 +    &copy; 2013-14 Steve Francia.
 +    <a href="https://creativecommons.org/licenses/by/3.0/" title="Creative Commons Attribution">Some rights reserved</a>;
 +    please attribute properly and link back.
 +    </p>
 +  </div>
 +</footer>
 +{{< /code >}}
 +
 +[context]: /templates/introduction/ "The most easily overlooked concept to understand about Go templating is how the dot always refers to the current context."
 +[customize]: /themes/customizing/ "Hugo provides easy means to customize themes as long as users are familiar with Hugo's template lookup order."
 +[listtemps]: /templates/lists/ "To effectively leverage Hugo's system, see how Hugo handles list pages, where content for sections, taxonomies, and the homepage are listed and ordered."
 +[lookup order]: /templates/lookup-order/ "To keep your templating dry, read the documentation on Hugo's lookup order."
 +[partialcached]: /functions/partialcached/ "Use the partial cached function to improve build times in cases where Hugo can cache partials that don't need to be rendered with every page."
 +[singletemps]: /templates/single-page-templates/ "The most common form of template in Hugo is the single content template. Read the docs on how to create templates for individual pages."
 +[themes]: /themes/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..57c2efa06897938c5260abfc63f72cb0901b45b4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,172 @@@
++---
++title: "Markdown Render Hooks"
++linkTitle: "Render Hooks"
++description: "Render Hooks allow custom templates to override markdown rendering functionality."
++date: 2017-03-11
++categories: [templates]
++keywords: [markdown]
++toc: true
++menu:
++  docs:
++    title: "Markdown Render Hooks"
++    parent: "templates"
++    weight: 20
++---
++
++{{< new-in "0.62.0" >}} Note that this is only supported with the [Goldmark](#goldmark) renderer.
++
++
++You can override certain parts of the default Markdown rendering to HTML by creating templates with base names `render-{kind}` in `layouts/_default/_markup`.
++
++You can also create type/section specific hooks in `layouts/[type/section]/_markup`, e.g.: `layouts/blog/_markup`.{{< new-in "0.71.0" >}}
++
++The hook kinds currently supported are:
++
++* `image`
++* `link`
++* `heading` {{< new-in "0.71.0" >}}
++* `codeblock`{{< new-in "0.83.0" >}}
++
++You can define [Output-Format-](/templates/output-formats) and [language-](/content-management/multilingual/)specific templates if needed. Your `layouts` folder may look like this:
++
++```goat { class="black f7" }
++layouts
++└── _default
++    └── _markup
++        ├── render-image.html
++        ├── render-image.rss.xml
++        └── render-link.html
++        └── render-codeblock.html
++        └── render-codeblock-bash.html
++```
++
++Some use cases for the above:
++
++* Resolve link references using `.GetPage`. This would make links portable as you could translate `./my-post.md` (and similar constructs that would work on GitHub) into `/blog/2019/01/01/my-post/` etc.
++* Add `target=_blank` to external links.
++* Resolve and [process](/content-management/image-processing/) images.
++* Add [header links](https://remysharp.com/2014/08/08/automatic-permalinks-for-blog-posts).
++
++## Render Hooks for Headings, Links and Images
++
++The `render-link` and `render-image` templates will receive this context:
++
++Page
++: The [Page](/variables/page/) being rendered.
++
++Destination
++: The URL.
++
++Title
++: The title attribute.
++
++Text
++: The rendered (HTML) link text.
++
++PlainText
++: The plain variant of the above.
++
++The `render-heading` template will receive this context:
++
++Page
++: The [Page](/variables/page/) being rendered.
++
++Level
++: The header level (1--6)
++
++Anchor
++: An auto-generated html id unique to the header within the page
++
++Text
++: The rendered (HTML) text.
++
++PlainText
++: The plain variant of the above.
++
++Attributes (map) {{< new-in "0.82.0" >}}
++: A map of attributes (e.g. `id`, `class`)
++
++### Link with title Markdown example:
++
++```md
++[Text](https://www.gohugo.io "Title")
++```
++
++Here is a code example for how the render-link.html template could look:
++
++{{< code file="layouts/_default/_markup/render-link.html" >}}
++<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>
++{{< /code >}}
++
++### Image Markdown example:
++
++```md
++![Text](https://d33wubrfki0l68.cloudfront.net/c38c7334cc3f23585738e40334284fddcaf03d5e/2e17c/images/hugo-logo-wide.svg "Title")
++```
++
++Here is a code example for how the render-image.html template could look:
++
++{{< code file="layouts/_default/_markup/render-image.html" >}}
++<p class="md__image">
++  <img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
++</p>
++{{< /code >}}
++
++### Heading link example
++
++Given this template file
++
++{{< code file="layouts/_default/_markup/render-heading.html" >}}
++<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }} <a href="#{{ .Anchor | safeURL }}">¶</a></h{{ .Level }}>
++{{< /code >}}
++
++And this markdown
++
++```md
++### Section A
++```
++
++The rendered html will be
++
++```html
++<h3 id="section-a">Section A <a href="#section-a">¶</a></h3>
++```
++
++## Render Hooks for Code Blocks
++
++{{< new-in "0.93.0" >}}
++
++You can add a hook template for either all code blocks or for a specific type/language (`bash` in the example below):
++
++```goat { class="black f7" }
++layouts
++└── _default
++    └── _markup
++        └── render-codeblock.html
++        └── render-codeblock-bash.html
++```
++
++The default behaviour for these code blocks is to do [Code Highlighting](/content-management/syntax-highlighting/#highlighting-in-code-fences), but since you can pass attributes to these code blocks, they can be used for almost anything. One example would be the built-in [GoAT Diagrams](/content-management/diagrams/#goat-diagrams-ascii) or this [Mermaid Diagram Code Block Hook](/content-management/diagrams/#mermaid-diagrams) example.
++
++The context (the ".") you receive in a code block template contains:
++
++Type (string)
++: The type of code block. This will be the programming language, e.g. `bash`, when doing code highlighting.
++
++Attributes (map)
++: Attributes passed in from Markdown (e.g. `{ attrName1=attrValue1 attrName2="attr Value 2" }`).
++
++Options (map)
++: Chroma highlighting processing options. This will only be filled if `Type` is a known [Chroma Lexer](/content-management/syntax-highlighting/#list-of-chroma-highlighting-languages).
++
++Inner (string)
++: The text between the code fences.
++
++Ordinal (integer)
++: Zero-based ordinal for all code blocks in the current document.
++
++Page
++: The owning `Page`.
++
++Position
++: Useful in error logging as it prints the filename and position (linenumber, column), e.g. `{{ errorf "error in code block: %s" .Position }}`.
index fbe873827653a0f730567626566fba03d127e324,0000000000000000000000000000000000000000..0a5150a8ae9aa7a6da7ecaf1aa3b830d11019623
mode 100644,000000..100644
--- /dev/null
@@@ -1,76 -1,0 +1,76 @@@
- {{ partial "header" }}
 +---
 +title: Template Debugging
 +# linktitle: Template Debugging
 +description: You can use Go templates' `printf` function to debug your Hugo  templates. These snippets provide a quick and easy visualization of the variables available to you in different contexts.
 +date: 2017-02-01
 +publishdate: 2017-02-01
 +lastmod: 2017-02-01
 +categories: [templates]
 +keywords: [debugging,troubleshooting]
 +menu:
 +  docs:
 +    parent: "templates"
 +    weight: 180
 +weight: 180
 +sections_weight: 180
 +draft: false
 +aliases: []
 +toc: false
 +---
 +
 +Here are some snippets you can add to your template to answer some common questions.
 +
 +These snippets use the `printf` function available in all Go templates.  This function is an alias to the Go function, [fmt.Printf](https://golang.org/pkg/fmt/).
 +
 +## What Variables are Available in this Context?
 +
 +You can use the template syntax, `$.`, to get the top-level template context from anywhere in your template. This will print out all the values under, `.Site`.
 +
 +```
 +{{ printf "%#v" $.Site }}
 +```
 +
 +This will print out the value of `.Permalink`:
 +
 +
 +```
 +{{ printf "%#v" .Permalink }}
 +```
 +
 +
 +This will print out a list of all the variables scoped to the current context
 +(`.`, aka ["the dot"][tempintro]).
 +
 +
 +```
 +{{ printf "%#v" . }}
 +```
 +
 +
 +When developing a [homepage][], what does one of the pages you're looping through look like?
 +
 +```
 +{{ range .Pages }}
 +    {{/* The context, ".", is now each one of the pages as it goes through the loop */}}
 +    {{ printf "%#v" . }}
 +{{ end }}
 +```
 +
 +## Why Am I Showing No Defined Variables?
 +
 +Check that you are passing variables in the `partial` function:
 +
 +```
- {{ partial "header" . }}
++{{ partial "header.html" }}
 +```
 +
 +This example will render the header partial, but the header partial will not have access to any contextual variables. You need to pass variables explicitly. For example, note the addition of ["the dot"][tempintro].
 +
 +```
++{{ partial "header.html" . }}
 +```
 +
 +The dot (`.`) is considered fundamental to understanding Hugo templating. For more information, see [Introduction to Hugo Templating][tempintro].
 +
 +[homepage]: /templates/homepage/
 +[tempintro]: /templates/introduction/
index 7462deec78839836f592840baab57c370fb16754,0000000000000000000000000000000000000000..14eb2aca2344337b1eeb61659e4dcd3b7b907da5
mode 100644,000000..100644
--- /dev/null
@@@ -1,48 -1,0 +1,48 @@@
 +---
 +title: Shortcode Variables
 +linktitle: Shortcode Variables
 +description: Shortcodes can access page variables and also have their own specific built-in variables.
 +date: 2017-03-12
 +publishdate: 2017-03-12
 +lastmod: 2017-03-12
 +categories: [variables and params]
 +keywords: [shortcodes]
 +draft: false
 +menu:
 +  docs:
 +    parent: "variables"
 +    weight: 20
 +weight: 20
 +sections_weight: 20
 +aliases: []
 +toc: false
 +---
 +
 +[Shortcodes][shortcodes] have access to parameters delimited in the shortcode declaration via [`.Get`][getfunction], page- and site-level variables, and also the following shortcode-specific fields:
 +
 +.Name
 +: Shortcode name.
 +
 +.Ordinal
 +: Zero-based ordinal in relation to its parent. If the parent is the page itself, this ordinal will represent the position of this shortcode in the page content.
 +
++.Page
++: The owning ´Page`.
++
 +.Parent
 +: provides access to the parent shortcode context in nested shortcodes. This can be very useful for inheritance of common shortcode parameters from the root.
 +
 +.Position
 +: Contains [filename and position](https://godoc.org/github.com/gohugoio/hugo/common/text#Position) for the shortcode in a page. Note that this can be relatively expensive to calculate, and is meant for error reporting. See [Error Handling in Shortcodes](/templates/shortcode-templates/#error-handling-in-shortcodes).
 +
 +.IsNamedParams
 +: boolean that returns `true` when the shortcode in question uses [named rather than positional parameters][shortcodes]
 +
 +.Inner
 +: represents the content between the opening and closing shortcode tags when a [closing shortcode][markdownshortcode] is used
 +
 +[getfunction]: /functions/get/
 +[markdownshortcode]: /content-management/shortcodes/#shortcodes-with-markdown
 +[shortcodes]: /templates/shortcode-templates/
 +
 +
index ff573d54b7179160da4878dde4a3716ab2e3ce83,0000000000000000000000000000000000000000..299602318c4c854a1cc752ffbcc5a5199239f22b
mode 100644,000000..100644
--- /dev/null
@@@ -1,68 -1,0 +1,68 @@@
-             {{ partial "maintenance-pages-table" $recent }}
 +{{ define "main" }}
 +<div class="w-100 ph4 pb5 pb6-ns pt1 mt4 pt3-ns">
 +    <div class="flex-l">
 +        <div class="order-2 w-100 w-20-l ph5-m ph0-l mb4 sticky">
 +            <aside class="fixed-lTK mw5-l right-0 f6 bl-l b--moon-gray pv4 pv0-ns ph4-l nested-list-reset nested-links nested-copy-line-height">
 +                <p class="b">What's on this Page</p>
 +                <ul>
 +                    <li><a href="#last-updated">Last Updated</a></li>
 +                    <li><a href="#least-recently-updated">Least Recently Updated</a></li>
 +                    <li><a href="#todos">Pages marked with TODO</a></li>
 +                    <li><a href="#dependencies">Project dependencies (Hugo Modules)</a></li>
 +                </ul>
 +            </aside>
 +        </div>
 +        <div class="w-100">
 +            {{ $byLastMod :=  .Site.RegularPages.ByLastmod  }}
 +            {{ $recent := ($byLastMod | last 30).Reverse }}
 +            {{ $leastRecent := $byLastMod | first 10 }}            
 +            <h2 id="last-updated">Last Updated</h2>
-             {{ partial "maintenance-pages-table" $leastRecent }}
++            {{ partial "maintenance-pages-table.html" $recent }}
 +            <h2 id="least-recently-updated">Least Recently Updated</h2>
-             {{ partial "maintenance-pages-table" (.Scratch.Get "todos") }}
++            {{ partial "maintenance-pages-table.html" $leastRecent }}
 +
 +            {{/* Don't think this is possible with where directly. Should investigate. */}}
 +            {{ .Scratch.Set "todos" slice }}
 +            {{ range .Site.RegularPages }}
 +                 {{ if .HasShortcode "todo" }}
 +                 {{ $.Scratch.Add "todos" . }}
 +                 {{ end }}
 +            {{ end }}
 +            <h2 id="todos">Pages marked with TODO</h2>
++            {{ partial "maintenance-pages-table.html" (.Scratch.Get "todos") }}
 +
 +            <h2 id="dependencies">Dependencies</h2>
 +            <table class="collapse ba br2 b--black-10 pv2 ph3">
 +              <thead>
 +                <tr>
 +                  <th class="pv2 ph3 tl f6 fw6 ttu">#</th>
 +                  <th class="pv2 ph3 tl f6 fw6 ttu">Owner</th>
 +                  <th class="pv2 ph3 tl f6 fw6 ttu">Path</th>
 +                  <th class="pv2 ph3 tl f6 fw6 ttu">Version</th>
 +                  <th class="pv2 ph3 tl f6 fw6 ttu">Time</th>
 +                  <th class="pv2 ph3 tl f6 fw6 ttu">Vendor</th>
 +                </tr>
 +              </thead>
 +              <tbody>
 +                {{ range $index, $element := hugo.Deps }}
 +                <tr class="striped--light-gray">
 +                  <th class="pv2 ph3">{{ add $index 1 }}</th>
 +                  <td class="pv2 ph3">{{ with $element.Owner }}{{.Path }}{{ end }}</td>
 +                  <td class="pv2 ph3">
 +                    {{ $element.Path }}
 +                    {{ with $element.Replace}}
 +                    => {{ .Path }}
 +                    {{ end }}
 +                  </td>
 +                  <td class="pv2 ph3">{{ $element.Version }}</td>
 +                  <td class="pv2 ph3">{{ with $element.Time }}{{ . }}{{ end }}</td>
 +                  <td class="pv2 ph3">{{ $element.Vendor }}</td>
 +                </tr>
 +                {{ end }}
 +              </tbody>
 +            </table>
 +
 +        </div>
 +    </div>
 +</div>
 +{{ end }}
index 181e97f1dea77c9b14048e44f7a1604ca411e208,0000000000000000000000000000000000000000..f792702ce14f9877b35cb53cfbd6d89bf56cfe4a
mode 100644,000000..100644
--- /dev/null
@@@ -1,27 -1,0 +1,26 @@@
- {{ $original := .Page.Resources.GetMatch (printf "*%s*" (.Get 0)) }}
++{{ $img := .Page.Resources.GetMatch (printf "*%s*" (.Get 0)) }}
 +{{ $command := .Get 1 }}
 +{{ $options := .Get 2 }}
 +{{ if eq $command "Fit"}}
- {{ .Scratch.Set "image" ($original.Fit $options) }}
++  {{ $img = $img.Fit $options }}
 +{{ else if eq $command "Resize"}}
- {{ .Scratch.Set "image" ($original.Resize $options) }}
++  {{ $img = $img.Resize $options }}
 +{{ else if eq $command "Fill"}}
- {{ .Scratch.Set "image" ($original.Fill $options) }}
++  {{ $img = $img.Fill $options }}
 +{{ else if eq $command "Crop"}}
- {{ .Scratch.Set "image" ($original.Crop $options) }}
++  {{ $img = $img.Crop $options }}
 +{{ else }}
- {{ errorf "Invalid image processing command: Must be one of Crop, Fit, Fill or Resize."}}
++  {{ errorf "Invalid image processing command: Must be one of Crop, Fit, Fill or Resize."}}
 +{{ end }}
- {{ $image := .Scratch.Get "image" }}
 +<figure style="padding: 0.25rem; margin: 2rem 0; background-color: #cccc">
-       <img style="max-width: 100%; width: auto; height: auto;" src="{{ $image.RelPermalink }}" width="{{ $image.Width }}" height="{{ $image.Height }}">
-       <figcaption>
-       <small>
-       {{ with .Inner }}
-       {{ . }}
-       {{ else }}
-       .{{ $command }} "{{ $options }}"
-       {{ end }}
-       </small>
-       </figcaption>
- </figure>
++  <img style="max-width: 100%; width: auto; height: auto;" src="{{ $img.RelPermalink }}" width="{{ $img.Width }}" height="{{ $img.Height }}">
++  <figcaption>
++  <small>
++    {{ with .Inner }}
++      {{ . }}
++    {{ else }}
++      .{{ $command }} "{{ $options }}"
++    {{ end }}
++  </small>
++  </figcaption>
++</figure>
index f7f61503032e5e9c785c563a166857d5144b5502,0000000000000000000000000000000000000000..a29dc9ec366d881f106043298de670062ac141de
mode 100644,000000..100644
--- /dev/null
@@@ -1,35 -1,0 +1,35 @@@
- HUGO_VERSION = "0.93.3"
 +[build]
 +publish = "public"
 +command = "hugo --gc --minify"
 +
 +[context.production.environment]
- HUGO_VERSION = "0.93.3"
++HUGO_VERSION = "0.95.0"
 +HUGO_ENV = "production"
 +HUGO_ENABLEGITINFO = "true"
 +
 +[context.split1]
 +command = "hugo --gc --minify --enableGitInfo"
 +
 +[context.split1.environment]
- HUGO_VERSION = "0.93.3"
++HUGO_VERSION = "0.95.0"
 +HUGO_ENV = "production"
 +
 +[context.deploy-preview]
 +command = "hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL"
 +
 +[context.deploy-preview.environment]
- HUGO_VERSION = "0.93.3"
++HUGO_VERSION = "0.95.0"
 +
 +[context.branch-deploy]
 +command = "hugo --gc --minify -b $DEPLOY_PRIME_URL"
 +
 +[context.branch-deploy.environment]
- status = 200
++HUGO_VERSION = "0.95.0"
 +
 +[context.next.environment]
 +HUGO_ENABLEGITINFO = "true"
 +
 +[[redirects]]
 +from = "/npmjs/*"
 +to = "/npmjs/"
++status = 200