6.6 KiB
home
Совершенно новый™️ Golang-движок для моего персонального сайта. Без баз данных, работа полностью основана на взаимодействии с простыми файлами "как есть". Потенциально стремится к совместимости с протоколами IndieWeb.
Установка и запуск
Склонируйте этот репозиторий и запустите его компилятором Go:
> git clone https://source.toby3d.me/toby3d/home -b develop
> cd home && go run .
Базовая конфигурация движка осуществляется через переменные окружения ОС.
Доступны четыре опции:
HOME_CONTENT_DIR
-- имя или путь директории в которой содержатся страницы и статика, по-умолчаниюcontent/
;HOME_HOST
-- IP-адрес на котором будет работать движок, по-умолчанию0.0.0.0
;HOME_THEME_DIR
-- имя или путь директории в которой содержатся файлы шаблонов, по-умолчаниюtheme/
;HOME_PORT
-- порт на котором будет работать движок, по-умолчанию3000
;
Конфигурация сайта и его страниц полностью обеспечивается через FrontMatter в Markdown-файлах находящиеся в $HOME_CONTENT_DIR
.
Чтобы назначить глобальные настройки сайту нужно создать index.md
в $HOME_CONTENT_DIR
и указать в нём следующее:
---
# Известные параметры:
title: "ACME Inc" # Название сайта
baseUrl: "https://example.com/" # Префикс всех относительных URL
timeZone: "UTC" # Имя часового пояса
# Любые другие наборы ключей-значений будут восприниматься как второстепенные параметры и доступные через `.Site.Params`:
tokens:
mastodonApi: "asdbjhqwe..."
telegram: "bot1234..."
announcement: >
You got mail!
backlink: "https://mstdn.io/@toby3d"
...
---
Использование
Страницы публикуются мгновенно через создание Markdown-файлов. Индексные файлы главной страницы и директорий называются index.md
или index.lang.md
где lang
это двубуквенное обозначение языка локализации. Движок поддерживает работу с любым числом локализаций одних и тех же страниц: index.ru.md
, index.en.md
, index.jp.md
и так далее.
Именованные страницы могут называться как угодно, имя будет использоваться в качестве slug из URL, например:
$HOME_CONTENT_DIR/folder/file.md
:/folder/file
,/folder/file/
,/folder/file/index.html
и/folder/file.html
;$HOME_CONTENT_DIR/now/index.md
:/now
,/now/
,/now/index.html
и/now.html
;$HOME_CONTENT_DIR/2023/11/09.md
:/2023/11/09
,/2023/11/09/
,/2023/11/09/index.html
и/2023/11/09.html
;- и так далее;
Правила по локализациям здесь также применимы: folder/file.ru.md
b folder/file.en.md
, now.jp.md
, 2023/11/09.de.md
и так далее.
Содержимое публикуемых страниц также соответствует формату FrontMatter:
---
# Известные параметры:
title: "Hello, World!"
# Любые другие наборы ключей-значений будут восприниматься как второстепенные параметры и доступные через `.Page.Params`:
style:
accent: "#0a0a23"
icon: "👋🏻"
tags:
- example
- demo
- blog
contact: "hey@toby3d.me"
---
This is a sample page content for demo.
Статические файлы вроде изображений, видео, robots.txt
, стилей, скриптов и чего-угодно ещё размещаются в $HOME_CONTENT_DIR
как есть: в корень если они должны быть доступны глобально через .Site.Files
и для домашних страниц, а также в нужных директориях со страницами для доступа к ним через .Page.Files
. Формат и имена файлов ничем не ограничены.
Для рендера содержимого страниц в браузерах необходимы шаблоны, которые должны размещаться в $HOME_THEME_DIR
. Для работы необходим хотя бы один шаблон с блоком baseof
который будет вызываться для каждой страницы, например:
<!-- theme/baseof.html -->
{{ define "baseof" }}
<!DOCTYPE html>
<html lang="{{ .Site.Language }}">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<title>{{ .Site.Title }}</title>
</head>
<body>
{{ block "body" . }}{{ .Page.Content }}{{ end }}
</body>
</html>
{{ end }}
Шаблонизация работает по инструкциям стандартного шаблонизатора Go с небольшими дополнениями в виде дополнительных утилит. В $HOME_THEME_DIR
разрешена любая комбинация и иеархия шаблонов и их взаимосвязей до тех пор, пока существует baseof
в качестве единого родительского блока.
В качестве контекста в каждый шаблон пробрасываются две структуры: .Site
с глобальными опциям из $HOME_CONTENT_DIR/index.md
и текущая просматриваемая страница .Page
с её опциями найденная в $HOME_CONTENT_DIR
. Структуры данных в этих контекстах можно посмотреть в пакете domains, они используются в шаблонах как есть.