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)