001    /*
002     * Copyright (c) 2008-2009 Mozilla Foundation
003     *
004     * Permission is hereby granted, free of charge, to any person obtaining a 
005     * copy of this software and associated documentation files (the "Software"), 
006     * to deal in the Software without restriction, including without limitation 
007     * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
008     * and/or sell copies of the Software, and to permit persons to whom the 
009     * Software is furnished to do so, subject to the following conditions:
010     *
011     * The above copyright notice and this permission notice shall be included in 
012     * all copies or substantial portions of the Software.
013     *
014     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
015     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
016     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
017     * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
018     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
019     * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
020     * DEALINGS IN THE SOFTWARE.
021     */
022    
023    package nu.validator.htmlparser.impl;
024    
025    public final class NCName {
026        // [NOCPP[
027    
028        private static final int SURROGATE_OFFSET = 0x10000 - (0xD800 << 10) - 0xDC00;
029        
030        private static final char[] HEX_TABLE = "0123456789ABCDEF".toCharArray();
031        
032        public static boolean isNCNameStart(char c) {
033            return ((c >= '\u0041' && c <= '\u005A')
034                    || (c >= '\u0061' && c <= '\u007A')
035                    || (c >= '\u00C0' && c <= '\u00D6')
036                    || (c >= '\u00D8' && c <= '\u00F6')
037                    || (c >= '\u00F8' && c <= '\u00FF')
038                    || (c >= '\u0100' && c <= '\u0131')
039                    || (c >= '\u0134' && c <= '\u013E')
040                    || (c >= '\u0141' && c <= '\u0148')
041                    || (c >= '\u014A' && c <= '\u017E')
042                    || (c >= '\u0180' && c <= '\u01C3')
043                    || (c >= '\u01CD' && c <= '\u01F0')
044                    || (c >= '\u01F4' && c <= '\u01F5')
045                    || (c >= '\u01FA' && c <= '\u0217')
046                    || (c >= '\u0250' && c <= '\u02A8')
047                    || (c >= '\u02BB' && c <= '\u02C1') || (c == '\u0386')
048                    || (c >= '\u0388' && c <= '\u038A') || (c == '\u038C')
049                    || (c >= '\u038E' && c <= '\u03A1')
050                    || (c >= '\u03A3' && c <= '\u03CE')
051                    || (c >= '\u03D0' && c <= '\u03D6') || (c == '\u03DA')
052                    || (c == '\u03DC') || (c == '\u03DE') || (c == '\u03E0')
053                    || (c >= '\u03E2' && c <= '\u03F3')
054                    || (c >= '\u0401' && c <= '\u040C')
055                    || (c >= '\u040E' && c <= '\u044F')
056                    || (c >= '\u0451' && c <= '\u045C')
057                    || (c >= '\u045E' && c <= '\u0481')
058                    || (c >= '\u0490' && c <= '\u04C4')
059                    || (c >= '\u04C7' && c <= '\u04C8')
060                    || (c >= '\u04CB' && c <= '\u04CC')
061                    || (c >= '\u04D0' && c <= '\u04EB')
062                    || (c >= '\u04EE' && c <= '\u04F5')
063                    || (c >= '\u04F8' && c <= '\u04F9')
064                    || (c >= '\u0531' && c <= '\u0556') || (c == '\u0559')
065                    || (c >= '\u0561' && c <= '\u0586')
066                    || (c >= '\u05D0' && c <= '\u05EA')
067                    || (c >= '\u05F0' && c <= '\u05F2')
068                    || (c >= '\u0621' && c <= '\u063A')
069                    || (c >= '\u0641' && c <= '\u064A')
070                    || (c >= '\u0671' && c <= '\u06B7')
071                    || (c >= '\u06BA' && c <= '\u06BE')
072                    || (c >= '\u06C0' && c <= '\u06CE')
073                    || (c >= '\u06D0' && c <= '\u06D3') || (c == '\u06D5')
074                    || (c >= '\u06E5' && c <= '\u06E6')
075                    || (c >= '\u0905' && c <= '\u0939') || (c == '\u093D')
076                    || (c >= '\u0958' && c <= '\u0961')
077                    || (c >= '\u0985' && c <= '\u098C')
078                    || (c >= '\u098F' && c <= '\u0990')
079                    || (c >= '\u0993' && c <= '\u09A8')
080                    || (c >= '\u09AA' && c <= '\u09B0') || (c == '\u09B2')
081                    || (c >= '\u09B6' && c <= '\u09B9')
082                    || (c >= '\u09DC' && c <= '\u09DD')
083                    || (c >= '\u09DF' && c <= '\u09E1')
084                    || (c >= '\u09F0' && c <= '\u09F1')
085                    || (c >= '\u0A05' && c <= '\u0A0A')
086                    || (c >= '\u0A0F' && c <= '\u0A10')
087                    || (c >= '\u0A13' && c <= '\u0A28')
088                    || (c >= '\u0A2A' && c <= '\u0A30')
089                    || (c >= '\u0A32' && c <= '\u0A33')
090                    || (c >= '\u0A35' && c <= '\u0A36')
091                    || (c >= '\u0A38' && c <= '\u0A39')
092                    || (c >= '\u0A59' && c <= '\u0A5C') || (c == '\u0A5E')
093                    || (c >= '\u0A72' && c <= '\u0A74')
094                    || (c >= '\u0A85' && c <= '\u0A8B') || (c == '\u0A8D')
095                    || (c >= '\u0A8F' && c <= '\u0A91')
096                    || (c >= '\u0A93' && c <= '\u0AA8')
097                    || (c >= '\u0AAA' && c <= '\u0AB0')
098                    || (c >= '\u0AB2' && c <= '\u0AB3')
099                    || (c >= '\u0AB5' && c <= '\u0AB9') || (c == '\u0ABD')
100                    || (c == '\u0AE0') || (c >= '\u0B05' && c <= '\u0B0C')
101                    || (c >= '\u0B0F' && c <= '\u0B10')
102                    || (c >= '\u0B13' && c <= '\u0B28')
103                    || (c >= '\u0B2A' && c <= '\u0B30')
104                    || (c >= '\u0B32' && c <= '\u0B33')
105                    || (c >= '\u0B36' && c <= '\u0B39') || (c == '\u0B3D')
106                    || (c >= '\u0B5C' && c <= '\u0B5D')
107                    || (c >= '\u0B5F' && c <= '\u0B61')
108                    || (c >= '\u0B85' && c <= '\u0B8A')
109                    || (c >= '\u0B8E' && c <= '\u0B90')
110                    || (c >= '\u0B92' && c <= '\u0B95')
111                    || (c >= '\u0B99' && c <= '\u0B9A') || (c == '\u0B9C')
112                    || (c >= '\u0B9E' && c <= '\u0B9F')
113                    || (c >= '\u0BA3' && c <= '\u0BA4')
114                    || (c >= '\u0BA8' && c <= '\u0BAA')
115                    || (c >= '\u0BAE' && c <= '\u0BB5')
116                    || (c >= '\u0BB7' && c <= '\u0BB9')
117                    || (c >= '\u0C05' && c <= '\u0C0C')
118                    || (c >= '\u0C0E' && c <= '\u0C10')
119                    || (c >= '\u0C12' && c <= '\u0C28')
120                    || (c >= '\u0C2A' && c <= '\u0C33')
121                    || (c >= '\u0C35' && c <= '\u0C39')
122                    || (c >= '\u0C60' && c <= '\u0C61')
123                    || (c >= '\u0C85' && c <= '\u0C8C')
124                    || (c >= '\u0C8E' && c <= '\u0C90')
125                    || (c >= '\u0C92' && c <= '\u0CA8')
126                    || (c >= '\u0CAA' && c <= '\u0CB3')
127                    || (c >= '\u0CB5' && c <= '\u0CB9') || (c == '\u0CDE')
128                    || (c >= '\u0CE0' && c <= '\u0CE1')
129                    || (c >= '\u0D05' && c <= '\u0D0C')
130                    || (c >= '\u0D0E' && c <= '\u0D10')
131                    || (c >= '\u0D12' && c <= '\u0D28')
132                    || (c >= '\u0D2A' && c <= '\u0D39')
133                    || (c >= '\u0D60' && c <= '\u0D61')
134                    || (c >= '\u0E01' && c <= '\u0E2E') || (c == '\u0E30')
135                    || (c >= '\u0E32' && c <= '\u0E33')
136                    || (c >= '\u0E40' && c <= '\u0E45')
137                    || (c >= '\u0E81' && c <= '\u0E82') || (c == '\u0E84')
138                    || (c >= '\u0E87' && c <= '\u0E88') || (c == '\u0E8A')
139                    || (c == '\u0E8D') || (c >= '\u0E94' && c <= '\u0E97')
140                    || (c >= '\u0E99' && c <= '\u0E9F')
141                    || (c >= '\u0EA1' && c <= '\u0EA3') || (c == '\u0EA5')
142                    || (c == '\u0EA7') || (c >= '\u0EAA' && c <= '\u0EAB')
143                    || (c >= '\u0EAD' && c <= '\u0EAE') || (c == '\u0EB0')
144                    || (c >= '\u0EB2' && c <= '\u0EB3') || (c == '\u0EBD')
145                    || (c >= '\u0EC0' && c <= '\u0EC4')
146                    || (c >= '\u0F40' && c <= '\u0F47')
147                    || (c >= '\u0F49' && c <= '\u0F69')
148                    || (c >= '\u10A0' && c <= '\u10C5')
149                    || (c >= '\u10D0' && c <= '\u10F6') || (c == '\u1100')
150                    || (c >= '\u1102' && c <= '\u1103')
151                    || (c >= '\u1105' && c <= '\u1107') || (c == '\u1109')
152                    || (c >= '\u110B' && c <= '\u110C')
153                    || (c >= '\u110E' && c <= '\u1112') || (c == '\u113C')
154                    || (c == '\u113E') || (c == '\u1140') || (c == '\u114C')
155                    || (c == '\u114E') || (c == '\u1150')
156                    || (c >= '\u1154' && c <= '\u1155') || (c == '\u1159')
157                    || (c >= '\u115F' && c <= '\u1161') || (c == '\u1163')
158                    || (c == '\u1165') || (c == '\u1167') || (c == '\u1169')
159                    || (c >= '\u116D' && c <= '\u116E')
160                    || (c >= '\u1172' && c <= '\u1173') || (c == '\u1175')
161                    || (c == '\u119E') || (c == '\u11A8') || (c == '\u11AB')
162                    || (c >= '\u11AE' && c <= '\u11AF')
163                    || (c >= '\u11B7' && c <= '\u11B8') || (c == '\u11BA')
164                    || (c >= '\u11BC' && c <= '\u11C2') || (c == '\u11EB')
165                    || (c == '\u11F0') || (c == '\u11F9')
166                    || (c >= '\u1E00' && c <= '\u1E9B')
167                    || (c >= '\u1EA0' && c <= '\u1EF9')
168                    || (c >= '\u1F00' && c <= '\u1F15')
169                    || (c >= '\u1F18' && c <= '\u1F1D')
170                    || (c >= '\u1F20' && c <= '\u1F45')
171                    || (c >= '\u1F48' && c <= '\u1F4D')
172                    || (c >= '\u1F50' && c <= '\u1F57') || (c == '\u1F59')
173                    || (c == '\u1F5B') || (c == '\u1F5D')
174                    || (c >= '\u1F5F' && c <= '\u1F7D')
175                    || (c >= '\u1F80' && c <= '\u1FB4')
176                    || (c >= '\u1FB6' && c <= '\u1FBC') || (c == '\u1FBE')
177                    || (c >= '\u1FC2' && c <= '\u1FC4')
178                    || (c >= '\u1FC6' && c <= '\u1FCC')
179                    || (c >= '\u1FD0' && c <= '\u1FD3')
180                    || (c >= '\u1FD6' && c <= '\u1FDB')
181                    || (c >= '\u1FE0' && c <= '\u1FEC')
182                    || (c >= '\u1FF2' && c <= '\u1FF4')
183                    || (c >= '\u1FF6' && c <= '\u1FFC') || (c == '\u2126')
184                    || (c >= '\u212A' && c <= '\u212B') || (c == '\u212E')
185                    || (c >= '\u2180' && c <= '\u2182')
186                    || (c >= '\u3041' && c <= '\u3094')
187                    || (c >= '\u30A1' && c <= '\u30FA')
188                    || (c >= '\u3105' && c <= '\u312C')
189                    || (c >= '\uAC00' && c <= '\uD7A3')
190                    || (c >= '\u4E00' && c <= '\u9FA5') || (c == '\u3007')
191                    || (c >= '\u3021' && c <= '\u3029') || (c == '_'));
192        }
193    
194        public static boolean isNCNameTrail(char c) {
195            return ((c >= '\u0030' && c <= '\u0039')
196                    || (c >= '\u0660' && c <= '\u0669')
197                    || (c >= '\u06F0' && c <= '\u06F9')
198                    || (c >= '\u0966' && c <= '\u096F')
199                    || (c >= '\u09E6' && c <= '\u09EF')
200                    || (c >= '\u0A66' && c <= '\u0A6F')
201                    || (c >= '\u0AE6' && c <= '\u0AEF')
202                    || (c >= '\u0B66' && c <= '\u0B6F')
203                    || (c >= '\u0BE7' && c <= '\u0BEF')
204                    || (c >= '\u0C66' && c <= '\u0C6F')
205                    || (c >= '\u0CE6' && c <= '\u0CEF')
206                    || (c >= '\u0D66' && c <= '\u0D6F')
207                    || (c >= '\u0E50' && c <= '\u0E59')
208                    || (c >= '\u0ED0' && c <= '\u0ED9')
209                    || (c >= '\u0F20' && c <= '\u0F29')
210                    || (c >= '\u0041' && c <= '\u005A')
211                    || (c >= '\u0061' && c <= '\u007A')
212                    || (c >= '\u00C0' && c <= '\u00D6')
213                    || (c >= '\u00D8' && c <= '\u00F6')
214                    || (c >= '\u00F8' && c <= '\u00FF')
215                    || (c >= '\u0100' && c <= '\u0131')
216                    || (c >= '\u0134' && c <= '\u013E')
217                    || (c >= '\u0141' && c <= '\u0148')
218                    || (c >= '\u014A' && c <= '\u017E')
219                    || (c >= '\u0180' && c <= '\u01C3')
220                    || (c >= '\u01CD' && c <= '\u01F0')
221                    || (c >= '\u01F4' && c <= '\u01F5')
222                    || (c >= '\u01FA' && c <= '\u0217')
223                    || (c >= '\u0250' && c <= '\u02A8')
224                    || (c >= '\u02BB' && c <= '\u02C1') || (c == '\u0386')
225                    || (c >= '\u0388' && c <= '\u038A') || (c == '\u038C')
226                    || (c >= '\u038E' && c <= '\u03A1')
227                    || (c >= '\u03A3' && c <= '\u03CE')
228                    || (c >= '\u03D0' && c <= '\u03D6') || (c == '\u03DA')
229                    || (c == '\u03DC') || (c == '\u03DE') || (c == '\u03E0')
230                    || (c >= '\u03E2' && c <= '\u03F3')
231                    || (c >= '\u0401' && c <= '\u040C')
232                    || (c >= '\u040E' && c <= '\u044F')
233                    || (c >= '\u0451' && c <= '\u045C')
234                    || (c >= '\u045E' && c <= '\u0481')
235                    || (c >= '\u0490' && c <= '\u04C4')
236                    || (c >= '\u04C7' && c <= '\u04C8')
237                    || (c >= '\u04CB' && c <= '\u04CC')
238                    || (c >= '\u04D0' && c <= '\u04EB')
239                    || (c >= '\u04EE' && c <= '\u04F5')
240                    || (c >= '\u04F8' && c <= '\u04F9')
241                    || (c >= '\u0531' && c <= '\u0556') || (c == '\u0559')
242                    || (c >= '\u0561' && c <= '\u0586')
243                    || (c >= '\u05D0' && c <= '\u05EA')
244                    || (c >= '\u05F0' && c <= '\u05F2')
245                    || (c >= '\u0621' && c <= '\u063A')
246                    || (c >= '\u0641' && c <= '\u064A')
247                    || (c >= '\u0671' && c <= '\u06B7')
248                    || (c >= '\u06BA' && c <= '\u06BE')
249                    || (c >= '\u06C0' && c <= '\u06CE')
250                    || (c >= '\u06D0' && c <= '\u06D3') || (c == '\u06D5')
251                    || (c >= '\u06E5' && c <= '\u06E6')
252                    || (c >= '\u0905' && c <= '\u0939') || (c == '\u093D')
253                    || (c >= '\u0958' && c <= '\u0961')
254                    || (c >= '\u0985' && c <= '\u098C')
255                    || (c >= '\u098F' && c <= '\u0990')
256                    || (c >= '\u0993' && c <= '\u09A8')
257                    || (c >= '\u09AA' && c <= '\u09B0') || (c == '\u09B2')
258                    || (c >= '\u09B6' && c <= '\u09B9')
259                    || (c >= '\u09DC' && c <= '\u09DD')
260                    || (c >= '\u09DF' && c <= '\u09E1')
261                    || (c >= '\u09F0' && c <= '\u09F1')
262                    || (c >= '\u0A05' && c <= '\u0A0A')
263                    || (c >= '\u0A0F' && c <= '\u0A10')
264                    || (c >= '\u0A13' && c <= '\u0A28')
265                    || (c >= '\u0A2A' && c <= '\u0A30')
266                    || (c >= '\u0A32' && c <= '\u0A33')
267                    || (c >= '\u0A35' && c <= '\u0A36')
268                    || (c >= '\u0A38' && c <= '\u0A39')
269                    || (c >= '\u0A59' && c <= '\u0A5C') || (c == '\u0A5E')
270                    || (c >= '\u0A72' && c <= '\u0A74')
271                    || (c >= '\u0A85' && c <= '\u0A8B') || (c == '\u0A8D')
272                    || (c >= '\u0A8F' && c <= '\u0A91')
273                    || (c >= '\u0A93' && c <= '\u0AA8')
274                    || (c >= '\u0AAA' && c <= '\u0AB0')
275                    || (c >= '\u0AB2' && c <= '\u0AB3')
276                    || (c >= '\u0AB5' && c <= '\u0AB9') || (c == '\u0ABD')
277                    || (c == '\u0AE0') || (c >= '\u0B05' && c <= '\u0B0C')
278                    || (c >= '\u0B0F' && c <= '\u0B10')
279                    || (c >= '\u0B13' && c <= '\u0B28')
280                    || (c >= '\u0B2A' && c <= '\u0B30')
281                    || (c >= '\u0B32' && c <= '\u0B33')
282                    || (c >= '\u0B36' && c <= '\u0B39') || (c == '\u0B3D')
283                    || (c >= '\u0B5C' && c <= '\u0B5D')
284                    || (c >= '\u0B5F' && c <= '\u0B61')
285                    || (c >= '\u0B85' && c <= '\u0B8A')
286                    || (c >= '\u0B8E' && c <= '\u0B90')
287                    || (c >= '\u0B92' && c <= '\u0B95')
288                    || (c >= '\u0B99' && c <= '\u0B9A') || (c == '\u0B9C')
289                    || (c >= '\u0B9E' && c <= '\u0B9F')
290                    || (c >= '\u0BA3' && c <= '\u0BA4')
291                    || (c >= '\u0BA8' && c <= '\u0BAA')
292                    || (c >= '\u0BAE' && c <= '\u0BB5')
293                    || (c >= '\u0BB7' && c <= '\u0BB9')
294                    || (c >= '\u0C05' && c <= '\u0C0C')
295                    || (c >= '\u0C0E' && c <= '\u0C10')
296                    || (c >= '\u0C12' && c <= '\u0C28')
297                    || (c >= '\u0C2A' && c <= '\u0C33')
298                    || (c >= '\u0C35' && c <= '\u0C39')
299                    || (c >= '\u0C60' && c <= '\u0C61')
300                    || (c >= '\u0C85' && c <= '\u0C8C')
301                    || (c >= '\u0C8E' && c <= '\u0C90')
302                    || (c >= '\u0C92' && c <= '\u0CA8')
303                    || (c >= '\u0CAA' && c <= '\u0CB3')
304                    || (c >= '\u0CB5' && c <= '\u0CB9') || (c == '\u0CDE')
305                    || (c >= '\u0CE0' && c <= '\u0CE1')
306                    || (c >= '\u0D05' && c <= '\u0D0C')
307                    || (c >= '\u0D0E' && c <= '\u0D10')
308                    || (c >= '\u0D12' && c <= '\u0D28')
309                    || (c >= '\u0D2A' && c <= '\u0D39')
310                    || (c >= '\u0D60' && c <= '\u0D61')
311                    || (c >= '\u0E01' && c <= '\u0E2E') || (c == '\u0E30')
312                    || (c >= '\u0E32' && c <= '\u0E33')
313                    || (c >= '\u0E40' && c <= '\u0E45')
314                    || (c >= '\u0E81' && c <= '\u0E82') || (c == '\u0E84')
315                    || (c >= '\u0E87' && c <= '\u0E88') || (c == '\u0E8A')
316                    || (c == '\u0E8D') || (c >= '\u0E94' && c <= '\u0E97')
317                    || (c >= '\u0E99' && c <= '\u0E9F')
318                    || (c >= '\u0EA1' && c <= '\u0EA3') || (c == '\u0EA5')
319                    || (c == '\u0EA7') || (c >= '\u0EAA' && c <= '\u0EAB')
320                    || (c >= '\u0EAD' && c <= '\u0EAE') || (c == '\u0EB0')
321                    || (c >= '\u0EB2' && c <= '\u0EB3') || (c == '\u0EBD')
322                    || (c >= '\u0EC0' && c <= '\u0EC4')
323                    || (c >= '\u0F40' && c <= '\u0F47')
324                    || (c >= '\u0F49' && c <= '\u0F69')
325                    || (c >= '\u10A0' && c <= '\u10C5')
326                    || (c >= '\u10D0' && c <= '\u10F6') || (c == '\u1100')
327                    || (c >= '\u1102' && c <= '\u1103')
328                    || (c >= '\u1105' && c <= '\u1107') || (c == '\u1109')
329                    || (c >= '\u110B' && c <= '\u110C')
330                    || (c >= '\u110E' && c <= '\u1112') || (c == '\u113C')
331                    || (c == '\u113E') || (c == '\u1140') || (c == '\u114C')
332                    || (c == '\u114E') || (c == '\u1150')
333                    || (c >= '\u1154' && c <= '\u1155') || (c == '\u1159')
334                    || (c >= '\u115F' && c <= '\u1161') || (c == '\u1163')
335                    || (c == '\u1165') || (c == '\u1167') || (c == '\u1169')
336                    || (c >= '\u116D' && c <= '\u116E')
337                    || (c >= '\u1172' && c <= '\u1173') || (c == '\u1175')
338                    || (c == '\u119E') || (c == '\u11A8') || (c == '\u11AB')
339                    || (c >= '\u11AE' && c <= '\u11AF')
340                    || (c >= '\u11B7' && c <= '\u11B8') || (c == '\u11BA')
341                    || (c >= '\u11BC' && c <= '\u11C2') || (c == '\u11EB')
342                    || (c == '\u11F0') || (c == '\u11F9')
343                    || (c >= '\u1E00' && c <= '\u1E9B')
344                    || (c >= '\u1EA0' && c <= '\u1EF9')
345                    || (c >= '\u1F00' && c <= '\u1F15')
346                    || (c >= '\u1F18' && c <= '\u1F1D')
347                    || (c >= '\u1F20' && c <= '\u1F45')
348                    || (c >= '\u1F48' && c <= '\u1F4D')
349                    || (c >= '\u1F50' && c <= '\u1F57') || (c == '\u1F59')
350                    || (c == '\u1F5B') || (c == '\u1F5D')
351                    || (c >= '\u1F5F' && c <= '\u1F7D')
352                    || (c >= '\u1F80' && c <= '\u1FB4')
353                    || (c >= '\u1FB6' && c <= '\u1FBC') || (c == '\u1FBE')
354                    || (c >= '\u1FC2' && c <= '\u1FC4')
355                    || (c >= '\u1FC6' && c <= '\u1FCC')
356                    || (c >= '\u1FD0' && c <= '\u1FD3')
357                    || (c >= '\u1FD6' && c <= '\u1FDB')
358                    || (c >= '\u1FE0' && c <= '\u1FEC')
359                    || (c >= '\u1FF2' && c <= '\u1FF4')
360                    || (c >= '\u1FF6' && c <= '\u1FFC') || (c == '\u2126')
361                    || (c >= '\u212A' && c <= '\u212B') || (c == '\u212E')
362                    || (c >= '\u2180' && c <= '\u2182')
363                    || (c >= '\u3041' && c <= '\u3094')
364                    || (c >= '\u30A1' && c <= '\u30FA')
365                    || (c >= '\u3105' && c <= '\u312C')
366                    || (c >= '\uAC00' && c <= '\uD7A3')
367                    || (c >= '\u4E00' && c <= '\u9FA5') || (c == '\u3007')
368                    || (c >= '\u3021' && c <= '\u3029') || (c == '_') || (c == '.')
369                    || (c == '-') || (c >= '\u0300' && c <= '\u0345')
370                    || (c >= '\u0360' && c <= '\u0361')
371                    || (c >= '\u0483' && c <= '\u0486')
372                    || (c >= '\u0591' && c <= '\u05A1')
373                    || (c >= '\u05A3' && c <= '\u05B9')
374                    || (c >= '\u05BB' && c <= '\u05BD') || (c == '\u05BF')
375                    || (c >= '\u05C1' && c <= '\u05C2') || (c == '\u05C4')
376                    || (c >= '\u064B' && c <= '\u0652') || (c == '\u0670')
377                    || (c >= '\u06D6' && c <= '\u06DC')
378                    || (c >= '\u06DD' && c <= '\u06DF')
379                    || (c >= '\u06E0' && c <= '\u06E4')
380                    || (c >= '\u06E7' && c <= '\u06E8')
381                    || (c >= '\u06EA' && c <= '\u06ED')
382                    || (c >= '\u0901' && c <= '\u0903') || (c == '\u093C')
383                    || (c >= '\u093E' && c <= '\u094C') || (c == '\u094D')
384                    || (c >= '\u0951' && c <= '\u0954')
385                    || (c >= '\u0962' && c <= '\u0963')
386                    || (c >= '\u0981' && c <= '\u0983') || (c == '\u09BC')
387                    || (c == '\u09BE') || (c == '\u09BF')
388                    || (c >= '\u09C0' && c <= '\u09C4')
389                    || (c >= '\u09C7' && c <= '\u09C8')
390                    || (c >= '\u09CB' && c <= '\u09CD') || (c == '\u09D7')
391                    || (c >= '\u09E2' && c <= '\u09E3') || (c == '\u0A02')
392                    || (c == '\u0A3C') || (c == '\u0A3E') || (c == '\u0A3F')
393                    || (c >= '\u0A40' && c <= '\u0A42')
394                    || (c >= '\u0A47' && c <= '\u0A48')
395                    || (c >= '\u0A4B' && c <= '\u0A4D')
396                    || (c >= '\u0A70' && c <= '\u0A71')
397                    || (c >= '\u0A81' && c <= '\u0A83') || (c == '\u0ABC')
398                    || (c >= '\u0ABE' && c <= '\u0AC5')
399                    || (c >= '\u0AC7' && c <= '\u0AC9')
400                    || (c >= '\u0ACB' && c <= '\u0ACD')
401                    || (c >= '\u0B01' && c <= '\u0B03') || (c == '\u0B3C')
402                    || (c >= '\u0B3E' && c <= '\u0B43')
403                    || (c >= '\u0B47' && c <= '\u0B48')
404                    || (c >= '\u0B4B' && c <= '\u0B4D')
405                    || (c >= '\u0B56' && c <= '\u0B57')
406                    || (c >= '\u0B82' && c <= '\u0B83')
407                    || (c >= '\u0BBE' && c <= '\u0BC2')
408                    || (c >= '\u0BC6' && c <= '\u0BC8')
409                    || (c >= '\u0BCA' && c <= '\u0BCD') || (c == '\u0BD7')
410                    || (c >= '\u0C01' && c <= '\u0C03')
411                    || (c >= '\u0C3E' && c <= '\u0C44')
412                    || (c >= '\u0C46' && c <= '\u0C48')
413                    || (c >= '\u0C4A' && c <= '\u0C4D')
414                    || (c >= '\u0C55' && c <= '\u0C56')
415                    || (c >= '\u0C82' && c <= '\u0C83')
416                    || (c >= '\u0CBE' && c <= '\u0CC4')
417                    || (c >= '\u0CC6' && c <= '\u0CC8')
418                    || (c >= '\u0CCA' && c <= '\u0CCD')
419                    || (c >= '\u0CD5' && c <= '\u0CD6')
420                    || (c >= '\u0D02' && c <= '\u0D03')
421                    || (c >= '\u0D3E' && c <= '\u0D43')
422                    || (c >= '\u0D46' && c <= '\u0D48')
423                    || (c >= '\u0D4A' && c <= '\u0D4D') || (c == '\u0D57')
424                    || (c == '\u0E31') || (c >= '\u0E34' && c <= '\u0E3A')
425                    || (c >= '\u0E47' && c <= '\u0E4E') || (c == '\u0EB1')
426                    || (c >= '\u0EB4' && c <= '\u0EB9')
427                    || (c >= '\u0EBB' && c <= '\u0EBC')
428                    || (c >= '\u0EC8' && c <= '\u0ECD')
429                    || (c >= '\u0F18' && c <= '\u0F19') || (c == '\u0F35')
430                    || (c == '\u0F37') || (c == '\u0F39') || (c == '\u0F3E')
431                    || (c == '\u0F3F') || (c >= '\u0F71' && c <= '\u0F84')
432                    || (c >= '\u0F86' && c <= '\u0F8B')
433                    || (c >= '\u0F90' && c <= '\u0F95') || (c == '\u0F97')
434                    || (c >= '\u0F99' && c <= '\u0FAD')
435                    || (c >= '\u0FB1' && c <= '\u0FB7') || (c == '\u0FB9')
436                    || (c >= '\u20D0' && c <= '\u20DC') || (c == '\u20E1')
437                    || (c >= '\u302A' && c <= '\u302F') || (c == '\u3099')
438                    || (c == '\u309A') || (c == '\u00B7') || (c == '\u02D0')
439                    || (c == '\u02D1') || (c == '\u0387') || (c == '\u0640')
440                    || (c == '\u0E46') || (c == '\u0EC6') || (c == '\u3005')
441                    || (c >= '\u3031' && c <= '\u3035')
442                    || (c >= '\u309D' && c <= '\u309E') || (c >= '\u30FC' && c <= '\u30FE'));
443        }
444    
445        public static boolean isNCName(String str) {
446            if (str == null) {
447                return false;
448            } else {
449                int len = str.length();
450                switch (len) {
451                    case 0:
452                        return false;
453                    case 1:
454                        return NCName.isNCNameStart(str.charAt(0));
455                    default:
456                        if (!NCName.isNCNameStart(str.charAt(0))) {
457                            return false;
458                        }
459                        for (int i = 1; i < len; i++) {
460                            if (!NCName.isNCNameTrail(str.charAt(i))) {
461                                return false;
462                            }
463                        }
464                }
465                return true;
466            }
467        }
468        
469        private static void appendUHexTo(StringBuilder sb, int c) {
470            sb.append('U');
471            for (int i = 0; i < 6; i++) {
472                sb.append(HEX_TABLE[(c & 0xF00000) >> 20]);
473                c <<= 4;
474            }
475        }
476        
477        public static String escapeName(String str) {
478            StringBuilder sb = new StringBuilder();
479            for (int i = 0; i < str.length(); i++) {
480                char c = str.charAt(i);
481                if ((c & 0xFC00) == 0xD800) {
482                    char next = str.charAt(++i);
483                    appendUHexTo(sb, (c << 10) + next + SURROGATE_OFFSET);          
484                } else if (i == 0 && !isNCNameStart(c)) {
485                    appendUHexTo(sb, c);
486                } else if (i != 0 && !isNCNameTrail(c)) {
487                    appendUHexTo(sb, c);                
488                } else {
489                    sb.append(c);
490                }
491            }
492            return sb.toString().intern();
493        }
494        // ]NOCPP]
495    }