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 %>