diff --git a/Iceshrimp.Parsing/Mfm.fs b/Iceshrimp.Parsing/Mfm.fs index 2e47ba11..0ddce802 100644 --- a/Iceshrimp.Parsing/Mfm.fs +++ b/Iceshrimp.Parsing/Mfm.fs @@ -2,6 +2,7 @@ namespace Iceshrimp.Parsing open System open System.Collections.Generic +open System.Runtime.Serialization open FParsec module MfmNodeTypes = @@ -140,9 +141,13 @@ module private MfmParser = satisfy isAsciiLetterOrNumber <|> pchar '_' <|> attempt ( - pchar '-' - .>> (previousCharSatisfies isAsciiLetterOrNumber - <|> nextCharSatisfies isAsciiLetterOrNumber) + previousCharSatisfies isAsciiLetterOrNumber >>. pchar '-' + .>> lookAhead (satisfy isAsciiLetterOrNumber) + ) + <|> attempt ( + (previousCharSatisfies '-'.Equals <|> previousCharSatisfies isAsciiLetterOrNumber) + >>. pchar '-' + .>> lookAhead (satisfy '-'.Equals <|> satisfy isAsciiLetterOrNumber) ) ) diff --git a/Iceshrimp.Tests/Parsing/MfmTests.cs b/Iceshrimp.Tests/Parsing/MfmTests.cs index fab54642..cbc54c3c 100644 --- a/Iceshrimp.Tests/Parsing/MfmTests.cs +++ b/Iceshrimp.Tests/Parsing/MfmTests.cs @@ -66,7 +66,7 @@ public class MfmTests [TestMethod] public void TestMention() { - const string input = "test @test test @test@instance.tld @test_ @_test @test_@instance.tld @_test@instance.tld"; + const string input = "test @test test @test@instance.tld @test_ @_test @test_@ins-tance.tld @_test@xn--mastodn-f1a.de @_test@-xn--mastodn-f1a.de"; List expected = [ new MfmTextNode("test "), @@ -78,9 +78,10 @@ public class MfmTests new MfmTextNode(" "), new MfmMentionNode("_test", "_test", null), new MfmTextNode(" "), - new MfmMentionNode("test_@instance.tld", "test_", "instance.tld"), + new MfmMentionNode("test_@ins-tance.tld", "test_", "ins-tance.tld"), new MfmTextNode(" "), - new MfmMentionNode("_test@instance.tld", "_test", "instance.tld"), + new MfmMentionNode("_test@xn--mastodn-f1a.de", "_test", "xn--mastodn-f1a.de"), + new MfmTextNode(" @_test@-xn--mastodn-f1a.de"), ]; var res = Mfm.parse(input);