Merge branch 'ejabberd-pleroma-auth' into 'develop'
[akkoma] / lib / pleroma / emoji.ex
index ab6ba7d6a14997a3ccc6fef8154e4bb9aa6a58de..04936155b5e1419c63878f437f75c4224e687f14 100644 (file)
@@ -1,5 +1,5 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Emoji do
@@ -21,6 +21,21 @@ defmodule Pleroma.Emoji do
     {:read_concurrency, true}
   ]
 
+  defstruct [:code, :file, :tags, :safe_code, :safe_file]
+
+  @doc "Build emoji struct"
+  def build({code, file, tags}) do
+    %__MODULE__{
+      code: code,
+      file: file,
+      tags: tags,
+      safe_code: Pleroma.HTML.strip_tags(code),
+      safe_file: Pleroma.HTML.strip_tags(file)
+    }
+  end
+
+  def build({code, file}), do: build({code, file, []})
+
   @doc false
   def start_link(_) do
     GenServer.start_link(__MODULE__, [], name: __MODULE__)
@@ -41,12 +56,18 @@ defmodule Pleroma.Emoji do
     end
   end
 
+  @spec exist?(String.t()) :: boolean()
+  def exist?(name), do: not is_nil(get(name))
+
   @doc "Returns all the emojos!!"
   @spec get_all() :: list({String.t(), String.t(), String.t()})
   def get_all do
     :ets.tab2list(@ets)
   end
 
+  @doc "Clear out old emojis"
+  def clear_all, do: :ets.delete_all_objects(@ets)
+
   @doc false
   def init(_) do
     @ets = :ets.new(@ets, @ets_options)
@@ -80,4 +101,35 @@ defmodule Pleroma.Emoji do
   defp update_emojis(emojis) do
     :ets.insert(@ets, emojis)
   end
+
+  @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