This commit is contained in:
bvn13 2026-03-23 10:50:20 +03:00
parent ef870b985b
commit 05c4016747
2 changed files with 35 additions and 16 deletions

20
docs/update-3.md Normal file
View File

@ -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. но блоки <p> необходимо отделять друг от друга двумя блоками <br/>
4. fallback <body> должен содержать двойные '\n' после каждого блока (кроме завершающего - ссылки), описанного выше

View File

@ -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)
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 = "<br/><br/>"
parts = ['<body xmlns="http://www.w3.org/1999/xhtml">']
parts.append(f'<p><img src="{item.image_url}" alt="" /></p>')
parts.append(f'<p>{item.title}</p>')
if item.image_url:
parts.append(f'<p><img src="{item.image_url}" alt="" /></p>{SEP}')
parts.append(f'<p>{item.title}</p>{SEP}')
if item.summary:
parts.append(f'<p>{item.summary}</p>')
parts.append(f'<p>{item.summary}</p>{SEP}')
parts.append(f'<p><a href="{item.link}">{item.link}</a></p>')
parts.append('</body>')
return ''.join(parts)