diff --git a/Iceshrimp.Parsing/Mfm.fs b/Iceshrimp.Parsing/Mfm.fs index cb4cc081..b926082f 100644 --- a/Iceshrimp.Parsing/Mfm.fs +++ b/Iceshrimp.Parsing/Mfm.fs @@ -228,7 +228,8 @@ module private MfmParser = >>. skipString "@" >>. many1Chars ( satisfy isAsciiLetterOrNumber - <|> attempt (anyOf "._-" .>> nextCharSatisfies isAsciiLetterOrNumber) + <|> pchar '_' + <|> attempt (anyOf ".-" .>> nextCharSatisfies isAsciiLetterOrNumber) ) .>>. opt (skipChar '@' >>. domain) .>> (lookAhead diff --git a/Iceshrimp.Tests/Parsing/MfmTests.cs b/Iceshrimp.Tests/Parsing/MfmTests.cs index cf17a4f4..4e310d9c 100644 --- a/Iceshrimp.Tests/Parsing/MfmTests.cs +++ b/Iceshrimp.Tests/Parsing/MfmTests.cs @@ -66,13 +66,21 @@ public class MfmTests [TestMethod] public void TestMention() { - const string input = "test @test test @test@instance.tld"; + const string input = "test @test test @test@instance.tld @test_ @_test @test_@instance.tld @_test@instance.tld"; List expected = [ new MfmTextNode("test "), new MfmMentionNode("test", "test", null), new MfmTextNode(" test "), - new MfmMentionNode("test@instance.tld", "test", "instance.tld") + new MfmMentionNode("test@instance.tld", "test", "instance.tld"), + new MfmTextNode(" "), + new MfmMentionNode("test_", "test_", null), + new MfmTextNode(" "), + new MfmMentionNode("_test", "_test", null), + new MfmTextNode(" "), + new MfmMentionNode("test_@instance.tld", "test_", "instance.tld"), + new MfmTextNode(" "), + new MfmMentionNode("_test@instance.tld", "_test", "instance.tld"), ]; var res = Mfm.parse(input);