fix hashtags in api response

This commit is contained in:
Maksim Pechnikov 2018-12-06 21:50:34 +03:00
parent 5436aaad4f
commit 9442588ae9
2 changed files with 75 additions and 53 deletions

View file

@ -1,18 +1,26 @@
defmodule Pleroma.Web.MastodonAPI.StatusView do defmodule Pleroma.Web.MastodonAPI.StatusView do
use Pleroma.Web, :view use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI.{AccountView, StatusView}
alias Pleroma.{User, Activity} alias Pleroma.{
alias Pleroma.Web.CommonAPI.Utils Activity,
alias Pleroma.Web.MediaProxy HTML,
alias Pleroma.Repo Repo,
alias Pleroma.HTML User
}
alias Pleroma.Web.{
CommonAPI.Utils,
MastodonAPI.AccountView,
MastodonAPI.StatusView,
MediaProxy
}
# TODO: Add cached version. # TODO: Add cached version.
defp get_replied_to_activities(activities) do defp get_replied_to_activities(activities) do
activities activities
|> Enum.map(fn |> Enum.map(fn
%{data: %{"type" => "Create", "object" => %{"inReplyTo" => inReplyTo}}} -> %{data: %{"type" => "Create", "object" => %{"inReplyTo" => in_reply_to}}} ->
inReplyTo != "" && inReplyTo in_reply_to != "" && in_reply_to
_ -> _ ->
nil nil
@ -28,8 +36,8 @@ defp get_replied_to_activities(activities) do
def render("index.json", opts) do def render("index.json", opts) do
replied_to_activities = get_replied_to_activities(opts.activities) replied_to_activities = get_replied_to_activities(opts.activities)
render_many( opts.activities
opts.activities, |> render_many(
StatusView, StatusView,
"status.json", "status.json",
Map.put(opts, :replied_to_activities, replied_to_activities) Map.put(opts, :replied_to_activities, replied_to_activities)
@ -72,9 +80,9 @@ def render(
sensitive: false, sensitive: false,
spoiler_text: "", spoiler_text: "",
visibility: "public", visibility: "public",
media_attachments: [], media_attachments: reblogged[:media_attachments] || [],
mentions: mentions, mentions: mentions,
tags: [], tags: reblogged[:tags] || [],
application: %{ application: %{
name: "Web", name: "Web",
website: nil website: nil
@ -111,20 +119,9 @@ def render("status.json", %{activity: %{data: %{"object" => object}} = activity}
reply_to = get_reply_to(activity, opts) reply_to = get_reply_to(activity, opts)
reply_to_user = reply_to && User.get_cached_by_ap_id(reply_to.data["actor"]) reply_to_user = reply_to && User.get_cached_by_ap_id(reply_to.data["actor"])
emojis =
(activity.data["object"]["emoji"] || [])
|> Enum.map(fn {name, url} ->
name = HTML.strip_tags(name)
url =
HTML.strip_tags(url)
|> MediaProxy.url()
%{shortcode: name, url: url, static_url: url, visible_in_picker: false}
end)
content = content =
render_content(object) object
|> render_content()
|> HTML.filter_tags(User.html_filter_policy(opts[:for])) |> HTML.filter_tags(User.html_filter_policy(opts[:for]))
%{ %{
@ -140,22 +137,21 @@ def render("status.json", %{activity: %{data: %{"object" => object}} = activity}
reblogs_count: announcement_count, reblogs_count: announcement_count,
replies_count: 0, replies_count: 0,
favourites_count: like_count, favourites_count: like_count,
reblogged: !!repeated, reblogged: present?(repeated),
favourited: !!favorited, favourited: present?(favorited),
muted: false, muted: false,
sensitive: sensitive, sensitive: sensitive,
spoiler_text: object["summary"] || "", spoiler_text: object["summary"] || "",
visibility: get_visibility(object), visibility: get_visibility(object),
media_attachments: attachments |> Enum.take(4), media_attachments: attachments |> Enum.take(4),
mentions: mentions, mentions: mentions,
# fix, tags: tags,
tags: [],
application: %{ application: %{
name: "Web", name: "Web",
website: nil website: nil
}, },
language: nil, language: nil,
emojis: emojis emojis: build_emojis(activity.data["object"]["emoji"])
} }
end end
@ -224,30 +220,56 @@ def get_visibility(object) do
end end
def render_content(%{"type" => "Video"} = object) do def render_content(%{"type" => "Video"} = object) do
name = object["name"] with name when not is_nil(name) and name != "" <- object["name"] do
"<p><a href=\"#{object["id"]}\">#{name}</a></p>#{object["content"]}"
content = else
if !!name and name != "" do _ -> object["content"] || ""
"<p><a href=\"#{object["id"]}\">#{name}</a></p>#{object["content"]}" end
else
object["content"] || ""
end
content
end end
def render_content(%{"type" => object_type} = object) when object_type in ["Article", "Page"] do def render_content(%{"type" => object_type} = object)
summary = object["name"] when object_type in ["Article", "Page"] do
with summary when not is_nil(summary) and summary != "" <- object["name"],
content = url when is_bitstring(url) <- object["url"] do
if !!summary and summary != "" and is_bitstring(object["url"]) do "<p><a href=\"#{url}\">#{summary}</a></p>#{object["content"]}"
"<p><a href=\"#{object["url"]}\">#{summary}</a></p>#{object["content"]}" else
else _ -> object["content"] || ""
object["content"] || "" end
end
content
end end
def render_content(object), do: object["content"] || "" def render_content(object), do: object["content"] || ""
@doc """
Builds list emojis.
Arguments: `nil` or list tuple of name and url.
Returns list emojis.
## Examples
iex> Pleroma.Web.MastodonAPI.StatusView.build_emojis([{"2hu", "corndog.png"}])
[%{shortcode: "2hu", static_url: "corndog.png", url: "corndog.png", visible_in_picker: false}]
"""
@spec build_emojis(nil | list(tuple())) :: list(map())
def build_emojis(nil), do: []
def build_emojis(emojis) do
emojis
|> Enum.map(fn {name, url} ->
name = HTML.strip_tags(name)
url =
url
|> HTML.strip_tags()
|> MediaProxy.url()
%{shortcode: name, url: url, static_url: url, visible_in_picker: false}
end)
end
defp present?(nil), do: false
defp present?(false), do: false
defp present?(_), do: true
end end

View file

@ -24,7 +24,7 @@ test "a note with null content" do
note note
|> Map.put(:data, data) |> Map.put(:data, data)
user = User.get_cached_by_ap_id(note.data["actor"]) User.get_cached_by_ap_id(note.data["actor"])
status = StatusView.render("status.json", %{activity: note}) status = StatusView.render("status.json", %{activity: note})
@ -62,7 +62,7 @@ test "a note activity" do
visibility: "public", visibility: "public",
media_attachments: [], media_attachments: [],
mentions: [], mentions: [],
tags: [], tags: note.data["object"]["tag"],
application: %{ application: %{
name: "Web", name: "Web",
website: nil website: nil