refactor: merge adjecent words into one TextElement (#5847)

This commit is contained in:
nerix
2025-01-22 23:25:00 +01:00
committed by GitHub
parent ea02a42162
commit 0a3cc1deed
42 changed files with 289 additions and 2719 deletions
+49 -19
View File
@@ -526,8 +526,7 @@ MessageBuilder::MessageBuilder(SystemMessageTag, const QString &text,
continue;
}
this->emplace<TextElement>(word, MessageElementFlag::Text,
MessageColor::System);
this->appendOrEmplaceText(word, MessageColor::System);
}
this->message().flags.set(MessageFlag::System);
this->message().flags.set(MessageFlag::DoNotTriggerNotification);
@@ -552,8 +551,7 @@ MessagePtrMut MessageBuilder::makeSystemMessageWithUser(
continue;
}
builder.emplace<TextElement>(word, MessageElementFlag::Text,
MessageColor::System);
builder.appendOrEmplaceText(word, MessageColor::System);
}
builder->flags.set(MessageFlag::System);
@@ -619,8 +617,7 @@ MessagePtrMut MessageBuilder::makeSubgiftMessage(const QString &text,
continue;
}
builder.emplace<TextElement>(word, MessageElementFlag::Text,
MessageColor::System);
builder.appendOrEmplaceText(word, MessageColor::System);
}
builder->flags.set(MessageFlag::System);
@@ -743,18 +740,18 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count)
this->emplaceSystemTextAndUpdate("were", text);
if (action.isBan())
{
this->emplaceSystemTextAndUpdate("banned", text);
this->appendOrEmplaceSystemTextAndUpdate("banned", text);
}
else
{
this->emplaceSystemTextAndUpdate(
this->appendOrEmplaceSystemTextAndUpdate(
QString("timed out for %1").arg(formatTime(action.duration)),
text);
}
if (!action.source.login.isEmpty())
{
this->emplaceSystemTextAndUpdate("by", text);
this->appendOrEmplaceSystemTextAndUpdate("by", text);
this->emplaceSystemTextAndUpdate(
action.source.login + (action.reason.isEmpty() ? "." : ":"),
text)
@@ -763,7 +760,7 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count)
if (!action.reason.isEmpty())
{
this->emplaceSystemTextAndUpdate(
this->appendOrEmplaceSystemTextAndUpdate(
QString("\"%1\".").arg(action.reason), text);
}
}
@@ -812,7 +809,7 @@ MessageBuilder::MessageBuilder(const BanAction &action, uint32_t count)
if (count > 1)
{
this->emplaceSystemTextAndUpdate(
this->appendOrEmplaceSystemTextAndUpdate(
QString("(%1 times)").arg(count), text);
}
}
@@ -1226,6 +1223,42 @@ bool MessageBuilder::isIgnored(const QString &originalMessage,
});
}
void MessageBuilder::appendOrEmplaceText(const QString &text,
MessageColor color)
{
auto fallback = [&] {
this->emplace<TextElement>(text, MessageElementFlag::Text, color);
};
if (this->message_->elements.empty())
{
fallback();
return;
}
auto *back =
dynamic_cast<TextElement *>(this->message_->elements.back().get());
if (!back || //
dynamic_cast<MentionElement *>(back) || //
dynamic_cast<LinkElement *>(back) || //
!back->hasTrailingSpace() || //
back->getFlags() != MessageElementFlag::Text || //
back->color() != color)
{
fallback();
return;
}
back->appendText(text);
}
void MessageBuilder::appendOrEmplaceSystemTextAndUpdate(const QString &text,
QString &toUpdate)
{
toUpdate.append(text);
toUpdate.append(' ');
this->appendOrEmplaceText(text, MessageColor::System);
}
void MessageBuilder::triggerHighlights(const Channel *channel,
const HighlightAlert &alert)
{
@@ -1759,22 +1792,19 @@ MessagePtr MessageBuilder::makeAutomodInfoMessage(
QString info("Hey! Your message is being checked "
"by mods and has not been sent.");
text += info;
builder.emplace<TextElement>(info, MessageElementFlag::Text,
MessageColor::Text);
builder.appendOrEmplaceText(info, MessageColor::Text);
}
break;
case AutomodInfoAction::Denied: {
QString info("Mods have removed your message.");
text += info;
builder.emplace<TextElement>(info, MessageElementFlag::Text,
MessageColor::Text);
builder.appendOrEmplaceText(info, MessageColor::Text);
}
break;
case AutomodInfoAction::Approved: {
QString info("Mods have accepted your message.");
text += info;
builder.emplace<TextElement>(info, MessageElementFlag::Text,
MessageColor::Text);
builder.appendOrEmplaceText(info, MessageColor::Text);
}
break;
}
@@ -2019,7 +2049,7 @@ MessagePtrMut MessageBuilder::makeClearChatMessage(const QDateTime &now,
if (count > 1)
{
builder.emplaceSystemTextAndUpdate(
builder.appendOrEmplaceSystemTextAndUpdate(
'(' % QString::number(count) % u" times)", messageText);
}
@@ -2332,7 +2362,7 @@ void MessageBuilder::addTextOrEmote(TextState &state, QString string)
}
}
this->emplace<TextElement>(string, MessageElementFlag::Text, textColor);
this->appendOrEmplaceText(string, textColor);
}
bool MessageBuilder::isEmpty() const
+4
View File
@@ -168,6 +168,10 @@ public:
return pointer;
}
void appendOrEmplaceText(const QString &text, MessageColor color);
void appendOrEmplaceSystemTextAndUpdate(const QString &text,
QString &toUpdate);
static void triggerHighlights(const Channel *channel,
const HighlightAlert &alert);
+6
View File
@@ -17,6 +17,12 @@ struct MessageColor {
QString toString() const;
bool operator==(const MessageColor &other) const noexcept
{
return this->type_ == other.type_ &&
this->customColor_ == other.customColor_;
}
private:
Type type_;
QColor customColor_;
+43
View File
@@ -674,6 +674,49 @@ void TextElement::addToContainer(MessageLayoutContainer &container,
}
}
const MessageColor &TextElement::color() const noexcept
{
return this->color_;
}
FontStyle TextElement::fontStyle() const noexcept
{
return this->style_;
}
void TextElement::appendText(QStringView text)
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
for (auto word : text.split(' ')) // creates a QList
#else
for (auto word : text.tokenize(u' '))
#endif
{
this->words_.append(word.toString());
}
}
void TextElement::appendText(const QString &text)
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
this->appendText(QStringView{text});
#else
qsizetype firstSpace = text.indexOf(u' ');
if (firstSpace == -1)
{
// reuse (ref) `text`
this->words_.emplace_back(text);
return;
}
this->words_.emplace_back(text.sliced(0, firstSpace));
for (auto word : QStringView{text}.sliced(firstSpace + 1).tokenize(u' '))
{
this->words_.emplace_back(word.toString());
}
#endif
}
QJsonObject TextElement::toJson() const
{
auto base = MessageElement::toJson();
+6
View File
@@ -250,6 +250,12 @@ public:
QJsonObject toJson() const override;
const MessageColor &color() const noexcept;
FontStyle fontStyle() const noexcept;
void appendText(QStringView text);
void appendText(const QString &text);
protected:
QStringList words_;