diff --git a/Iceshrimp.Parsing/Mfm.fs b/Iceshrimp.Parsing/Mfm.fs index 37d18a18..e22159de 100644 --- a/Iceshrimp.Parsing/Mfm.fs +++ b/Iceshrimp.Parsing/Mfm.fs @@ -207,12 +207,26 @@ module private MfmParser = // Node parsers + let italicNode1 = + previousCharSatisfiesNot isNotWhitespace + >>. italicPattern + >>. pushLine + >>. manyTill inlineNode italicPattern + .>> assertLine + + let italicNode2 = + previousCharSatisfiesNot isNotWhitespace + >>. italicPatternAlt + >>. pushLine + >>. manyTill inlineNode italicPatternAlt + .>> assertLine + + let italicNode3 = + skipString "" >>. pushLine >>. manyTill inlineNode (skipString "") + .>> assertLine + let italicNode = - (italicPattern >>. pushLine >>. manyTill inlineNode italicPattern .>> assertLine) - <|> (italicPatternAlt >>. pushLine >>. manyTill inlineNode italicPatternAlt - .>> assertLine) - <|> (skipString "" >>. pushLine >>. manyTill inlineNode (skipString "") - .>> assertLine) + italicNode1 <|> italicNode2 <|> italicNode3 |>> fun c -> MfmItalicNode(aggregateTextInline c) :> MfmNode let boldNode = @@ -381,10 +395,7 @@ module private MfmParser = fnNode charNode ] - let simpleNodeSeq = - [ plainNode - emojiCodeNode - charNode ] + let simpleNodeSeq = [ plainNode; emojiCodeNode; charNode ] let blockNodeSeq = [ plainNode; centerNode; smallNode; codeBlockNode; mathBlockNode; quoteNode ] @@ -395,12 +406,12 @@ module private MfmParser = do nodeRef.Value <- choice <| seqAttempt (seqFlatten <| nodeSeq) do inlineNodeRef.Value <- choice <| (seqAttempt inlineNodeSeq) |>> fun v -> v :?> MfmInlineNode - + do simpleRef.Value <- choice <| seqAttempt simpleNodeSeq // Final parse command let parse = spaces >>. manyTill node eof .>> spaces - + let parseSimple = spaces >>. manyTill simple eof .>> spaces open MfmParser diff --git a/Iceshrimp.Tests/Parsing/MfmTests.cs b/Iceshrimp.Tests/Parsing/MfmTests.cs index 51680d6d..6803156c 100644 --- a/Iceshrimp.Tests/Parsing/MfmTests.cs +++ b/Iceshrimp.Tests/Parsing/MfmTests.cs @@ -40,6 +40,32 @@ public class MfmTests resMixedAlt.Should().Equal(expected, MfmNodeEqual); } + [TestMethod] + public void TestItalicNegative() + { + List expected = [new MfmTextNode("test*test*test")]; + List expectedAlt = [new MfmTextNode("test_test_test")]; + + Mfm.parse("test*test*test").ToList().Should().Equal(expected, MfmNodeEqual); + Mfm.parse("test_test_test").ToList().Should().Equal(expectedAlt, MfmNodeEqual); + + expected = [new MfmTextNode("test*test* test")]; + expectedAlt = [new MfmTextNode("test_test_ test")]; + + Mfm.parse("test*test* test").ToList().Should().Equal(expected, MfmNodeEqual); + Mfm.parse("test_test_ test").ToList().Should().Equal(expectedAlt, MfmNodeEqual); + + expected = + [ + new MfmTextNode("test "), + new MfmItalicNode(ListModule.OfSeq([new MfmTextNode("test")])), + new MfmTextNode("test") + ]; + + Mfm.parse("test *test*test").ToList().Should().Equal(expected, MfmNodeEqual); + Mfm.parse("test _test_test").ToList().Should().Equal(expected, MfmNodeEqual); + } + [TestMethod] public void TestParseList() {