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()
{