private async Task<bool> UrlConvertAsync(MyCommon.UrlConverter Converter_Type)
{
//t.coで投稿時自動短縮する場合は、外部サービスでの短縮禁止
//if (SettingDialog.UrlConvertAuto && SettingDialog.ShortenTco) return;
//Converter_Type=Nicomsの場合は、nicovideoのみ短縮する
//参考資料 RFC3986 Uniform Resource Identifier (URI): Generic Syntax
//Appendix A. Collected ABNF for URI
//http://www.ietf.org/rfc/rfc3986.txt
string result = "";
const string nico = @"^https?://[a-z]+\.(nicovideo|niconicommons|nicolive)\.jp/[a-z]+/[a-z0-9]+$";
if (StatusText.SelectionLength > 0)
{
string tmp = StatusText.SelectedText;
// httpから始まらない場合、ExcludeStringで指定された文字列で始まる場合は対象としない
if (tmp.StartsWith("http", StringComparison.OrdinalIgnoreCase))
{
// 文字列が選択されている場合はその文字列について処理
//nico.ms使用、nicovideoにマッチしたら変換
if (this._cfgCommon.Nicoms && Regex.IsMatch(tmp, nico))
{
result = nicoms.Shorten(tmp);
}
else if (Converter_Type != MyCommon.UrlConverter.Nicoms)
{
//短縮URL変換 日本語を含むかもしれないのでURLエンコードする
try
{
var srcUri = new Uri(MyCommon.urlEncodeMultibyteChar(tmp));
var resultUri = await ShortUrl.Instance.ShortenUrlAsync(Converter_Type, srcUri);
result = resultUri.AbsoluteUri;
}
catch (WebApiException e)
{
this.StatusLabel.Text = Converter_Type + ":" + e.Message;
return false;
}
catch (UriFormatException e)
{
this.StatusLabel.Text = Converter_Type + ":" + e.Message;
return false;
}
}
else
{
return true;
}
if (!string.IsNullOrEmpty(result))
{
urlUndo undotmp = new urlUndo();
StatusText.Select(StatusText.Text.IndexOf(tmp, StringComparison.Ordinal), tmp.Length);
StatusText.SelectedText = result;
//undoバッファにセット
undotmp.Before = tmp;
undotmp.After = result;
if (urlUndoBuffer == null)
{
urlUndoBuffer = new List<urlUndo>();
UrlUndoToolStripMenuItem.Enabled = true;
}
urlUndoBuffer.Add(undotmp);
}
}
}
else
{
const string url = @"(?<before>(?:[^\""':!=]|^|\:))" +
@"(?<url>(?<protocol>https?://)" +
@"(?<domain>(?:[\.-]|[^\p{P}\s])+\.[a-z]{2,}(?::[0-9]+)?)" +
@"(?<path>/[a-z0-9!*//();:&=+$/%#\-_.,~@]*[a-z0-9)=#/]?)?" +
@"(?<query>\?[a-z0-9!*//();:&=+$/%#\-_.,~@?]*[a-z0-9_&=#/])?)";
// 正規表現にマッチしたURL文字列をtinyurl化
foreach (Match mt in Regex.Matches(StatusText.Text, url, RegexOptions.IgnoreCase))
{
if (StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal) == -1) continue;
string tmp = mt.Result("${url}");
if (tmp.StartsWith("w", StringComparison.OrdinalIgnoreCase)) tmp = "http://" + tmp;
urlUndo undotmp = new urlUndo();
//選んだURLを選択(?)
StatusText.Select(StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal), mt.Result("${url}").Length);
//nico.ms使用、nicovideoにマッチしたら変換
if (this._cfgCommon.Nicoms && Regex.IsMatch(tmp, nico))
{
result = nicoms.Shorten(tmp);
}
else if (Converter_Type != MyCommon.UrlConverter.Nicoms)
{
//短縮URL変換 日本語を含むかもしれないのでURLエンコードする
try
{
var srcUri = new Uri(MyCommon.urlEncodeMultibyteChar(tmp));
var resultUri = await ShortUrl.Instance.ShortenUrlAsync(Converter_Type, srcUri);
result = resultUri.AbsoluteUri;
}
catch (HttpRequestException e)
{
// 例外のメッセージが「Response status code does not indicate success: 500 (Internal Server Error).」
// のように長いので「:」が含まれていればそれ以降のみを抽出する
var message = e.Message.Split(new[] { ':' }, count: 2).Last();
this.StatusLabel.Text = Converter_Type + ":" + message;
continue;
}
catch (WebApiException e)
{
this.StatusLabel.Text = Converter_Type + ":" + e.Message;
continue;
}
catch (UriFormatException e)
{
this.StatusLabel.Text = Converter_Type + ":" + e.Message;
continue;
}
}
else
{
continue;
}
if (!string.IsNullOrEmpty(result))
{
StatusText.Select(StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal), mt.Result("${url}").Length);
StatusText.SelectedText = result;
//undoバッファにセット
undotmp.Before = mt.Result("${url}");
undotmp.After = result;
if (urlUndoBuffer == null)
{
urlUndoBuffer = new List<urlUndo>();
UrlUndoToolStripMenuItem.Enabled = true;
}
urlUndoBuffer.Add(undotmp);
}
}
}
return true;
}