aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/metadata
diff options
context:
space:
mode:
authorrinpatch <rinpatch@sdf.org>2019-01-15 19:43:52 +0300
committerrinpatch <rinpatch@sdf.org>2019-01-15 19:43:52 +0300
commit850912b06b64818c069b8f169242f0106b73bbfe (patch)
tree7618de8afc8fb259c30ed90f859c1a6d33e8f0c8 /lib/pleroma/web/metadata
parent8745c8c9908ab21ee68e176ab085219df0d49d7b (diff)
downloadpleroma-850912b06b64818c069b8f169242f0106b73bbfe.tar.gz
refactor opengraph to a different module with a behaviour
Diffstat (limited to 'lib/pleroma/web/metadata')
-rw-r--r--lib/pleroma/web/metadata/opengraph.ex66
-rw-r--r--lib/pleroma/web/metadata/provider.ex3
2 files changed, 69 insertions, 0 deletions
diff --git a/lib/pleroma/web/metadata/opengraph.ex b/lib/pleroma/web/metadata/opengraph.ex
new file mode 100644
index 000000000..5f8bed2fb
--- /dev/null
+++ b/lib/pleroma/web/metadata/opengraph.ex
@@ -0,0 +1,66 @@
+defmodule Pleroma.Web.Metadata.Providers.OpenGraph do
+ alias Pleroma.Web.Metadata.Providers.Provider
+ alias Pleroma.{HTML, Formatter, User}
+ alias Pleroma.Web.MediaProxy
+
+ @behaviour Provider
+
+ @impl Provider
+ def build_tags(%{activity: activity, user: user}) do
+ with truncated_content = scrub_html_and_truncate(activity.data["object"]["content"]) do
+ [
+ {:meta,
+ [
+ property: "og:title",
+ content: user_name_string(user)
+ ], []},
+ {:meta, [property: "og:url", content: activity.data["id"]], []},
+ {:meta, [property: "og:description", content: truncated_content], []},
+ {:meta, [property: "og:image", content: user_avatar_url(user)], []},
+ {:meta, [property: "og:image:width", content: 120], []},
+ {:meta, [property: "og:image:height", content: 120], []},
+ {:meta, [property: "twitter:card", content: "summary"], []}
+ ]
+ end
+ end
+
+ @impl Provider
+ def build_tags(%{user: user}) do
+ with truncated_bio = scrub_html_and_truncate(user.bio || "") do
+ [
+ {:meta,
+ [
+ property: "og:title",
+ content: user_name_string(user)
+ ], []},
+ {:meta, [property: "og:url", content: User.profile_url(user)], []},
+ {:meta, [property: "og:description", content: truncated_bio], []},
+ {:meta, [property: "og:image", content: user_avatar_url(user)], []},
+ {:meta, [property: "og:image:width", content: 120], []},
+ {:meta, [property: "og:image:height", content: 120], []},
+ {:meta, [property: "twitter:card", content: "summary"], []}
+ ]
+ end
+ end
+
+ defp scrub_html_and_truncate(content) do
+ content
+ # html content comes from DB already encoded, decode first and scrub after
+ |> HtmlEntities.decode()
+ |> HTML.strip_tags()
+ |> Formatter.truncate()
+ end
+
+ defp user_avatar_url(user) do
+ User.avatar_url(user) |> MediaProxy.url()
+ end
+
+ defp user_name_string(user) do
+ "#{user.name}" <>
+ if user.local do
+ "(@#{user.nickname}@#{Pleroma.Web.Endpoint.host()})"
+ else
+ "(@#{user.nickname})"
+ end
+ end
+end
diff --git a/lib/pleroma/web/metadata/provider.ex b/lib/pleroma/web/metadata/provider.ex
new file mode 100644
index 000000000..f64810fad
--- /dev/null
+++ b/lib/pleroma/web/metadata/provider.ex
@@ -0,0 +1,3 @@
+defmodule Pleroma.Web.Metadata.Providers.Provider do
+ @callback build_tags(map()) :: list()
+end