Interpret `\n` as newline for MFM
authorilja <git@ilja.space>
Sat, 18 Feb 2023 18:30:27 +0000 (19:30 +0100)
committerilja <git@ilja.space>
Sat, 18 Feb 2023 18:56:11 +0000 (19:56 +0100)
Markdown doesn't generally consider `\n` a newline,
but Misskey does for MFM.

Now we do to for MFM (and not for Markdown) :)

lib/pleroma/formatter.ex
lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
lib/pleroma/web/common_api/utils.ex
test/fixtures/misskey/mfm_x_format.json
test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs

index 575bf9b2dcb20d3bc0ded04ea0abdb406cb6d0f1..fc841a55087f266fe6feb2021f06b82b1a89d287 100644 (file)
@@ -124,8 +124,8 @@ defmodule Pleroma.Formatter do
     end
   end
 
-  def markdown_to_html(text) do
-    Earmark.as_html!(text, %Earmark.Options{compact_output: true})
+  def markdown_to_html(text, opts \\ %{}) do
+    Earmark.as_html!(text, %Earmark.Options{compact_output: true} |> Map.merge(opts))
   end
 
   def html_escape({text, mentions, hashtags}, type) do
index 09b68c977f2c31c50e51d1dd7c398fdbccbc0640..d4beed78d3e5318d61c7fc3d1df2e470e1de7f31 100644 (file)
@@ -104,9 +104,9 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
     end
   end
 
-  # https://github.com/misskey-dev/misskey/pull/8787
-  # Misskey has an awful tendency to drop all custom formatting when it sends remotely
-  # So this basically reprocesses their MFM source
+  # See https://akkoma.dev/FoundKeyGang/FoundKey/issues/343
+  # Misskey/Foundkey drops some of the custom formatting when it sends remotely
+  # So this basically reprocesses the MFM source
   defp fix_misskey_content(
          %{"source" => %{"mediaType" => "text/x.misskeymarkdown", "content" => content}} = object
        )
@@ -121,6 +121,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
     Map.put(object, "content", linked)
   end
 
+  # See https://github.com/misskey-dev/misskey/pull/8787
+  # This is for compatibility with older Misskey instances
   defp fix_misskey_content(%{"_misskey_content" => content} = object) when is_binary(content) do
     mention_handler = fn nick, buffer, opts, acc ->
       remote_mention_resolver(object, nick, buffer, opts, acc)
index 345c5d10d2a15ecb9b59ffb577b900c5a13c20cd..54918d13c832939998478b45c4c069e1ef64b975 100644 (file)
@@ -289,7 +289,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
 
   def format_input(text, "text/x.misskeymarkdown", options) do
     text
-    |> Formatter.markdown_to_html()
+    |> Formatter.markdown_to_html(%{breaks: true})
     |> MfmParser.Parser.parse()
     |> MfmParser.Encoder.to_html()
     |> Formatter.linkify(options)
index 590e399fe9689ce1865d5d82f738a3992bf9ed16..ecbbddadd92a3d2b2a5ea9f7b6cc299983f3f2c4 100644 (file)
@@ -5,7 +5,7 @@
   "summary": null,
   "content": "this does not get replaced",
   "source": {
-    "content": "@akkoma_user @remote_user @full_tag_remote_user@misskey.local.live @oops_not_a_mention linkifylink #dancedance $[jelly mfm goes here] \n\n## aaa",
+    "content": "@akkoma_user @remote_user @full_tag_remote_user@misskey.local.live @oops_not_a_mention linkifylink #dancedance $[jelly mfm goes here] \n\n## aaa\n\nsome text\nnewline",
     "mediaType": "text/x.misskeymarkdown"
   },
   "published": "2022-07-10T15:37:36.368Z",
index 62ac5e0510ff3f32afbe1bed6997ab4ed13e9811..523a17c17e66380c130841543367d36e4a1f0c04 100644 (file)
@@ -136,6 +136,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
 
       assert content =~
                "<span class=\"mfm _mfm_jelly_\" style=\"display: inline-block; animation: 1s linear 0s infinite normal both running mfm-rubberBand;\">mfm goes here</span> </p>aaa"
+
+      assert content =~ "some text<br/>newline"
     end
 
     test "a misskey MFM status with a _misskey_content field should work and be linked", _ do