From 36ebd42a92620b3b7e9b192f79a4dfd33c985e8b Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 21 May 2024 11:50:41 +0300 Subject: [PATCH] Allow attributes without value and support expandable blockquote entities in HTML parse_mode. --- td/telegram/MessageEntity.cpp | 23 ++++++++++++++++++----- test/message_entities.cpp | 11 ++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/td/telegram/MessageEntity.cpp b/td/telegram/MessageEntity.cpp index 76530e67c..0ce83e0ca 100644 --- a/td/telegram/MessageEntity.cpp +++ b/td/telegram/MessageEntity.cpp @@ -3261,7 +3261,8 @@ Result> parse_html(string &str) { break; } auto attribute_begin_pos = i; - while (!is_space(text[i]) && text[i] != '=') { + while (!is_space(text[i]) && text[i] != '=' && text[i] != '>' && text[i] != '/' && text[i] != '"' && + text[i] != '\'') { i++; } Slice attribute_name(text + attribute_begin_pos, i - attribute_begin_pos); @@ -3273,8 +3274,14 @@ Result> parse_html(string &str) { i++; } if (text[i] != '=') { - return Status::Error(400, PSLICE() << "Expected equal sign in declaration of an attribute of the tag \"" - << tag_name << "\" at byte offset " << begin_pos); + if (text[i] == 0) { + return Status::Error(400, PSLICE() + << "Unclosed start tag \"" << tag_name << "\" at byte offset " << begin_pos); + } + if (tag_name == "blockquote" && attribute_name == Slice("expandable")) { + argument = "1"; + } + continue; } i++; while (text[i] != 0 && is_space(text[i])) { @@ -3331,6 +3338,8 @@ Result> parse_html(string &str) { argument = attribute_value.substr(3); } else if (tag_name == "tg-emoji" && attribute_name == Slice("emoji-id")) { argument = std::move(attribute_value); + } else if (tag_name == "blockquote" && attribute_name == Slice("expandable")) { + argument = "1"; } } @@ -3416,7 +3425,11 @@ Result> parse_html(string &str) { nested_entities.back().argument); } } else if (tag_name == "blockquote") { - entities.emplace_back(MessageEntity::Type::BlockQuote, entity_offset, entity_length); + if (!nested_entities.back().argument.empty()) { + entities.emplace_back(MessageEntity::Type::ExpandableBlockQuote, entity_offset, entity_length); + } else { + entities.emplace_back(MessageEntity::Type::BlockQuote, entity_offset, entity_length); + } } else { UNREACHABLE(); } @@ -3426,7 +3439,7 @@ Result> parse_html(string &str) { } if (!nested_entities.empty()) { return Status::Error( - 400, PSLICE() << "Can't find end tag corresponding to start tag " << nested_entities.back().tag_name); + 400, PSLICE() << "Can't find end tag corresponding to start tag \"" << nested_entities.back().tag_name << '"'); } for (auto &entity : entities) { diff --git a/test/message_entities.cpp b/test/message_entities.cpp index d0ee0a79d..22a48515c 100644 --- a/test/message_entities.cpp +++ b/test/message_entities.cpp @@ -1243,8 +1243,7 @@ TEST(MessageEntities, parse_html) { check_parse_html("🏟 🏟<", "Unsupported start tag \"abac\" at byte offset 13"); check_parse_html("🏟 🏟<", "Unsupported start tag \"abac\" at byte offset 13"); check_parse_html("🏟 🏟<", "Empty attribute name in the tag \"i\" at byte offset 13"); - check_parse_html("🏟 🏟<", - "Expected equal sign in declaration of an attribute of the tag \"i\" at byte offset 13"); + check_parse_html("🏟 🏟<", "Can't find end tag corresponding to start tag \"i\""); check_parse_html("🏟 🏟<", "Unclosed start tag at byte offset 13"); @@ -1352,8 +1351,14 @@ TEST(MessageEntities, parse_html) { check_parse_html("🏟 🏟🏟1", "🏟 🏟🏟1", {{td::MessageEntity::Type::Bold, 5, 3}, {td::MessageEntity::Type::CustomEmoji, 5, 2, td::CustomEmojiId(static_cast(1))}}); - check_parse_html("
a<
b;", "aa<
b;", "aa<
b;", "aa<
b;", "aa<
b;", "a