Make force_mentions_in_content multilang aware
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
cd0260f309
commit
2d66faf9a4
2 changed files with 100 additions and 25 deletions
|
@ -78,23 +78,55 @@ defp clean_recipients(recipients, object) do
|
||||||
def filter(
|
def filter(
|
||||||
%{
|
%{
|
||||||
"type" => type,
|
"type" => type,
|
||||||
"object" => %{"type" => "Note", "to" => to, "inReplyTo" => in_reply_to}
|
"object" => %{"type" => "Note", "to" => to, "inReplyTo" => in_reply_to} = object
|
||||||
} = object
|
} = activity
|
||||||
)
|
)
|
||||||
when type in ["Create", "Update"] and is_list(to) and is_binary(in_reply_to) do
|
when type in ["Create", "Update"] and is_list(to) and is_binary(in_reply_to) do
|
||||||
# image-only posts from pleroma apparently reach this MRF without the content field
|
|
||||||
content = object["object"]["content"] || ""
|
|
||||||
|
|
||||||
# Get the replied-to user for sorting
|
# Get the replied-to user for sorting
|
||||||
replied_to_user = get_replied_to_user(object["object"])
|
replied_to_user = get_replied_to_user(object)
|
||||||
|
|
||||||
mention_users =
|
mention_users =
|
||||||
to
|
to
|
||||||
|> clean_recipients(object)
|
|> clean_recipients(activity)
|
||||||
|> Enum.map(&User.get_cached_by_ap_id/1)
|
|> Enum.map(&User.get_cached_by_ap_id/1)
|
||||||
|> Enum.reject(&is_nil/1)
|
|> Enum.reject(&is_nil/1)
|
||||||
|> sort_replied_user(replied_to_user)
|
|> sort_replied_user(replied_to_user)
|
||||||
|
|
||||||
|
fixed_object =
|
||||||
|
with %{} = content_map <- object["contentMap"] do
|
||||||
|
fixed_content_map =
|
||||||
|
Enum.reduce(content_map, %{}, fn {lang, content}, acc ->
|
||||||
|
fixed_content = fix_content(content, mention_users)
|
||||||
|
|
||||||
|
Map.put(acc, lang, fixed_content)
|
||||||
|
end)
|
||||||
|
|
||||||
|
object
|
||||||
|
|> Map.put("contentMap", fixed_content_map)
|
||||||
|
|> Map.put(
|
||||||
|
"content",
|
||||||
|
Pleroma.MultiLanguage.map_to_str(fixed_content_map, multiline: true)
|
||||||
|
)
|
||||||
|
else
|
||||||
|
_ ->
|
||||||
|
# image-only posts from pleroma apparently reach this MRF without the content field
|
||||||
|
content = object["content"] || ""
|
||||||
|
|
||||||
|
fixed_content = fix_content(content, mention_users)
|
||||||
|
|
||||||
|
Map.put(object, "content", fixed_content)
|
||||||
|
end
|
||||||
|
|
||||||
|
{:ok, put_in(activity["object"], fixed_object)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def filter(object), do: {:ok, object}
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def describe, do: {:ok, %{}}
|
||||||
|
|
||||||
|
defp fix_content(content, mention_users) do
|
||||||
explicitly_mentioned_uris =
|
explicitly_mentioned_uris =
|
||||||
extract_mention_uris_from_content(content)
|
extract_mention_uris_from_content(content)
|
||||||
|> MapSet.new()
|
|> MapSet.new()
|
||||||
|
@ -113,25 +145,16 @@ def filter(
|
||||||
do: "<span class=\"recipients-inline\">#{added_mentions}</span>",
|
do: "<span class=\"recipients-inline\">#{added_mentions}</span>",
|
||||||
else: ""
|
else: ""
|
||||||
|
|
||||||
content =
|
cond do
|
||||||
cond do
|
# For Markdown posts, insert the mentions inside the first <p> tag
|
||||||
# For Markdown posts, insert the mentions inside the first <p> tag
|
recipients_inline != "" && String.starts_with?(content, "<p>") ->
|
||||||
recipients_inline != "" && String.starts_with?(content, "<p>") ->
|
"<p>" <> recipients_inline <> String.trim_leading(content, "<p>")
|
||||||
"<p>" <> recipients_inline <> String.trim_leading(content, "<p>")
|
|
||||||
|
|
||||||
recipients_inline != "" ->
|
recipients_inline != "" ->
|
||||||
recipients_inline <> content
|
recipients_inline <> content
|
||||||
|
|
||||||
true ->
|
true ->
|
||||||
content
|
content
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok, put_in(object["object"]["content"], content)}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
|
||||||
def filter(object), do: {:ok, object}
|
|
||||||
|
|
||||||
@impl true
|
|
||||||
def describe, do: {:ok, %{}}
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -87,6 +87,58 @@ test "the replied-to user is sorted to the left" do
|
||||||
"<span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{luigi.id}\" href=\"#{luigi.ap_id}\" rel=\"ugc\">@<span>luigi</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{mario.id}\" href=\"#{mario.ap_id}\" rel=\"ugc\">@<span>mario</span></a></span> </span>WHA-HA!"
|
"<span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{luigi.id}\" href=\"#{luigi.ap_id}\" rel=\"ugc\">@<span>luigi</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{mario.id}\" href=\"#{mario.ap_id}\" rel=\"ugc\">@<span>mario</span></a></span> </span>WHA-HA!"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "supports mulitlang" do
|
||||||
|
[mario, luigi, wario] = [
|
||||||
|
insert(:user, nickname: "mario"),
|
||||||
|
insert(:user, nickname: "luigi"),
|
||||||
|
insert(:user, nickname: "wario")
|
||||||
|
]
|
||||||
|
|
||||||
|
{:ok, post1} = CommonAPI.post(mario, %{status: "Letsa go!"})
|
||||||
|
|
||||||
|
{:ok, post2} =
|
||||||
|
CommonAPI.post(luigi, %{status: "Oh yaah", in_reply_to_id: post1.id, to: [mario.ap_id]})
|
||||||
|
|
||||||
|
activity = %{
|
||||||
|
"type" => "Create",
|
||||||
|
"actor" => wario.ap_id,
|
||||||
|
"object" => %{
|
||||||
|
"type" => "Note",
|
||||||
|
"actor" => wario.ap_id,
|
||||||
|
"content" => "WHA-HA!",
|
||||||
|
"contentMap" => %{
|
||||||
|
"a" => "mew mew",
|
||||||
|
"b" => "lol lol"
|
||||||
|
},
|
||||||
|
"to" => [
|
||||||
|
mario.ap_id,
|
||||||
|
luigi.ap_id,
|
||||||
|
Constants.as_public()
|
||||||
|
],
|
||||||
|
"inReplyTo" => Object.normalize(post2).data["id"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok,
|
||||||
|
%{
|
||||||
|
"object" => %{
|
||||||
|
"content" => content,
|
||||||
|
"contentMap" =>
|
||||||
|
%{
|
||||||
|
"a" => content_a,
|
||||||
|
"b" => content_b
|
||||||
|
} = content_map
|
||||||
|
}
|
||||||
|
}} = ForceMentionsInContent.filter(activity)
|
||||||
|
|
||||||
|
mentions_part =
|
||||||
|
"<span class=\"recipients-inline\"><span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{luigi.id}\" href=\"#{luigi.ap_id}\" rel=\"ugc\">@<span>luigi</span></a></span> <span class=\"h-card\"><a class=\"u-url mention\" data-user=\"#{mario.id}\" href=\"#{mario.ap_id}\" rel=\"ugc\">@<span>mario</span></a></span> </span>"
|
||||||
|
|
||||||
|
assert content_a == mentions_part <> "mew mew"
|
||||||
|
assert content_b == mentions_part <> "lol lol"
|
||||||
|
assert content == Pleroma.MultiLanguage.map_to_str(content_map, multiline: true)
|
||||||
|
end
|
||||||
|
|
||||||
test "don't mention self" do
|
test "don't mention self" do
|
||||||
mario = insert(:user, nickname: "mario")
|
mario = insert(:user, nickname: "mario")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue