diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/emoji.ex | 65 | ||||
| -rw-r--r-- | lib/pleroma/formatter.ex | 8 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/common_api.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/utils.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 5 | ||||
| -rw-r--r-- | lib/pleroma/web/twitter_api/controllers/util_controller.ex | 8 | 
6 files changed, 72 insertions, 18 deletions
| diff --git a/lib/pleroma/emoji.ex b/lib/pleroma/emoji.ex index f3f08cd9d..7a60f3961 100644 --- a/lib/pleroma/emoji.ex +++ b/lib/pleroma/emoji.ex @@ -8,13 +8,19 @@ defmodule Pleroma.Emoji do      * the built-in Finmojis (if enabled in configuration),      * the files: `config/emoji.txt` and `config/custom_emoji.txt` -    * glob paths +    * glob paths, nested folder is used as tag name for grouping e.g. priv/static/emoji/custom/nested_folder    This GenServer stores in an ETS table the list of the loaded emojis, and also allows to reload the list at runtime.    """    use GenServer + +  @type pattern :: Regex.t() | module() | String.t() +  @type patterns :: pattern() | [pattern()] +  @type group_patterns :: keyword(patterns()) +    @ets __MODULE__.Ets    @ets_options [:ordered_set, :protected, :named_table, {:read_concurrency, true}] +  @groups Application.get_env(:pleroma, :emoji)[:groups]    @doc false    def start_link do @@ -73,13 +79,14 @@ defmodule Pleroma.Emoji do    end    defp load do +    finmoji_enabled = Keyword.get(Application.get_env(:pleroma, :instance), :finmoji_enabled) +    shortcode_globs = Application.get_env(:pleroma, :emoji)[:shortcode_globs] || [] +      emojis = -      (load_finmoji(Keyword.get(Application.get_env(:pleroma, :instance), :finmoji_enabled)) ++ +      (load_finmoji(finmoji_enabled) ++           load_from_file("config/emoji.txt") ++           load_from_file("config/custom_emoji.txt") ++ -         load_from_globs( -           Keyword.get(Application.get_env(:pleroma, :emoji, []), :shortcode_globs, []) -         )) +         load_from_globs(shortcode_globs))        |> Enum.reject(fn value -> value == nil end)      true = :ets.insert(@ets, emojis) @@ -151,9 +158,12 @@ defmodule Pleroma.Emoji do      "white_nights",      "woollysocks"    ] +    defp load_finmoji(true) do      Enum.map(@finmoji, fn finmoji -> -      {finmoji, "/finmoji/128px/#{finmoji}-128.png"} +      file_name = "/finmoji/128px/#{finmoji}-128.png" +      group = match_extra(@groups, file_name) +      {finmoji, file_name, to_string(group)}      end)    end @@ -172,8 +182,14 @@ defmodule Pleroma.Emoji do      |> Stream.map(&String.trim/1)      |> Stream.map(fn line ->        case String.split(line, ~r/,\s*/) do -        [name, file] -> {name, file} -        _ -> nil +        [name, file, tags] -> +          {name, file, tags} + +        [name, file] -> +          {name, file, to_string(match_extra(@groups, file))} + +        _ -> +          nil        end      end)      |> Enum.to_list() @@ -190,9 +206,40 @@ defmodule Pleroma.Emoji do        |> Enum.concat()      Enum.map(paths, fn path -> +      tag = match_extra(@groups, Path.join("/", Path.relative_to(path, static_path)))        shortcode = Path.basename(path, Path.extname(path))        external_path = Path.join("/", Path.relative_to(path, static_path)) -      {shortcode, external_path} +      {shortcode, external_path, to_string(tag)} +    end) +  end + +  @doc """ +  Finds a matching group for the given extra filename +  """ +  @spec match_extra(group_patterns(), String.t()) :: atom() | nil +  def match_extra(group_patterns, filename) do +    match_group_patterns(group_patterns, fn pattern -> +      case pattern do +        %Regex{} = regex -> Regex.match?(regex, filename) +        string when is_binary(string) -> filename == string +      end +    end) +  end + +  defp match_group_patterns(group_patterns, matcher) do +    Enum.find_value(group_patterns, fn {group, patterns} -> +      patterns = +        patterns +        |> List.wrap() +        |> Enum.map(fn pattern -> +          if String.contains?(pattern, "*") do +            ~r(#{String.replace(pattern, "*", ".*")}) +          else +            pattern +          end +        end) + +      Enum.any?(patterns, matcher) && group      end)    end  end diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index e3625383b..8ea9dbd38 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -77,9 +77,9 @@ defmodule Pleroma.Formatter do    def emojify(text, nil), do: text    def emojify(text, emoji, strip \\ false) do -    Enum.reduce(emoji, text, fn {emoji, file}, text -> -      emoji = HTML.strip_tags(emoji) -      file = HTML.strip_tags(file) +    Enum.reduce(emoji, text, fn emoji_data, text -> +      emoji = HTML.strip_tags(elem(emoji_data, 0)) +      file = HTML.strip_tags(elem(emoji_data, 1))        html =          if not strip do @@ -101,7 +101,7 @@ defmodule Pleroma.Formatter do    def demojify(text, nil), do: text    def get_emoji(text) when is_binary(text) do -    Enum.filter(Emoji.get_all(), fn {emoji, _} -> String.contains?(text, ":#{emoji}:") end) +    Enum.filter(Emoji.get_all(), fn {emoji, _, _} -> String.contains?(text, ":#{emoji}:") end)    end    def get_emoji(_), do: [] diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 25b990677..f910eb1f9 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -167,7 +167,7 @@ defmodule Pleroma.Web.CommonAPI do               object,               "emoji",               (Formatter.get_emoji(status) ++ Formatter.get_emoji(data["spoiler_text"])) -             |> Enum.reduce(%{}, fn {name, file}, acc -> +             |> Enum.reduce(%{}, fn {name, file, _}, acc ->                 Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}")               end)             ) do diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 40cea3090..aafeb7248 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -285,7 +285,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do    def emoji_from_profile(%{info: _info} = user) do      (Formatter.get_emoji(user.bio) ++ Formatter.get_emoji(user.name)) -    |> Enum.map(fn {shortcode, url} -> +    |> Enum.map(fn {shortcode, url, _} ->        %{          "type" => "Emoji",          "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}#{url}"}, diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 0141186d8..7003c30dc 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -178,14 +178,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do    defp mastodonized_emoji do      Pleroma.Emoji.get_all() -    |> Enum.map(fn {shortcode, relative_url} -> +    |> Enum.map(fn {shortcode, relative_url, tags} ->        url = to_string(URI.merge(Web.base_url(), relative_url))        %{          "shortcode" => shortcode,          "static_url" => url,          "visible_in_picker" => true, -        "url" => url +        "url" => url, +        "tags" => String.split(tags, ",")        }      end)    end diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index e817f0d79..d2f04071c 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -266,7 +266,13 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    end    def emoji(conn, _params) do -    json(conn, Enum.into(Emoji.get_all(), %{})) +    emoji = +      Emoji.get_all() +      |> Enum.map(fn {short_code, path, tags} -> +        %{short_code => %{image_url: path, tags: String.split(tags, ",")}} +      end) + +    json(conn, emoji)    end    def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do | 
