update-3
This commit is contained in:
parent
ef870b985b
commit
50a3f54fff
20
docs/update-3.md
Normal file
20
docs/update-3.md
Normal 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' после каждого блока (кроме завершающего - ссылки), описанного выше
|
||||
|
||||
@ -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 = "<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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user