Merge branch 'support/bugfix_272' into 'develop'
[#272] fix hashtags in api See merge request pleroma/pleroma!510
This commit is contained in:
commit
ff10b9927b
|
@ -1,18 +1,21 @@
|
||||||
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.Activity
|
||||||
|
alias Pleroma.HTML
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
alias Pleroma.Web.MediaProxy
|
alias Pleroma.Web.MediaProxy
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Web.MastodonAPI.AccountView
|
||||||
alias Pleroma.HTML
|
alias Pleroma.Web.MastodonAPI.StatusView
|
||||||
|
|
||||||
# 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 +31,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 +75,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 +114,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 +132,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 +215,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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue