Emoji.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * Copyright (c) 2022-2023, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Forward.h>
  8. #include <AK/Optional.h>
  9. #include <AK/StringView.h>
  10. #include <AK/Types.h>
  11. namespace Unicode {
  12. enum class EmojiGroup : u8 {
  13. Unknown,
  14. SmileysAndEmotion,
  15. PeopleAndBody,
  16. Component,
  17. AnimalsAndNature,
  18. FoodAndDrink,
  19. TravelAndPlaces,
  20. Activities,
  21. Objects,
  22. Symbols,
  23. Flags,
  24. // Non-standard emoji added for SerenityOS:
  25. SerenityOS,
  26. };
  27. struct Emoji {
  28. StringView name;
  29. Optional<StringView> image_path;
  30. EmojiGroup group { EmojiGroup::Unknown };
  31. u32 display_order { 0 };
  32. ReadonlySpan<u32> code_points;
  33. };
  34. Optional<Emoji> find_emoji_for_code_points(ReadonlySpan<u32> code_points);
  35. template<size_t Size>
  36. Optional<Emoji> find_emoji_for_code_points(u32 const (&code_points)[Size])
  37. {
  38. return find_emoji_for_code_points(ReadonlySpan<u32> { code_points });
  39. }
  40. enum class SequenceType {
  41. Any,
  42. EmojiPresentation,
  43. };
  44. bool could_be_start_of_emoji_sequence(Utf8CodePointIterator const&, SequenceType = SequenceType::Any);
  45. bool could_be_start_of_emoji_sequence(Utf32CodePointIterator const&, SequenceType = SequenceType::Any);
  46. constexpr StringView emoji_group_to_string(EmojiGroup group)
  47. {
  48. switch (group) {
  49. case EmojiGroup::Unknown:
  50. return "Unknown"sv;
  51. case EmojiGroup::SmileysAndEmotion:
  52. return "Smileys & Emotion"sv;
  53. case EmojiGroup::PeopleAndBody:
  54. return "People & Body"sv;
  55. case EmojiGroup::Component:
  56. return "Component"sv;
  57. case EmojiGroup::AnimalsAndNature:
  58. return "Animals & Nature"sv;
  59. case EmojiGroup::FoodAndDrink:
  60. return "Food & Drink"sv;
  61. case EmojiGroup::TravelAndPlaces:
  62. return "Travel & Places"sv;
  63. case EmojiGroup::Activities:
  64. return "Activities"sv;
  65. case EmojiGroup::Objects:
  66. return "Objects"sv;
  67. case EmojiGroup::Symbols:
  68. return "Symbols"sv;
  69. case EmojiGroup::Flags:
  70. return "Flags"sv;
  71. case EmojiGroup::SerenityOS:
  72. return "SerenityOS"sv;
  73. }
  74. VERIFY_NOT_REACHED();
  75. }
  76. constexpr EmojiGroup emoji_group_from_string(StringView group)
  77. {
  78. if (group == "Unknown"sv)
  79. return EmojiGroup::Unknown;
  80. if (group == "Smileys & Emotion"sv)
  81. return EmojiGroup::SmileysAndEmotion;
  82. if (group == "People & Body"sv)
  83. return EmojiGroup::PeopleAndBody;
  84. if (group == "Component"sv)
  85. return EmojiGroup::Component;
  86. if (group == "Animals & Nature"sv)
  87. return EmojiGroup::AnimalsAndNature;
  88. if (group == "Food & Drink"sv)
  89. return EmojiGroup::FoodAndDrink;
  90. if (group == "Travel & Places"sv)
  91. return EmojiGroup::TravelAndPlaces;
  92. if (group == "Activities"sv)
  93. return EmojiGroup::Activities;
  94. if (group == "Objects"sv)
  95. return EmojiGroup::Objects;
  96. if (group == "Symbols"sv)
  97. return EmojiGroup::Symbols;
  98. if (group == "Flags"sv)
  99. return EmojiGroup::Flags;
  100. if (group == "SerenityOS"sv)
  101. return EmojiGroup::SerenityOS;
  102. VERIFY_NOT_REACHED();
  103. }
  104. }