logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

combinations.ex (1605B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Emoji.Combinations do
  5. # FE0F is the emoji variation sequence. It is used for fully-qualifying
  6. # emoji, and that includes emoji combinations.
  7. # This code generates combinations per emoji: for each FE0F, all possible
  8. # combinations of the character being removed or staying will be generated.
  9. # This is made as an attempt to find all partially-qualified and unqualified
  10. # versions of a fully-qualified emoji.
  11. # I have found *no cases* for which this would be a problem, after browsing
  12. # the entire emoji list in emoji-test.txt. This is safe, and, sadly, most
  13. # likely sane too.
  14. defp qualification_combinations(codepoints) do
  15. qualification_combinations([[]], codepoints)
  16. end
  17. defp qualification_combinations(acc, []), do: acc
  18. defp qualification_combinations(acc, ["\uFE0F" | tail]) do
  19. acc
  20. |> Enum.flat_map(fn x -> [x, x ++ ["\uFE0F"]] end)
  21. |> qualification_combinations(tail)
  22. end
  23. defp qualification_combinations(acc, [codepoint | tail]) do
  24. acc
  25. |> Enum.map(&Kernel.++(&1, [codepoint]))
  26. |> qualification_combinations(tail)
  27. end
  28. def variate_emoji_qualification(emoji) when is_binary(emoji) do
  29. emoji
  30. |> String.codepoints()
  31. |> qualification_combinations()
  32. |> Enum.map(&List.to_string/1)
  33. end
  34. def variate_emoji_qualification(emoji) when is_list(emoji) do
  35. emoji
  36. |> Enum.map(fn emoji -> {emoji, variate_emoji_qualification(emoji)} end)
  37. end
  38. end