Metadata/Utils: use summary as description if set

When generating OpenGraph and TwitterCard metadata for a post, the
summary field will be used first if it is set to generate the post
description.
This commit is contained in:
Hélène 2022-08-23 14:49:05 +02:00 committed by FloatingGhost
parent 0b14f02ed2
commit 8683252fc5
3 changed files with 81 additions and 3 deletions

View file

@ -8,8 +8,8 @@ defmodule Pleroma.Web.Metadata.Utils do
alias Pleroma.Formatter alias Pleroma.Formatter
alias Pleroma.HTML alias Pleroma.HTML
def scrub_html_and_truncate(%{data: %{"content" => content}} = object) do defp scrub_html_and_truncate_object_field(field, object) do
content field
# html content comes from DB already encoded, decode first and scrub after # html content comes from DB already encoded, decode first and scrub after
|> HtmlEntities.decode() |> HtmlEntities.decode()
|> String.replace(~r/<br\s?\/?>/, " ") |> String.replace(~r/<br\s?\/?>/, " ")
@ -19,6 +19,17 @@ def scrub_html_and_truncate(%{data: %{"content" => content}} = object) do
|> Formatter.truncate() |> Formatter.truncate()
end end
def scrub_html_and_truncate(%{data: %{"summary" => summary}} = object)
when is_binary(summary) and summary != "" do
summary
|> scrub_html_and_truncate_object_field(object)
end
def scrub_html_and_truncate(%{data: %{"content" => content}} = object) do
content
|> scrub_html_and_truncate_object_field(object)
end
def scrub_html_and_truncate(content, max_length \\ 200) when is_binary(content) do def scrub_html_and_truncate(content, max_length \\ 200) when is_binary(content) do
content content
|> scrub_html |> scrub_html

View file

@ -39,6 +39,7 @@ test "it uses summary twittercard if post has no attachment" do
"actor" => user.ap_id, "actor" => user.ap_id,
"tag" => [], "tag" => [],
"id" => "https://pleroma.gov/objects/whatever", "id" => "https://pleroma.gov/objects/whatever",
"summary" => "",
"content" => "pleroma in a nutshell" "content" => "pleroma in a nutshell"
} }
}) })
@ -54,6 +55,36 @@ test "it uses summary twittercard if post has no attachment" do
] == result ] == result
end end
test "it uses summary as description if post has one" do
user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
{:ok, activity} = CommonAPI.post(user, %{status: "HI"})
note =
insert(:note, %{
data: %{
"actor" => user.ap_id,
"tag" => [],
"id" => "https://pleroma.gov/objects/whatever",
"summary" => "Public service announcement on caffeine consumption",
"content" => "cofe"
}
})
result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})
assert [
{:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []},
{:meta,
[
property: "twitter:description",
content: "Public service announcement on caffeine consumption"
], []},
{:meta, [property: "twitter:image", content: "http://localhost:4001/images/avi.png"],
[]},
{:meta, [property: "twitter:card", content: "summary"], []}
] == result
end
test "it renders avatar not attachment if post is nsfw and unfurl_nsfw is disabled" do test "it renders avatar not attachment if post is nsfw and unfurl_nsfw is disabled" do
clear_config([Pleroma.Web.Metadata, :unfurl_nsfw], false) clear_config([Pleroma.Web.Metadata, :unfurl_nsfw], false)
user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994") user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
@ -65,6 +96,7 @@ test "it renders avatar not attachment if post is nsfw and unfurl_nsfw is disabl
"actor" => user.ap_id, "actor" => user.ap_id,
"tag" => [], "tag" => [],
"id" => "https://pleroma.gov/objects/whatever", "id" => "https://pleroma.gov/objects/whatever",
"summary" => "",
"content" => "pleroma in a nutshell", "content" => "pleroma in a nutshell",
"sensitive" => true, "sensitive" => true,
"attachment" => [ "attachment" => [
@ -109,6 +141,7 @@ test "it renders supported types of attachments and skips unknown types" do
"actor" => user.ap_id, "actor" => user.ap_id,
"tag" => [], "tag" => [],
"id" => "https://pleroma.gov/objects/whatever", "id" => "https://pleroma.gov/objects/whatever",
"summary" => "",
"content" => "pleroma in a nutshell", "content" => "pleroma in a nutshell",
"attachment" => [ "attachment" => [
%{ %{

View file

@ -8,7 +8,7 @@ defmodule Pleroma.Web.Metadata.UtilsTest do
alias Pleroma.Web.Metadata.Utils alias Pleroma.Web.Metadata.Utils
describe "scrub_html_and_truncate/1" do describe "scrub_html_and_truncate/1" do
test "it returns text without encode HTML" do test "it returns content text without encode HTML if summary is nil" do
user = insert(:user) user = insert(:user)
note = note =
@ -16,6 +16,7 @@ test "it returns text without encode HTML" do
data: %{ data: %{
"actor" => user.ap_id, "actor" => user.ap_id,
"id" => "https://pleroma.gov/objects/whatever", "id" => "https://pleroma.gov/objects/whatever",
"summary" => nil,
"content" => "Pleroma's really cool!" "content" => "Pleroma's really cool!"
} }
}) })
@ -23,6 +24,39 @@ test "it returns text without encode HTML" do
assert Utils.scrub_html_and_truncate(note) == "Pleroma's really cool!" assert Utils.scrub_html_and_truncate(note) == "Pleroma's really cool!"
end end
test "it returns context text without encode HTML if summary is empty" do
user = insert(:user)
note =
insert(:note, %{
data: %{
"actor" => user.ap_id,
"id" => "https://pleroma.gov/objects/whatever",
"summary" => "",
"content" => "Pleroma's really cool!"
}
})
assert Utils.scrub_html_and_truncate(note) == "Pleroma's really cool!"
end
test "it returns summary text without encode HTML if summary is filled" do
user = insert(:user)
note =
insert(:note, %{
data: %{
"actor" => user.ap_id,
"id" => "https://pleroma.gov/objects/whatever",
"summary" => "Public service announcement on caffeine consumption",
"content" => "cofe"
}
})
assert Utils.scrub_html_and_truncate(note) ==
"Public service announcement on caffeine consumption"
end
test "it does not return old content after editing" do test "it does not return old content after editing" do
user = insert(:user) user = insert(:user)