hugo/content/en/templates/introduction.md
Bjørn Erik Pedersen b6b37a1f00 Squashed 'docs/' changes from f59b3ab06..cfe89ecbc
cfe89ecbc Set all *.png files under static/images to mode 0644
d847ccd8b More spelling error fixes
bf1405d92 Correction: .Pages on homepage is same as .Site.RegularPages
7efa41ff5 Merge commit 'd137efe0222269e09b427325176f0044558e3cc5'
d137efe02 Squashed 'themes/gohugoioTheme/' changes from f31a3dc8..66249819
50df8bfb8 Replace .Data.Pages with .Pages
85d3712d0 Mention the newScratch template func
1c234db1b Release 0.44
a51cb3e36 Merge branch 'temp44'
ec424a5e2 releaser: Prepare repository for 0.45-DEV
425e85574 releaser: Add release notes to /docs for release of 0.44
e6f9c65a2 releaser: Bump versions for release of 0.44
45548a5c9 Arch Linux: Partial upgrades are unsupported
c0430f8f9 Update MenuEntry properties documentation
79109b685 Refresh the documentation on staticDir config parameter
80ed4592b Remove duplicate links; also sort them alphabetically
f00a4e232 HTTPS links to third-party sites
2f6f682ba Fixed a typo
4be105202 add openbsd howto install
39808f50a Fix typo
b55c0f3a0 Fix URL to hugotest
2fb157237 Release Hugo 0.43
e8af6a970 Merge branch 'temp43'
563dd4173 Adjust release notes
50aed2e52 releaser: Prepare repository for 0.44-DEV
363b363ff releaser: Add release notes to /docs for release of 0.43
93bfbef62 releaser: Bump versions for release of 0.43
893a27d33 Fix typos
fe5908257 Celebrate: a few typo and grammar fixes
bb20442df Merge commit '98293eaa1570b5aff4452021c8b6d6c8560b3f06'
ef3d63936 Add a newScratch template func
bf100a3cd Merge branch 'release-0.42.2'
f1133c544 releaser: Prepare repository for 0.43-DEV
2ce058057 releaser: Add release notes to /docs for release of 0.42.2
6073927c6 releaser: Bump versions for release of 0.42.2
3bafddd52 releaser: Prepare repository for 0.43-DEV
8b9f805bd releaser: Add release notes to /docs for release of 0.42.1
efb6638ba releaser: Bump versions for release of 0.42.1
1e74ffbe0 releaser: Prepare repository for 0.43-DEV
2d2d0f8ab releaser: Add release notes to /docs for release of 0.42
17f685813 releaser: Bump versions for release of 0.42
67ef1a0e1 docs: Update theme documentation
d74874e1e docs: Remove some files now moved
771d50cf3 Merge commit 'b239595af5a9fc1fc9a1ccc666c3ab06ccc32f04'
f9b5fd2d2 tplimpl: Remove speakerdeck shortcode
523206579 tpl/strings: strings.RuneCount
b389efc88 tpl: Add strings.Repeat
a41ad0254 Add a BlackFriday option for rel="noreferrer" on external links
a6e279362 Add a BlackFriday option for rel="nofollow" on external links
7e2c9846e releaser: Prepare repository for 0.42-DEV
b4f81c38a releaser: Add release notes to /docs for release of 0.41
55667b3a1 releaser: Bump versions for release of 0.41
afceb02d3 docs: Document the GDPR Privacy Config
8b8289027 Merge commit 'd2b1030060d3c91d5f9ffa3456418da16bd74f1d'
be04a8886 Merge branch 'release-0.40.3'
33ca0b8da releaser: Prepare repository for 0.41-DEV
8c9a5a850 releaser: Add release notes to /docs for release of 0.40.3
85845a4fd releaser: Bump versions for release of 0.40.3
9af79e531 Merge commit '83bef6955e014d40c0f00db9cebe09113154e999'
c4200dd0e Fix typo
8f8323336 releaser: Prepare repository for 0.41-DEV
9fab87505 releaser: Add release notes to /docs for release of 0.40.2
83648c666 releaser: Bump versions for release of 0.40.2
e6434d104 releaser: Prepare repository for 0.41-DEV
9389b2973 releaser: Add release notes to /docs for release of 0.40.1
32979e28a releaser: Bump versions for release of 0.40.1
196174a76 releaser: Prepare repository for 0.41-DEV
490a997bb releaser: Add release notes to /docs for release of 0.40
018aa6471 releaser: Bump versions for release of 0.40
92221934c Merge commit 'a215abf70e018f4bf40d6c09d8bd148d8684b33d'
0a58ef56e Merge commit 'd2ec1a06df8ab6b17ad05cb008d5701b40327d47'
312ab58c6 Improve .Get docs
e43e8cee3 .Get function: fix syntax signature
bb16150bc releaser: Prepare repository for 0.40-DEV
8cc80fed9 releaser: Add release notes to /docs for release of 0.39
f7aa0d1c5 releaser: Bump versions for release of 0.39
42e48706a Merge commit '047c4188dfc854f658d16f1e4a9501f9c97a31c7'
76acab68b releaser: Prepare repository for 0.39-DEV
d270600b0 releaser: Add release notes to /docs for release of 0.38.2
97be36992 releaser: Bump versions for release of 0.38.2
cd29b8b79 releaser: Prepare repository for 0.39-DEV
9983a4bdf releaser: Add release notes to /docs for release of 0.38.1
7774afd01 releaser: Bump versions for release of 0.38.1
b89157f20 releaser: Prepare repository for 0.39-DEV
af4d0bf62 releaser: Add release notes to /docs for release of 0.38
ca98e7d4f releaser: Bump versions for release of 0.38
8b773833a Merge commit 'ed8bf081fdbf336e026517b7e1b123c039014ab5'
24202bb71 docs: Generate docshelper data
43d15975d Add .Site.IsServer
6f99d3d65 Merge commit '0a23baa6a90901f772c234107c4f12c16c76f4aa'
17487ccdd hugolib: Add Reset method to delete key from Scratch
ccbf7a05c docs: Add docs for lang.Merge
5ad46d78e Merge commit '3886fc1fef6ac19d58b9ba1bb642d0c6c9a54031'
ac403c280 docs: Add docs on the new front matter configuration
6066c60e6 Merge commit 'c0290655825e7bb36e13fb39f89d85b392cf1adc'
ee605c7ae releaser: Prepare repository for 0.38-DEV
31a4de966 releaser: Add release notes to /docs for release of 0.37.1
9dd3dafe1 releaser: Bump versions for release of 0.37.1
141750aec releaser: Prepare repository for 0.38-DEV
c9bb39bc3 releaser: Add release notes to /docs for release of 0.37
c7009f064 releaser: Bump versions for release of 0.37
9f727d916 Merge commit '900b5f6cfe5a377ef369d26cd700201be4cf6b06'
87fd97853 Merge commit '374d184e6747678364fd61f5faf328ec9205eb6b'
244deafc2 Fix typos in development contribution doc
608c80f72 Merge branch 'release-0.36.1'
0f8ffbd5c releaser: Prepare repository for 0.37-DEV
5028ee849 releaser: Add release notes to /docs for release of 0.36.1
9ccc7cb11 releaser: Bump versions for release of 0.36.1
3db31be07 Merge commit '9cc9bab46288d8d5f9fda7009c5f746258cec1b4'
9468246c5 Add "target" and "rel" parameters to figure shortcode
6d7fa89f9 releaser: Prepare repository for 0.37-DEV
1aec7ad81 releaser: Add release notes to /docs for release of 0.36
b522da389 releaser: Bump versions for release of 0.36
bb78bea13 docs: Add documentation for smart cropping etc.
930f16cae Merge commit 'c305e44f5f081e4436195923a4593e396f07cd49'
0e4c80ab9 releaser: Prepare repository for 0.36-DEV
e0d4c6bcd releaser: Add release notes to /docs for release of 0.35
f4ac67eb3 releaser: Bump versions for release of 0.35
229a50b1f docs: Regenerate CLI docs
72958eb9c Merge commit '337d0c5f516ee085205e8abefdb7f87e6d33ca05'
d998ca4c0 command: Remove undraft command
34a0052ef docs: Re-generate CLI docs
fa04ff331 releaser: Prepare repository for 0.35-DEV
55e595720 releaser: Add release notes to /docs for release of 0.34
bf4d0e8fb releaser: Bump versions for release of 0.34
07673370e releaser: Prepare repository for 0.34-DEV
921ea8920 releaser: Add release notes to /docs for release of 0.33
3307f61bd releaser: Bump versions for release of 0.33
792a4410d Merge commit '3cf4300097610bb8b5bd0686d96d1df5db641895'
6d8a9f657 releaser: Prepare repository for 0.33-DEV
e3afccf6f releaser: Add release notes to /docs for release of 0.32.4
7f29cb196 releaser: Bump versions for release of 0.32.4
baa364436 releaser: Prepare repository for 0.33-DEV
60c775166 releaser: Add release notes to /docs for release of 0.32.3
9cbab1803 releaser: Bump versions for release of 0.32.3
51823efee releaser: Prepare repository for 0.33-DEV
71e03684c releaser: Add release notes to /docs for release of 0.32.2
e18bf56fb releaser: Bump versions for release of 0.32.2
54aa93927 Merge commit 'eb738cd35cca1ffc68c5ed688dbe2a19108e8761'
5e8123994 releaser: Prepare repository for 0.33-DEV
a55b78124 releaser: Add release notes to /docs for release of 0.32.1
7de53ff41 releaser: Bump versions for release of 0.32.1
e6e58785d releaser: Prepare repository for 0.33-DEV
58cf5009d releaser: Add release notes to /docs for release of 0.32
031719821 Merge commit 'f3cd083961f36dc96d05e98aaf67f650102bc757'
b9183604b Add Pandoc support, refactor external helpers
3f9b9474c releaser: Prepare repository for 0.32-DEV
11e4ce514 releaser: Add release notes to /docs for release of 0.31.1
aebb1504b releaser: Bump versions for release of 0.31.1
d70b54d4a releaser: Prepare repository for 0.32-DEV
cdc10468e releaser: Add release notes to /docs for release of 0.31
38bd41cab releaser: Bump versions for release of 0.31
1c581a11d Merge commit '30c0d485eaff6d70df1be0353911ddca485d52bf'
b88e46d02 Merge commit '05e42bc643f1840ed2ad9c2eff82a269d1381683'
a45ab174e Handle Taxonomy permalinks
9f27354f6 Add support for height argument to figure shortcode
acc8e49c1 releaser: Prepare repository for 0.31-DEV
977266b19 releaser: Add release notes to /docs for release of 0.30.2
31b672844 releaser: Bump versions for release of 0.30.2
b8f6b72a8 Merge commit '325009c3fd4ac90021897b7e3e025c14e70ce162'
c6e3dae71 releaser: Prepare repository for 0.31-DEV
2a3c7c7d9 releaser: Add release notes to /docs for release of 0.30.1
4c014117a releaser: Bump versions for release of 0.30.1
1da61da06 releaser: Prepare repository for 0.31-DEV
24864a46b releaser: Add release notes to /docs for release of 0.30
3011aa44a releaser: Bump versions for release of 0.30
bcbf3237b Merge commit 'ecf5e081b5540e69f4af330233f39a07baf53846'
ab68b99ed Merge commit 'dae5a7c61cceeb0de59f2d755f63e453f71dd9b2'
0ae435725 tpl: Add errorf template function
ac3fb3808 Change SummaryLength to be configurable (#3924)
3c0e4fa70 tpl: Add os.fileExists template function
9290f3983 Merge commit '9d68f695e782c6a83c77aff13317c7a22c694c98'
394e8b3f6 tpl: Add float template function
c0c48c2ea releaser: Prepare repository for 0.30-DEV
0806d910b releaser: Add release notes to /docs for release of 0.29
0d1101836 releaser: Bump versions for release of 0.29
5d92b552b releaser: Prepare repository for 0.29-DEV
1ef521182 releaser: Add release notes to /docs for release of 0.28
c5441cff1 releaser: Bump versions for release of 0.28
46c2786f1 Merge commit '61c27b58b353c73772aae572c7d822fdfdf7791b'
6fed4008f Merge commit '30694a133a88d5f76a51d0372646e10cbeca7691'
595752e2f Merge commit '7a89dce53bfbd67a17442a8f9be8fa895fc4f9b1'
af14cae0c Merge commit 'ba45da9d03056447e4873de13d4e0f8d658a769b'
d0bb30963 releaser: Prepare repository for 0.28-DEV
469bf26aa releaser: Add release notes to /docs for release of 0.27.1
06ea00c12 releaser: Bump versions for release of 0.27.1
0668af58e releaser: Prepare repository for 0.28-DEV
4ce00c84d releaser: Add release notes to /docs for release of 0.27
68f318d0b releaser: Bump versions for release of 0.27
509ad6cc0 docs: Merge commit '1b4319be62ba071f79e90ef32dbe92eb893429f7'
c625ae1ce docs: Document Related Content
ecd5c24f5 docs: Merge commit '7d63a23b0c68d9cd7c7c09c2755619237bc03485'
b97b84f9d Update docs versiona and README
2238f7a4a Merge commit 'ec4e6f9df2ab9ffdc62a3f59675369096e0d3f77' as 'docs'

git-subtree-dir: docs
git-subtree-split: cfe89ecbc2288a7270c23dbcc179733c8d978c4c
2018-07-18 11:04:57 +02:00

17 KiB

title linktitle description godocref date publishdate lastmod categories keywords menu weight sections_weight draft aliases toc
Introduction to Hugo Templating Introduction Hugo uses Go's `html/template` and `text/template` libraries as the basis for the templating. https://golang.org/pkg/html/template/ 2017-02-01 2017-02-01 2017-02-25
templates
fundamentals
go
docs
parent weight
templates 10
10 10 false
/templates/introduction/
/layouts/introduction/
/layout/introduction/
/templates/go-templates/
true

{{% note %}} The following is only a primer on Go templates. For an in-depth look into Go templates, check the official Go docs. {{% /note %}}

Go templates provide an extremely simple template language that adheres to the belief that only the most basic of logic belongs in the template or view layer.

{{< youtube gnJbPO-GFIw >}}

Basic Syntax

Go templates are HTML files with the addition of variables and functions. Go template variables and functions are accessible within {{ }}.

Access a Predefined Variable

{{ foo }}

Parameters for functions are separated using spaces. The following example calls the add function with inputs of 1 and 2:

{{ add 1 2 }}

Methods and Fields are Accessed via dot Notation

Accessing the Page Parameter bar defined in a piece of content's front matter.

{{ .Params.bar }}

Parentheses Can be Used to Group Items Together

{{ if or (isset .Params "alt") (isset .Params "caption") }} Caption {{ end }}

Variables

Each Go template gets a data object. In Hugo, each template is passed a Page. See variables for more information.

This is how you access a Page variable from a template:

<title>{{ .Title }}</title>

Values can also be stored in custom variables and referenced later:

{{ $address := "123 Main St."}}
{{ $address }}

{{% warning %}} Variables defined inside if conditionals and similar are not visible on the outside. See https://github.com/golang/go/issues/10608.

Hugo has created a workaround for this issue in Scratch.

{{% /warning %}}

Functions

Go templates only ship with a few basic functions but also provide a mechanism for applications to extend the original set.

Hugo template functions provide additional functionality specific to building websites. Functions are called by using their name followed by the required parameters separated by spaces. Template functions cannot be added without recompiling Hugo.

Example 1: Adding Numbers

{{ add 1 2 }}
=> 3

Example 2: Comparing Numbers

{{ lt 1 2 }}
=> true (i.e., since 1 is less than 2)

Note that both examples make use of Go template's math functions.

{{% note "Additional Boolean Operators" %}} There are more boolean operators than those listed in the Hugo docs in the Go template documentation. {{% /note %}}

Includes

When including another template, you will need to pass it the data that it would need to access.

{{% note %}} To pass along the current context, please remember to include a trailing dot. {{% /note %}}

The templates location will always be starting at the layouts/ directory within Hugo.

Partial

The partial function is used to include partial templates using the syntax {{ partial "<PATH>/<PARTIAL>.<EXTENSION>" . }}.

Example:

{{ partial "header.html" . }}

Template

The template function was used to include partial templates in much older Hugo versions. Now it is still useful for calling internal templates:

{{ template "_internal/opengraph.html" . }}

Logic

Go templates provide the most basic iteration and conditional logic.

Iteration

Just like in Go, the Go templates make heavy use of range to iterate over a map, array, or slice. The following are different examples of how to use range.

Example 1: Using Context

{{ range array }}
    {{ . }}
{{ end }}

Example 2: Declaring Value => Variable name

{{range $element := array}}
    {{ $element }}
{{ end }}

Example 3: Declaring Key-Value Variable Name

{{range $index, $element := array}}
   {{ $index }}
   {{ $element }}
{{ end }}

Conditionals

if, else, with, or, and and provide the framework for handling conditional logic in Go Templates. Like range, each statement is closed with an {{end}}.

Go Templates treat the following values as false:

  • false
  • 0
  • any zero-length array, slice, map, or string

Example 1: if

{{ if isset .Params "title" }}<h4>{{ index .Params "title" }}</h4>{{ end }}

Example 2: ifelse

{{ if isset .Params "alt" }}
    {{ index .Params "alt" }}
{{else}}
    {{ index .Params "caption" }}
{{ end }}

Example 3: and & or

{{ if and (or (isset .Params "title") (isset .Params "caption")) (isset .Params "attr")}}

Example 4: with

An alternative way of writing "if" and then referencing the same value is to use "with" instead. with rebinds the context . within its scope and skips the block if the variable is absent.

The first example above could be simplified as:

{{ with .Params.title }}<h4>{{ . }}</h4>{{ end }}

Example 5: ifelse if

{{ if isset .Params "alt" }}
    {{ index .Params "alt" }}
{{ else if isset .Params "caption" }}
    {{ index .Params "caption" }}
{{ end }}

Pipes

One of the most powerful components of Go templates is the ability to stack actions one after another. This is done by using pipes. Borrowed from Unix pipes, the concept is simple: each pipeline's output becomes the input of the following pipe.

Because of the very simple syntax of Go templates, the pipe is essential to being able to chain together function calls. One limitation of the pipes is that they can only work with a single value and that value becomes the last parameter of the next pipeline.

A few simple examples should help convey how to use the pipe.

Example 1: shuffle

The following two examples are functionally the same:

{{ shuffle (seq 1 5) }}
{{ (seq 1 5) | shuffle }}

Example 2: index

The following accesses the page parameter called "disqus_url" and escapes the HTML. This example also uses the index function, which is built into Go templates:

{{ index .Params "disqus_url" | html }}

Example 3: or with isset

{{ if or (or (isset .Params "title") (isset .Params "caption")) (isset .Params "attr") }}
Stuff Here
{{ end }}

Could be rewritten as

{{ if isset .Params "caption" | or isset .Params "title" | or isset .Params "attr" }}
Stuff Here
{{ end }}

Example 4: Internet Explorer Conditional Comments

By default, Go Templates remove HTML comments from output. This has the unfortunate side effect of removing Internet Explorer conditional comments. As a workaround, use something like this:

{{ "<!--[if lt IE 9]>" | safeHTML }}
  <script src="html5shiv.js"></script>
{{ "<![endif]-->" | safeHTML }}

Alternatively, you can use the backtick (`) to quote the IE conditional comments, avoiding the tedious task of escaping every double quotes (") inside, as demonstrated in the examples in the Go text/template documentation:

{{ `<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->` | safeHTML }}

Context (aka "the dot")

The most easily overlooked concept to understand about Go templates is that {{ . }} always refers to the current context. In the top level of your template, this will be the data set made available to it. Inside of an iteration, however, it will have the value of the current item in the loop; i.e., {{ . }} will no longer refer to the data available to the entire page. If you need to access page-level data (e.g., page params set in front matter) from within the loop, you will likely want to do one of the following:

1. Define a Variable Independent of Context

The following shows how to define a variable independent of the context.

{{< code file="tags-range-with-page-variable.html" >}} {{ $title := .Site.Title }}

    {{ range .Params.tags }}
  • {{ . }} - {{ $title }}
  • {{ end }}
{{< /code >}}

{{% note %}} Notice how once we have entered the loop (i.e. range), the value of {{ . }} has changed. We have defined a variable outside of the loop ({{$title}}) that we've assigned a value so that we have access to the value from within the loop as well. {{% /note %}}

2. Use $. to Access the Global Context

$ has special significance in your templates. $ is set to the starting value of . ("the dot") by default. This is a documented feature of Go text/template. This means you have access to the global context from anywhere. Here is an equivalent example of the preceding code block but now using $ to grab .Site.Title from the global context:

{{< code file="range-through-tags-w-global.html" >}}

    {{ range .Params.tags }}
  • {{ . }} - {{ $.Site.Title }}
  • {{ end }}
{{< /code >}}

{{% warning "Don't Redefine the Dot" %}} The built-in magic of $ would cease to work if someone were to mischievously redefine the special character; e.g. {{ $ := .Site }}. Don't do it. You may, of course, recover from this mischief by using {{ $ := . }} in a global context to reset $ to its default value. {{% /warning %}}

Whitespace

Go 1.6 includes the ability to trim the whitespace from either side of a Go tag by including a hyphen (-) and space immediately beside the corresponding {{ or }} delimiter.

For instance, the following Go template will include the newlines and horizontal tab in its HTML output:

<div>
  {{ .Title }}
</div>

Which will output:

<div>
  Hello, World!
</div>

Leveraging the - in the following example will remove the extra white space surrounding the .Title variable and remove the newline:

<div>
  {{- .Title -}}
</div>

Which then outputs:

<div>Hello, World!</div>

Go considers the following characters whitespace:

  • space
  • horizontal tab
  • carriage return
  • newline

Comments

In order to keep your templates organized and share information throughout your team, you may want to add comments to your templates. There are two ways to do that with Hugo.

Go templates comments

Go templates support {{/* and */}} to open and close a comment block. Nothing within that block will be rendered.

For example:

Bonsoir, {{/* {{ add 0 + 2 }} */}}Eliott.

Will render Bonsoir, Eliott., and not care about the syntax error (add 0 + 2) in the comment block.

HTML comments

If you need to produce HTML comments from your templates, take a look at the Internet Explorer conditional comments example. If you need variables to construct such HTML comments, just pipe printf to safeHTML. For example:

{{ printf "<!-- Our website is named: %s -->" .Site.Title | safeHTML }}

HTML comments containing Go templates

HTML comments are by default stripped, but their content is still evaluated. That means that although the HTML comment will never render any content to the final HTML pages, code contained within the comment may fail the build process.

{{% note %}} Do not try to comment out Go template code using HTML comments. {{% /note %}}

<!-- {{ $author := "Emma Goldman" }} was a great woman. -->
{{ $author }}

The templating engine will strip the content within the HTML comment, but will first evaluate any Go template code if present within. So the above example will render Emma Goldman, as the $author variable got evaluated in the HTML comment. But the build would have failed if that code in the HTML comment had an error.

Hugo Parameters

Hugo provides the option of passing values to your template layer through your site configuration (i.e. for site-wide values) or through the metadata of each specific piece of content (i.e. the front matter). You can define any values of any type and use them however you want in your templates, as long as the values are supported by the front matter format specified via metaDataFormat in your configuration file.

Use Content (Page) Parameters

You can provide variables to be used by templates in individual content's front matter.

An example of this is used in the Hugo docs. Most of the pages benefit from having the table of contents provided, but sometimes the table of contents doesn't make a lot of sense. We've defined a notoc variable in our front matter that will prevent a table of contents from rendering when specifically set to true.

Here is the example front matter:

---
title: Roadmap
lastmod: 2017-03-05
date: 2013-11-18
notoc: true
---

Here is an example of corresponding code that could be used inside a toc.html partial template:

{{< code file="layouts/partials/toc.html" download="toc.html" >}} {{ if not .Params.notoc }}

{{end}} {{< /code >}}

We want the default behavior to be for pages to include a TOC unless otherwise specified. This template checks to make sure that the notoc: field in this page's front matter is not true.

Use Site Configuration Parameters

You can arbitrarily define as many site-level parameters as you want in your site's configuration file. These parameters are globally available in your templates.

For instance, you might declare the following:

{{< code-toggle file="config" >}} params: copyrighthtml: "Copyright © 2017 John Doe. All Rights Reserved." twitteruser: "spf13" sidebarrecentlimit: 5 {{< /code >}}

Within a footer layout, you might then declare a <footer> that is only rendered if the copyrighthtml parameter is provided. If it is provided, you will then need to declare the string is safe to use via the safeHTML function so that the HTML entity is not escaped again. This would let you easily update just your top-level config file each January 1st, instead of hunting through your templates.

{{if .Site.Params.copyrighthtml}}<footer>
<div class="text-center">{{.Site.Params.CopyrightHTML | safeHTML}}</div>
</footer>{{end}}

An alternative way of writing the "if" and then referencing the same value is to use with instead. with rebinds the context (.) within its scope and skips the block if the variable is absent:

{{< code file="layouts/partials/twitter.html" >}} {{with .Site.Params.twitteruser}}

{{end}} {{< /code >}}

Finally, you can pull "magic constants" out of your layouts as well. The following uses the first function, as well as the .RelPermalink page variable and the .Site.Pages site variable.

<nav>
  <h1>Recent Posts</h1>
  <ul>
  {{- range first .Site.Params.SidebarRecentLimit .Site.Pages -}}
    <li><a href="{{.RelPermalink}}">{{.Title}}</a></li>
  {{- end -}}
  </ul>
</nav>

Example: Show Only Upcoming Events

Go allows you to do more than what's shown here. Using Hugo's where function and Go built-ins, we can list only the items from content/events/ whose date (set in a content file's front matter) is in the future. The following is an example partial template:

{{< code file="layouts/partials/upcoming-events.html" download="upcoming-events.html" >}}

Upcoming Events

    {{ range where .Pages.ByDate "Section" "events" }} {{ if ge .Date.Unix .Now.Unix }}
  • {{ .Type | title }} — {{ .Title }} on {{ .Date.Format "2 January at 3:04pm" }} at {{ .Params.place }}
  • {{ end }} {{ end }}
{{< /code >}}