2004-02-25 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / Commons.Xml.Relaxng / Commons.Xml.Relaxng / Misc.cs
1 //\r
2 // Commons.Xml.Relaxng.General.cs\r
3 //\r
4 // Author:\r
5 //      Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>\r
6 //\r
7 // 2003 Atsushi Enomoto "No rights reserved."\r
8 //\r
9 using System;\r
10 using System.Collections;\r
11 using System.IO;\r
12 using System.Xml;\r
13 using Commons.Xml.Relaxng.Derivative;\r
14 \r
15 namespace Commons.Xml.Relaxng\r
16 {\r
17         public class Util\r
18         {\r
19                 public static string ResolveUri (string baseUri, string href)\r
20                 {\r
21 #if true\r
22                         Uri uri = null;\r
23                         if (baseUri != null && baseUri.Length > 0)
24                                 uri = new Uri (baseUri);
25                         Uri result = new XmlUrlResolver ().ResolveUri (uri, href);
26                         if (result.Query.Length > 0 || result.Fragment.Length > 0)
27                                 throw new RelaxngException ("Invalid URI format: " + href);
28                         return result.ToString ();
29 #else
30                         // If baseUri does not exist, then it is only the way.\r
31                         if (baseUri == String.Empty)\r
32                                 return href;\r
33 \r
34                         // If href itself is a uri, then return it directly.\r
35                         try {\r
36                                 return new Uri (href).ToString ();\r
37                         } catch (UriFormatException) {\r
38                         }\r
39 \r
40                         // If baseUri is a valid uri, then make relative uri.\r
41                         try {\r
42                                 return new Uri (\r
43                                         new Uri (baseUri), href).ToString ();\r
44                         } catch (UriFormatException) {\r
45                         }\r
46 \r
47                         // Otherwise, they might be filesystem path.\r
48                         if (Path.IsPathRooted (href))\r
49                                 return href;\r
50 \r
51                         return Path.Combine (\r
52                                 Path.GetDirectoryName (baseUri), href);\r
53 #endif\r
54                 }\r
55 \r
56                 public static string NormalizeWhitespace (string s)\r
57                 {\r
58                         if (s.Length == 0)\r
59                                 return s;\r
60 \r
61                         char [] ca = s.ToCharArray ();\r
62                         int j = 0;\r
63                         for (int i = 0; i < ca.Length; i++) {\r
64                                 switch (ca [i]) {\r
65                                 case ' ':\r
66                                 case '\r':\r
67                                 case '\t':\r
68                                 case '\n':\r
69                                         if (j == 0)\r
70                                                 break;\r
71                                         if (ca [j - 1] != ' ')\r
72                                                 ca [j++] = ' ';\r
73                                         break;\r
74                                 default:\r
75                                         ca [j++] = ca [i];\r
76                                         break;\r
77                                 }\r
78                         }\r
79                         if (j == 0)\r
80                                 return String.Empty;\r
81                         string r = new string (ca, 0, (ca [j - 1] != ' ') ? j : j - 1);\r
82                         return r;\r
83                 }\r
84 \r
85                 public static bool IsWhitespace (string s)\r
86                 {\r
87                         for (int i = 0; i < s.Length; i++) {\r
88                                 switch (s [i]) {\r
89                                 case ' ':\r
90                                 case '\t':\r
91                                 case '\n':\r
92                                 case '\r':\r
93                                         continue;\r
94                                 default:\r
95                                         return false;\r
96                                 }\r
97                         }\r
98                         return true;\r
99                 }\r
100         }\r
101 }\r
102 \r