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()
{