summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-09-06 22:34:41 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-09-06 22:34:41 +0300
commit8ad01f520af30bfd2d3441a2b893ec71d5e220ea (patch)
treee302e2961e41f4e1e9821b8af02397d84609716a /src
parentUpdate mtxclient (diff)
downloadnheko-8ad01f520af30bfd2d3441a2b893ec71d5e220ea.tar.xz
Add initial support for displaying formatted messages
Diffstat (limited to 'src')
-rw-r--r--src/Utils.h16
-rw-r--r--src/timeline/TimelineItem.cpp37
2 files changed, 33 insertions, 20 deletions
diff --git a/src/Utils.h b/src/Utils.h

index 90c8d9f6..347ece80 100644 --- a/src/Utils.h +++ b/src/Utils.h
@@ -12,6 +12,7 @@ #include <QDateTime> #include <QPixmap> #include <mtx/events/collections.hpp> +#include <mtx/events/common.hpp> namespace utils { @@ -195,4 +196,19 @@ humanReadableFingerprint(const std::string &ed25519); QString humanReadableFingerprint(const QString &ed25519); + +//! Retrieve the message body taking into account the `formatted_body` field. +//! If the `format` of the message is not supported we fallback to `body`. +template<typename RoomMessageT> +QString +get_message_body(const RoomMessageT &event) +{ + if (event.content.format.empty()) + return QString::fromStdString(event.content.body); + + if (event.content.format != common::FORMAT_MSG_TYPE) + return QString::fromStdString(event.content.body); + + return QString::fromStdString(event.content.formatted_body); +} } diff --git a/src/timeline/TimelineItem.cpp b/src/timeline/TimelineItem.cpp
index 8726ec59..7548a5a5 100644 --- a/src/timeline/TimelineItem.cpp +++ b/src/timeline/TimelineItem.cpp
@@ -436,7 +436,9 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Notice event_id_ = QString::fromStdString(event.event_id); const auto sender = QString::fromStdString(event.sender); const auto timestamp = QDateTime::fromMSecsSinceEpoch(event.origin_server_ts); - auto body = QString::fromStdString(event.content.body).trimmed().toHtmlEscaped(); + + auto formatted_body = utils::get_message_body(event).trimmed(); + auto body = QString::fromStdString(event.content.body).trimmed(); descriptionMsg_ = {Cache::displayName(room_id_, sender), sender, @@ -446,20 +448,18 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Notice generateTimestamp(timestamp); - body.replace(conf::strings::url_regex, conf::strings::url_html); - body.replace("\n", "<br/>"); - body = "<i>" + body + "</i>"; + formatted_body = "<i>" + formatted_body + "</i>"; if (with_sender) { auto displayName = Cache::displayName(room_id_, sender); - generateBody(sender, displayName, body); + generateBody(sender, displayName, formatted_body); setupAvatarLayout(displayName); AvatarProvider::resolve( room_id_, sender, this, [this](const QImage &img) { setUserAvatar(img); }); } else { - generateBody(body); + generateBody(formatted_body); setupSimpleLayout(); } @@ -484,26 +484,25 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Emote> event_id_ = QString::fromStdString(event.event_id); const auto sender = QString::fromStdString(event.sender); - auto body = QString::fromStdString(event.content.body).trimmed(); + auto formatted_body = utils::get_message_body(event).trimmed(); + auto body = QString::fromStdString(event.content.body).trimmed(); + auto timestamp = QDateTime::fromMSecsSinceEpoch(event.origin_server_ts); auto displayName = Cache::displayName(room_id_, sender); - auto emoteMsg = QString("* %1 %2").arg(displayName).arg(body); + auto emoteMsg = QString("* %1 %2").arg(displayName).arg(formatted_body); descriptionMsg_ = {"", sender, emoteMsg, utils::descriptiveTime(timestamp), timestamp}; generateTimestamp(timestamp); - emoteMsg = emoteMsg.toHtmlEscaped(); - emoteMsg.replace(conf::strings::url_regex, conf::strings::url_html); - emoteMsg.replace("\n", "<br/>"); if (with_sender) { - generateBody(sender, displayName, emoteMsg); + generateBody(sender, displayName, formatted_body); setupAvatarLayout(displayName); AvatarProvider::resolve( room_id_, sender, this, [this](const QImage &img) { setUserAvatar(img); }); } else { - generateBody(emoteMsg); + generateBody(formatted_body); setupSimpleLayout(); } @@ -528,7 +527,9 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Text> event_id_ = QString::fromStdString(event.event_id); const auto sender = QString::fromStdString(event.sender); - auto body = QString::fromStdString(event.content.body).trimmed(); + auto formatted_body = utils::get_message_body(event).trimmed(); + auto body = QString::fromStdString(event.content.body).trimmed(); + auto timestamp = QDateTime::fromMSecsSinceEpoch(event.origin_server_ts); auto displayName = Cache::displayName(room_id_, sender); @@ -541,18 +542,14 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Text> generateTimestamp(timestamp); - body = body.toHtmlEscaped(); - body.replace(conf::strings::url_regex, conf::strings::url_html); - body.replace("\n", "<br/>"); - if (with_sender) { - generateBody(sender, displayName, body); + generateBody(sender, displayName, formatted_body); setupAvatarLayout(displayName); AvatarProvider::resolve( room_id_, sender, this, [this](const QImage &img) { setUserAvatar(img); }); } else { - generateBody(body); + generateBody(formatted_body); setupSimpleLayout(); }