feat: архив постов по годам/месяцам на /posts/ (layout archives)
deploy-dedinit / Build & SFTP Deploy (push) Successful in 59m32s
deploy-dedinit / Build & SFTP Deploy (push) Successful in 59m32s
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
title: "Архив"
|
||||||
|
description: "Все посты блога, сгруппированные по годам и месяцам"
|
||||||
|
layout: archives
|
||||||
|
---
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
schema: spec-driven
|
||||||
|
created: 2026-09-22
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# Design: Archive by Year/Month
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Страница `/posts/` (меню «Архив») показывает посты, сгруппированные по
|
||||||
|
годам и месяцам (как штатный архив Hugo/PaperMod), вместо плоского списка.
|
||||||
|
|
||||||
|
## Approach
|
||||||
|
|
||||||
|
Используем готовый layout темы rDedInit: `themes/rDedInit/layouts/_default/archives.html`.
|
||||||
|
|
||||||
|
Что он делает (из исходника theme):
|
||||||
|
- `where site.RegularPages "Type" "in" site.Params.mainSections` — берёт
|
||||||
|
обычные страницы основных секций (не список, без пагинации).
|
||||||
|
- `GroupByPublishDate "2006"` — группировка по годам.
|
||||||
|
- Внутри каждого года `GroupByDate "January"` — группировка по месяцам.
|
||||||
|
- Заголовки `.archive-year` / `.archive-month`, счётчики, якоря `#2026`,
|
||||||
|
`#2026-January`.
|
||||||
|
- Каждая запись — `.archive-entry` с title, post_meta и ссылкой.
|
||||||
|
|
||||||
|
Стили `.archive-*` уже есть в `assets/css/common/archive.css`.
|
||||||
|
|
||||||
|
## Change: content/posts/_index.md
|
||||||
|
|
||||||
|
Создать файл `content/posts/_index.md`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
title: "Архив"
|
||||||
|
description: "Все посты блога по годам и месяцам"
|
||||||
|
layout: archives
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
Frontmatter `layout: archives` заставляет Hugo выбрать
|
||||||
|
`_default/archives.html` для листинга секции (Hugo ищет layout по
|
||||||
|
порядку: `<type>/<layout>.html`, `_default/<layout>.html` — найдёт
|
||||||
|
`_default/archives.html`).
|
||||||
|
|
||||||
|
Никаких других файлов менять не нужно:
|
||||||
|
- Меню `[menu.main]` Архив → `/posts/` уже настроено (hugo.toml).
|
||||||
|
- RSS секции `/posts/` рендерится через `rss.xml` независимо.
|
||||||
|
- `baseof.html` уже поддерживает `eq .Layout "archives"` для
|
||||||
|
breadcrumbs/навигации.
|
||||||
|
- `index.json` (поиск) и `rss.xml` исключают layout `archives` из листинга.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
1. `make build` (hugo --minify)
|
||||||
|
2. `grep -c 'archive-year' public/posts/index.html` > 0
|
||||||
|
3. `grep -c 'archive-month' public/posts/index.html` > 0
|
||||||
|
4. Убедиться, что title на странице — «Архив», посты сгруппированы по годам
|
||||||
|
5. `make deploy-dry-run` — SFTP-симуляция (деплой: Gitea Actions)
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Archive by Year/Month
|
||||||
|
|
||||||
|
## Problem Statement
|
||||||
|
|
||||||
|
Страница «Архив» (меню → `/posts/`) сейчас показывает плоский список всех
|
||||||
|
постов с пагинацией по 10 (layout `list.html`). При ~100+ постах это
|
||||||
|
неудобно: нет обзора по годам и месяцам, нельзя быстро найти пост по
|
||||||
|
периоду.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
Hugo умеет группировать посты по годам/месяцам из коробки (GroupByDate /
|
||||||
|
GroupByPublishDate). Тема rDedInit уже содержит готовый layout
|
||||||
|
`_default/archives.html` и стили `archive.css` — нужно лишь переключить
|
||||||
|
секцию `/posts/` на этот layout. Расширять тему не требуется.
|
||||||
|
|
||||||
|
## Proposed Solution
|
||||||
|
|
||||||
|
Добавить `content/posts/_index.md` с frontmatter `layout: archives` (и
|
||||||
|
title/description). Hugo автоматически применит `archives.html` к листингу
|
||||||
|
секции `/posts/`, который сгруппирует посты по годам и месяцам с
|
||||||
|
счётчиками и якорями.
|
||||||
|
|
||||||
|
## Alternative Solutions
|
||||||
|
|
||||||
|
- Написать свой layout `layouts/posts/list.html` — избыточно, тема уже
|
||||||
|
имеет готовый архив.
|
||||||
|
- Использовать отдельную страницу `/archive/` — меняет URL и меню; текущий
|
||||||
|
пункт меню «Архив» ведёт на `/posts/`, менять не нужно.
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Изменяется только рендер `/posts/` (list → archives).
|
||||||
|
- URL постов и permalinks не меняются.
|
||||||
|
- RSS секции `/posts/` сохраняется (archives.html не влияет на rss.xml).
|
||||||
|
- Деплой — автоматический через Gitea Actions (push в main).
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
## Purpose
|
||||||
|
|
||||||
|
Страница «Архив» (/posts/) блога dedinit.ru отображает все посты,
|
||||||
|
сгруппированные по годам и месяцам (как штатный архив Hugo), вместо
|
||||||
|
плоского списка с пагинацией.
|
||||||
|
|
||||||
|
## ADDED Requirements
|
||||||
|
|
||||||
|
### Requirement: Группировка постов по годам и месяцам
|
||||||
|
Система SHALL отображать на странице /posts/ список всех постов,
|
||||||
|
сгруппированный по годам публикации, и внутри каждого года — по месяцам
|
||||||
|
публикации. Заголовки содержат год/месяц и количество постов в группе.
|
||||||
|
|
||||||
|
#### Scenario: Страница /posts/ показывает годы
|
||||||
|
- **WHEN** пользователь открывает страницу /posts/
|
||||||
|
- **THEN** страница содержит заголовки годов (например «2026», «2023»), под каждым — посты этого года
|
||||||
|
- **AND** возле каждого года отображается количество постов
|
||||||
|
|
||||||
|
#### Scenario: Внутри года посты сгруппированы по месяцам
|
||||||
|
- **WHEN** пользователь открывает страницу /posts/
|
||||||
|
- **THEN** внутри каждого года посты сгруппированы по месяцам публикации (например «January», «September»)
|
||||||
|
- **AND** возле каждого месяца отображается количество постов
|
||||||
|
|
||||||
|
#### Scenario: Каждый пост — ссылка на свою страницу
|
||||||
|
- **WHEN** пользователь видит запись в архиве
|
||||||
|
- **THEN** заголовок поста является ссылкой на его страницу (permalink)
|
||||||
|
- **AND** под заголовком отображаются метаданные поста (дата и пр.)
|
||||||
|
|
||||||
|
### Requirement: Заголовок и описание страницы
|
||||||
|
Система SHALL отображать на странице /posts/ заголовок «Архив» и описание
|
||||||
|
страницы (из frontmatter секции).
|
||||||
|
|
||||||
|
#### Scenario: Заголовок страницы
|
||||||
|
- **WHEN** пользователь открывает страницу /posts/
|
||||||
|
- **THEN** заголовок страницы — «Архив»
|
||||||
|
|
||||||
|
### Requirement: Сохранение остальной функциональности секции
|
||||||
|
Система SHALL сохранять работоспособность RSS-ленты секции /posts/ и URL
|
||||||
|
постов (permalinks не меняются) при переключении layout на архив.
|
||||||
|
|
||||||
|
#### Scenario: RSS секции не сломан
|
||||||
|
- **WHEN** пользователь запрашивает RSS-ленту секции /posts/ (index.xml)
|
||||||
|
- **THEN** лента валидна и содержит посты секции
|
||||||
|
|
||||||
|
#### Scenario: Permalinks постов не меняются
|
||||||
|
- **WHEN** пользователь открывает пост из архива
|
||||||
|
- **THEN** URL поста соответствует permalink /:year/:slug/ (как и раньше)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# Tasks: Archive by Year/Month
|
||||||
|
|
||||||
|
- [x] Создать `content/posts/_index.md` с frontmatter: title "Архив", description, layout: archives
|
||||||
|
- [x] `make build` (hugo --minify) — без ошибок
|
||||||
|
- [x] Проверить `public/posts/index.html`: есть `.archive-year` и `.archive-month`, посты сгруппированы по годам/месяцам, title "Архив"
|
||||||
|
- [x] Убедиться, что пагинация/плоский список (post-entry) на /posts/ исчезла
|
||||||
|
- [x] Проверить RSS секции /posts/ (index.xml) — не сломан
|
||||||
|
- [x] `openspec validate archive-by-year-month` — чисто
|
||||||
|
- [ ] Commit + push origin main — деплой через Gitea Actions (deploy.yml)
|
||||||
|
- [ ] Прогнать openspec-archive-change (архивировать change после деплоя)
|
||||||
Reference in New Issue
Block a user