root/TwitterIrcGateway/trunk/TwitterIrcGatewayCore/Utility.cs

Revision 412, 20.6 kB (checked in by tomoyo, 4 months ago)

アドインの仕組みを取り込んで、いくつかの機能をアドインの機構にのる形にした。

  • Property svn:keywords set to Id
Line 
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Net;
5using System.Text.RegularExpressions;
6using System.Globalization;
7
8namespace Misuzilla.Applications.TwitterIrcGateway
9{
10    public static class Utility
11    {
12        static Utility()
13        {
14            InitializeCharEntityReferenceTable();
15        }
16       
17        /// <summary>
18        /// �d���������������擾���܂��B
19        /// </summary>
20        /// <param name="text">�Ώۂ̕�����aram>
21        /// <param name="hintTexts">�q���g�ƂȂ镶����R���N�V����</param>
22        /// <returns></returns>
23        public static String DetectRedundantSuffix(String text, ICollection<String> hintTexts)
24        {
25            String redundantSuffix = null;
26            String a1 = text;
27            foreach (var a2 in hintTexts)
28            {
29                for (var i = 0; i < a1.Length; i++)
30                {
31                    var pos = a2.LastIndexOf(a1.Substring(i));
32                    if (pos > -1)
33                    {
34                        var suffix = a1.Substring(i);
35                        var matches = Regex.Matches(suffix, @"^(\s*(\(.{2,}\)|\[.{2,}\]|\*.{2,}\*|lang:ja)+)$");
36                        if (matches.Count > 0)
37                        {
38                            redundantSuffix = a1 = suffix;
39                            break;
40                        }
41                    }
42                }
43            }
44
45            return redundantSuffix;
46        }
47
48        /// <summary>
49        /// ��������ateTime�^�ɕϊ����܂��B
50        /// </summary>
51        /// <param name="dateTimeString"></param>
52        /// <returns></returns>
53        public static DateTime ParseDateTime(String dateTimeString)
54        {
55            DateTime dateTime;
56            if (!DateTime.TryParseExact(dateTimeString, "ddd MMM dd HH:mm:ss zz00 yyyy", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.None, out dateTime))
57            {
58                dateTime = DateTime.Now;
59            }
60
61            return dateTime;
62        }
63
64        /// <summary>
65        /// ������TinyURL ��J���܂��B
66        /// �^�C���A�E�g�����ł̎��Ԃ��b�ł��B
67        /// </summary>
68        /// <param name="message">���b�Z�[�W</param>
69        /// <returns></returns>
70        public static String ResolveTinyUrlInMessage(String message)
71        {
72            return ResolveTinyUrlInMessage(message, 1000);
73        }
74
75        /// <summary>
76        /// ������TinyURL ��J���܂��B
77        /// </summary>
78        /// <param name="message">���b�Z�[�W</param>
79        /// <param name="timeOut">�^�C���A�E�g�����ł̎���/param>
80        /// <returns></returns>
81        public static String ResolveTinyUrlInMessage(String message, Int32 timeOut)
82        {
83            return Regex.Replace(message, @"http://tinyurl\.com/[A-Za-z0-9_/.;%&\-]+", delegate(Match m)
84            {
85                return ResolveTinyUrl(m.Value, timeOut);
86            }, RegexOptions.IgnoreCase);
87        }
88
89        /// <summary>
90        /// TinyURL��_�C���N�g��URL�ɓW�J���܂��B
91        /// </summary>
92        /// <param name="url">TinyURL��RL</param>
93        /// <param name="timeOut">�^�C���A�E�g�����ł̎���/param>
94        /// <returns></returns>
95        public static String ResolveTinyUrl(String url, Int32 timeOut)
96        {
97            HttpWebResponse res = null;
98            try
99            {
100                HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest;
101                req.AllowAutoRedirect = false;
102                req.Timeout = timeOut;
103                req.Method = "HEAD";
104                res = req.GetResponse() as HttpWebResponse;
105
106                if (res.StatusCode == HttpStatusCode.MovedPermanently)
107                {
108                    if (!String.IsNullOrEmpty(res.Headers["Location"]))
109                    {
110                        return res.Headers["Location"];
111                    }
112                }
113                return url;
114            }
115            catch (WebException)
116            {
117                return url;
118            }
119            finally
120            {
121                if (res != null)
122                {
123                    res.Close();
124                }
125            }
126        }
127
128        /// <summary>
129        /// ������RL�G���R�[�h���܂��B
130        /// </summary>
131        /// <param name="s">URL�G���R�[�h���镶����aram>
132        /// <returns>URL�G���R�[�h���ꂽ������eturns>
133        public static String UrlEncode(String s)
134        {
135            StringBuilder sb = new StringBuilder();
136            Byte[] bytes = Encoding.UTF8.GetBytes(s);
137            foreach (Byte b in bytes)
138            {
139                sb.AppendFormat("%{0:x2}", b);
140            }
141
142            return sb.ToString();
143        }
144
145        /// <summary>
146        /// HTML �̐��l�����Q�ƁE��ԎQ�Ƃ�ɖ߂��܂��B
147        /// </summary>
148        /// <param name="s"></param>
149        /// <returns></returns>
150        public static String UnescapeCharReference(String s)
151        {
152            return _regexEntityRef.Replace(s, new MatchEvaluator(ReplaceMatchEvaluator));
153        }
154
155        private static Regex _regexEntityRef = new Regex("&(#(?<dig>\\d+|x[0-9a-fA-F]+)|(?<char>[a-zA-Z0-9]{2,8}));", RegexOptions.Singleline);
156        private static Dictionary<String, String> _entityReferenceTable;
157        private static void InitializeCharEntityReferenceTable()
158        {
159            _entityReferenceTable = new Dictionary<string,string>(StringComparer.InvariantCultureIgnoreCase);
160            _entityReferenceTable["nbsp"] = "\u00a0";
161            _entityReferenceTable["iexcl"] = "\u00a1";
162            _entityReferenceTable["cent"] = "\u00a2";
163            _entityReferenceTable["pound"] = "\u00a3";
164            _entityReferenceTable["curren"] = "\u00a4";
165            _entityReferenceTable["yen"] = "\u00a5";
166            _entityReferenceTable["brvbar"] = "\u00a6";
167            _entityReferenceTable["sect"] = "\u00a7";
168            _entityReferenceTable["uml"] = "\u00a8";
169            //EntityReferenceTable["copy"] = "\u00a9";
170            _entityReferenceTable["copy"] = "(C)";
171            _entityReferenceTable["ordf"] = "\u00aa";
172            _entityReferenceTable["laquo"] = "\u00ab";
173            _entityReferenceTable["not"] = "\u00ac";
174            _entityReferenceTable["shy"] = "\u00ad";
175            //EntityReferenceTable["reg"] = "\u00ae";
176            _entityReferenceTable["reg"] = "(R)";
177            _entityReferenceTable["macr"] = "\u00af";
178            _entityReferenceTable["deg"] = "\u00b0";
179            _entityReferenceTable["plusmn"] = "\u00b1";
180            _entityReferenceTable["sup2"] = "\u00b2";
181            _entityReferenceTable["sup3"] = "\u00b3";
182            _entityReferenceTable["acute"] = "\u00b4";
183            _entityReferenceTable["micro"] = "\u00b5";
184            _entityReferenceTable["para"] = "\u00b6";
185            _entityReferenceTable["middot"] = "\u00b7";
186            _entityReferenceTable["cedil"] = "\u00b8";
187            _entityReferenceTable["sup1"] = "\u00b9";
188            _entityReferenceTable["ordm"] = "\u00ba";
189            _entityReferenceTable["raquo"] = "\u00bb";
190            _entityReferenceTable["frac14"] = "\u00bc";
191            _entityReferenceTable["frac12"] = "\u00bd";
192            _entityReferenceTable["frac34"] = "\u00be";
193            _entityReferenceTable["iquest"] = "\u00bf";
194            _entityReferenceTable["Agrave"] = "\u00c0";
195            _entityReferenceTable["Aacute"] = "\u00c1";
196            _entityReferenceTable["Acirc"] = "\u00c2";
197            _entityReferenceTable["Atilde"] = "\u00c3";
198            _entityReferenceTable["Auml"] = "\u00c4";
199            _entityReferenceTable["Aring"] = "\u00c5";
200            _entityReferenceTable["AElig"] = "\u00c6";
201            _entityReferenceTable["Ccedil"] = "\u00c7";
202            _entityReferenceTable["Egrave"] = "\u00c8";
203            _entityReferenceTable["Eacute"] = "\u00c9";
204            _entityReferenceTable["Ecirc"] = "\u00ca";
205            _entityReferenceTable["Euml"] = "\u00cb";
206            _entityReferenceTable["Igrave"] = "\u00cc";
207            _entityReferenceTable["Iacute"] = "\u00cd";
208            _entityReferenceTable["Icirc"] = "\u00ce";
209            _entityReferenceTable["Iuml"] = "\u00cf";
210            _entityReferenceTable["ETH"] = "\u00d0";
211            _entityReferenceTable["Ntilde"] = "\u00d1";
212            _entityReferenceTable["Ograve"] = "\u00d2";
213            _entityReferenceTable["Oacute"] = "\u00d3";
214            _entityReferenceTable["Ocirc"] = "\u00d4";
215            _entityReferenceTable["Otilde"] = "\u00d5";
216            _entityReferenceTable["Ouml"] = "\u00d6";
217            _entityReferenceTable["times"] = "\u00d7";
218            _entityReferenceTable["Oslash"] = "\u00d8";
219            _entityReferenceTable["Ugrave"] = "\u00d9";
220            _entityReferenceTable["Uacute"] = "\u00da";
221            _entityReferenceTable["Ucirc"] = "\u00db";
222            _entityReferenceTable["Uuml"] = "\u00dc";
223            _entityReferenceTable["Yacute"] = "\u00dd";
224            _entityReferenceTable["THORN"] = "\u00de";
225            _entityReferenceTable["szlig"] = "\u00df";
226            _entityReferenceTable["agrave"] = "\u00e0";
227            _entityReferenceTable["aacute"] = "\u00e1";
228            _entityReferenceTable["acirc"] = "\u00e2";
229            _entityReferenceTable["atilde"] = "\u00e3";
230            _entityReferenceTable["auml"] = "\u00e4";
231            _entityReferenceTable["aring"] = "\u00e5";
232            _entityReferenceTable["aelig"] = "\u00e6";
233            _entityReferenceTable["ccedil"] = "\u00e7";
234            _entityReferenceTable["egrave"] = "\u00e8";
235            _entityReferenceTable["eacute"] = "\u00e9";
236            _entityReferenceTable["ecirc"] = "\u00ea";
237            _entityReferenceTable["euml"] = "\u00eb";
238            _entityReferenceTable["igrave"] = "\u00ec";
239            _entityReferenceTable["iacute"] = "\u00ed";
240            _entityReferenceTable["icirc"] = "\u00ee";
241            _entityReferenceTable["iuml"] = "\u00ef";
242            _entityReferenceTable["eth"] = "\u00f0";
243            _entityReferenceTable["ntilde"] = "\u00f1";
244            _entityReferenceTable["ograve"] = "\u00f2";
245            _entityReferenceTable["oacute"] = "\u00f3";
246            _entityReferenceTable["ocirc"] = "\u00f4";
247            _entityReferenceTable["otilde"] = "\u00f5";
248            _entityReferenceTable["ouml"] = "\u00f6";
249            _entityReferenceTable["divide"] = "\u00f7";
250            _entityReferenceTable["oslash"] = "\u00f8";
251            _entityReferenceTable["ugrave"] = "\u00f9";
252            _entityReferenceTable["uacute"] = "\u00fa";
253            _entityReferenceTable["ucirc"] = "\u00fb";
254            _entityReferenceTable["uuml"] = "\u00fc";
255            _entityReferenceTable["yacute"] = "\u00fd";
256            _entityReferenceTable["thorn"] = "\u00fe";
257            _entityReferenceTable["yuml"] = "\u00ff";
258            _entityReferenceTable["fnof"] = "\u0192";
259            _entityReferenceTable["Alpha"] = "\u0391";
260            _entityReferenceTable["Beta"] = "\u0392";
261            _entityReferenceTable["Gamma"] = "\u0393";
262            _entityReferenceTable["Delta"] = "\u0394";
263            _entityReferenceTable["Epsilon"] = "\u0395";
264            _entityReferenceTable["Zeta"] = "\u0396";
265            _entityReferenceTable["Eta"] = "\u0397";
266            _entityReferenceTable["Theta"] = "\u0398";
267            _entityReferenceTable["Iota"] = "\u0399";
268            _entityReferenceTable["Kappa"] = "\u039a";
269            _entityReferenceTable["Lambda"] = "\u039b";
270            _entityReferenceTable["Mu"] = "\u039c";
271            _entityReferenceTable["Nu"] = "\u039d";
272            _entityReferenceTable["Xi"] = "\u039e";
273            _entityReferenceTable["Omicron"] = "\u039f";
274            _entityReferenceTable["Pi"] = "\u03a0";
275            _entityReferenceTable["Rho"] = "\u03a1";
276            _entityReferenceTable["Sigma"] = "\u03a3";
277            _entityReferenceTable["Tau"] = "\u03a4";
278            _entityReferenceTable["Upsilon"] = "\u03a5";
279            _entityReferenceTable["Phi"] = "\u03a6";
280            _entityReferenceTable["Chi"] = "\u03a7";
281            _entityReferenceTable["Psi"] = "\u03a8";
282            _entityReferenceTable["Omega"] = "\u03a9";
283            _entityReferenceTable["alpha"] = "\u03b1";
284            _entityReferenceTable["beta"] = "\u03b2";
285            _entityReferenceTable["gamma"] = "\u03b3";
286            _entityReferenceTable["delta"] = "\u03b4";
287            _entityReferenceTable["epsilon"] = "\u03b5";
288            _entityReferenceTable["zeta"] = "\u03b6";
289            _entityReferenceTable["eta"] = "\u03b7";
290            _entityReferenceTable["theta"] = "\u03b8";
291            _entityReferenceTable["iota"] = "\u03b9";
292            _entityReferenceTable["kappa"] = "\u03ba";
293            _entityReferenceTable["lambda"] = "\u03bb";
294            _entityReferenceTable["mu"] = "\u03bc";
295            _entityReferenceTable["nu"] = "\u03bd";
296            _entityReferenceTable["xi"] = "\u03be";
297            _entityReferenceTable["omicron"] = "\u03bf";
298            _entityReferenceTable["pi"] = "\u03c0";
299            _entityReferenceTable["rho"] = "\u03c1";
300            _entityReferenceTable["sigmaf"] = "\u03c2";
301            _entityReferenceTable["sigma"] = "\u03c3";
302            _entityReferenceTable["tau"] = "\u03c4";
303            _entityReferenceTable["upsilon"] = "\u03c5";
304            _entityReferenceTable["phi"] = "\u03c6";
305            _entityReferenceTable["chi"] = "\u03c7";
306            _entityReferenceTable["psi"] = "\u03c8";
307            _entityReferenceTable["omega"] = "\u03c9";
308            _entityReferenceTable["thetasym"] = "\u03d1";
309            _entityReferenceTable["upsih"] = "\u03d2";
310            _entityReferenceTable["piv"] = "\u03d6";
311            _entityReferenceTable["bull"] = "\u2022";
312            _entityReferenceTable["hellip"] = "\u2026";
313            _entityReferenceTable["prime"] = "\u2032";
314            _entityReferenceTable["Prime"] = "\u2033";
315            _entityReferenceTable["oline"] = "\u203e";
316            _entityReferenceTable["frasl"] = "\u2044";
317            _entityReferenceTable["weierp"] = "\u2118";
318            _entityReferenceTable["image"] = "\u2111";
319            _entityReferenceTable["real"] = "\u211c";
320            //EntityReferenceTable["trade"] = "\u2122";
321            _entityReferenceTable["trade"] = "TM";
322            _entityReferenceTable["alefsym"] = "\u2135";
323            _entityReferenceTable["larr"] = "\u2190";
324            _entityReferenceTable["uarr"] = "\u2191";
325            _entityReferenceTable["rarr"] = "\u2192";
326            _entityReferenceTable["darr"] = "\u2193";
327            _entityReferenceTable["harr"] = "\u2194";
328            _entityReferenceTable["crarr"] = "\u21b5";
329            _entityReferenceTable["lArr"] = "\u21d0";
330            _entityReferenceTable["uArr"] = "\u21d1";
331            _entityReferenceTable["rArr"] = "\u21d2";
332            _entityReferenceTable["dArr"] = "\u21d3";
333            _entityReferenceTable["hArr"] = "\u21d4";
334            _entityReferenceTable["forall"] = "\u2200";
335            _entityReferenceTable["part"] = "\u2202";
336            _entityReferenceTable["exist"] = "\u2203";
337            _entityReferenceTable["empty"] = "\u2205";
338            _entityReferenceTable["nabla"] = "\u2207";
339            _entityReferenceTable["isin"] = "\u2208";
340            _entityReferenceTable["notin"] = "\u2209";
341            _entityReferenceTable["ni"] = "\u220b";
342            _entityReferenceTable["prod"] = "\u220f";
343            _entityReferenceTable["sum"] = "\u2211";
344            _entityReferenceTable["minus"] = "\u2212";
345            _entityReferenceTable["lowast"] = "\u2217";
346            _entityReferenceTable["radic"] = "\u221a";
347            _entityReferenceTable["prop"] = "\u221d";
348            _entityReferenceTable["infin"] = "\u221e";
349            _entityReferenceTable["ang"] = "\u2220";
350            _entityReferenceTable["and"] = "\u2227";
351            _entityReferenceTable["or"] = "\u2228";
352            _entityReferenceTable["cap"] = "\u2229";
353            _entityReferenceTable["cup"] = "\u222a";
354            _entityReferenceTable["int"] = "\u222b";
355            _entityReferenceTable["there4"] = "\u2234";
356            _entityReferenceTable["sim"] = "\u223c";
357            _entityReferenceTable["cong"] = "\u2245";
358            _entityReferenceTable["asymp"] = "\u2248";
359            _entityReferenceTable["ne"] = "\u2260";
360            _entityReferenceTable["equiv"] = "\u2261";
361            _entityReferenceTable["le"] = "\u2264";
362            _entityReferenceTable["ge"] = "\u2265";
363            _entityReferenceTable["sub"] = "\u2282";
364            _entityReferenceTable["sup"] = "\u2283";
365            _entityReferenceTable["nsub"] = "\u2284";
366            _entityReferenceTable["sube"] = "\u2286";
367            _entityReferenceTable["supe"] = "\u2287";
368            _entityReferenceTable["oplus"] = "\u2295";
369            _entityReferenceTable["otimes"] = "\u2297";
370            _entityReferenceTable["perp"] = "\u22a5";
371            _entityReferenceTable["sdot"] = "\u22c5";
372            _entityReferenceTable["lceil"] = "\u2308";
373            _entityReferenceTable["rceil"] = "\u2309";
374            _entityReferenceTable["lfloor"] = "\u230a";
375            _entityReferenceTable["rfloor"] = "\u230b";
376            _entityReferenceTable["lang"] = "\u2329";
377            _entityReferenceTable["rang"] = "\u232a";
378            _entityReferenceTable["loz"] = "\u25ca";
379            _entityReferenceTable["spades"] = "\u2660";
380            _entityReferenceTable["clubs"] = "\u2663";
381            _entityReferenceTable["hearts"] = "\u2665";
382            _entityReferenceTable["diams"] = "\u2666";
383            _entityReferenceTable["quot"] = "\u0022";
384            _entityReferenceTable["amp"] = "\u0026";
385            _entityReferenceTable["lt"] = "\u003c";
386            _entityReferenceTable["gt"] = "\u003e";
387            _entityReferenceTable["OElig"] = "\u0152";
388            _entityReferenceTable["oelig"] = "\u0153";
389            _entityReferenceTable["Scaron"] = "\u0160";
390            _entityReferenceTable["scaron"] = "\u0161";
391            _entityReferenceTable["Yuml"] = "\u0178";
392            _entityReferenceTable["circ"] = "\u02c6";
393            _entityReferenceTable["tilde"] = "\u02dc";
394            _entityReferenceTable["ensp"] = "\u2002";
395            _entityReferenceTable["emsp"] = "\u2003";
396            _entityReferenceTable["thinsp"] = "\u2009";
397            _entityReferenceTable["zwnj"] = "\u200c";
398            _entityReferenceTable["zwj"] = "\u200d";
399            _entityReferenceTable["lrm"] = "\u200e";
400            _entityReferenceTable["rlm"] = "\u200f";
401            _entityReferenceTable["ndash"] = "\u2013";
402            _entityReferenceTable["mdash"] = "\u2014";
403            _entityReferenceTable["lsquo"] = "\u2018";
404            _entityReferenceTable["rsquo"] = "\u2019";
405            _entityReferenceTable["sbquo"] = "\u201a";
406            _entityReferenceTable["ldquo"] = "\u201c";
407            _entityReferenceTable["rdquo"] = "\u201d";
408            _entityReferenceTable["bdquo"] = "\u201e";
409            _entityReferenceTable["dagger"] = "\u2020";
410            _entityReferenceTable["Dagger"] = "\u2021";
411            _entityReferenceTable["permil"] = "\u2030";
412            _entityReferenceTable["lsaquo"] = "\u2039";
413            _entityReferenceTable["rsaquo"] = "\u203a";
414            _entityReferenceTable["euro"] = "\u20ac";
415        }
416        private static String ReplaceMatchEvaluator(Match m)
417        {
418            if (m.Groups[1].Value[0] == '#')
419            {
420                // ���l�Q��
421                try
422                {
423                    Char c;
424                    if (m.Groups["dig"].Value[0] == 'x')
425                    {
426                        c = Convert.ToChar(Int32.Parse(m.Groups["dig"].Value.Substring(1), System.Globalization.NumberStyles.HexNumber));
427                    }
428                    else
429                    {
430                        c = Convert.ToChar(Int32.Parse(m.Groups["dig"].Value));
431                    }
432                    return c.ToString();
433                }
434                catch (OverflowException) {}
435                catch (FormatException) {}
436
437                return "?";
438            }
439            else
440            {
441                // ������̎Q��
442                if (_entityReferenceTable.ContainsKey(m.Groups["char"].Value))
443                {
444                    return _entityReferenceTable[m.Groups["char"].Value];
445                }
446                else
447                {
448                    return "&" + m.Groups["char"].Value+";";
449                }
450            }
451        }
452    }
453}
Note: See TracBrowser for help on using the browser.