71 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| # Pleroma: A lightweight social networking server
 | |
| # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 | |
| # SPDX-License-Identifier: AGPL-3.0-only
 | |
| 
 | |
| defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
 | |
|   @moduledoc "Force a quote line into the message content."
 | |
|   @behaviour Pleroma.Web.ActivityPub.MRF.Policy
 | |
| 
 | |
|   defp build_inline_quote(prefix, url) do
 | |
|     "<span class=\"quote-inline\"><br/><br/>#{prefix}: <a href=\"#{url}\">#{url}</a></span>"
 | |
|   end
 | |
| 
 | |
|   defp has_inline_quote?(content, quote_url) do
 | |
|     cond do
 | |
|       # Does the quote URL exist in the content?
 | |
|       content =~ quote_url -> true
 | |
|       # Does the content already have a .quote-inline span?
 | |
|       content =~ "<span class=\"quote-inline\">" -> true
 | |
|       # No inline quote found
 | |
|       true -> false
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   defp filter_object(%{"quoteUri" => quote_url} = object) do
 | |
|     content = object["content"] || ""
 | |
| 
 | |
|     if has_inline_quote?(content, quote_url) do
 | |
|       object
 | |
|     else
 | |
|       prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
 | |
| 
 | |
|       content =
 | |
|         if String.ends_with?(content, "</p>") do
 | |
|           String.trim_trailing(content, "</p>") <> build_inline_quote(prefix, quote_url) <> "</p>"
 | |
|         else
 | |
|           content <> build_inline_quote(prefix, quote_url)
 | |
|         end
 | |
| 
 | |
|       Map.put(object, "content", content)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   @impl true
 | |
|   def filter(%{"object" => %{"quoteUri" => _} = object} = activity) do
 | |
|     {:ok, Map.put(activity, "object", filter_object(object))}
 | |
|   end
 | |
| 
 | |
|   @impl true
 | |
|   def filter(object), do: {:ok, object}
 | |
| 
 | |
|   @impl true
 | |
|   def describe, do: {:ok, %{}}
 | |
| 
 | |
|   @impl true
 | |
|   def config_description do
 | |
|     %{
 | |
|       key: :mrf_inline_quote,
 | |
|       related_policy: "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy",
 | |
|       label: "MRF Inline Quote",
 | |
|       description: "Force quote post URLs inline",
 | |
|       children: [
 | |
|         %{
 | |
|           key: :prefix,
 | |
|           type: :string,
 | |
|           description: "Prefix before the link",
 | |
|           suggestions: ["RE", "QT", "RT", "RN"]
 | |
|         }
 | |
|       ]
 | |
|     }
 | |
|   end
 | |
| end
 | 
