Шпаргалка по Hugo
Примеры использования Hugo
Навигация
Шпаргалка ни в коей мере не является альтернативой официальной документации или руководствам по генератору статических сайтов Hugo.
Время
Часовой пояс
Официальная документация: <a href=“https://gohugo.io/configuration/all/#timezone"target="_blank">https://gohugo.io/configuration/all/#timezone
Часовой пояс указывается в hugo.toml
и позволяет корректно отображать, например, время создания/редактирования страниц.
Пример:
timeZone = 'Europe/Moscow'
Варианты написания часовых поясов есть тут: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
Изображения
Увеличение картинки по нажатию
- Более-менее рабочий сценарий описан тут (страница доступна только в архиве): https://web.archive.org/web/20250208163519/https://romankurnovskii.com/ru/posts/hugo-add-image-zoomin/
- Ещё есть вариант описания: https://artydev.ru/posts/hugo-img-zoom/
- Общий совет без деталей: https://discourse.gohugo.io/t/image-js-zoom-script/27325/7
Локальный web-сервер
Описание команды: https://gohugo.io/commands/hugo_server/#hugo-server
Дефолтный локальный адрес: http://localhost:1313/
Запуск локального сервера с указанием конкретной папки с контентом
Два равнозначных варианта команды:
hugo server --contentDir string
hugo server -c string
Пример:
hugo server --contentDir /Users/zlonov/Library/Mobile\ Documents/iCloud\~md\~obsidian/Documents/🧬live
Включить помеченное как “draft”
Два равнозначных варианта команды:
hugo server --buildDrafts
hugo server -D
Пример:
hugo server --buildDrafts --contentDir /Users/zlonov/Library/Mobile\ Documents/iCloud\~md\~obsidian/Documents/🧬live
Автоматический переход к изменённой странице
Два равнозначных варианта команды:
hugo server --navigateToChanged
hugo server -N
Пример:
hugo server --navigateToChanged --buildDrafts --contentDir /Users/zlonov/Library/Mobile\ Documents/iCloud\~md\~obsidian/Documents/🧬live
Автоматическое удаление папки со сгенерированным сайтом после остановки сервера
Вторая команда запускается после завершения первой и удаляет папку public
:
hugo server && rm -rf public
Как вариант, папку можно не удалять, а переименовывать. Так и сгенерированный сайт сохранится и при следующем запуске папка public
будет создана с нуля:
hugo server && rm -rf public && mv public public_last
Пример:
hugo server --navigateToChanged --buildDrafts --contentDir /Users/zlonov/Library/Mobile\ Documents/iCloud\~md\~obsidian/Documents/🧬live && rm -rf public && mv public public_last
Оформление
Заголовок страницы
HTML-элемент <title>
определяет заголовок документа, который отображается в заголовке окна браузера или на вкладке страницы. Он содержит только текст, а теги внутри элемента игнорируются.
Заголовок страницы для сайтов на базе Hugo обычно устанавливается в файле layouts/partials/head.html
(зависит от используемой темы).
Пример кода, который устанавливает заголовок вида "Мой сайт | Заголовок страницы"
для отдельных страниц, "Мой сайт"
для главной страницы и "Мой сайт | Краткое содержание"
для страниц без заголовка:
<!-- Site/page Title -->
{{ $title := print .Site.Title " | " .Title }}
{{ if not .Title }}{{ $title = (print .Site.Title " | " (.Summary | plainify)) | truncate 512 }}{{ end }}
{{ if .IsHome }}{{ $title = .Site.Title }}{{ end }}
<title>{{ $title }}</title>
Максимальная длина <title>
зависит от браузера и варьируется от 512 до 3250.
Подписки / RSS
RSS-лента
Ограничить число генерируемых записей в RSS-ленте можно в файле конфигурации hugo.toml
:
[services]
[services.rss]
limit = 15
Содержание / TOC
Добавить к посту содержание/оглавление
Можно использовать модуль Table Of Contents Shortcode из состава Exclusive Hugo Modules либо отдельно:
- Добавить файл
toc.html
в папку/layouts/partials
. Можно его доработать, например, для проверки числа слов:
{{ if gt .WordCount 100 }}
{{ $class:= .Class }}
{{ $scratch := newScratch }}
{{ if not (.Collapsed | default true) }}
{{ $scratch.Set "openAttr" "open" }}
{{ else }}
{{ $scratch.Set "openAttr" "" }}
{{ end }}
<details {{ $scratch.Get "openAttr" | safeHTMLAttr }} class="table-of-content {{$class}}">
<summary>
{{ with i18n "toc" }}
{{ . }}
{{ else }}
Содержание
{{ end }}
</summary>
{{ .TableOfContents }}
</details>
{{ end }}
- Добавить стили из файла
toc.css
в используемые стили:
.table-of-content {
margin: 1rem 0 1.5rem;
}
.table-of-content summary {
font-size: 18px;
color: #fff;
background-color: #555;
padding: 5px 20px;
margin-bottom: 0 !important;
}
.table-of-content ul li:before {
display: none;
}
#TableOfContents {
padding: 10px;
background-color: #f7f7f7;
}
#TableOfContents li,
#TableOfContents a {
color: #333 !important;
}
#TableOfContents a {
text-decoration: none;
}
#TableOfContents a:hover {
text-decoration: underline;
}
.content .table-of-content ul li,
.content .table-of-content ol li {
margin-bottom: 6px !important;
}
.dark #TableOfContents {
background-color: #333;
}
.dark #TableOfContents li,
.dark #TableOfContents a {
color: #fff !important;
}
- Далее надо использовать вызов просто:
{{ partial "toc.html" }}
либо{{ partial "toc.html" (dict "Class" "table-of-content" "Collapsed" true "TableOfContents" .TableOfContents "WordCount" .WordCount) }}
Проверить, что содержание не пустое
{{ with .TableOfContents }}
<!-- the variable is set -->
{{ if ne .TableOfContents "<nav id=\"TableOfContents\"></nav>" }}
<!-- the variable is not an empty navigation -->
{{ . }}
<!-- it is a dot because we are inside of a `with` -->
{{ end }}
{{ end }}
Источник: <a href=“https://discourse.gohugo.io/t/check-for-empty-tableofcontents/29737"target="_blank">https://discourse.gohugo.io/t/check-for-empty-tableofcontents/29737
Сокращённый вариант с реальным примером:
{{ if ne .TableOfContents "<nav id=\"TableOfContents\"></nav>" }}
<div class="row">
<div class="col-sm-3 order-sm-2">{{ .TableOfContents }}</div>
<div class="serif main-content col-sm-9 order-sm-1">{{ .Content | markdownify | safeHTML }}</div>
</div>
{{ else }}
<div class="serif main-content">{{ .Content | markdownify | safeHTML }}</div>
{{ end }}
Ссылки
Использование точек в именах файлов
В версии 0.146+ есть проблема с использованием точек в именах файлах: Hugo отсекает всё, что идёт после первой точки, поэтому для файла c именем, например, 2025-04 18 10.27.52.md
будет создана страница /2025-04-18-10/index.html
, а не /2025-04-18-10.27.52/index.html
, как хотелось бы.
Варианта решения пока два:
- Отказаться от использования точек, заменив их, например, на дефис:
2025-04 18 10-27-52.md
или нижнее подчёркивание:2025-04 18 10_27_52.md
- Использовать явное указание желаемое результата в параметрах:
slug: 2025-04 18 10.27.52