using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace Misuzilla.Applications.TwitterIrcGateway { /// /// 様々な処理に便利な機能を提供します。 /// public static class Utility { static Utility() { InitializeCharEntityReferenceTable(); } /// /// 日付の文字列をDateTime型に変換します。 /// /// /// public static DateTime ParseDateTime(String dateTimeString) { DateTime dateTime; if (!DateTime.TryParseExact(dateTimeString, "ddd MMM dd HH:mm:ss zz00 yyyy", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.None, out dateTime)) { dateTime = DateTime.Now; } return dateTime; } /// /// 文中の TinyURL を展開します。 /// タイムアウトするまでの時間は1秒です。 /// /// メッセージ /// public static String ResolveTinyUrlInMessage(String message) { return ResolveTinyUrlInMessage(message, 1000); } /// /// 文中の bitly を展開します。 /// タイムアウトするまでの時間は1秒です。 /// /// メッセージ /// public static String ResolveBitlyInMessage(String message) { return ResolveBitlyInMessage(message, 1000); } /// /// 文中の TinyURL を展開します。 /// /// メッセージ /// タイムアウトするまでの時間 /// public static String ResolveTinyUrlInMessage(String message, Int32 timeOut) { return Regex.Replace(message, @"http://tinyurl\.com/[A-Za-z0-9_/.;%&\-]+", delegate(Match m) { return ResolveRedirectUrl(m.Value, timeOut); }, RegexOptions.IgnoreCase); } /// /// 文中の bitly を展開します。 /// /// メッセージ /// タイムアウトするまでの時間 /// public static String ResolveBitlyInMessage(String message, Int32 timeOut) { // 改行ゴミがついてるのでついでに削除する return Regex.Replace(message, @"(http://(?:bit\.ly|j\.mp)/[A-Za-z0-9_/.;%&\-]+)[\r\n]*", delegate(Match m) { return ResolveRedirectUrl(m.Groups[1].Value, timeOut); }, RegexOptions.IgnoreCase); } /// /// TinyURLをリダイレクト先のURLに展開します。 /// /// TinyURLのURL /// タイムアウトするまでの時間 /// public static String ResolveRedirectUrl(String url, Int32 timeOut) { HttpWebResponse res = null; try { HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest; req.AllowAutoRedirect = false; req.Timeout = timeOut; req.Method = "HEAD"; req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; res = req.GetResponse() as HttpWebResponse; if (res.StatusCode == HttpStatusCode.MovedPermanently) { if (!String.IsNullOrEmpty(res.Headers["Location"])) { return res.Headers["Location"]; } } return url; } catch (WebException) { return url; } finally { if (res != null) { res.Close(); } } } /// /// 文中の URL を TinyURL に変換します。 /// タイムアウトするまでの時間は1秒です。 /// /// メッセージ /// public static String UrlToTinyUrlInMessage(String message) { return UrlToTinyUrlInMessage(message, 1000); } /// /// 文中の URL を TinyURL に変換します。 /// /// メッセージ /// タイムアウトするまでの時間 /// public static String UrlToTinyUrlInMessage(String message, Int32 timeOut) { return Regex.Replace(message, @"https?://[^ ]+", delegate(Match m) { return UrlToTinyUrl(m.Value, timeOut); }, RegexOptions.IgnoreCase); } /// /// URLをTinyURLに送信して短いURLに変換します。 /// /// URL /// タイムアウトするまでの時間 /// public static String UrlToTinyUrl(String url, Int32 timeOut) { HttpWebResponse res = null; try { HttpWebRequest req = HttpWebRequest.Create("http://tinyurl.com/api-create.php?url="+Utility.UrlEncode(url)) as HttpWebRequest; req.AllowAutoRedirect = false; req.Timeout = timeOut; req.Method = "GET"; res = req.GetResponse() as HttpWebResponse; using (StreamReader sr = new StreamReader(res.GetResponseStream())) { return sr.ReadLine(); } } catch (WebException) { return url; } catch (IOException) { return url; } finally { if (res != null) { res.Close(); } } } /// /// 文字列をURLエンコードします。 /// /// URLエンコードする文字列 /// URLエンコードされた文字列 public static String UrlEncode(String s) { StringBuilder sb = new StringBuilder(); Byte[] bytes = Encoding.UTF8.GetBytes(s); foreach (Byte b in bytes) { sb.AppendFormat("%{0:x2}", b); } return sb.ToString(); } /// /// HTML の数値文字参照・実態参照を元に戻します。 /// /// /// public static String UnescapeCharReference(String s) { return _regexEntityRef.Replace(s, new MatchEvaluator(ReplaceMatchEvaluator)); } private static Regex _regexEntityRef = new Regex("&(#(?\\d+|x[0-9a-fA-F]+)|(?[a-zA-Z0-9]{2,8}));", RegexOptions.Singleline); private static Dictionary _entityReferenceTable; private static void InitializeCharEntityReferenceTable() { _entityReferenceTable = new Dictionary(StringComparer.InvariantCultureIgnoreCase); _entityReferenceTable["nbsp"] = "\u00a0"; _entityReferenceTable["iexcl"] = "\u00a1"; _entityReferenceTable["cent"] = "\u00a2"; _entityReferenceTable["pound"] = "\u00a3"; _entityReferenceTable["curren"] = "\u00a4"; _entityReferenceTable["yen"] = "\u00a5"; _entityReferenceTable["brvbar"] = "\u00a6"; _entityReferenceTable["sect"] = "\u00a7"; _entityReferenceTable["uml"] = "\u00a8"; //EntityReferenceTable["copy"] = "\u00a9"; _entityReferenceTable["copy"] = "(C)"; _entityReferenceTable["ordf"] = "\u00aa"; _entityReferenceTable["laquo"] = "\u00ab"; _entityReferenceTable["not"] = "\u00ac"; _entityReferenceTable["shy"] = "\u00ad"; //EntityReferenceTable["reg"] = "\u00ae"; _entityReferenceTable["reg"] = "(R)"; _entityReferenceTable["macr"] = "\u00af"; _entityReferenceTable["deg"] = "\u00b0"; _entityReferenceTable["plusmn"] = "\u00b1"; _entityReferenceTable["sup2"] = "\u00b2"; _entityReferenceTable["sup3"] = "\u00b3"; _entityReferenceTable["acute"] = "\u00b4"; _entityReferenceTable["micro"] = "\u00b5"; _entityReferenceTable["para"] = "\u00b6"; _entityReferenceTable["middot"] = "\u00b7"; _entityReferenceTable["cedil"] = "\u00b8"; _entityReferenceTable["sup1"] = "\u00b9"; _entityReferenceTable["ordm"] = "\u00ba"; _entityReferenceTable["raquo"] = "\u00bb"; _entityReferenceTable["frac14"] = "\u00bc"; _entityReferenceTable["frac12"] = "\u00bd"; _entityReferenceTable["frac34"] = "\u00be"; _entityReferenceTable["iquest"] = "\u00bf"; _entityReferenceTable["Agrave"] = "\u00c0"; _entityReferenceTable["Aacute"] = "\u00c1"; _entityReferenceTable["Acirc"] = "\u00c2"; _entityReferenceTable["Atilde"] = "\u00c3"; _entityReferenceTable["Auml"] = "\u00c4"; _entityReferenceTable["Aring"] = "\u00c5"; _entityReferenceTable["AElig"] = "\u00c6"; _entityReferenceTable["Ccedil"] = "\u00c7"; _entityReferenceTable["Egrave"] = "\u00c8"; _entityReferenceTable["Eacute"] = "\u00c9"; _entityReferenceTable["Ecirc"] = "\u00ca"; _entityReferenceTable["Euml"] = "\u00cb"; _entityReferenceTable["Igrave"] = "\u00cc"; _entityReferenceTable["Iacute"] = "\u00cd"; _entityReferenceTable["Icirc"] = "\u00ce"; _entityReferenceTable["Iuml"] = "\u00cf"; _entityReferenceTable["ETH"] = "\u00d0"; _entityReferenceTable["Ntilde"] = "\u00d1"; _entityReferenceTable["Ograve"] = "\u00d2"; _entityReferenceTable["Oacute"] = "\u00d3"; _entityReferenceTable["Ocirc"] = "\u00d4"; _entityReferenceTable["Otilde"] = "\u00d5"; _entityReferenceTable["Ouml"] = "\u00d6"; _entityReferenceTable["times"] = "\u00d7"; _entityReferenceTable["Oslash"] = "\u00d8"; _entityReferenceTable["Ugrave"] = "\u00d9"; _entityReferenceTable["Uacute"] = "\u00da"; _entityReferenceTable["Ucirc"] = "\u00db"; _entityReferenceTable["Uuml"] = "\u00dc"; _entityReferenceTable["Yacute"] = "\u00dd"; _entityReferenceTable["THORN"] = "\u00de"; _entityReferenceTable["szlig"] = "\u00df"; _entityReferenceTable["agrave"] = "\u00e0"; _entityReferenceTable["aacute"] = "\u00e1"; _entityReferenceTable["acirc"] = "\u00e2"; _entityReferenceTable["atilde"] = "\u00e3"; _entityReferenceTable["auml"] = "\u00e4"; _entityReferenceTable["aring"] = "\u00e5"; _entityReferenceTable["aelig"] = "\u00e6"; _entityReferenceTable["ccedil"] = "\u00e7"; _entityReferenceTable["egrave"] = "\u00e8"; _entityReferenceTable["eacute"] = "\u00e9"; _entityReferenceTable["ecirc"] = "\u00ea"; _entityReferenceTable["euml"] = "\u00eb"; _entityReferenceTable["igrave"] = "\u00ec"; _entityReferenceTable["iacute"] = "\u00ed"; _entityReferenceTable["icirc"] = "\u00ee"; _entityReferenceTable["iuml"] = "\u00ef"; _entityReferenceTable["eth"] = "\u00f0"; _entityReferenceTable["ntilde"] = "\u00f1"; _entityReferenceTable["ograve"] = "\u00f2"; _entityReferenceTable["oacute"] = "\u00f3"; _entityReferenceTable["ocirc"] = "\u00f4"; _entityReferenceTable["otilde"] = "\u00f5"; _entityReferenceTable["ouml"] = "\u00f6"; _entityReferenceTable["divide"] = "\u00f7"; _entityReferenceTable["oslash"] = "\u00f8"; _entityReferenceTable["ugrave"] = "\u00f9"; _entityReferenceTable["uacute"] = "\u00fa"; _entityReferenceTable["ucirc"] = "\u00fb"; _entityReferenceTable["uuml"] = "\u00fc"; _entityReferenceTable["yacute"] = "\u00fd"; _entityReferenceTable["thorn"] = "\u00fe"; _entityReferenceTable["yuml"] = "\u00ff"; _entityReferenceTable["fnof"] = "\u0192"; _entityReferenceTable["Alpha"] = "\u0391"; _entityReferenceTable["Beta"] = "\u0392"; _entityReferenceTable["Gamma"] = "\u0393"; _entityReferenceTable["Delta"] = "\u0394"; _entityReferenceTable["Epsilon"] = "\u0395"; _entityReferenceTable["Zeta"] = "\u0396"; _entityReferenceTable["Eta"] = "\u0397"; _entityReferenceTable["Theta"] = "\u0398"; _entityReferenceTable["Iota"] = "\u0399"; _entityReferenceTable["Kappa"] = "\u039a"; _entityReferenceTable["Lambda"] = "\u039b"; _entityReferenceTable["Mu"] = "\u039c"; _entityReferenceTable["Nu"] = "\u039d"; _entityReferenceTable["Xi"] = "\u039e"; _entityReferenceTable["Omicron"] = "\u039f"; _entityReferenceTable["Pi"] = "\u03a0"; _entityReferenceTable["Rho"] = "\u03a1"; _entityReferenceTable["Sigma"] = "\u03a3"; _entityReferenceTable["Tau"] = "\u03a4"; _entityReferenceTable["Upsilon"] = "\u03a5"; _entityReferenceTable["Phi"] = "\u03a6"; _entityReferenceTable["Chi"] = "\u03a7"; _entityReferenceTable["Psi"] = "\u03a8"; _entityReferenceTable["Omega"] = "\u03a9"; _entityReferenceTable["alpha"] = "\u03b1"; _entityReferenceTable["beta"] = "\u03b2"; _entityReferenceTable["gamma"] = "\u03b3"; _entityReferenceTable["delta"] = "\u03b4"; _entityReferenceTable["epsilon"] = "\u03b5"; _entityReferenceTable["zeta"] = "\u03b6"; _entityReferenceTable["eta"] = "\u03b7"; _entityReferenceTable["theta"] = "\u03b8"; _entityReferenceTable["iota"] = "\u03b9"; _entityReferenceTable["kappa"] = "\u03ba"; _entityReferenceTable["lambda"] = "\u03bb"; _entityReferenceTable["mu"] = "\u03bc"; _entityReferenceTable["nu"] = "\u03bd"; _entityReferenceTable["xi"] = "\u03be"; _entityReferenceTable["omicron"] = "\u03bf"; _entityReferenceTable["pi"] = "\u03c0"; _entityReferenceTable["rho"] = "\u03c1"; _entityReferenceTable["sigmaf"] = "\u03c2"; _entityReferenceTable["sigma"] = "\u03c3"; _entityReferenceTable["tau"] = "\u03c4"; _entityReferenceTable["upsilon"] = "\u03c5"; _entityReferenceTable["phi"] = "\u03c6"; _entityReferenceTable["chi"] = "\u03c7"; _entityReferenceTable["psi"] = "\u03c8"; _entityReferenceTable["omega"] = "\u03c9"; _entityReferenceTable["thetasym"] = "\u03d1"; _entityReferenceTable["upsih"] = "\u03d2"; _entityReferenceTable["piv"] = "\u03d6"; _entityReferenceTable["bull"] = "\u2022"; _entityReferenceTable["hellip"] = "\u2026"; _entityReferenceTable["prime"] = "\u2032"; _entityReferenceTable["Prime"] = "\u2033"; _entityReferenceTable["oline"] = "\u203e"; _entityReferenceTable["frasl"] = "\u2044"; _entityReferenceTable["weierp"] = "\u2118"; _entityReferenceTable["image"] = "\u2111"; _entityReferenceTable["real"] = "\u211c"; //EntityReferenceTable["trade"] = "\u2122"; _entityReferenceTable["trade"] = "TM"; _entityReferenceTable["alefsym"] = "\u2135"; _entityReferenceTable["larr"] = "\u2190"; _entityReferenceTable["uarr"] = "\u2191"; _entityReferenceTable["rarr"] = "\u2192"; _entityReferenceTable["darr"] = "\u2193"; _entityReferenceTable["harr"] = "\u2194"; _entityReferenceTable["crarr"] = "\u21b5"; _entityReferenceTable["lArr"] = "\u21d0"; _entityReferenceTable["uArr"] = "\u21d1"; _entityReferenceTable["rArr"] = "\u21d2"; _entityReferenceTable["dArr"] = "\u21d3"; _entityReferenceTable["hArr"] = "\u21d4"; _entityReferenceTable["forall"] = "\u2200"; _entityReferenceTable["part"] = "\u2202"; _entityReferenceTable["exist"] = "\u2203"; _entityReferenceTable["empty"] = "\u2205"; _entityReferenceTable["nabla"] = "\u2207"; _entityReferenceTable["isin"] = "\u2208"; _entityReferenceTable["notin"] = "\u2209"; _entityReferenceTable["ni"] = "\u220b"; _entityReferenceTable["prod"] = "\u220f"; _entityReferenceTable["sum"] = "\u2211"; _entityReferenceTable["minus"] = "\u2212"; _entityReferenceTable["lowast"] = "\u2217"; _entityReferenceTable["radic"] = "\u221a"; _entityReferenceTable["prop"] = "\u221d"; _entityReferenceTable["infin"] = "\u221e"; _entityReferenceTable["ang"] = "\u2220"; _entityReferenceTable["and"] = "\u2227"; _entityReferenceTable["or"] = "\u2228"; _entityReferenceTable["cap"] = "\u2229"; _entityReferenceTable["cup"] = "\u222a"; _entityReferenceTable["int"] = "\u222b"; _entityReferenceTable["there4"] = "\u2234"; _entityReferenceTable["sim"] = "\u223c"; _entityReferenceTable["cong"] = "\u2245"; _entityReferenceTable["asymp"] = "\u2248"; _entityReferenceTable["ne"] = "\u2260"; _entityReferenceTable["equiv"] = "\u2261"; _entityReferenceTable["le"] = "\u2264"; _entityReferenceTable["ge"] = "\u2265"; _entityReferenceTable["sub"] = "\u2282"; _entityReferenceTable["sup"] = "\u2283"; _entityReferenceTable["nsub"] = "\u2284"; _entityReferenceTable["sube"] = "\u2286"; _entityReferenceTable["supe"] = "\u2287"; _entityReferenceTable["oplus"] = "\u2295"; _entityReferenceTable["otimes"] = "\u2297"; _entityReferenceTable["perp"] = "\u22a5"; _entityReferenceTable["sdot"] = "\u22c5"; _entityReferenceTable["lceil"] = "\u2308"; _entityReferenceTable["rceil"] = "\u2309"; _entityReferenceTable["lfloor"] = "\u230a"; _entityReferenceTable["rfloor"] = "\u230b"; _entityReferenceTable["lang"] = "\u2329"; _entityReferenceTable["rang"] = "\u232a"; _entityReferenceTable["loz"] = "\u25ca"; _entityReferenceTable["spades"] = "\u2660"; _entityReferenceTable["clubs"] = "\u2663"; _entityReferenceTable["hearts"] = "\u2665"; _entityReferenceTable["diams"] = "\u2666"; _entityReferenceTable["quot"] = "\u0022"; _entityReferenceTable["amp"] = "\u0026"; _entityReferenceTable["lt"] = "\u003c"; _entityReferenceTable["gt"] = "\u003e"; _entityReferenceTable["OElig"] = "\u0152"; _entityReferenceTable["oelig"] = "\u0153"; _entityReferenceTable["Scaron"] = "\u0160"; _entityReferenceTable["scaron"] = "\u0161"; _entityReferenceTable["Yuml"] = "\u0178"; _entityReferenceTable["circ"] = "\u02c6"; _entityReferenceTable["tilde"] = "\u02dc"; _entityReferenceTable["ensp"] = "\u2002"; _entityReferenceTable["emsp"] = "\u2003"; _entityReferenceTable["thinsp"] = "\u2009"; _entityReferenceTable["zwnj"] = "\u200c"; _entityReferenceTable["zwj"] = "\u200d"; _entityReferenceTable["lrm"] = "\u200e"; _entityReferenceTable["rlm"] = "\u200f"; _entityReferenceTable["ndash"] = "\u2013"; _entityReferenceTable["mdash"] = "\u2014"; _entityReferenceTable["lsquo"] = "\u2018"; _entityReferenceTable["rsquo"] = "\u2019"; _entityReferenceTable["sbquo"] = "\u201a"; _entityReferenceTable["ldquo"] = "\u201c"; _entityReferenceTable["rdquo"] = "\u201d"; _entityReferenceTable["bdquo"] = "\u201e"; _entityReferenceTable["dagger"] = "\u2020"; _entityReferenceTable["Dagger"] = "\u2021"; _entityReferenceTable["permil"] = "\u2030"; _entityReferenceTable["lsaquo"] = "\u2039"; _entityReferenceTable["rsaquo"] = "\u203a"; _entityReferenceTable["euro"] = "\u20ac"; } private static String ReplaceMatchEvaluator(Match m) { if (m.Groups[1].Value[0] == '#') { // 数値参照 try { Char c; if (m.Groups["dig"].Value[0] == 'x') { c = Convert.ToChar(Int32.Parse(m.Groups["dig"].Value.Substring(1), System.Globalization.NumberStyles.HexNumber)); } else { c = Convert.ToChar(Int32.Parse(m.Groups["dig"].Value)); } return c.ToString(); } catch (OverflowException) {} catch (FormatException) {} return "?"; } else { // 文字実体参照 if (_entityReferenceTable.ContainsKey(m.Groups["char"].Value)) { return _entityReferenceTable[m.Groups["char"].Value]; } else { return "&" + m.Groups["char"].Value+";"; } } } } }