diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 78325095a..ad29d21d7 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -32,26 +32,29 @@ defmodule Pleroma.Formatter do end end + def mention_tag(%User{id: id} = user, nickname, opts \\ []) do + user_url = user.uri || user.ap_id + nickname_text = get_nickname_text(nickname, opts) + + :span + |> Phoenix.HTML.Tag.content_tag( + Phoenix.HTML.Tag.content_tag( + :a, + ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)], + "data-user": id, + class: "u-url mention", + href: user_url, + rel: "ugc" + ), + class: "h-card" + ) + |> Phoenix.HTML.safe_to_string() + end + def mention_handler("@" <> nickname, buffer, opts, acc) do case User.get_cached_by_nickname(nickname) do - %User{id: id} = user -> - user_url = user.uri || user.ap_id - nickname_text = get_nickname_text(nickname, opts) - - link = - Phoenix.HTML.Tag.content_tag( - :span, - Phoenix.HTML.Tag.content_tag( - :a, - ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)], - "data-user": id, - class: "u-url mention", - href: user_url, - rel: "ugc" - ), - class: "h-card" - ) - |> Phoenix.HTML.safe_to_string() + %User{id: _id} = user -> + link = mention_tag(user, nickname, opts) {link, %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}} diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex index e11335170..243a25b18 100644 --- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex @@ -4,7 +4,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do use Ecto.Schema - + alias Pleroma.User alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object.Fetcher alias Pleroma.Web.CommonAPI.Utils @@ -81,16 +81,39 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do defp fix_replies(data), do: data + defp remote_mention_resolver(%{"tag" => tags}, "@" <> nickname = mention, buffer, opts, acc) do + with mention_tag <- + Enum.find(tags, fn t -> t["type"] == "Mention" && t["name"] == mention end), + false <- is_nil(mention_tag), + {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(mention_tag["href"]) do + link = Pleroma.Formatter.mention_tag(user, nickname, opts) + {link, %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}} + else + _ -> {buffer, acc} + end + end + # https://github.com/misskey-dev/misskey/pull/8787 defp fix_misskey_content( %{"source" => %{"mediaType" => "text/x.misskeymarkdown", "content" => content}} = object ) do - {linked, _, _} = Utils.format_input(content, "text/x.misskeymarkdown") + mention_handler = fn nick, buffer, opts, acc -> + remote_mention_resolver(object, nick, buffer, opts, acc) + end + + {linked, _, _} = + Utils.format_input(content, "text/x.misskeymarkdown", mention_handler: mention_handler) + Map.put(object, "content", linked) end defp fix_misskey_content(%{"_misskey_content" => content} = object) do - {linked, _, _} = Utils.format_input(content, "text/x.misskeymarkdown") + mention_handler = fn nick, buffer, opts, acc -> + remote_mention_resolver(object, nick, buffer, opts, acc) + end + + {linked, _, _} = + Utils.format_input(content, "text/x.misskeymarkdown", mention_handler: mention_handler) object |> Map.put("source", %{ diff --git a/test/fixtures/misskey/mfm_x_format.json b/test/fixtures/misskey/mfm_x_format.json index 31d6e5368..a24e90e7e 100644 --- a/test/fixtures/misskey/mfm_x_format.json +++ b/test/fixtures/misskey/mfm_x_format.json @@ -3,9 +3,9 @@ "type": "Note", "attributedTo": "https://misskey.local.live/users/92hzkskwgy", "summary": null, - "content": "
@akkoma_user@akkoma.local.live linkifylink #dancedance mfm goes here
## aaa