cb4decb672
- hugo.toml: ShowFullTextinRSS=true, [services.RSS] limit=5 - тема rDedInit rss.xml: prepend cover (figure.entry-cover, absURL) в content:encoded - openspec change rss-full-feed (план A реализован)
73 lines
3.9 KiB
Markdown
73 lines
3.9 KiB
Markdown
# RSS Feed Capability
|
||
|
||
## ADDED Requirements
|
||
|
||
### Requirement: R1 — Лимит постов в RSS-ленте
|
||
|
||
Главная RSS-лента (`/index.xml`) MUST содержать не более 5 последних постов
|
||
(по `publishDate`), отсортированных по дате публикации по убыванию.
|
||
|
||
#### Scenario: Сборка сайта даёт ровно 5 элементов item
|
||
|
||
GIVEN сайт собран командой `hugo --minify`
|
||
WHEN запрашивается `https://dedinit.ru/index.xml` (файл `public/index.xml`)
|
||
THEN число элементов `<item>` в `<channel>` равно 5 (или меньше, если постов < 5),
|
||
и это 5 самых свежих постов по дате.
|
||
|
||
### Requirement: R2 — Полный текст поста в RSS
|
||
|
||
Каждый `<item>` главной RSS-ленты MUST содержать `<content:encoded>` с полным
|
||
HTML-контентом поста (поле `.Content` темы Hugo), обёрнутым в CDATA, включая
|
||
разметку, блоки кода и абсолютные ссылки на медиафайлы поста.
|
||
|
||
#### Scenario: content:encoded присутствует и содержит медиа-URL
|
||
|
||
GIVEN сайт собран командой `hugo --minify`
|
||
WHEN в `public/index.xml` смотреть элемент `<item>` любого из 5 последних постов
|
||
THEN присутствует непустой `<content:encoded>`, содержащий HTML поста и ссылки
|
||
вида `https://dedinit.ru/<год>/<slug>/hero.svg` (или аналогичные абсолютные URL
|
||
медиа).
|
||
|
||
### Requirement: R3 — Описание поста в RSS
|
||
|
||
`<description>` каждого `<item>` MUST быть непустым: используется frontmatter
|
||
`description` если задан, иначе авто-summary `.Summary`.
|
||
|
||
#### Scenario: description непустое
|
||
|
||
GIVEN сайт собран командой `hugo --minify`
|
||
WHEN в `public/index.xml` смотреть `<description>` каждого `<item>`
|
||
THEN оно непустое и не содержит обрезанных HTML-тегов.
|
||
|
||
### Requirement: R4 — Метаданные элемента RSS
|
||
|
||
Каждый `<item>` MUST содержать корректные `<title>`, `<link>`, `<pubDate>`,
|
||
`<guid>` (permalink), согласно текущему шаблону темы
|
||
`themes/rDedInit/layouts/_default/rss.xml`.
|
||
|
||
#### Scenario: Обязательные поля элемента
|
||
|
||
GIVEN сайт собран командой `hugo --minify`
|
||
WHEN парсить `public/index.xml` как XML
|
||
THEN каждый `<item>` содержит все 4 обязательных поля, `<link>` и `<guid>`
|
||
равны полному URL поста (`https://dedinit.ru/<год>/<slug>/`).
|
||
|
||
### Requirement: R5 — Медиа-обложка в RSS
|
||
|
||
Каждый `<item>` MUST включать в `<content:encoded>` обложку поста
|
||
(`cover.image`, hero.svg) как `<figure class="entry-cover"><img ...></figure>`
|
||
перед полным текстом, со ссылкой на абсолютный URL медиафайла
|
||
(`https://dedinit.ru/<год>/<slug>/hero.svg`), если `cover.image` задан.
|
||
|
||
#### Scenario: Обложка в content:encoded
|
||
|
||
GIVEN сайт собран командой `hugo --minify`
|
||
WHEN в `public/index.xml` смотреть `<content:encoded>` поста с cover.image
|
||
THEN он начинается с `<figure class="entry-cover">` и содержит
|
||
`<img src="https://dedinit.ru/<год>/<slug>/hero.svg"`.
|
||
|
||
#### Scenario: Нет cover — нет figure
|
||
|
||
GIVEN сайт собран командой `hugo --minify`
|
||
WHEN в `<content:encoded>` поста без cover.image
|
||
THEN отсутствует `<figure class="entry-cover">`, контент начинается с текста поста. |