[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:
parent
b341af67ed
commit
3f28a586a5
2 changed files with 48 additions and 11 deletions
|
@ -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 ]
|
||||
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue