From 6073ee1ba47894d2c0c66ea659bd57e55c2dba80 Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Fri, 31 Jul 2020 23:03:20 -0400 Subject: [PATCH] extract mentions --- .../Tools/StatusExtractor.cs | 33 ++++++++---- .../Tools/StatusExtractorTests.cs | 52 ++++++++++++++++++- 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs b/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs index c19f97e..91dc453 100644 --- a/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs +++ b/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs @@ -12,6 +12,8 @@ namespace BirdsiteLive.Domain.Tools public class StatusExtractor : IStatusExtractor { + private readonly Regex _hastagRegex = new Regex(@"\W(\#[a-zA-Z0-9]+\b)(?!;)"); + private readonly Regex _mentionRegex = new Regex(@"\W(\@[a-zA-Z0-9]+\b)(?!;)"); private readonly InstanceSettings _instanceSettings; #region Ctor @@ -23,11 +25,10 @@ namespace BirdsiteLive.Domain.Tools public (string content, Tag[] tags) ExtractTags(string messageContent) { - var regex = new Regex(@"\W(\#[a-zA-Z0-9]+\b)(?!;)"); - var match = regex.Matches(messageContent); - var tags = new List(); - foreach (var m in match) + + var hashtagMatch = _hastagRegex.Matches(messageContent); + foreach (var m in hashtagMatch) { var tag = m.ToString().Replace("#", string.Empty).Replace("\n", string.Empty).Trim(); var url = $"https://{_instanceSettings.Domain}/tags/{tag}"; @@ -41,13 +42,27 @@ namespace BirdsiteLive.Domain.Tools messageContent = Regex.Replace(messageContent, m.ToString(), $@"#{tag}"); - - //messageContent = messageContent.Replace( - // $"#{tag}", - // $@"#{tag}"); } - return (messageContent, new Tag[0]); + var mentionMatch = _mentionRegex.Matches(messageContent); + foreach (var m in mentionMatch) + { + var mention = m.ToString().Replace("@", string.Empty).Replace("\n", string.Empty).Trim(); + var url = $"https://{_instanceSettings.Domain}/users/{mention}"; + var name = $"@{mention}@{_instanceSettings.Domain}"; + + tags.Add(new Tag + { + name = name, + href = url, + type = "Mention" + }); + + messageContent = Regex.Replace(messageContent, m.ToString(), + $@"@{mention}"); + } + + return (messageContent, tags.ToArray()); } } } \ No newline at end of file diff --git a/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs b/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs index d2b63bf..d40a519 100644 --- a/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs +++ b/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using BirdsiteLive.Common.Settings; using BirdsiteLive.Domain.Tools; using BirdsiteLive.Twitter.Models; @@ -22,7 +23,7 @@ namespace BirdsiteLive.Domain.Tests.Tools #endregion [TestMethod] - public void Extract_SingleTag_Test() + public void Extract_SingleHashTag_Test() { #region Stubs var message = $"Bla!{Environment.NewLine}#mytag⁠"; @@ -32,13 +33,18 @@ namespace BirdsiteLive.Domain.Tests.Tools var result = service.ExtractTags(message); #region Validations + Assert.AreEqual(1, result.tags.Length); + Assert.AreEqual("#mytag", result.tags.First().name); + Assert.AreEqual("Hashtag", result.tags.First().type); + Assert.AreEqual("https://domain.name/tags/mytag", result.tags.First().href); + Assert.IsTrue(result.content.Contains("Bla!")); Assert.IsTrue(result.content.Contains(@"#mytag")); #endregion } [TestMethod] - public void Extract_MultiTags_Test() + public void Extract_MultiHashTags_Test() { #region Stubs var message = $"Bla!{Environment.NewLine}#mytag #mytag2 #mytag3⁠{Environment.NewLine}Test #bal Test"; @@ -48,6 +54,7 @@ namespace BirdsiteLive.Domain.Tests.Tools var result = service.ExtractTags(message); #region Validations + Assert.AreEqual(4, result.tags.Length); Assert.IsTrue(result.content.Contains("Bla!")); Assert.IsTrue(result.content.Contains(@"#mytag")); Assert.IsTrue(result.content.Contains(@"#mytag2")); @@ -55,5 +62,46 @@ namespace BirdsiteLive.Domain.Tests.Tools Assert.IsTrue(result.content.Contains(@"#bal")); #endregion } + + [TestMethod] + public void Extract_SingleMentionTag_Test() + { + #region Stubs + var message = $"Bla!{Environment.NewLine}@mynickname⁠"; + #endregion + + var service = new StatusExtractor(_settings); + var result = service.ExtractTags(message); + + #region Validations + Assert.AreEqual(1, result.tags.Length); + Assert.AreEqual("@mynickname@domain.name", result.tags.First().name); + Assert.AreEqual("Mention", result.tags.First().type); + Assert.AreEqual("https://domain.name/users/mynickname", result.tags.First().href); + + Assert.IsTrue(result.content.Contains("Bla!")); + Assert.IsTrue(result.content.Contains(@"@mynickname")); + #endregion + } + + [TestMethod] + public void Extract_MultiMentionTag_Test() + { + #region Stubs + var message = $"Bla!{Environment.NewLine}@mynickname⁠ @mynickname2 @mynickname3{Environment.NewLine}Test @dada Test"; + #endregion + + var service = new StatusExtractor(_settings); + var result = service.ExtractTags(message); + + #region Validations + Assert.AreEqual(4, result.tags.Length); + Assert.IsTrue(result.content.Contains("Bla!")); + Assert.IsTrue(result.content.Contains(@"@mynickname")); + Assert.IsTrue(result.content.Contains(@"@mynickname2")); + Assert.IsTrue(result.content.Contains(@"@mynickname3")); + Assert.IsTrue(result.content.Contains(@"@dada")); + #endregion + } } } \ No newline at end of file