diff --git a/Iceshrimp.Backend/Core/Helpers/LibMfm/Serialization/MfmSerializer.cs b/Iceshrimp.Backend/Core/Helpers/LibMfm/Serialization/MfmSerializer.cs index ca525180..0d7aacba 100644 --- a/Iceshrimp.Backend/Core/Helpers/LibMfm/Serialization/MfmSerializer.cs +++ b/Iceshrimp.Backend/Core/Helpers/LibMfm/Serialization/MfmSerializer.cs @@ -15,9 +15,9 @@ public static class MfmSerializer { case MfmCodeBlockNode mfmCodeBlockNode: { - result.Append($"```{mfmCodeBlockNode.Language?.Value ?? ""}\n"); + result.Append($"\n```{mfmCodeBlockNode.Language?.Value ?? ""}\n"); result.Append(mfmCodeBlockNode.Code); - result.Append("\n```"); + result.Append("\n```\n"); break; } case MfmMathBlockNode mfmMathBlockNode: diff --git a/Iceshrimp.Parsing/Mfm.fs b/Iceshrimp.Parsing/Mfm.fs index 6d14c7cc..752d54bc 100644 --- a/Iceshrimp.Parsing/Mfm.fs +++ b/Iceshrimp.Parsing/Mfm.fs @@ -202,11 +202,13 @@ module private MfmParser = |>> fun v -> MfmInlineCodeNode(v) :> MfmNode let codeBlockNode = - previousCharSatisfiesNot isNotWhitespace + opt (previousCharSatisfies isNewline >>. skipNewline) + >>. previousCharSatisfiesNot isNotNewline >>. skipString "```" >>. opt (many1CharsTill asciiLetter (lookAhead newline)) .>>. (skipNewline >>. manyCharsTill anyChar (attempt (skipNewline >>. skipString "```"))) + .>> (opt <| attempt (skipNewline >>. nextCharSatisfies isNewline)) |>> fun (lang: string option, code: string) -> MfmCodeBlockNode(code, lang) :> MfmNode let mathNode = diff --git a/Iceshrimp.Tests/Parsing/MfmTests.cs b/Iceshrimp.Tests/Parsing/MfmTests.cs index d7333e7f..b1363df7 100644 --- a/Iceshrimp.Tests/Parsing/MfmTests.cs +++ b/Iceshrimp.Tests/Parsing/MfmTests.cs @@ -142,9 +142,11 @@ public class MfmTests { const string input = """ test 123 + ``` this is a code block ``` + test 123 """; List expected =