diff --git a/Telegram/SourceFiles/iv/iv_prepare.cpp b/Telegram/SourceFiles/iv/iv_prepare.cpp index ff21e4e55..6069d4407 100644 --- a/Telegram/SourceFiles/iv/iv_prepare.cpp +++ b/Telegram/SourceFiles/iv/iv_prepare.cpp @@ -51,7 +51,7 @@ template >> return Number(base::SafeRound(value * 10000.) / 100.); }; -[[nodiscard]] QByteArray EscapeAttr(QByteArray value) { +[[nodiscard]] QByteArray Escape(QByteArray value) { auto result = QByteArray(); result.reserve(value.size()); for (const auto &ch : value) { @@ -67,8 +67,8 @@ template >> return result; } -[[nodiscard]] QByteArray EscapeText(QByteArray value) { - return EscapeAttr(value); +[[nodiscard]] QByteArray Date(TimeId date) { + return Escape(langDateTimeFull(base::unixtime::parse(date)).toUtf8()); } class Parser final { @@ -391,9 +391,7 @@ QByteArray Parser::block(const MTPDpageBlockSubtitle &data) { QByteArray Parser::block(const MTPDpageBlockAuthorDate &data) { auto inner = rich(data.vauthor()); if (const auto date = data.vpublished_date().v) { - const auto parsed = base::unixtime::parse(date); - inner += " \xE2\x80\xA2 " - + tag("time", EscapeText(langDateTimeFull(parsed).toUtf8())); + inner += " \xE2\x80\xA2 " + tag("time", Date(date)); } return tag("address", inner); } @@ -412,7 +410,7 @@ QByteArray Parser::block(const MTPDpageBlockParagraph &data) { QByteArray Parser::block(const MTPDpageBlockPreformatted &data) { auto list = Attributes(); - const auto language = EscapeAttr(utf(data.vlanguage())); + const auto language = utf(data.vlanguage()); if (!language.isEmpty()) { list.push_back({ "data-language", language }); list.push_back({ "class", "lang-" + language }); @@ -430,7 +428,7 @@ QByteArray Parser::block(const MTPDpageBlockDivider &data) { } QByteArray Parser::block(const MTPDpageBlockAnchor &data) { - return tag("a", { { "name", EscapeAttr(utf(data.vname())) } }); + return tag("a", { { "name", utf(data.vname()) } }); } QByteArray Parser::block(const MTPDpageBlockList &data) { @@ -507,15 +505,13 @@ QByteArray Parser::block( }; auto result = tag("div", attributes, inner); - const auto href = data.vurl() - ? utf(*data.vurl()) - : photoFullUrl(photo); + const auto href = data.vurl() ? utf(*data.vurl()) : photoFullUrl(photo); const auto id = Number(photo.id); result = tag("a", { { "href", href }, { "oncontextmenu", data.vurl() ? QByteArray() : "return false;" }, { "data-context", data.vurl() ? QByteArray() : "viewer-photo" + id }, - }, result); + }, result); if (!slideshow) { result += caption(data.vcaption()); } @@ -621,9 +617,9 @@ QByteArray Parser::block(const MTPDpageBlockEmbed &data) { attributes.push_back({ "height", iframeHeight }); if (const auto url = data.vurl()) { if (!autosize) { - attributes.push_back({ "src", EscapeAttr(utf(url)) }); + attributes.push_back({ "src", utf(url) }); } else { - attributes.push_back({ "srcdoc", EscapeAttr(utf(url)) }); + attributes.push_back({ "srcdoc", utf(url) }); } } else if (const auto html = data.vhtml()) { attributes.push_back({ "src", embedUrl(html->v) }); @@ -661,12 +657,10 @@ QByteArray Parser::block(const MTPDpageBlockEmbedPost &data) { address += tag( "a", { { "rel", "author" }, { "onclick", "return false;" } }, - EscapeText(utf(data.vauthor()))); + utf(data.vauthor())); if (const auto date = data.vdate().v) { const auto parsed = base::unixtime::parse(date); - address += tag( - "time", - EscapeText(langDateTimeFull(parsed).toUtf8())); + address += tag("time", Date(date)); } const auto inner = tag("address", address) + list(data.vblocks()); result = tag("blockquote", { { "class", "embed-post" } }, inner); @@ -675,7 +669,7 @@ QByteArray Parser::block(const MTPDpageBlockEmbedPost &data) { const auto inner = tag("strong", utf(data.vauthor())) + tag( "small", - tag("a", { { "href", EscapeAttr(url) } }, EscapeText(url))); + tag("a", { { "href", url } }, url)); result = tag("section", { { "class", "embed-post" } }, inner); } result += caption(data.vcaption()); @@ -732,7 +726,7 @@ QByteArray Parser::block(const MTPDpageBlockChannel &data) { : "https://t.me/" + username; result = tag( "a", - { { "href", EscapeAttr(link) }, { "data-context", "channel" + id } }, + { { "href", link }, { "data-context", "channel" + id } }, result); _result.channelIds.emplace(id); return tag("section", { @@ -839,23 +833,21 @@ QByteArray Parser::block(const MTPDpageRelatedArticle &data) { inner += tag( "span", { { "class", "related-link-title" } }, - EscapeText(utf(*title))); + utf(*title)); } if (description) { inner += tag( "span", { { "class", "related-link-desc" } }, - EscapeText(utf(*description))); + utf(*description)); } if (author || published) { - const auto separator = (author && published) ? ", " : ""; - const auto parsed = base::unixtime::parse(published->v); inner += tag( "span", { { "class", "related-link-source" } }, - EscapeText((author ? utf(*author) : QByteArray()) - + separator - + langDateTimeFull(parsed).toUtf8())); + ((author ? utf(*author) : QByteArray()) + + ((author && published) ? ", " : QByteArray()) + + (published ? Date(published->v) : QByteArray()))); } result += tag("span", { { "class", "related-link-content" }, @@ -912,22 +904,25 @@ QByteArray Parser::block(const MTPDpageListItemBlocks &data) { } QByteArray Parser::block(const MTPDpageListOrderedItemText &data) { - return tag("li", { { "value", utf(data.vnum()) } }, rich(data.vtext())); + return tag( + "li", + { { "value", utf(data.vnum()) } }, + rich(data.vtext())); } QByteArray Parser::block(const MTPDpageListOrderedItemBlocks &data) { return tag( "li", - { { "value", EscapeAttr(utf(data.vnum())) } }, + { { "value", utf(data.vnum()) } }, list(data.vblocks())); } QByteArray Parser::utf(const MTPstring &text) { - return text.v; + return Escape(text.v); } QByteArray Parser::utf(const tl::conditional &text) { - return text ? text->v : QByteArray(); + return text ? utf(*text) : QByteArray(); } QByteArray Parser::tag( @@ -965,7 +960,7 @@ QByteArray Parser::rich(const MTPRichText &text) { { "\xE2\x81\xA8", "" }, { "\xE2\x81\xA9", "" }, }; - auto text = EscapeText(utf(data.vtext())); + auto text = utf(data.vtext()); for (const auto &[from, to] : replacements) { text.replace(from, to); } @@ -1016,8 +1011,8 @@ QByteArray Parser::rich(const MTPRichText &text) { }, rich(data.vtext())); }, [&](const MTPDtextEmail &data) { return tag("a", { - { "href", "mailto:" + EscapeAttr(utf(data.vemail())) }, - }, rich(data.vtext())); + { "href", "mailto:" + utf(data.vemail()) }, + }, rich(data.vtext())); }, [&](const MTPDtextSubscript &data) { return tag("sub", rich(data.vtext())); }, [&](const MTPDtextSuperscript &data) { @@ -1026,11 +1021,11 @@ QByteArray Parser::rich(const MTPRichText &text) { return tag("mark", rich(data.vtext())); }, [&](const MTPDtextPhone &data) { return tag("a", { - { "href", "tel:" + EscapeAttr(utf(data.vphone())) }, + { "href", "tel:" + utf(data.vphone()) }, }, rich(data.vtext())); }, [&](const MTPDtextAnchor &data) { const auto inner = rich(data.vtext()); - const auto name = EscapeAttr(utf(data.vname())); + const auto name = utf(data.vname()); return inner.isEmpty() ? tag("a", { { "name", name } }) : tag(