diff options
| author | levlam <levlam@telegram.org> | 2022-05-12 18:02:27 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2022-05-12 18:02:27 +0300 |
| commit | de5f047dbacadc3149cbb29f98616b5d6c9bf096 (patch) | |
| tree | a318dfcae2b01b90b10b0207f76f1e493c142f8b /tdutils/td/utils/emoji.cpp | |
| parent | f1f6e61cd172b26d1bedba7f9a95a84d43d866ce (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.cpp | 32 |
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) { |
