From 65457becf27b141654afb3c852f08d72de305ea9 Mon Sep 17 00:00:00 2001 From: Storozhenko Evgeny Date: Tue, 22 Sep 2026 14:13:14 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=D0=B2=20=D0=BF=D0=BE=20=D0=B3=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=D0=BC/=D0=BC=D0=B5=D1=81=D1=8F=D1=86=D0=B0=D0=BC?= =?UTF-8?q?=20=D0=BD=D0=B0=20/posts/=20(layout=20archives)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/posts/_index.md | 5 ++ .../archive-by-year-month/.openspec.yaml | 2 + .../changes/archive-by-year-month/design.md | 53 +++++++++++++++++++ .../changes/archive-by-year-month/proposal.md | 36 +++++++++++++ .../specs/archive-by-year-month/spec.md | 47 ++++++++++++++++ .../changes/archive-by-year-month/tasks.md | 10 ++++ 6 files changed, 153 insertions(+) create mode 100644 content/posts/_index.md create mode 100644 openspec/changes/archive-by-year-month/.openspec.yaml create mode 100644 openspec/changes/archive-by-year-month/design.md create mode 100644 openspec/changes/archive-by-year-month/proposal.md create mode 100644 openspec/changes/archive-by-year-month/specs/archive-by-year-month/spec.md create mode 100644 openspec/changes/archive-by-year-month/tasks.md diff --git a/content/posts/_index.md b/content/posts/_index.md new file mode 100644 index 0000000..3127424 --- /dev/null +++ b/content/posts/_index.md @@ -0,0 +1,5 @@ +--- +title: "Архив" +description: "Все посты блога, сгруппированные по годам и месяцам" +layout: archives +--- \ No newline at end of file diff --git a/openspec/changes/archive-by-year-month/.openspec.yaml b/openspec/changes/archive-by-year-month/.openspec.yaml new file mode 100644 index 0000000..a9eca53 --- /dev/null +++ b/openspec/changes/archive-by-year-month/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-09-22 \ No newline at end of file diff --git a/openspec/changes/archive-by-year-month/design.md b/openspec/changes/archive-by-year-month/design.md new file mode 100644 index 0000000..cb44df7 --- /dev/null +++ b/openspec/changes/archive-by-year-month/design.md @@ -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 по +порядку: `/.html`, `_default/.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) \ No newline at end of file diff --git a/openspec/changes/archive-by-year-month/proposal.md b/openspec/changes/archive-by-year-month/proposal.md new file mode 100644 index 0000000..f923f44 --- /dev/null +++ b/openspec/changes/archive-by-year-month/proposal.md @@ -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). \ No newline at end of file diff --git a/openspec/changes/archive-by-year-month/specs/archive-by-year-month/spec.md b/openspec/changes/archive-by-year-month/specs/archive-by-year-month/spec.md new file mode 100644 index 0000000..0e329da --- /dev/null +++ b/openspec/changes/archive-by-year-month/specs/archive-by-year-month/spec.md @@ -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/ (как и раньше) \ No newline at end of file diff --git a/openspec/changes/archive-by-year-month/tasks.md b/openspec/changes/archive-by-year-month/tasks.md new file mode 100644 index 0000000..765fa4a --- /dev/null +++ b/openspec/changes/archive-by-year-month/tasks.md @@ -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 после деплоя) \ No newline at end of file