diff options
| author | lain <lain@soykaf.club> | 2019-09-13 18:27:32 +0200 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2019-09-13 18:27:32 +0200 | 
| commit | 6fe2f554c36be1ef03ac1d1104a78d0686f48a26 (patch) | |
| tree | 5de9aeac7ab362222961a309a414981cc7c52955 /lib | |
| parent | 3ff55322201fa7f6b22368988095963fcb82d6e4 (diff) | |
| download | pleroma-6fe2f554c36be1ef03ac1d1104a78d0686f48a26.tar.gz pleroma-6fe2f554c36be1ef03ac1d1104a78d0686f48a26.zip | |
Emoji: Generate emoji detecting functions at compile time.
Suggested by jvalim
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/emoji.ex | 52 | 
1 files changed, 29 insertions, 23 deletions
| diff --git a/lib/pleroma/emoji.ex b/lib/pleroma/emoji.ex index 3f5169007..65f2d5f39 100644 --- a/lib/pleroma/emoji.ex +++ b/lib/pleroma/emoji.ex @@ -261,28 +261,34 @@ defmodule Pleroma.Emoji do      end)    end -  {:ok, file} = File.read("lib/pleroma/emoji-data.txt") - -  @unicode_emoji file -                 |> String.split("\n") -                 |> Enum.filter(fn line -> String.starts_with?(line, ["1", "2", "3", "4"]) end) -                 |> Enum.map(fn line -> String.split(line) |> List.first() end) -                 |> Enum.map(fn line -> -                   case String.split(line, "..") do -                     [number] -> -                       String.to_integer(number, 16) - -                     [first, last] -> -                       Range.new(String.to_integer(first, 16), String.to_integer(last, 16)) -                       |> Enum.to_list() -                   end -                 end) -                 |> List.flatten() -                 |> Enum.filter(&is_integer/1) -                 |> Enum.uniq() -                 |> Enum.map(fn n -> :unicode.characters_to_binary([n], :utf32) end) - -  def is_unicode_emoji?(str) do -    str in @unicode_emoji +  @external_resource "lib/pleroma/emoji-data.txt" + +  emojis = +    @external_resource +    |> File.read!() +    |> String.split("\n") +    |> Enum.filter(fn line -> line != "" and not String.starts_with?(line, "#") end) +    |> Enum.map(fn line -> +      line +      |> String.split(";", parts: 2) +      |> hd() +      |> String.trim() +      |> String.split("..") +      |> case do +        [number] -> +          <<String.to_integer(number, 16)::utf8>> + +        [first, last] -> +          String.to_integer(first, 16)..String.to_integer(last, 16) +          |> Enum.map(&<<&1::utf8>>) +      end +    end) +    |> List.flatten() +    |> Enum.uniq() + +  for emoji <- emojis do +    def is_unicode_emoji?(unquote(emoji)), do: true    end + +  def is_unicode_emoji?(_), do: false  end | 
