Emoji: Generate emoji detecting functions at compile time.
authorlain <lain@soykaf.club>
Fri, 13 Sep 2019 16:27:32 +0000 (18:27 +0200)
committerlain <lain@soykaf.club>
Fri, 13 Sep 2019 16:27:32 +0000 (18:27 +0200)
Suggested by jvalim

lib/pleroma/emoji.ex

index 3f516900764d0ba3131f30ae10a3ad318ecab6ab..65f2d5f390113e759723fe49797c2a9eae1dbc17 100644 (file)
@@ -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