Metadata/Utils: use summary as description if set
authorHélène <pleroma-dev@helene.moe>
Tue, 23 Aug 2022 12:49:05 +0000 (14:49 +0200)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Sun, 11 Sep 2022 18:55:38 +0000 (19:55 +0100)
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.

lib/pleroma/web/metadata/utils.ex
test/pleroma/web/metadata/providers/twitter_card_test.exs
test/pleroma/web/metadata/utils_test.exs

index caca429341b2ac3aed5b7d86d31b65e03f779469..8990bef543aae34ba0662e0b20e80d80fd765586 100644 (file)
@@ -8,8 +8,8 @@ defmodule Pleroma.Web.Metadata.Utils do
   alias Pleroma.Formatter
   alias Pleroma.HTML
 
-  def scrub_html_and_truncate(%{data: %{"content" => content}} = object) do
-    content
+  defp scrub_html_and_truncate_object_field(field, object) do
+    field
     # html content comes from DB already encoded, decode first and scrub after
     |> HtmlEntities.decode()
     |> String.replace(~r/<br\s?\/?>/, " ")
@@ -19,6 +19,17 @@ defmodule Pleroma.Web.Metadata.Utils do
     |> Formatter.truncate()
   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
     content
     |> scrub_html
index 1b8d27cda41f174f5ccfba1b63b95f1e508f11e1..5d7ad08ef3a6a861fd682053e0dd2594426727af 100644 (file)
@@ -39,6 +39,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do
           "actor" => user.ap_id,
           "tag" => [],
           "id" => "https://pleroma.gov/objects/whatever",
+          "summary" => "",
           "content" => "pleroma in a nutshell"
         }
       })
@@ -54,6 +55,36 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do
            ] == result
   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
     clear_config([Pleroma.Web.Metadata, :unfurl_nsfw], false)
     user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
@@ -65,6 +96,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do
           "actor" => user.ap_id,
           "tag" => [],
           "id" => "https://pleroma.gov/objects/whatever",
+          "summary" => "",
           "content" => "pleroma in a nutshell",
           "sensitive" => true,
           "attachment" => [
@@ -109,6 +141,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do
           "actor" => user.ap_id,
           "tag" => [],
           "id" => "https://pleroma.gov/objects/whatever",
+          "summary" => "",
           "content" => "pleroma in a nutshell",
           "attachment" => [
             %{
index c99d11596f250552ca679d901d880a47932c656d..665efb9cad73b79c7270e27b16b3c99ec4f76ab2 100644 (file)
@@ -8,7 +8,7 @@ defmodule Pleroma.Web.Metadata.UtilsTest do
   alias Pleroma.Web.Metadata.Utils
 
   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)
 
       note =
@@ -16,6 +16,7 @@ defmodule Pleroma.Web.Metadata.UtilsTest do
           data: %{
             "actor" => user.ap_id,
             "id" => "https://pleroma.gov/objects/whatever",
+            "summary" => nil,
             "content" => "Pleroma's really cool!"
           }
         })
@@ -23,6 +24,39 @@ defmodule Pleroma.Web.Metadata.UtilsTest do
       assert Utils.scrub_html_and_truncate(note) == "Pleroma's really cool!"
     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
       user = insert(:user)