diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 5d989bc8c..5a241fe45 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -1,4 +1,5 @@ defmodule Pleroma.Formatter do + alias Pleroma.User @link_regex ~r/https?:\/\/[\w\.\/?=\-#]+[\w]/ def linkify(text) do @@ -10,4 +11,15 @@ def parse_tags(text) do Regex.scan(@tag_regex, text) |> Enum.map(fn (["#" <> tag = full_tag]) -> {full_tag, tag} end) end + + def parse_mentions(text) do + # Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address + regex = ~r/@[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/ + + Regex.scan(regex, text) + |> List.flatten + |> Enum.uniq + |> Enum.map(fn ("@" <> match = full_match) -> {full_match, User.get_cached_by_nickname(match)} end) + |> Enum.filter(fn ({_match, user}) -> user end) + end end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index cf9610723..07ac30cb2 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -31,7 +31,7 @@ def get_replied_to_activity(_), do: nil def create_status(%User{} = user, %{"status" => status} = data) do with attachments <- attachments_from_ids(data["media_ids"]), - mentions <- parse_mentions(status), + mentions <- Formatter.parse_mentions(status), inReplyTo <- get_replied_to_activity(data["in_reply_to_status_id"]), to <- to_for_user_and_mentions(user, mentions, inReplyTo), content_html <- make_content_html(status, mentions, attachments), @@ -182,17 +182,6 @@ def upload(%Plug.Upload{} = file, format \\ "xml") do end end - def parse_mentions(text) do - # Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address - regex = ~r/@[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*/ - - Regex.scan(regex, text) - |> List.flatten - |> Enum.uniq - |> Enum.map(fn ("@" <> match = full_match) -> {full_match, User.get_cached_by_nickname(match)} end) - |> Enum.filter(fn ({_match, user}) -> user end) - end - def register_user(params) do params = %{ nickname: params["nickname"], diff --git a/test/formatter_test.exs b/test/formatter_test.exs index bf09b246f..1e3a29e09 100644 --- a/test/formatter_test.exs +++ b/test/formatter_test.exs @@ -2,6 +2,8 @@ defmodule Pleroma.FormatterTest do alias Pleroma.Formatter use Pleroma.DataCase + import Pleroma.Factory + describe ".linkify" do test "turning urls into links" do text = "Hey, check out https://www.youtube.com/watch?v=8Zg1-TufFzY." @@ -25,4 +27,20 @@ test "parses tags in the text" do assert Formatter.parse_tags(text) == expected end end + + test "it can parse mentions and return the relevant users" do + text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" + + gsimg = insert(:user, %{nickname: "gsimg"}) + archaeme = insert(:user, %{nickname: "archaeme"}) + archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) + + expected_result = [ + {"@gsimg", gsimg}, + {"@archaeme", archaeme}, + {"@archaeme@archae.me", archaeme_remote}, + ] + + assert Formatter.parse_mentions(text) == expected_result + end end diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index d5a1fa57a..da880e67c 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -240,22 +240,6 @@ test "upload a file" do assert is_binary(response) end - test "it can parse mentions and return the relevant users" do - text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" - - gsimg = insert(:user, %{nickname: "gsimg"}) - archaeme = insert(:user, %{nickname: "archaeme"}) - archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) - - expected_result = [ - {"@gsimg", gsimg}, - {"@archaeme", archaeme}, - {"@archaeme@archae.me", archaeme_remote}, - ] - - assert TwitterAPI.parse_mentions(text) == expected_result - end - test "it adds user links to an existing text" do text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me" @@ -263,7 +247,7 @@ test "it adds user links to an existing text" do archaeme = insert(:user, %{nickname: "archaeme"}) archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) - mentions = TwitterAPI.parse_mentions(text) + mentions = Pleroma.Formatter.parse_mentions(text) expected_text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme" assert Utils.add_user_links(text, mentions) == expected_text