OSDN Git Service

attachment_urlに指定可能なURLを140字のカウントから除外する
authorKimura Youichi <kim.upsilon@bucyou.net>
Mon, 26 Sep 2016 11:50:17 +0000 (20:50 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 11 Nov 2017 21:06:54 +0000 (06:06 +0900)
OpenTween.Tests/TwitterTest.cs
OpenTween/Tween.cs
OpenTween/Twitter.cs

index d61729a..3455131 100644 (file)
@@ -55,6 +55,22 @@ namespace OpenTween
         }
 
         [Theory]
+        [InlineData("https://twitter.com/twitterapi/status/22634515958", true)]
+        [InlineData("http://twitter.com/twitterapi/status/22634515958", true)]
+        [InlineData("https://mobile.twitter.com/twitterapi/status/22634515958", true)]
+        [InlineData("http://mobile.twitter.com/twitterapi/status/22634515958", true)]
+        [InlineData("https://twitter.com/i/web/status/22634515958", false)]
+        [InlineData("https://twitter.com/imgazyobuzi/status/293333871171354624/photo/1", false)]
+        [InlineData("https://pic.twitter.com/gbxdb2Oj", false)]
+        [InlineData("https://twitter.com/messages/compose?recipient_id=514241801", true)]
+        [InlineData("http://twitter.com/messages/compose?recipient_id=514241801", true)]
+        [InlineData("https://twitter.com/messages/compose?recipient_id=514241801&text=%E3%81%BB%E3%81%92", true)]
+        public void AttachmentUrlRegexTest(string url, bool isMatch)
+        {
+            Assert.Equal(isMatch, Twitter.AttachmentUrlRegex.IsMatch(url));
+        }
+
+        [Theory]
         [InlineData("http://favstar.fm/users/twitterapi/status/22634515958", new[] { "22634515958" })]
         [InlineData("http://ja.favstar.fm/users/twitterapi/status/22634515958", new[] { "22634515958" })]
         [InlineData("http://favstar.fm/t/22634515958", new[] { "22634515958" })]
index 54913a8..85123c3 100644 (file)
@@ -2124,8 +2124,11 @@ namespace OpenTween
             CheckReplyTo(StatusText.Text);
 
             long[] autoPopulatedUserIds;
-
             var statusText = this.RemoveAutoPopuratedMentions(this.StatusText.Text, out autoPopulatedUserIds);
+
+            string attachmentUrl;
+            statusText = this.RemoveAttachmentUrl(statusText, out attachmentUrl);
+
             statusText = this.FormatStatusText(statusText);
 
             if (this.GetRestStatusCount(statusText) < 0)
@@ -2150,6 +2153,8 @@ namespace OpenTween
                     .ToArray();
             }
 
+            status.attachmentUrl = attachmentUrl;
+
             if (ImageSelector.Visible)
             {
                 //画像投稿
@@ -4763,6 +4768,27 @@ namespace OpenTween
         }
 
         /// <summary>
+        /// attachment_url に指定可能な URL が含まれていれば除去
+        /// </summary>
+        private string RemoveAttachmentUrl(string statusText, out string attachmentUrl)
+        {
+            var match = Twitter.AttachmentUrlRegex.Match(statusText);
+            if (!match.Success)
+            {
+                attachmentUrl = null;
+                return statusText;
+            }
+
+            attachmentUrl = match.Value;
+
+            // マッチした URL を空白に置換
+            statusText = statusText.Substring(0, match.Index);
+
+            // テキストと URL の間にスペースが含まれていれば除去
+            return statusText.TrimEnd(' ');
+        }
+
+        /// <summary>
         /// ツイート投稿前のフッター付与などの前処理を行います
         /// </summary>
         private string FormatStatusText(string statusText)
@@ -4864,6 +4890,9 @@ namespace OpenTween
             long[] autoPopulatedUserIds;
             statusText = this.RemoveAutoPopuratedMentions(statusText, out autoPopulatedUserIds);
 
+            string attachmentUrl;
+            statusText = this.RemoveAttachmentUrl(statusText, out attachmentUrl);
+
             statusText = this.FormatStatusText(statusText);
 
             var remainCount = this.tw.GetTextLengthRemain(statusText);
index 8166426..e822011 100644 (file)
@@ -133,6 +133,15 @@ namespace OpenTween
         public static readonly Regex StatusUrlRegex = new Regex(@"https?://([^.]+\.)?twitter\.com/(#!/)?(?<ScreenName>[a-zA-Z0-9_]+)/status(es)?/(?<StatusId>[0-9]+)(/photo)?", RegexOptions.IgnoreCase);
 
         /// <summary>
+        /// attachment_url に指定可能な URL を判定する正規表現
+        /// </summary>
+        public static readonly Regex AttachmentUrlRegex = new Regex(@"https?://(
+   twitter\.com/[0-9A-Za-z]+/status/[0-9]+
+ | mobile\.twitter\.com/[0-9A-Za-z]+/status/[0-9]+
+ | twitter\.com/messages/compose\?recipient_id=[0-9]+(&.+)?
+)$", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
+
+        /// <summary>
         /// FavstarやaclogなどTwitter関連サービスのパーマリンクURLからステータスIDを抽出する正規表現
         /// </summary>
         public static readonly Regex ThirdPartyStatusUrlRegex = new Regex(@"https?://(?:[^.]+\.)?(?: