}
[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" })]
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)
.ToArray();
}
+ status.attachmentUrl = attachmentUrl;
+
if (ImageSelector.Visible)
{
//画像投稿
}
/// <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)
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);
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?://(?:[^.]+\.)?(?: