HTML-sanitize usernames before emojifying.
[akkoma] / lib / pleroma / formatter.ex
index a708a275e881fd431de67470b7a091f9e6dcc4b5..d199c924348f6cbf5bd70c0a36cdd1b558a05d0d 100644 (file)
@@ -116,7 +116,28 @@ defmodule Pleroma.Formatter do
                       _ -> []
                     end)
 
-  @emoji @finmoji_with_filenames ++ @emoji_from_file
+  @emoji_from_globs (
+                      static_path = Path.join(:code.priv_dir(:pleroma), "static")
+
+                      globs =
+                        Application.get_env(:pleroma, :emoji, [])
+                        |> Keyword.get(:shortcode_globs, [])
+
+                      paths =
+                        Enum.map(globs, fn glob ->
+                          Path.join(static_path, glob)
+                          |> Path.wildcard()
+                        end)
+                        |> Enum.concat()
+
+                      Enum.map(paths, fn path ->
+                        shortcode = Path.basename(path, Path.extname(path))
+                        external_path = Path.join("/", Path.relative_to(path, static_path))
+                        {shortcode, external_path}
+                      end)
+                    )
+
+  @emoji @finmoji_with_filenames ++ @emoji_from_globs ++ @emoji_from_file
 
   def emojify(text, emoji \\ @emoji)
   def emojify(text, nil), do: text
@@ -160,6 +181,7 @@ defmodule Pleroma.Formatter do
     links =
       Regex.scan(@link_regex, text)
       |> Enum.map(fn [url] -> {Ecto.UUID.generate(), url} end)
+      |> Enum.sort_by(fn {_, url} -> -String.length(url) end)
 
     uuid_text =
       links
@@ -169,8 +191,11 @@ defmodule Pleroma.Formatter do
       subs ++
         Enum.map(links, fn {uuid, url} ->
           {:safe, link} = Phoenix.HTML.Link.link(url, to: url)
-          link = link
-          |> IO.iodata_to_binary
+
+          link =
+            link
+            |> IO.iodata_to_binary()
+
           {uuid, link}
         end)
 
@@ -196,7 +221,9 @@ defmodule Pleroma.Formatter do
           ap_id = info["source_data"]["url"] || ap_id
 
           short_match = String.split(match, "@") |> tl() |> hd()
-          {uuid, "<span><a href='#{ap_id}'>@<span>#{short_match}</span></a></span>"}
+
+          {uuid,
+           "<span><a class='mention' href='#{ap_id}'>@<span>#{short_match}</span></a></span>"}
         end)
 
     {subs, uuid_text}
@@ -217,8 +244,8 @@ defmodule Pleroma.Formatter do
 
     subs =
       subs ++
-        Enum.map(tags, fn {_, tag, uuid} ->
-          url = "<a href='#{Pleroma.Web.base_url()}/tag/#{tag}' rel='tag'>##{tag}</a>"
+        Enum.map(tags, fn {tag_text, tag, uuid} ->
+          url = "<a href='#{Pleroma.Web.base_url()}/tag/#{tag}' rel='tag'>#{tag_text}</a>"
           {uuid, url}
         end)