aboutsummaryrefslogtreecommitdiffhomepage
path: root/tdutils/td/utils/emoji.cpp
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2022-05-12 18:02:27 +0300
committerlevlam <levlam@telegram.org>2022-05-12 18:02:27 +0300
commitde5f047dbacadc3149cbb29f98616b5d6c9bf096 (patch)
treea318dfcae2b01b90b10b0207f76f1e493c142f8b /tdutils/td/utils/emoji.cpp
parentf1f6e61cd172b26d1bedba7f9a95a84d43d866ce (diff)
Remove all emoji modifiers, including modifiers in the middle.
Diffstat (limited to 'tdutils/td/utils/emoji.cpp')
-rw-r--r--tdutils/td/utils/emoji.cpp32
1 files changed, 20 insertions, 12 deletions
diff --git a/tdutils/td/utils/emoji.cpp b/tdutils/td/utils/emoji.cpp
index c4679eb74..cbaa9c7f4 100644
--- a/tdutils/td/utils/emoji.cpp
+++ b/tdutils/td/utils/emoji.cpp
@@ -243,7 +243,13 @@ Slice remove_fitzpatrick_modifier(Slice emoji) {
return emoji;
}
-Slice remove_emoji_modifiers(Slice emoji) {
+string remove_emoji_modifiers(Slice emoji) {
+ string result = emoji.str();
+ remove_emoji_modifiers_in_place(result);
+ return result;
+}
+
+void remove_emoji_modifiers_in_place(string &emoji) {
static const Slice modifiers[] = {u8"\uFE0F" /* variation selector-16 */,
u8"\u200D\u2640" /* zero width joiner + female sign */,
u8"\u200D\u2642" /* zero width joiner + male sign */,
@@ -252,21 +258,23 @@ Slice remove_emoji_modifiers(Slice emoji) {
u8"\U0001F3FD" /* emoji modifier fitzpatrick type-4 */,
u8"\U0001F3FE" /* emoji modifier fitzpatrick type-5 */,
u8"\U0001F3FF" /* emoji modifier fitzpatrick type-6 */};
- bool found = true;
- while (found) {
- found = false;
+ size_t j = 0;
+ for (size_t i = 0; i < emoji.size();) {
+ bool is_found = false;
for (auto &modifier : modifiers) {
- if (ends_with(emoji, modifier) && emoji.size() > modifier.size()) {
- emoji.remove_suffix(modifier.size());
- found = true;
+ auto length = modifier.size();
+ if (i + length <= emoji.size() && Slice(&emoji[i], length) == modifier) {
+ // skip modifier
+ i += length;
+ is_found = true;
+ break;
}
}
+ if (!is_found) {
+ emoji[j++] = emoji[i++];
+ }
}
- return emoji;
-}
-
-void remove_emoji_modifiers_in_place(string &emoji) {
- emoji.resize(remove_emoji_modifiers(emoji).size());
+ emoji.resize(j);
}
string remove_emoji_selectors(Slice emoji) {