diff options
| author | lain <lain@soykaf.club> | 2019-03-20 21:09:36 +0100 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2019-03-20 21:09:36 +0100 | 
| commit | 8468f3f6d48693d2a27a257e5555aa71decff3df (patch) | |
| tree | 9f61dcf50e315bba1842bda2e43d866adb7dbad7 /lib | |
| parent | 0d14def0ca781b79ffb3c1022472ac64f990cdf8 (diff) | |
| download | pleroma-8468f3f6d48693d2a27a257e5555aa71decff3df.tar.gz pleroma-8468f3f6d48693d2a27a257e5555aa71decff3df.zip | |
Add safe dm mode option.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/formatter.ex | 20 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/common_api.ex | 3 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/utils.ex | 12 | 
3 files changed, 29 insertions, 6 deletions
| diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 1e4ede3f2..e3625383b 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Formatter do    alias Pleroma.User    alias Pleroma.Web.MediaProxy +  @safe_mention_regex ~r/^(\s*(?<mentions>@.+?\s+)+)(?<rest>.*)/    @markdown_characters_regex ~r/(`|\*|_|{|}|[|]|\(|\)|#|\+|-|\.|!)/    @link_regex ~r{((?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:/?#[\]@!\$&'\(\)\*\+,;=.]+)|[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+}ui    # credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength @@ -45,15 +46,28 @@ defmodule Pleroma.Formatter do    @doc """    Parses a text and replace plain text links with HTML. Returns a tuple with a result text, mentions, and hashtags. + +  If the 'safe_mention' option is given, only consecutive mentions at the start the post are actually mentioned.    """    @spec linkify(String.t(), keyword()) ::            {String.t(), [{String.t(), User.t()}], [{String.t(), String.t()}]}    def linkify(text, options \\ []) do      options = options ++ @auto_linker_config -    acc = %{mentions: MapSet.new(), tags: MapSet.new()} -    {text, %{mentions: mentions, tags: tags}} = AutoLinker.link_map(text, acc, options) -    {text, MapSet.to_list(mentions), MapSet.to_list(tags)} +    if options[:safe_mention] && Regex.named_captures(@safe_mention_regex, text) do +      %{"mentions" => mentions, "rest" => rest} = Regex.named_captures(@safe_mention_regex, text) +      acc = %{mentions: MapSet.new(), tags: MapSet.new()} + +      {text_mentions, %{mentions: mentions}} = AutoLinker.link_map(mentions, acc, options) +      {text_rest, %{tags: tags}} = AutoLinker.link_map(rest, acc, options) + +      {text_mentions <> text_rest, MapSet.to_list(mentions), MapSet.to_list(tags)} +    else +      acc = %{mentions: MapSet.new(), tags: MapSet.new()} +      {text, %{mentions: mentions, tags: tags}} = AutoLinker.link_map(text, acc, options) + +      {text, MapSet.to_list(mentions), MapSet.to_list(tags)} +    end    end    def emojify(text) do diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index b5f79c3bf..50d60aade 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -142,7 +142,8 @@ defmodule Pleroma.Web.CommonAPI do             make_content_html(               status,               attachments, -             data +             data, +             visibility             ),           {to, cc} <- to_for_user_and_mentions(user, mentions, in_reply_to, visibility),           context <- make_context(in_reply_to), diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index b7513ef28..368945418 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -101,7 +101,8 @@ defmodule Pleroma.Web.CommonAPI.Utils do    def make_content_html(          status,          attachments, -        data +        data, +        visibility        ) do      no_attachment_links =        data @@ -110,8 +111,15 @@ defmodule Pleroma.Web.CommonAPI.Utils do      content_type = get_content_type(data["content_type"]) +    options = +      if visibility == "direct" && Config.get([:instance, :safe_dm_mentions]) do +        [safe_mention: true] +      else +        [] +      end +      status -    |> format_input(content_type) +    |> format_input(content_type, options)      |> maybe_add_attachments(attachments, no_attachment_links)      |> maybe_add_nsfw_tag(data)    end | 
