Нечестиві Jabber-клієнти

Вже не вперше доводиться спілкуватися з людьми в Jabber-мережі. Зручно, вільно, відкрито. Та й клієнтів, що підтримують її, ціла купа. Комусь подобаються аскетичні клієнти типу tkabber, комусь до вподоби багатофункціональні комбайни, як MirandaIM, Kopete, хтось обрав для себе Pidgin/Gaim, Gajim чи Cocinella. До недавнього часу таке розмаїття клієнтів нічим особливим не виділялося, до моменту, коли в розмові я побачив наступне:

Вікно клієнта PidginВікно клієнта tkabber

На рисунку в мене запущено 2 клієнти: tkabber і pidgin. всі повідомлення, які набрані в tkabber-і займають один рядок і виводяться звичайним шрифтом. Тим не менше, всі повідомлення, надіслані з клієнта pidgin примусово виводяться в новому рядку і до того ж іншим шрифтом, після чого обов’язково робиться пропуск рядка. Мене такий хід подій нічим не радував, і я вирішив розібратися, в чому причина такої дивної поведінки клієнтів. На щастя, tkabber в своєму складі містить необхідний інструментарій для дослідження сирого XML повідомлення.

Відкриваємо вкладку “Сирий XML” і серед купи повідомлень виберемо кілька для порівняння(в даному випадку було взято одне повідомлення, написане клієнтом Gaim, одне з Pidgin і одне з tkabber-a), попередньо прибравши інформацію, що не стосується оформлення повідомлення:

<message from='Jolly_Roger@jabber.kiev.ua/Gaim'
	to='Jolly_Roger@jabber.kiev.ua/home'
	type='chat'>
  <body>мама мила раму</body>
  <html xmlns='http://jabber.org/protocol/xhtml-im'>
    <body xmlns='http://www.w3.org/1999/xhtml'>
      <span style='font-size: small; '>мама мила раму</span>
    </body>
  </html>
</message>
<message from='Jolly_Roger@jabber.kiev.ua/Pidgin'
	to='Jolly_Roger@jabber.kiev.ua/tkabber'
	type='chat'>
  <body>мама мила раму</body>
  <html xmlns='http://jabber.org/protocol/xhtml-im'>
    <body xmlns='http://www.w3.org/1999/xhtml'>мама мила раму</body>
  </html>
</message>
<message from='Jolly_Roger@jabber.kiev.ua/tkabber'
	to='Jolly_Roger@jabber.kiev.ua/Pidgin'
	type='chat'>
  <body>мама мила раму</body>
</message>

В першому повідомленні, відісланому з Gaim на tkabber, одразу кидається в очі HTML-форматування за допомогою тегу <span> та відповідної настройки шрифта. Тим не менше, в самому повідомленні присутні 2 теги <body>:в одному лише сирий текст, інший тег містить форматований вивід тексту(детально про розмітку в специфікації XEP-0071: XHTML-IM ). Відповідно до бізнес-правил обробки повідомлень клієнтами, більшим пріоритетом між XHTML-IM та plain-text повідомленнями володіє саме XHTML, а тому він і відображається. Тобто по специфікації все виходить правильно, в чому ж тоді причина?

Як виявилося, Gaim(саме так раніше називався Pidgin) за замовчуванням усі повідомлення форматує як XHTML з обов’язковим включенням тегу span. Це досить нерозумно з боку розробників нав’язувати всім іншим власний стиль форматування повідомлень, особливо, якщо врахувати, що вибрати між відсиланням “сирого” тексту та форматованого неможливо.

Не може не радувати те, що в Pidgin подібного форматування немає(правда, опції надсилання plain-text повідомлень я так і не знайшов). Однак проблема не була вирішена: tkabber відділяє XHTM-розмітку знизу і зверху переносом рядка. На щастя, сам tkabber можна налаштувати так, щоб всі повідомлення відображалися як plain-text. Для цього слід зняти опцію ::plugins::xhtml::options(enable) (Налаштування > Chat > Дозволити зображення повідомлень, форматованих за допомогою XHTML) і радуватись життю.
P.S. Особисто мене не може не радувати те, що за час написання цієї замітки я трохи освоївся в роботі зі специфікаціями і внутрішньою розміткою XMPP-повідомлення.