diff --git a/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs b/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs index 5cbff68..4e98baf 100644 --- a/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs +++ b/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs @@ -81,12 +81,16 @@ namespace BirdsiteLive.Domain.Tools } var url = $"https://{_instanceSettings.Domain}/tags/{tag}"; - tags.Add(new Tag + + if (tags.All(x => x.href != url)) { - name = $"#{tag}", - href = url, - type = "Hashtag" - }); + tags.Add(new Tag + { + name = $"#{tag}", + href = url, + type = "Hashtag" + }); + } messageContent = Regex.Replace(messageContent, Regex.Escape(m.Groups[0].ToString()), $@"{m.Groups[1]}#{tag}{m.Groups[3]}"); @@ -96,7 +100,7 @@ namespace BirdsiteLive.Domain.Tools if (extractMentions) { var mentionMatch = OrderByLength(UserRegexes.Mention.Matches(messageContent)); - foreach (Match m in mentionMatch.OrderByDescending(x => x.Length)) + foreach (Match m in mentionMatch) { var mention = m.Groups[2].ToString(); @@ -109,13 +113,16 @@ namespace BirdsiteLive.Domain.Tools var url = $"https://{_instanceSettings.Domain}/users/{mention}"; var name = $"@{mention}@{_instanceSettings.Domain}"; - tags.Add(new Tag + if (tags.All(x => x.href != url)) { - name = name, - href = url, - type = "Mention" - }); - + tags.Add(new Tag + { + name = name, + href = url, + type = "Mention" + }); + } + messageContent = Regex.Replace(messageContent, Regex.Escape(m.Groups[0].ToString()), $@"{m.Groups[1]}@{mention}{m.Groups[3]}"); } @@ -123,13 +130,17 @@ namespace BirdsiteLive.Domain.Tools return (messageContent.Trim(), tags.ToArray()); } - + private IEnumerable OrderByLength(MatchCollection matches) { var result = new List(); - foreach (Match m in matches) result.Add(m); - result = result.OrderByDescending(x => x.Length).ToList(); + + result = result + .OrderBy(x => x.Length) + .GroupBy(p => p.Value) + .Select(g => g.First()) + .ToList(); return result; } diff --git a/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs b/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs index a279dd0..a86b56e 100644 --- a/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs +++ b/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs @@ -364,7 +364,32 @@ namespace BirdsiteLive.Domain.Tests.Tools Assert.IsTrue(result.content.Contains(@"@mynickname")); #endregion } - + + [TestMethod] + public void Extract_MultiMentionTag_MultiOccurrence_Test() + { + #region Stubs + var message = $"[RT @yamenbousrih]{Environment.NewLine}@KiwixOffline @photos_floues Bla. Cc @Pyb75 @photos_floues @KiwixOffline"; + #endregion + + #region Mocks + var logger = new Mock>(); + #endregion + + var service = new StatusExtractor(_settings, logger.Object); + var result = service.Extract(message); + + #region Validations + logger.VerifyAll(); + Assert.AreEqual(4, result.tags.Length); + Assert.AreEqual("Mention", result.tags.First().type); + + Assert.IsTrue(result.content.Contains(@"@photos_floues")); + Assert.IsTrue(result.content.Contains(@"@KiwixOffline @photos_floues")); + Assert.IsTrue(result.content.Contains(@"Cc @Pyb75 @photos_floues @KiwixOffline")); + #endregion + } + [TestMethod] public void Extract_SingleMentionTag_RT_Test() {