From ce996c20b2fc34f233ea884ef0cb6c510ac3018f Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Sat, 1 Aug 2020 00:00:27 -0400 Subject: [PATCH] fix start tag detection --- .../Tools/StatusExtractor.cs | 7 +++- .../Tools/StatusExtractorTests.cs | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs b/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs index 134fc3f..c8067c1 100644 --- a/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs +++ b/src/BirdsiteLive.Domain/Tools/StatusExtractor.cs @@ -13,7 +13,11 @@ namespace BirdsiteLive.Domain.Tools public class StatusExtractor : IStatusExtractor { private readonly Regex _hastagRegex = new Regex(@"\W(\#[a-zA-Z0-9_ー]+\b)(?!;)"); + //private readonly Regex _hastagRegex = new Regex(@"(?<=[\s>]|^)#(\w*[a-zA-Z0-9_ー]+\w*)\b(?!;)"); + //private readonly Regex _hastagRegex = new Regex(@"(?<=[\s>]|^)#(\w*[a-zA-Z0-9_ー]+)\b(?!;)"); private readonly Regex _mentionRegex = new Regex(@"\W(\@[a-zA-Z0-9_ー]+\b)(?!;)"); + //private readonly Regex _mentionRegex = new Regex(@"(?<=[\s>]|^)@(\w*[a-zA-Z0-9_ー]+\w*)\b(?!;)"); + //private readonly Regex _mentionRegex = new Regex(@"(?<=[\s>]|^)@(\w*[a-zA-Z0-9_ー]+)\b(?!;)"); private readonly InstanceSettings _instanceSettings; #region Ctor @@ -26,6 +30,7 @@ namespace BirdsiteLive.Domain.Tools public (string content, Tag[] tags) ExtractTags(string messageContent) { var tags = new List(); + messageContent = $" {messageContent} "; var hashtagMatch = _hastagRegex.Matches(messageContent); foreach (var m in hashtagMatch) @@ -62,7 +67,7 @@ namespace BirdsiteLive.Domain.Tools $@" @{mention}"); } - return (messageContent, tags.ToArray()); + return (messageContent.Trim(), 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 865fa76..d2f3bc9 100644 --- a/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs +++ b/src/Tests/BirdsiteLive.Domain.Tests/Tools/StatusExtractorTests.cs @@ -43,6 +43,27 @@ namespace BirdsiteLive.Domain.Tests.Tools #endregion } + [TestMethod] + public void Extract_SingleHashTag_AtStart_Test() + { + #region Stubs + var message = $"#mytag⁠ Bla!"; + #endregion + + var service = new StatusExtractor(_settings); + 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_SingleHashTag_SpecialChar_Test() { @@ -126,6 +147,27 @@ namespace BirdsiteLive.Domain.Tests.Tools #endregion } + [TestMethod] + public void Extract_SingleMentionTag_AtStart_Test() + { + #region Stubs + var message = $"@mynickname Bla!"; + #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() {