Add sort_entities function.
GitOrigin-RevId: 0026fb224c77cd895ed8f5c38a99a267efb95f84
This commit is contained in:
parent
532567a475
commit
08d32673a3
@ -1142,6 +1142,14 @@ vector<std::pair<Slice, bool>> find_urls(Slice str) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sort_entities(vector<MessageEntity> &entities) {
|
||||||
|
if (std::is_sorted(entities.begin(), entities.end())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sort(entities.begin(), entities.end());
|
||||||
|
}
|
||||||
|
|
||||||
#define check_is_sorted(entities) check_is_sorted_impl(entities, __LINE__)
|
#define check_is_sorted(entities) check_is_sorted_impl(entities, __LINE__)
|
||||||
static void check_is_sorted_impl(const vector<MessageEntity> &entities, int line) {
|
static void check_is_sorted_impl(const vector<MessageEntity> &entities, int line) {
|
||||||
LOG_CHECK(std::is_sorted(entities.begin(), entities.end())) << line << " " << entities;
|
LOG_CHECK(std::is_sorted(entities.begin(), entities.end())) << line << " " << entities;
|
||||||
@ -1354,7 +1362,7 @@ vector<MessageEntity> find_entities(Slice text, bool skip_bot_commands, bool onl
|
|||||||
return entities;
|
return entities;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(entities.begin(), entities.end());
|
sort_entities(entities);
|
||||||
|
|
||||||
remove_intersecting_entities(entities);
|
remove_intersecting_entities(entities);
|
||||||
|
|
||||||
@ -1852,7 +1860,7 @@ static Result<vector<MessageEntity>> do_parse_markdown_v2(CSlice text, string &r
|
|||||||
<< " entity at byte offset " << nested_entities.back().entity_byte_offset);
|
<< " entity at byte offset " << nested_entities.back().entity_byte_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(entities.begin(), entities.end());
|
sort_entities(entities);
|
||||||
|
|
||||||
return entities;
|
return entities;
|
||||||
}
|
}
|
||||||
@ -2160,7 +2168,7 @@ static FormattedText parse_markdown_v3_without_pre(Slice text, vector<MessageEnt
|
|||||||
}
|
}
|
||||||
if (!have_splittable_entities) {
|
if (!have_splittable_entities) {
|
||||||
// fast path
|
// fast path
|
||||||
std::sort(entities.begin(), entities.end());
|
sort_entities(entities);
|
||||||
return {text.str(), std::move(entities)};
|
return {text.str(), std::move(entities)};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2207,7 +2215,7 @@ static FormattedText parse_markdown_v3_without_pre(Slice text, vector<MessageEnt
|
|||||||
|
|
||||||
td::remove_if(entities, [](const auto &entity) { return entity.length == 0; });
|
td::remove_if(entities, [](const auto &entity) { return entity.length == 0; });
|
||||||
|
|
||||||
std::sort(entities.begin(), entities.end());
|
sort_entities(entities);
|
||||||
return {std::move(new_text), std::move(entities)};
|
return {std::move(new_text), std::move(entities)};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2682,7 +2690,7 @@ static Result<vector<MessageEntity>> do_parse_html(CSlice text, string &result)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(entities.begin(), entities.end());
|
sort_entities(entities);
|
||||||
|
|
||||||
return entities;
|
return entities;
|
||||||
}
|
}
|
||||||
@ -3462,9 +3470,7 @@ void split_entities(vector<MessageEntity> &entities, const vector<MessageEntity>
|
|||||||
entities = std::move(result);
|
entities = std::move(result);
|
||||||
|
|
||||||
// entities are sorted only by offset now, re-sort if needed
|
// entities are sorted only by offset now, re-sort if needed
|
||||||
if (!std::is_sorted(entities.begin(), entities.end())) {
|
sort_entities(entities);
|
||||||
std::sort(entities.begin(), entities.end());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static vector<MessageEntity> resplit_entities(vector<MessageEntity> &&splittable_entities,
|
static vector<MessageEntity> resplit_entities(vector<MessageEntity> &&splittable_entities,
|
||||||
@ -3477,15 +3483,13 @@ static vector<MessageEntity> resplit_entities(vector<MessageEntity> &&splittable
|
|||||||
}
|
}
|
||||||
|
|
||||||
combine(entities, std::move(splittable_entities));
|
combine(entities, std::move(splittable_entities));
|
||||||
std::sort(entities.begin(), entities.end());
|
sort_entities(entities);
|
||||||
}
|
}
|
||||||
return std::move(entities);
|
return std::move(entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fix_entities(vector<MessageEntity> &entities) {
|
static void fix_entities(vector<MessageEntity> &entities) {
|
||||||
if (!std::is_sorted(entities.begin(), entities.end())) {
|
sort_entities(entities);
|
||||||
std::sort(entities.begin(), entities.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (are_entities_valid(entities)) {
|
if (are_entities_valid(entities)) {
|
||||||
// fast path
|
// fast path
|
||||||
@ -3513,7 +3517,7 @@ static void fix_entities(vector<MessageEntity> &entities) {
|
|||||||
remove_entities_intersecting_blockquote(continuous_entities, blockquote_entities);
|
remove_entities_intersecting_blockquote(continuous_entities, blockquote_entities);
|
||||||
|
|
||||||
combine(continuous_entities, std::move(blockquote_entities));
|
combine(continuous_entities, std::move(blockquote_entities));
|
||||||
std::sort(continuous_entities.begin(), continuous_entities.end());
|
sort_entities(continuous_entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
// must be called once to not merge some adjacent entities
|
// must be called once to not merge some adjacent entities
|
||||||
@ -3550,7 +3554,7 @@ static void merge_new_entities(vector<MessageEntity> &entities, vector<MessageEn
|
|||||||
|
|
||||||
if (!blockquote_entities.empty()) {
|
if (!blockquote_entities.empty()) {
|
||||||
combine(continuous_entities, std::move(blockquote_entities));
|
combine(continuous_entities, std::move(blockquote_entities));
|
||||||
std::sort(continuous_entities.begin(), continuous_entities.end());
|
sort_entities(continuous_entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
// must be called once to not merge some adjacent entities
|
// must be called once to not merge some adjacent entities
|
||||||
@ -3618,7 +3622,7 @@ Status fix_formatted_text(string &text, vector<MessageEntity> &entities, bool al
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (need_sort) {
|
if (need_sort) {
|
||||||
std::sort(entities.begin(), entities.end());
|
sort_entities(entities);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ltrim
|
// ltrim
|
||||||
|
Reference in New Issue
Block a user