[#413] fix parse mentions
This commit is contained in:
parent
c52453fbd6
commit
f1b93b5be7
|
@ -7,6 +7,9 @@ defmodule Pleroma.Formatter do
|
||||||
@tag_regex ~r/((?<=[^&])|\A)(\#)(\w+)/u
|
@tag_regex ~r/((?<=[^&])|\A)(\#)(\w+)/u
|
||||||
@markdown_characters_regex ~r/(`|\*|_|{|}|[|]|\(|\)|#|\+|-|\.|!)/
|
@markdown_characters_regex ~r/(`|\*|_|{|}|[|]|\(|\)|#|\+|-|\.|!)/
|
||||||
|
|
||||||
|
# Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address
|
||||||
|
@mentions_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])?)*/u
|
||||||
|
|
||||||
def parse_tags(text, data \\ %{}) do
|
def parse_tags(text, data \\ %{}) do
|
||||||
Regex.scan(@tag_regex, text)
|
Regex.scan(@tag_regex, text)
|
||||||
|> Enum.map(fn ["#" <> tag = full_tag | _] -> {full_tag, String.downcase(tag)} end)
|
|> Enum.map(fn ["#" <> tag = full_tag | _] -> {full_tag, String.downcase(tag)} end)
|
||||||
|
@ -17,16 +20,15 @@ def parse_tags(text, data \\ %{}) do
|
||||||
end).()
|
end).()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc "Parses mentions text and returns list {nickname, user}."
|
||||||
|
@spec parse_mentions(binary()) :: list({binary(), User.t()})
|
||||||
def parse_mentions(text) do
|
def parse_mentions(text) do
|
||||||
# Modified from https://www.w3.org/TR/html5/forms.html#valid-e-mail-address
|
Regex.scan(@mentions_regex, text)
|
||||||
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])?)*/u
|
|
||||||
|
|
||||||
Regex.scan(regex, text)
|
|
||||||
|> List.flatten()
|
|> List.flatten()
|
||||||
|> Enum.uniq()
|
|> Enum.uniq()
|
||||||
|> Enum.map(fn "@" <> match = full_match ->
|
|> Enum.map(fn nickname ->
|
||||||
{full_match, User.get_cached_by_nickname(match)}
|
with nickname <- String.trim_leading(nickname, "@"),
|
||||||
|
do: {"@" <> nickname, User.get_cached_by_nickname(nickname)}
|
||||||
end)
|
end)
|
||||||
|> Enum.filter(fn {_match, user} -> user end)
|
|> Enum.filter(fn {_match, user} -> user end)
|
||||||
end
|
end
|
||||||
|
|
|
@ -215,8 +215,11 @@ test "parses tags in the text" do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it can parse mentions and return the relevant users" do
|
test "it can parse mentions and return the relevant users" do
|
||||||
text = "@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me"
|
text =
|
||||||
|
"@@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me and @o and @@@jimm"
|
||||||
|
|
||||||
|
o = insert(:user, %{nickname: "o"})
|
||||||
|
jimm = insert(:user, %{nickname: "jimm"})
|
||||||
gsimg = insert(:user, %{nickname: "gsimg"})
|
gsimg = insert(:user, %{nickname: "gsimg"})
|
||||||
archaeme = insert(:user, %{nickname: "archaeme"})
|
archaeme = insert(:user, %{nickname: "archaeme"})
|
||||||
archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"})
|
archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"})
|
||||||
|
@ -224,7 +227,9 @@ test "it can parse mentions and return the relevant users" do
|
||||||
expected_result = [
|
expected_result = [
|
||||||
{"@gsimg", gsimg},
|
{"@gsimg", gsimg},
|
||||||
{"@archaeme", archaeme},
|
{"@archaeme", archaeme},
|
||||||
{"@archaeme@archae.me", archaeme_remote}
|
{"@archaeme@archae.me", archaeme_remote},
|
||||||
|
{"@o", o},
|
||||||
|
{"@jimm", jimm}
|
||||||
]
|
]
|
||||||
|
|
||||||
assert Formatter.parse_mentions(text) == expected_result
|
assert Formatter.parse_mentions(text) == expected_result
|
||||||
|
|
Loading…
Reference in a new issue