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