diff options
Diffstat (limited to 'indra/llcommon/llstring.cpp')
-rw-r--r-- | indra/llcommon/llstring.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index f40e7ad45f..9a2251e0a7 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -600,6 +600,7 @@ std::string mbcsstring_makeASCII(const std::string& wstr) } return out_str; } + std::string utf8str_removeCRLF(const std::string& utf8str) { if (0 == utf8str.length()) @@ -621,6 +622,43 @@ std::string utf8str_removeCRLF(const std::string& utf8str) return out; } +// Search for any emoji symbol, return true if found +bool wstring_has_emoji(const LLWString& wstr) +{ + for (const llwchar& wch : wstr) + { + if (LLStringOps::isEmoji(wch)) + return true; + } + + return false; +} + +// Cut emoji symbols if exist +bool wstring_remove_emojis(LLWString& wstr) +{ + bool found = false; + for (size_t i = 0; i < wstr.size(); ++i) + { + if (LLStringOps::isEmoji(wstr[i])) + { + wstr.erase(i--, 1); + found = true; + } + } + return found; +} + +// Cut emoji symbols if exist +bool utf8str_remove_emojis(std::string& utf8str) +{ + LLWString wstr = utf8str_to_wstring(utf8str); + if (!wstring_remove_emojis(wstr)) + return false; + utf8str = wstring_to_utf8str(wstr); + return true; +} + #if LL_WINDOWS unsigned int ll_wstring_default_code_page() { @@ -833,6 +871,66 @@ std::string LLStringOps::sDayFormat; std::string LLStringOps::sAM; std::string LLStringOps::sPM; +// static +bool LLStringOps::isEmoji(llwchar wch) +{ + // Most of the following symbols are not actually emoticons, but rather small pictures + + // 0x1F000 .. 0x1F02F - mahjong tiles + // https://symbl.cc/en/unicode/table/#mahjong-tiles + + // 0x1F030 .. 0x1F09F - domino tiles + // https://symbl.cc/en/unicode/table/#domino-tiles + + // 0x1F0A0 .. 0x1F0FF - playing cards + // https://symbl.cc/en/unicode/table/#playing-cards + + // 0x1F100 .. 0x1F1FF - enclosed alphanumeric supplement + // https://symbl.cc/en/unicode/table/#enclosed-alphanumeric-supplement + + // 0x1F200 .. 0x1F2FF - enclosed ideographic supplement + // https://symbl.cc/en/unicode/table/#enclosed-ideographic-supplement + + // 0x1F300 .. 0x1F5FF - miscellaneous symbols and pictographs + // https://symbl.cc/en/unicode/table/#miscellaneous-symbols-and-pictographs + + // 0x1F600 .. 0x1F64F - emoticons + // https://symbl.cc/en/unicode/table/#emoticons + + // 0x1F650 .. 0x1F67F - ornamental dingbats + // https://symbl.cc/en/unicode/table/#ornamental-dingbats + + // 0x1F680 .. 0x1F6FF - transport and map symbols + // https://symbl.cc/en/unicode/table/#transport-and-map-symbols + + // 0x1F700 .. 0x1F77F - alchemical symbols + // https://symbl.cc/en/unicode/table/#alchemical-symbols + + // 0x1F780 .. 0x1F7FF - geometric shapes extended + // https://symbl.cc/en/unicode/table/#geometric-shapes-extended + + // 0x1F800 .. 0x1F8FF - supplemental arrows c + // https://symbl.cc/en/unicode/table/#supplemental-arrows-c + + // 0x1F900 .. 0x1F9FF - supplemental symbols and pictographs + // https://symbl.cc/en/unicode/table/#supplemental-symbols-and-pictographs + + // 0x1FA00 .. 0x1FA6F - chess symbols + // https://symbl.cc/en/unicode/table/#chess-symbols + + // 0x1FA70 .. 0x1FAFF - symbols and pictographs extended a + // https://symbl.cc/en/unicode/table/#symbols-and-pictographs-extended-a + + // 0x1FB00 .. 0x1FBFF - symbols for legacy computing + // https://symbl.cc/en/unicode/table/#symbols-for-legacy-computing + + // 0x1FC00 .. 0x1FFFF - undefined block 44 + // These symbols aren't defined yet + // https://symbl.cc/en/unicode/table/#undefined-block-44 + + return wch >= 0x1F000 && wch < 0x1FC00; +} + S32 LLStringOps::collate(const llwchar* a, const llwchar* b) { |