Make webPage.description a formatted text.

GitOrigin-RevId: b64cf0e915f9fdeeadc8cdee8280fcbb236c92bb
This commit is contained in:
levlam 2020-03-02 16:05:18 +03:00
parent 7ec4c26514
commit ae5588bf11
5 changed files with 67 additions and 6 deletions

View File

@ -1008,7 +1008,7 @@ webPageInstantView page_blocks:vector<PageBlock> version:int32 url:string is_rtl
//@video_note Preview of the content as a video note, if available; may be null //@video_note Preview of the content as a video note, if available; may be null
//@voice_note Preview of the content as a voice note, if available; may be null //@voice_note Preview of the content as a voice note, if available; may be null
//@instant_view_version Version of instant view, available for the web page (currently can be 1 or 2), 0 if none //@instant_view_version Version of instant view, available for the web page (currently can be 1 or 2), 0 if none
webPage url:string display_url:string type:string site_name:string title:string description:string photo:photo embed_url:string embed_type:string embed_width:int32 embed_height:int32 duration:int32 author:string animation:animation audio:audio document:document sticker:sticker video:video video_note:videoNote voice_note:voiceNote instant_view_version:int32 = WebPage; webPage url:string display_url:string type:string site_name:string title:string description:formattedText photo:photo embed_url:string embed_type:string embed_width:int32 embed_height:int32 duration:int32 author:string animation:animation audio:audio document:document sticker:sticker video:video video_note:videoNote voice_note:voiceNote instant_view_version:int32 = WebPage;
//@description Describes an action associated with a bank card number @text Action text @url The URL to be opened //@description Describes an action associated with a bank card number @text Action text @url The URL to be opened

Binary file not shown.

View File

@ -1314,8 +1314,8 @@ vector<MessageEntity> find_entities(Slice text, bool skip_bot_commands, bool onl
vector<MessageEntity> entities; vector<MessageEntity> entities;
if (!only_urls) { if (!only_urls) {
auto add_entities = [&entities, &text](MessageEntity::Type type, vector<Slice> (*find_entities)(Slice)) mutable { auto add_entities = [&entities, &text](MessageEntity::Type type, vector<Slice> (*find_entities_f)(Slice)) mutable {
auto new_entities = find_entities(text); auto new_entities = find_entities_f(text);
for (auto &entity : new_entities) { for (auto &entity : new_entities) {
auto offset = narrow_cast<int32>(entity.begin() - text.begin()); auto offset = narrow_cast<int32>(entity.begin() - text.begin());
auto length = narrow_cast<int32>(entity.size()); auto length = narrow_cast<int32>(entity.size());

View File

@ -41,11 +41,13 @@
#include "td/utils/buffer.h" #include "td/utils/buffer.h"
#include "td/utils/common.h" #include "td/utils/common.h"
#include "td/utils/format.h" #include "td/utils/format.h"
#include "td/utils/HttpUrl.h"
#include "td/utils/logging.h" #include "td/utils/logging.h"
#include "td/utils/misc.h" #include "td/utils/misc.h"
#include "td/utils/Slice.h" #include "td/utils/Slice.h"
#include "td/utils/StringBuilder.h" #include "td/utils/StringBuilder.h"
#include "td/utils/tl_helpers.h" #include "td/utils/tl_helpers.h"
#include "td/utils/utf8.h"
namespace td { namespace td {
@ -1129,10 +1131,63 @@ tl_object_ptr<td_api::webPage> WebPagesManager::get_web_page_object(WebPageId we
} }
return 1; return 1;
}(); }();
FormattedText description;
description.text = web_page->description;
description.entities = find_entities(web_page->description, true);
auto r_url = parse_url(web_page->url);
if (r_url.is_ok()) {
Slice host = r_url.ok().host_;
if (!host.empty() && host.back() == '.') {
host.truncate(host.size() - 1);
}
auto replace_entities = [](Slice text, vector<MessageEntity> &entities, auto replace_url) {
int32 current_offset = 0;
for (auto &entity : entities) {
CHECK(entity.offset >= current_offset);
text = utf8_utf16_substr(text, static_cast<size_t>(entity.offset - current_offset));
auto entity_text = utf8_utf16_substr(text, 0, static_cast<size_t>(entity.length));
text = text.substr(entity_text.size());
current_offset = entity.offset + entity.length;
auto replaced_url = replace_url(entity, entity_text);
if (!replaced_url.empty()) {
entity = MessageEntity(MessageEntity::Type::TextUrl, entity.offset, entity.length, std::move(replaced_url));
}
}
};
if (host == "instagram.com" || ends_with(host, ".instagram.com")) {
replace_entities(description.text, description.entities, [](const MessageEntity &entity, Slice text) {
if (entity.type == MessageEntity::Type::Mention) {
return PSTRING() << "https://www.instagram.com/" << text.substr(1) << '/';
}
if (entity.type == MessageEntity::Type::Hashtag) {
return PSTRING() << "https://www.instagram.com/explore/tags/" << text.substr(1) << '/';
}
return string();
});
}
if (host == "twitter.com" || ends_with(host, ".twitter.com")) {
replace_entities(description.text, description.entities, [](const MessageEntity &entity, Slice text) {
if (entity.type == MessageEntity::Type::Mention) {
return PSTRING() << "https://twitter.com/" << text.substr(1);
}
if (entity.type == MessageEntity::Type::Hashtag) {
return PSTRING() << "https://twitter.com/hashtag/" << text.substr(1);
}
return string();
});
}
}
return make_tl_object<td_api::webPage>( return make_tl_object<td_api::webPage>(
web_page->url, web_page->display_url, web_page->type, web_page->site_name, web_page->title, web_page->description, web_page->url, web_page->display_url, web_page->type, web_page->site_name, web_page->title,
get_photo_object(td_->file_manager_.get(), &web_page->photo), web_page->embed_url, web_page->embed_type, get_formatted_text_object(description), get_photo_object(td_->file_manager_.get(), &web_page->photo),
web_page->embed_dimensions.width, web_page->embed_dimensions.height, web_page->duration, web_page->author, web_page->embed_url, web_page->embed_type, web_page->embed_dimensions.width, web_page->embed_dimensions.height,
web_page->duration, web_page->author,
web_page->document.type == Document::Type::Animation web_page->document.type == Document::Type::Animation
? td_->animations_manager_->get_animation_object(web_page->document.file_id, "get_web_page_object") ? td_->animations_manager_->get_animation_object(web_page->document.file_id, "get_web_page_object")
: nullptr, : nullptr,

View File

@ -89,6 +89,9 @@ T utf8_utf16_truncate(T str, size_t length) {
template <class T> template <class T>
T utf8_substr(T str, size_t offset) { T utf8_substr(T str, size_t offset) {
if (offset == 0) {
return str;
}
auto offset_pos = utf8_truncate(str, offset).size(); auto offset_pos = utf8_truncate(str, offset).size();
return str.substr(offset_pos); return str.substr(offset_pos);
} }
@ -100,6 +103,9 @@ T utf8_substr(T str, size_t offset, size_t length) {
template <class T> template <class T>
T utf8_utf16_substr(T str, size_t offset) { T utf8_utf16_substr(T str, size_t offset) {
if (offset == 0) {
return str;
}
auto offset_pos = utf8_utf16_truncate(str, offset).size(); auto offset_pos = utf8_utf16_truncate(str, offset).size();
return str.substr(offset_pos); return str.substr(offset_pos);
} }