96 lines
6.6 KiB
Markdown
96 lines
6.6 KiB
Markdown
# home
|
||
> Совершенно новый:tm: Golang-движок для моего персонального сайта. Без баз данных, работа полностью основана на взаимодействии с простыми файлами "как есть". Потенциально стремится к совместимости с протоколами [IndieWeb](https://indieweb.org/).
|
||
|
||
## Установка и запуск
|
||
Склонируйте этот репозиторий и запустите его компилятором Go:
|
||
```bash
|
||
> 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` и указать в нём следующее:
|
||
```markdown
|
||
---
|
||
# Известные параметры:
|
||
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:
|
||
```markdown
|
||
---
|
||
# Известные параметры:
|
||
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` который будет вызываться для каждой страницы, например:
|
||
```html
|
||
<!-- 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](https://pkg.go.dev/html/template) с небольшими дополнениями в виде дополнительных утилит. В `$HOME_THEME_DIR` разрешена любая комбинация и иеархия шаблонов и их взаимосвязей до тех пор, пока существует `baseof` в качестве единого родительского блока.
|
||
|
||
В качестве контекста в каждый шаблон пробрасываются две структуры: `.Site` с глобальными опциям из `$HOME_CONTENT_DIR/index.md` и текущая просматриваемая страница `.Page` с её опциями найденная в `$HOME_CONTENT_DIR`. Структуры данных в этих контекстах можно посмотреть в пакете [domains](../internal/domain), они используются в шаблонах как есть.
|