This commit is contained in:
Nicolas Constant 2021-03-30 18:44:53 -04:00
parent a4d62fac4f
commit 08461e45c5
No known key found for this signature in database
GPG key ID: 1E9F677FB01A5688
2 changed files with 52 additions and 16 deletions

View file

@ -81,12 +81,16 @@ namespace BirdsiteLive.Domain.Tools
} }
var url = $"https://{_instanceSettings.Domain}/tags/{tag}"; var url = $"https://{_instanceSettings.Domain}/tags/{tag}";
tags.Add(new Tag
if (tags.All(x => x.href != url))
{ {
name = $"#{tag}", tags.Add(new Tag
href = url, {
type = "Hashtag" name = $"#{tag}",
}); href = url,
type = "Hashtag"
});
}
messageContent = Regex.Replace(messageContent, Regex.Escape(m.Groups[0].ToString()), messageContent = Regex.Replace(messageContent, Regex.Escape(m.Groups[0].ToString()),
$@"{m.Groups[1]}<a href=""{url}"" class=""mention hashtag"" rel=""tag"">#<span>{tag}</span></a>{m.Groups[3]}"); $@"{m.Groups[1]}<a href=""{url}"" class=""mention hashtag"" rel=""tag"">#<span>{tag}</span></a>{m.Groups[3]}");
@ -96,7 +100,7 @@ namespace BirdsiteLive.Domain.Tools
if (extractMentions) if (extractMentions)
{ {
var mentionMatch = OrderByLength(UserRegexes.Mention.Matches(messageContent)); 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(); var mention = m.Groups[2].ToString();
@ -109,13 +113,16 @@ namespace BirdsiteLive.Domain.Tools
var url = $"https://{_instanceSettings.Domain}/users/{mention}"; var url = $"https://{_instanceSettings.Domain}/users/{mention}";
var name = $"@{mention}@{_instanceSettings.Domain}"; var name = $"@{mention}@{_instanceSettings.Domain}";
tags.Add(new Tag if (tags.All(x => x.href != url))
{ {
name = name, tags.Add(new Tag
href = url, {
type = "Mention" name = name,
}); href = url,
type = "Mention"
});
}
messageContent = Regex.Replace(messageContent, Regex.Escape(m.Groups[0].ToString()), messageContent = Regex.Replace(messageContent, Regex.Escape(m.Groups[0].ToString()),
$@"{m.Groups[1]}<span class=""h-card""><a href=""https://{_instanceSettings.Domain}/@{mention}"" class=""u-url mention"">@<span>{mention}</span></a></span>{m.Groups[3]}"); $@"{m.Groups[1]}<span class=""h-card""><a href=""https://{_instanceSettings.Domain}/@{mention}"" class=""u-url mention"">@<span>{mention}</span></a></span>{m.Groups[3]}");
} }
@ -123,13 +130,17 @@ namespace BirdsiteLive.Domain.Tools
return (messageContent.Trim(), tags.ToArray()); return (messageContent.Trim(), tags.ToArray());
} }
private IEnumerable<Match> OrderByLength(MatchCollection matches) private IEnumerable<Match> OrderByLength(MatchCollection matches)
{ {
var result = new List<Match>(); var result = new List<Match>();
foreach (Match m in matches) result.Add(m); 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; return result;
} }

View file

@ -364,7 +364,32 @@ namespace BirdsiteLive.Domain.Tests.Tools
Assert.IsTrue(result.content.Contains(@"<span class=""h-card""><a href=""https://domain.name/@mynickname"" class=""u-url mention"">@<span>mynickname</span></a></span>")); Assert.IsTrue(result.content.Contains(@"<span class=""h-card""><a href=""https://domain.name/@mynickname"" class=""u-url mention"">@<span>mynickname</span></a></span>"));
#endregion #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<ILogger<StatusExtractor>>();
#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(@"<span class=""h-card""><a href=""https://domain.name/@photos_floues"" class=""u-url mention"">@<span>photos_floues</span></a></span>"));
Assert.IsTrue(result.content.Contains(@"<span class=""h-card""><a href=""https://domain.name/@KiwixOffline"" class=""u-url mention"">@<span>KiwixOffline</span></a></span> <span class=""h-card""><a href=""https://domain.name/@photos_floues"" class=""u-url mention"">@<span>photos_floues</span></a></span>"));
Assert.IsTrue(result.content.Contains(@"Cc <span class=""h-card""><a href=""https://domain.name/@Pyb75"" class=""u-url mention"">@<span>Pyb75</span></a></span> <span class=""h-card""><a href=""https://domain.name/@photos_floues"" class=""u-url mention"">@<span>photos_floues</span></a></span> <span class=""h-card""><a href=""https://domain.name/@KiwixOffline"" class=""u-url mention"">@<span>KiwixOffline</span></a></span>"));
#endregion
}
[TestMethod] [TestMethod]
public void Extract_SingleMentionTag_RT_Test() public void Extract_SingleMentionTag_RT_Test()
{ {