hugo/docs/content/doc/indexes.md

222 lines
6.2 KiB
Markdown
Raw Normal View History

2013-08-03 07:29:49 +00:00
---
title: "Indexes"
Pubdate: "2013-07-01"
---
Hugo includes support for user defined indexes of content. In our
terminology an index is best thought of as tags applied to content
but they can be used for far more than just tags. Other common
uses would include categories, groups, series. For the purpose of
this document we will just use tags for our example. For a more
complete example see [spf13.com-hugo](http://github.com/spf13/spf13.com-hugo).
## Defining Indexes for a site
Indexes must be defined in the site configuration, before they
can be used throughout the site.
Here is an example configuration in YAML that specifies two indexes.
Notice the format is **singular key** : *plural value*. While
we could use an inflection library to pluralize this, they currently
support only a few languages, so instead we've opted for user defined
pluralization.
**config.yaml**
---
indexes:
tag: "tags"
topic: "topics"
baseurl: "http://spf13.com/"
title: "Steve Francia is spf13.com"
---
## Creating index templates
For each index type a template needs to be provided to render the index page.
In the case of tags, this will render the content for /tags/TAGNAME/.
The template must be called the singular name of the index and placed in
layouts/indexes
.
└── layouts
└── indexes
└── category.html
The template will be provided Data about the index.
### Variables
The following variables are available to the index template:
**.Title** The title for the content. <br>
**.Date** The date the content is published on.<br>
**.Permalink** The Permanent link for this page.<br>
**.RSSLink** Link to the indexes' rss link. <br>
**.Data.Pages** The content that is assigned this index.<br>
**.Data.`singular`** The index itself.<br>
#### Example
{{ template "chrome/header.html" . }}
{{ template "chrome/subheader.html" . }}
<section id="main">
<div>
<h1 id="title">{{ .Title }}</h1>
{{ range .Data.Pages }}
{{ .Render "summary"}}
{{ end }}
</div>
</section>
<aside id="meta"> </aside>
{{ template "chrome/footer.html" }}
## Assigning indexes to content
Once an index is defined at the site level, any piece of content
can be assigned to it regardless of content type or section.
Assigning content to an index is done in the front matter.
Simply create a variable with the *plural* name of the index
and assign all keys you want this content to match against.
**Index values are case insensitive**
#### Example
{
"Title": "Hugo: A fast and flexible static site generator",
"Tags": [
"Development",
"golang",
"Blogging"
],
"Slug": "hugo",
"project_url": "http://github.com/spf13/hugo"
}
## Displaying indexes within content
Within your content templates you may wish to display
the indexes that that piece of content is assigned to.
Because we are leveraging the front matter system to
define indexes for content, the indexes assigned to
each content piece are located in the usual place
(.Params.`plural`)
#### Example
<ul id="tags">
{{ range .Params.tags }}
<li><a href="tags/{{ . | urlize }}">{{ . }}</a> </li>
{{ end }}
</ul>
2013-08-09 04:10:35 +00:00
If you wish to display the list of all indexes, the index can
be retrieved from the `.Site` variable.
#### Example
<ul id="all-tags">
{{ range .Site.Indexes.tags }}
<li><a href="/tags/{{ .Name | urlize }}">{{ .Name }}</a></li>
{{ end }}
</ul>
2013-08-03 07:29:49 +00:00
## Creating Indexes of Indexes
Hugo also supports creating pages that list your values for each
index along with the number of content items associated with the
index key.
This may take the form of a tag cloud or simply a list.
To have hugo create these indexes of indexes pages, simply create
a template in indexes called indexes.html
Hugo provides two different versions of the index. One alphabetically
sorted, the other sorted by most popular. It's important to recognize
that the data structure of the two is different.
#### Example indexes.html file (alphabetical)
{{ template "chrome/header.html" . }}
{{ template "chrome/subheader.html" . }}
<section id="main">
<div>
<h1 id="title">{{ .Title }}</h1>
<ul>
{{ $data := .Data }}
{{ range $key, $value := .Data.Index }}
<li><a href="{{ $data.Plural }}/{{ $key | urlize }}"> {{ $key }} </a> {{ len $value }} </li>
{{ end }}
</ul>
</div>
</section>
{{ template "chrome/footer.html" }}
#### Example indexes.html file (ordered)
{{ template "chrome/header.html" . }}
{{ template "chrome/subheader.html" . }}
<section id="main">
<div>
<h1 id="title">{{ .Title }}</h1>
<ul>
{{ range $data.OrderedIndex }}
<li><a href="{{ $data.Plural }}/{{ .Name | urlize }}"> {{ .Name }} </a> {{ .Count }} </li>
{{ end }}
</ul>
</div>
</section>
{{ template "chrome/footer.html" }}
### Variables available to indexes of indexes pages.
**.Title** The title for the content. <br>
**.Date** The date the content is published on.<br>
**.Permalink** The Permanent link for this page.<br>
**.RSSLink** Link to the indexes' rss link. <br>
**.Data.Singular** The singular name of the index <br>
**.Data.Plural** The plural name of the index<br>
**.Data.Index** The Alphabetical index<br>
**.Data.OrderedIndex** The popular index<br>
2013-08-09 04:10:35 +00:00
## Creating a menu based on indexes
Hugo can generate menus based on indexes by iterating and
nesting the index keys. This can be used to build a hierarchy
of content within your site.
To have hugo create the menu, simply create a template in chome
called menu.html, then include it using the
`{{ template "chrome/menu.html" . }}` syntax.
#### Example menu.html file
<section id="menu">
<ul>
{{ range $indexname, $index := .Site.Indexes }}
<li><a href="/{{ $indexname | urlize }}">{{ $indexname }}</a>
<ul>
{{ range $index }}
<li><a href="/{{ $indexname | urlize }}/{{ .Name | urlize }}">{{ .Name }}</a></li>
{{ end }}
</ul>
</li>
{{ end }}
</ul>
</section>