Make webPage.description a formatted text.
GitOrigin-RevId: b64cf0e915f9fdeeadc8cdee8280fcbb236c92bb
This commit is contained in:
parent
7ec4c26514
commit
ae5588bf11
@ -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.
@ -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());
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user