Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Hakaba Hitoyo
pleroma
Commits
f1b93b5b
Commit
f1b93b5b
authored
Dec 20, 2018
by
Maksim
Committed by
kaniini
Dec 20, 2018
Browse files
[#413] fix parse mentions
parent
c52453fb
Changes
2
Hide whitespace changes
Inline
Side-by-side
lib/pleroma/formatter.ex
View file @
f1b93b5b
...
...
@@ -7,6 +7,9 @@ defmodule Pleroma.Formatter do
@tag_regex
~r/((?<=[^&])|\A)(\#)(\w+)/u
@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
Regex
.
scan
(
@tag_regex
,
text
)
|>
Enum
.
map
(
fn
[
"#"
<>
tag
=
full_tag
|
_
]
->
{
full_tag
,
String
.
downcase
(
tag
)}
end
)
...
...
@@ -17,16 +20,15 @@ def parse_tags(text, data \\ %{}) do
end
)
.
()
end
@doc
"Parses mentions text and returns list {nickname, user}."
@spec
parse_mentions
(
binary
())
::
list
({
binary
(),
User
.
t
()})
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
])
?)
*/
u
Regex
.
scan
(
regex
,
text
)
Regex
.
scan
(
@mentions_regex
,
text
)
|>
List
.
flatten
()
|>
Enum
.
uniq
()
|>
Enum
.
map
(
fn
"@"
<>
match
=
full_match
->
{
full_match
,
User
.
get_cached_by_nickname
(
match
)}
|>
Enum
.
map
(
fn
nickname
->
with
nickname
<-
String
.
trim_leading
(
nickname
,
"@"
),
do
:
{
"@"
<>
nickname
,
User
.
get_cached_by_nickname
(
nickname
)}
end
)
|>
Enum
.
filter
(
fn
{
_match
,
user
}
->
user
end
)
end
...
...
test/formatter_test.exs
View file @
f1b93b5b
...
...
@@ -215,8 +215,11 @@ test "parses tags in the text" do
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"
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"
})
archaeme
=
insert
(
:user
,
%{
nickname:
"archaeme"
})
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
=
[
{
"@gsimg"
,
gsimg
},
{
"@archaeme"
,
archaeme
},
{
"@archaeme@archae.me"
,
archaeme_remote
}
{
"@archaeme@archae.me"
,
archaeme_remote
},
{
"@o"
,
o
},
{
"@jimm"
,
jimm
}
]
assert
Formatter
.
parse_mentions
(
text
)
==
expected_result
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment