mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
Squashed 'docs/' content from commit f887bd7b
git-subtree-dir: docs git-subtree-split: f887bd7b4e3e7c7e76cd63951e5b0d37d8fe0ac7
This commit is contained in:
commit
ec4e6f9df2
839 changed files with 44703 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/.idea
|
||||||
|
/public
|
0
.gitmodules
vendored
Normal file
0
.gitmodules
vendored
Normal file
194
LICENSE.md
Normal file
194
LICENSE.md
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
Apache License
|
||||||
|
==============
|
||||||
|
|
||||||
|
_Version 2.0, January 2004_
|
||||||
|
_<<http://www.apache.org/licenses/>>_
|
||||||
|
|
||||||
|
### Terms and Conditions for use, reproduction, and distribution
|
||||||
|
|
||||||
|
#### 1. Definitions
|
||||||
|
|
||||||
|
“License” shall mean the terms and conditions for use, reproduction, and
|
||||||
|
distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
“Licensor” shall mean the copyright owner or entity authorized by the copyright
|
||||||
|
owner that is granting the License.
|
||||||
|
|
||||||
|
“Legal Entity” shall mean the union of the acting entity and all other entities
|
||||||
|
that control, are controlled by, or are under common control with that entity.
|
||||||
|
For the purposes of this definition, “control” means **(i)** the power, direct or
|
||||||
|
indirect, to cause the direction or management of such entity, whether by
|
||||||
|
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or **(iii)** beneficial ownership of such entity.
|
||||||
|
|
||||||
|
“You” (or “Your”) shall mean an individual or Legal Entity exercising
|
||||||
|
permissions granted by this License.
|
||||||
|
|
||||||
|
“Source” form shall mean the preferred form for making modifications, including
|
||||||
|
but not limited to software source code, documentation source, and configuration
|
||||||
|
files.
|
||||||
|
|
||||||
|
“Object” form shall mean any form resulting from mechanical transformation or
|
||||||
|
translation of a Source form, including but not limited to compiled object code,
|
||||||
|
generated documentation, and conversions to other media types.
|
||||||
|
|
||||||
|
“Work” shall mean the work of authorship, whether in Source or Object form, made
|
||||||
|
available under the License, as indicated by a copyright notice that is included
|
||||||
|
in or attached to the work (an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
“Derivative Works” shall mean any work, whether in Source or Object form, that
|
||||||
|
is based on (or derived from) the Work and for which the editorial revisions,
|
||||||
|
annotations, elaborations, or other modifications represent, as a whole, an
|
||||||
|
original work of authorship. For the purposes of this License, Derivative Works
|
||||||
|
shall not include works that remain separable from, or merely link (or bind by
|
||||||
|
name) to the interfaces of, the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
“Contribution” shall mean any work of authorship, including the original version
|
||||||
|
of the Work and any modifications or additions to that Work or Derivative Works
|
||||||
|
thereof, that is intentionally submitted to Licensor for inclusion in the Work
|
||||||
|
by the copyright owner or by an individual or Legal Entity authorized to submit
|
||||||
|
on behalf of the copyright owner. For the purposes of this definition,
|
||||||
|
“submitted” means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems, and
|
||||||
|
issue tracking systems that are managed by, or on behalf of, the Licensor for
|
||||||
|
the purpose of discussing and improving the Work, but excluding communication
|
||||||
|
that is conspicuously marked or otherwise designated in writing by the copyright
|
||||||
|
owner as “Not a Contribution.”
|
||||||
|
|
||||||
|
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
|
||||||
|
of whom a Contribution has been received by Licensor and subsequently
|
||||||
|
incorporated within the Work.
|
||||||
|
|
||||||
|
#### 2. Grant of Copyright License
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor hereby
|
||||||
|
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
||||||
|
irrevocable copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the Work and such
|
||||||
|
Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
#### 3. Grant of Patent License
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor hereby
|
||||||
|
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
||||||
|
irrevocable (except as stated in this section) patent license to make, have
|
||||||
|
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
|
||||||
|
such license applies only to those patent claims licensable by such Contributor
|
||||||
|
that are necessarily infringed by their Contribution(s) alone or by combination
|
||||||
|
of their Contribution(s) with the Work to which such Contribution(s) was
|
||||||
|
submitted. If You institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
|
||||||
|
Contribution incorporated within the Work constitutes direct or contributory
|
||||||
|
patent infringement, then any patent licenses granted to You under this License
|
||||||
|
for that Work shall terminate as of the date such litigation is filed.
|
||||||
|
|
||||||
|
#### 4. Redistribution
|
||||||
|
|
||||||
|
You may reproduce and distribute copies of the Work or Derivative Works thereof
|
||||||
|
in any medium, with or without modifications, and in Source or Object form,
|
||||||
|
provided that You meet the following conditions:
|
||||||
|
|
||||||
|
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
|
||||||
|
this License; and
|
||||||
|
* **(b)** You must cause any modified files to carry prominent notices stating that You
|
||||||
|
changed the files; and
|
||||||
|
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
|
||||||
|
all copyright, patent, trademark, and attribution notices from the Source form
|
||||||
|
of the Work, excluding those notices that do not pertain to any part of the
|
||||||
|
Derivative Works; and
|
||||||
|
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
|
||||||
|
Derivative Works that You distribute must include a readable copy of the
|
||||||
|
attribution notices contained within such NOTICE file, excluding those notices
|
||||||
|
that do not pertain to any part of the Derivative Works, in at least one of the
|
||||||
|
following places: within a NOTICE text file distributed as part of the
|
||||||
|
Derivative Works; within the Source form or documentation, if provided along
|
||||||
|
with the Derivative Works; or, within a display generated by the Derivative
|
||||||
|
Works, if and wherever such third-party notices normally appear. The contents of
|
||||||
|
the NOTICE file are for informational purposes only and do not modify the
|
||||||
|
License. You may add Your own attribution notices within Derivative Works that
|
||||||
|
You distribute, alongside or as an addendum to the NOTICE text from the Work,
|
||||||
|
provided that such additional attribution notices cannot be construed as
|
||||||
|
modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and may provide
|
||||||
|
additional or different license terms and conditions for use, reproduction, or
|
||||||
|
distribution of Your modifications, or for any such Derivative Works as a whole,
|
||||||
|
provided Your use, reproduction, and distribution of the Work otherwise complies
|
||||||
|
with the conditions stated in this License.
|
||||||
|
|
||||||
|
#### 5. Submission of Contributions
|
||||||
|
|
||||||
|
Unless You explicitly state otherwise, any Contribution intentionally submitted
|
||||||
|
for inclusion in the Work by You to the Licensor shall be under the terms and
|
||||||
|
conditions of this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify the terms of
|
||||||
|
any separate license agreement you may have executed with Licensor regarding
|
||||||
|
such Contributions.
|
||||||
|
|
||||||
|
#### 6. Trademarks
|
||||||
|
|
||||||
|
This License does not grant permission to use the trade names, trademarks,
|
||||||
|
service marks, or product names of the Licensor, except as required for
|
||||||
|
reasonable and customary use in describing the origin of the Work and
|
||||||
|
reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
#### 7. Disclaimer of Warranty
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, Licensor provides the
|
||||||
|
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
|
||||||
|
including, without limitation, any warranties or conditions of TITLE,
|
||||||
|
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
|
||||||
|
solely responsible for determining the appropriateness of using or
|
||||||
|
redistributing the Work and assume any risks associated with Your exercise of
|
||||||
|
permissions under this License.
|
||||||
|
|
||||||
|
#### 8. Limitation of Liability
|
||||||
|
|
||||||
|
In no event and under no legal theory, whether in tort (including negligence),
|
||||||
|
contract, or otherwise, unless required by applicable law (such as deliberate
|
||||||
|
and grossly negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special, incidental,
|
||||||
|
or consequential damages of any character arising as a result of this License or
|
||||||
|
out of the use or inability to use the Work (including but not limited to
|
||||||
|
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
|
||||||
|
any and all other commercial damages or losses), even if such Contributor has
|
||||||
|
been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
#### 9. Accepting Warranty or Additional Liability
|
||||||
|
|
||||||
|
While redistributing the Work or Derivative Works thereof, You may choose to
|
||||||
|
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
|
||||||
|
other liability obligations and/or rights consistent with this License. However,
|
||||||
|
in accepting such obligations, You may act only on Your own behalf and on Your
|
||||||
|
sole responsibility, not on behalf of any other Contributor, and only if You
|
||||||
|
agree to indemnify, defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason of your
|
||||||
|
accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
_END OF TERMS AND CONDITIONS_
|
||||||
|
|
||||||
|
### APPENDIX: How to apply the Apache License to your work
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following boilerplate
|
||||||
|
notice, with the fields enclosed by brackets `[]` replaced with your own
|
||||||
|
identifying information. (Don't include the brackets!) The text should be
|
||||||
|
enclosed in the appropriate comment syntax for the file format. We also
|
||||||
|
recommend that a file or class name and description of purpose be included on
|
||||||
|
the same “printed page” as the copyright notice for easier identification within
|
||||||
|
third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
35
README.md
Normal file
35
README.md
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# Hugo Docs
|
||||||
|
|
||||||
|
Documentation site for [Hugo](https://github.com/gohugoio/hugo), the very fast and flexible static site generator built with love in GoLang.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
We welcome contributions to Hugo of any kind including documentation, suggestions, bug reports, pull requests etc. Also check out our [contribution guide](https://gohugo.io/contribute/documentation/). We would love to hear from you.
|
||||||
|
|
||||||
|
Note that this repository contains solely the documentation for Hugo. For contributions that aren't documentation-related please refer to the [hugo](https://github.com/gohugoio/hugo) repository.
|
||||||
|
|
||||||
|
*Pull requests shall **only** contain changes to the actual documentation. However, changes on the code base of Hugo **and** the documentation shall be a single, atomic pull request in the [hugo](https://github.com/gohugoio/hugo) repository.*
|
||||||
|
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
To view the documentation site locally, you need to clone this repository:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/gohugoio/hugoDocs.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Also note that the documentation version for a given version of Hugo can also be found in the `/docs` sub-folder of the [Hugo source repository](https://github.com/gohugoio/hugo).
|
||||||
|
|
||||||
|
Then to view the docs in your browser, run Hugo and open up the link:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
▶ hugo server
|
||||||
|
|
||||||
|
Started building sites ...
|
||||||
|
.
|
||||||
|
.
|
||||||
|
Serving pages from memory
|
||||||
|
Web Server is available at http://localhost:1313/ (bind address 127.0.0.1)
|
||||||
|
Press Ctrl+C to stop
|
||||||
|
```
|
11
archetypes/default.md
Normal file
11
archetypes/default.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
title: "{{ replace .TranslationBaseName "-" " " | title }}"
|
||||||
|
date: {{ .Date }}
|
||||||
|
description: ""
|
||||||
|
categories: []
|
||||||
|
#tags: []
|
||||||
|
slug: ""
|
||||||
|
aliases: []
|
||||||
|
toc: false
|
||||||
|
draft: true
|
||||||
|
---
|
236
config.toml
Normal file
236
config.toml
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
baseURL = "https://gohugo.io/"
|
||||||
|
paginate = 100
|
||||||
|
defaultContentLanguage = "en"
|
||||||
|
enableEmoji = true
|
||||||
|
# Set the unicode character used for the "return" link in page footnotes.
|
||||||
|
footnotereturnlinkcontents = "↩"
|
||||||
|
languageCode = "en-us"
|
||||||
|
metaDataFormat = "yaml"
|
||||||
|
title = "Hugo"
|
||||||
|
theme = "gohugoioTheme"
|
||||||
|
|
||||||
|
googleAnalytics = "UA-7131036-4"
|
||||||
|
|
||||||
|
pluralizeListTitles = false
|
||||||
|
|
||||||
|
# We do redirects via Netlify's _redirects file, generated by Hugo (see "outputs" below).
|
||||||
|
disableAliases = true
|
||||||
|
|
||||||
|
|
||||||
|
# Highlighting config (Pygments)
|
||||||
|
# It is (currently) not in use, but you can do ```go in a content file if you want to.
|
||||||
|
pygmentsCodeFences = true
|
||||||
|
|
||||||
|
# See https://help.farbox.com/pygments.html
|
||||||
|
pygmentsStyle = "friendly"
|
||||||
|
|
||||||
|
[outputs]
|
||||||
|
home = [ "HTML", "RSS", "REDIR", "HEADERS" ]
|
||||||
|
section = [ "HTML", "RSS"]
|
||||||
|
|
||||||
|
[mediaTypes]
|
||||||
|
[mediaTypes."text/netlify"]
|
||||||
|
suffix = ""
|
||||||
|
delimiter = ""
|
||||||
|
|
||||||
|
[outputFormats]
|
||||||
|
[outputFormats.REDIR]
|
||||||
|
mediatype = "text/netlify"
|
||||||
|
baseName = "_redirects"
|
||||||
|
isPlainText = true
|
||||||
|
notAlternative = true
|
||||||
|
[outputFormats.HEADERS]
|
||||||
|
mediatype = "text/netlify"
|
||||||
|
baseName = "_headers"
|
||||||
|
isPlainText = true
|
||||||
|
notAlternative = true
|
||||||
|
|
||||||
|
[social]
|
||||||
|
twitter = "GoHugoIO"
|
||||||
|
|
||||||
|
#CUSTOM PARAMS
|
||||||
|
[params]
|
||||||
|
description = "The world’s fastest framework for building websites"
|
||||||
|
## Used for views in rendered HTML (i.e., rather than using the .Hugo variable)
|
||||||
|
release = "0.26"
|
||||||
|
## Setting this to true will add a "noindex" to *EVERY* page on the site
|
||||||
|
removefromexternalsearch = false
|
||||||
|
## Gh repo for site footer (include trailing slash)
|
||||||
|
ghrepo = "https://github.com/gohugoio/hugoDocs/"
|
||||||
|
## GH Repo for filing a new issue
|
||||||
|
github_repo = "https://github.com/gohugoio/hugo/issues/new"
|
||||||
|
### Edit content repo (set to automatically enter "edit" mode; this is good for "improve this page" links)
|
||||||
|
ghdocsrepo = "https://github.com/gohugoio/hugoDocs/tree/master/docs"
|
||||||
|
## Gitter URL
|
||||||
|
gitter = "https://gitter.im/spf13/hugo"
|
||||||
|
## Discuss Forum URL
|
||||||
|
forum = "https://discourse.gohugo.io/"
|
||||||
|
## Google Tag Manager
|
||||||
|
gtmid = ""
|
||||||
|
|
||||||
|
# First one is picked as the Twitter card image if not set on page.
|
||||||
|
images = ["images/gohugoio-card.png"]
|
||||||
|
|
||||||
|
flex_box_interior_classes = "flex-auto w-100 w-40-l mr3 mb3 bg-white ba b--moon-gray nested-copy-line-height"
|
||||||
|
|
||||||
|
#sidebar_direction = "sidebar_left"
|
||||||
|
|
||||||
|
# MARKDOWN
|
||||||
|
## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday
|
||||||
|
[blackfriday]
|
||||||
|
plainIDAnchors = true
|
||||||
|
hrefTargetBlank = true
|
||||||
|
angledQuotes = false
|
||||||
|
latexDashes = true
|
||||||
|
|
||||||
|
## As of v0.20, all content files include a default "categories" value that's the same as the section. This was a cheap future-proofing method and should/could be changed accordingly.
|
||||||
|
[taxonomies]
|
||||||
|
category = "categories"
|
||||||
|
|
||||||
|
# High level items
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "About Hugo"
|
||||||
|
weight = 1
|
||||||
|
identifier = "about"
|
||||||
|
url = "/about/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Getting Started"
|
||||||
|
weight = 5
|
||||||
|
identifier = "getting-started"
|
||||||
|
url = "/getting-started/"
|
||||||
|
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Themes"
|
||||||
|
weight = 15
|
||||||
|
identifier = "themes"
|
||||||
|
post = "break"
|
||||||
|
url = "/themes/"
|
||||||
|
|
||||||
|
# Core Menus
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Content Management"
|
||||||
|
weight = 20
|
||||||
|
identifier = "content-management"
|
||||||
|
post = "expanded"
|
||||||
|
url = "/content-management/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Templates"
|
||||||
|
weight = 25
|
||||||
|
identifier = "templates"
|
||||||
|
|
||||||
|
url = "/templates/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Functions"
|
||||||
|
weight = 30
|
||||||
|
identifier = "functions"
|
||||||
|
url = "/functions/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Variables"
|
||||||
|
weight = 35
|
||||||
|
identifier = "variables"
|
||||||
|
url = "/variables/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "CLI"
|
||||||
|
weight = 40
|
||||||
|
post = "break"
|
||||||
|
identifier = "commands"
|
||||||
|
url = "/commands/"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# LOW LEVEL ITEMS
|
||||||
|
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Troubleshooting"
|
||||||
|
weight = 60
|
||||||
|
identifier = "troubleshooting"
|
||||||
|
url = "/troubleshooting/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Tools"
|
||||||
|
weight = 70
|
||||||
|
identifier = "tools"
|
||||||
|
url = "/tools/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Hosting & Deployment"
|
||||||
|
weight = 80
|
||||||
|
identifier = "hosting-and-deployment"
|
||||||
|
url = "/hosting-and-deployment/"
|
||||||
|
|
||||||
|
[[menu.docs]]
|
||||||
|
name = "Contribute"
|
||||||
|
weight = 100
|
||||||
|
post = "break"
|
||||||
|
identifier = "contribute"
|
||||||
|
url = "/contribute/"
|
||||||
|
|
||||||
|
#[[menu.docs]]
|
||||||
|
# name = "Tags"
|
||||||
|
# weight = 120
|
||||||
|
# identifier = "tags"
|
||||||
|
# url = "/tags/"
|
||||||
|
|
||||||
|
|
||||||
|
# [[menu.docs]]
|
||||||
|
# name = "Categories"
|
||||||
|
# weight = 140
|
||||||
|
# identifier = "categories"
|
||||||
|
# url = "/categories/"
|
||||||
|
|
||||||
|
######## QUICKLINKS
|
||||||
|
|
||||||
|
[[menu.quicklinks]]
|
||||||
|
name = "Fundamentals"
|
||||||
|
weight = 1
|
||||||
|
identifier = "fundamentals"
|
||||||
|
url = "/tags/fundamentals/"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
######## GLOBAL ITEMS TO BE SHARED WITH THE HUGO SITES
|
||||||
|
|
||||||
|
[[menu.global]]
|
||||||
|
name = "News"
|
||||||
|
weight = 1
|
||||||
|
identifier = "news"
|
||||||
|
url = "/news/"
|
||||||
|
|
||||||
|
[[menu.global]]
|
||||||
|
name = "Docs"
|
||||||
|
weight = 5
|
||||||
|
identifier = "docs"
|
||||||
|
url = "/documentation/"
|
||||||
|
|
||||||
|
[[menu.global]]
|
||||||
|
name = "Themes"
|
||||||
|
weight = 10
|
||||||
|
identifier = "themes"
|
||||||
|
url = "https://themes.gohugo.io/"
|
||||||
|
|
||||||
|
# Anything with a weight > 100 gets an external icon
|
||||||
|
[[menu.global]]
|
||||||
|
name = "Community"
|
||||||
|
weight = 150
|
||||||
|
icon = true
|
||||||
|
identifier = "community"
|
||||||
|
post = "external"
|
||||||
|
url = "https://discourse.gohugo.io/"
|
||||||
|
|
||||||
|
|
||||||
|
[[menu.global]]
|
||||||
|
name = "GitHub"
|
||||||
|
weight = 200
|
||||||
|
identifier = "github"
|
||||||
|
post = "external"
|
||||||
|
url = "https://github.com/gohugoio/hugo"
|
49
content/_index.md
Normal file
49
content/_index.md
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
---
|
||||||
|
title: "A Fast and Flexible Website Generator"
|
||||||
|
date: 2017-03-02T12:00:00-05:00
|
||||||
|
features:
|
||||||
|
- heading: Blistering Speed
|
||||||
|
image_path: /images/icon-fast.svg
|
||||||
|
tagline: What's modern about waiting for your site to build?
|
||||||
|
copy: Hugo is the fastest tool of its kind. At <1 ms per page, the average site builds in less than a second.
|
||||||
|
|
||||||
|
- heading: Robust Content Management
|
||||||
|
image_path: /images/icon-content-management.svg
|
||||||
|
tagline: Flexibility rules. Hugo is a content strategist's dream.
|
||||||
|
copy: Hugo supports unlimited content types, taxonomies, menus, dynamic API-driven content, and more, all without plugins.
|
||||||
|
|
||||||
|
- heading: Shortcodes
|
||||||
|
image_path: /images/icon-shortcodes.svg
|
||||||
|
tagline: Hugo's shortcodes are Markdown's hidden superpower.
|
||||||
|
copy: We love the beautiful simplicity of markdown’s syntax, but there are times when we want more flexibility. Hugo shortcodes allow for both beauty and flexibility.
|
||||||
|
|
||||||
|
- heading: Built-in Templates
|
||||||
|
image_path: /images/icon-built-in-templates.svg
|
||||||
|
tagline: Hugo has common patterns to get your work done quickly.
|
||||||
|
copy: Hugo ships with pre-made templates to make quick work of SEO, commenting, analytics and other functions. One line of code, and you're done.
|
||||||
|
|
||||||
|
- heading: Multilingual and i18n
|
||||||
|
image_path: /images/icon-multilingual2.svg
|
||||||
|
tagline: Polyglot baked in.
|
||||||
|
copy: Hugo provides full i18n support for multi-language sites with the same straightforward development experience Hugo users love in single-language sites.
|
||||||
|
|
||||||
|
- heading: Custom Outputs
|
||||||
|
image_path: /images/icon-custom-outputs.svg
|
||||||
|
tagline: HTML not enough?
|
||||||
|
copy: Hugo allows you to output your content in multiple formats, including JSON or AMP, and makes it easy to create your own.
|
||||||
|
sections:
|
||||||
|
- heading: "100s of Themes"
|
||||||
|
cta: Check out the Hugo's themes.
|
||||||
|
link: http://themes.gohugo.io/
|
||||||
|
color_classes: bg-accent-color white
|
||||||
|
image: /images/homepage-screenshot-hugo-themes.jpg
|
||||||
|
copy: "Hugo provides a robust theming system that is easy to implement but capable of producing even the most complicated websites."
|
||||||
|
- heading: "Capable Templating"
|
||||||
|
cta: Get Started.
|
||||||
|
link: templates/
|
||||||
|
color_classes: bg-primary-color-light black
|
||||||
|
image: /images/home-page-templating-example.png
|
||||||
|
copy: "Hugo's Go-based templating provides just the right amount of logic to build anything from the simple to complex. If you prefer Jade/Pug-like syntax, you can also use Amber, Ace, or any combination of the three."
|
||||||
|
---
|
||||||
|
|
||||||
|
Hugo is one of the most popular open-source static site generators. With its amazing speed and flexibility, Hugo makes building websites fun again.
|
20
content/about/_index.md
Normal file
20
content/about/_index.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
title: About Hugo
|
||||||
|
linktitle: Overview
|
||||||
|
description: Hugo's features, roadmap, license, and motivation.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: []
|
||||||
|
#tags: []
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "about"
|
||||||
|
weight: 1
|
||||||
|
weight: 1
|
||||||
|
draft: false
|
||||||
|
aliases: [/about-hugo/,/docs/]
|
||||||
|
toc: false
|
||||||
|
---
|
||||||
|
|
||||||
|
Hugo is not your average static site generator.
|
43
content/about/benefits.md
Normal file
43
content/about/benefits.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
---
|
||||||
|
title: The Benefits of Static Site Generators
|
||||||
|
linktitle: The Benefits of Static
|
||||||
|
description: Improved performance, security and ease of use are just a few of the reasons static site generators are so appealing.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
#tags: [ssg,static,performance,security]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "about"
|
||||||
|
weight: 30
|
||||||
|
weight: 30
|
||||||
|
sections_weight: 30
|
||||||
|
draft: false
|
||||||
|
aliases: []
|
||||||
|
toc: false
|
||||||
|
---
|
||||||
|
|
||||||
|
The purpose of website generators is to render content into HTML files. Most are "dynamic site generators." That means the HTTP server---i.e., the program that sends files to the browser to be viewed---runs the generator to create a new HTML file every time an end user requests a page.
|
||||||
|
|
||||||
|
Over time, dynamic site generators were programmed to cache their HTML files to prevent unnecessary delays in delivering pages to end users. A cached page is a static version of a web page.
|
||||||
|
|
||||||
|
Hugo takes caching a step further and all HTML files are rendered on your computer. You can review the files locally before copying them to the computer hosting the HTTP server. Since the HTML files aren't generated dynamically, we say that Hugo is a *static site generator*.
|
||||||
|
|
||||||
|
This has many benefits. The most noticeable is performance. HTTP servers are *very* good at sending files---so good, in fact, that you can effectively serve the same number of pages with a fraction of the memory and CPU needed for a dynamic site.
|
||||||
|
|
||||||
|
## More on Static Site Generators
|
||||||
|
|
||||||
|
* ["An Introduction to Static Site Generators", David Walsh][]
|
||||||
|
* ["Hugo vs. Wordpress page load speed comparison: Hugo leaves WordPress in its dust", GettingThingsTech][hugovwordpress]
|
||||||
|
* ["Static Site Generators", O-Reilly][]
|
||||||
|
* [StaticGen: Top Open-Source Static Site Generators (GitHub Stars)][]
|
||||||
|
* ["Top 10 Static Website Generators", Netlify blog][]
|
||||||
|
* ["The Resurgence of Static", dotCMS][dotcms]
|
||||||
|
|
||||||
|
|
||||||
|
["An Introduction to Static Site Generators", David Walsh]: https://davidwalsh.name/introduction-static-site-generators
|
||||||
|
["Static Site Generators", O-Reilly]: /documents/oreilly-static-site-generators.pdf
|
||||||
|
["Top 10 Static Website Generators", Netlify blog]: https://www.netlify.com/blog/2016/05/02/top-ten-static-website-generators/
|
||||||
|
[hugovwordpress]: https://gettingthingstech.com/hugo-vs.-wordpress-page-load-speed-comparison-hugo-leaves-wordpress-in-its-dust/
|
||||||
|
[StaticGen: Top Open-Source Static Site Generators (GitHub Stars)]: https://www.staticgen.com/
|
||||||
|
[dotcms]: https://dotcms.com/blog/post/the-resurgence-of-static
|
90
content/about/features.md
Normal file
90
content/about/features.md
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
---
|
||||||
|
title: Hugo Features
|
||||||
|
linktitle: Hugo Features
|
||||||
|
description: Hugo boasts blistering speed, robust content management, and a powerful templating language making it a great fit for all kinds of static websites.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "about"
|
||||||
|
weight: 20
|
||||||
|
weight: 20
|
||||||
|
sections_weight: 20
|
||||||
|
draft: false
|
||||||
|
aliases: [/about/features]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
* [Extremely fast][] build times (< 1 ms per page)
|
||||||
|
* Completely cross platform, with [easy installation][install] on macOS, Linux, Windows, and more
|
||||||
|
* Renders changes on the fly with [LiveReload][] as you develop
|
||||||
|
* [Powerful theming][]
|
||||||
|
* [Host your site anywhere][hostanywhere]
|
||||||
|
|
||||||
|
## Organization
|
||||||
|
|
||||||
|
* Straightforward [organization for your projects][], including website sections
|
||||||
|
* Customizable [URLs][]
|
||||||
|
* Support for configurable [taxonomies][], including categories and tags
|
||||||
|
* [Sort content][] as you desire through powerful template [functions][]
|
||||||
|
* Automatic [table of contents][] generation
|
||||||
|
* [Dynamic menu][] creation
|
||||||
|
* [Pretty URLs][] support
|
||||||
|
* [Permalink][] pattern support
|
||||||
|
* Redirects via [aliases][]
|
||||||
|
|
||||||
|
## Content
|
||||||
|
|
||||||
|
* Native Markdown and Emacs Org-Mode support, as well as other languages via *external helpers* (see [supported formats][])
|
||||||
|
* TOML, YAML, and JSON metadata support in [front matter][]
|
||||||
|
* Customizable [homepage][]
|
||||||
|
* Multiple [content types][]
|
||||||
|
* Automatic and user defined [content summaries][]
|
||||||
|
* [Shortcodes][] to enable rich content inside of Markdown
|
||||||
|
* ["Minutes to Read"][pagevars] functionality
|
||||||
|
* ["Wordcount"][pagevars] functionality
|
||||||
|
|
||||||
|
## Additional Features
|
||||||
|
|
||||||
|
* Integrated [Disqus][] comment support
|
||||||
|
* Integrated [Google Analytics][] support
|
||||||
|
* Automatic [RSS][] creation
|
||||||
|
* Support for [Go][], [Amber], and [Ace][] HTML templates
|
||||||
|
* [Syntax highlighting][] powered by [Pygments][]
|
||||||
|
|
||||||
|
See what's coming next in the [Hugo roadmap][].
|
||||||
|
|
||||||
|
[Ace]: /templates/alternatives/
|
||||||
|
[aliases]: /content-management/urls/#aliases
|
||||||
|
[Amber]: https://github.com/eknkc/amber
|
||||||
|
[content summaries]: /content-management/summaries/
|
||||||
|
[content types]: /content-management/types/
|
||||||
|
[Disqus]: https://disqus.com/
|
||||||
|
[Dynamic menu]: /templates/menus/
|
||||||
|
[Extremely fast]: https://github.com/bep/hugo-benchmark
|
||||||
|
[front matter]: /content-management/front-matter/
|
||||||
|
[functions]: /functions/
|
||||||
|
[Go]: http://golang.org/pkg/html/template/
|
||||||
|
[Google Analytics]: https://google-analytics.com/
|
||||||
|
[homepage]: /templates/homepage/
|
||||||
|
[hostanywhere]: /hosting-and-deployment/
|
||||||
|
[Hugo roadmap]: /about/roadmap
|
||||||
|
[install]: /getting-started/installing/
|
||||||
|
[LiveReload]: /getting-started/usage/
|
||||||
|
[organization for your projects]: /getting-started/directory-structure/
|
||||||
|
[pagevars]: /variables/page/
|
||||||
|
[Permalink]: /content-management/urls/#permalinks
|
||||||
|
[Powerful theming]: /themes/
|
||||||
|
[Pretty URLs]: /content-management/urls/
|
||||||
|
[Pygments]: http://pygments.org/
|
||||||
|
[RSS]: /templates/rss/
|
||||||
|
[Shortcodes]: /content-management/shortcodes/
|
||||||
|
[sort content]: /templates/
|
||||||
|
[supported formats]: /content-management/formats/
|
||||||
|
[Syntax highlighting]: /tools/syntax-highlighting/
|
||||||
|
[table of contents]: /content-management/toc/
|
||||||
|
[taxonomies]: /content-management/taxonomies/
|
||||||
|
[URLs]: /content-management/urls/
|
165
content/about/license.md
Normal file
165
content/about/license.md
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
---
|
||||||
|
title: Apache License
|
||||||
|
linktitle: License
|
||||||
|
description: Hugo v0.15 and later are released under the Apache 2.0 license.
|
||||||
|
date: 2016-02-01
|
||||||
|
publishdate: 2016-02-01
|
||||||
|
lastmod: 2016-03-02
|
||||||
|
categories: ["about hugo"]
|
||||||
|
#tags: ["License","apache"]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "about"
|
||||||
|
weight: 60
|
||||||
|
weight: 60
|
||||||
|
sections_weight: 60
|
||||||
|
aliases: [/meta/license]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
Hugo v0.15 and later are released under the Apache 2.0 license.
|
||||||
|
Earlier versions of Hugo were released under the [Simple Public License](https://opensource.org/licenses/Simple-2.0).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
_Version 2.0, January 2004_ <br>
|
||||||
|
<http://www.apache.org/licenses/LICENSE-2.0>
|
||||||
|
|
||||||
|
*Terms and Conditions for use, reproduction, and distribution*
|
||||||
|
|
||||||
|
## 1. Definitions
|
||||||
|
|
||||||
|
“License” shall mean the terms and conditions for use, reproduction, and
|
||||||
|
distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
“Licensor” shall mean the copyright owner or entity authorized by the copyright
|
||||||
|
owner that is granting the License.
|
||||||
|
|
||||||
|
“Legal Entity” shall mean the union of the acting entity and all other entities
|
||||||
|
that control, are controlled by, or are under common control with that entity.
|
||||||
|
For the purposes of this definition, “control” means **(i)** the power, direct or
|
||||||
|
indirect, to cause the direction or management of such entity, whether by
|
||||||
|
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or **(iii)** beneficial ownership of such entity.
|
||||||
|
|
||||||
|
“You” (or “Your”) shall mean an individual or Legal Entity exercising
|
||||||
|
permissions granted by this License.
|
||||||
|
|
||||||
|
“Source” form shall mean the preferred form for making modifications, including
|
||||||
|
but not limited to software source code, documentation source, and configuration
|
||||||
|
files.
|
||||||
|
|
||||||
|
“Object” form shall mean any form resulting from mechanical transformation or
|
||||||
|
translation of a Source form, including but not limited to compiled object code,
|
||||||
|
generated documentation, and conversions to other media types.
|
||||||
|
|
||||||
|
“Work” shall mean the work of authorship, whether in Source or Object form, made
|
||||||
|
available under the License, as indicated by a copyright notice that is included
|
||||||
|
in or attached to the work (an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
“Derivative Works” shall mean any work, whether in Source or Object form, that
|
||||||
|
is based on (or derived from) the Work and for which the editorial revisions,
|
||||||
|
annotations, elaborations, or other modifications represent, as a whole, an
|
||||||
|
original work of authorship. For the purposes of this License, Derivative Works
|
||||||
|
shall not include works that remain separable from, or merely link (or bind by
|
||||||
|
name) to the interfaces of, the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
“Contribution” shall mean any work of authorship, including the original version
|
||||||
|
of the Work and any modifications or additions to that Work or Derivative Works
|
||||||
|
thereof, that is intentionally submitted to Licensor for inclusion in the Work
|
||||||
|
by the copyright owner or by an individual or Legal Entity authorized to submit
|
||||||
|
on behalf of the copyright owner. For the purposes of this definition,
|
||||||
|
“submitted” means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems, and
|
||||||
|
issue tracking systems that are managed by, or on behalf of, the Licensor for
|
||||||
|
the purpose of discussing and improving the Work, but excluding communication
|
||||||
|
that is conspicuously marked or otherwise designated in writing by the copyright
|
||||||
|
owner as “Not a Contribution.”
|
||||||
|
|
||||||
|
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
|
||||||
|
of whom a Contribution has been received by Licensor and subsequently
|
||||||
|
incorporated within the Work.
|
||||||
|
|
||||||
|
## 2. Grant of Copyright License
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor hereby
|
||||||
|
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
||||||
|
irrevocable copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the Work and such
|
||||||
|
Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
## 3. Grant of Patent License
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor hereby
|
||||||
|
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
||||||
|
irrevocable (except as stated in this section) patent license to make, have
|
||||||
|
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
|
||||||
|
such license applies only to those patent claims licensable by such Contributor
|
||||||
|
that are necessarily infringed by their Contribution(s) alone or by combination
|
||||||
|
of their Contribution(s) with the Work to which such Contribution(s) was
|
||||||
|
submitted. If You institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
|
||||||
|
Contribution incorporated within the Work constitutes direct or contributory
|
||||||
|
patent infringement, then any patent licenses granted to You under this License
|
||||||
|
for that Work shall terminate as of the date such litigation is filed.
|
||||||
|
|
||||||
|
## 4. Redistribution
|
||||||
|
|
||||||
|
You may reproduce and distribute copies of the Work or Derivative Works thereof
|
||||||
|
in any medium, with or without modifications, and in Source or Object form,
|
||||||
|
provided that You meet the following conditions:
|
||||||
|
|
||||||
|
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
|
||||||
|
this License; and
|
||||||
|
* **(b)** You must cause any modified files to carry prominent notices stating that You
|
||||||
|
changed the files; and
|
||||||
|
* **\(c)** You must retain, in the Source form of any Derivative Works that You distribute,
|
||||||
|
all copyright, patent, trademark, and attribution notices from the Source form
|
||||||
|
of the Work, excluding those notices that do not pertain to any part of the
|
||||||
|
Derivative Works; and
|
||||||
|
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
|
||||||
|
|
||||||
|
## 5. Submission of Contributions
|
||||||
|
|
||||||
|
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
## 6. Trademarks
|
||||||
|
|
||||||
|
This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
## 7. Disclaimer of Warranty
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
## 8. Limitation of Liability
|
||||||
|
|
||||||
|
In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
## 9. Accepting Warranty or Additional Liability
|
||||||
|
|
||||||
|
While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
_END OF TERMS AND CONDITIONS_
|
||||||
|
|
||||||
|
## APPENDIX: How to apply the Apache License to your work
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets `[]` replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.
|
||||||
|
|
||||||
|
{{< code file="apache-notice.txt" download="apache-notice.txt" >}}
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
{{< /code >}}
|
51
content/about/roadmap.md
Normal file
51
content/about/roadmap.md
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
---
|
||||||
|
title: Roadmap
|
||||||
|
linktitle: Roadmap
|
||||||
|
description: Take a look at what's in the pipeline for future versions of the Hugo project.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [about hugo]
|
||||||
|
#tags: [about,contribute,roadmap]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "about"
|
||||||
|
weight: 50
|
||||||
|
weight: 50
|
||||||
|
sections_weight: 50
|
||||||
|
draft: false
|
||||||
|
aliases: [/meta/roadmap]
|
||||||
|
toc: false
|
||||||
|
---
|
||||||
|
|
||||||
|
To track Hugo's progress, see our [GitHub Milestones][milestones].
|
||||||
|
|
||||||
|
In no particular order, here are some other features currently being worked on:
|
||||||
|
|
||||||
|
* Even easier deployment to S3, SSH, GitHub, rsync. Give the [hosting and deployment][] section a shot.
|
||||||
|
* Import from other website systems. There are already [existing migration tools][migrate], but they don’t cover all major platforms.
|
||||||
|
* An interactive web-based editor (See the [related forum thread][])
|
||||||
|
* Additional [themes][], which are always ongoing and [contributions are welcome][themescontrib]!
|
||||||
|
* Dynamic image resizing via shortcodes ({{< gh 1014 >}})
|
||||||
|
* Native support for additional content formats (AsciiDoc {{< gh 1435>}}, reST {{< gh 1436 >}})
|
||||||
|
* And, last but not least, [***your*** best ideas!][]
|
||||||
|
|
||||||
|
## Contributions Welcome
|
||||||
|
|
||||||
|
Feel free to [contribute to Hugo's development][devcontribute], [improve Hugo's documentation][doccontribute], or [open a new issue][newissue] if you have an idea for a new feature.
|
||||||
|
|
||||||
|
[#98]: https://github.com/gohugoio/hugo/issues/98
|
||||||
|
[#1014]: https://github.com/gohugoio/hugo/issues/1014
|
||||||
|
[#1435]: https://github.com/gohugoio/hugo/issues/1435
|
||||||
|
[#1436]: https://github.com/gohugoio/hugo/issues/1436
|
||||||
|
[devcontribute]: /contribute/development/
|
||||||
|
[doccontribute]: /contribute/documentation/
|
||||||
|
[hosting and deployment]: /hosting-and-deployment/
|
||||||
|
[migrate]: /tools/migrations/
|
||||||
|
[milestones]: https://github.com/gohugoio/hugo/milestone/14
|
||||||
|
[newissue]: https://github.com/gohugoio/hugo/issues/
|
||||||
|
[related forum thread]: https://discourse.gohugo.io/t/web-based-editor/155
|
||||||
|
[themes]: /themes/
|
||||||
|
[themescontrib]: /contribute/themes/
|
||||||
|
[tutorials]: /tutorials
|
||||||
|
[***your*** best ideas!]: /contribute/
|
69
content/about/what-is-hugo.md
Normal file
69
content/about/what-is-hugo.md
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
---
|
||||||
|
title: What is Hugo
|
||||||
|
linktitle: What is Hugo
|
||||||
|
description: Hugo is a fast and modern static site generator written in Go, and designed to make website creation fun again.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
layout: single
|
||||||
|
menu:
|
||||||
|
main:
|
||||||
|
parent: "about"
|
||||||
|
weight: 10
|
||||||
|
weight: 10
|
||||||
|
sections_weight: 10
|
||||||
|
draft: false
|
||||||
|
aliases: [/overview/introduction/,/about/why-i-built-hugo/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Hugo is a general-purpose website framework. Technically speaking, Hugo is a [static site generator][]. Unlike systems that dynamically build a page with each visitor request, Hugo builds pages when you create or update your content. Since websites are viewed far more often than they are edited, Hugo is designed to provide an optimal viewing experience for your website's end users and an ideal writing experience for website authors.
|
||||||
|
|
||||||
|
Websites built with Hugo are extremely fast and secure. Hugo sites can be hosted anywhere, including [Netlify][], [Heroku][], [GoDaddy][], [DreamHost][], [GitHub Pages][], [Surge][], [Aerobatic][], [Firebase][], [Google Cloud Storage][], [Amazon S3][], [Rackspace][], [Azure][], and [CloudFront][] and work well with CDNs. Hugo sites run without the need for a database or dependencies on expensive runtimes like Ruby, Python, or PHP.
|
||||||
|
|
||||||
|
We think of Hugo as the ideal website creation tool with nearly instant build times, able to rebuild whenever a change is made.
|
||||||
|
|
||||||
|
## How Fast is Hugo?
|
||||||
|
|
||||||
|
{{< youtube "CdiDYZ51a2o" >}}
|
||||||
|
|
||||||
|
## What Does Hugo Do?
|
||||||
|
|
||||||
|
In technical terms, Hugo takes a source directory of files and templates and uses these as input to create a complete website.
|
||||||
|
|
||||||
|
## Who Should Use Hugo?
|
||||||
|
|
||||||
|
Hugo is for people that prefer writing in a text editor over a browser.
|
||||||
|
|
||||||
|
Hugo is for people who want to hand code their own website without worrying about setting up complicated runtimes, dependencies and databases.
|
||||||
|
|
||||||
|
Hugo is for people building a blog, a company site, a portfolio site, documentation, a single landing page, or a website with thousands of pages.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[@spf13]: https://twitter.com/@spf13
|
||||||
|
[Aerobatic]: https://www.aerobatic.com/
|
||||||
|
[Amazon S3]: http://aws.amazon.com/s3/
|
||||||
|
[Azure]: https://blogs.msdn.microsoft.com/acoat/2016/01/28/publish-a-static-web-site-using-azure-web-apps/
|
||||||
|
[CloudFront]: http://aws.amazon.com/cloudfront/ "Amazon CloudFront"
|
||||||
|
[contributing to it]: https://github.com/gohugoio/hugo
|
||||||
|
[DreamHost]: http://www.dreamhost.com/
|
||||||
|
[Firebase]: https://firebase.google.com/docs/hosting/ "Firebase static hosting"
|
||||||
|
[GitHub Pages]: https://pages.github.com/
|
||||||
|
[GitLab]: https://about.gitlab.com
|
||||||
|
[Go language]: https://golang.org/
|
||||||
|
[GoDaddy]: https://www.godaddy.com/ "Godaddy.com Hosting"
|
||||||
|
[Google Cloud Storage]: http://cloud.google.com/storage/
|
||||||
|
[Heroku]: https://www.heroku.com/
|
||||||
|
[Jekyll]: http://jekyllrb.com/
|
||||||
|
[Jekyll]: https://jekyllrb.com/
|
||||||
|
[Middleman]: https://middlemanapp.com/
|
||||||
|
[Middleman]: https://middlemanapp.com/
|
||||||
|
[Nanoc]: http://nanoc.ws/
|
||||||
|
[Nanoc]: https://nanoc.ws/
|
||||||
|
[Netlify]: https://netlify.com
|
||||||
|
[rackspace]: https://www.rackspace.com/cloud/files
|
||||||
|
[static site generator]: /about/benefits/
|
||||||
|
[Rackspace]: https://www.rackspace.com/cloud/files
|
||||||
|
[static site generator]: /about/benefits/
|
||||||
|
[Surge]: https://surge.sh
|
22
content/commands/_index.md
Normal file
22
content/commands/_index.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
title: Command Line Reference
|
||||||
|
linktitle: CLI Overview
|
||||||
|
description: Comprehensive list of Hugo templating functions, including basic and advanced usage examples.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [commands]
|
||||||
|
#tags: [cli,command line]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "commands"
|
||||||
|
weight: 1
|
||||||
|
weight: 01 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/cli/]
|
||||||
|
---
|
||||||
|
|
||||||
|
The following list contains auto-generated and up-to-date (thanks to [Cobra][]) documentation for all the CLI commands in Hugo.
|
||||||
|
|
||||||
|
|
||||||
|
[Cobra]: https://github.com/spf13/cobra
|
80
content/commands/hugo.md
Normal file
80
content/commands/hugo.md
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo"
|
||||||
|
slug: hugo
|
||||||
|
url: /commands/hugo/
|
||||||
|
---
|
||||||
|
## hugo
|
||||||
|
|
||||||
|
hugo builds your site
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
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 http://gohugo.io/.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
|
||||||
|
-D, --buildDrafts include content marked as draft
|
||||||
|
-E, --buildExpired include expired content
|
||||||
|
-F, --buildFuture include content with publishdate in the future
|
||||||
|
--cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
|
||||||
|
--canonifyURLs if true, all relative URLs will be canonicalized using baseURL
|
||||||
|
--cleanDestinationDir remove files from destination not found in static directories
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
-c, --contentDir string filesystem path to content directory
|
||||||
|
-d, --destination string filesystem path to write files to
|
||||||
|
--disable404 do not render 404 page
|
||||||
|
--disableKinds stringSlice disable different kind of pages (home, RSS etc.)
|
||||||
|
--disableRSS do not build RSS files
|
||||||
|
--disableSitemap do not build Sitemap file
|
||||||
|
--enableGitInfo add Git revision, date and author info to the pages
|
||||||
|
--forceSyncStatic copy all files when static is changed.
|
||||||
|
-h, --help help for hugo
|
||||||
|
--i18n-warnings print missing translations
|
||||||
|
--ignoreCache ignores the cache directory
|
||||||
|
-l, --layoutDir string filesystem path to layout directory
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--noChmod don't sync permission mode of files
|
||||||
|
--noTimes don't sync modification time of files
|
||||||
|
--pluralizeListTitles pluralize titles in lists using inflect (default true)
|
||||||
|
--preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")
|
||||||
|
--quiet build in quiet mode
|
||||||
|
--renderToMemory render to memory (only useful for benchmark testing)
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
--stepAnalysis display memory and timing of different steps of the program
|
||||||
|
-t, --theme string theme to use (located in /themes/THEMENAME/)
|
||||||
|
--themesDir string filesystem path to themes directory
|
||||||
|
--uglyURLs if true, use /filename.html instead of /filename/
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
-w, --watch watch filesystem for changes and recreate as needed
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo benchmark](/commands/hugo_benchmark/) - Benchmark Hugo by building a site a number of times.
|
||||||
|
* [hugo check](/commands/hugo_check/) - Contains some verification checks
|
||||||
|
* [hugo config](/commands/hugo_config/) - Print the site configuration
|
||||||
|
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
|
||||||
|
* [hugo env](/commands/hugo_env/) - Print Hugo version and environment info
|
||||||
|
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
|
||||||
|
* [hugo import](/commands/hugo_import/) - Import your site from others.
|
||||||
|
* [hugo list](/commands/hugo_list/) - Listing out various types of content
|
||||||
|
* [hugo new](/commands/hugo_new/) - Create new content for your site
|
||||||
|
* [hugo server](/commands/hugo_server/) - A high performance webserver
|
||||||
|
* [hugo undraft](/commands/hugo_undraft/) - Undraft resets the content's draft status
|
||||||
|
* [hugo version](/commands/hugo_version/) - Print the version number of Hugo
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
72
content/commands/hugo_benchmark.md
Normal file
72
content/commands/hugo_benchmark.md
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo benchmark"
|
||||||
|
slug: hugo_benchmark
|
||||||
|
url: /commands/hugo_benchmark/
|
||||||
|
---
|
||||||
|
## hugo benchmark
|
||||||
|
|
||||||
|
Benchmark Hugo by building a site a number of times.
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Hugo can build a site many times over and analyze the running process
|
||||||
|
creating a benchmark.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo benchmark [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
|
||||||
|
-D, --buildDrafts include content marked as draft
|
||||||
|
-E, --buildExpired include expired content
|
||||||
|
-F, --buildFuture include content with publishdate in the future
|
||||||
|
--cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
|
||||||
|
--canonifyURLs if true, all relative URLs will be canonicalized using baseURL
|
||||||
|
--cleanDestinationDir remove files from destination not found in static directories
|
||||||
|
-c, --contentDir string filesystem path to content directory
|
||||||
|
-n, --count int number of times to build the site (default 13)
|
||||||
|
--cpuprofile string path/filename for the CPU profile file
|
||||||
|
-d, --destination string filesystem path to write files to
|
||||||
|
--disable404 do not render 404 page
|
||||||
|
--disableKinds stringSlice disable different kind of pages (home, RSS etc.)
|
||||||
|
--disableRSS do not build RSS files
|
||||||
|
--disableSitemap do not build Sitemap file
|
||||||
|
--enableGitInfo add Git revision, date and author info to the pages
|
||||||
|
--forceSyncStatic copy all files when static is changed.
|
||||||
|
-h, --help help for benchmark
|
||||||
|
--i18n-warnings print missing translations
|
||||||
|
--ignoreCache ignores the cache directory
|
||||||
|
-l, --layoutDir string filesystem path to layout directory
|
||||||
|
--memprofile string path/filename for the memory profile file
|
||||||
|
--noChmod don't sync permission mode of files
|
||||||
|
--noTimes don't sync modification time of files
|
||||||
|
--pluralizeListTitles pluralize titles in lists using inflect (default true)
|
||||||
|
--preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")
|
||||||
|
--renderToMemory render to memory (only useful for benchmark testing)
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
--stepAnalysis display memory and timing of different steps of the program
|
||||||
|
-t, --theme string theme to use (located in /themes/THEMENAME/)
|
||||||
|
--themesDir string filesystem path to themes directory
|
||||||
|
--uglyURLs if true, use /filename.html instead of /filename/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
37
content/commands/hugo_check.md
Normal file
37
content/commands/hugo_check.md
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo check"
|
||||||
|
slug: hugo_check
|
||||||
|
url: /commands/hugo_check/
|
||||||
|
---
|
||||||
|
## hugo check
|
||||||
|
|
||||||
|
Contains some verification checks
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Contains some verification checks
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for check
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
* [hugo check ulimit](/commands/hugo_check_ulimit/) - Check system ulimit settings
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
41
content/commands/hugo_check_ulimit.md
Normal file
41
content/commands/hugo_check_ulimit.md
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo check ulimit"
|
||||||
|
slug: hugo_check_ulimit
|
||||||
|
url: /commands/hugo_check_ulimit/
|
||||||
|
---
|
||||||
|
## hugo check ulimit
|
||||||
|
|
||||||
|
Check system ulimit settings
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Hugo will inspect the current ulimit settings on the system.
|
||||||
|
This is primarily to ensure that Hugo can watch enough files on some OSs
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo check ulimit [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for ulimit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo check](/commands/hugo_check/) - Contains some verification checks
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
40
content/commands/hugo_config.md
Normal file
40
content/commands/hugo_config.md
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo config"
|
||||||
|
slug: hugo_config
|
||||||
|
url: /commands/hugo_config/
|
||||||
|
---
|
||||||
|
## hugo config
|
||||||
|
|
||||||
|
Print the site configuration
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Print the site configuration, both default and custom settings.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo config [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for config
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
44
content/commands/hugo_convert.md
Normal file
44
content/commands/hugo_convert.md
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo convert"
|
||||||
|
slug: hugo_convert
|
||||||
|
url: /commands/hugo_convert/
|
||||||
|
---
|
||||||
|
## hugo convert
|
||||||
|
|
||||||
|
Convert your content to different formats
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Convert your content (e.g. front matter) to different formats.
|
||||||
|
|
||||||
|
See convert's subcommands toJSON, toTOML and toYAML for more information.
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for convert
|
||||||
|
-o, --output string filesystem path to write files to
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
--unsafe enable less safe operations, please backup first
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
* [hugo convert toJSON](/commands/hugo_convert_tojson/) - Convert front matter to JSON
|
||||||
|
* [hugo convert toTOML](/commands/hugo_convert_totoml/) - Convert front matter to TOML
|
||||||
|
* [hugo convert toYAML](/commands/hugo_convert_toyaml/) - Convert front matter to YAML
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
44
content/commands/hugo_convert_toJSON.md
Normal file
44
content/commands/hugo_convert_toJSON.md
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo convert toJSON"
|
||||||
|
slug: hugo_convert_toJSON
|
||||||
|
url: /commands/hugo_convert_tojson/
|
||||||
|
---
|
||||||
|
## hugo convert toJSON
|
||||||
|
|
||||||
|
Convert front matter to JSON
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
toJSON converts all front matter in the content directory
|
||||||
|
to use JSON for the front matter.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo convert toJSON [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for toJSON
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
-o, --output string filesystem path to write files to
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
--unsafe enable less safe operations, please backup first
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
44
content/commands/hugo_convert_toTOML.md
Normal file
44
content/commands/hugo_convert_toTOML.md
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo convert toTOML"
|
||||||
|
slug: hugo_convert_toTOML
|
||||||
|
url: /commands/hugo_convert_totoml/
|
||||||
|
---
|
||||||
|
## hugo convert toTOML
|
||||||
|
|
||||||
|
Convert front matter to TOML
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
toTOML converts all front matter in the content directory
|
||||||
|
to use TOML for the front matter.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo convert toTOML [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for toTOML
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
-o, --output string filesystem path to write files to
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
--unsafe enable less safe operations, please backup first
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
44
content/commands/hugo_convert_toYAML.md
Normal file
44
content/commands/hugo_convert_toYAML.md
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo convert toYAML"
|
||||||
|
slug: hugo_convert_toYAML
|
||||||
|
url: /commands/hugo_convert_toyaml/
|
||||||
|
---
|
||||||
|
## hugo convert toYAML
|
||||||
|
|
||||||
|
Convert front matter to YAML
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
toYAML converts all front matter in the content directory
|
||||||
|
to use YAML for the front matter.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo convert toYAML [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for toYAML
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
-o, --output string filesystem path to write files to
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
--unsafe enable less safe operations, please backup first
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
40
content/commands/hugo_env.md
Normal file
40
content/commands/hugo_env.md
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo env"
|
||||||
|
slug: hugo_env
|
||||||
|
url: /commands/hugo_env/
|
||||||
|
---
|
||||||
|
## hugo env
|
||||||
|
|
||||||
|
Print Hugo version and environment info
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Print Hugo version and environment info. This is useful in Hugo bug reports.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo env [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for env
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
39
content/commands/hugo_gen.md
Normal file
39
content/commands/hugo_gen.md
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo gen"
|
||||||
|
slug: hugo_gen
|
||||||
|
url: /commands/hugo_gen/
|
||||||
|
---
|
||||||
|
## hugo gen
|
||||||
|
|
||||||
|
A collection of several useful generators.
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
A collection of several useful generators.
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for gen
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
* [hugo gen autocomplete](/commands/hugo_gen_autocomplete/) - Generate shell autocompletion script for Hugo
|
||||||
|
* [hugo gen doc](/commands/hugo_gen_doc/) - Generate Markdown documentation for the Hugo CLI.
|
||||||
|
* [hugo gen man](/commands/hugo_gen_man/) - Generate man pages for the Hugo CLI
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
58
content/commands/hugo_gen_autocomplete.md
Normal file
58
content/commands/hugo_gen_autocomplete.md
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo gen autocomplete"
|
||||||
|
slug: hugo_gen_autocomplete
|
||||||
|
url: /commands/hugo_gen_autocomplete/
|
||||||
|
---
|
||||||
|
## hugo gen autocomplete
|
||||||
|
|
||||||
|
Generate shell autocompletion script for Hugo
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Generates a shell autocompletion script for Hugo.
|
||||||
|
|
||||||
|
NOTE: The current version supports Bash only.
|
||||||
|
This should work for *nix systems with Bash installed.
|
||||||
|
|
||||||
|
By default, the file is written directly to /etc/bash_completion.d
|
||||||
|
for convenience, and the command may need superuser rights, e.g.:
|
||||||
|
|
||||||
|
$ sudo hugo gen autocomplete
|
||||||
|
|
||||||
|
Add `--completionfile=/path/to/file` flag to set alternative
|
||||||
|
file-path and name.
|
||||||
|
|
||||||
|
Logout and in again to reload the completion scripts,
|
||||||
|
or just source them in directly:
|
||||||
|
|
||||||
|
$ . /etc/bash_completion
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo gen autocomplete [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--completionfile string autocompletion file (default "/etc/bash_completion.d/hugo.sh")
|
||||||
|
-h, --help help for autocomplete
|
||||||
|
--type string autocompletion type (currently only bash supported) (default "bash")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
47
content/commands/hugo_gen_doc.md
Normal file
47
content/commands/hugo_gen_doc.md
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo gen doc"
|
||||||
|
slug: hugo_gen_doc
|
||||||
|
url: /commands/hugo_gen_doc/
|
||||||
|
---
|
||||||
|
## hugo gen doc
|
||||||
|
|
||||||
|
Generate Markdown documentation for the Hugo CLI.
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Generate Markdown documentation for the Hugo CLI.
|
||||||
|
|
||||||
|
This command is, mostly, used to create up-to-date documentation
|
||||||
|
of Hugo's command-line interface for http://gohugo.io/.
|
||||||
|
|
||||||
|
It creates one Markdown file per command with front matter suitable
|
||||||
|
for rendering in Hugo.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo gen doc [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--dir string the directory to write the doc. (default "/tmp/hugodoc/")
|
||||||
|
-h, --help help for doc
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
43
content/commands/hugo_gen_man.md
Normal file
43
content/commands/hugo_gen_man.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo gen man"
|
||||||
|
slug: hugo_gen_man
|
||||||
|
url: /commands/hugo_gen_man/
|
||||||
|
---
|
||||||
|
## hugo gen man
|
||||||
|
|
||||||
|
Generate man pages for the Hugo CLI
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
This command automatically generates up-to-date man pages of Hugo's
|
||||||
|
command-line interface. By default, it creates the man page files
|
||||||
|
in the "man" directory under the current directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo gen man [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--dir string the directory to write the man pages. (default "man/")
|
||||||
|
-h, --help help for man
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
39
content/commands/hugo_import.md
Normal file
39
content/commands/hugo_import.md
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo import"
|
||||||
|
slug: hugo_import
|
||||||
|
url: /commands/hugo_import/
|
||||||
|
---
|
||||||
|
## hugo import
|
||||||
|
|
||||||
|
Import your site from others.
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Import your site from other web site generators like Jekyll.
|
||||||
|
|
||||||
|
Import requires a subcommand, e.g. `hugo import jekyll jekyll_root_path target_path`.
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for import
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
* [hugo import jekyll](/commands/hugo_import_jekyll/) - hugo import from Jekyll
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
43
content/commands/hugo_import_jekyll.md
Normal file
43
content/commands/hugo_import_jekyll.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo import jekyll"
|
||||||
|
slug: hugo_import_jekyll
|
||||||
|
url: /commands/hugo_import_jekyll/
|
||||||
|
---
|
||||||
|
## hugo import jekyll
|
||||||
|
|
||||||
|
hugo import from Jekyll
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
hugo import from Jekyll.
|
||||||
|
|
||||||
|
Import from Jekyll requires two paths, e.g. `hugo import jekyll jekyll_root_path target_path`.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo import jekyll [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--force allow import into non-empty target directory
|
||||||
|
-h, --help help for jekyll
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo import](/commands/hugo_import/) - Import your site from others.
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
42
content/commands/hugo_list.md
Normal file
42
content/commands/hugo_list.md
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo list"
|
||||||
|
slug: hugo_list
|
||||||
|
url: /commands/hugo_list/
|
||||||
|
---
|
||||||
|
## hugo list
|
||||||
|
|
||||||
|
Listing out various types of content
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Listing out various types of content.
|
||||||
|
|
||||||
|
List requires a subcommand, e.g. `hugo list drafts`.
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for list
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
* [hugo list drafts](/commands/hugo_list_drafts/) - List all drafts
|
||||||
|
* [hugo list expired](/commands/hugo_list_expired/) - List all posts already expired
|
||||||
|
* [hugo list future](/commands/hugo_list_future/) - List all posts dated in the future
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
41
content/commands/hugo_list_drafts.md
Normal file
41
content/commands/hugo_list_drafts.md
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo list drafts"
|
||||||
|
slug: hugo_list_drafts
|
||||||
|
url: /commands/hugo_list_drafts/
|
||||||
|
---
|
||||||
|
## hugo list drafts
|
||||||
|
|
||||||
|
List all drafts
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
List all of the drafts in your content directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo list drafts [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for drafts
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo list](/commands/hugo_list/) - Listing out various types of content
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
42
content/commands/hugo_list_expired.md
Normal file
42
content/commands/hugo_list_expired.md
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo list expired"
|
||||||
|
slug: hugo_list_expired
|
||||||
|
url: /commands/hugo_list_expired/
|
||||||
|
---
|
||||||
|
## hugo list expired
|
||||||
|
|
||||||
|
List all posts already expired
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
List all of the posts in your content directory which has already
|
||||||
|
expired.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo list expired [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for expired
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo list](/commands/hugo_list/) - Listing out various types of content
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
42
content/commands/hugo_list_future.md
Normal file
42
content/commands/hugo_list_future.md
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo list future"
|
||||||
|
slug: hugo_list_future
|
||||||
|
url: /commands/hugo_list_future/
|
||||||
|
---
|
||||||
|
## hugo list future
|
||||||
|
|
||||||
|
List all posts dated in the future
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
List all of the posts in your content directory which will be
|
||||||
|
posted in the future.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo list future [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for future
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo list](/commands/hugo_list/) - Listing out various types of content
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
50
content/commands/hugo_new.md
Normal file
50
content/commands/hugo_new.md
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo new"
|
||||||
|
slug: hugo_new
|
||||||
|
url: /commands/hugo_new/
|
||||||
|
---
|
||||||
|
## hugo new
|
||||||
|
|
||||||
|
Create new content for your site
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Create a new content file and automatically set the date and title.
|
||||||
|
It will guess which kind of file to create based on the path provided.
|
||||||
|
|
||||||
|
You can also specify the kind with `-k KIND`.
|
||||||
|
|
||||||
|
If archetypes are provided in your theme or site, they will be used.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo new [path] [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--editor string edit new content with this editor, if provided
|
||||||
|
-h, --help help for new
|
||||||
|
-k, --kind string content type to create
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
* [hugo new site](/commands/hugo_new_site/) - Create a new site (skeleton)
|
||||||
|
* [hugo new theme](/commands/hugo_new_theme/) - Create a new theme
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
45
content/commands/hugo_new_site.md
Normal file
45
content/commands/hugo_new_site.md
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo new site"
|
||||||
|
slug: hugo_new_site
|
||||||
|
url: /commands/hugo_new_site/
|
||||||
|
---
|
||||||
|
## hugo new site
|
||||||
|
|
||||||
|
Create a new site (skeleton)
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Create a new site in the provided directory.
|
||||||
|
The new site will have the correct structure, but no content or theme yet.
|
||||||
|
Use `hugo new [contentPath]` to create new content.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo new site [path] [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--force init inside non-empty directory
|
||||||
|
-f, --format string config & frontmatter format (default "toml")
|
||||||
|
-h, --help help for site
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo new](/commands/hugo_new/) - Create new content for your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
44
content/commands/hugo_new_theme.md
Normal file
44
content/commands/hugo_new_theme.md
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo new theme"
|
||||||
|
slug: hugo_new_theme
|
||||||
|
url: /commands/hugo_new_theme/
|
||||||
|
---
|
||||||
|
## hugo new theme
|
||||||
|
|
||||||
|
Create a new theme
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Create a new theme (skeleton) called [name] in the current directory.
|
||||||
|
New theme is a skeleton. Please add content to the touched files. Add your
|
||||||
|
name to the copyright line in the license and adjust the theme.toml file
|
||||||
|
as you see fit.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo new theme [name] [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for theme
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo new](/commands/hugo_new/) - Create new content for your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
87
content/commands/hugo_server.md
Normal file
87
content/commands/hugo_server.md
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo server"
|
||||||
|
slug: hugo_server
|
||||||
|
url: /commands/hugo_server/
|
||||||
|
---
|
||||||
|
## hugo server
|
||||||
|
|
||||||
|
A high performance webserver
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Hugo provides its own webserver which builds and serves the site.
|
||||||
|
While hugo server is high performance, it is a webserver with limited options.
|
||||||
|
Many run it in production, but the standard behavior is for people to use it
|
||||||
|
in development and use a more full featured server such as Nginx or Caddy.
|
||||||
|
|
||||||
|
'hugo server' will avoid writing the rendered and served content to disk,
|
||||||
|
preferring to store it in memory.
|
||||||
|
|
||||||
|
By default hugo will also watch your files for any changes you make and
|
||||||
|
automatically rebuild the site. It will then live reload any open browser pages
|
||||||
|
and push the latest content to them. As most Hugo sites are built in a fraction
|
||||||
|
of a second, you will be able to save and see your changes nearly instantly.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo server [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--appendPort append port to baseURL (default true)
|
||||||
|
-b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
|
||||||
|
--bind string interface to which the server will bind (default "127.0.0.1")
|
||||||
|
-D, --buildDrafts include content marked as draft
|
||||||
|
-E, --buildExpired include expired content
|
||||||
|
-F, --buildFuture include content with publishdate in the future
|
||||||
|
--cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
|
||||||
|
--canonifyURLs if true, all relative URLs will be canonicalized using baseURL
|
||||||
|
--cleanDestinationDir remove files from destination not found in static directories
|
||||||
|
-c, --contentDir string filesystem path to content directory
|
||||||
|
-d, --destination string filesystem path to write files to
|
||||||
|
--disable404 do not render 404 page
|
||||||
|
--disableKinds stringSlice disable different kind of pages (home, RSS etc.)
|
||||||
|
--disableLiveReload watch without enabling live browser reload on rebuild
|
||||||
|
--disableRSS do not build RSS files
|
||||||
|
--disableSitemap do not build Sitemap file
|
||||||
|
--enableGitInfo add Git revision, date and author info to the pages
|
||||||
|
--forceSyncStatic copy all files when static is changed.
|
||||||
|
-h, --help help for server
|
||||||
|
--i18n-warnings print missing translations
|
||||||
|
--ignoreCache ignores the cache directory
|
||||||
|
-l, --layoutDir string filesystem path to layout directory
|
||||||
|
--meminterval string interval to poll memory usage (requires --memstats), valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". (default "100ms")
|
||||||
|
--memstats string log memory usage to this file
|
||||||
|
--navigateToChanged navigate to changed content file on live browser reload
|
||||||
|
--noChmod don't sync permission mode of files
|
||||||
|
--noTimes don't sync modification time of files
|
||||||
|
--pluralizeListTitles pluralize titles in lists using inflect (default true)
|
||||||
|
-p, --port int port on which the server will listen (default 1313)
|
||||||
|
--preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")
|
||||||
|
--renderToDisk render to Destination path (default is render to memory & serve from there)
|
||||||
|
-s, --source string filesystem path to read files relative from
|
||||||
|
--stepAnalysis display memory and timing of different steps of the program
|
||||||
|
-t, --theme string theme to use (located in /themes/THEMENAME/)
|
||||||
|
--themesDir string filesystem path to themes directory
|
||||||
|
--uglyURLs if true, use /filename.html instead of /filename/
|
||||||
|
-w, --watch watch filesystem for changes and recreate as needed (default true)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
42
content/commands/hugo_undraft.md
Normal file
42
content/commands/hugo_undraft.md
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo undraft"
|
||||||
|
slug: hugo_undraft
|
||||||
|
url: /commands/hugo_undraft/
|
||||||
|
---
|
||||||
|
## hugo undraft
|
||||||
|
|
||||||
|
Undraft resets the content's draft status
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
Undraft resets the content's draft status
|
||||||
|
and updates the date to the current date and time.
|
||||||
|
If the content's draft status is 'False', nothing is done.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo undraft path/to/content [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for undraft
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
40
content/commands/hugo_version.md
Normal file
40
content/commands/hugo_version.md
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
date: 2017-07-16T23:23:14+02:00
|
||||||
|
title: "hugo version"
|
||||||
|
slug: hugo_version
|
||||||
|
url: /commands/hugo_version/
|
||||||
|
---
|
||||||
|
## hugo version
|
||||||
|
|
||||||
|
Print the version number of Hugo
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
|
||||||
|
All software has versions. This is Hugo's.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo version [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for version
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
--config string config file (default is path/config.yaml|json|toml)
|
||||||
|
--log enable Logging
|
||||||
|
--logFile string log File path (if set, logging enabled automatically)
|
||||||
|
--quiet build in quiet mode
|
||||||
|
-v, --verbose verbose output
|
||||||
|
--verboseLog verbose logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
* [hugo](/commands/hugo/) - hugo builds your site
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 16-Jul-2017
|
20
content/content-management/_index.md
Normal file
20
content/content-management/_index.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
title: Content Management
|
||||||
|
linktitle: Content Management Overview
|
||||||
|
description: Hugo makes managing large static sites easy with support for archetypes, content types, menus, cross references, summaries, and more.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 1
|
||||||
|
#tags: [source, organization]
|
||||||
|
categories: [content management]
|
||||||
|
weight: 01 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/,/content/organization]
|
||||||
|
toc: false
|
||||||
|
---
|
||||||
|
|
||||||
|
A static site generator needs to extend beyond front matter and a couple templates to be both scalable and *manageable*. Hugo was designed with not only developers in mind, but also content managers and authors.
|
192
content/content-management/archetypes.md
Normal file
192
content/content-management/archetypes.md
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
---
|
||||||
|
title: Archetypes
|
||||||
|
linktitle: Archetypes
|
||||||
|
description: Archetypes allow you to create new instances of content types and set default parameters from the command line.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
#tags: [archetypes,generators,metadata,front matter]
|
||||||
|
categories: ["content management"]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 70
|
||||||
|
quicklinks:
|
||||||
|
weight: 70 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/archetypes/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
This section is outdated, see https://github.com/gohugoio/hugoDocs/issues/11
|
||||||
|
{{% /note %}}
|
||||||
|
{{% todo %}}
|
||||||
|
See above
|
||||||
|
{{% /todo %}}
|
||||||
|
|
||||||
|
## What are Archetypes?
|
||||||
|
|
||||||
|
**Archetypes** are content files in the [archetypes directory][] of your project that contain preconfigured [front matter][] for your website's [content types][]. Archetypes facilitate consistent metadata across your website content and allow content authors to quickly generate instances of a content type via the `hugo new` command.
|
||||||
|
|
||||||
|
{{< youtube S3Tj3UcTFz8 >}}
|
||||||
|
|
||||||
|
The `hugo new` generator for archetypes assumes your working directory is the content folder at the root of your project. Hugo is able to infer the appropriate archetype by assuming the content type from the content section passed to the CLI command:
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo new <content-section>/<file-name.md>
|
||||||
|
```
|
||||||
|
|
||||||
|
We can use this pattern to create a new `.md` file in the `posts` section:
|
||||||
|
|
||||||
|
{{< code file="archetype-example.sh" >}}
|
||||||
|
hugo new posts/my-first-post.md
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{% note "Override Content Type in a New File" %}}
|
||||||
|
To override the content type Hugo infers from `[content-section]`, add the `--kind` flag to the end of the `hugo new` command.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
Running this command in a new site that does not have default or custom archetypes will create the following file:
|
||||||
|
|
||||||
|
{{< output file="content/posts/my-first-post.md" >}}
|
||||||
|
+++
|
||||||
|
date = "2017-02-01T19:20:04-07:00"
|
||||||
|
title = "my first post"
|
||||||
|
draft = true
|
||||||
|
+++
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
In this example, if you do not already have a `content/posts` directory, Hugo will create both `content/posts/` and `content/posts/my-first-post.md` for you.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
The auto-populated fields are worth examining:
|
||||||
|
|
||||||
|
* `title` is generated from the new content's filename (i.e. in this case, `my-first-post` becomes `"my first post"`)
|
||||||
|
* `date` and `title` are the variables that ship with Hugo and are therefore included in *all* content files created with the Hugo CLI. `date` is generated in [RFC 3339 format][] by way of Go's [`now()`][] function, which returns the current time.
|
||||||
|
* The third variable, `draft = true`, is *not* inherited by your default or custom archetypes but is included in Hugo's automatically scaffolded `default.md` archetype for convenience.
|
||||||
|
|
||||||
|
Three variables per content file are often not enough for effective content management of larger websites. Luckily, Hugo provides a simple mechanism for extending the number of variables through custom archetypes, as well as default archetypes to keep content creation DRY.
|
||||||
|
|
||||||
|
## Lookup Order for Archetypes
|
||||||
|
|
||||||
|
Similar to the [lookup order for templates][lookup] in your `layouts` directory, Hugo looks for a section- or type-specific archetype, then a default archetype, and finally an internal archetype that ships with Hugo. For example, Hugo will look for an archetype for `content/posts/my-first-post.md` in the following order:
|
||||||
|
|
||||||
|
1. `archetypes/posts.md`
|
||||||
|
2. `archetypes/default.md`
|
||||||
|
3. `themes/<THEME>/archetypes/posts.md`
|
||||||
|
4. `themes/<THEME>/archetypes/default.md` (Auto-generated with `hugo new site`)
|
||||||
|
|
||||||
|
{{% note "Using a Theme Archetype" %}}
|
||||||
|
If you wish to use archetypes that ship with a theme, the `theme` field must be specified in your [configuration file](/getting-started/configuration/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Choose Your Archetype's Front Matter Format
|
||||||
|
|
||||||
|
By default, `hugo new` content files include front matter in the TOML format regardless of the format used in `archetypes/*.md`.
|
||||||
|
|
||||||
|
You can specify a different default format in your site [configuration file][] file using the `metaDataFormat` directive. Possible values are `toml`, `yaml`, and `json`.
|
||||||
|
|
||||||
|
## Default Archetypes
|
||||||
|
|
||||||
|
Default archetypes are convenient if your content's front matter stays consistent across multiple [content sections][sections].
|
||||||
|
|
||||||
|
### Create the Default Archetype
|
||||||
|
|
||||||
|
When you create a new Hugo project using `hugo new site`, you'll notice that Hugo has already scaffolded a file at `archetypes/default.md`.
|
||||||
|
|
||||||
|
The following examples are from a site that's using `tags` and `categories` as [taxonomies][]. If we assume that all content files will require these two key-values, we can create a `default.md` archetype that *extends* Hugo's base archetype. In this example, we are including "golang" and "hugo" as tags and "web development" as a category.
|
||||||
|
|
||||||
|
{{< code file="archetypes/default.md" >}}
|
||||||
|
+++
|
||||||
|
tags = ["golang", "hugo"]
|
||||||
|
categories = ["web development"]
|
||||||
|
+++
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{% warning "EOL Characters in Text Editors"%}}
|
||||||
|
If you get an `EOF error` when using `hugo new`, add a carriage return after the closing `+++` or `---` for your TOML or YAML front matter, respectively. (See the [troubleshooting article on EOF errors](/troubleshooting/eof-error/) for more information.)
|
||||||
|
{{% /warning %}}
|
||||||
|
|
||||||
|
### Use the Default Archetype
|
||||||
|
|
||||||
|
With an `archetypes/default.md` in place, we can use the CLI to create a new post in the `posts` content section:
|
||||||
|
|
||||||
|
{{< code file="new-post-from-default.sh" >}}
|
||||||
|
$ hugo new posts/my-new-post.md
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Hugo then creates a new markdown file with the following front matter:
|
||||||
|
|
||||||
|
{{< output file="content/posts/my-new-post.md" >}}
|
||||||
|
+++
|
||||||
|
categories = ["web development"]
|
||||||
|
date = "2017-02-01T19:20:04-07:00"
|
||||||
|
tags = ["golang", "hugo"]
|
||||||
|
title = "my new post"
|
||||||
|
+++
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
We see that the `title` and `date` key-values have been added in addition to the `tags` and `categories` key-values from `archetypes/default.md`.
|
||||||
|
|
||||||
|
{{% note "Ordering of Front Matter" %}}
|
||||||
|
You may notice that content files created with `hugo new` do not respect the order of the key-values specified in your archetype files. This is a [known issue](https://github.com/gohugoio/hugo/issues/452).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Custom Archetypes
|
||||||
|
|
||||||
|
Suppose your site's `posts` section requires more sophisticated front matter than what has been specified in `archetypes/default.md`. You can create a custom archetype for your posts at `archetypes/posts.md` that includes the full set of front matter to be added to the two default archetypes fields.
|
||||||
|
|
||||||
|
### Create a Custom Archetype
|
||||||
|
|
||||||
|
{{< code file="archetypes/posts.md">}}
|
||||||
|
+++
|
||||||
|
description = ""
|
||||||
|
tags = ""
|
||||||
|
categories = ""
|
||||||
|
+++
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
### Use a Custom Archetype
|
||||||
|
|
||||||
|
With an `archetypes/posts.md` in place, you can use the Hugo CLI to create a new post with your preconfigured front matter in the `posts` content section:
|
||||||
|
|
||||||
|
{{< code file="new-post-from-custom.sh" >}}
|
||||||
|
$ hugo new posts/post-from-custom.md
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
This time, Hugo recognizes our custom `archetypes/posts.md` archetype and uses it instead of `archetypes/default.md`. The generated file will now include the full list of front matter parameters, as well as the base archetype's `title` and `date`:
|
||||||
|
|
||||||
|
{{< output file="content/posts/post-from-custom-archetype.md" >}}
|
||||||
|
+++
|
||||||
|
categories = ""
|
||||||
|
date = 2017-02-13T17:24:43-08:00
|
||||||
|
description = ""
|
||||||
|
tags = ""
|
||||||
|
title = "post from custom archetype"
|
||||||
|
+++
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
### Hugo Docs Custom Archetype
|
||||||
|
|
||||||
|
As an example of archetypes in practice, the following is the `functions` archetype from the Hugo docs:
|
||||||
|
|
||||||
|
{{< code file="archetypes/functions.md" >}}
|
||||||
|
{{< readfile file="/themes/gohugoioTheme/archetypes/functions.md" >}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
The preceding archetype is kept up to date with every Hugo build by using Hugo's [`readFile` function](/functions/readfile/). For similar examples, see [Local File Templates](/templates/files/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
[archetypes directory]: /getting-started/directory-structure/
|
||||||
|
[`now()`]: http://golang.org/pkg/time/#Now
|
||||||
|
[configuration file]: /getting-started/configuration/
|
||||||
|
[sections]: /content-management/sections/
|
||||||
|
[content types]: /content-management/types/
|
||||||
|
[front matter]: /content-management/front-matter/
|
||||||
|
[RFC 3339 format]: https://www.ietf.org/rfc/rfc3339.txt
|
||||||
|
[taxonomies]: /content-management/taxonomies/
|
||||||
|
[lookup]: /templates/lookup/
|
||||||
|
[templates]: /templates/
|
185
content/content-management/authors.md
Normal file
185
content/content-management/authors.md
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
---
|
||||||
|
title: Authors
|
||||||
|
linktitle: Authors
|
||||||
|
description:
|
||||||
|
date: 2016-08-22
|
||||||
|
publishdate: 2017-03-12
|
||||||
|
lastmod: 2017-03-12
|
||||||
|
#tags: [authors]
|
||||||
|
categories: ["content management"]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 55
|
||||||
|
weight: 55 #rem
|
||||||
|
draft: true
|
||||||
|
aliases: [/content/archetypes/]
|
||||||
|
toc: true
|
||||||
|
comments: Before this page is published, need to also update both site- and page-level variables documentation.
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Larger sites often have multiple content authors. Hugo provides standardized author profiles to organize relationships between content and content creators for sites operating under a distributed authorship model.
|
||||||
|
|
||||||
|
## Author Profiles
|
||||||
|
|
||||||
|
You can create a profile containing metadata for each author on your website. These profiles have to be saved under `data/_authors/`. The filename of the profile will later be used as an identifier. This way Hugo can associate content with one or multiple authors. An author's profile can be defined in the JSON, YAML, or TOML format.
|
||||||
|
|
||||||
|
### Example: Author Profile
|
||||||
|
|
||||||
|
Let's suppose Alice Allison is a blogger. A simple unique identifier would be `alice`. Now, we have to create a file called `alice.toml` in the `data/_authors/` directory. The following example is the standardized template written in TOML:
|
||||||
|
|
||||||
|
{{< code file="data/_authors/alice.toml" >}}
|
||||||
|
givenName = "Alice" # or firstName as alias
|
||||||
|
familyName = "Allison" # or lastName as alias
|
||||||
|
displayName = "Alice Allison"
|
||||||
|
thumbnail = "static/authors/alice-thumb.jpg"
|
||||||
|
image = "static/authors/alice-full.jpg"
|
||||||
|
shortBio = "My name is Alice and I'm a blogger."
|
||||||
|
bio = "My name is Alice and I'm a blogger... some other stuff"
|
||||||
|
email = "alice.allison@email.com"
|
||||||
|
weight = 10
|
||||||
|
|
||||||
|
[social]
|
||||||
|
facebook = "alice.allison"
|
||||||
|
twitter = "alice"
|
||||||
|
googleplus = "aliceallison1"
|
||||||
|
website = "www.example.com"
|
||||||
|
|
||||||
|
[params]
|
||||||
|
random = "whatever you want"
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
All variables are optional but it's advised to fill all important ones (e.g. names and biography) because themes can vary in their usage.
|
||||||
|
|
||||||
|
You can store files for the `thumbnail` and `image` attributes in the `static` folder. Then add the path to the photos relative to `static`; e.g., `/static/path/to/thumbnail.jpg`.
|
||||||
|
|
||||||
|
`weight` allows you to define the order of an author in an `.Authors` list and can be accessed on list or via the `.Site.Authors` variable.
|
||||||
|
|
||||||
|
The `social` section contains all the links to the social network accounts of an author. Hugo is able to generate the account links for the most popular social networks automatically. This way, you only have to enter your username. You can find a list of all supported social networks [here](#linking-social-network-accounts-automatically). All other variables, like `website` in the example above remain untouched.
|
||||||
|
|
||||||
|
The `params` section can contain arbitrary data much like the same-named section in the config file. What it contains is up to you.
|
||||||
|
|
||||||
|
## Associate Content Through Identifiers
|
||||||
|
|
||||||
|
Earlier it was mentioned that content can be associated with an author through their corresponding identifier. In our case, blogger Alice has the identifier `alice`. In the front matter of a content file, you can create a list of identifiers and assign it to the `authors` variable. Here are examples for `alice` using YAML and TOML, respectively.
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
title: Why Hugo is so Awesome
|
||||||
|
date: 2016-08-22T14:27:502:00
|
||||||
|
authors: ["alice"]
|
||||||
|
---
|
||||||
|
|
||||||
|
Nothing to read here. Move along...
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
+++
|
||||||
|
title = Why Hugo is so Awesome
|
||||||
|
date = "2016-08-22T14:27:502:00"
|
||||||
|
authors: ["alice"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
Nothing to read here. Move along...
|
||||||
|
```
|
||||||
|
|
||||||
|
Future authors who might work on this blog post can append their identifiers to the `authors` array in the front matter as well.
|
||||||
|
|
||||||
|
## Work with Templates
|
||||||
|
|
||||||
|
After a successful setup it's time to give some credit to the authors by showing them on the website. Within the templates Hugo provides a list of the author's profiles if they are listed in the `authors` variable within the front matter.
|
||||||
|
|
||||||
|
The list is accessible via the `.Authors` template variable. Printing all authors of a the blog post is straight forward:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ range .Authors }}
|
||||||
|
{{ .DisplayName }}
|
||||||
|
{{ end }}
|
||||||
|
=> Alice Allison
|
||||||
|
```
|
||||||
|
|
||||||
|
Even if there are co-authors you may only want to show the main author. For this case you can use the `.Author` template variable **(note the singular form)**. The template variable contains the profile of the author that is first listed with his identifier in the front matter.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
You can find a list of all template variables to access the profile information in [Author Variables](/variables/authors/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### Link Social Network Accounts
|
||||||
|
|
||||||
|
As aforementioned, Hugo is able to generate links to profiles of the most popular social networks. The following social networks with their corrersponding identifiers are supported: `github`, `facebook`, `twitter`, `googleplus`, `pinterest`, `instagram`, `youtube` and `linkedin`.
|
||||||
|
|
||||||
|
This is can be done with the `.Social.URL` function. Its only parameter is the name of the social network as they are defined in the profile (e.g. `facebook`, `googleplus`). Custom variables like `website` remain as they are.
|
||||||
|
|
||||||
|
Most articles feature a small section with information about the author at the end. Let's create one containing the author's name, a thumbnail, a (summarized) biography and links to all social networks:
|
||||||
|
|
||||||
|
{{< code file="layouts/partials/author-info.html" download="author-info.html" >}}
|
||||||
|
{{ with .Author }}
|
||||||
|
<h3>{{ .DisplayName }}</h3>
|
||||||
|
<img src="{{ .Thumbnail | absURL }}" alt="{{ .DisplayName }}">
|
||||||
|
<p>{{ .ShortBio }}</p>
|
||||||
|
<ul>
|
||||||
|
{{ range $network, $username := .Social }}
|
||||||
|
<li><a href="{{ $.Author.Social.URL $network }}">{{ $network }}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
## Who Published What?
|
||||||
|
|
||||||
|
That question can be answered with a list of all authors and another list containing all articles that they each have written. Now we have to translate this idea into templates. The [taxonomy][] feature allows us to logically group content based on information that they have in common; e.g. a tag or a category. Well, many articles share the same author, so this should sound familiar, right?
|
||||||
|
|
||||||
|
In order to let Hugo know that we want to group content based on their author, we have to create a new taxonomy called `author` (the name corresponds to the variable in the front matter). Here is the snippet in a `config.yaml` and `config.toml`, respectively:
|
||||||
|
|
||||||
|
```
|
||||||
|
taxonomies:
|
||||||
|
author: authors
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
[taxonomies]
|
||||||
|
author = "authors"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### List All Authors
|
||||||
|
|
||||||
|
In the next step we can create a template to list all authors of your website. Later, the list can be accessed at `www.example.com/authors/`. Create a new template in the `layouts/taxonomy/` directory called `authors.term.html`. This template will be exclusively used for this taxonomy.
|
||||||
|
|
||||||
|
{{< code file="layouts/taxonomy/author.term.html" download="author.term.html" >}}
|
||||||
|
<ul>
|
||||||
|
{{ range $author, $v := .Data.Terms }}
|
||||||
|
{{ $profile := $.Authors.Get $author }}
|
||||||
|
<li>
|
||||||
|
<a href="{{ printf "%s/%s/" $.Data.Plural $author | absURL }}">
|
||||||
|
{{ $profile.DisplayName }} - {{ $profile.ShortBio }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
`.Data.Terms` contains the identifiers of all authors and we can range over it to create a list with all author names. The `$profile` variable gives us access to the profile of the current author. This allows you to generate a nice info box with a thumbnail, a biography and social media links, like at the [end of a blog post](#linking-social-network-accounts-automatically).
|
||||||
|
|
||||||
|
### List Each Author's Publications
|
||||||
|
|
||||||
|
Last but not least, we have to create the second list that contains all publications of an author. Each list will be shown in its own page and can be accessed at `www.example.com/authors/<IDENTIFIER>`. Replace `<IDENTIFIER>` with a valid author identifier like `alice`.
|
||||||
|
|
||||||
|
The layout for this page can be defined in the template `layouts/taxonomy/author.html`.
|
||||||
|
|
||||||
|
{{< code file="layouts/taxonomy/author.html" download="author.html" >}}
|
||||||
|
{{ range .Data.Pages }}
|
||||||
|
<h2><a href="{{ .Permalink }}">{{ .Title }}</a></h2>
|
||||||
|
<span>written by {{ .Author.DisplayName }}</span>
|
||||||
|
{{ .Summary }}
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
The example above generates a simple list of all posts written by a single author. Inside the loop you've access to the complete set of [page variables][pagevars]. Therefore, you can add additional information about the current posts like the publishing date or the tags.
|
||||||
|
|
||||||
|
With a lot of content this list can quickly become very long. Consider to use the [pagination][] feature. It splits the list into smaller chunks and spreads them over multiple pages.
|
||||||
|
|
||||||
|
[pagevars]: /variables/page/
|
||||||
|
[pagination]: /templates/pagination/
|
84
content/content-management/comments.md
Normal file
84
content/content-management/comments.md
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
---
|
||||||
|
title: Comments
|
||||||
|
linktitle: Comments
|
||||||
|
description: Hugo ships with an internal Disqus template, but this isn't the only commenting system that will work with your new Hugo website.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-03-09
|
||||||
|
#tags: [sections,content,organization]
|
||||||
|
categories: [project organization, fundamentals]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 140
|
||||||
|
weight: 140 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/extras/comments/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Hugo ships with support for [Disqus](https://disqus.com/), a third-party service that provides comment and community capabilities to websites via JavaScript.
|
||||||
|
|
||||||
|
Your theme may already support Disqus, but if not, it is easy to add to your templates via [Hugo's built-in Disqus partial][disquspartial].
|
||||||
|
|
||||||
|
## Add Disqus
|
||||||
|
|
||||||
|
Hugo comes with all the code you need to load Disqus into your templates. Before adding Disqus to your site, you'll need to [set up an account][disqussetup].
|
||||||
|
|
||||||
|
### Configure Disqus
|
||||||
|
|
||||||
|
Disqus comments require you set a single value in your [site's configuration file][configuration]. The following show the configuration variable in a `config.toml` and `config.yml`, respectively:
|
||||||
|
|
||||||
|
```
|
||||||
|
disqusShortname = "yourdiscussshortname"
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
disqusShortname: "yourdiscussshortname"
|
||||||
|
```
|
||||||
|
|
||||||
|
For many websites, this is enough configuration. However, you also have the option to set the following in the [front matter][] of a single content file:
|
||||||
|
|
||||||
|
* `disqus_identifier`
|
||||||
|
* `disqus_title`
|
||||||
|
* `disqus_url`
|
||||||
|
|
||||||
|
### Render Hugo's Built-in Disqus Partial Template
|
||||||
|
|
||||||
|
See [Partial Templates][partials] to learn how to add the Disqus partial to your Hugo website's templates.
|
||||||
|
|
||||||
|
## Comments Alternatives
|
||||||
|
|
||||||
|
There are a few alternatives to commenting on static sites for those who do not want to use Disqus:
|
||||||
|
|
||||||
|
* [Static Man](https://staticman.net/)
|
||||||
|
* [txtpen](https://txtpen.com)
|
||||||
|
* [IntenseDebate](http://intensedebate.com/)
|
||||||
|
* [Graph Comment][]
|
||||||
|
* [Muut](http://muut.com/)
|
||||||
|
* [isso](http://posativ.org/isso/) (Self-hosted, Python)
|
||||||
|
* [Tutorial on Implementing Isso with Hugo][issotutorial]
|
||||||
|
|
||||||
|
|
||||||
|
<!-- I don't think this is worth including in the documentation since it seems that Steve is no longer supporting or developing this project. rdwatters - 2017-02-29.-->
|
||||||
|
<!-- * [Kaiju](https://github.com/spf13/kaiju) -->
|
||||||
|
|
||||||
|
<!-- ## Kaiju
|
||||||
|
|
||||||
|
[Kaiju](https://github.com/spf13/kaiju) is an open-source project started by [spf13](http://spf13.com/) (Hugo’s author) to bring easy and fast real time discussions to the web.
|
||||||
|
|
||||||
|
Written using Go, Socket.io, and [MongoDB][], Kaiju is very fast and easy to deploy.
|
||||||
|
|
||||||
|
It is in early development but shows promise. If you have interest, please help by contributing via pull request, [opening an issue in the Kaiju GitHub repository][kaijuissue], or [Tweeting about it][tweet]. Every bit helps. -->
|
||||||
|
|
||||||
|
[configuration]: /getting-started/configuration/
|
||||||
|
[disquspartial]: /templates/partials/#disqus
|
||||||
|
[disqussetup]: https://disqus.com/profile/signup/
|
||||||
|
[forum]: https://discourse.gohugo.io
|
||||||
|
[front matter]: /content-management/front-matter/
|
||||||
|
[Graph Comment]: https://graphcomment.com/
|
||||||
|
[kaijuissue]: https://github.com/spf13/kaiju/issues/new
|
||||||
|
[issotutorial]: https://stiobhart.net/2017-02-24-isso-comments/
|
||||||
|
[partials]: /templates/partials/
|
||||||
|
[MongoDB]: https://www.mongodb.com/
|
||||||
|
[tweet]: https://twitter.com/spf13
|
123
content/content-management/cross-references.md
Normal file
123
content/content-management/cross-references.md
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
---
|
||||||
|
title: Cross References
|
||||||
|
description: Hugo makes it easy to link documents together.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-03-31
|
||||||
|
categories: [content management]
|
||||||
|
#tags: ["cross references","references", "anchors", "urls"]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 100
|
||||||
|
weight: 100 #rem
|
||||||
|
aliases: [/extras/crossreferences/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
The `ref` and `relref` shortcodes link documents together, both of which are [built-in Hugo shortcodes][]. These shortcodes are also used to provide links to headings inside of your content, whether across documents or within a document. The only difference between `ref` and `relref` is whether the resulting URL is absolute (`http://1.com/about/`) or relative (`/about/`), respectively.
|
||||||
|
|
||||||
|
## Use `ref` and `relref`
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* ref "document" */>}}
|
||||||
|
{{</* ref "#anchor" */>}}
|
||||||
|
{{</* ref "document#anchor" */>}}
|
||||||
|
{{</* relref "document" */>}}
|
||||||
|
{{</* relref "#anchor" */>}}
|
||||||
|
{{</* relref "document#anchor" */>}}
|
||||||
|
```
|
||||||
|
|
||||||
|
The single parameter to `ref` is a string with a content `documentname` (e.g., `about.md`) with or without an appended in-document `anchor` (`#who`) without spaces.
|
||||||
|
|
||||||
|
### Document Names
|
||||||
|
|
||||||
|
The `documentname` is the name of a document, including the format extension; this may be just the filename, or the relative path from the `content/` directory. With a document `content/blog/post.md`, either format will produce the same result:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* relref "blog/post.md" */>}} => `/blog/post/`
|
||||||
|
{{</* relref "post.md" */>}} => `/blog/post/`
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have the same filename used across multiple sections, you should only use the relative path format; otherwise, the behavior will be `undefined`. This is best illustrated with an example `content` directory:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
└── content
|
||||||
|
├── events
|
||||||
|
│ └── my-birthday.md
|
||||||
|
├── galleries
|
||||||
|
│ └── my-birthday.md
|
||||||
|
├── meta
|
||||||
|
│ └── my-article.md
|
||||||
|
└── posts
|
||||||
|
└── my-birthday.md
|
||||||
|
```
|
||||||
|
|
||||||
|
To be sure to get the correct reference in this case, use the full path:
|
||||||
|
|
||||||
|
{{< code file="content/meta/my-article.md" copy="false" >}}
|
||||||
|
{{</* relref "events/my-birthday.md" */>}} => /events/my-birthday/
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{< todo >}}Remove this warning when https://github.com/gohugoio/hugo/issues/3703 is released.{{< /todo >}}
|
||||||
|
|
||||||
|
A relative document name must *not* begin with a slash (`/`).
|
||||||
|
```
|
||||||
|
{{</* relref "/events/my-birthday.md" */>}} => ""
|
||||||
|
```
|
||||||
|
|
||||||
|
### With Multiple Output Formats
|
||||||
|
|
||||||
|
If the page exists in multiple [output formats][], `ref` or `relref` can be used with a output format name:
|
||||||
|
|
||||||
|
```
|
||||||
|
[Neat]({{</* ref "blog/neat.md" "amp" */>}})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Anchors
|
||||||
|
|
||||||
|
When an `anchor` is provided by itself, the current page’s unique identifier will be appended; when an `anchor` is provided appended to `documentname`, the found page's unique identifier will be appended:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* relref "#anchors" */>}} => #anchors:9decaf7
|
||||||
|
{{</* relref "about-hugo/hugo-features.md#content" */>}} => /blog/post/#who:badcafe
|
||||||
|
```
|
||||||
|
|
||||||
|
The above examples render as follows for this very page as well as a reference to the "Content" heading in the Hugo docs features pageyoursite
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* relref "#who" */>}} => #who:9decaf7
|
||||||
|
{{</* relref "blog/post.md#who" */>}} => /blog/post/#who:badcafe
|
||||||
|
```
|
||||||
|
|
||||||
|
More information about document unique identifiers and headings can be found [below]({{< ref "#hugo-heading-anchors" >}}).
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
* `{{</* ref "blog/post.md" */>}}` => `https://example.com/blog/post/`
|
||||||
|
* `{{</* ref "post.md#tldr" */>}}` => `https://example.com/blog/post/#tldr:caffebad`
|
||||||
|
* `{{</* relref "post.md" */>}}` => `/blog/post/`
|
||||||
|
* `{{</* relref "blog/post.md#tldr" */>}}` => `/blog/post/#tldr:caffebad`
|
||||||
|
* `{{</* ref "#tldr" */>}}` => `#tldr:badcaffe`
|
||||||
|
* `{{</* relref "#tldr" */>}}` => `#tldr:badcaffe`
|
||||||
|
|
||||||
|
## Hugo Heading Anchors
|
||||||
|
|
||||||
|
When using Markdown document types, Hugo generates heading anchors automatically. The generated anchor for this section is `hugo-heading-anchors`. Because the heading anchors are generated automatically, Hugo takes some effort to ensure that heading anchors are unique both inside a document and across the entire site.
|
||||||
|
|
||||||
|
Ensuring heading uniqueness across the site is accomplished with a unique identifier for each document based on its path. Unless a document is renamed or moved between sections *in the filesystem*, the unique identifier for the document will not change: `blog/post.md` will always have a unique identifier of `81df004c333b392d34a49fd3a91ba720`.
|
||||||
|
|
||||||
|
`ref` and `relref` were added so you can make these reference links without having to know the document’s unique identifier. (The links in document tables of contents are automatically up-to-date with this value.)
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* relref "content-management/cross-references.md#hugo-heading-anchors" */>}}
|
||||||
|
/content-management/cross-references/#hugo-heading-anchors:77cd9ea530577debf4ce0f28c8dca242
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
[built-in Hugo shortcodes]: /content-management/shortcodes/#using-the-built-in-shortcodes
|
||||||
|
[lists]: /templates/lists/
|
||||||
|
[output formats]: /templates/output-formats/
|
||||||
|
[shortcode]: /content-management/shortcodes/
|
241
content/content-management/formats.md
Normal file
241
content/content-management/formats.md
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
---
|
||||||
|
title: Supported Content Formats
|
||||||
|
linktitle: Supported Content Formats
|
||||||
|
description: Markdown and Emacs Org-Mode have native support, and additional formats (e.g. Asciidoc) come via external helpers.
|
||||||
|
date: 2017-01-10
|
||||||
|
publishdate: 2017-01-10
|
||||||
|
lastmod: 2017-04-06
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [markdown,asciidoc,mmark,content format]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 20
|
||||||
|
weight: 20 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/markdown-extras/,/content/supported-formats/,/doc/supported-formats/,/tutorials/mathjax/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
**Markdown is the main content format** and comes in two flavours: The excellent [Blackfriday project][blackfriday] (name your files `*.md` or set `markup = "markdown"` in front matter) or its fork [Mmark][mmark] (name your files `*.mmark` or set `markup = "mmark"` in front matter), both very fast markdown engines written in Go.
|
||||||
|
|
||||||
|
For Emacs users, [goorgeous](https://github.com/chaseadamsio/goorgeous) provides built-in native support for Org-mode (name your files `*.org` or set `markup = "org"` in front matter)
|
||||||
|
|
||||||
|
{{% note "Deeply Nested Lists" %}}
|
||||||
|
Before you begin writing your content in markdown, Blackfriday has a known issue [(#329)](https://github.com/russross/blackfriday/issues/329) with handling deeply nested lists. Luckily, there is an easy workaround. Use 4-spaces (i.e., <kbd>tab</kbd>) rather than 2-space indentations.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Configure BlackFriday Markdown Rendering
|
||||||
|
|
||||||
|
You can configure multiple aspects of Blackfriday as show in the following list. See the docs on [Configuration][config] for the full list of explicit directions you can give to Hugo when rendering your site.
|
||||||
|
|
||||||
|
{{< readfile file="/content/readfiles/bfconfig.md" markdown="true" >}}
|
||||||
|
|
||||||
|
## Extend Markdown
|
||||||
|
|
||||||
|
Hugo provides some convenient methods for extending markdown.
|
||||||
|
|
||||||
|
### Task Lists
|
||||||
|
|
||||||
|
Hugo supports [GitHub-styled task lists (i.e., TODO lists)][gfmtasks] for the Blackfriday markdown renderer. If you do not want to use this feature, you can disable it in your configuration.
|
||||||
|
|
||||||
|
#### Example Task List Input
|
||||||
|
|
||||||
|
{{< code file="content/my-to-do-list.md" >}}
|
||||||
|
- [ ] a task list item
|
||||||
|
- [ ] list syntax required
|
||||||
|
- [ ] incomplete
|
||||||
|
- [x] completed
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example Task List Output
|
||||||
|
|
||||||
|
The preceding markdown produces the following HTML in your rendered website:
|
||||||
|
|
||||||
|
```
|
||||||
|
<ul class="task-list">
|
||||||
|
<li><input type="checkbox" disabled="" class="task-list-item"> a task list item</li>
|
||||||
|
<li><input type="checkbox" disabled="" class="task-list-item"> list syntax required</li>
|
||||||
|
<li><input type="checkbox" disabled="" class="task-list-item"> incomplete</li>
|
||||||
|
<li><input type="checkbox" checked="" disabled="" class="task-list-item"> completed</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example Task List Display
|
||||||
|
|
||||||
|
The following shows how the example task list will look to the end users of your website. Note that visual styling of lists is up to you. This list has been styled according to [the Hugo Docs stylesheet][hugocss].
|
||||||
|
|
||||||
|
- [ ] a task list item
|
||||||
|
- [ ] list syntax required
|
||||||
|
- [ ] incomplete
|
||||||
|
- [x] completed
|
||||||
|
|
||||||
|
### Emojis
|
||||||
|
|
||||||
|
To add emojis directly to content, set `enableEmoji` to `true` in your [site configuration][config]. To use emojis in templates or shortcodes, see [`emojify` function][].
|
||||||
|
|
||||||
|
For a full list of emojis, see the [Emoji cheat sheet][emojis].
|
||||||
|
|
||||||
|
### Shortcodes
|
||||||
|
|
||||||
|
If you write in Markdown and find yourself frequently embedding your content with raw HTML, Hugo provides built-in shortcodes functionality. This is one of the most powerful features in Hugo and allows you to create your own Markdown extensions very quickly.
|
||||||
|
|
||||||
|
See [Shortcodes][sc] for usage, particularly for the built-in shortcodes that ship with Hugo, and [Shortcode Templating][sct] to learn how to build your own.
|
||||||
|
|
||||||
|
### Code Blocks
|
||||||
|
|
||||||
|
Hugo supports GitHub-flavored markdown's use of triple back ticks, as well as provides a special [`highlight` nested shortcode][hlsc] to render syntax highlighting via [Pygments][]. For usage examples and a complete explanation, see the [syntax highlighting documentation][hl] in [developer tools][].
|
||||||
|
|
||||||
|
## Mmark
|
||||||
|
|
||||||
|
Mmark is a [fork of BlackFriday][mmark] and markdown superset that is well suited for writing [IETF documentation][ietf]. You can see examples of the syntax in the [Mmark GitHub repository][mmarkgh] or the full syntax on [Miek Gieben's website][].
|
||||||
|
|
||||||
|
### Use Mmark
|
||||||
|
|
||||||
|
As Hugo ships with Mmark, using the syntax is as easy as changing the extension of your content files from `.md` to `.mmark`.
|
||||||
|
|
||||||
|
In the event that you want to only use Mmark in specific files, you can also define the Mmark syntax in your content's front matter:
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
title: My Post
|
||||||
|
date: 2017-04-01
|
||||||
|
markup: mmark
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% warning %}}
|
||||||
|
Thare are some features not available in Mmark; one example being that shortcodes are not translated when used in an included `.mmark` file ([#3131](https://github.com/gohugoio/hugo/issues/3137)), and `EXTENSION_ABBREVIATION` ([#1970](https://github.com/gohugoio/hugo/issues/1970)) and the aforementioned GFM todo lists ([#2270](https://github.com/gohugoio/hugo/issues/2270)) are not fully supported. Contributions are welcome.
|
||||||
|
{{% /warning %}}
|
||||||
|
|
||||||
|
## MathJax with Hugo
|
||||||
|
|
||||||
|
[MathJax](http://www.mathjax.org/) is a JavaScript library that allows the display of mathematical expressions described via a LaTeX-style syntax in the HTML (or Markdown) source of a web page. As it is a pure a JavaScript library, getting it to work within Hugo is fairly straightforward, but does have some oddities that will be discussed here.
|
||||||
|
|
||||||
|
This is not an introduction into actually using MathJax to render typeset mathematics on your website. Instead, this page is a collection of tips and hints for one way to get MathJax working on a website built with Hugo.
|
||||||
|
|
||||||
|
### Enable MathJax
|
||||||
|
|
||||||
|
The first step is to enable MathJax on pages that you would like to have typeset math. There are multiple ways to do this (adventurous readers can consult the [Loading and Configuring](http://docs.mathjax.org/en/latest/configuration.html) section of the MathJax documentation for additional methods of including MathJax), but the easiest way is to use the secure MathJax CDN by include a `<script>` tag for the officially recommended secure CDN ([cdn.js.com](https://cdnjs.com)):
|
||||||
|
|
||||||
|
{{< code file="add-mathjax-to-page.html" >}}
|
||||||
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
|
||||||
|
</script>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
One way to ensure that this code is included in all pages is to put it in one of the templates that live in the `layouts/partials/` directory. For example, I have included this in the bottom of my template `footer.html` because I know that the footer will be included in every page of my website.
|
||||||
|
|
||||||
|
### Options and Features
|
||||||
|
|
||||||
|
MathJax is a stable open-source library with many features. I encourage the interested reader to view the [MathJax Documentation](http://docs.mathjax.org/en/latest/index.html), specifically the sections on [Basic Usage](http://docs.mathjax.org/en/latest/index.html#basic-usage) and [MathJax Configuration Options](http://docs.mathjax.org/en/latest/index.html#mathjax-configuration-options).
|
||||||
|
|
||||||
|
### Issues with Markdown
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
The following issues with Markdown assume you are using `.md` for content and BlackFriday for parsing. Using [Mmark](#mmark) as your content format will obviate the need for the following workarounds.
|
||||||
|
|
||||||
|
When using Mmark with MathJax, use `displayMath: [['$$','$$'], ['\\[','\\]']]`. See the [Mmark `README.md`](https://github.com/miekg/mmark/wiki/Syntax#math-blocks) for more information. In addition to MathJax, Mmark has been shown to work well with [KaTeX](https://github.com/Khan/KaTeX). See this [related blog post from a Hugo user](http://nosubstance.me/post/a-great-toolset-for-static-blogging/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
After enabling MathJax, any math entered between proper markers (see the [MathJax documentation][mathjaxdocs]) will be processed and typeset in the web page. One issue that comes up, however, with Markdown is that the underscore character (`_`) is interpreted by Markdown as a way to wrap text in `emph` blocks while LaTeX (MathJax) interprets the underscore as a way to create a subscript. This "double speak" of the underscore can result in some unexpected and unwanted behavior.
|
||||||
|
|
||||||
|
### Solution
|
||||||
|
|
||||||
|
There are multiple ways to remedy this problem. One solution is to simply escape each underscore in your math code by entering `\_` instead of `_`. This can become quite tedious if the equations you are entering are full of subscripts.
|
||||||
|
|
||||||
|
Another option is to tell Markdown to treat the MathJax code as verbatim code and not process it. One way to do this is to wrap the math expression inside a `<div>` `</div>` block. Markdown would ignore these sections and they would get passed directly on to MathJax and processed correctly. This works great for display style mathematics, but for inline math expressions the line break induced by the `<div>` is not acceptable. The syntax for instructing Markdown to treat inline text as verbatim is by wrapping it in backticks (`` ` ``). You might have noticed, however, that the text included in between backticks is rendered differently than standard text (on this site these are items highlighted in red). To get around this problem, we could create a new CSS entry that would apply standard styling to all inline verbatim text that includes MathJax code. Below I will show the HTML and CSS source that would accomplish this (note this solution was adapted from [this blog post](http://doswa.com/2011/07/20/mathjax-in-markdown.html)---all credit goes to the original author).
|
||||||
|
|
||||||
|
{{< code file="mathjax-markdown-solution.html" >}}
|
||||||
|
<script type="text/x-mathjax-config">
|
||||||
|
MathJax.Hub.Config({
|
||||||
|
tex2jax: {
|
||||||
|
inlineMath: [['$','$'], ['\\(','\\)']],
|
||||||
|
displayMath: [['$$','$$'], ['\[','\]']],
|
||||||
|
processEscapes: true,
|
||||||
|
processEnvironments: true,
|
||||||
|
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
|
||||||
|
TeX: { equationNumbers: { autoNumber: "AMS" },
|
||||||
|
extensions: ["AMSmath.js", "AMSsymbols.js"] }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/x-mathjax-config">
|
||||||
|
MathJax.Hub.Queue(function() {
|
||||||
|
// Fix <code> tags after MathJax finishes running. This is a
|
||||||
|
// hack to overcome a shortcoming of Markdown. Discussion at
|
||||||
|
// https://github.com/mojombo/jekyll/issues/199
|
||||||
|
var all = MathJax.Hub.getAllJax(), i;
|
||||||
|
for(i = 0; i < all.length; i += 1) {
|
||||||
|
all[i].SourceElement().parentNode.className += ' has-jax';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
As before, this content should be included in the HTML source of each page that will be using MathJax. The next code snippet contains the CSS that is used to have verbatim MathJax blocks render with the same font style as the body of the page.
|
||||||
|
|
||||||
|
{{< code file="mathjax-style.css" >}}
|
||||||
|
code.has-jax {
|
||||||
|
font: inherit;
|
||||||
|
font-size: 100%;
|
||||||
|
background: inherit;
|
||||||
|
border: inherit;
|
||||||
|
color: #515151;
|
||||||
|
}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
In the CSS snippet, notice the line `color: #515151;`. `#515151` is the value assigned to the `color` attribute of the `body` class in my CSS. In order for the equations to fit in with the body of a web page, this value should be the same as the color of the body.
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
With this setup, everything is in place for a natural usage of MathJax on pages generated using Hugo. In order to include inline mathematics, just put LaTeX code in between `` `$ TeX Code $` `` or `` `\( TeX Code \)` ``. To include display style mathematics, just put LaTeX code in between `<div>$$TeX Code$$</div>`. All the math will be properly typeset and displayed within your Hugo generated web page!
|
||||||
|
|
||||||
|
## Additional Formats Through External Helpers
|
||||||
|
|
||||||
|
Hugo has new concept called _external helpers_. It means that you can write your content using [Asciidoc][ascii], [reStructuredText][rest]. If you have files with associated extensions, Hugo will call external commands to generate the content. ([See the Hugo source code for external helpers][helperssource].)
|
||||||
|
|
||||||
|
For example, for Asciidoc files, Hugo will try to call the `asciidoctor` or `asciidoc` command. This means that you will have to install the associated tool on your machine to be able to use these formats. ([See the Asciidoctor docs for installation instructions](http://asciidoctor.org/docs/install-toolchain/)).
|
||||||
|
|
||||||
|
To use these formats, just use the standard extension and the front matter exactly as you would do with natively supported `.md` files.
|
||||||
|
|
||||||
|
{{% 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 %}}
|
||||||
|
|
||||||
|
## 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]
|
||||||
|
|
||||||
|
[`emojify` function]: /functions/emojify/
|
||||||
|
[ascii]: http://asciidoc.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]: /tools/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
|
||||||
|
[mdtutorial]: http://www.markdowntutorial.com/
|
||||||
|
[Miek Gieben's website]: https://miek.nl/2016/March/05/mmark-syntax-document/
|
||||||
|
[mmark]: https://github.com/miekg/mmark
|
||||||
|
[mmarkgh]: https://github.com/miekg/mmark/wiki/Syntax
|
||||||
|
[org]: http://orgmode.org/
|
||||||
|
[Pygments]: http://pygments.org/
|
||||||
|
[rest]: http://docutils.sourceforge.net/rst.html
|
||||||
|
[sc]: /content-management/shortcodes/
|
||||||
|
[sct]: /templates/shortcode-templates/
|
198
content/content-management/front-matter.md
Normal file
198
content/content-management/front-matter.md
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
---
|
||||||
|
title: Front Matter
|
||||||
|
linktitle:
|
||||||
|
description: Hugo allows you to add front matter in yaml, toml, or json to your content files.
|
||||||
|
date: 2017-01-09
|
||||||
|
publishdate: 2017-01-09
|
||||||
|
lastmod: 2017-02-24
|
||||||
|
categories: [content management]
|
||||||
|
#tags: ["front matter", "yaml", "toml", "json", "metadata", "archetypes"]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 30
|
||||||
|
weight: 30 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/front-matter/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
**Front matter** allows you to keep metadata attached to an instance of a [content type][]---i.e., embedded inside a content file---and is one of the many features that gives Hugo its strength.
|
||||||
|
|
||||||
|
## Front Matter Formats
|
||||||
|
|
||||||
|
Hugo supports three formats for front matter, each with their own identifying tokens.
|
||||||
|
|
||||||
|
TOML
|
||||||
|
: identified by opening and closing `+++`.
|
||||||
|
|
||||||
|
YAML
|
||||||
|
: identified by opening and closing `---`.
|
||||||
|
|
||||||
|
JSON
|
||||||
|
: a single JSON object surrounded by '`{`' and '`}`', followed by a new line.
|
||||||
|
|
||||||
|
### TOML Example
|
||||||
|
|
||||||
|
```
|
||||||
|
+++
|
||||||
|
title = "spf13-vim 3.0 release and new website"
|
||||||
|
description = "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
|
||||||
|
tags = [ ".vimrc", "plugins", "spf13-vim", "vim" ]
|
||||||
|
date = "2012-04-06"
|
||||||
|
categories = [
|
||||||
|
"Development",
|
||||||
|
"VIM"
|
||||||
|
]
|
||||||
|
slug = "spf13-vim-3-0-release-and-new-website"
|
||||||
|
+++
|
||||||
|
```
|
||||||
|
|
||||||
|
### YAML Example
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
title: "spf13-vim 3.0 release and new website"
|
||||||
|
description: "spf13-vim is a cross platform distribution of vim plugins and resources for Vim."
|
||||||
|
tags: [ ".vimrc", "plugins", "spf13-vim", "vim" ]
|
||||||
|
lastmod: 2015-12-23
|
||||||
|
date: "2012-04-06"
|
||||||
|
categories:
|
||||||
|
- "Development"
|
||||||
|
- "VIM"
|
||||||
|
slug: "spf13-vim-3-0-release-and-new-website"
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
### JSON Example
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"title": "spf13-vim 3.0 release and new website",
|
||||||
|
"description": "spf13-vim is a cross platform distribution of vim plugins and resources for Vim.",
|
||||||
|
"tags": [ ".vimrc", "plugins", "spf13-vim", "vim" ],
|
||||||
|
"date": "2012-04-06",
|
||||||
|
"categories": [
|
||||||
|
"Development",
|
||||||
|
"VIM"
|
||||||
|
],
|
||||||
|
"slug": "spf13-vim-3-0-release-and-new-website"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Front Matter Variables
|
||||||
|
|
||||||
|
### Predefined
|
||||||
|
|
||||||
|
There are a few predefined variables that Hugo is aware of. See [Page Variables][pagevars] for how to call many of these predefined variables in your templates.
|
||||||
|
|
||||||
|
`aliases`
|
||||||
|
: an array of one or more aliases (e.g., old published paths of renamed content) that will be created in the output directory structure . See [Aliases][aliases] for details.
|
||||||
|
|
||||||
|
`date`
|
||||||
|
: the datetime at which the content was created; note this value is auto-populated according to Hugo's built-in [archetype][].
|
||||||
|
|
||||||
|
`description`
|
||||||
|
: the description for the content.
|
||||||
|
|
||||||
|
`draft`
|
||||||
|
: if `true`, the content will not be rendered unless the `--buildDrafts` flag is passed to the `hugo` command.
|
||||||
|
|
||||||
|
`expiryDate`
|
||||||
|
: the datetime at which the content should no longer be published by Hugo; expired content will not be rendered unless the `--buildExpired` flag is passed to the `hugo` command.
|
||||||
|
|
||||||
|
`isCJKLanguage`
|
||||||
|
: if `true`, Hugo will explicitly treat the content as a CJK language; both `.Summary` and `.WordCount` work properly in CJK languages.
|
||||||
|
|
||||||
|
`keywords`
|
||||||
|
: the meta keywords for the content.
|
||||||
|
|
||||||
|
`layout`
|
||||||
|
: the layout Hugo should select from the [lookup order][lookup] when rendering the content. If a `type` is not specified in the front matter, Hugo will look for the layout of the same name in the layout directory that corresponds with a content's section. See ["Defining a Content Type"][definetype]
|
||||||
|
|
||||||
|
`lastmod`
|
||||||
|
: the datetime at which the content was last modified.
|
||||||
|
|
||||||
|
`linkTitle`
|
||||||
|
: used for creating links to content; if set, Hugo defaults to using the `linktitle` before the `title`. Hugo can also [order lists of content by `linktitle`][bylinktitle].
|
||||||
|
|
||||||
|
`markup`
|
||||||
|
: **experimental**; specify `"rst"` for reStructuredText (requires`rst2html`) or `"md"` (default) for Markdown.
|
||||||
|
|
||||||
|
`outputs`
|
||||||
|
: allows you to specify output formats specific to the content. See [output formats][outputs].
|
||||||
|
|
||||||
|
`publishDate`
|
||||||
|
: if in the future, content will not be rendered unless the `--buildFuture` flag is passed to `hugo`.
|
||||||
|
|
||||||
|
`slug`
|
||||||
|
: appears as the tail of the output URL. A value specified in front matter will override the segment of the URL based on the filename.
|
||||||
|
|
||||||
|
`taxonomies`
|
||||||
|
: these will use the field name of the plural form of the index; see the `tags` and `categories` in the above front matter examples.
|
||||||
|
|
||||||
|
`title`
|
||||||
|
: the title for the content.
|
||||||
|
|
||||||
|
`type`
|
||||||
|
: the type of the content; this value will be automatically derived from the directory (i.e., the [section][]) if not specified in front matter.
|
||||||
|
|
||||||
|
`url`
|
||||||
|
: the full path to the content from the web root. It makes no assumptions about the path of the content file. It also ignores any language prefixes of
|
||||||
|
the multilingual feature.
|
||||||
|
|
||||||
|
`weight`
|
||||||
|
: used for [ordering your content in lists][ordering].
|
||||||
|
|
||||||
|
{{% note "Hugo's Default URL Destinations" %}}
|
||||||
|
If neither `slug` nor `url` is present and [permalinks are not configured otherwise in your site `config` file](/content-management/urls/#permalinks), Hugo will use the filename of your content to create the output URL. See [Content Organization](/content-management/organization) for an explanation of paths in Hugo and [URL Management](/content-management/urls/) for ways to customize Hugo's default behaviors.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### User-Defined
|
||||||
|
|
||||||
|
You can add fields to your front matter arbitrarily to meet your needs. These user-defined key-values are placed into a single `.Params` variable for use in your templates.
|
||||||
|
|
||||||
|
The following fields can be accessed via `.Params.include_toc` and `.Params.show_comments`, respectively. The [Variables][] section provides more information on using Hugo's page- and site-level variables in your templates.
|
||||||
|
|
||||||
|
```
|
||||||
|
include_toc: true
|
||||||
|
show_comments: false
|
||||||
|
```
|
||||||
|
|
||||||
|
These two user-defined fields can then be accessed via `.Params.include_toc` and `.Params.show_comments`, respectively. The [Variables][variables] section provides more information on using Hugo's page- and site-level variables in your templates.
|
||||||
|
|
||||||
|
|
||||||
|
## Order Content Through Front Matter
|
||||||
|
|
||||||
|
You can assign content-specific `weight` in the front matter of your content. These values are especially useful for [ordering][ordering] in list views. You can use `weight` for ordering of content and the convention of [`<TAXONOMY>_weight`][taxweight] for ordering content within a taxonomy. See [Ordering and Grouping Hugo Lists][lists] to see how `weight` can be used to organize your content in list views.
|
||||||
|
|
||||||
|
## Override Global Markdown Configuration
|
||||||
|
|
||||||
|
It's possible to set some options for Markdown rendering in a content's front matter as an override to the [BlackFriday rendering options set in your project configuration][config].
|
||||||
|
|
||||||
|
## Front Matter Format Specs
|
||||||
|
|
||||||
|
* [TOML Spec][toml]
|
||||||
|
* [YAML Spec][yaml]
|
||||||
|
* [JSON Spec][json]
|
||||||
|
|
||||||
|
[variables]: /variables/
|
||||||
|
[aliases]: /content-management/urls/#aliases/
|
||||||
|
[archetype]: /content-management/archetypes/
|
||||||
|
[bylinktitle]: /templates/lists/#by-link-title
|
||||||
|
[config]: /getting-started/configuration/ "Hugo documentation for site configuration"
|
||||||
|
[content type]: /content-management/types/
|
||||||
|
[contentorg]: /content-management/organization/
|
||||||
|
[definetype]: /content-management/types/#defining-a-content-type "Learn how to specify a type and a layout in a content's front matter"
|
||||||
|
[json]: /documents/ecma-404-json-spec.pdf "Specification for JSON, JavaScript Object Notation"
|
||||||
|
[lists]: /templates/lists/#ordering-content "See how to order content in list pages; for example, templates that look to specific _index.md for content and front matter."
|
||||||
|
[lookup]: /templates/lookup-order/ "Hugo traverses your templates in a specific order when rendering content to allow for DRYer templating."
|
||||||
|
[ordering]: /templates/lists/ "Hugo provides multiple ways to sort and order your content in list templates"
|
||||||
|
[outputs]: /templates/output-formats/ "With the release of v22, you can output your content to any text format using Hugo's familiar templating"
|
||||||
|
[pagevars]: /variables/page/
|
||||||
|
[section]: /content-management/sections/
|
||||||
|
[taxweight]: /content-management/taxonomies/
|
||||||
|
[toml]: https://github.com/toml-lang/toml "Specification for TOML, Tom's Obvious Minimal Language"
|
||||||
|
[urls]: /content-management/urls/
|
||||||
|
[variables]: /variables/
|
||||||
|
[yaml]: http://yaml.org/spec/ "Specification for YAML, YAML Ain't Markup Language"
|
179
content/content-management/menus.md
Normal file
179
content/content-management/menus.md
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
---
|
||||||
|
title: Menus
|
||||||
|
linktitle: Menus
|
||||||
|
description: Hugo has a simple yet powerful menu system.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-03-31
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [menus]
|
||||||
|
draft: false
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 120
|
||||||
|
weight: 120 #rem
|
||||||
|
aliases: [/extras/menus/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{{% note "Lazy Blogger"%}}
|
||||||
|
If all you want is a simple menu for your sections, see the ["Section Menu for Lazy Bloggers" in Menu Templates](/templates/menu-templates/#section-menu-for-lazy-blogger).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
You can do this:
|
||||||
|
|
||||||
|
* Place content in one or many menus
|
||||||
|
* Handle nested menus with unlimited depth
|
||||||
|
* Create menu entries without being attached to any content
|
||||||
|
* Distinguish active element (and active branch)
|
||||||
|
|
||||||
|
## What is a Menu in Hugo?
|
||||||
|
|
||||||
|
A **menu** is a named array of menu entries accessible by name via the [`.Site.Menus` site variable][sitevars]. For example, you can access your site's `main` menu via `.Site.Menus.main`.
|
||||||
|
|
||||||
|
{{% note "Menus on Multilingual Sites" %}}
|
||||||
|
If you make use of the [multilingual feature](/content-management/multilingual/), you can define language-independent menus.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
A menu entry has the following properties (i.e., variables) available to it:
|
||||||
|
|
||||||
|
`.URL`
|
||||||
|
: string
|
||||||
|
|
||||||
|
`.Name`
|
||||||
|
: string
|
||||||
|
|
||||||
|
`.Menu`
|
||||||
|
: string
|
||||||
|
|
||||||
|
`.Identifier`
|
||||||
|
: string
|
||||||
|
|
||||||
|
`.Pre`
|
||||||
|
: template.HTML
|
||||||
|
|
||||||
|
`.Post`
|
||||||
|
: template.HTML
|
||||||
|
|
||||||
|
`.Weight`
|
||||||
|
: int
|
||||||
|
|
||||||
|
`.Parent`
|
||||||
|
: string
|
||||||
|
|
||||||
|
`.Children`
|
||||||
|
: Menu
|
||||||
|
|
||||||
|
Note that menus also have the following functions available as well:
|
||||||
|
|
||||||
|
`.HasChildren`
|
||||||
|
: boolean
|
||||||
|
|
||||||
|
Additionally, there are some relevant functions available to menus on a page:
|
||||||
|
|
||||||
|
`.IsMenuCurrent`
|
||||||
|
: (menu string, menuEntry *MenuEntry ) boolean
|
||||||
|
|
||||||
|
`.HasMenuCurrent`
|
||||||
|
: (menu string, menuEntry *MenuEntry) boolean
|
||||||
|
|
||||||
|
## Add content to menus
|
||||||
|
|
||||||
|
Hugo allows you to add content to a menu via the content's [front matter](/content-management/front-matter/).
|
||||||
|
|
||||||
|
### Simple
|
||||||
|
|
||||||
|
If all you need to do is add an entry to a menu, the simple form works well.
|
||||||
|
|
||||||
|
#### A Single Menu
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
menu: "main"
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Multiple Menus
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
menu: ["main", "footer"]
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Advanced
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: 'extras'
|
||||||
|
weight: 20
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
## Add Non-content Entries to a Menu
|
||||||
|
|
||||||
|
You can also add entries to menus that aren’t attached to a piece of content. This takes place in your Hugo project's [`config` file][config].
|
||||||
|
|
||||||
|
Here’s an example snippet pulled from a `config.toml`:
|
||||||
|
|
||||||
|
{{< code file="config.toml" >}}
|
||||||
|
[[menu.main]]
|
||||||
|
name = "about hugo"
|
||||||
|
pre = "<i class='fa fa-heart'></i>"
|
||||||
|
weight = -110
|
||||||
|
identifier = "about"
|
||||||
|
url = "/about/"
|
||||||
|
[[menu.main]]
|
||||||
|
name = "getting started"
|
||||||
|
pre = "<i class='fa fa-road'></i>"
|
||||||
|
weight = -100
|
||||||
|
url = "/getting-started/"
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Here's the equivalent snippet in a `config.yaml`:
|
||||||
|
|
||||||
|
{{< code file="config.yml" >}}
|
||||||
|
---
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
- Name: "about hugo"
|
||||||
|
Pre: "<i class='fa fa-heart'></i>"
|
||||||
|
Weight: -110
|
||||||
|
Identifier: "about"
|
||||||
|
URL: "/about/"
|
||||||
|
- Name: "getting started"
|
||||||
|
Pre: "<i class='fa fa-road'></i>"
|
||||||
|
Weight: -100
|
||||||
|
URL: "/getting-started/"
|
||||||
|
---
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
The URLs must be relative to the context root. If the `baseURL` is `https://example.com/mysite/`, then the URLs in the menu must not include the context root `mysite`. Using an absolute URL will overide the baseURL. If the value used for `URL` in the above example is `https://subdomain.example.com/`, the output will be `https://subdomain.example.com`.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Nesting
|
||||||
|
|
||||||
|
All nesting of content is done via the `parent` field.
|
||||||
|
|
||||||
|
The parent of an entry should be the identifier of another entry. The identifier should be unique (within a menu).
|
||||||
|
|
||||||
|
The following order is used to determine an Identifier:
|
||||||
|
|
||||||
|
`.Name > .LinkTitle > .Title`
|
||||||
|
|
||||||
|
This means that `.Title` will be used unless `.LinkTitle` is present, etc. In practice, `.Name` and `.Identifier` are only used to structure relationships and therefore never displayed.
|
||||||
|
|
||||||
|
In this example, the top level of the menu is defined in your [site `config` file][config]). All content entries are attached to one of these entries via the `.Parent` field.
|
||||||
|
|
||||||
|
## Render Menus
|
||||||
|
|
||||||
|
See [Menu Templates](/templates/menu-templates/) for information on how to render your site menus within your templates.
|
||||||
|
|
||||||
|
[config]: /getting-started/configuration/
|
||||||
|
[multilingual]: /content-management/multilingual/
|
||||||
|
[sitevars]: /variables/
|
294
content/content-management/multilingual.md
Normal file
294
content/content-management/multilingual.md
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
---
|
||||||
|
title: Multilingual Mode
|
||||||
|
linktitle: Multilingual and i18n
|
||||||
|
description: Hugo supports the creation of websites with multiple languages side by side.
|
||||||
|
date: 2017-01-10
|
||||||
|
publishdate: 2017-01-10
|
||||||
|
lastmod: 2017-01-10
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [multilingual,i18n, internationalization]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 150
|
||||||
|
weight: 150 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/multilingual/,/content-management/multilingual/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
You should define the available languages in a `Languages` section in your site configuration.
|
||||||
|
|
||||||
|
## Configure Languages
|
||||||
|
|
||||||
|
The following is an example of a TOML site configuration for a multilingual Hugo project:
|
||||||
|
|
||||||
|
{{< code file="config.toml" download="config.toml" >}}
|
||||||
|
DefaultContentLanguage = "en"
|
||||||
|
copyright = "Everything is mine"
|
||||||
|
|
||||||
|
[params.navigation]
|
||||||
|
help = "Help"
|
||||||
|
|
||||||
|
[Languages]
|
||||||
|
[Languages.en]
|
||||||
|
title = "My blog"
|
||||||
|
weight = 1
|
||||||
|
[Languages.en.params]
|
||||||
|
linkedin = "english-link"
|
||||||
|
|
||||||
|
[Languages.fr]
|
||||||
|
copyright = "Tout est à moi"
|
||||||
|
title = "Mon blog"
|
||||||
|
weight = 2
|
||||||
|
[Languages.fr.params]
|
||||||
|
linkedin = "lien-francais"
|
||||||
|
[Languages.fr.navigation]
|
||||||
|
help = "Aide"
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Anything not defined in a `[Languages]` block will fall back to the global
|
||||||
|
value for that key (e.g., `copyright` for the English [`en`] language).
|
||||||
|
|
||||||
|
With the configuration above, all content, sitemap, RSS feeds, paginations,
|
||||||
|
and taxonomy pages will be rendered below `/` in English (your default content language) and then below `/fr` in French.
|
||||||
|
|
||||||
|
When working with front matter `Params` in [single page templates][singles], omit the `params` in the key for the translation.
|
||||||
|
|
||||||
|
If you want all of the languages to be put below their respective language code, enable `defaultContentLanguageInSubdir: true`.
|
||||||
|
|
||||||
|
Only the obvious non-global options can be overridden per language. Examples of global options are `baseURL`, `buildDrafts`, etc.
|
||||||
|
|
||||||
|
## Taxonomies and Blackfriday
|
||||||
|
|
||||||
|
Taxonomies and [Blackfriday configuration][config] can also be set per language:
|
||||||
|
|
||||||
|
|
||||||
|
{{< code file="bf-config.toml" >}}
|
||||||
|
[Taxonomies]
|
||||||
|
tag = "tags"
|
||||||
|
|
||||||
|
[blackfriday]
|
||||||
|
angledQuotes = true
|
||||||
|
hrefTargetBlank = true
|
||||||
|
|
||||||
|
[Languages]
|
||||||
|
[Languages.en]
|
||||||
|
weight = 1
|
||||||
|
title = "English"
|
||||||
|
[Languages.en.blackfriday]
|
||||||
|
angledQuotes = false
|
||||||
|
|
||||||
|
[Languages.fr]
|
||||||
|
weight = 2
|
||||||
|
title = "Français"
|
||||||
|
[Languages.fr.Taxonomies]
|
||||||
|
plaque = "plaques"
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
## Translate Your Content
|
||||||
|
|
||||||
|
Translated articles are identified by the name of the content file.
|
||||||
|
|
||||||
|
### Examples of Translated Articles
|
||||||
|
|
||||||
|
1. `/content/about.en.md`
|
||||||
|
2. `/content/about.fr.md`
|
||||||
|
|
||||||
|
In this example, the `about.md` will be assigned the configured `defaultContentLanguage`.
|
||||||
|
|
||||||
|
1. `/content/about.md`
|
||||||
|
2. `/content/about.fr.md`
|
||||||
|
|
||||||
|
This way, you can slowly start to translate your current content without having to rename everything. If left unspecified, the default value for `defaultContentLanguage` is `en`.
|
||||||
|
|
||||||
|
By having the same *base filename*, the content pieces are linked together as translated pieces.
|
||||||
|
|
||||||
|
If you need distinct URLs per language, you can set the slug in the non-default language file. For example, you can define a custom slug for a French translation in the front matter of `content/about.fr.md` as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
slug: "a-propos"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
At render, Hugo will build both `/about/` and `/a-propos/` as properly linked translated pages.
|
||||||
|
|
||||||
|
{{%note %}}
|
||||||
|
Hugo currently uses the base filename as the translation key, which can be an issue with identical filenames in different sections.
|
||||||
|
We will fix this in https://github.com/gohugoio/hugo/issues/2699
|
||||||
|
{{% /note %}}
|
||||||
|
{{< todo >}}Rewrite/remove the above one issue is fixed.{{< /todo >}}
|
||||||
|
|
||||||
|
## Link to Translated Content
|
||||||
|
|
||||||
|
To create a list of links to translated content, use a template similar to the following:
|
||||||
|
|
||||||
|
{{< code file="layouts/partials/i18nlist.html" >}}
|
||||||
|
{{ if .IsTranslated }}
|
||||||
|
<h4>{{ i18n "translations" }}</h4>
|
||||||
|
<ul>
|
||||||
|
{{ range .Translations }}
|
||||||
|
<li>
|
||||||
|
<a href="{{ .Permalink }}">{{ .Lang }}: {{ .Title }}{{ if .IsPage }} ({{ i18n "wordCount" . }}){{ end }}</a>
|
||||||
|
</li>
|
||||||
|
{{ end}}
|
||||||
|
</ul>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
The above can be put in a `partial` (i.e., inside `layouts/partials/`) and included in any template, be it for a [single content page][contenttemplate] or the [homepage][]. It will not print anything if there are no translations for a given page, or if there are translations---in the case of the homepage, section listing, etc.---a site with only render one language.
|
||||||
|
|
||||||
|
The above also uses the [`i18n` function][i18func] described in the next section.
|
||||||
|
|
||||||
|
## Translation of Strings
|
||||||
|
|
||||||
|
Hugo uses [go-i18n][] to support string translations. [See the project's source repository][go-i18n-source] to find tools that will help you manage your translation workflows.
|
||||||
|
|
||||||
|
Translations are collected from the `themes/<THEME>/i18n/` folder (built into the theme), as well as translations present in `i18n/` at the root of your project. In the `i18n`, the translations will be merged and take precedence over what is in the theme folder. Language files should be named according to [RFC 5646][] with names such as `en-US.toml`, `fr.toml`, etc.
|
||||||
|
|
||||||
|
From within your templates, use the `i18n` function like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ i18n "home" }}
|
||||||
|
```
|
||||||
|
|
||||||
|
This uses a definition like this one in `i18n/en-US.toml`:
|
||||||
|
|
||||||
|
```
|
||||||
|
[home]
|
||||||
|
other = "Home"
|
||||||
|
```
|
||||||
|
|
||||||
|
Often you will want to use to the page variables in the translations strings. To do that, pass on the "." context when calling `i18n`:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ i18n "wordCount" . }}
|
||||||
|
```
|
||||||
|
|
||||||
|
This uses a definition like this one in `i18n/en-US.toml`:
|
||||||
|
|
||||||
|
```
|
||||||
|
[wordCount]
|
||||||
|
other = "This article has {{ .WordCount }} words."
|
||||||
|
```
|
||||||
|
An example of singular and plural form:
|
||||||
|
|
||||||
|
```
|
||||||
|
[readingTime]
|
||||||
|
one = "One minute read"
|
||||||
|
other = "{{.Count}} minutes read"
|
||||||
|
```
|
||||||
|
And then in the template:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ i18n "readingTime" .ReadingTime }}
|
||||||
|
```
|
||||||
|
To track down missing translation strings, run Hugo with the `--i18n-warnings` flag:
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo --i18n-warnings | grep i18n
|
||||||
|
i18n|MISSING_TRANSLATION|en|wordCount
|
||||||
|
```
|
||||||
|
|
||||||
|
## Customize Dates
|
||||||
|
|
||||||
|
At the time of this writing, Golang does not yet have support for internationalized locales, but if you do some work, you can simulate it. For example, if you want to use French month names, you can add a data file like ``data/mois.yaml`` with this content:
|
||||||
|
|
||||||
|
~~~yaml
|
||||||
|
1: "janvier"
|
||||||
|
2: "février"
|
||||||
|
3: "mars"
|
||||||
|
4: "avril"
|
||||||
|
5: "mai"
|
||||||
|
6: "juin"
|
||||||
|
7: "juillet"
|
||||||
|
8: "août"
|
||||||
|
9: "septembre"
|
||||||
|
10: "octobre"
|
||||||
|
11: "novembre"
|
||||||
|
12: "décembre"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
... then index the non-English date names in your templates like so:
|
||||||
|
|
||||||
|
~~~html
|
||||||
|
<time class="post-date" datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" | safeHTML }}">
|
||||||
|
Article publié le {{ .Date.Day }} {{ index $.Site.Data.mois (printf "%d" .Date.Month) }} {{ .Date.Year }} (dernière modification le {{ .Lastmod.Day }} {{ index $.Site.Data.mois (printf "%d" .Lastmod.Month) }} {{ .Lastmod.Year }})
|
||||||
|
</time>
|
||||||
|
~~~
|
||||||
|
|
||||||
|
This technique extracts the day, month and year by specifying ``.Date.Day``, ``.Date.Month``, and ``.Date.Year``, and uses the month number as a key, when indexing the month name data file.
|
||||||
|
|
||||||
|
## Menus
|
||||||
|
|
||||||
|
You can define your menus for each language independently. The [creation of a menu][menus] works analogous to earlier versions of Hugo, except that they have to be defined in their language-specific block in the configuration file:
|
||||||
|
|
||||||
|
```
|
||||||
|
defaultContentLanguage = "en"
|
||||||
|
|
||||||
|
[languages.en]
|
||||||
|
weight = 0
|
||||||
|
languageName = "English"
|
||||||
|
|
||||||
|
[[languages.en.menu.main]]
|
||||||
|
url = "/"
|
||||||
|
name = "Home"
|
||||||
|
weight = 0
|
||||||
|
|
||||||
|
|
||||||
|
[languages.de]
|
||||||
|
weight = 10
|
||||||
|
languageName = "Deutsch"
|
||||||
|
|
||||||
|
[[languages.de.menu.main]]
|
||||||
|
url = "/"
|
||||||
|
name = "Startseite"
|
||||||
|
weight = 0
|
||||||
|
```
|
||||||
|
|
||||||
|
The rendering of the main navigation works as usual. `.Site.Menus` will just contain the menu of the current language. Pay attention to the generation of the menu links. `absLangURL` takes care that you link to the correct locale of your website. Otherwise, both menu entries would link to the English version as the default content language that resides in the root directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
<ul>
|
||||||
|
{{- $currentPage := . -}}
|
||||||
|
{{ range .Site.Menus.main -}}
|
||||||
|
<li class="{{ if $currentPage.IsMenuCurrent "main" . }}active{{ end }}">
|
||||||
|
<a href="{{ .URL | absLangURL }}">{{ .Name }}</a>
|
||||||
|
</li>
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Missing translations
|
||||||
|
|
||||||
|
If a string does not have a translation for the current language, Hugo will use the value from the default language. If no default value is set, an empty string will be shown.
|
||||||
|
|
||||||
|
While translating a Hugo website, it can be handy to have a visual indicator of missing translations. The [`enableMissingTranslationPlaceholders` configuration option][config] will flag all untranslated strings with the placeholder `[i18n] identifier`, where `identifier` is the id of the missing translation.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
Hugo will generate your website with these missing translation placeholders. It might not be suited for production environments.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Multilingual Themes support
|
||||||
|
|
||||||
|
To support Multilingual mode in your themes, some considerations must be taken for the URLs in the templates. If there is more than one language, URLs must meet the following criteria:
|
||||||
|
|
||||||
|
* Come from the built-in `.Permalink` or `.URL`
|
||||||
|
* Be constructed with
|
||||||
|
* The [`relLangURL` template function][rellangurl] or the [`absLangURL` template function][abslangurl] **OR**
|
||||||
|
* Prefixed with `{{ .LanguagePrefix }}`
|
||||||
|
|
||||||
|
If there is more than one language defined, the `LanguagePrefix` variable will equal `/en` (or whatever your `CurrentLanguage` is). If not enabled, it will be an empty string and is therefore harmless for single-language Hugo websites.
|
||||||
|
|
||||||
|
[abslangurl]: /functions/abslangurl
|
||||||
|
[config]: /getting-started/configuration/
|
||||||
|
[contenttemplate]: /templates/single-page-templates/
|
||||||
|
[go-i18n-source]: https://github.com/nicksnyder/go-i18n
|
||||||
|
[go-i18n]: https://github.com/nicksnyder/go-i18n
|
||||||
|
[homepage]: /templates/homepage/
|
||||||
|
[i18func]: /functions/i18n/
|
||||||
|
[menus]: /content-management/menus/
|
||||||
|
[rellangurl]: /functions/rellangurl
|
||||||
|
[RFC 5646]: https://tools.ietf.org/html/rfc5646
|
||||||
|
[singles]: /templates/single-page-templates/
|
241
content/content-management/organization.md
Normal file
241
content/content-management/organization.md
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
---
|
||||||
|
title: Content Organization
|
||||||
|
linktitle: Organization
|
||||||
|
description: Hugo assumes that the same structure that works to organize your source content is used to organize the rendered site.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [content management,fundamentals]
|
||||||
|
#tags: [sections,content,organization]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 10
|
||||||
|
weight: 10 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/sections/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
This section is not updated with the new nested sections support in Hugo 0.24, see https://github.com/gohugoio/hugoDocs/issues/36
|
||||||
|
{{% /note %}}
|
||||||
|
{{% todo %}}
|
||||||
|
See above
|
||||||
|
{{% /todo %}}
|
||||||
|
|
||||||
|
## Organization of Content Source
|
||||||
|
|
||||||
|
In Hugo, your content should be organized in a manner that reflects the rendered website.
|
||||||
|
|
||||||
|
While Hugo supports content nested at any level, the top levels (i.e. `content/<DIRECTORIES>`) are special in Hugo and are considered the content [sections][]. Without any additional configuration, the following will just work:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
└── content
|
||||||
|
└── about
|
||||||
|
| └── _index.md // <- https://example.com/about/
|
||||||
|
├── post
|
||||||
|
| ├── firstpost.md // <- https://example.com/post/firstpost/
|
||||||
|
| ├── happy
|
||||||
|
| | └── ness.md // <- https://example.com/post/happy/ness/
|
||||||
|
| └── secondpost.md // <- https://example.com/post/secondpost/
|
||||||
|
└── quote
|
||||||
|
├── first.md // <- https://example.com/quote/first/
|
||||||
|
└── second.md // <- https://example.com/quote/second/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Path Breakdown in Hugo
|
||||||
|
|
||||||
|
The following demonstrates the relationships between your content organization and the output URL structure for your Hugo website when it renders. These examples assume you are [using pretty URLs][pretty], which is the default behavior for Hugo. The examples also assume a key-value of `baseurl = "https://example.com"` in your [site's configuration file][config].
|
||||||
|
|
||||||
|
### Index Pages: `_index.md`
|
||||||
|
|
||||||
|
`_index.md` has a special role in Hugo. It allows you to add front matter and content to your [list templates][lists] as of v0.18. These templates include those for [section templates][], [taxonomy templates][], [taxonomy terms templates][], and your [homepage template][]. In your templates, you can grab information from `_index.md` using the [`.Site.GetPage` function][getpage].
|
||||||
|
|
||||||
|
You can keep one `_index.md` for your homepage and one in each of your content sections, taxonomies, and taxonomy terms. The following shows typical placement of an `_index.md` that would contain content and front matter for a `posts` section list page on a Hugo website:
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
. url
|
||||||
|
. ⊢--^-⊣
|
||||||
|
. path slug
|
||||||
|
. ⊢--^-⊣⊢---^---⊣
|
||||||
|
. filepath
|
||||||
|
. ⊢------^------⊣
|
||||||
|
content/posts/_index.md
|
||||||
|
```
|
||||||
|
|
||||||
|
At build, this will output to the following destination with the associated values:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
url ("/posts/")
|
||||||
|
⊢-^-⊣
|
||||||
|
baseurl section ("posts")
|
||||||
|
⊢--------^---------⊣⊢-^-⊣
|
||||||
|
permalink
|
||||||
|
⊢----------^-------------⊣
|
||||||
|
https://example.com/posts/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
### Single Pages in Sections
|
||||||
|
|
||||||
|
Single content files in each of your sections are going to be rendered as [single page templates][singles]. Here is an example of a single `post` within `posts`:
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
path ("posts/my-first-hugo-post.md")
|
||||||
|
. ⊢-----------^------------⊣
|
||||||
|
. section slug
|
||||||
|
. ⊢-^-⊣⊢--------^----------⊣
|
||||||
|
content/posts/my-first-hugo-post.md
|
||||||
|
```
|
||||||
|
|
||||||
|
At the time Hugo builds your site, the content will be output to the following destination:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
url ("/posts/my-first-hugo-post/")
|
||||||
|
⊢------------^----------⊣
|
||||||
|
baseurl section slug
|
||||||
|
⊢--------^--------⊣⊢-^--⊣⊢-------^---------⊣
|
||||||
|
permalink
|
||||||
|
⊢--------------------^---------------------⊣
|
||||||
|
https://example.com/posts/my-first-hugo-post/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
### Section with Nested Directories
|
||||||
|
|
||||||
|
To continue the example, the following demonstrates destination paths for a file located at `content/events/chicago/lollapalooza.md` in the same site:
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
section
|
||||||
|
⊢--^--⊣
|
||||||
|
url
|
||||||
|
⊢-------------^------------⊣
|
||||||
|
|
||||||
|
baseURL path slug
|
||||||
|
⊢--------^--------⊣ ⊢------^-----⊣⊢----^------⊣
|
||||||
|
permalink
|
||||||
|
⊢----------------------^-----------------------⊣
|
||||||
|
https://example.com/events/chicago/lollapalooza/
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
As of v0.20, Hugo does not recognize nested sections. While you can nest as many content *directories* as you'd like, any child directory of a section will still be considered the same section as that of its parents. Therefore, in the above example, `{{.Section}}` for `lollapalooza.md` is `events` and *not* `chicago`. See the [related issue on GitHub](https://github.com/gohugoio/hugo/issues/465).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Paths Explained
|
||||||
|
|
||||||
|
The following concepts will provide more insight into the relationship between your project's organization and the default behaviors of Hugo when building the output website.
|
||||||
|
|
||||||
|
### `section`
|
||||||
|
|
||||||
|
A default content type is determined by a piece of content's section. `section` is determined by the location within the project's `content` directory. `section` *cannot* be specified or overridden in front matter.
|
||||||
|
|
||||||
|
### `slug`
|
||||||
|
|
||||||
|
A content's `slug` is either `name.extension` or `name/`. The value for `slug` is determined by
|
||||||
|
|
||||||
|
* the name of the content file (e.g., `lollapalooza.md`) OR
|
||||||
|
* front matter overrides
|
||||||
|
|
||||||
|
### `path`
|
||||||
|
|
||||||
|
A content's `path` is determined by the section's path to the file. The file `path`
|
||||||
|
|
||||||
|
* is based on the path to the content's location AND
|
||||||
|
* does not include the slug
|
||||||
|
|
||||||
|
### `url`
|
||||||
|
|
||||||
|
The `url` is the relative URL for the piece of content. The `url`
|
||||||
|
|
||||||
|
* is based on the content's location within the directory structure OR
|
||||||
|
* is defined in front matter and *overrides all the above*
|
||||||
|
|
||||||
|
## Override Destination Paths via Front Matter
|
||||||
|
|
||||||
|
Hugo believes that you organize your content with a purpose. The same structure that works to organize your source content is used to organize the rendered site. As displayed above, the organization of the source content will be mirrored in the destination.
|
||||||
|
|
||||||
|
There are times where you may need more control over your content. In these cases, there are fields that can be specified in the front matter to determine the destination of a specific piece of content.
|
||||||
|
|
||||||
|
The following items are defined in this order for a specific reason: items explained further down in the list will override earlier items, and not all of these items can be defined in front matter:
|
||||||
|
|
||||||
|
### `filename`
|
||||||
|
|
||||||
|
This isn't in the front matter, but is the actual name of the file minus the extension. This will be the name of the file in the destination (e.g., `content/posts/my-post.md` becomes `example.com/posts/my-post/`).
|
||||||
|
|
||||||
|
### `slug`
|
||||||
|
|
||||||
|
When defined in the front matter, the `slug` can take the place of the filename for the destination.
|
||||||
|
|
||||||
|
{{< code file="content/posts/old-post.md" >}}
|
||||||
|
---
|
||||||
|
title: New Post
|
||||||
|
slug: "new-post"
|
||||||
|
---
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
This will render to the following destination according to Hugo's default behavior:
|
||||||
|
|
||||||
|
```
|
||||||
|
example.com/posts/new-post/
|
||||||
|
```
|
||||||
|
|
||||||
|
### `section`
|
||||||
|
|
||||||
|
`section` is determined by a content's location on disk and *cannot* be specified in the front matter. See [sections][] for more information.
|
||||||
|
|
||||||
|
### `type`
|
||||||
|
|
||||||
|
A content's `type` is also determined by its location on disk but, unlike `section`, it *can* be specified in the front matter. See [types][]. This can come in especially handy when you want a piece of content to render using a different layout. In the following example, you can create a layout at `layouts/new/mylayout.html` that Hugo will use to render this piece of content, even in the midst of many other posts.
|
||||||
|
|
||||||
|
{{< code file="content/posts/my-post.md" >}}
|
||||||
|
---
|
||||||
|
title: My Post
|
||||||
|
type: new
|
||||||
|
layout: mylayout
|
||||||
|
---
|
||||||
|
{{< /code >}}
|
||||||
|
<!-- See https://discourse.gohugo.io/t/path-not-works/6387 -->
|
||||||
|
<!-- ### `path`-->
|
||||||
|
|
||||||
|
<!--`path` can be provided in the front matter. This will replace the actual path to the file on disk. Destination will create the destination with the same path, including the section. -->
|
||||||
|
|
||||||
|
### `url`
|
||||||
|
|
||||||
|
A complete URL can be provided. This will override all the above as it pertains to the end destination. This must be the path from the baseURL (starting with a `/`). `url` will be used exactly as it provided in the front matter and will ignore the `--uglyURLs` setting in your site configuration:
|
||||||
|
|
||||||
|
{{< code file="content/posts/old-url.md" >}}
|
||||||
|
---
|
||||||
|
title: Old URL
|
||||||
|
url: /blog/new-url/
|
||||||
|
---
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Assuming your `baseURL` is [configured][config] to `https://example.com`, the addition of `url` to the front matter will make `old-url.md` render to the following destination:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://example.com/blog/new-url/
|
||||||
|
```
|
||||||
|
|
||||||
|
You can see more information on how to control output paths in [URL Management][urls].
|
||||||
|
|
||||||
|
[config]: /getting-started/configuration/
|
||||||
|
[formats]: /content-management/formats/
|
||||||
|
[front matter]: /content-management/front-matter/
|
||||||
|
[getpage]: /functions/getpage/
|
||||||
|
[homepage template]: /templates/homepage/
|
||||||
|
[homepage]: /templates/homepage/
|
||||||
|
[lists]: /templates/lists/
|
||||||
|
[pretty]: /content-management/urls/#pretty-urls
|
||||||
|
[section templates]: /templates/section-templates/
|
||||||
|
[sections]: /content-management/sections/
|
||||||
|
[singles]: /templates/single-page-templates/
|
||||||
|
[taxonomy templates]: /templates/taxonomy-templates/
|
||||||
|
[taxonomy terms templates]: /templates/taxonomy-templates/
|
||||||
|
[types]: /content-management/types/
|
||||||
|
[urls]: /content-management/urls/
|
73
content/content-management/sections.md
Normal file
73
content/content-management/sections.md
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
---
|
||||||
|
title: Content Sections
|
||||||
|
linktitle: Sections
|
||||||
|
description: Hugo supports content sections, which according to Hugo's default behavior, will reflect the structure of the rendered website.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [lists,sections,content types,organization]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 50
|
||||||
|
weight: 50 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/sections/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
This section is not updated with the new nested sections support in Hugo 0.24, see https://github.com/gohugoio/hugoDocs/issues/36
|
||||||
|
{{% /note %}}
|
||||||
|
{{% todo %}}
|
||||||
|
See above
|
||||||
|
{{% /todo %}}
|
||||||
|
|
||||||
|
Hugo believes that you organize your content with a purpose. The same structure that works to organize your source content is used to organize the rendered site (see [directory structure][]).
|
||||||
|
|
||||||
|
Following this pattern, Hugo uses the top level of your content organization as the content **section**.
|
||||||
|
|
||||||
|
The following example shows a content directory structure for a website that has three sections: "authors," "events," and "posts":
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
└── content
|
||||||
|
├── authors
|
||||||
|
| ├── _index.md // <- example.com/authors/
|
||||||
|
| ├── john-doe.md // <- example.com/authors/john-doe/
|
||||||
|
| └── jane-doe.md // <- example.com/authors/jane-doe/
|
||||||
|
└── events
|
||||||
|
| ├── _index.md // <- example.com/events/
|
||||||
|
| ├── event-1.md // <- example.com/events/event-1/
|
||||||
|
| ├── event-2.md // <- example.com/events/event-2/
|
||||||
|
| └── event-3.md // <- example.com/events/event-3/
|
||||||
|
└── posts
|
||||||
|
| ├── _index.md // <- example.com/posts/
|
||||||
|
| ├── event-1.md // <- example.com/posts/event-1/
|
||||||
|
| ├── event-2.md // <- example.com/posts/event-2/
|
||||||
|
| ├── event-3.md // <- example.com/posts/event-3/
|
||||||
|
| ├── event-4.md // <- example.com/posts/event-4/
|
||||||
|
| └── event-5.md // <- example.com/posts/event-5/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Content Section Lists
|
||||||
|
|
||||||
|
Hugo will automatically create pages for each section root that list all of the content in that section. See the documentation on [section templates][] for details on customizing the way these pages are rendered.
|
||||||
|
|
||||||
|
As of Hugo v0.18, section pages can also have a content file and front matter. These section content files must be placed in their corresponding section folder and named `_index.md` in order for Hugo to correctly render the front matter and content.
|
||||||
|
|
||||||
|
{{% warning "`index.md` vs `_index.md`" %}}
|
||||||
|
Hugo themes developed before v0.18 often used an `index.md`(i.e., without the leading underscore [`_`]) in a content section as a hack to emulate the behavior of `_index.md`. The hack may work...*sometimes*; however, the order of page rendering can be unpredictable in Hugo. What works now may fail to render appropriately as your site grows. It is **strongly advised** to use `_index.md` as content for your section index pages. **Note:** `_index.md`'s layout, as representative of a section, is a [list page template](/templates/section-templates/) and *not* a [single page template](/templates/single-page-templates/). If you want to alter the new default behavior for `_index.md`, configure `disableKinds` accordingly in your [site's configuration](/getting-started/configuration/).
|
||||||
|
{{% /warning %}}
|
||||||
|
|
||||||
|
## Content *Section* vs Content *Type*
|
||||||
|
|
||||||
|
By default, everything created within a section will use the [content type][] that matches the section name. For example, Hugo will assume that `posts/post-1.md` has a `posts` content type. If you are using an [archetype][] for your posts section, Hugo will generate front matter according to what it finds in `archetypes/posts.md`.
|
||||||
|
|
||||||
|
[archetype]: /content-management/archetypes/
|
||||||
|
[content type]: /content-management/types/
|
||||||
|
[directory structure]: /getting-started/directory-structure/
|
||||||
|
[section templates]: /templates/section-templates/
|
||||||
|
|
||||||
|
|
395
content/content-management/shortcodes.md
Normal file
395
content/content-management/shortcodes.md
Normal file
|
@ -0,0 +1,395 @@
|
||||||
|
---
|
||||||
|
title: Shortcodes
|
||||||
|
linktitle:
|
||||||
|
description: Shortcodes are simple snippets inside your content files calling built-in or custom templates.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-03-31
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 35
|
||||||
|
weight: 35 #rem
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [markdown,content,shortcodes]
|
||||||
|
draft: false
|
||||||
|
aliases: [/extras/shortcodes/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
## What a Shortcode is
|
||||||
|
|
||||||
|
Hugo loves Markdown because of its simple content format, but there are times when Markdown falls short. Often, content authors are forced to add raw HTML (e.g., video `<iframes>`) to Markdown content. We think this contradicts the beautiful simplicity of Markdown's syntax.
|
||||||
|
|
||||||
|
Hugo created **shortcodes** to circumvent these limitations.
|
||||||
|
|
||||||
|
A shortcode is a simple snippet inside a content file that Hugo will render using a predefined template. Note that shortcodes will not work in template files. If you need the type of drop-in functionality that shortcodes provide but in a template, you most likely want a [partial template][partials] instead.
|
||||||
|
|
||||||
|
In addition to cleaner Markdown, shortcodes can be updated any time to reflect new classes, techniques, or standards. At the point of site generation, Hugo shortcodes will easily merge in your changes. You avoid a possibly complicated search and replace operation.
|
||||||
|
|
||||||
|
## Use Shortcodes
|
||||||
|
|
||||||
|
In your content files, a shortcode can be called by calling `{{%/* shortcodename parameters */%}}`. Shortcode parameters are space delimited, and parameters with internal spaces can be quoted.
|
||||||
|
|
||||||
|
The first word in the shortcode declaration is always the name of the shortcode. Parameters follow the name. Depending upon how the shortcode is defined, the parameters may be named, positional, or both, although you can't mix parameter types in a single call. The format for named parameters models that of HTML with the format `name="value"`.
|
||||||
|
|
||||||
|
Some shortcodes use or require closing shortcodes. Again like HTML, the opening and closing shortcodes match (name only) with the closing declaration, which is prepended with a slash.
|
||||||
|
|
||||||
|
Here are two examples of paired shortcodes:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{%/* mdshortcode */%}}Stuff to `process` in the *center*.{{%/* /mdshortcode */%}}
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* highlight go */>}} A bunch of code here {{</* /highlight */>}}
|
||||||
|
```
|
||||||
|
|
||||||
|
The examples above use two different delimiters, the difference being the `%` character in the first and the `<>` characters in the second.
|
||||||
|
|
||||||
|
### Shortcodes with Markdown
|
||||||
|
|
||||||
|
The `%` character indicates that the shortcode's inner content---called in the [shortcode template][sctemps] with the [`.Inner` variable][scvars]---needs further processing by the page's rendering processor (i.e. markdown via Blackfriday). In the following example, Blackfriday would convert `**World**` to `<strong>World</strong>`:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{%/* myshortcode */%}}Hello **World!**{{%/* /myshortcode */%}}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shortcodes Without Markdown
|
||||||
|
|
||||||
|
The `<` character indicates that the shortcode's inner content does *not* need further rendering. Often shortcodes without markdown include internal HTML:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* myshortcode */>}}<p>Hello <strong>World!</strong></p>{{</* /myshortcode */>}}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nested Shortcodes
|
||||||
|
|
||||||
|
You can call shortcodes within other shortcodes by creating your own templates that leverage the `.Parent` variable. `.Parent` allows you to check the context in which the shortcode is being called. See [Shortcode templates][sctemps].
|
||||||
|
|
||||||
|
## Use Hugo's Built-in Shortcodes
|
||||||
|
|
||||||
|
Hugo ships with a set of predefined shortcodes that represent very common usage. These shortcodes are provided for author convenience and to keep your markdown content clean.
|
||||||
|
|
||||||
|
### `figure`
|
||||||
|
|
||||||
|
`figure` is an extension of the image syntax in markdown, which does not provide a shorthand for the more semantic [HTML5 `<figure>` element][figureelement].
|
||||||
|
|
||||||
|
The `figure` shortcode can use the following named parameters:
|
||||||
|
|
||||||
|
* `src`
|
||||||
|
* `link`
|
||||||
|
* `title`
|
||||||
|
* `caption`
|
||||||
|
* `class`
|
||||||
|
* `attr` (i.e., attribution)
|
||||||
|
* `attrlink`
|
||||||
|
* `alt`
|
||||||
|
|
||||||
|
#### Example `figure` Input
|
||||||
|
|
||||||
|
{{< code file="figure-input-example.md" >}}
|
||||||
|
{{</* figure src="/media/spf13.jpg" title="Steve Francia" */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `figure` Output
|
||||||
|
|
||||||
|
{{< output file="figure-output-example.html" >}}
|
||||||
|
<figure>
|
||||||
|
<img src="/media/spf13.jpg" />
|
||||||
|
<figcaption>
|
||||||
|
<h4>Steve Francia</h4>
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
### `gist`
|
||||||
|
|
||||||
|
Bloggers often want to include GitHub gists when writing posts. Let's suppose we want to use the [gist at the following url][examplegist]:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://gist.github.com/spf13/7896402
|
||||||
|
```
|
||||||
|
|
||||||
|
We can embed the gist in our content via username and gist ID pulled from the URL:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* gist spf13 7896402 */>}}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example `gist` Input
|
||||||
|
|
||||||
|
If the gist contains several files and you want to quote just one of them, you can pass the filename (quoted) as an optional third argument:
|
||||||
|
|
||||||
|
{{< code file="gist-input.md" >}}
|
||||||
|
{{</* gist spf13 7896402 "img.html" */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `gist` Output
|
||||||
|
|
||||||
|
{{< output file="gist-output.html" >}}
|
||||||
|
{{< gist spf13 7896402 >}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
#### Example `gist` Display
|
||||||
|
|
||||||
|
To demonstrate the remarkably efficiency of Hugo's shortcode feature, we have embedded the `spf13` `gist` example in this page. The following simulates the experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
|
||||||
|
|
||||||
|
{{< gist spf13 7896402 >}}
|
||||||
|
|
||||||
|
### `highlight`
|
||||||
|
|
||||||
|
This shortcode will convert the source code provided into syntax-highlighted HTML. Read more on [highlighting](/tools/syntax-highlighting/). `highlight` takes exactly one required `language` parameter and requires a closing shortcode.
|
||||||
|
|
||||||
|
#### Example `highlight` Input
|
||||||
|
|
||||||
|
{{< code file="content/tutorials/learn-html.md" >}}
|
||||||
|
{{</* highlight html */>}}
|
||||||
|
<section id="main">
|
||||||
|
<div>
|
||||||
|
<h1 id="title">{{ .Title }}</h1>
|
||||||
|
{{ range .Data.Pages }}
|
||||||
|
{{ .Render "summary"}}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{{</* /highlight */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `highlight` Output
|
||||||
|
|
||||||
|
The `highlight` shortcode example above would produce the following HTML when the site is rendered:
|
||||||
|
|
||||||
|
{{< output file="tutorials/learn-html/index.html" >}}
|
||||||
|
<span style="color: #f92672"><section</span> <span style="color: #a6e22e">id=</span><span style="color: #e6db74">"main"</span><span style="color: #f92672">></span>
|
||||||
|
<span style="color: #f92672"><div></span>
|
||||||
|
<span style="color: #f92672"><h1</span> <span style="color: #a6e22e">id=</span><span style="color: #e6db74">"title"</span><span style="color: #f92672">></span>{{ .Title }}<span style="color: #f92672"></h1></span>
|
||||||
|
{{ range .Data.Pages }}
|
||||||
|
{{ .Render "summary"}}
|
||||||
|
{{ end }}
|
||||||
|
<span style="color: #f92672"></div></span>
|
||||||
|
<span style="color: #f92672"></section></span>
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
{{% note "More on Syntax Highlighting" %}}
|
||||||
|
To see even more options for adding syntax-highlighted code blocks to your website, see [Syntax Highlighting in Developer Tools](/tools/syntax-highlighting/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### `instagram`
|
||||||
|
|
||||||
|
If you'd like to embed a photo from [Instagram][], you only need the photo's ID. You can discern an Instagram photo ID from the URL:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://www.instagram.com/p/BWNjjyYFxVx/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example `instagram` Input
|
||||||
|
|
||||||
|
{{< code file="instagram-input.md" >}}
|
||||||
|
{{</* instagram BWNjjyYFxVx */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
You also have the option to hide the caption:
|
||||||
|
|
||||||
|
{{< code file="instagram-input-hide-caption.md" >}}
|
||||||
|
{{</* instagram BWNjjyYFxVx hidecaption */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `instagram` Output
|
||||||
|
|
||||||
|
By adding the preceding `hidecaption` example, the following HTML will be added to your rendered website's markup:
|
||||||
|
|
||||||
|
{{< output file="instagram-hide-caption-output.html" >}}
|
||||||
|
{{< instagram BWNjjyYFxVx hidecaption >}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
#### Example `instagram` Display
|
||||||
|
|
||||||
|
Using the preceding `instagram` with hidecaption` example above, the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
|
||||||
|
|
||||||
|
{{< instagram BWNjjyYFxVx hidecaption >}}
|
||||||
|
|
||||||
|
|
||||||
|
### `ref` and `relref`
|
||||||
|
|
||||||
|
These shortcodes will look up the pages by their relative path (e.g., `blog/post.md`) or their logical name (`post.md`) and return the permalink (`ref`) or relative permalink (`relref`) for the found page.
|
||||||
|
|
||||||
|
`ref` and `relref` also make it possible to make fragmentary links that work for the header links generated by Hugo.
|
||||||
|
|
||||||
|
{{% note "More on Cross References" %}}
|
||||||
|
Read a more extensive description of `ref` and `relref` in the [cross references](/content-management/cross-references/) documentation.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
`ref` and `relref` take exactly one required parameter of _reference_, quoted and in position `0`.
|
||||||
|
|
||||||
|
#### Example `ref` and `relref` Input
|
||||||
|
|
||||||
|
```
|
||||||
|
[Neat]({{</* ref "blog/neat.md" */>}})
|
||||||
|
[Who]({{</* relref "about.md#who" */>}})
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example `ref` and `relref` Output
|
||||||
|
|
||||||
|
Assuming that standard Hugo pretty URLs are turned on.
|
||||||
|
|
||||||
|
```
|
||||||
|
<a href="/blog/neat">Neat</a>
|
||||||
|
<a href="/about/#who:c28654c202e73453784cfd2c5ab356c0">Who</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
### `speakerdeck`
|
||||||
|
|
||||||
|
To embed slides from [Speaker Deck][], click on "< /> Embed" (under Share right next to the template on Speaker Deck) and copy the URL:
|
||||||
|
|
||||||
|
```
|
||||||
|
<script async class="speakerdeck-embed" data-id="4e8126e72d853c0060001f97" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `speakerdeck` Example Input
|
||||||
|
|
||||||
|
Extract the value from the field `data-id` and pass it to the shortcode:
|
||||||
|
|
||||||
|
{{< code file="speakerdeck-example-input.md" >}}
|
||||||
|
{{</* speakerdeck 4e8126e72d853c0060001f97 */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### `speakerdeck` Example Output
|
||||||
|
|
||||||
|
{{< output file="speakerdeck-example-input.md" >}}
|
||||||
|
{{< speakerdeck 4e8126e72d853c0060001f97 >}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
#### `speakerdeck` Example Display
|
||||||
|
|
||||||
|
For the preceding `speakerdeck` example, the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
|
||||||
|
|
||||||
|
{{< speakerdeck 4e8126e72d853c0060001f97 >}}
|
||||||
|
|
||||||
|
### `tweet`
|
||||||
|
|
||||||
|
You want to include a single tweet into your blog post? Everything you need is the URL of the tweet:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://twitter.com/spf13/status/877500564405444608
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example `tweet` Input
|
||||||
|
|
||||||
|
Pass the tweet's ID from the URL as a parameter to the `tweet` shortcode:
|
||||||
|
|
||||||
|
{{< code file="example-tweet-input.md" >}}
|
||||||
|
{{</* tweet 877500564405444608 */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `tweet` Output
|
||||||
|
|
||||||
|
Using the preceding `tweet` example, the following HTML will be added to your rendered website's markup:
|
||||||
|
|
||||||
|
{{< output file="example-tweet-output.html" >}}
|
||||||
|
{{< tweet 877500564405444608 >}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
#### Example `tweet` Display
|
||||||
|
|
||||||
|
Using the preceding `tweet` example, the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
|
||||||
|
|
||||||
|
{{< tweet 877500564405444608 >}}
|
||||||
|
|
||||||
|
### `vimeo`
|
||||||
|
|
||||||
|
Adding a video from [Vimeo][] is equivalent to the YouTube shortcode above.
|
||||||
|
|
||||||
|
```
|
||||||
|
https://vimeo.com/channels/staffpicks/146022717
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example `vimeo` Input
|
||||||
|
|
||||||
|
Extract the ID from the video's URL and pass it to the `vimeo` shortcode:
|
||||||
|
|
||||||
|
{{< code file="example-vimeo-input.md" >}}
|
||||||
|
{{</* vimeo 146022717 */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `vimeo` Output
|
||||||
|
|
||||||
|
Using the preceding `vimeo` example, the following HTML will be added to your rendered website's markup:
|
||||||
|
|
||||||
|
{{< output file="example-vimeo-output.html" >}}
|
||||||
|
{{< vimeo 146022717 >}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
{{% tip %}}
|
||||||
|
If you want to further customize the visual styling of the YouTube or Vimeo output, add a `class` named parameter when calling the shortcode. The new `class` will be added to the `<div>` that wraps the `<iframe>` *and* will remove the inline styles. Note that you will need to call the `id` as a named parameter as well.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{</* vimeo id="146022717" class="my-vimeo-wrapper-class" */>}}
|
||||||
|
```
|
||||||
|
{{% /tip %}}
|
||||||
|
|
||||||
|
#### Example `vimeo` Display
|
||||||
|
|
||||||
|
Using the preceding `vimeo` example, the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
|
||||||
|
|
||||||
|
{{< vimeo 146022717 >}}
|
||||||
|
|
||||||
|
### `youtube`
|
||||||
|
|
||||||
|
The `youtube` shortcode embeds a responsive video player for [YouTube videos][]. Only the ID of the video is required, e.g.:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://www.youtube.com/watch?v=w7Ft2ymGmfc
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### Example `youtube` Input
|
||||||
|
|
||||||
|
Copy the YouTube video ID that follows `v=` in the video's URL and pass it to the `youtube` shortcode:
|
||||||
|
|
||||||
|
{{< code file="example-youtube-input.md" >}}
|
||||||
|
{{</* youtube w7Ft2ymGmfc */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Furthermore, you can automatically start playback of the embedded video by setting the `autoplay` parameter to `true`. Remember that you can't mix named an unnamed parameters, so you'll need to assign the yet unnamed video id to the parameter `id`:
|
||||||
|
|
||||||
|
|
||||||
|
{{< code file="example-youtube-input-with-autoplay.md" >}}
|
||||||
|
{{</* youtube id="w7Ft2ymGmfc" autoplay="true" */>}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `youtube` Output
|
||||||
|
|
||||||
|
Using the preceding `youtube` example, the following HTML will be added to your rendered website's markup:
|
||||||
|
|
||||||
|
{{< code file="example-youtube-output.html" >}}
|
||||||
|
{{< youtube id="w7Ft2ymGmfc" autoplay="true" >}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `youtube` Display
|
||||||
|
|
||||||
|
Using the preceding `youtube` example (without `autoplay="true"`), the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup. The video is also include in the [Quick Start of the Hugo documentation][quickstart].
|
||||||
|
|
||||||
|
{{< youtube w7Ft2ymGmfc >}}
|
||||||
|
|
||||||
|
## Create Custom Shortcodes
|
||||||
|
|
||||||
|
To learn more about creating custom shortcodes, see the [shortcode template documentation][].
|
||||||
|
|
||||||
|
[`figure` shortcode]: #figure
|
||||||
|
[contentmanagementsection]: /content-management/formats/
|
||||||
|
[examplegist]: https://gist.github.com/spf13/7896402
|
||||||
|
[figureelement]: http://html5doctor.com/the-figure-figcaption-elements/ "An article from HTML5 doctor discussing the fig and figcaption elements."
|
||||||
|
[Instagram]: https://www.instagram.com/
|
||||||
|
[pagevariables]: /variables/page/
|
||||||
|
[partials]: /templates/partials/
|
||||||
|
[Pygments]: http://pygments.org/
|
||||||
|
[quickstart]: /getting-started/quick-start/
|
||||||
|
[sctemps]: /templates/shortcode-templates/
|
||||||
|
[scvars]: /variables/shortcodes/
|
||||||
|
[shortcode template documentation]: /templates/shortcode-templates/
|
||||||
|
[Speaker Deck]: https://speakerdeck.com/
|
||||||
|
[templatessection]: /templates/
|
||||||
|
[Vimeo]: https://vimeo.com/
|
||||||
|
[YouTube Videos]: https://www.youtube.com/
|
81
content/content-management/summaries.md
Normal file
81
content/content-management/summaries.md
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
---
|
||||||
|
title: Content Summaries
|
||||||
|
linktitle: Summaries
|
||||||
|
description: Hugo generates summaries of your content.
|
||||||
|
date: 2017-01-10
|
||||||
|
publishdate: 2017-01-10
|
||||||
|
lastmod: 2017-01-10
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [summaries,abstracts,read more]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 90
|
||||||
|
weight: 90 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/summaries/,/content-management/content-summaries/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
With the use of the `.Summary` [page variable][pagevariables], Hugo generates summaries of content to use as a short version in summary views.
|
||||||
|
|
||||||
|
## Summary Splitting Options
|
||||||
|
|
||||||
|
* Hugo-defined Summary Split
|
||||||
|
* User-defined Summary Split
|
||||||
|
|
||||||
|
It is natural to accompany the summary with links to the original content, and a common design pattern is to see this link in the form of a "Read More ..." button. See the `.RelPermalink`, `.Permalink`, and `.Truncated` [page variables][pagevariables].
|
||||||
|
|
||||||
|
### Hugo-defined: Automatic Summary Splitting
|
||||||
|
|
||||||
|
By default, Hugo automatically takes the first 70 words of your content as its summary and stores it into the `.Summary` page variable for use in your templates. Taking the Hugo-defined approach to summaries may save time, but it has pros and cons:
|
||||||
|
|
||||||
|
* **Pros:** Automatic, no additional work on your part.
|
||||||
|
* **Cons:** All HTML tags are stripped from the summary, and the first 70 words, whether they belong to a heading or to different paragraphs, are all put into one paragraph.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
The Hugo-defined summaries are set to use word count calculated by splitting the text by one or more consecutive white space characters. If you are creating content in a `CJK` language and want to use Hugo's automatic summary splitting, set `hasCJKLanguage` to `true` in you [site configuration](/getting-started/configuration/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### User-defined: Manual Summary Splitting
|
||||||
|
|
||||||
|
Alternatively, you may add the <code><!--more--></code> summary divider where you want to split the article. For [org content][org], use `# more` where you want to split the article. Content that comes before the summary divider will be used as that content's summary and stored in the `.Summary` page variable with all HTML formatting intact.
|
||||||
|
|
||||||
|
{{% note "Summary Divider"%}}
|
||||||
|
The concept of a *summary divider* is not unique to Hugo. It is also called the "more tag" or "excerpt separator" in other literature.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
* Pros: Freedom, precision, and improved rendering. All HTML tags and formatting are preserved.
|
||||||
|
* Cons: Extra work for content authors, since they need to remember to type <code><!--more--></code> (or `# more` for [org content][org]) in each content file. This can be automated by adding the summary divider below the front matter of an [archetype](/content-management/archetypes/).
|
||||||
|
|
||||||
|
{{% warning "Be Precise with the Summary Divider" %}}
|
||||||
|
Be careful to enter <code><!--more--></code> exactly; i.e., all lowercase and with no whitespace.
|
||||||
|
{{% /warning %}}
|
||||||
|
|
||||||
|
## Example: First 10 Articles with Summaries
|
||||||
|
|
||||||
|
You can show content summaries with the following code. You could use the following snippet, for example, in a [section template][].
|
||||||
|
|
||||||
|
{{< code file="page-list-with-summaries.html" >}}
|
||||||
|
{{ range first 10 .Data.Pages }}
|
||||||
|
<article>
|
||||||
|
<!-- this <div> includes the title summary -->
|
||||||
|
<div>
|
||||||
|
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
|
||||||
|
{{ .Summary }}
|
||||||
|
</div>
|
||||||
|
{{ if .Truncated }}
|
||||||
|
<!-- This <div> includes a read more link, but only if the summary is truncated... -->
|
||||||
|
<div>
|
||||||
|
<a href="{{ .RelPermalink }}">Read More…</a>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</article>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Note how the `.Truncated` boolean valuable may be used to hide the "Read More..." link when the content is not truncated; i.e., when the summary contains the entire article.
|
||||||
|
|
||||||
|
[org]: /content-management/formats/
|
||||||
|
[pagevariables]: /variables/page/
|
||||||
|
[section template]: /templates/section-templates/
|
253
content/content-management/taxonomies.md
Normal file
253
content/content-management/taxonomies.md
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
---
|
||||||
|
title: Taxonomies
|
||||||
|
linktitle:
|
||||||
|
description: Hugo includes support for user-defined taxonomies to help you demonstrate logical relationships between content for the end users of your website.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
#tags: [taxonomies,metadata,front matter,terms]
|
||||||
|
categories: [content management]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 80
|
||||||
|
weight: 80 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/taxonomies/overview/,/taxonomies/usage/,/indexes/overview/,/doc/indexes/,/extras/indexes]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
## What is a Taxonomy?
|
||||||
|
|
||||||
|
Hugo includes support for user-defined groupings of content called **taxonomies**. Taxonomies are classifications of logical relationships between content.
|
||||||
|
|
||||||
|
### Definitions
|
||||||
|
|
||||||
|
Taxonomy
|
||||||
|
: a categorization that can be used to classify content
|
||||||
|
|
||||||
|
Term
|
||||||
|
: a key within the taxonomy
|
||||||
|
|
||||||
|
Value
|
||||||
|
: a piece of content assigned to a term
|
||||||
|
|
||||||
|
{{< youtube "-np9GX6cL38" >}}
|
||||||
|
|
||||||
|
## Example Taxonomy: Movie Website
|
||||||
|
|
||||||
|
Let's assume you are making a website about movies. You may want to include the following taxonomies:
|
||||||
|
|
||||||
|
* Actors
|
||||||
|
* Directors
|
||||||
|
* Studios
|
||||||
|
* Genre
|
||||||
|
* Year
|
||||||
|
* Awards
|
||||||
|
|
||||||
|
Then, in each of the movies, you would specify terms for each of these taxonomies (i.e., in the [front matter][] of each of your movie content files). From these terms, Hugo would automatically create pages for each Actor, Director, Studio, Genre, Year, and Award, with each listing all of the Movies that matched that specific Actor, Director, Studio, Genre, Year, and Award.
|
||||||
|
|
||||||
|
### Movie Taxonomy Organization
|
||||||
|
|
||||||
|
To continue with the example of a movie site, the following demonstrates content relationships from the perspective of the taxonomy:
|
||||||
|
|
||||||
|
```
|
||||||
|
Actor <- Taxonomy
|
||||||
|
Bruce Willis <- Term
|
||||||
|
The Sixth Sense <- Content
|
||||||
|
Unbreakable <- Content
|
||||||
|
Moonrise Kingdom <- Content
|
||||||
|
Samuel L. Jackson <- Term
|
||||||
|
Unbreakable <- Content
|
||||||
|
The Avengers <- Content
|
||||||
|
xXx <- Content
|
||||||
|
```
|
||||||
|
|
||||||
|
From the perspective of the content, the relationships would appear differently, although the data and labels used are the same:
|
||||||
|
|
||||||
|
```
|
||||||
|
Unbreakable <- Content
|
||||||
|
Actors <- Taxonomy
|
||||||
|
Bruce Willis <- Term
|
||||||
|
Samuel L. Jackson <- Term
|
||||||
|
Director <- Taxonomy
|
||||||
|
M. Night Shyamalan <- Term
|
||||||
|
...
|
||||||
|
Moonrise Kingdom <- Content
|
||||||
|
Actors <- Taxonomy
|
||||||
|
Bruce Willis <- Term
|
||||||
|
Bill Murray <- Term
|
||||||
|
Director <- Taxonomy
|
||||||
|
Wes Anderson <- Term
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hugo Taxonomy Defaults
|
||||||
|
|
||||||
|
Hugo natively supports taxonomies.
|
||||||
|
|
||||||
|
Without adding a single line to your site's configuration file, Hugo will automatically create taxonomies for `tags` and `categories`. If you do not want Hugo to create any taxonomies, set `disableKinds` in your site's configuration to the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
disableKinds = ["taxonomy","taxonomyTerm"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Default Destinations
|
||||||
|
|
||||||
|
When taxonomies are used---and [taxonomy templates][] are provided---Hugo will automatically create both a page listing all the taxonomy's terms and individual pages with lists of content associated with each term. For example, a `categories` taxonomy declared in your configuration and used in your content front matter will create the following pages:
|
||||||
|
|
||||||
|
* A single page at `example.com/categories/` that lists all the [terms within the taxonomy][]
|
||||||
|
* [Individual taxonomy list pages][taxonomy templates] (e.g., `/categories/development/`) for each of the terms that shows a listing of all pages marked as part of that taxonomy within any content file's [front matter][]
|
||||||
|
|
||||||
|
## Configure Taxonomies
|
||||||
|
|
||||||
|
Taxonomies must be defined in your [website configuration][config] before they can be used throughout the site. You need to provide both the plural and singular labels for each taxonomy. For example, `singular key = "plural value"` for TOML and `singular key: "plural value"` for YAML.
|
||||||
|
|
||||||
|
### Example: TOML Taxonomy Configuration
|
||||||
|
|
||||||
|
```
|
||||||
|
[taxonomies]
|
||||||
|
tag = "tags"
|
||||||
|
category = "categories"
|
||||||
|
series = "series"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: YAML Taxonomy Configuration
|
||||||
|
|
||||||
|
```
|
||||||
|
taxonomies:
|
||||||
|
tag: "tags"
|
||||||
|
category: "categories"
|
||||||
|
series: "series"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Preserve Taxonomy Values
|
||||||
|
|
||||||
|
By default, taxonomy names are normalized.
|
||||||
|
|
||||||
|
Therefore, if you want to have a taxonomy term with special characters such as `Gérard Depardieu` instead of `Gerard Depardieu`, set the value for `preserveTaxonomyNames` to `true` in your [site configuration][config]. Hugo will then preserve special characters in taxonomy values but will still title-ize the values for titles and normalize them in URLs.
|
||||||
|
|
||||||
|
Note that if you use `preserveTaxonomyNames` and intend to manually construct URLs to the archive pages, you will need to pass the taxonomy values through the [`urlize` template function][].
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
You can add content and front matter to your taxonomy list and taxonomy terms pages. See [Content Organization](/content-management/organization/) for more information on how to add an `_index.md` for this purpose.
|
||||||
|
|
||||||
|
Note also that taxonomy [permalinks](/content-management/urls/) are *not* configurable.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Add Taxonomies to Content
|
||||||
|
|
||||||
|
Once a taxonomy is defined at the site level, any piece of content can be assigned to it, regardless of [content type][] or [content section][].
|
||||||
|
|
||||||
|
Assigning content to a taxonomy is done in the [front matter][]. Simply create a variable with the *plural* name of the taxonomy and assign all terms you want to apply to the instance of the content type.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
If you would like the ability to quickly generate content files with preconfigured taxonomies or terms, read the docs on [Hugo archetypes](/content-management/archetypes/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### Example: TOML Front Matter with Taxonomies
|
||||||
|
|
||||||
|
```
|
||||||
|
+++
|
||||||
|
title = "Hugo: A fast and flexible static site generator"
|
||||||
|
tags = [ "Development", "Go", "fast", "Blogging" ]
|
||||||
|
categories = [ "Development" ]
|
||||||
|
series = [ "Go Web Dev" ]
|
||||||
|
slug = "hugo"
|
||||||
|
project_url = "https://github.com/gohugoio/hugo"
|
||||||
|
+++
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: YAML Front Matter with Taxonomies
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
title: "Hugo: A fast and flexible static site generator"
|
||||||
|
tags: ["Development", "Go", "fast", "Blogging"]
|
||||||
|
categories: ["Development"]
|
||||||
|
series: ["Go Web Dev"]
|
||||||
|
slug: "hugo"
|
||||||
|
project_url: "https://github.com/gohugoio/hugo"
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: JSON Front Matter with Taxonomies
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"title": "Hugo: A fast and flexible static site generator",
|
||||||
|
"tags": [
|
||||||
|
"Development",
|
||||||
|
"Go",
|
||||||
|
"fast",
|
||||||
|
"Blogging"
|
||||||
|
],
|
||||||
|
"categories" : [
|
||||||
|
"Development"
|
||||||
|
],
|
||||||
|
"series" : [
|
||||||
|
"Go Web Dev"
|
||||||
|
],
|
||||||
|
"slug": "hugo",
|
||||||
|
"project_url": "https://github.com/gohugoio/hugo"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Order Taxonomies
|
||||||
|
|
||||||
|
A content file can assign weight for each of its associate taxonomies. Taxonomic weight can be used for sorting or ordering content in [taxonomy list templates][] and is declared in a content file's [front matter][]. The convention for declaring taxonomic weight is `taxonomyname_weight`.
|
||||||
|
|
||||||
|
The following TOML and YAML examples show a piece of content that has a weight of 22, which can be used for ordering purposes when rendering the pages assigned to the "a", "b" and "c" values of the `tags` taxonomy. It has also been assigned the weight of 44 when rendering the "d" category page.
|
||||||
|
|
||||||
|
### Example: TOML Taxonomic `weight`
|
||||||
|
|
||||||
|
```
|
||||||
|
+++
|
||||||
|
title = "foo"
|
||||||
|
tags = [ "a", "b", "c" ]
|
||||||
|
tags_weight = 22
|
||||||
|
categories = ["d"]
|
||||||
|
categories_weight = 44
|
||||||
|
+++
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: YAML Taxonomic `weight`
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
title: foo
|
||||||
|
tags: [ "a", "b", "c" ]
|
||||||
|
tags_weight: 22
|
||||||
|
categories: ["d"]
|
||||||
|
categories_weight: 44
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
By using taxonomic weight, the same piece of content can appear in different positions in different taxonomies.
|
||||||
|
|
||||||
|
{{% note "Limits to Ordering Taxonomies" %}}
|
||||||
|
Currently taxonomies only support the [default `weight => date` ordering of list content](/templates/lists/#default-weight-date). For more information, see the documentation on [taxonomy templates](/templates/taxonomy-templates/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Add custom metadata to a Taxonomy Term
|
||||||
|
|
||||||
|
If you need to add custom metadata to your taxonomy terms, you will need to create a page for that term at `/content/<TAXONOMY>/<TERM>/_index.md` and add your metadata in it's front matter. Continuing with our 'Actors' example, let's say you want to add a wikipedia page link to each actor. Your terms pages would be something like this:
|
||||||
|
|
||||||
|
{{< code file="/content/actors/bruce-willis/_index.md" >}}
|
||||||
|
---
|
||||||
|
title: "Bruce Willis"
|
||||||
|
wikipedia: "https://en.wikipedia.org/wiki/Bruce_Willis"
|
||||||
|
---
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
You can later use your custom metadata as shown in the [Taxonomy Terms Templates documentation](/templates/taxonomy-templates/#displaying-custom-meta-data-in-taxonomy-terms-templates).
|
||||||
|
|
||||||
|
[`urlize` template function]: /functions/urlize/
|
||||||
|
[content section]: /content-management/sections/
|
||||||
|
[content type]: /content-management/types/
|
||||||
|
[documentation on archetypes]: /content-management/archetypes/
|
||||||
|
[front matter]: /content-management/front-matter/
|
||||||
|
[taxonomy list templates]: /templates/taxonomy-templates/#taxonomy-page-templates
|
||||||
|
[taxonomy templates]: /templates/taxonomy-templates/
|
||||||
|
[terms within the taxonomy]: /templates/taxonomy-templates/#taxonomy-terms-templates "See how to order terms associated with a taxonomy"
|
||||||
|
[config]: /getting-started/configuration/
|
91
content/content-management/toc.md
Normal file
91
content/content-management/toc.md
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
---
|
||||||
|
title: Table of Contents
|
||||||
|
linktitle:
|
||||||
|
description: Hugo can automatically parse Markdown content and create a Table of Contents you can use in your templates.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [table of contents, toc]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 130
|
||||||
|
weight: 130 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/extras/toc/,/content-management/toc/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
{{% note "TOC Heading Levels are Fixed" %}}
|
||||||
|
Currently, the `{{.TableOfContents}}` [page variable](/variables/page/) does not allow you to specify which heading levels you want the TOC to render. [See the related GitHub discussion (#1778)](https://github.com/gohugoio/hugo/issues/1778). As such, the resulting `<nav id="TableOfContents"><ul></ul></nav>` is going to start at `<h1>` when pulling from `{{.Content}}`.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Create your markdown the way you normally would with the appropriate headings. Here is some example content:
|
||||||
|
|
||||||
|
```
|
||||||
|
<!-- Your front matter up here -->
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin.
|
||||||
|
|
||||||
|
## My Heading
|
||||||
|
|
||||||
|
He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into stiff sections. The bedding was hardly able to cover it and seemed ready to slide off any moment.
|
||||||
|
|
||||||
|
### My Subheading
|
||||||
|
|
||||||
|
A collection of textile samples lay spread out on the table - Samsa was a travelling salesman - and above it there hung a picture that he had recently cut out of an illustrated magazine and housed in a nice, gilded frame. It showed a lady fitted out with a fur hat and fur boa who sat upright, raising a heavy fur muff that covered the whole of her lower arm towards the viewer. Gregor then turned to look out the window at the dull weather. Drops
|
||||||
|
```
|
||||||
|
|
||||||
|
Hugo will take this Markdown and create a table of contents from `## Introduction`, `## My Heading`, and `### My Subheading` and then store it in the [page variable][pagevars]`.TableOfContents`.
|
||||||
|
|
||||||
|
The built-in `.TableOfContents` variables outputs a `<nav id="TableOfContents">` element with a child `<ul>`, whose child `<li>` elements begin with any `<h1>`'s (i.e., `#` in markdown) inside your content.'
|
||||||
|
|
||||||
|
## Template Example: Basic TOC
|
||||||
|
|
||||||
|
The following is an example of a very basic [single page template][]:
|
||||||
|
|
||||||
|
{{< code file="layout/_default/single.html" download="single.html" >}}
|
||||||
|
{{ define "main" }}
|
||||||
|
<main>
|
||||||
|
<article>
|
||||||
|
<header>
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
</header>
|
||||||
|
{{ .Content }}
|
||||||
|
</article>
|
||||||
|
<aside>
|
||||||
|
{{ .TableOfContents }}
|
||||||
|
</aside>
|
||||||
|
</main>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
## Template Example: TOC Partial
|
||||||
|
|
||||||
|
The following is a [partial template][partials] that adds slightly more logic for page-level control over your table of contents. It assumes you are using a `toc` field in your content's [front matter][] that, unless specifically set to `false`, will add a TOC to any page with a `.WordCount` (see [Page Variables][pagevars]) greater than 400. This example also demonstrates how to use [conditionals][] in your templating:
|
||||||
|
|
||||||
|
{{< code file="layouts/partials/toc.html" download="toc.html" >}}
|
||||||
|
{{ if and (gt .WordCount 400 ) (ne .Params.toc "false") }}
|
||||||
|
<aside>
|
||||||
|
<header>
|
||||||
|
<h2>{{.Title}}</h2>
|
||||||
|
</header>
|
||||||
|
{{.TableOfContents}}
|
||||||
|
</aside>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
With the preceding example, even pages with > 400 words *and* `toc` not set to `false` will not render a table of contents if there are no headings in the page for the `{{.TableOfContents}}` variable to pull from.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
[conditionals]: /templates/introduction/#conditionals
|
||||||
|
[front matter]: /content-management/table-of-contents/
|
||||||
|
[pagevars]: /variables/page/
|
||||||
|
[partials]: /templates/partials/
|
||||||
|
[single page template]: /templates/single-page-templates/
|
99
content/content-management/types.md
Normal file
99
content/content-management/types.md
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
---
|
||||||
|
title: Content Types
|
||||||
|
linktitle: Types
|
||||||
|
description: Hugo supports sites with multiple content types and assumes your site will be organized into sections, where each section represents the corresponding type.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [content management]
|
||||||
|
#tags: [lists,sections,content types,types,organization]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "content-management"
|
||||||
|
weight: 60
|
||||||
|
weight: 60 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/content/types]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
A **content type** can have a unique set of metadata (i.e., [front matter][]) or customized [template][] and can be created by the `hugo new` command via [archetypes][].
|
||||||
|
|
||||||
|
## What is a Content Type
|
||||||
|
|
||||||
|
[Tumblr][] is a good example of a website with multiple content types. A piece of "content" could be a photo, quote, or a post, each with different sets of metadata and different visual rendering.
|
||||||
|
|
||||||
|
## Assign a Content Type
|
||||||
|
|
||||||
|
Hugo assumes that your site will be organized into [sections][] and each section represents a corresponding type. This is to reduce the amount of configuration necessary for new Hugo projects.
|
||||||
|
|
||||||
|
If you are taking advantage of this default behavior, each new piece of content you place into a section will automatically inherit the type. Therefore a new file created at `content/posts/new-post.md` will automatically be assigned the type `posts`. Alternatively, you can set the content type in a content file's [front matter][] in the field "`type`".
|
||||||
|
|
||||||
|
## Create New Content of a Specific Type
|
||||||
|
|
||||||
|
You can manually add files to your content directories, but Hugo can create and populate a new content file with preconfigured front matter via [archetypes][].
|
||||||
|
|
||||||
|
## Define a Content Type
|
||||||
|
|
||||||
|
Creating a new content type is easy. You simply define the templates and archetype unique to your new content type, or Hugo will use defaults.
|
||||||
|
|
||||||
|
|
||||||
|
{{% note "Declaring Content Types" %}}
|
||||||
|
Remember, all of the following are *optional*. If you do not specifically declare content types in your front matter or develop specific layouts for content types, Hugo is smart enough to assume the content type from the file path and section. (See [Content Sections](/content-management/sections/) for more information.)
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
The following examples take you stepwise through creating a new type layout for a content file that contains the following front matter:
|
||||||
|
|
||||||
|
{{< code file="content/events/my-first-event.md" copy="false" >}}
|
||||||
|
+++
|
||||||
|
title = My First Event
|
||||||
|
date = "2016-06-24T19:20:04-07:00"
|
||||||
|
description = "Today is my 36th birthday. How time flies."
|
||||||
|
type = "event"
|
||||||
|
layout = "birthday"
|
||||||
|
+++
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
By default, Hugo assumes `*.md` under `events` is of the `events` content type. However, we have specified that this particular file at `content/events/ my-first-event.md` is of type `event` and should render using the `birthday` layout.
|
||||||
|
|
||||||
|
### Create a Type Layout Directory
|
||||||
|
|
||||||
|
Create a directory with the name of the type in `/layouts`. For creating these custom layouts, **type is always singular**; e.g., `events => event` and `posts => post`.
|
||||||
|
|
||||||
|
For this example, you need to create `layouts/event/birthday.html`.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
If you have multiple content files in your `events` directory that are of the `special` type and you don't want to define the `layout` specifically for each piece of content, you can create a layout at `layouts/special/single.html` to observe the [single page template lookup order](/templates/single-page-templates/).
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
{{% warning %}}
|
||||||
|
With the "everything is a page" data model introduced in v0.18 (see [Content Organization](/content-management/organization/)), you can use `_index.md` in content directories to add both content and front matter to [list pages](/templates/lists/). However, `type` and `layout` declared in the front matter of `_index.md` are *not* currently respected at build time as of v0.19. This is a known issue [(#3005)](https://github.com/gohugoio/hugo/issues/3005).
|
||||||
|
{{% /warning %}}
|
||||||
|
|
||||||
|
### Create Views
|
||||||
|
|
||||||
|
Many sites support rendering content in a few different ways; e.g., a single page view and a summary view to be used when displaying a [list of section contents][sectiontemplates].
|
||||||
|
|
||||||
|
Hugo limits assumptions about how you want to display your content to an intuitive set of sane defaults and will support as many different views of a content type as your site requires. All that is required for these additional views is that a template exists in each `/layouts/<TYPE>` directory with the same name.
|
||||||
|
|
||||||
|
### Custom Content Type Template Lookup Order
|
||||||
|
|
||||||
|
The lookup order for the `content/events/my-first-event.md` templates would be as follows:
|
||||||
|
|
||||||
|
* `layouts/event/birthday.html`
|
||||||
|
* `layouts/event/single.html`
|
||||||
|
* `layouts/events/single.html`
|
||||||
|
* `layouts/_default/single.html`
|
||||||
|
|
||||||
|
### Create a Corresponding Archetype
|
||||||
|
|
||||||
|
We can then create a custom archetype with preconfigured front matter at `event.md` in the `/archetypes` directory; i.e. `archetypes/event.md`.
|
||||||
|
|
||||||
|
Read [Archetypes][archetypes] for more information on archetype usage with `hugo new`.
|
||||||
|
|
||||||
|
[archetypes]: /content-management/archetypes/
|
||||||
|
[front matter]: /content-management/front-matter/
|
||||||
|
[sectiontemplates]: /templates/section-templates/
|
||||||
|
[sections]: /content-management/sections/
|
||||||
|
[template]: /templates/
|
||||||
|
[Tumblr]: https://www.tumblr.com/
|
277
content/content-management/urls.md
Normal file
277
content/content-management/urls.md
Normal file
|
@ -0,0 +1,277 @@
|
||||||
|
---
|
||||||
|
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
|
||||||
|
#tags: [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., `publish` 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 `post` 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.
|
||||||
|
|
||||||
|
### YAML Permalinks Configuration Example
|
||||||
|
|
||||||
|
{{< code file="config.yml" copy="false" >}}
|
||||||
|
permalinks:
|
||||||
|
post: /:year/:month/:title/
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
### TOML Permalinks Configuration Example
|
||||||
|
|
||||||
|
{{< code file="config.toml" copy="false" >}}
|
||||||
|
[permalinks]
|
||||||
|
post = "/:year/:month/:title/"
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Only the content under `post/` will have the new URL structure. For example, the file `content/post/sample-entry.md` with `date: 2017-02-27T19:20:00-05:00` in its front matter will render to `public/2017/02/sample-entry/index.html` at build time and therefore be reachable at `https://example.com/2013/11/sample-entry/`.
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
||||||
|
`: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)
|
||||||
|
|
||||||
|
## Aliases
|
||||||
|
|
||||||
|
For people migrating existing published content to Hugo, there's a good chance you need a mechanism to handle redirecting old URLs.
|
||||||
|
|
||||||
|
Luckily, redirects can be handled easily with **aliases** in Hugo.
|
||||||
|
|
||||||
|
### 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 filed 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-blog-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/
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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 they 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/index.html
|
||||||
|
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 use the `--uglyURLs=true` [flag from the command line][usage] with `hugo` or `hugo server`..
|
||||||
|
|
||||||
|
If you want a specific piece of content to have an exact URL, you can specify this in the [front matter][] under the `url` key. The following are examples of the same content directory and what the eventual URL structure will be when Hugo runs with its default behavior.
|
||||||
|
|
||||||
|
See [Content Organization][contentorg] for more details on paths.
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
└── content
|
||||||
|
└── about
|
||||||
|
| └── _index.md // <- https://example.com/about/
|
||||||
|
├── post
|
||||||
|
| ├── firstpost.md // <- https://example.com/post/firstpost/
|
||||||
|
| ├── happy
|
||||||
|
| | └── ness.md // <- https://example.com/post/happy/ness/
|
||||||
|
| └── secondpost.md // <- https://example.com/post/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/index.html
|
||||||
|
├── post
|
||||||
|
| ├── firstpost.md // <- https://example.com/post/firstpost.html
|
||||||
|
| ├── happy
|
||||||
|
| | └── ness.md // <- https://example.com/post/happy/ness.html
|
||||||
|
| └── secondpost.md // <- https://example.com/post/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
|
||||||
|
```
|
||||||
|
|
||||||
|
## Override URLS with 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].
|
||||||
|
|
||||||
|
## 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 `/post/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/
|
23
content/contribute/_index.md
Normal file
23
content/contribute/_index.md
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
title: Contribute to the Hugo Project
|
||||||
|
linktitle: Contribute to Hugo
|
||||||
|
description: Contribute to Hugo development and documentation.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [contribute]
|
||||||
|
#tags: []
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "contribute"
|
||||||
|
weight: 01
|
||||||
|
weight: 01 #rem
|
||||||
|
draft: false
|
||||||
|
slug:
|
||||||
|
aliases: [/tutorials/how-to-contribute-to-hugo/,/community/contributing/]
|
||||||
|
toc: false
|
||||||
|
---
|
||||||
|
|
||||||
|
Hugo relies heavily on the enthusiasm and participation of the open-source community. We need your support in both its development and documentation.
|
||||||
|
|
||||||
|
Hugo's contribution guidelines are [detailed in a `CONTRIBUTING.md`](https://github.com/gohugoio/hugo/blob/master/CONTRIBUTING.md) in the Hugo source repository on GitHub.
|
416
content/contribute/development.md
Normal file
416
content/contribute/development.md
Normal file
|
@ -0,0 +1,416 @@
|
||||||
|
---
|
||||||
|
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]
|
||||||
|
#tags: [dev,open source]
|
||||||
|
authors: [digitalcraftsman]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "contribute"
|
||||||
|
weight: 10
|
||||||
|
weight: 10
|
||||||
|
sections_weight: 10
|
||||||
|
draft: false
|
||||||
|
aliases: [/contribute/development/]
|
||||||
|
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 [Golang 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.8 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; .e.g.:
|
||||||
|
|
||||||
|
```
|
||||||
|
/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. The used terminology will be explained with annotations.
|
||||||
|
|
||||||
|
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 lastest 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. Thus, so we will use the command line since the commands are everywhere the same.
|
||||||
|
|
||||||
|
### 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](http://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.6.3
|
||||||
|
hub version 2.2.2
|
||||||
|
```
|
||||||
|
|
||||||
|
## Set up your working copy
|
||||||
|
|
||||||
|
The working copy is set up locally on your computer. It's 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 clone that master repository:
|
||||||
|
|
||||||
|
```
|
||||||
|
go get -v -u github.com/gohugoio/hugo
|
||||||
|
```
|
||||||
|
|
||||||
|
Hugo relies on [Testify](https://github.com/stretchr/testify) for testing Go code. If you don't already have it, get the Testify testing tools:
|
||||||
|
|
||||||
|
```
|
||||||
|
go get github.com/stretchr/testify
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fork the repository
|
||||||
|
|
||||||
|
If you're not fimiliar with this term, GitHub's [help pages](https://help.github.com/articles/fork-a-repo/) provide again a simple explanation:
|
||||||
|
|
||||||
|
> A 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 $GOPATH/src/github.com/gohugoio/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 your 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:
|
||||||
|
|
||||||
|
```
|
||||||
|
go build -o hugo main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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 `go test ./...` passes, and `go build` completes.
|
||||||
|
|
||||||
|
### Formatting
|
||||||
|
The Go code styleguide maybe is opiniated 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 addtions:
|
||||||
|
|
||||||
|
```
|
||||||
|
go 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 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 to 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 speficy 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 labeld 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 the [Travis CI loop](https://travis-ci.org/gohugoio/hugo) (Linux and OS X) and [AppVeyor](https://ci.appveyor.com/project/gohugoio/hugo/branch/master) (Windows) to compile Hugo with your additions. This should ensure that everything works as expected before merging your pull request. This in most cases only relevant if you made changes to the codebase of Hugo.
|
||||||
|
|
||||||
|
![Automic builds and their status](/images/contribute/development/ci-errors.png)
|
||||||
|
|
||||||
|
Above you can see that Travis wasn't able to compile the changes in this pull request. Click on "Details" and try to investigate why the build failed. But it doesn't have to be your fault. Mostly, the `master` branch that we used as foundation for your pull request should build without problems.
|
||||||
|
|
||||||
|
If you have questions, leave a comment in the pull request. We are willing to assist you.
|
||||||
|
|
||||||
|
## 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 Golang
|
||||||
|
|
||||||
|
* [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]: http://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
|
338
content/contribute/documentation.md
Normal file
338
content/contribute/documentation.md
Normal file
|
@ -0,0 +1,338 @@
|
||||||
|
---
|
||||||
|
title: Contribute to the Hugo Docs
|
||||||
|
linktitle: Documentation
|
||||||
|
description: Documentation is an integral part of any open source project. The Hugo docs are as much a work in progress as the source it attempts to cover.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [contribute]
|
||||||
|
#tags: [docs,documentation,community, contribute]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "contribute"
|
||||||
|
weight: 20
|
||||||
|
weight: 20
|
||||||
|
sections_weight: 20
|
||||||
|
draft: false
|
||||||
|
aliases: [/contribute/docs/]
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
## Create Your Fork
|
||||||
|
|
||||||
|
It's best to make changes to the Hugo docs on your local machine to check for consistent visual styling. Make sure you've created a fork of [hugoDocs](https://github.com/gohugoio/hugoDocs) on GitHub and cloned the repository locally on your machine. For more information, you can see [GitHub's documentation on "forking"][ghforking] or follow along with [Hugo's development contribution guide][hugodev].
|
||||||
|
|
||||||
|
You can then create a separate branch for your additions. Be sure to choose a descriptive branch name that best fits the type of content. The following is an example of a branch name you might use for adding a new website to the showcase:
|
||||||
|
|
||||||
|
```
|
||||||
|
git checkout -b jon-doe-showcase-addition
|
||||||
|
```
|
||||||
|
|
||||||
|
## Add New Content
|
||||||
|
|
||||||
|
The Hugo docs make heavy use of Hugo's [archetypes][] feature. All content sections in Hugo documentation have an assigned archetype.
|
||||||
|
|
||||||
|
Adding new content to the Hugo docs follows the same pattern, regardless of the content section:
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo new <DOCS-SECTION>/<new-content-lowercase>.md
|
||||||
|
```
|
||||||
|
|
||||||
|
### Add a New Function
|
||||||
|
|
||||||
|
Once you have cloned the Hugo repository, you can create a new function via the following command. Keep the file name lowercase.
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo new functions/newfunction.md
|
||||||
|
```
|
||||||
|
|
||||||
|
The archetype for `functions` according to the Hugo theme is as follows:
|
||||||
|
|
||||||
|
{{< code file="archetypes/functions.md" >}}
|
||||||
|
{{< readfile file="/themes/gohugoioTheme/archetypes/functions.md">}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### New Function Required Fields
|
||||||
|
|
||||||
|
Here is a review of the front matter fields automatically generated for you using `hugo new functions/*`:
|
||||||
|
|
||||||
|
***`title`***
|
||||||
|
: this will be auto-populated in all lowercase when you use `hugo new` generator.
|
||||||
|
|
||||||
|
***`linktitle`***
|
||||||
|
: the function's actual casing (e.g., `replaceRE` rather than `replacere`).
|
||||||
|
|
||||||
|
***`description`***
|
||||||
|
: a brief description used to populate the [Functions Quick Reference](/functions/).
|
||||||
|
|
||||||
|
`categories`
|
||||||
|
: currently auto-populated with 'functions` for future-proofing and portability reasons only; ignore this field.
|
||||||
|
|
||||||
|
`tags`
|
||||||
|
: only if you think it will help end users find other related functions
|
||||||
|
|
||||||
|
`signature`
|
||||||
|
: this is a signature/syntax definition for calling the function (e.g., `apply SEQUENCE FUNCTION [PARAM...]`).
|
||||||
|
|
||||||
|
`workson`
|
||||||
|
: acceptable values include `lists`,`taxonomies`, `terms`, `groups`, and `files`.
|
||||||
|
|
||||||
|
`hugoversion`
|
||||||
|
: the version of Hugo that will ship with this new function.
|
||||||
|
|
||||||
|
`relatedfuncs`
|
||||||
|
: other [templating functions][] you feel are related to your new function to help fellow Hugo users.
|
||||||
|
|
||||||
|
`{{.Content}}`
|
||||||
|
: an extended description of the new function; examples are not only welcomed but encouraged.
|
||||||
|
|
||||||
|
In the body of your function, expand the short description used in the front matter. Include as many examples as possible, and leverage the Hugo docs [`code` shortcode](#adding-code-blocks). If you are unable to add examples but would like to solicit help from the Hugo community, add `needsexample: true` to your front matter.
|
||||||
|
|
||||||
|
## Add Code Blocks
|
||||||
|
|
||||||
|
Code blocks are crucial for providing examples of Hugo's new features to end users of the Hugo docs. Whenever possible, create examples that you think Hugo users will be able to implement in their own projects.
|
||||||
|
|
||||||
|
### Standard Syntax
|
||||||
|
|
||||||
|
Across all pages on the Hugo docs, the typical triple-back-tick markdown syntax is used. If you do not want to take the extra time to implement the following code block shortcodes, please use standard GitHub-flavored markdown. The Hugo docs use a version of [highlight.js](https://highlightjs.org/) with a specific set of languages.
|
||||||
|
|
||||||
|
Your options for languages are `xml`/`html`, `go`/`golang`, `md`/`markdown`/`mkd`, `handlebars`, `apache`, `toml`, `yaml`, `json`, `css`, `asciidoc`, `ruby`, `powershell`/`ps`, `scss`, `sh`/`zsh`/`bash`/`git`, `http`/`https`, and `javascript`/`js`.
|
||||||
|
|
||||||
|
```
|
||||||
|
```
|
||||||
|
<h1>Hello world!</h1>
|
||||||
|
```
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code Block Shortcode
|
||||||
|
|
||||||
|
The Hugo documentation comes with a very robust shortcode for adding interactive code blocks.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
With the `code` shortcodes, *you must include triple back ticks and a language declaration*. This was done by design so that the shortcode wrappers were easily added to legacy documentation and will be that much easier to remove if needed in future versions of the Hugo docs.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### `code`
|
||||||
|
|
||||||
|
`code` is the Hugo docs shortcode you'll use most often. `code` requires has only one named parameter: `file`. Here is the pattern:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{%/* code file="smart/file/name/with/path.html" download="download.html" copy="true" */%}}
|
||||||
|
```
|
||||||
|
A whole bunch of coding going on up in here!
|
||||||
|
```
|
||||||
|
{{%/* /code */%}}
|
||||||
|
```
|
||||||
|
|
||||||
|
The following are the arguments passed into `code`:
|
||||||
|
|
||||||
|
***`file`***
|
||||||
|
: the only *required* argument. `file` is needed for styling but also plays an important role in helping users create a mental model around Hugo's directory structure. Visually, this will be displayed as text in the top left of the code block.
|
||||||
|
|
||||||
|
`download`
|
||||||
|
: if omitted, this will have no effect on the rendered shortcode. When a value is added to `download`, it's used as the filename for a downloadable version of the code block.
|
||||||
|
|
||||||
|
`copy`
|
||||||
|
: a copy button is added automatically to all `code` shortcodes. If you want to keep the filename and styling of `code` but don't want to encourage readers to copy the code (e.g., a "Do not do" snippet in a tutorial), use `copy="false"`.
|
||||||
|
|
||||||
|
#### Example `code` Input
|
||||||
|
|
||||||
|
This example HTML code block tells Hugo users the following:
|
||||||
|
|
||||||
|
1. This file *could* live in `layouts/_default`, as demonstrated by `layouts/_default/single.html` as the value for `file`.
|
||||||
|
2. This snippet is complete enough to be downloaded and implemented in a Hugo project, as demonstrated by `download="single.html"`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{%/* code file="layouts/_default/single.html" download="single.html" */%}}
|
||||||
|
```
|
||||||
|
{{ define "main" }}
|
||||||
|
<main>
|
||||||
|
<article>
|
||||||
|
<header>
|
||||||
|
<h1>{{.Title}}</h1>
|
||||||
|
{{with .Params.subtitle}}
|
||||||
|
<span>{{.}}</span>
|
||||||
|
</header>
|
||||||
|
<div>
|
||||||
|
{{.Content}}
|
||||||
|
</div>
|
||||||
|
<aside>
|
||||||
|
{{.TableOfContents}}
|
||||||
|
</aside>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
{{ end }}
|
||||||
|
```
|
||||||
|
{{%/* /code */%}}
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Example 'code' Display
|
||||||
|
|
||||||
|
The output of this example will render to the Hugo docs as follows:
|
||||||
|
|
||||||
|
{{< code file="layouts/_default/single.html" download="single.html" >}}
|
||||||
|
{{ define "main" }}
|
||||||
|
<main>
|
||||||
|
<article>
|
||||||
|
<header>
|
||||||
|
<h1>{{.Title}}</h1>
|
||||||
|
{{with .Params.subtitle}}
|
||||||
|
<span>{{.}}</span>
|
||||||
|
</header>
|
||||||
|
<div>
|
||||||
|
{{.Content}}
|
||||||
|
</div>
|
||||||
|
<aside>
|
||||||
|
{{.TableOfContents}}
|
||||||
|
</aside>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
<!-- #### Output Code Block
|
||||||
|
|
||||||
|
The `output` shortcode is almost identical to the `code` shortcode but only takes and requires `file`. The purpose of `output` is to show *rendered* HTML and therefore almost always follows another basic code block *or* and instance of the `code` shortcode:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{%/* output file="post/my-first-post/index.html" */%}}
|
||||||
|
```
|
||||||
|
<h1>This is my First Hugo Blog Post</h1>
|
||||||
|
<p>I am excited to be using Hugo.</p>
|
||||||
|
```
|
||||||
|
{{%/* /output */%}}
|
||||||
|
```
|
||||||
|
|
||||||
|
The preceding `output` example will render as follows to the Hugo docs:
|
||||||
|
|
||||||
|
{{< output file="post/my-first-post/index.html" >}}
|
||||||
|
<h1>This is my First Hugo Blog Post</h1>
|
||||||
|
<p>I am excited to be using Hugo.</p>
|
||||||
|
{{< /output >}} -->
|
||||||
|
|
||||||
|
## Blockquotes
|
||||||
|
|
||||||
|
Blockquotes can be added to the Hugo documentation using [typical Markdown blockquote syntax][bqsyntax]:
|
||||||
|
|
||||||
|
```
|
||||||
|
> Without the threat of punishment, there is no joy in flight.
|
||||||
|
```
|
||||||
|
|
||||||
|
The preceding blockquote will render as follows in the Hugo docs:
|
||||||
|
|
||||||
|
> Without the threat of punishment, there is no joy in flight.
|
||||||
|
|
||||||
|
However, you can add a quick and easy `<cite>` element (added on the client via JavaScript) by separating your main blockquote and the citation with a hyphen with a single space on each side:
|
||||||
|
|
||||||
|
```
|
||||||
|
> Without the threat of punishment, there is no joy in flight. - [Kobo Abe](https://en.wikipedia.org/wiki/Kobo_Abe)
|
||||||
|
```
|
||||||
|
|
||||||
|
Which will render as follows in the Hugo docs:
|
||||||
|
|
||||||
|
> Without the threat of punishment, there is no joy in flight. - [Kobo Abe][abe]
|
||||||
|
|
||||||
|
{{% note "Blockquotes `!=` Admonitions" %}}
|
||||||
|
Previous versions of Hugo documentation used blockquotes to draw attention to text. This is *not* the [intended semantic use of `<blockquote>`](http://html5doctor.com/cite-and-blockquote-reloaded/). Use blockquotes when quoting. To note or warn your user of specific information, use the admonition shortcodes that follow.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Admonitions
|
||||||
|
|
||||||
|
**Admonitions** are common in technical documentation. The most popular is that seen in [reStructuredText Directives][sourceforge]. From the SourceForge documentation:
|
||||||
|
|
||||||
|
> Admonitions are specially marked "topics" that can appear anywhere an ordinary body element can. They contain arbitrary body elements. Typically, an admonition is rendered as an offset block in a document, sometimes outlined or shaded, with a title matching the admonition type. - [SourceForge][sourceforge]
|
||||||
|
|
||||||
|
The Hugo docs contain three admonitions: `note`, `tip`, and `warning`.
|
||||||
|
|
||||||
|
### `note` Admonition
|
||||||
|
|
||||||
|
Use the `note` shortcode when you want to draw attention to information subtly. `note` is intended to be less of an interruption in content than is `warning`.
|
||||||
|
|
||||||
|
#### Example `note` Input
|
||||||
|
|
||||||
|
{{< code file="note-with-heading.md" >}}
|
||||||
|
{{%/* note */%}}
|
||||||
|
Here is a piece of information I would like to draw your **attention** to.
|
||||||
|
{{%/* /note */%}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `note` Output
|
||||||
|
|
||||||
|
{{< output file="note-with-heading.html" >}}
|
||||||
|
{{% note %}}
|
||||||
|
Here is a piece of information I would like to draw your **attention** to.
|
||||||
|
{{% /note %}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
#### Example `note` Display
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
Here is a piece of information I would like to draw your **attention** to.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### `tip` Admonition
|
||||||
|
|
||||||
|
Use the `tip` shortcode when you want to give the reader advice. `tip`, like `note`, is intended to be less of an interruption in content than is `warning`.
|
||||||
|
|
||||||
|
#### Example `tip` Input
|
||||||
|
|
||||||
|
{{< code file="using-tip.md" >}}
|
||||||
|
{{%/* tip */%}}
|
||||||
|
Here's a bit of advice to improve your productivity with Hugo.
|
||||||
|
{{%/* /tip */%}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `tip` Output
|
||||||
|
|
||||||
|
{{< output file="tip-output.html" >}}
|
||||||
|
{{% tip %}}
|
||||||
|
Here's a bit of advice to improve your productivity with Hugo.
|
||||||
|
{{% /tip %}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
#### Example `tip` Display
|
||||||
|
|
||||||
|
{{% tip %}}
|
||||||
|
Here's a bit of advice to improve your productivity with Hugo.
|
||||||
|
{{% /tip %}}
|
||||||
|
|
||||||
|
### `warning` Admonition
|
||||||
|
|
||||||
|
Use the `warning` shortcode when you want to draw the user's attention to something important. A good usage example is for articulating breaking changes in Hugo versions, known bugs, or templating "gotchas."
|
||||||
|
|
||||||
|
#### Example `warning` Input
|
||||||
|
|
||||||
|
{{< code file="warning-admonition-input.md" >}}
|
||||||
|
{{%/* warning */%}}
|
||||||
|
This is a warning, which should be reserved for *important* information like breaking changes.
|
||||||
|
{{%/* /warning */%}}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
#### Example `warning` Output
|
||||||
|
|
||||||
|
{{< output file="warning-admonition-output.html" >}}
|
||||||
|
{{% warning %}}
|
||||||
|
This is a warning, which should be reserved for *important* information like breaking changes.
|
||||||
|
{{% /warning %}}
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
#### Example `warning` Display
|
||||||
|
|
||||||
|
{{% warning %}}
|
||||||
|
This is a warning, which should be reserved for *important* information like breaking changes.
|
||||||
|
{{% /warning %}}
|
||||||
|
|
||||||
|
{{% note "Pull Requests and Branches" %}}
|
||||||
|
Similar to [contributing to Hugo development](/contribute/development/), the Hugo team expects you to create a separate branch/fork when you make your contributions to the Hugo docs.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
[abe]: https://en.wikipedia.org/wiki/Kobo_Abe
|
||||||
|
[archetypes]: /content-management/archetypes/
|
||||||
|
[bqsyntax]: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#blockquotes
|
||||||
|
[charcount]: http://www.lettercount.com/
|
||||||
|
[`docs/static/images/showcase/`]: https://github.com/gohugoio/hugo/tree/master/docs/static/images/showcase/
|
||||||
|
[ghforking]: https://help.github.com/articles/fork-a-repo/
|
||||||
|
[hugodev]: /contribute/development/
|
||||||
|
[shortcodeparams]: content-management/shortcodes/#shortcodes-without-markdown
|
||||||
|
[sourceforge]: http://docutils.sourceforge.net/docs/ref/rst/directives.html#admonitions
|
||||||
|
[templating function]: /functions/
|
150
content/contribute/themes.md
Normal file
150
content/contribute/themes.md
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
---
|
||||||
|
title: Add Your Hugo Theme to the Showcase
|
||||||
|
linktitle: Themes
|
||||||
|
description: If you've built a Hugo theme and want to contribute back to the Hugo Community, add your theme to the Hugo Showcase.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-27
|
||||||
|
categories: [contribute]
|
||||||
|
#tags: [contribute,themes,design]
|
||||||
|
authors: [digitalcraftsman]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "contribute"
|
||||||
|
weight: 30
|
||||||
|
weight: 30
|
||||||
|
sections_weight: 30
|
||||||
|
draft: false
|
||||||
|
aliases: [/contribute/theme/]
|
||||||
|
wip: true
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
A collection of all themes created by the Hugo community, including screenshots and demos, can be found at <https://themes.gohugo.io>. Every theme in this list will automatically be added to the theme site. Theme updates aren't scheduled but usually happen at least once a week.
|
||||||
|
|
||||||
|
## tl;dr
|
||||||
|
|
||||||
|
1. Create your theme using `hugo new theme <THEMENAME>`;
|
||||||
|
2. Test your theme against <https://github.com/spf13/HugoBasicExample> \*
|
||||||
|
3. Add a `theme.toml` file to the root of the theme with all required metadata
|
||||||
|
4. Add a descriptive `README.md` to the root of the theme source
|
||||||
|
5. Add `/images/screenshot.png` and `/images/tn.png`
|
||||||
|
|
||||||
|
\* If your theme doesn't fit into the `Hugo Basic Example` site, we encourage theme authors to supply a self-contained Hugo site in `/exampleSite`.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
The folder name here---`exampleSite`---is important, as this folder will be picked up and used by the script that generates the Hugo Theme Site. It mirrors the root directory of a Hugo website and allows you to add custom content, assets, and a `config` file with preset values.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
See the [Hugo Artist theme's exampleSite][artistexample] for a good example.
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
Please make your example site's content is as neutral as possible. We hope this goes without saying.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
## Theme Requirements
|
||||||
|
|
||||||
|
In order to add your theme to the Hugo Themes Showcase, the following requirements need to be met:
|
||||||
|
|
||||||
|
1. `theme.toml` with all required fields
|
||||||
|
2. Images for thumbnail and screenshot
|
||||||
|
3. A good README file instructions for users
|
||||||
|
4. Addition to the hugoThemes GitHub repository
|
||||||
|
|
||||||
|
### Add Your Theme to the Repo
|
||||||
|
|
||||||
|
The easiest way to add your theme is to [open up a new issue in the theme repository][themeissuenew] with a link to the theme's repository on GitHub.
|
||||||
|
|
||||||
|
### Create a `theme.toml` File
|
||||||
|
|
||||||
|
`theme.toml` contains metadata about the theme and its creator and should be created automatically when running the `hugo new theme`. The auto-generated file is provided here as well for easy downloading:
|
||||||
|
|
||||||
|
{{< code file="theme.toml" download="theme.toml" >}}
|
||||||
|
name = ""
|
||||||
|
license = "MIT"
|
||||||
|
licenselink = "https://github.com/<YOURNAME>/<YOURTHEME>/blob/master/LICENSE.md"
|
||||||
|
description = ""
|
||||||
|
homepage = "https://example.com/"
|
||||||
|
tags = []
|
||||||
|
features = []
|
||||||
|
min_version = 0.19
|
||||||
|
|
||||||
|
[author]
|
||||||
|
name = ""
|
||||||
|
homepage = ""
|
||||||
|
|
||||||
|
# If porting an existing theme
|
||||||
|
[original]
|
||||||
|
name = ""
|
||||||
|
homepage = ""
|
||||||
|
repo = ""
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
The following fields are required:
|
||||||
|
|
||||||
|
```
|
||||||
|
name = "Hyde"
|
||||||
|
license = "MIT"
|
||||||
|
licenselink = "https://github.com/spf13/hyde/blob/master/LICENSE.md"
|
||||||
|
description = "An elegant open source and mobile first theme"
|
||||||
|
homepage = "http://siteforthistheme.com/"
|
||||||
|
tags = ["blog", "company"]
|
||||||
|
features = ["blog"]
|
||||||
|
min_version = 0.13
|
||||||
|
|
||||||
|
[author]
|
||||||
|
name = "spf13"
|
||||||
|
homepage = "http://spf13.com/"
|
||||||
|
|
||||||
|
# If porting an existing theme
|
||||||
|
[original]
|
||||||
|
author = "mdo"
|
||||||
|
homepage = "http://hyde.getpoole.com/"
|
||||||
|
repo = "https://www.github.com/mdo/hyde"
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
1. This is different from the `theme.toml` file created by `hugo new theme` in Hugo versions before v0.14.
|
||||||
|
2. Only `theme.toml` is accepted; ie. not `theme.yaml` andnot `theme.json`.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
### Images
|
||||||
|
|
||||||
|
Screenshots are used for previews in the Hugo Theme Gallery. Make sure that they have the right dimensions:
|
||||||
|
|
||||||
|
* Thumbnail should be 900px × 600px
|
||||||
|
* Screenshot should be 1500px × 1000px
|
||||||
|
* Media must be located in
|
||||||
|
* <THEMEDIR>/images/screenshot.png</code>
|
||||||
|
* <THEMEDIR>/images/tn.png</code>
|
||||||
|
|
||||||
|
Additional media may be provided in the same directory.
|
||||||
|
|
||||||
|
### Create a README File
|
||||||
|
|
||||||
|
Your theme's README file should be written in markdown and saved at the root of your theme's directory structure. Your `README.md` serves as
|
||||||
|
|
||||||
|
1. Content for your theme's details page at <https://themes.gohugo.io>
|
||||||
|
2. General information about the theme in your GitHub repository (i.e., it's usual purpose)
|
||||||
|
|
||||||
|
#### Example `README.md`
|
||||||
|
|
||||||
|
You can download the following `README.md` as an outline:
|
||||||
|
|
||||||
|
{{< code file="README.md" download="README.md" >}}
|
||||||
|
|
||||||
|
# Theme Title
|
||||||
|
|
||||||
|
**Need input from @digitalcraftsman on what could be added to this file.**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{% note "Screenshots in your `README.md`"%}}
|
||||||
|
If you add screenshots to the README, please make use of absolute file paths instead of relative ones like `/images/screenshot.png`. Relative paths work great on GitHub but they don't correspond to the directory structure of [themes.gohugo.io](http://themes.gohugo.io/). Therefore, browsers will not be able to display screenshots on the theme site under the given (relative) path.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
[artistexample]: https://github.com/digitalcraftsman/hugo-artists-theme/tree/master/exampleSite
|
||||||
|
[themeissuenew]: https://github.com/gohugoio/hugoThemes/issues/new
|
19
content/documentation.md
Normal file
19
content/documentation.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
---
|
||||||
|
title: Hugo Documentation
|
||||||
|
linktitle: Hugo
|
||||||
|
description: Hugo is the world's fastest static website engine. It's written in Go (aka Golang) and developed by bep, spf13 and friends.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
menu:
|
||||||
|
main:
|
||||||
|
parent: "section name"
|
||||||
|
weight: 01
|
||||||
|
weight: 01 #rem
|
||||||
|
draft: false
|
||||||
|
slug:
|
||||||
|
aliases: []
|
||||||
|
toc: false
|
||||||
|
layout: documentation-home
|
||||||
|
---
|
||||||
|
Hugo is the **world's fastest static website engine.** It's written in Go (aka Golang) and developed by [bep](https://github.com/bep), [spf13](https://github.com/spf13) and [friends](https://github.com/gohugoio/hugo/graphs/contributors). Below you will find some of the most common and helpful pages from our documentation.
|
65
content/functions/GetPage.md
Normal file
65
content/functions/GetPage.md
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
---
|
||||||
|
title: .GetPage
|
||||||
|
description: "Gets a `Page` of a given `Kind` and `path`."
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [sections,lists,indexes]
|
||||||
|
signature: [".GetPage TYPE PATH"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
Every `Page` has a `Kind` attribute that shows what kind of page it is. While this attribute can be used to list pages of a certain `kind` using `where`, often it can be useful to fetch a single page by its path.
|
||||||
|
|
||||||
|
`.GetPage` looks up a page of a given `Kind` and `path`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ with .Site.GetPage "section" "blog" }}{{ .Title }}{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
This method wil return `nil` when no page could be found, so the above will not print anything if the blog section isn't found.
|
||||||
|
|
||||||
|
For a regular page:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ with .Site.GetPage "page" "blog" "my-post.md" }}{{ .Title }}{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the path can also be supplied like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ with .Site.GetPage "page" "blog/my-post.md" }}{{ .Title }}{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
The valid page kinds are: *page, home, section, taxonomy and taxonomyTerm.*
|
||||||
|
|
||||||
|
## `.GetPage` Example
|
||||||
|
|
||||||
|
This code snippet---in the form of a [partial template][partials]---allows you to do the following:
|
||||||
|
|
||||||
|
1. Grab the index object of your `tags` [taxonomy][].
|
||||||
|
2. Assign this object to a variable, `$t`
|
||||||
|
3. Sort the terms associated with the taxonomy by popularity.
|
||||||
|
4. Grab the top two most popular terms in the taxonomy (i.e., the two most popular tags assigned to content.
|
||||||
|
|
||||||
|
{{< code file="grab-top-two-tags.html" >}}
|
||||||
|
<ul class="most-popular-tags">
|
||||||
|
{{ $t := $.Site.GetPage "taxonomyTerm" "tags" }}
|
||||||
|
{{ range first 2 $t.Data.Terms.ByCount }}
|
||||||
|
<li>{{.}}</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
|
||||||
|
[partials]: /templates/partials/
|
||||||
|
[taxonomy]: /content-management/taxonomies/
|
34
content/functions/NumFmt.md
Normal file
34
content/functions/NumFmt.md
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
---
|
||||||
|
title: lang.NumFmt
|
||||||
|
description: "Formats a number with a given precision using the requested `decimal`, `grouping`, and `negative` characters."
|
||||||
|
godocref: ""
|
||||||
|
workson: []
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
#tags: [numbers]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
toc: false
|
||||||
|
signature: ["lang.NumFmt <decimal> <grouping> <negative> <precision> <number>"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
draft: false
|
||||||
|
aliases: []
|
||||||
|
comments:
|
||||||
|
---
|
||||||
|
|
||||||
|
The default options value is `- . ,`.
|
||||||
|
|
||||||
|
Numbers greater than or equal to 5 are rounded up. For example, if precision is set to `0`, `1.5` becomes `2`, and `1.4` becomes `1`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ lang.NumFmt "," "." "-" 2 12345.6789 }} → 12.345,68
|
||||||
|
{{ lang.NumFmt "." "" "-" 6 -12345.6789 }} → -12345.678900
|
||||||
|
{{ lang.NumFmt "." "," "-" 0 -12345.6789 }} → -12,346
|
||||||
|
{{ -98765.4321 | lang.NumFmt "." "," "-" 2 }} → -98,765.43
|
||||||
|
```
|
20
content/functions/_index.md
Normal file
20
content/functions/_index.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
title: Functions Quick Reference
|
||||||
|
linktitle: Functions Quick Reference
|
||||||
|
description: Comprehensive list of Hugo templating functions, including basic and advanced usage examples.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
#tags: []
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
weight: 01 #rem
|
||||||
|
draft: false
|
||||||
|
aliases: [/layout/functions/,/templates/functions]
|
||||||
|
---
|
||||||
|
|
||||||
|
Go templates are lightweight but extensible. Go itself supplies built-in functions, including comparison operators and other basic tools. These are listed in the [Go template documentation][gofuncs]. Hugo has added additional functions to the basic template logic.
|
||||||
|
|
||||||
|
[gofuncs]: http://golang.org/pkg/text/template/#hdr-Functions
|
28
content/functions/abslangurl.md
Normal file
28
content/functions/abslangurl.md
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
title: absLangURL
|
||||||
|
description: Adds the absolute URL with correct language prefix according to site configuration for multilingual.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [multilingual,i18n,urls]
|
||||||
|
signature: ["absLangURL INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [relLangURL]
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
Both `absLangURL` and [`relLangURL`](/functions/rellangurl/) are similar to their [`absURL`](/functions/absurl/) and [`relURL`](/functions/relurl) relatives but will add the correct language prefix when the site is configured with more than one language.
|
||||||
|
|
||||||
|
So for a site `baseURL` set to `https://example.com/hugo/` and the current language is `en`:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ "blog/" | absLangURL }} → "https://example.com/hugo/en/blog/"
|
||||||
|
{{ "blog/" | relLangURL }} → "/hugo/en/blog/"
|
||||||
|
```
|
51
content/functions/absurl.md
Normal file
51
content/functions/absurl.md
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
---
|
||||||
|
title: absURL
|
||||||
|
description: Creates an absolute URL based on the configured baseURL.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [urls]
|
||||||
|
signature: ["absURL INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [relURL]
|
||||||
|
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 (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">
|
||||||
|
{
|
||||||
|
"@context" : "http://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/guides/intro-structured-data
|
||||||
|
[safejs]: /functions/safejs
|
52
content/functions/adddate.md
Normal file
52
content/functions/adddate.md
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
---
|
||||||
|
title: .AddDate
|
||||||
|
description: Returns the time corresponding to adding the given number of years, months, and days passed to the function.
|
||||||
|
godocref: https://golang.org/pkg/time/#Time.AddDate
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [dates,time]
|
||||||
|
signature: [".AddDate YEARS MONTHS DAYS"]
|
||||||
|
workson: [times]
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [now]
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
The `AddDate` function takes three arguments in logical order of `years`, `months`, and `days`.
|
||||||
|
|
||||||
|
## Example: Randomized Tweets from the Last 2 Years
|
||||||
|
|
||||||
|
Let's assume you have a file at `data/tweets.toml` that contains a list of Tweets to display on your site's homepage. The file is filled with `[[tweet]]` blocks; e.g.---
|
||||||
|
|
||||||
|
```
|
||||||
|
[[tweet]]
|
||||||
|
name = "Steve Francia"
|
||||||
|
twitter_handle = "@spf13"
|
||||||
|
quote = "I'm creator of Hugo. #metadocreference"
|
||||||
|
link = "https://twitter.com/spf13"
|
||||||
|
date = "2017-01-07T00:00:00Z"
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's assume you want to grab Tweets from the last two years and present them in a random order. In conjunction with the [`where`](/functions/where/) and [`now`](/functions/now/) functions, you can limit our range to the last two years via `now.AddDate -2 0 0`, which represents a point in time 2 years, 0 days, and 0 hours before the time of your last site build.
|
||||||
|
|
||||||
|
{{< code file="partials/templates/random-tweets.html" download="tweets.html" >}}
|
||||||
|
{{ range where $.Site.Data.tweets.tweet "date" "ge" (now.AddDate -2 0 0) | shuffle }}
|
||||||
|
<div class="item">
|
||||||
|
<blockquote>
|
||||||
|
<p>
|
||||||
|
{{ .quote | safeHTML }}
|
||||||
|
</p>
|
||||||
|
— {{ .name }} ({{ .twitter_handle }}) <a href="{{ .link }}">
|
||||||
|
{{ dateFormat "January 2, 2006" .date }}
|
||||||
|
</a>
|
||||||
|
</blockquote>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
66
content/functions/after.md
Normal file
66
content/functions/after.md
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
---
|
||||||
|
title: after
|
||||||
|
description: "`after` slices an array to only the items after the <em>N</em>th item."
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [iteration]
|
||||||
|
signature: ["after INDEX COLLECTION"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [last,first,seq]
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
The following shows `after` being used in conjunction with the [`slice` function][slice]:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ $data := slice "one" "two" "three" "four" }}
|
||||||
|
{{ range after 2 $data }}
|
||||||
|
{{ . }}
|
||||||
|
{{ end }}
|
||||||
|
→ ["three", "four"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example of `after` with `first`: 2nd–4th Most Recent Articles
|
||||||
|
|
||||||
|
You can use `after` in combination with the [`first` function][] and Hugo's [powerful sorting methods][lists]. Let's assume you have a list page at `example.com/articles`. You have 10 articles, but you want your templating for the [list/section page][] to show only two rows:
|
||||||
|
|
||||||
|
1. The top row is titled "Featured" and shows only the most recently published article (i.e. by `publishdate` in the content files' front matter).
|
||||||
|
2. The second row is titled "Recent Articles" and shows only the 2nd- to 4th-most recently published articles.
|
||||||
|
|
||||||
|
{{< code file="layouts/section/articles.html" download="articles.html" >}}
|
||||||
|
{{ define "main" }}
|
||||||
|
<section class="row featured-article">
|
||||||
|
<h2>Featured Article</h2>
|
||||||
|
{{ range first 1 .Data.Pages.ByPublishDate.Reverse }}
|
||||||
|
<header>
|
||||||
|
<h3><a href="{{.Permalink}}">{{.Title}}</a></h3>
|
||||||
|
</header>
|
||||||
|
<p>{{.Description}}</p>
|
||||||
|
{{ end }}
|
||||||
|
</section>
|
||||||
|
<div class="row recent-articles">
|
||||||
|
<h2>Recent Articles</h2>
|
||||||
|
{{ range first 3 (after 1 .Data.Pages.ByPublishDate.Reverse) }}
|
||||||
|
<section class="recent-article">
|
||||||
|
<header>
|
||||||
|
<h3><a href="{{.Permalink}}">{{.Title}}</a></h3>
|
||||||
|
</header>
|
||||||
|
<p>{{.Description}}</p>
|
||||||
|
</section>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
[`first` function]: /functions/first/
|
||||||
|
[list/section page]: /templates/section-templates/
|
||||||
|
[lists]: /lists/
|
||||||
|
[slice]: /functions/slice/
|
119
content/functions/apply.md
Normal file
119
content/functions/apply.md
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
---
|
||||||
|
title: apply
|
||||||
|
description: Given a map, array, or slice, `apply` returns a new slice with a function applied over it.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [advanced]
|
||||||
|
signature: ["apply COLLETION 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 `name:` 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 as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
"derek-perkins", "joe-bergevin", "tanner-linsley"
|
||||||
|
```
|
||||||
|
|
||||||
|
This is *roughly* equivalent to using the following with [range][]
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ range .Params.names }}{{ . | urlize }}{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
However, it isn’t 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/partial/post-tag-list.html" copy="false" >}}
|
||||||
|
{{ with .Params.tags }}
|
||||||
|
<div class="tags-list">
|
||||||
|
Tags:
|
||||||
|
{{ $len := len . }}
|
||||||
|
{{ if eq $len 1 }}
|
||||||
|
{{ partial "post/tag/link" (index . 0) }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $last := sub $len 1 }}
|
||||||
|
{{ range first $last . }}
|
||||||
|
{{ partial "post/tag/link" . }},
|
||||||
|
{{ end }}
|
||||||
|
{{ partial "post/tag/link" (index . $last) }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{< code file="layouts/partial/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 . }}
|
||||||
|
{{ $links := apply $sort "partial" "post-tag-link" "." }}
|
||||||
|
{{ $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" ".") "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."
|
51
content/functions/base64.md
Normal file
51
content/functions/base64.md
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
---
|
||||||
|
title: base64
|
||||||
|
description: "`base64Encode` and `base64Decode` let you easily decode content with a base64 encoding and vice versa through pipes."
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: []
|
||||||
|
relatedfuncs: []
|
||||||
|
signature: ["base64Decode INPUT", "base64Encode INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
deprecated: false
|
||||||
|
draft: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
An example:
|
||||||
|
|
||||||
|
{{< code file="base64-input.html" >}}
|
||||||
|
<p>Hello world = {{ "Hello world" | base64Encode }}</p>
|
||||||
|
<p>SGVsbG8gd29ybGQ = {{ "SGVsbG8gd29ybGQ=" | base64Decode }}</p>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{< output file="base-64-output.html" >}}
|
||||||
|
<p>Hello world = SGVsbG8gd29ybGQ=</p>
|
||||||
|
<p>SGVsbG8gd29ybGQ = Hello world</p>
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
You can also pass other data types as arguments to the template function which tries to convert them. The following will convert *42* from an integer to a string because both `base64Encode` and `base64Decode` always return a string.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ 42 | base64Encode | base64Decode }}
|
||||||
|
=> "42" rather than 42
|
||||||
|
```
|
||||||
|
|
||||||
|
## `base64` with APIs
|
||||||
|
|
||||||
|
Using base64 to decode and encode becomes really powerful if we have to handle
|
||||||
|
responses from APIs.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ $resp := getJSON "https://api.github.com/repos/gohugoio/hugo/readme" }}
|
||||||
|
{{ $resp.content | base64Decode | markdownify }}
|
||||||
|
```
|
||||||
|
|
||||||
|
The response of the GitHub API contains the base64-encoded version of the [README.md](https://github.com/gohugoio/hugo/blob/master/README.md) in the Hugo repository. Now we can decode it and parse the Markdown. The final output will look similar to the rendered version on GitHub.
|
24
content/functions/chomp.md
Normal file
24
content/functions/chomp.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
---
|
||||||
|
title: chomp
|
||||||
|
description: Removes any trailing newline characters.
|
||||||
|
godocref: Removes any trailing newline characters.
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [trim]
|
||||||
|
signature: ["chomp INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [truncate]
|
||||||
|
deprecated: false
|
||||||
|
---
|
||||||
|
|
||||||
|
Useful in a pipeline to remove newlines added by other processing (e.g., [`markdownify`](/functions/markdownify/)).
|
||||||
|
|
||||||
|
```
|
||||||
|
{{chomp "<p>Blockhead</p>\n"}} → "<p>Blockhead</p>"
|
||||||
|
```
|
28
content/functions/countrunes.md
Normal file
28
content/functions/countrunes.md
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
title: countrunes
|
||||||
|
description: Determines the number of runes in a string excluding any whitespace.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [counting, word count]
|
||||||
|
signature: ["countrunes INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: [/functions/countrunes/,/functions/countwords/]
|
||||||
|
---
|
||||||
|
|
||||||
|
In contrast with `countwords` function, which counts every word in a string, the `countrunes` function determines the number of runes in the content and excludes any whitespace. This has specific utility if you are dealing with CJK-like languages.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ "Hello, 世界" | countrunes }}
|
||||||
|
<!-- outputs a content length of 8 runes. -->
|
||||||
|
```
|
||||||
|
|
||||||
|
[pagevars]: /variables/page/
|
29
content/functions/countwords.md
Normal file
29
content/functions/countwords.md
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
---
|
||||||
|
title: countwords
|
||||||
|
description: Counts the number of words in a string.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [counting, word count]
|
||||||
|
signature: ["countwords INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [countrunes]
|
||||||
|
deprecated: false
|
||||||
|
aliases: [/functions/countrunes/,/functions/countwords/]
|
||||||
|
---
|
||||||
|
|
||||||
|
The template function works similar to the [.WordCount page variable][pagevars].
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ "Hugo is a static site generator." | countwords }}
|
||||||
|
<!-- outputs a content length of 6 words. -->
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
[pagevars]: /variables/page/
|
31
content/functions/dateformat.md
Normal file
31
content/functions/dateformat.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
title: dateFormat
|
||||||
|
description: Converts the textual representation of the `datetime` into the specified format.
|
||||||
|
godocref: https://golang.org/pkg/time/
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [dates,time,strings]
|
||||||
|
signature: ["dateFormat LAYOUT INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [Format,now,Unix,time]
|
||||||
|
deprecated: false
|
||||||
|
---
|
||||||
|
|
||||||
|
`dateFormat` converts the textual representation of the `datetime` into the specified format or returns it as a Go `time.Time` type value. These are formatted with the layout string.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ dateFormat "Monday, Jan 2, 2006" "2015-01-21" }} → "Wednesday, Jan 21, 2015"
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% warning %}}
|
||||||
|
As of v0.19 of Hugo, the `dateFormat` function is *not* supported as part of Hugo's [multilingual feature](/content-management/multilingual/).
|
||||||
|
{{% /warning %}}
|
||||||
|
|
||||||
|
See the [`Format` function](/functions/format/) for a more complete list of date formatting options in your templates.
|
||||||
|
|
93
content/functions/default.md
Normal file
93
content/functions/default.md
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
---
|
||||||
|
title: default
|
||||||
|
description: Allows setting a default value that can be returned if a first value is not set.
|
||||||
|
qref: "Returns a default value if a value is not set when checked."
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
#tags: [defaults]
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
toc:
|
||||||
|
signature: ["default DEFAULT INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
draft: false
|
||||||
|
aliases: [/functions/default/]
|
||||||
|
needsexamples: false
|
||||||
|
---
|
||||||
|
|
||||||
|
`default` checks whether a given value is set and returns a default value if it is not. *Set* in this context means different things depending on date type:
|
||||||
|
|
||||||
|
* non-zero for numeric types and times
|
||||||
|
* non-zero length for strings, arrays, slices, and maps
|
||||||
|
* any boolean or struct value
|
||||||
|
* non-nil for any other types
|
||||||
|
|
||||||
|
`default` function examples reference the following content page:
|
||||||
|
|
||||||
|
{{< code file="content/posts/default-function-example.md" >}}
|
||||||
|
---
|
||||||
|
title: Sane Defaults
|
||||||
|
seo_title:
|
||||||
|
date: 2017-02-18
|
||||||
|
font:
|
||||||
|
oldparam: The default function helps make your templating DRYer.
|
||||||
|
newparam:
|
||||||
|
---
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
`default` can be written in more than one way:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ index .Params "font" | default "Roboto" }}
|
||||||
|
{{ default "Roboto" (index .Params "font") }}
|
||||||
|
```
|
||||||
|
|
||||||
|
Both of the above `default` function calls return `Roboto`.
|
||||||
|
|
||||||
|
A `default` value, however, does not need to be hard coded like the previous example. The `default` value can be a variable or pulled directly from the front matter using dot notation:
|
||||||
|
|
||||||
|
{{< code file="variable-as-default-value.html" nocopy="true" >}}
|
||||||
|
{{$old := .Params.oldparam }}
|
||||||
|
<p>{{ .Params.newparam | default $old }}</p>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Which would return:
|
||||||
|
|
||||||
|
```
|
||||||
|
<p>The default function helps make your templating DRYer.</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
And then using dot notation
|
||||||
|
|
||||||
|
{{< code file="dot-notation-default-value.html" >}}
|
||||||
|
<title>{{ .Params.seo_title | default .Title }}</title>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Which would return
|
||||||
|
|
||||||
|
{{< output file="dot-notation-default-return-value.html" >}}
|
||||||
|
<title>Sane Defaults</title>
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
The following have equivalent return values but are far less terse. This demonstrates the utility of `default`:
|
||||||
|
|
||||||
|
Using `if`:
|
||||||
|
|
||||||
|
{{< code file="if-instead-of-default.html" nocopy="true" >}}
|
||||||
|
<title>{{if .Params.seo_title}}{{.Params.seo_title}}{{else}}{{.Title}}{{end}}</title>
|
||||||
|
=> Sane Defaults
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
Using `with`:
|
||||||
|
|
||||||
|
{{< code file="with-instead-of-default.html" nocopy="true" >}}
|
||||||
|
<title>{{with .Params.seo_title}}{{.}}{{else}}{{.Title}}{{end}}</title>
|
||||||
|
=> Sane Defaults
|
||||||
|
{{< /code >}}
|
64
content/functions/delimit.md
Normal file
64
content/functions/delimit.md
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
---
|
||||||
|
title: delimit
|
||||||
|
description: Loops through any array, slice, or map and returns a string of all the values separated by a delimiter.
|
||||||
|
godocref:
|
||||||
|
workson: []
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [iteration]
|
||||||
|
toc: false
|
||||||
|
signature: ["delimit COLLECTION DELIMIT LAST"]
|
||||||
|
workson: [lists,taxonomies,terms]
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
draft: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
`delimit` called in your template takes the form of
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ delimit array/slice/map delimiter optionallastdelimiter}}
|
||||||
|
```
|
||||||
|
|
||||||
|
`delimit` loops through any array, slice, or map and returns a string of all the values separated by a delimiter, the second argument in the function call. There is an optional third parameter that lets you choose a different delimiter to go between the last two values in the loop.
|
||||||
|
|
||||||
|
To maintain a consistent output order, maps will be sorted by keys and only a slice of the values will be returned.
|
||||||
|
|
||||||
|
The examples of `delimit` that follow all use the same front matter:
|
||||||
|
|
||||||
|
{{< code file="delimit-example-front-matter.toml" nocopy="true" >}}
|
||||||
|
+++
|
||||||
|
title: I love Delimit
|
||||||
|
#tags: [ "tag1", "tag2", "tag3" ]
|
||||||
|
+++
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{< code file="delimit-page-tags-input.html" >}}
|
||||||
|
<p>Tags: {{ delimit .Params.tags ", " }}</p>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{< output file="delimit-page-tags-output.html" >}}
|
||||||
|
<p>Tags: tag1, tag2, tag3</p>
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
Here is the same example but with the optional "last" delimiter:
|
||||||
|
|
||||||
|
{{< code file="delimit-page-tags-final-and-input.html" >}}
|
||||||
|
Tags: {{ delimit .Params.tags ", " ", and " }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
{{< output file="delimit-page-tags-final-and-output.html" >}}
|
||||||
|
<p>Tags: tag1, tag2, and tag3</p>
|
||||||
|
{{< /output >}}
|
||||||
|
|
||||||
|
|
||||||
|
[lists]: /templates/lists/
|
||||||
|
[taxonomies]: /templates/taxonomy-templates/#taxonomy-list-templates
|
||||||
|
[terms]: /templates/taxonomy-templates/#terms-list-templates
|
43
content/functions/dict.md
Normal file
43
content/functions/dict.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
---
|
||||||
|
title: dict
|
||||||
|
description: Creates a dictionary from a list of key and value pairs.
|
||||||
|
godocref:
|
||||||
|
workson: []
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-26
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [dictionary]
|
||||||
|
signature: ["dict KEY VALUE [KEY VALUE]..."]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
`dict` is especially useful for passing more than one value to a partial template.
|
||||||
|
|
||||||
|
|
||||||
|
## Example: `dict` with Embedded SVGs
|
||||||
|
|
||||||
|
The partial below creates a SVG and expects `fill` `height` and `width` from the caller:
|
||||||
|
|
||||||
|
{{< code file="layouts/partials/svgs/external-links.svg" download="external-links.svg" >}}
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="{{ .fill }}" width="{{ .size }}" height="{{ .size }}" viewBox="0 0 32 32" aria-label="External Link">
|
||||||
|
<path d="M25.152 16.576v5.696q0 2.144-1.504 3.648t-3.648 1.504h-14.848q-2.144 0-3.648-1.504t-1.504-3.648v-14.848q0-2.112 1.504-3.616t3.648-1.536h12.576q0.224 0 0.384 0.16t0.16 0.416v1.152q0 0.256-0.16 0.416t-0.384 0.16h-12.576q-1.184 0-2.016 0.832t-0.864 2.016v14.848q0 1.184 0.864 2.016t2.016 0.864h14.848q1.184 0 2.016-0.864t0.832-2.016v-5.696q0-0.256 0.16-0.416t0.416-0.16h1.152q0.256 0 0.416 0.16t0.16 0.416zM32 1.152v9.12q0 0.48-0.352 0.8t-0.8 0.352-0.8-0.352l-3.136-3.136-11.648 11.648q-0.16 0.192-0.416 0.192t-0.384-0.192l-2.048-2.048q-0.192-0.16-0.192-0.384t0.192-0.416l11.648-11.648-3.136-3.136q-0.352-0.352-0.352-0.8t0.352-0.8 0.8-0.352h9.12q0.48 0 0.8 0.352t0.352 0.8z"></path>
|
||||||
|
</svg>
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
These values can be stored in one object with `dict` and passed to the partial:
|
||||||
|
|
||||||
|
{{< code file="layouts/_default/list.html" >}}
|
||||||
|
{{ partial "svg/link-ext.svg" (dict "fill" "#01589B" "size" 10 "width" 20 ) }}
|
||||||
|
{{< /code >}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[partials]: /templates/partials/
|
25
content/functions/echoparam.md
Normal file
25
content/functions/echoparam.md
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
title: echoParam
|
||||||
|
description: Prints a parameter if it is set.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: []
|
||||||
|
signature: ["echoParam DICTIONARY KEY"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
draft: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ echoParam .Params "project_url" }}
|
||||||
|
```
|
32
content/functions/emojify.md
Normal file
32
content/functions/emojify.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
title: emojify
|
||||||
|
description: Runs a string through the Emoji emoticons processor.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [strings,emojis]
|
||||||
|
signature: ["emojify INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
---
|
||||||
|
|
||||||
|
`emoji` runs a passed string through the Emoji emoticons processor.
|
||||||
|
|
||||||
|
See the [Emoji cheat sheet][emojis] for available emoticons.
|
||||||
|
|
||||||
|
The `emojify` function can be called in your templates but not directly in your content files by default. For emojis in content files, set `enableEmoji` to `true` in your site's [configuration][config]. Then you can write emoji shorthand directly into your content files; e.g. <code>I :</code><code>heart</code><code>: Hugo!</code>:
|
||||||
|
|
||||||
|
I :heart: Hugo!
|
||||||
|
|
||||||
|
|
||||||
|
[config]: /getting-started/configuration/
|
||||||
|
[emojis]: http://www.emoji-cheat-sheet.com/
|
||||||
|
[sc]: /templates/shortcode-templates/
|
||||||
|
[scsource]: https://github.com/gohugoio/hugo/tree/master/docs/layouts/shortcodes
|
25
content/functions/eq.md
Normal file
25
content/functions/eq.md
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
title: eq
|
||||||
|
linktitle: eq
|
||||||
|
description: Returns the boolean truth of arg1 == arg2.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [operators,logic]
|
||||||
|
signature: ["eq ARG1 ARG2"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ if eq .Section "blog" }}current{{ end }}
|
||||||
|
```
|
47
content/functions/findRe.md
Normal file
47
content/functions/findRe.md
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
---
|
||||||
|
title: findRE
|
||||||
|
description: Returns a list of strings that match the regular expression.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [regex]
|
||||||
|
signature: ["findRE PATTERN INPUT [LIMIT]"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
By default all matches will be included. The number of matches can be limitted with an optional third parameter.
|
||||||
|
|
||||||
|
The example below returns a list of all second level headers (`<h2>`) in the content:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ findRE "<h2.*?>(.|\n)*?</h2>" .Content }}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can limit the number of matches in the list with a third parameter. The following example shows how to limit the returned value to just one match (or none, if there are no matched substrings):
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ findRE "<h2.*?>(.|\n)*?</h2>" .Content 1 }}
|
||||||
|
<!-- returns ["<h2 id="#foo">Foo</h2>"] -->
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
Hugo uses Golang's [Regular Expression package](https://golang.org/pkg/regexp/), which is the same general syntax used by Perl, Python, and other languages but with a few minor differences for those coming from a background in PCRE. For a full syntax listing, see the [GitHub wiki for re2](https://github.com/google/re2/wiki/Syntax).
|
||||||
|
|
||||||
|
If you are just learning RegEx, or at least Golang's flavor, you can practice pattern matching in the browser at <https://regex101.com/>.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
|
||||||
|
[partials]: /templates/partials/
|
||||||
|
[`plainify`]: /functions/plainify/
|
||||||
|
[toc]: /content-management/toc/
|
||||||
|
[`urlize`]: /functions/urlize
|
28
content/functions/first.md
Normal file
28
content/functions/first.md
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
title: first
|
||||||
|
linktitle: first
|
||||||
|
description: "Slices an array to only the first _N_ elements."
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [iteration]
|
||||||
|
signature: ["first LIMIT COLLECTION"]
|
||||||
|
workson: [lists,taxonomies,terms,groups]
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [after,last]
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ range first 10 .Data.Pages }}
|
||||||
|
{{ .Render "summary" }}
|
||||||
|
{{ end }}
|
||||||
|
```
|
||||||
|
|
126
content/functions/format.md
Normal file
126
content/functions/format.md
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
---
|
||||||
|
title: .Format
|
||||||
|
description: Formats built-in Hugo dates---`.Date`, `.PublishDate`, and `.LastMod`---according to Go's layout string.
|
||||||
|
godocref: https://golang.org/pkg/time/#example_Time_Format
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [dates,time]
|
||||||
|
signature: [".Format FORMAT"]
|
||||||
|
workson: [times]
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [dateFormat,now,Unix,time]
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
toc: true
|
||||||
|
---
|
||||||
|
|
||||||
|
`.Format` will format date values defined in your front matter and can be used as a property on the following [page variables][pagevars]:
|
||||||
|
|
||||||
|
* `.PublishDate`
|
||||||
|
* `.Date`
|
||||||
|
* `.LastMod`
|
||||||
|
|
||||||
|
Assuming a key-value of `date: 2017-03-03` in a content file's front matter, your can run the date through `.Format` followed by a layout string for your desired output at build time:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ .PublishDate.Format "January 2, 2006" }} => March 3, 2017
|
||||||
|
```
|
||||||
|
|
||||||
|
For formatting *any* string representations of dates defined in your front matter, see the [`dateFormat` function][dateFormat], which will still leverage the Golang layout string explained below but uses a slightly different syntax.
|
||||||
|
|
||||||
|
## Go's Layout String
|
||||||
|
|
||||||
|
Hugo templates [format your dates][time] via layout strings that point to a specific reference time:
|
||||||
|
|
||||||
|
```
|
||||||
|
Mon Jan 2 15:04:05 MST 2006
|
||||||
|
```
|
||||||
|
|
||||||
|
While this may seem arbitrary, the numerical value of `MST` is `07`, thus making the layout string a sequence of numbers.
|
||||||
|
|
||||||
|
Here is a visual explanation [taken directly from the Go docs][gdex]:
|
||||||
|
|
||||||
|
```
|
||||||
|
Jan 2 15:04:05 2006 MST
|
||||||
|
=> 1 2 3 4 5 6 -7
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hugo Date and Time Templating Reference
|
||||||
|
|
||||||
|
The following examples show the layout string followed by the rendered output.
|
||||||
|
|
||||||
|
The examples were rendered and tested in [CST][] and all point to the same field in a content file's front matter:
|
||||||
|
|
||||||
|
```
|
||||||
|
date: 2017-03-03T14:15:59-06:00
|
||||||
|
```
|
||||||
|
|
||||||
|
`.Date` (i.e. called via [page variable][pagevars])
|
||||||
|
: **Returns**: `2017-03-03 14:15:59 -0600 CST`
|
||||||
|
|
||||||
|
`"Monday, January 2, 2006"`
|
||||||
|
: **Returns**: `Friday, March 3, 2017`
|
||||||
|
|
||||||
|
`"Mon Jan 2 2006"`
|
||||||
|
: **Returns**: `Fri Mar 3 2017`
|
||||||
|
|
||||||
|
`"January 2nd"`
|
||||||
|
: **Returns**: `March 3rd`
|
||||||
|
|
||||||
|
`"January 2006"`
|
||||||
|
: **Returns**: `March 2017`
|
||||||
|
|
||||||
|
`"2006-01-02"`
|
||||||
|
: **Returns**: `2017-03-03`
|
||||||
|
|
||||||
|
`"Monday"`
|
||||||
|
: **Returns**: `Friday`
|
||||||
|
|
||||||
|
`"02 Jan 06 15:04 MST"` (RFC822)
|
||||||
|
: **Returns**: `03 Mar 17 14:15 CST`
|
||||||
|
|
||||||
|
`"02 Jan 06 15:04 -0700"` (RFC822Z)
|
||||||
|
: **Returns**: `03 Mar 17 14:15 -0600`
|
||||||
|
|
||||||
|
`"Mon, 02 Jan 2006 15:04:05 MST"` (RFC1123)
|
||||||
|
: **Returns**: `Fri, 03 Mar 2017 14:15:59 CST`
|
||||||
|
|
||||||
|
`"Mon, 02 Jan 2006 15:04:05 -0700"` (RFC339)
|
||||||
|
: **Returns**: `Fri, 03 Mar 2017 14:15:59 -0600`
|
||||||
|
|
||||||
|
### Cardinal Numbers and Ordinal Abbreviations
|
||||||
|
|
||||||
|
Spelled-out cardinal numbers (e.g. "one", "two", and "three") and ordinal abbreviations (i.e., with shorted suffixes like "1st", "2nd", and "3rd") are not currently supported:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{.Date.Format "Jan 2nd 2006"}}
|
||||||
|
```
|
||||||
|
|
||||||
|
Hugo assumes you want to append `nd` as a string to the day of the month and outputs the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
Mar 3nd 2017
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- Content idea: see https://discourse.gohugo.io/t/formatting-a-date-with-suffix-2nd/5701 -->
|
||||||
|
|
||||||
|
### Use `.Local` and `.UTC`
|
||||||
|
|
||||||
|
In conjunction with the [`dateFormat` function][dateFormat], you can also convert your dates to `UTC` or to local timezones:
|
||||||
|
|
||||||
|
`{{ dateFormat "02 Jan 06 15:04 MST" .Date.UTC }}`
|
||||||
|
: **Returns**: `03 Mar 17 20:15 UTC`
|
||||||
|
|
||||||
|
`{{ dateFormat "02 Jan 06 15:04 MST" .Date.Local }}`
|
||||||
|
: **Returns**: `03 Mar 17 14:15 CST`
|
||||||
|
|
||||||
|
[CST]: https://en.wikipedia.org/wiki/Central_Time_Zone
|
||||||
|
[dateFormat]: /functions/dateformat/
|
||||||
|
[gdex]: https://golang.org/pkg/time/#example_Time_Format
|
||||||
|
[pagevars]: /variables/page/
|
||||||
|
[time]: https://golang.org/pkg/time/
|
25
content/functions/ge.md
Normal file
25
content/functions/ge.md
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
title: ge
|
||||||
|
linktitle: ge
|
||||||
|
description: Returns the boolean truth of arg1 >= arg2.
|
||||||
|
godocref:
|
||||||
|
date: 2017-07-26
|
||||||
|
publishdate: 2017-07-26
|
||||||
|
lastmod: 2017-07-26
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [operators,logic]
|
||||||
|
signature: ["ge ARG1 ARG2"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ if ge 10 5 }}true{{ end }}
|
||||||
|
```
|
32
content/functions/get.md
Normal file
32
content/functions/get.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
title: .Get
|
||||||
|
description: Accesses positional and ordered parameters in shortcode declaration.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [shortcodes]
|
||||||
|
signature: ["Get INDEX", "Get KEY"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
needsexample: true
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
`.Get` is specifically used when creating your own [shortcode template][sc].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[sc]: /templates/shortcode-templates/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
31
content/functions/getenv.md
Normal file
31
content/functions/getenv.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
title: getenv
|
||||||
|
description: Returns the value of an environment variable.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: []
|
||||||
|
signature: ["getenv VARIABLE"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
Takes a string containing the name of the variable as input. Returns
|
||||||
|
an empty string if the variable is not set, otherwise returns the
|
||||||
|
value of the variable.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ getenv "HOME" }}
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% note %}}
|
||||||
|
In Unix-like environments, the variable must also be exported in order to be seen by `hugo`.
|
||||||
|
{{% /note %}}
|
25
content/functions/gt.md
Normal file
25
content/functions/gt.md
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
title: gt
|
||||||
|
linktitle: gt
|
||||||
|
description: Returns the boolean truth of arg1 > arg2.
|
||||||
|
godocref:
|
||||||
|
date: 2017-07-26
|
||||||
|
publishdate: 2017-07-26
|
||||||
|
lastmod: 2017-07-26
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [operators,logic]
|
||||||
|
signature: ["gt ARG1 ARG2"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ if gt 10 5 }}true{{ end }}
|
||||||
|
```
|
22
content/functions/hasPrefix.md
Normal file
22
content/functions/hasPrefix.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
title: hasprefix
|
||||||
|
linktitle: hasPrefix
|
||||||
|
description: Tests whether a string begins with prefix.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: []
|
||||||
|
signature: ["hasPrefix STRING PREFIX"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
* `{{ hasPrefix "Hugo" "Hu" }}` → true
|
23
content/functions/haschildren.md
Normal file
23
content/functions/haschildren.md
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
title: .HasChildren
|
||||||
|
description:
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [menus]
|
||||||
|
toc:
|
||||||
|
signature: ["HasChildren"]
|
||||||
|
workson: [menus]
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
draft: true
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
Used in [menu templates](/templates/menu-templates/).
|
23
content/functions/hasmenucurrent.md
Normal file
23
content/functions/hasmenucurrent.md
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
title: .HasMenuCurrent
|
||||||
|
description:
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [menus]
|
||||||
|
signature: ["HasMenuCurrent"]
|
||||||
|
workson: [menus]
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
toc: false
|
||||||
|
draft: true
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
Used in [menu templates](/templates/menu-templates/).
|
28
content/functions/highlight.md
Normal file
28
content/functions/highlight.md
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
title: highlight
|
||||||
|
linktitle: highlight
|
||||||
|
description: Takes a string of code and language declaration and uses Pygments to return syntax-highlighted HTML with inline-styles.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [highlighting,pygments,code blocks,syntax]
|
||||||
|
signature: ["highlight INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
---
|
||||||
|
|
||||||
|
[`highlight` is used in Hugo's built-in `highlight` shortcode][highlight].
|
||||||
|
|
||||||
|
See [Installing Hugo][installpygments] for more information on Pygments or [Syntax Highlighting][syntax] for more options on how to add syntax highlighting to your code blocks with Hugo.
|
||||||
|
|
||||||
|
|
||||||
|
[highlight]: /content-management/shortcodes/#highlight
|
||||||
|
[installpygments]: /getting-started/installing/#installing-pygments-optional
|
||||||
|
[syntax]: /tools/syntax-highlighting/
|
26
content/functions/htmlEscape.md
Normal file
26
content/functions/htmlEscape.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
title: htmlEscape
|
||||||
|
linktitle:
|
||||||
|
description: Returns the given string with the reserved HTML codes escaped.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [strings, html]
|
||||||
|
signature: ["htmlEscape INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [htmlUnescape]
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
In the result `&` becomes `&` and so on. It escapes only: `<`, `>`, `&`, `'` and `"`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ htmlEscape "Hugo & Caddy > Wordpress & Apache" }} → "Hugo & Caddy > Wordpress & Apache"
|
||||||
|
```
|
28
content/functions/htmlUnescape.md
Normal file
28
content/functions/htmlUnescape.md
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
title: htmlUnescape
|
||||||
|
linktitle: htmlUnescape
|
||||||
|
description: Returns the given string with HTML escape codes un-escaped.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: []
|
||||||
|
signature: ["htmlUnescape INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: [htmlEscape]
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
`htmlUnescape` returns the given string with HTML escape codes un-escaped.
|
||||||
|
|
||||||
|
Remember to pass the output of this to `safeHTML` if fully un-escaped characters are desired. Otherwise, the output will be escaped again as normal.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ htmlUnescape "Hugo & Caddy > Wordpress & Apache" }} → "Hugo & Caddy > Wordpress & Apache"
|
||||||
|
```
|
31
content/functions/humanize.md
Normal file
31
content/functions/humanize.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
title: humanize
|
||||||
|
linktitle:
|
||||||
|
description: Returns the humanized version of an argument with the first letter capitalized.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [strings,casing]
|
||||||
|
signature: ["humanize INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
If the input is either an int64 value or the string representation of an integer, humanize returns the number with the proper ordinal appended.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
{{humanize "my-first-post"}} → "My first post"
|
||||||
|
{{humanize "myCamelPost"}} → "My camel post"
|
||||||
|
{{humanize "52"}} → "52nd"
|
||||||
|
{{humanize 103}} → "103rd"
|
||||||
|
```
|
||||||
|
|
34
content/functions/i18n.md
Normal file
34
content/functions/i18n.md
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
---
|
||||||
|
title: i18n
|
||||||
|
linktitle: i18n
|
||||||
|
description: Translates a piece of content based on your i18n configuration files.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [internationalization,i18n,multilingual]
|
||||||
|
signature: ["i18n KEY", "T KEY"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
This translates a piece of content based on your `i18n/en-US.yaml` (and similar) files. You can use the [go-i18n](https://github.com/nicksnyder/go-i18n) tools to manage your translations. The translations can exist in both the theme and at the root of your repository.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ i18n "translation_id" }}
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% note "Alias `T`" %}}
|
||||||
|
`T` is an alias to `i18n`. E.g. `{{ T "translation_id" }}`.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
|
For more information about string translations, see [Translation of Strings in Multilingual Mode][multistrings].
|
||||||
|
|
||||||
|
[multistrings]: /content-management/multilingual/#translation-of-strings
|
24
content/functions/imageConfig.md
Normal file
24
content/functions/imageConfig.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
---
|
||||||
|
linktitle: imageConfig
|
||||||
|
description: Parses the image and returns the height, width, and color model.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [images]
|
||||||
|
signature: ["imageConfig PATH"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ with (imageConfig "favicon.ico") }}
|
||||||
|
favicon.ico: {{.Width}} x {{.Height}}
|
||||||
|
{{ end }}
|
||||||
|
```
|
33
content/functions/in.md
Normal file
33
content/functions/in.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
---
|
||||||
|
title: in
|
||||||
|
linktitle:
|
||||||
|
description: Checks if an element is in an array or slice--or a substring in a string---and returns a boolean.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [strings]
|
||||||
|
signature: ["in SET ITEM"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
The elements supported are strings, integers and floats, although only float64 will match as expected.
|
||||||
|
|
||||||
|
In addition, `in` can also check if a substring exists in a string.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ if in .Params.tags "Git" }}Follow me on GitHub!{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ if in "this string contains a substring" "substring" }}Substring found!{{ end }}
|
||||||
|
```
|
84
content/functions/index-function.md
Normal file
84
content/functions/index-function.md
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
---
|
||||||
|
title: index
|
||||||
|
linktitle: index
|
||||||
|
description: Looks up the index(es) or key(s) of the data structure passed into it.
|
||||||
|
godocref: https://golang.org/pkg/text/template/#hdr-Functions
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: []
|
||||||
|
signature: ["index COLLECTION INDEX", "index COLLECTION KEY"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: [/functions/index/]
|
||||||
|
needsexample: true
|
||||||
|
---
|
||||||
|
|
||||||
|
From the Godocs:
|
||||||
|
|
||||||
|
> Returns the result of indexing its first argument by the following arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each indexed item must be a map, slice, or array.
|
||||||
|
|
||||||
|
In Go templates, you can't access array, slice, or map elements directly the same way you would in Go. For example, `$.Site.Data.authors[.Params.authorkey]` isn't supported syntax.
|
||||||
|
|
||||||
|
Instead, you have to use `index`, a function that handles the lookup for you.
|
||||||
|
|
||||||
|
## Example: Load Data from a Path Based on Front Matter Params
|
||||||
|
|
||||||
|
Assume you want to add a `location = ""` field to your front matter for every article written in `content/vacations/`. You want to use this field to populate information about the location at the bottom of the article in your `single.html` template. You also have a directory in `data/locations/` that looks like the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
└── data
|
||||||
|
└── locations
|
||||||
|
├── abilene.toml
|
||||||
|
├── chicago.toml
|
||||||
|
├── oslo.toml
|
||||||
|
└── provo.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
Here is an example of the data inside `data/locations/oslo.toml`:
|
||||||
|
|
||||||
|
```
|
||||||
|
website = "https://www.oslo.kommune.no"
|
||||||
|
pop_city = 658390
|
||||||
|
pop_metro = 1717900
|
||||||
|
```
|
||||||
|
|
||||||
|
The example we will use will be an article on Oslo, which front matter should set to exactly the same name as the corresponding file name in `data/locations/`:
|
||||||
|
|
||||||
|
```
|
||||||
|
title = "My Norwegian Vacation"
|
||||||
|
location = "oslo"
|
||||||
|
```
|
||||||
|
|
||||||
|
The content of `oslo.toml` can be accessed from your template using the following node path: `.Site.Data.locations.oslo`. However, the specific file you need is going to change according to the front matter.
|
||||||
|
|
||||||
|
This is where the `index` function is needed. `index` takes 2 parameters in this use case:
|
||||||
|
|
||||||
|
1. The node path
|
||||||
|
2. A string corresponding to the desired data; e.g.—
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ index .Site.Data.locations “oslo” }}
|
||||||
|
```
|
||||||
|
|
||||||
|
The variable for `.Params.location` is a string and can therefore replace `oslo` in the example above:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ index .Site.Data.authors .Params.author }}
|
||||||
|
=> map[website:https://www.oslo.kommune.no pop_city:658390 pop_metro:1717900]
|
||||||
|
```
|
||||||
|
|
||||||
|
Now the call will return the specific file according to the location specified in the content's front matter, but you will likely want to write specific properties to the template. You can do this by continuing down the node path via dot notation (`.`):
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ (index .Site.Data.locations .Params.location).pop_city }}
|
||||||
|
=> 658390
|
||||||
|
```
|
||||||
|
|
26
content/functions/int.md
Normal file
26
content/functions/int.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
title: int
|
||||||
|
linktitle: int
|
||||||
|
description: Creates an `int` from the argument passed into the function.
|
||||||
|
godocref:
|
||||||
|
date: 2017-02-01
|
||||||
|
publishdate: 2017-02-01
|
||||||
|
lastmod: 2017-02-01
|
||||||
|
categories: [functions]
|
||||||
|
menu:
|
||||||
|
docs:
|
||||||
|
parent: "functions"
|
||||||
|
#tags: [strings,integers]
|
||||||
|
signature: ["int INPUT"]
|
||||||
|
workson: []
|
||||||
|
hugoversion:
|
||||||
|
relatedfuncs: []
|
||||||
|
deprecated: false
|
||||||
|
aliases: []
|
||||||
|
---
|
||||||
|
|
||||||
|
Useful for turning strings into numbers.
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ int "123" }} → 123
|
||||||
|
```
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue