Correctly finish custom emoji entities.

This commit is contained in:
John Preston 2022-06-24 10:48:46 +04:00
parent 87cd0b6127
commit 14a7fc74af

View file

@ -215,14 +215,16 @@ private:
Link, Link,
IndexedLink, IndexedLink,
Spoiler, Spoiler,
CustomEmoji,
}; };
explicit StartedEntity(TextBlockFlags flags); explicit StartedEntity(TextBlockFlags flags);
explicit StartedEntity(uint16 index, Type type); explicit StartedEntity(uint16 index, Type type);
std::optional<TextBlockFlags> flags() const; [[nodiscard]] Type type() const;
std::optional<uint16> lnkIndex() const; [[nodiscard]] std::optional<TextBlockFlags> flags() const;
std::optional<uint16> spoilerIndex() const; [[nodiscard]] std::optional<uint16> lnkIndex() const;
[[nodiscard]] std::optional<uint16> spoilerIndex() const;
private: private:
const int _value = 0; const int _value = 0;
@ -323,6 +325,10 @@ Parser::StartedEntity::StartedEntity(uint16 index, Type type)
: (_value < kStringLinkIndexShift)); : (_value < kStringLinkIndexShift));
} }
Parser::StartedEntity::Type Parser::StartedEntity::type() const {
return _type;
}
std::optional<TextBlockFlags> Parser::StartedEntity::flags() const { std::optional<TextBlockFlags> Parser::StartedEntity::flags() const {
if (_value < int(kStringLinkIndexShift) && (_type == Type::Flags)) { if (_value < int(kStringLinkIndexShift) && (_type == Type::Flags)) {
return TextBlockFlags(_value); return TextBlockFlags(_value);
@ -450,7 +456,9 @@ void Parser::finishEntities() {
_startedEntities.erase(_startedEntities.begin()); _startedEntities.erase(_startedEntities.begin());
while (!list.empty()) { while (!list.empty()) {
if (const auto flags = list.back().flags()) { if (list.back().type() == StartedEntity::Type::CustomEmoji) {
createBlock();
} else if (const auto flags = list.back().flags()) {
if (_flags & (*flags)) { if (_flags & (*flags)) {
createBlock(); createBlock();
_flags &= ~(*flags); _flags &= ~(*flags);
@ -509,9 +517,13 @@ bool Parser::checkEntities() {
link.data = _waitingEntity->data(); link.data = _waitingEntity->data();
link.text = QString(entityBegin, entityLength); link.text = QString(entityBegin, entityLength);
}; };
using Type = StartedEntity::Type;
if (entityType == EntityType::CustomEmoji) { if (entityType == EntityType::CustomEmoji) {
createBlock(); createBlock();
_customEmojiData = _waitingEntity->data(); _customEmojiData = _waitingEntity->data();
_startedEntities[entityEnd].emplace_back(0, Type::CustomEmoji);
} else if (entityType == EntityType::Bold) { } else if (entityType == EntityType::Bold) {
flags = TextBlockFBold; flags = TextBlockFBold;
} else if (entityType == EntityType::Semibold) { } else if (entityType == EntityType::Semibold) {
@ -568,8 +580,6 @@ bool Parser::checkEntities() {
pushComplexUrl(); pushComplexUrl();
} }
using Type = StartedEntity::Type;
if (link.type != EntityType::Invalid) { if (link.type != EntityType::Invalid) {
createBlock(); createBlock();