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) :)
This commit is contained in:
ilja 2023-02-18 19:30:27 +01:00
parent ef279ac53f
commit b4952a81fe
5 changed files with 11 additions and 7 deletions

View file

@ -124,8 +124,8 @@ def mentions_escape(text, options \\ []) do
end end
end end
def markdown_to_html(text) do def markdown_to_html(text, opts \\ %{}) do
Earmark.as_html!(text, %Earmark.Options{compact_output: true}) Earmark.as_html!(text, %Earmark.Options{compact_output: true} |> Map.merge(opts))
end end
def html_escape({text, mentions, hashtags}, type) do def html_escape({text, mentions, hashtags}, type) do

View file

@ -104,9 +104,9 @@ defp remote_mention_resolver(
end end
end end
# https://github.com/misskey-dev/misskey/pull/8787 # See https://akkoma.dev/FoundKeyGang/FoundKey/issues/343
# Misskey has an awful tendency to drop all custom formatting when it sends remotely # Misskey/Foundkey drops some of the custom formatting when it sends remotely
# So this basically reprocesses their MFM source # So this basically reprocesses the MFM source
defp fix_misskey_content( defp fix_misskey_content(
%{"source" => %{"mediaType" => "text/x.misskeymarkdown", "content" => content}} = object %{"source" => %{"mediaType" => "text/x.misskeymarkdown", "content" => content}} = object
) )
@ -121,6 +121,8 @@ defp fix_misskey_content(
Map.put(object, "content", linked) Map.put(object, "content", linked)
end 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 defp fix_misskey_content(%{"_misskey_content" => content} = object) when is_binary(content) do
mention_handler = fn nick, buffer, opts, acc -> mention_handler = fn nick, buffer, opts, acc ->
remote_mention_resolver(object, nick, buffer, opts, acc) remote_mention_resolver(object, nick, buffer, opts, acc)

View file

@ -289,7 +289,7 @@ def format_input(text, "text/html", options) do
def format_input(text, "text/x.misskeymarkdown", options) do def format_input(text, "text/x.misskeymarkdown", options) do
text text
|> Formatter.markdown_to_html() |> Formatter.markdown_to_html(%{breaks: true})
|> MfmParser.Parser.parse() |> MfmParser.Parser.parse()
|> MfmParser.Encoder.to_html() |> MfmParser.Encoder.to_html()
|> Formatter.linkify(options) |> Formatter.linkify(options)

View file

@ -5,7 +5,7 @@
"summary": null, "summary": null,
"content": "this does not get replaced", "content": "this does not get replaced",
"source": { "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" "mediaType": "text/x.misskeymarkdown"
}, },
"published": "2022-07-10T15:37:36.368Z", "published": "2022-07-10T15:37:36.368Z",

View file

@ -136,6 +136,8 @@ test "a misskey MFM status with a content field should work and be linked", _ do
assert content =~ 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" "<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 end
test "a misskey MFM status with a _misskey_content field should work and be linked", _ do test "a misskey MFM status with a _misskey_content field should work and be linked", _ do