From b4952a81fe2eeec9c033bf8c69148e53e1f40be2 Mon Sep 17 00:00:00 2001 From: ilja Date: Sat, 18 Feb 2023 19:30:27 +0100 Subject: [PATCH] Interpret `\n` as newline for MFM 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 | 4 ++-- .../object_validators/article_note_page_validator.ex | 8 +++++--- lib/pleroma/web/common_api/utils.ex | 2 +- test/fixtures/misskey/mfm_x_format.json | 2 +- .../article_note_page_validator_test.exs | 2 ++ 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 575bf9b2d..fc841a550 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -124,8 +124,8 @@ def mentions_escape(text, options \\ []) 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 diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex index 09b68c977..d4beed78d 100644 --- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex @@ -104,9 +104,9 @@ defp remote_mention_resolver( 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 @@ defp fix_misskey_content( 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) diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 345c5d10d..54918d13c 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -289,7 +289,7 @@ def format_input(text, "text/html", options) 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) diff --git a/test/fixtures/misskey/mfm_x_format.json b/test/fixtures/misskey/mfm_x_format.json index 590e399fe..ecbbddadd 100644 --- a/test/fixtures/misskey/mfm_x_format.json +++ b/test/fixtures/misskey/mfm_x_format.json @@ -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", diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs index 62ac5e051..523a17c17 100644 --- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs +++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs @@ -136,6 +136,8 @@ test "a misskey MFM status with a content field should work and be linked", _ do assert content =~ "mfm goes here

aaa" + + assert content =~ "some text
newline" end test "a misskey MFM status with a _misskey_content field should work and be linked", _ do