[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
|
// 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 =
|
let italicNode =
|
||||||
(italicPattern >>. pushLine >>. manyTill inlineNode italicPattern .>> assertLine)
|
italicNode1 <|> italicNode2 <|> italicNode3
|
||||||
<|> (italicPatternAlt >>. pushLine >>. manyTill inlineNode italicPatternAlt
|
|
||||||
.>> assertLine)
|
|
||||||
<|> (skipString "<i>" >>. pushLine >>. manyTill inlineNode (skipString "</i>")
|
|
||||||
.>> assertLine)
|
|
||||||
|>> fun c -> MfmItalicNode(aggregateTextInline c) :> MfmNode
|
|>> fun c -> MfmItalicNode(aggregateTextInline c) :> MfmNode
|
||||||
|
|
||||||
let boldNode =
|
let boldNode =
|
||||||
|
@ -381,10 +395,7 @@ module private MfmParser =
|
||||||
fnNode
|
fnNode
|
||||||
charNode ]
|
charNode ]
|
||||||
|
|
||||||
let simpleNodeSeq =
|
let simpleNodeSeq = [ plainNode; emojiCodeNode; charNode ]
|
||||||
[ plainNode
|
|
||||||
emojiCodeNode
|
|
||||||
charNode ]
|
|
||||||
|
|
||||||
let blockNodeSeq =
|
let blockNodeSeq =
|
||||||
[ plainNode; centerNode; smallNode; codeBlockNode; mathBlockNode; quoteNode ]
|
[ plainNode; centerNode; smallNode; codeBlockNode; mathBlockNode; quoteNode ]
|
||||||
|
@ -395,12 +406,12 @@ module private MfmParser =
|
||||||
do nodeRef.Value <- choice <| seqAttempt (seqFlatten <| nodeSeq)
|
do nodeRef.Value <- choice <| seqAttempt (seqFlatten <| nodeSeq)
|
||||||
|
|
||||||
do inlineNodeRef.Value <- choice <| (seqAttempt inlineNodeSeq) |>> fun v -> v :?> MfmInlineNode
|
do inlineNodeRef.Value <- choice <| (seqAttempt inlineNodeSeq) |>> fun v -> v :?> MfmInlineNode
|
||||||
|
|
||||||
do simpleRef.Value <- choice <| seqAttempt simpleNodeSeq
|
do simpleRef.Value <- choice <| seqAttempt simpleNodeSeq
|
||||||
|
|
||||||
// Final parse command
|
// Final parse command
|
||||||
let parse = spaces >>. manyTill node eof .>> spaces
|
let parse = spaces >>. manyTill node eof .>> spaces
|
||||||
|
|
||||||
let parseSimple = spaces >>. manyTill simple eof .>> spaces
|
let parseSimple = spaces >>. manyTill simple eof .>> spaces
|
||||||
|
|
||||||
open MfmParser
|
open MfmParser
|
||||||
|
|
|
@ -40,6 +40,32 @@ public class MfmTests
|
||||||
resMixedAlt.Should().Equal(expected, MfmNodeEqual);
|
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]
|
[TestMethod]
|
||||||
public void TestParseList()
|
public void TestParseList()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue