diff --git a/Iceshrimp.Parsing/Mfm.fs b/Iceshrimp.Parsing/Mfm.fs index b21ef24b..c9db59c5 100644 --- a/Iceshrimp.Parsing/Mfm.fs +++ b/Iceshrimp.Parsing/Mfm.fs @@ -200,7 +200,7 @@ module private MfmParser = previousCharSatisfiesNot isNotWhitespace >>. skipString "```" >>. opt (many1CharsTill asciiLetter (lookAhead newline)) - .>>. (skipNewline >>. manyCharsTill anyChar (skipNewline >>. skipString "```")) + .>>. (skipNewline >>. manyCharsTill anyChar (attempt <| skipNewline >>. skipString "```")) |>> 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 b80a0f94..6cae370d 100644 --- a/Iceshrimp.Tests/Parsing/MfmTests.cs +++ b/Iceshrimp.Tests/Parsing/MfmTests.cs @@ -115,6 +115,27 @@ public class MfmTests res.ToList().Should().Equal(expected, MfmNodeEqual); MfmSerializer.Serialize(res).Should().BeEquivalentTo(input); } + + [TestMethod] + public void TestCodeBlockMultiLine() + { + const string input = """ + ```cs + asd + sdf + ``` + """; + + List expected = + [ + new MfmCodeBlockNode("asd\nsdf", "cs") + ]; + var res = Mfm.parse(input); + + AssertionOptions.FormattingOptions.MaxDepth = 100; + res.ToList().Should().Equal(expected, MfmNodeEqual); + MfmSerializer.Serialize(res).Should().BeEquivalentTo(input); + } [TestMethod] public void Benchmark()