From aea5efd012dd0cbd06d274ef4fe3993a84d8366f Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Tue, 5 Nov 2024 22:53:57 +0100 Subject: [PATCH] [parsing] Add support for italic and bold segments surrounded by underscores (ISH-585) --- Iceshrimp.Parsing/Mfm.fs | 7 ++++++- Iceshrimp.Tests/Parsing/MfmTests.cs | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Iceshrimp.Parsing/Mfm.fs b/Iceshrimp.Parsing/Mfm.fs index 4b326758..378ecea1 100644 --- a/Iceshrimp.Parsing/Mfm.fs +++ b/Iceshrimp.Parsing/Mfm.fs @@ -196,7 +196,8 @@ module private MfmParser = } // Patterns - let italicPattern = (notFollowedBy <| str "**") >>. skipChar '*' + let italicPattern = ((notFollowedBy <| str "**") >>. skipChar '*') + let italicPatternAlt = ((notFollowedBy <| str "__") >>. skipChar '_') let codePattern = (notFollowedBy <| str "```") >>. skipChar '`' // Matchers @@ -207,6 +208,8 @@ module private MfmParser = let italicNode = (italicPattern >>. pushLine >>. manyTill inlineNode italicPattern .>> assertLine) + <|> (italicPatternAlt >>. pushLine >>. manyTill inlineNode italicPatternAlt + .>> assertLine) <|> (skipString "" >>. pushLine >>. manyTill inlineNode (skipString "") .>> assertLine) |>> fun c -> MfmItalicNode(aggregateTextInline c) :> MfmNode @@ -214,6 +217,8 @@ module private MfmParser = let boldNode = (skipString "**" >>. pushLine >>. manyTill inlineNode (skipString "**") .>> assertLine) + <|> (skipString "__" >>. pushLine >>. manyTill inlineNode (skipString "__") + .>> assertLine) <|> (skipString "" >>. pushLine >>. manyTill inlineNode (skipString "") .>> assertLine) |>> fun c -> MfmBoldNode(aggregateTextInline c) :> MfmNode diff --git a/Iceshrimp.Tests/Parsing/MfmTests.cs b/Iceshrimp.Tests/Parsing/MfmTests.cs index 7d9e7017..786dc78b 100644 --- a/Iceshrimp.Tests/Parsing/MfmTests.cs +++ b/Iceshrimp.Tests/Parsing/MfmTests.cs @@ -24,7 +24,9 @@ public class MfmTests ]; var res = Mfm.parse("*italic **bold** italic*").ToList(); - var resAlt = Mfm.parse("italic bold italic").ToList(); + var resAlt = Mfm.parse("_italic **bold** italic_").ToList(); + var resAlt2 = Mfm.parse("_italic __bold__ italic_").ToList(); + var resAlt3 = Mfm.parse("italic bold italic").ToList(); var resMixed = Mfm.parse("italic **bold** italic").ToList(); var resMixedAlt = Mfm.parse("*italic bold italic*").ToList(); @@ -32,6 +34,8 @@ public class MfmTests res.Should().Equal(expected, MfmNodeEqual); resAlt.Should().Equal(expected, MfmNodeEqual); + resAlt2.Should().Equal(expected, MfmNodeEqual); + resAlt3.Should().Equal(expected, MfmNodeEqual); resMixed.Should().Equal(expected, MfmNodeEqual); resMixedAlt.Should().Equal(expected, MfmNodeEqual); } @@ -380,7 +384,7 @@ public class MfmTests { var pre = Stopwatch.GetTimestamp(); Mfm.parse(mfm); - var ms = Stopwatch.GetElapsedTime(pre).GetTotalMilliseconds(); + var ms = Stopwatch.GetElapsedTime(pre).GetTotalMilliseconds(); Console.WriteLine($@"Took {ms} ms"); return ms; }