private bool UrlConvert(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")) { // 文字列が選択されている場合はその文字列について処理 //nico.ms使用、nicovideoにマッチしたら変換 if (SettingDialog.Nicoms && Regex.IsMatch(tmp, nico)) { result = nicoms.Shorten(tmp); } else if (Converter_Type != MyCommon.UrlConverter.Nicoms) { //短縮URL変換 日本語を含むかもしれないのでURLエンコードする result = ShortUrl.Make(Converter_Type, tmp); if (result.Equals("Can't convert")) { StatusLabel.Text = result.Insert(0, Converter_Type.ToString() + ":"); 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 (SettingDialog.Nicoms && Regex.IsMatch(tmp, nico)) { result = nicoms.Shorten(tmp); } else if (Converter_Type != MyCommon.UrlConverter.Nicoms) { //短縮URL変換 日本語を含むかもしれないのでURLエンコードする result = ShortUrl.Make(Converter_Type, tmp); if (result.Equals("Can't convert")) { StatusLabel.Text = result.Insert(0, Converter_Type.ToString() + ":"); 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; }