[parsing] Require whitespace in front of mfm italic nodes using asterisk or underscore delimiters

This ensures matching behavior with mfm.js
This commit is contained in:
Laura Hausmann 2024-11-11 00:10:12 +01:00
parent b341af67ed
commit 3f28a586a5
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 48 additions and 11 deletions

View file

@ -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 "<i>" >>. pushLine >>. manyTill inlineNode (skipString "</i>")
.>> assertLine
let italicNode =
(italicPattern >>. pushLine >>. manyTill inlineNode italicPattern .>> assertLine)
<|> (italicPatternAlt >>. pushLine >>. manyTill inlineNode italicPatternAlt
.>> assertLine)
<|> (skipString "<i>" >>. pushLine >>. manyTill inlineNode (skipString "</i>")
.>> 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 ]

View file

@ -40,6 +40,32 @@ public class MfmTests
resMixedAlt.Should().Equal(expected, MfmNodeEqual);
}
[TestMethod]
public void TestItalicNegative()
{
List<MfmNode> expected = [new MfmTextNode("test*test*test")];
List<MfmNode> 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<MfmInlineNode>([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()
{