From 05c4016747f31f0f0f6a555bdefb28e363335636 Mon Sep 17 00:00:00 2001 From: bvn13 Date: Mon, 23 Mar 2026 10:50:20 +0300 Subject: [PATCH] update-3 --- docs/update-3.md | 20 +++++++++++++++++ src/adapters/jabber/news_publisher.py | 31 +++++++++++++-------------- 2 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 docs/update-3.md diff --git a/docs/update-3.md b/docs/update-3.md new file mode 100644 index 0000000..da0013a --- /dev/null +++ b/docs/update-3.md @@ -0,0 +1,20 @@ +# Обновление 3 + +## Задача + +1. в обновлении docs/update-2.md были добавлены description и картинка новости в ее текст +2. но оформление новости выглядит хорошим (user exp) только в случае, когда есть заголовок, описание и ссылка +3. необходимо для всех вариантов наполнения новостей из RSS разделить двумя переводами строки блоки: + +- картинка (если есть, то отделяем разрывом в два перевода строки) +- заголовок (есть всегда, после него разрыв) +- дескрипшен (если есть, то отделяем после него разывом) +- ссылка (есть всегда, после нее не нужен разрыв, т.к. это завершающий блок) + +## Техническая реализация + +1. в docs/update-2.md было реализовано 2 метода отправки новостей: _build_plain и _build_xhtml - выбор определяется наличием ссылки на картинку +2. необходимо отказаться от _build_plain в пользу _build_xhtml при любых вариантах - это даст новостям одинаковый вид +3. но блоки

необходимо отделять друг от друга двумя блоками
+4. fallback должен содержать двойные '\n' после каждого блока (кроме завершающего - ссылки), описанного выше + diff --git a/src/adapters/jabber/news_publisher.py b/src/adapters/jabber/news_publisher.py index 154d805..4cbbd5d 100644 --- a/src/adapters/jabber/news_publisher.py +++ b/src/adapters/jabber/news_publisher.py @@ -14,32 +14,31 @@ class JabberNewsPublisher(NewsPublisher): async def publish(self, room_jid: str, item: NewsItem) -> bool: """ - Отправляет новость в комнату. - Если есть картинка — использует XHTML-IM (XEP-0071). + Отправляет новость в комнату через XHTML-IM (XEP-0071) с plain-text fallback. Возвращает False если бот не в комнате. """ plain = self._build_plain(item) - if item.image_url: - xhtml = self._build_xhtml(item) - logger.debug( - "Публикация XHTML в %s\n--- plain ---\n%s\n--- xhtml ---\n%s", - room_jid, plain, xhtml, - ) - return await self._connection.send_to_room_xhtml(room_jid, plain, xhtml) - logger.debug("Публикация plain-text в %s\n%s", room_jid, plain) - return await self._connection.send_to_room(room_jid, plain) + xhtml = self._build_xhtml(item) + return await self._connection.send_to_room_xhtml(room_jid, plain, xhtml) def _build_plain(self, item: NewsItem) -> str: + blocks = [] + if item.image_url: + blocks.append(item.image_url) + blocks.append(item.title) if item.summary: - return f"{item.title}\n\n{item.summary}\n\n{item.link}" - return f"{item.title}\n{item.link}" + blocks.append(item.summary) + blocks.append(item.link) + return "\n\n".join(blocks) def _build_xhtml(self, item: NewsItem) -> str: + SEP = "

" parts = [''] - parts.append(f'

') - parts.append(f'

{item.title}

') + if item.image_url: + parts.append(f'

{SEP}') + parts.append(f'

{item.title}

{SEP}') if item.summary: - parts.append(f'

{item.summary}

') + parts.append(f'

{item.summary}

{SEP}') parts.append(f'

{item.link}

') parts.append('') return ''.join(parts)