[parsing] Add support for italic and bold segments surrounded by underscores (ISH-585)

This commit is contained in:
Laura Hausmann 2024-11-05 22:53:57 +01:00
parent 4d85fce1cf
commit aea5efd012
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 12 additions and 3 deletions

View file

@ -196,7 +196,8 @@ module private MfmParser =
} }
// Patterns // Patterns
let italicPattern = (notFollowedBy <| str "**") >>. skipChar '*' let italicPattern = ((notFollowedBy <| str "**") >>. skipChar '*')
let italicPatternAlt = ((notFollowedBy <| str "__") >>. skipChar '_')
let codePattern = (notFollowedBy <| str "```") >>. skipChar '`' let codePattern = (notFollowedBy <| str "```") >>. skipChar '`'
// Matchers // Matchers
@ -207,6 +208,8 @@ module private MfmParser =
let italicNode = let italicNode =
(italicPattern >>. pushLine >>. manyTill inlineNode italicPattern .>> assertLine) (italicPattern >>. pushLine >>. manyTill inlineNode italicPattern .>> assertLine)
<|> (italicPatternAlt >>. pushLine >>. manyTill inlineNode italicPatternAlt
.>> assertLine)
<|> (skipString "<i>" >>. pushLine >>. manyTill inlineNode (skipString "</i>") <|> (skipString "<i>" >>. pushLine >>. manyTill inlineNode (skipString "</i>")
.>> assertLine) .>> assertLine)
|>> fun c -> MfmItalicNode(aggregateTextInline c) :> MfmNode |>> fun c -> MfmItalicNode(aggregateTextInline c) :> MfmNode
@ -214,6 +217,8 @@ module private MfmParser =
let boldNode = let boldNode =
(skipString "**" >>. pushLine >>. manyTill inlineNode (skipString "**") (skipString "**" >>. pushLine >>. manyTill inlineNode (skipString "**")
.>> assertLine) .>> assertLine)
<|> (skipString "__" >>. pushLine >>. manyTill inlineNode (skipString "__")
.>> assertLine)
<|> (skipString "<b>" >>. pushLine >>. manyTill inlineNode (skipString "</b>") <|> (skipString "<b>" >>. pushLine >>. manyTill inlineNode (skipString "</b>")
.>> assertLine) .>> assertLine)
|>> fun c -> MfmBoldNode(aggregateTextInline c) :> MfmNode |>> fun c -> MfmBoldNode(aggregateTextInline c) :> MfmNode

View file

@ -24,7 +24,9 @@ public class MfmTests
]; ];
var res = Mfm.parse("*italic **bold** italic*").ToList(); var res = Mfm.parse("*italic **bold** italic*").ToList();
var resAlt = Mfm.parse("<i>italic <b>bold</b> italic</i>").ToList(); var resAlt = Mfm.parse("_italic **bold** italic_").ToList();
var resAlt2 = Mfm.parse("_italic __bold__ italic_").ToList();
var resAlt3 = Mfm.parse("<i>italic <b>bold</b> italic</i>").ToList();
var resMixed = Mfm.parse("<i>italic **bold** italic</i>").ToList(); var resMixed = Mfm.parse("<i>italic **bold** italic</i>").ToList();
var resMixedAlt = Mfm.parse("*italic <b>bold</b> italic*").ToList(); var resMixedAlt = Mfm.parse("*italic <b>bold</b> italic*").ToList();
@ -32,6 +34,8 @@ public class MfmTests
res.Should().Equal(expected, MfmNodeEqual); res.Should().Equal(expected, MfmNodeEqual);
resAlt.Should().Equal(expected, MfmNodeEqual); resAlt.Should().Equal(expected, MfmNodeEqual);
resAlt2.Should().Equal(expected, MfmNodeEqual);
resAlt3.Should().Equal(expected, MfmNodeEqual);
resMixed.Should().Equal(expected, MfmNodeEqual); resMixed.Should().Equal(expected, MfmNodeEqual);
resMixedAlt.Should().Equal(expected, MfmNodeEqual); resMixedAlt.Should().Equal(expected, MfmNodeEqual);
} }