--- aliases: - /layout/functions/ date: 2013-07-01 linktitle: Functions menu: main: parent: layout next: /templates/variables prev: /templates/go-templates title: Hugo Template Functions weight: 20 --- Hugo uses the excellent Go html/template library for its template engine. It is an extremely lightweight engine that provides a very small amount of logic. In our experience it is just the right amount of logic to be able to create a good static website. Go templates are lightweight but extensible. Hugo has added the following functions to the basic template logic. (Go itself supplies built-in functions, including comparison operators and other basic tools; these are listed in the [Go template documentation](http://golang.org/pkg/text/template/#hdr-Functions).) ## General ### isset Return true if the parameter is set. Takes either a slice, array or channel and an index or a map and a key as input. e.g. `{{ if isset .Params "project_url" }} {{ index .Params "project_url" }}{{ end }}` ### echoParam If parameter is set, then echo it. e.g. `{{echoParam .Params "project_url" }}` ### eq Return true if the parameters are equal. e.g. {{ if eq .Section "blog" }}current{{ end }} ### first Slices an array to only the first X elements. Works on [lists](/templates/list/), [taxonomies](/taxonomies/displaying/), [terms](/templates/terms/), [groups](/templates/list/) e.g. {{ range first 10 .Data.Pages }} {{ .Render "summary" }} {{ end }} ### where Filters an array to only elements containing a matching value for a given field. Works on [lists](/templates/list/), [taxonomies](/taxonomies/displaying/), [terms](/templates/terms/), [groups](/templates/list/) e.g. {{ range where .Data.Pages "Section" "post" }} {{ .Content}} {{ end }} It can be used with dot chaining second argument to refer a nested element of a value. e.g. // Front matter on some pages +++ series: golang +++ {{ range where .Site.Recent "Params.series" "golang" }} {{ .Content}} {{ end }} *where and first can be stacked* e.g. {{ range first 5 (where .Data.Pages "Section" "post") }} {{ .Content}} {{ end }} ### delimit Loops through any array, slice or map and returns a string of all the values separated by the delimiter. There is an optional third parameter that lets you choose a different delimiter to go between the last two values. Maps will be sorted by the keys, and only a slice of the values will be returned, keeping a consistent output order. Works on [lists](/templates/list/), [taxonomies](/taxonomies/displaying/), [terms](/templates/terms/), [groups](/templates/list/) e.g. // Front matter +++ tags: [ "tag1", "tag2", "tag3" ] +++ // Used anywhere in a template Tags: {{ delimit .Params.tags ", " }} // Outputs Tags: tag1, tag2, tag3 // Example with the optional "last" parameter Tags: {{ delimit .Params.tags ", " " and " }} // Outputs Tags: tag1, tag2 and tag3 ### sort Sorts maps, arrays and slices, returning a sorted slice. A sorted array of map values will be returned, with the keys eliminated. There are two optional arguments, which are `sortByField` and `sortAsc`. If left blank, sort will sort by keys (for maps) in ascending order. Works on [lists](/templates/list/), [taxonomies](/taxonomies/displaying/), [terms](/templates/terms/), [groups](/templates/list/) e.g. // Front matter +++ tags: [ "tag3", "tag1", "tag2" ] +++ // Site config +++ [params.authors] [params.authors.Derek] "firstName" = "Derek" "lastName" = "Perkins" [params.authors.Joe] "firstName" = "Joe" "lastName" = "Bergevin" [params.authors.Tanner] "firstName" = "Tanner" "lastName" = "Linsley" +++ // Use default sort options - sort by key / ascending Tags: {{ range sort .Params.tags }}{{ . }} {{ end }} // Outputs Tags: tag1 tag2 tag3 // Sort by value / descending Tags: {{ range sort .Params.tags "value" "desc" }}{{ . }} {{ end }} // Outputs Tags: tag3 tag2 tag1 // Use default sort options - sort by value / descending Authors: {{ range sort .Site.Params.authors }}{{ .firstName }} {{ end }} // Outputs Authors: Derek Joe Tanner // Use default sort options - sort by value / descending Authors: {{ range sort .Site.Params.authors "lastName" "desc" }}{{ .lastName }} {{ end }} // Outputs Authors: Perkins Linsley Bergevin ### in Checks if an element is in an array (or slice) and returns a boolean. The elements supported are strings, integers and floats (only float64 will match as expected). In addition, it can also check if a substring exists in a string. e.g. {{ if in .Params.tags "Git" }}Follow me on GitHub!{{ end }} or {{ if in "this string contains a substring" "substring" }}Substring found!{{ end }} ### intersect Given two arrays (or slices), this function will return the common elements in the arrays. The elements supported are strings, integers and floats (only float64). A useful example of this functionality is a 'similar posts' block. Create a list of links to posts where any of the tags in the current post match any tags in other posts. e.g.