diff --git a/config/config.exs b/config/config.exs
index 09eae6926..765cfa4db 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -283,9 +283,10 @@
config :pleroma, :feed,
post_title: %{
# Set max_length to 0 to suppress titles (Dave Winer suggestion)
- # Previously 100
- max_length: 0,
- omission: "..."
+ max_length: 100,
+ omission: "...",
+ # New method to extract title
+ parse_source: true
}
config :pleroma, :markup,
diff --git a/config/description.exs b/config/description.exs
index 001a21cba..505f07431 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -2938,7 +2938,13 @@
type: :string,
description: "Replacement which will be used after truncating string",
suggestions: ["..."]
- }
+ },
+ %{
+ key: :parse_source,
+ type: :boolean,
+ description: "Use content type-specific parsers to extract title (ignores max_length)",
+ suggestions: [true]
+ },
]
}
]
diff --git a/lib/pleroma/web/feed/feed_view.ex b/lib/pleroma/web/feed/feed_view.ex
index 937a6c9b2..87422f183 100644
--- a/lib/pleroma/web/feed/feed_view.ex
+++ b/lib/pleroma/web/feed/feed_view.ex
@@ -70,14 +70,23 @@ def logo(user) do
def last_activity(activities), do: List.last(activities)
- def maybe_activity_title(activity_data, opts \\ %{}) do
- case activity_title(activity_data, opts) do
+ def maybe_activity_title(activity, opts \\ %{}) do
+ case activity_title(activity, opts) do
"" -> ""
title -> "
#{title}"
end
end
- def activity_title(%{"content" => content}, opts \\ %{}) do
+ def activity_title(activity, opts \\ %{})
+
+ def activity_title(
+ %{"source" => %{"mediaType" => content_type, "content" => content}},
+ %{parse_source: true} = opts
+ ) do
+ split_content(content, content_type, opts) |> elem(0)
+ end
+
+ def activity_title(%{"content" => content}, opts) do
content
|> Pleroma.Web.Metadata.Utils.scrub_html()
|> Pleroma.Emoji.Formatter.demojify()
@@ -85,13 +94,36 @@ def activity_title(%{"content" => content}, opts \\ %{}) do
|> escape()
end
- def activity_content(%{"content" => content}) do
- content
- |> String.replace(~r/[\n\r]/, "")
+ def activity_title(_, _), do: ""
+
+ def activity_content(activity, opts \\ %{})
+
+ def activity_content(
+ %{"source" => %{"mediaType" => content_type, "content" => content}},
+ %{parse_source: true} = opts
+ ) do
+ start = split_content(content, content_type, opts) |> elem(1)
+ length = String.length(content)
+
+ {text, _mentions, _tags} =
+ String.slice(content, start, length)
+ |> Pleroma.Web.CommonAPI.Utils.format_input(content_type)
+
+ text
+ |> String.replace(~r/(\r?\n)+/, " ")
+ |> String.trim()
|> escape()
end
- def activity_content(_), do: ""
+ def activity_content(%{"content" => content}, _opts) do
+ # Replace 1 or more newlines with 1 space
+ content
+ |> String.replace(~r/(\r?\n)+/, " ")
+ |> String.trim()
+ |> escape()
+ end
+
+ def activity_content(_, _), do: ""
def activity_context(activity), do: escape(activity.data["context"])
@@ -111,15 +143,15 @@ def source_content(%{"source" => %{"mediaType" => _, "content" => content}}) do
xml_escape(content)
end
- def parse_title(activity_data, opts \\ %{})
+ def parse_title(activity, opts \\ %{})
def parse_title(%{"source" => %{"mediaType" => content_type, "content" => content}}, opts) do
split_content(content, content_type, opts) |> elem(0)
end
- def parse_title(_activity_data, _opts), do: 0
+ def parse_title(_activity, _opts), do: 0
- def parse_description_offset(activity_data, opts \\ %{})
+ def parse_description_offset(activity, opts \\ %{})
def parse_description_offset(
%{"source" => %{"mediaType" => content_type, "content" => content}},
@@ -128,7 +160,7 @@ def parse_description_offset(
split_content(content, content_type, opts) |> elem(1)
end
- def parse_description_offset(_activity_data, _opts), do: 0
+ def parse_description_offset(_activity, _opts), do: 0
@spec split_content(binary(), binary(), any()) :: {binary(), non_neg_integer()}
def split_content(content, "text/html", _opts) do
diff --git a/lib/pleroma/web/templates/feed/feed/_activity.atom.eex b/lib/pleroma/web/templates/feed/feed/_activity.atom.eex
index 46fc41d39..c3fc13d93 100644
--- a/lib/pleroma/web/templates/feed/feed/_activity.atom.eex
+++ b/lib/pleroma/web/templates/feed/feed/_activity.atom.eex
@@ -5,7 +5,7 @@
<%= maybe_activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %>
- <%= activity_content(@data) %>
+ <%= activity_content(@data, Keyword.get(@feed_config, :post_title, %{})) %>
<%= @activity.data["published"] %>
<%= @activity.data["published"] %>
diff --git a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex
index 9a2d5d90a..65b0fe7eb 100644
--- a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex
+++ b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex
@@ -5,7 +5,7 @@
<%= maybe_activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %>
- <%= activity_content(@data) %>
+ <%= activity_content(@data, Keyword.get(@feed_config, :post_title, %{})) %>
<%= @activity.data["published"] %>
<%= @activity.data["published"] %>
diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex
index 5df0f58d4..a5e908765 100644
--- a/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex
+++ b/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex
@@ -8,7 +8,7 @@
<%= maybe_activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %>
- <%= activity_content(@data) %>
+ <%= activity_content(@data, Keyword.get(@feed_config, :post_title, %{})) %>
<%= if @activity.local do %>
diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex
index 6a20d4c84..b6b34d407 100644
--- a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex
+++ b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex
@@ -5,7 +5,7 @@
<%= maybe_activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %>
- <%= activity_content(@data) %>
+ <%= activity_content(@data, Keyword.get(@feed_config, :post_title, %{})) %>
<%= for attachment <- @data["attachment"] || [] do %>
<% end %>