0001: /* Verifier.java
0002:
0003: {{IS_NOTE
0004:
0005: Purpose:
0006: Description:
0007: History:
0008: 2001/10/21 17:03:23, Create, Tom M. Yeh.
0009: }}IS_NOTE
0010:
0011: Copyright (C) 2001 Potix Corporation. All Rights Reserved.
0012:
0013: {{IS_RIGHT
0014: This program is distributed under GPL Version 2.0 in the hope that
0015: it will be useful, but WITHOUT ANY WARRANTY.
0016: }}IS_RIGHT
0017: */
0018: package org.zkoss.idom;
0019:
0020: import org.xml.sax.Locator;
0021:
0022: /**
0023: * The verifier to verify W3C/DOM related constraints.
0024: *
0025: * @author tomyeh
0026: */
0027: public class Verifier {
0028: private Verifier() {
0029: }
0030:
0031: /**
0032: * Checks whether an element's name is valid.
0033: */
0034: public static final void checkElementName(String name, Locator loc) {
0035: if (name.indexOf(":") >= 0)
0036: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0037: "Element or attribute names cannot contain colons",
0038: loc);
0039: checkXMLName(name, loc);
0040: }
0041:
0042: /**
0043: * Checks whether an attribute's name is valid.
0044: */
0045: public static final void checkAttributeName(String name, Locator loc) {
0046: // Allow xml:space and xml:lang as special cases
0047: if (!name.equals("xml:space") && !name.equals("xml:lang"))
0048: checkElementName(name, loc);
0049: }
0050:
0051: protected static final StringBuffer appendAsHex(StringBuffer sb,
0052: char c) {
0053: return sb.append('\'').append(c).append("' (0x").append(
0054: Integer.toHexString(c)).append(')');
0055: }
0056:
0057: /**
0058: * Checks whether a text is valid.
0059: */
0060: public static final void checkCharacterData(String text, Locator loc) {
0061: if (text == null)
0062: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0063: "A null is not a legal XML value", loc);
0064:
0065: for (int j = 0, len = text.length(); j < len; j++)
0066: if (!isXMLCharacter(text.charAt(j))) {
0067: StringBuffer sb = new StringBuffer(40);
0068: throw new DOMException(
0069: DOMException.INVALID_CHARACTER_ERR,
0070: appendAsHex(sb, text.charAt(j)).append(
0071: " is not a valid XML character")
0072: .toString(), loc);
0073: }
0074: }
0075:
0076: /**
0077: * Checks whether a CDATA is valid.
0078: */
0079: public static final void checkCData(String data, Locator loc) {
0080: if (data.indexOf("]]>") >= 0)
0081: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0082: "']]>' is not allowed inside a CDATA string", loc);
0083: checkCharacterData(data, loc);
0084: }
0085:
0086: /**
0087: * Checks whether the prefix of a namespace is valid.
0088: */
0089: public static final void checkNamespacePrefix(String prefix,
0090: Locator loc) {
0091: if (prefix == null || prefix.length() == 0)
0092: return; //OK: null or empty
0093:
0094: String reason = null;
0095: char first = prefix.charAt(0);
0096: if (isXMLDigit(first)) {
0097: reason = "a number";
0098: } else if (first == '$') {
0099: reason = "a dollar sign ($)";
0100: } else if (first == '-') {
0101: reason = "a hyphen (-)";
0102: } else if (first == '.') {
0103: reason = "a period (.)";
0104: } else {
0105: final String s = prefix.toLowerCase();
0106: if (s.startsWith("xml") && !s.equals("xmlns"))
0107: reason = "\"xml\" in any combination of case";
0108: }
0109:
0110: if (reason != null)
0111: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0112: "Namespace prefixes, " + prefix
0113: + ", cannot begin with " + reason, loc);
0114:
0115: for (int j = 0, len = prefix.length(); j < len; j++)
0116: if (!isXMLNameCharacter(prefix.charAt(j))) {
0117: StringBuffer sb = new StringBuffer(
0118: "Namespace prefixes cannot contain ");
0119: throw new DOMException(
0120: DOMException.INVALID_CHARACTER_ERR,
0121: appendAsHex(sb, prefix.charAt(j)).toString(),
0122: loc);
0123: }
0124:
0125: if (prefix.indexOf(":") >= 0)
0126: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0127: "Namespace prefixes cannot contain colons", loc);
0128: }
0129:
0130: /**
0131: * Checks whether the URI of a namespace is valid.
0132: */
0133: public static final void checkNamespaceURI(String uri, Locator loc) {
0134: if (uri == null || uri.length() == 0)
0135: return; //OK: null or empty
0136:
0137: String reason = null;
0138: char first = uri.charAt(0);
0139: if (Character.isDigit(first))
0140: reason = "a number";
0141: else if (first == '$')
0142: reason = "a dollar sign ($)";
0143: else if (first == '-')
0144: reason = "a hyphen (-)";
0145:
0146: if (reason != null)
0147: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0148: "Namespace URIs cannot begin with " + reason, loc);
0149: }
0150:
0151: /**
0152: * Checks whether a processing instruction target is valid.
0153: */
0154: public static final void checkPITarget(String target, Locator loc) {
0155: if (target.indexOf(":") >= 0)
0156: throw new DOMException(
0157: DOMException.INVALID_CHARACTER_ERR,
0158: "Processing instruction targets cannot contain colons",
0159: loc);
0160: if (target.equalsIgnoreCase("xml"))
0161: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0162: "Processing instruction targets cannot be "
0163: + "\"xml\" in any combination of case", loc);
0164:
0165: checkXMLName(target, loc);
0166: }
0167:
0168: /**
0169: * Checks whether a comment data is valid.
0170: */
0171: public static final void checkCommentData(String data, Locator loc) {
0172: if (data.indexOf("--") >= 0)
0173: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0174: "Comments cannot contain double hyphens (--)", loc);
0175:
0176: checkCharacterData(data, loc);
0177: }
0178:
0179: /**
0180: * Checks whether a name is valid.
0181: */
0182: public static void checkXMLName(String name, Locator loc) {
0183: if (name == null || name.length() == 0)
0184: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0185: "XML names cannot be null or empty", loc);
0186:
0187: if (!isXMLNameStartCharacter(name.charAt(0)))
0188: throw new DOMException(DOMException.INVALID_CHARACTER_ERR,
0189: "XML names cannot begin with \'" + name.charAt(0)
0190: + '\'', loc);
0191:
0192: for (int j = 0, len = name.length(); j < len; j++)
0193: if (!isXMLNameCharacter(name.charAt(j)))
0194: throw new DOMException(
0195: DOMException.INVALID_CHARACTER_ERR,
0196: "XML names cannot contain \'" + name.charAt(j)
0197: + '\'', loc);
0198: }
0199:
0200: /**
0201: * Checks whether a character is valid.
0202: */
0203: public static boolean isXMLCharacter(char c) {
0204: if (c == '\n')
0205: return true;
0206: if (c == '\r')
0207: return true;
0208: if (c == '\t')
0209: return true;
0210:
0211: if (c < 0x20)
0212: return false;
0213: if (c <= 0xD7FF)
0214: return true;
0215: if (c < 0xE000)
0216: return false;
0217: if (c <= 0xFFFD)
0218: return true;
0219: if (c < 0x10000)
0220: return false;
0221: if (c <= 0x10FFFF)
0222: return true;
0223:
0224: return false;
0225: }
0226:
0227: /**
0228: * Checks whether a character can be part of a name.
0229: */
0230: public static boolean isXMLNameCharacter(char c) {
0231: return isXMLLetter(c) || isXMLDigit(c) || c == '.' || c == '-'
0232: || c == '_' || c == ':' || isXMLCombiningChar(c)
0233: || isXMLExtender(c);
0234: }
0235:
0236: /**
0237: * Checks whether a character can be the first character of a name.
0238: */
0239: public static boolean isXMLNameStartCharacter(char c) {
0240: return isXMLLetter(c) || c == '_' || c == ':';
0241: }
0242:
0243: /**
0244: * Checks whether a character is a letter or digit.
0245: */
0246: public static boolean isXMLLetterOrDigit(char c) {
0247: return (isXMLLetter(c) || isXMLDigit(c));
0248: }
0249:
0250: /**
0251: * Checks whether a character is a letter.
0252: */
0253: public static boolean isXMLLetter(char c) {
0254: if (c < 0x0041)
0255: return false;
0256: if (c <= 0x005a)
0257: return true;
0258: if (c < 0x0061)
0259: return false;
0260: if (c <= 0x007A)
0261: return true;
0262: if (c < 0x00C0)
0263: return false;
0264: if (c <= 0x00D6)
0265: return true;
0266: if (c < 0x00D8)
0267: return false;
0268: if (c <= 0x00F6)
0269: return true;
0270: if (c < 0x00F8)
0271: return false;
0272: if (c <= 0x00FF)
0273: return true;
0274: if (c < 0x0100)
0275: return false;
0276: if (c <= 0x0131)
0277: return true;
0278: if (c < 0x0134)
0279: return false;
0280: if (c <= 0x013E)
0281: return true;
0282: if (c < 0x0141)
0283: return false;
0284: if (c <= 0x0148)
0285: return true;
0286: if (c < 0x014A)
0287: return false;
0288: if (c <= 0x017E)
0289: return true;
0290: if (c < 0x0180)
0291: return false;
0292: if (c <= 0x01C3)
0293: return true;
0294: if (c < 0x01CD)
0295: return false;
0296: if (c <= 0x01F0)
0297: return true;
0298: if (c < 0x01F4)
0299: return false;
0300: if (c <= 0x01F5)
0301: return true;
0302: if (c < 0x01FA)
0303: return false;
0304: if (c <= 0x0217)
0305: return true;
0306: if (c < 0x0250)
0307: return false;
0308: if (c <= 0x02A8)
0309: return true;
0310: if (c < 0x02BB)
0311: return false;
0312: if (c <= 0x02C1)
0313: return true;
0314: if (c == 0x0386)
0315: return true;
0316: if (c < 0x0388)
0317: return false;
0318: if (c <= 0x038A)
0319: return true;
0320: if (c == 0x038C)
0321: return true;
0322: if (c < 0x038E)
0323: return false;
0324: if (c <= 0x03A1)
0325: return true;
0326: if (c < 0x03A3)
0327: return false;
0328: if (c <= 0x03CE)
0329: return true;
0330: if (c < 0x03D0)
0331: return false;
0332: if (c <= 0x03D6)
0333: return true;
0334: if (c == 0x03DA)
0335: return true;
0336: if (c == 0x03DC)
0337: return true;
0338: if (c == 0x03DE)
0339: return true;
0340: if (c == 0x03E0)
0341: return true;
0342: if (c < 0x03E2)
0343: return false;
0344: if (c <= 0x03F3)
0345: return true;
0346: if (c < 0x0401)
0347: return false;
0348: if (c <= 0x040C)
0349: return true;
0350: if (c < 0x040E)
0351: return false;
0352: if (c <= 0x044F)
0353: return true;
0354: if (c < 0x0451)
0355: return false;
0356: if (c <= 0x045C)
0357: return true;
0358: if (c < 0x045E)
0359: return false;
0360: if (c <= 0x0481)
0361: return true;
0362: if (c < 0x0490)
0363: return false;
0364: if (c <= 0x04C4)
0365: return true;
0366: if (c < 0x04C7)
0367: return false;
0368: if (c <= 0x04C8)
0369: return true;
0370: if (c < 0x04CB)
0371: return false;
0372: if (c <= 0x04CC)
0373: return true;
0374: if (c < 0x04D0)
0375: return false;
0376: if (c <= 0x04EB)
0377: return true;
0378: if (c < 0x04EE)
0379: return false;
0380: if (c <= 0x04F5)
0381: return true;
0382: if (c < 0x04F8)
0383: return false;
0384: if (c <= 0x04F9)
0385: return true;
0386: if (c < 0x0531)
0387: return false;
0388: if (c <= 0x0556)
0389: return true;
0390: if (c == 0x0559)
0391: return true;
0392: if (c < 0x0561)
0393: return false;
0394: if (c <= 0x0586)
0395: return true;
0396: if (c < 0x05D0)
0397: return false;
0398: if (c <= 0x05EA)
0399: return true;
0400: if (c < 0x05F0)
0401: return false;
0402: if (c <= 0x05F2)
0403: return true;
0404: if (c < 0x0621)
0405: return false;
0406: if (c <= 0x063A)
0407: return true;
0408: if (c < 0x0641)
0409: return false;
0410: if (c <= 0x064A)
0411: return true;
0412: if (c < 0x0671)
0413: return false;
0414: if (c <= 0x06B7)
0415: return true;
0416: if (c < 0x06BA)
0417: return false;
0418: if (c <= 0x06BE)
0419: return true;
0420: if (c < 0x06C0)
0421: return false;
0422: if (c <= 0x06CE)
0423: return true;
0424: if (c < 0x06D0)
0425: return false;
0426: if (c <= 0x06D3)
0427: return true;
0428: if (c == 0x06D5)
0429: return true;
0430: if (c < 0x06E5)
0431: return false;
0432: if (c <= 0x06E6)
0433: return true;
0434: if (c < 0x0905)
0435: return false;
0436: if (c <= 0x0939)
0437: return true;
0438: if (c == 0x093D)
0439: return true;
0440: if (c < 0x0958)
0441: return false;
0442: if (c <= 0x0961)
0443: return true;
0444: if (c < 0x0985)
0445: return false;
0446: if (c <= 0x098C)
0447: return true;
0448: if (c < 0x098F)
0449: return false;
0450: if (c <= 0x0990)
0451: return true;
0452: if (c < 0x0993)
0453: return false;
0454: if (c <= 0x09A8)
0455: return true;
0456: if (c < 0x09AA)
0457: return false;
0458: if (c <= 0x09B0)
0459: return true;
0460: if (c == 0x09B2)
0461: return true;
0462: if (c < 0x09B6)
0463: return false;
0464: if (c <= 0x09B9)
0465: return true;
0466: if (c < 0x09DC)
0467: return false;
0468: if (c <= 0x09DD)
0469: return true;
0470: if (c < 0x09DF)
0471: return false;
0472: if (c <= 0x09E1)
0473: return true;
0474: if (c < 0x09F0)
0475: return false;
0476: if (c <= 0x09F1)
0477: return true;
0478: if (c < 0x0A05)
0479: return false;
0480: if (c <= 0x0A0A)
0481: return true;
0482: if (c < 0x0A0F)
0483: return false;
0484: if (c <= 0x0A10)
0485: return true;
0486: if (c < 0x0A13)
0487: return false;
0488: if (c <= 0x0A28)
0489: return true;
0490: if (c < 0x0A2A)
0491: return false;
0492: if (c <= 0x0A30)
0493: return true;
0494: if (c < 0x0A32)
0495: return false;
0496: if (c <= 0x0A33)
0497: return true;
0498: if (c < 0x0A35)
0499: return false;
0500: if (c <= 0x0A36)
0501: return true;
0502: if (c < 0x0A38)
0503: return false;
0504: if (c <= 0x0A39)
0505: return true;
0506: if (c < 0x0A59)
0507: return false;
0508: if (c <= 0x0A5C)
0509: return true;
0510: if (c == 0x0A5E)
0511: return true;
0512: if (c < 0x0A72)
0513: return false;
0514: if (c <= 0x0A74)
0515: return true;
0516: if (c < 0x0A85)
0517: return false;
0518: if (c <= 0x0A8B)
0519: return true;
0520: if (c == 0x0A8D)
0521: return true;
0522: if (c < 0x0A8F)
0523: return false;
0524: if (c <= 0x0A91)
0525: return true;
0526: if (c < 0x0A93)
0527: return false;
0528: if (c <= 0x0AA8)
0529: return true;
0530: if (c < 0x0AAA)
0531: return false;
0532: if (c <= 0x0AB0)
0533: return true;
0534: if (c < 0x0AB2)
0535: return false;
0536: if (c <= 0x0AB3)
0537: return true;
0538: if (c < 0x0AB5)
0539: return false;
0540: if (c <= 0x0AB9)
0541: return true;
0542: if (c == 0x0ABD)
0543: return true;
0544: if (c == 0x0AE0)
0545: return true;
0546: if (c < 0x0B05)
0547: return false;
0548: if (c <= 0x0B0C)
0549: return true;
0550: if (c < 0x0B0F)
0551: return false;
0552: if (c <= 0x0B10)
0553: return true;
0554: if (c < 0x0B13)
0555: return false;
0556: if (c <= 0x0B28)
0557: return true;
0558: if (c < 0x0B2A)
0559: return false;
0560: if (c <= 0x0B30)
0561: return true;
0562: if (c < 0x0B32)
0563: return false;
0564: if (c <= 0x0B33)
0565: return true;
0566: if (c < 0x0B36)
0567: return false;
0568: if (c <= 0x0B39)
0569: return true;
0570: if (c == 0x0B3D)
0571: return true;
0572: if (c < 0x0B5C)
0573: return false;
0574: if (c <= 0x0B5D)
0575: return true;
0576: if (c < 0x0B5F)
0577: return false;
0578: if (c <= 0x0B61)
0579: return true;
0580: if (c < 0x0B85)
0581: return false;
0582: if (c <= 0x0B8A)
0583: return true;
0584: if (c < 0x0B8E)
0585: return false;
0586: if (c <= 0x0B90)
0587: return true;
0588: if (c < 0x0B92)
0589: return false;
0590: if (c <= 0x0B95)
0591: return true;
0592: if (c < 0x0B99)
0593: return false;
0594: if (c <= 0x0B9A)
0595: return true;
0596: if (c == 0x0B9C)
0597: return true;
0598: if (c < 0x0B9E)
0599: return false;
0600: if (c <= 0x0B9F)
0601: return true;
0602: if (c < 0x0BA3)
0603: return false;
0604: if (c <= 0x0BA4)
0605: return true;
0606: if (c < 0x0BA8)
0607: return false;
0608: if (c <= 0x0BAA)
0609: return true;
0610: if (c < 0x0BAE)
0611: return false;
0612: if (c <= 0x0BB5)
0613: return true;
0614: if (c < 0x0BB7)
0615: return false;
0616: if (c <= 0x0BB9)
0617: return true;
0618: if (c < 0x0C05)
0619: return false;
0620: if (c <= 0x0C0C)
0621: return true;
0622: if (c < 0x0C0E)
0623: return false;
0624: if (c <= 0x0C10)
0625: return true;
0626: if (c < 0x0C12)
0627: return false;
0628: if (c <= 0x0C28)
0629: return true;
0630: if (c < 0x0C2A)
0631: return false;
0632: if (c <= 0x0C33)
0633: return true;
0634: if (c < 0x0C35)
0635: return false;
0636: if (c <= 0x0C39)
0637: return true;
0638: if (c < 0x0C60)
0639: return false;
0640: if (c <= 0x0C61)
0641: return true;
0642: if (c < 0x0C85)
0643: return false;
0644: if (c <= 0x0C8C)
0645: return true;
0646: if (c < 0x0C8E)
0647: return false;
0648: if (c <= 0x0C90)
0649: return true;
0650: if (c < 0x0C92)
0651: return false;
0652: if (c <= 0x0CA8)
0653: return true;
0654: if (c < 0x0CAA)
0655: return false;
0656: if (c <= 0x0CB3)
0657: return true;
0658: if (c < 0x0CB5)
0659: return false;
0660: if (c <= 0x0CB9)
0661: return true;
0662: if (c == 0x0CDE)
0663: return true;
0664: if (c < 0x0CE0)
0665: return false;
0666: if (c <= 0x0CE1)
0667: return true;
0668: if (c < 0x0D05)
0669: return false;
0670: if (c <= 0x0D0C)
0671: return true;
0672: if (c < 0x0D0E)
0673: return false;
0674: if (c <= 0x0D10)
0675: return true;
0676: if (c < 0x0D12)
0677: return false;
0678: if (c <= 0x0D28)
0679: return true;
0680: if (c < 0x0D2A)
0681: return false;
0682: if (c <= 0x0D39)
0683: return true;
0684: if (c < 0x0D60)
0685: return false;
0686: if (c <= 0x0D61)
0687: return true;
0688: if (c < 0x0E01)
0689: return false;
0690: if (c <= 0x0E2E)
0691: return true;
0692: if (c == 0x0E30)
0693: return true;
0694: if (c < 0x0E32)
0695: return false;
0696: if (c <= 0x0E33)
0697: return true;
0698: if (c < 0x0E40)
0699: return false;
0700: if (c <= 0x0E45)
0701: return true;
0702: if (c < 0x0E81)
0703: return false;
0704: if (c <= 0x0E82)
0705: return true;
0706: if (c == 0x0E84)
0707: return true;
0708: if (c < 0x0E87)
0709: return false;
0710: if (c <= 0x0E88)
0711: return true;
0712: if (c == 0x0E8A)
0713: return true;
0714: if (c == 0x0E8D)
0715: return true;
0716: if (c < 0x0E94)
0717: return false;
0718: if (c <= 0x0E97)
0719: return true;
0720: if (c < 0x0E99)
0721: return false;
0722: if (c <= 0x0E9F)
0723: return true;
0724: if (c < 0x0EA1)
0725: return false;
0726: if (c <= 0x0EA3)
0727: return true;
0728: if (c == 0x0EA5)
0729: return true;
0730: if (c == 0x0EA7)
0731: return true;
0732: if (c < 0x0EAA)
0733: return false;
0734: if (c <= 0x0EAB)
0735: return true;
0736: if (c < 0x0EAD)
0737: return false;
0738: if (c <= 0x0EAE)
0739: return true;
0740: if (c == 0x0EB0)
0741: return true;
0742: if (c < 0x0EB2)
0743: return false;
0744: if (c <= 0x0EB3)
0745: return true;
0746: if (c == 0x0EBD)
0747: return true;
0748: if (c < 0x0EC0)
0749: return false;
0750: if (c <= 0x0EC4)
0751: return true;
0752: if (c < 0x0F40)
0753: return false;
0754: if (c <= 0x0F47)
0755: return true;
0756: if (c < 0x0F49)
0757: return false;
0758: if (c <= 0x0F69)
0759: return true;
0760: if (c < 0x10A0)
0761: return false;
0762: if (c <= 0x10C5)
0763: return true;
0764: if (c < 0x10D0)
0765: return false;
0766: if (c <= 0x10F6)
0767: return true;
0768: if (c == 0x1100)
0769: return true;
0770: if (c < 0x1102)
0771: return false;
0772: if (c <= 0x1103)
0773: return true;
0774: if (c < 0x1105)
0775: return false;
0776: if (c <= 0x1107)
0777: return true;
0778: if (c == 0x1109)
0779: return true;
0780: if (c < 0x110B)
0781: return false;
0782: if (c <= 0x110C)
0783: return true;
0784: if (c < 0x110E)
0785: return false;
0786: if (c <= 0x1112)
0787: return true;
0788: if (c == 0x113C)
0789: return true;
0790: if (c == 0x113E)
0791: return true;
0792: if (c == 0x1140)
0793: return true;
0794: if (c == 0x114C)
0795: return true;
0796: if (c == 0x114E)
0797: return true;
0798: if (c == 0x1150)
0799: return true;
0800: if (c < 0x1154)
0801: return false;
0802: if (c <= 0x1155)
0803: return true;
0804: if (c == 0x1159)
0805: return true;
0806: if (c < 0x115F)
0807: return false;
0808: if (c <= 0x1161)
0809: return true;
0810: if (c == 0x1163)
0811: return true;
0812: if (c == 0x1165)
0813: return true;
0814: if (c == 0x1167)
0815: return true;
0816: if (c == 0x1169)
0817: return true;
0818: if (c < 0x116D)
0819: return false;
0820: if (c <= 0x116E)
0821: return true;
0822: if (c < 0x1172)
0823: return false;
0824: if (c <= 0x1173)
0825: return true;
0826: if (c == 0x1175)
0827: return true;
0828: if (c == 0x119E)
0829: return true;
0830: if (c == 0x11A8)
0831: return true;
0832: if (c == 0x11AB)
0833: return true;
0834: if (c < 0x11AE)
0835: return false;
0836: if (c <= 0x11AF)
0837: return true;
0838: if (c < 0x11B7)
0839: return false;
0840: if (c <= 0x11B8)
0841: return true;
0842: if (c == 0x11BA)
0843: return true;
0844: if (c < 0x11BC)
0845: return false;
0846: if (c <= 0x11C2)
0847: return true;
0848: if (c == 0x11EB)
0849: return true;
0850: if (c == 0x11F0)
0851: return true;
0852: if (c == 0x11F9)
0853: return true;
0854: if (c < 0x1E00)
0855: return false;
0856: if (c <= 0x1E9B)
0857: return true;
0858: if (c < 0x1EA0)
0859: return false;
0860: if (c <= 0x1EF9)
0861: return true;
0862: if (c < 0x1F00)
0863: return false;
0864: if (c <= 0x1F15)
0865: return true;
0866: if (c < 0x1F18)
0867: return false;
0868: if (c <= 0x1F1D)
0869: return true;
0870: if (c < 0x1F20)
0871: return false;
0872: if (c <= 0x1F45)
0873: return true;
0874: if (c < 0x1F48)
0875: return false;
0876: if (c <= 0x1F4D)
0877: return true;
0878: if (c < 0x1F50)
0879: return false;
0880: if (c <= 0x1F57)
0881: return true;
0882: if (c == 0x1F59)
0883: return true;
0884: if (c == 0x1F5B)
0885: return true;
0886: if (c == 0x1F5D)
0887: return true;
0888: if (c < 0x1F5F)
0889: return false;
0890: if (c <= 0x1F7D)
0891: return true;
0892: if (c < 0x1F80)
0893: return false;
0894: if (c <= 0x1FB4)
0895: return true;
0896: if (c < 0x1FB6)
0897: return false;
0898: if (c <= 0x1FBC)
0899: return true;
0900: if (c == 0x1FBE)
0901: return true;
0902: if (c < 0x1FC2)
0903: return false;
0904: if (c <= 0x1FC4)
0905: return true;
0906: if (c < 0x1FC6)
0907: return false;
0908: if (c <= 0x1FCC)
0909: return true;
0910: if (c < 0x1FD0)
0911: return false;
0912: if (c <= 0x1FD3)
0913: return true;
0914: if (c < 0x1FD6)
0915: return false;
0916: if (c <= 0x1FDB)
0917: return true;
0918: if (c < 0x1FE0)
0919: return false;
0920: if (c <= 0x1FEC)
0921: return true;
0922: if (c < 0x1FF2)
0923: return false;
0924: if (c <= 0x1FF4)
0925: return true;
0926: if (c < 0x1FF6)
0927: return false;
0928: if (c <= 0x1FFC)
0929: return true;
0930: if (c == 0x2126)
0931: return true;
0932: if (c < 0x212A)
0933: return false;
0934: if (c <= 0x212B)
0935: return true;
0936: if (c == 0x212E)
0937: return true;
0938: if (c < 0x2180)
0939: return false;
0940: if (c <= 0x2182)
0941: return true;
0942: if (c == 0x3007)
0943: return true; // ideographic
0944: if (c < 0x3021)
0945: return false;
0946: if (c <= 0x3029)
0947: return true; // ideo
0948: if (c < 0x3041)
0949: return false;
0950: if (c <= 0x3094)
0951: return true;
0952: if (c < 0x30A1)
0953: return false;
0954: if (c <= 0x30FA)
0955: return true;
0956: if (c < 0x3105)
0957: return false;
0958: if (c <= 0x312C)
0959: return true;
0960: if (c < 0x4E00)
0961: return false;
0962: if (c <= 0x9FA5)
0963: return true; // ideo
0964: if (c < 0xAC00)
0965: return false;
0966: if (c <= 0xD7A3)
0967: return true;
0968:
0969: return false;
0970: }
0971:
0972: /**
0973: * Checks whether a character is a combining character according to
0974: * production 87 of the XML 1.0 specification.
0975: */
0976: public static boolean isXMLCombiningChar(char c) {
0977: if (c < 0x0300)
0978: return false;
0979: if (c <= 0x0345)
0980: return true;
0981: if (c < 0x0360)
0982: return false;
0983: if (c <= 0x0361)
0984: return true;
0985: if (c < 0x0483)
0986: return false;
0987: if (c <= 0x0486)
0988: return true;
0989: if (c < 0x0591)
0990: return false;
0991: if (c <= 0x05A1)
0992: return true;
0993:
0994: if (c < 0x05A3)
0995: return false;
0996: if (c <= 0x05B9)
0997: return true;
0998: if (c < 0x05BB)
0999: return false;
1000: if (c <= 0x05BD)
1001: return true;
1002: if (c == 0x05BF)
1003: return true;
1004: if (c < 0x05C1)
1005: return false;
1006: if (c <= 0x05C2)
1007: return true;
1008:
1009: if (c == 0x05C4)
1010: return true;
1011: if (c < 0x064B)
1012: return false;
1013: if (c <= 0x0652)
1014: return true;
1015: if (c == 0x0670)
1016: return true;
1017: if (c < 0x06D6)
1018: return false;
1019: if (c <= 0x06DC)
1020: return true;
1021:
1022: if (c < 0x06DD)
1023: return false;
1024: if (c <= 0x06DF)
1025: return true;
1026: if (c < 0x06E0)
1027: return false;
1028: if (c <= 0x06E4)
1029: return true;
1030: if (c < 0x06E7)
1031: return false;
1032: if (c <= 0x06E8)
1033: return true;
1034:
1035: if (c < 0x06EA)
1036: return false;
1037: if (c <= 0x06ED)
1038: return true;
1039: if (c < 0x0901)
1040: return false;
1041: if (c <= 0x0903)
1042: return true;
1043: if (c == 0x093C)
1044: return true;
1045: if (c < 0x093E)
1046: return false;
1047: if (c <= 0x094C)
1048: return true;
1049:
1050: if (c == 0x094D)
1051: return true;
1052: if (c < 0x0951)
1053: return false;
1054: if (c <= 0x0954)
1055: return true;
1056: if (c < 0x0962)
1057: return false;
1058: if (c <= 0x0963)
1059: return true;
1060: if (c < 0x0981)
1061: return false;
1062: if (c <= 0x0983)
1063: return true;
1064:
1065: if (c == 0x09BC)
1066: return true;
1067: if (c == 0x09BE)
1068: return true;
1069: if (c == 0x09BF)
1070: return true;
1071: if (c < 0x09C0)
1072: return false;
1073: if (c <= 0x09C4)
1074: return true;
1075: if (c < 0x09C7)
1076: return false;
1077: if (c <= 0x09C8)
1078: return true;
1079:
1080: if (c < 0x09CB)
1081: return false;
1082: if (c <= 0x09CD)
1083: return true;
1084: if (c == 0x09D7)
1085: return true;
1086: if (c < 0x09E2)
1087: return false;
1088: if (c <= 0x09E3)
1089: return true;
1090: if (c == 0x0A02)
1091: return true;
1092: if (c == 0x0A3C)
1093: return true;
1094:
1095: if (c == 0x0A3E)
1096: return true;
1097: if (c == 0x0A3F)
1098: return true;
1099: if (c < 0x0A40)
1100: return false;
1101: if (c <= 0x0A42)
1102: return true;
1103: if (c < 0x0A47)
1104: return false;
1105: if (c <= 0x0A48)
1106: return true;
1107:
1108: if (c < 0x0A4B)
1109: return false;
1110: if (c <= 0x0A4D)
1111: return true;
1112: if (c < 0x0A70)
1113: return false;
1114: if (c <= 0x0A71)
1115: return true;
1116: if (c < 0x0A81)
1117: return false;
1118: if (c <= 0x0A83)
1119: return true;
1120: if (c == 0x0ABC)
1121: return true;
1122:
1123: if (c < 0x0ABE)
1124: return false;
1125: if (c <= 0x0AC5)
1126: return true;
1127: if (c < 0x0AC7)
1128: return false;
1129: if (c <= 0x0AC9)
1130: return true;
1131: if (c < 0x0ACB)
1132: return false;
1133: if (c <= 0x0ACD)
1134: return true;
1135:
1136: if (c < 0x0B01)
1137: return false;
1138: if (c <= 0x0B03)
1139: return true;
1140: if (c == 0x0B3C)
1141: return true;
1142: if (c < 0x0B3E)
1143: return false;
1144: if (c <= 0x0B43)
1145: return true;
1146: if (c < 0x0B47)
1147: return false;
1148: if (c <= 0x0B48)
1149: return true;
1150:
1151: if (c < 0x0B4B)
1152: return false;
1153: if (c <= 0x0B4D)
1154: return true;
1155: if (c < 0x0B56)
1156: return false;
1157: if (c <= 0x0B57)
1158: return true;
1159: if (c < 0x0B82)
1160: return false;
1161: if (c <= 0x0B83)
1162: return true;
1163:
1164: if (c < 0x0BBE)
1165: return false;
1166: if (c <= 0x0BC2)
1167: return true;
1168: if (c < 0x0BC6)
1169: return false;
1170: if (c <= 0x0BC8)
1171: return true;
1172: if (c < 0x0BCA)
1173: return false;
1174: if (c <= 0x0BCD)
1175: return true;
1176: if (c == 0x0BD7)
1177: return true;
1178:
1179: if (c < 0x0C01)
1180: return false;
1181: if (c <= 0x0C03)
1182: return true;
1183: if (c < 0x0C3E)
1184: return false;
1185: if (c <= 0x0C44)
1186: return true;
1187: if (c < 0x0C46)
1188: return false;
1189: if (c <= 0x0C48)
1190: return true;
1191:
1192: if (c < 0x0C4A)
1193: return false;
1194: if (c <= 0x0C4D)
1195: return true;
1196: if (c < 0x0C55)
1197: return false;
1198: if (c <= 0x0C56)
1199: return true;
1200: if (c < 0x0C82)
1201: return false;
1202: if (c <= 0x0C83)
1203: return true;
1204:
1205: if (c < 0x0CBE)
1206: return false;
1207: if (c <= 0x0CC4)
1208: return true;
1209: if (c < 0x0CC6)
1210: return false;
1211: if (c <= 0x0CC8)
1212: return true;
1213: if (c < 0x0CCA)
1214: return false;
1215: if (c <= 0x0CCD)
1216: return true;
1217:
1218: if (c < 0x0CD5)
1219: return false;
1220: if (c <= 0x0CD6)
1221: return true;
1222: if (c < 0x0D02)
1223: return false;
1224: if (c <= 0x0D03)
1225: return true;
1226: if (c < 0x0D3E)
1227: return false;
1228: if (c <= 0x0D43)
1229: return true;
1230:
1231: if (c < 0x0D46)
1232: return false;
1233: if (c <= 0x0D48)
1234: return true;
1235: if (c < 0x0D4A)
1236: return false;
1237: if (c <= 0x0D4D)
1238: return true;
1239: if (c == 0x0D57)
1240: return true;
1241: if (c == 0x0E31)
1242: return true;
1243:
1244: if (c < 0x0E34)
1245: return false;
1246: if (c <= 0x0E3A)
1247: return true;
1248: if (c < 0x0E47)
1249: return false;
1250: if (c <= 0x0E4E)
1251: return true;
1252: if (c == 0x0EB1)
1253: return true;
1254: if (c < 0x0EB4)
1255: return false;
1256: if (c <= 0x0EB9)
1257: return true;
1258:
1259: if (c < 0x0EBB)
1260: return false;
1261: if (c <= 0x0EBC)
1262: return true;
1263: if (c < 0x0EC8)
1264: return false;
1265: if (c <= 0x0ECD)
1266: return true;
1267: if (c < 0x0F18)
1268: return false;
1269: if (c <= 0x0F19)
1270: return true;
1271: if (c == 0x0F35)
1272: return true;
1273:
1274: if (c == 0x0F37)
1275: return true;
1276: if (c == 0x0F39)
1277: return true;
1278: if (c == 0x0F3E)
1279: return true;
1280: if (c == 0x0F3F)
1281: return true;
1282: if (c < 0x0F71)
1283: return false;
1284: if (c <= 0x0F84)
1285: return true;
1286:
1287: if (c < 0x0F86)
1288: return false;
1289: if (c <= 0x0F8B)
1290: return true;
1291: if (c < 0x0F90)
1292: return false;
1293: if (c <= 0x0F95)
1294: return true;
1295: if (c == 0x0F97)
1296: return true;
1297: if (c < 0x0F99)
1298: return false;
1299: if (c <= 0x0FAD)
1300: return true;
1301:
1302: if (c < 0x0FB1)
1303: return false;
1304: if (c <= 0x0FB7)
1305: return true;
1306: if (c == 0x0FB9)
1307: return true;
1308: if (c < 0x20D0)
1309: return false;
1310: if (c <= 0x20DC)
1311: return true;
1312: if (c == 0x20E1)
1313: return true;
1314:
1315: if (c < 0x302A)
1316: return false;
1317: if (c <= 0x302F)
1318: return true;
1319: if (c == 0x3099)
1320: return true;
1321: if (c == 0x309A)
1322: return true;
1323:
1324: return false;
1325: }
1326:
1327: /**
1328: * Checks whether a character is an extender according to
1329: * production 88 of the XML 1.0 specification.
1330: */
1331: public static boolean isXMLExtender(char c) {
1332: if (c < 0x00B6)
1333: return false; // quick short circuit
1334:
1335: // Extenders
1336: if (c == 0x00B7)
1337: return true;
1338: if (c == 0x02D0)
1339: return true;
1340: if (c == 0x02D1)
1341: return true;
1342: if (c == 0x0387)
1343: return true;
1344: if (c == 0x0640)
1345: return true;
1346: if (c == 0x0E46)
1347: return true;
1348: if (c == 0x0EC6)
1349: return true;
1350: if (c == 0x3005)
1351: return true;
1352:
1353: if (c < 0x3031)
1354: return false;
1355: if (c <= 0x3035)
1356: return true;
1357: if (c < 0x309D)
1358: return false;
1359: if (c <= 0x309E)
1360: return true;
1361: if (c < 0x30FC)
1362: return false;
1363: if (c <= 0x30FE)
1364: return true;
1365:
1366: return false;
1367: }
1368:
1369: /**
1370: * <p>
1371: * Checks whether a character is a digit according to
1372: * production 88 of the XML 1.0 specification.
1373: */
1374: public static boolean isXMLDigit(char c) {
1375: if (c < 0x0030)
1376: return false;
1377: if (c <= 0x0039)
1378: return true;
1379: if (c < 0x0660)
1380: return false;
1381: if (c <= 0x0669)
1382: return true;
1383: if (c < 0x06F0)
1384: return false;
1385: if (c <= 0x06F9)
1386: return true;
1387: if (c < 0x0966)
1388: return false;
1389: if (c <= 0x096F)
1390: return true;
1391:
1392: if (c < 0x09E6)
1393: return false;
1394: if (c <= 0x09EF)
1395: return true;
1396: if (c < 0x0A66)
1397: return false;
1398: if (c <= 0x0A6F)
1399: return true;
1400: if (c < 0x0AE6)
1401: return false;
1402: if (c <= 0x0AEF)
1403: return true;
1404:
1405: if (c < 0x0B66)
1406: return false;
1407: if (c <= 0x0B6F)
1408: return true;
1409: if (c < 0x0BE7)
1410: return false;
1411: if (c <= 0x0BEF)
1412: return true;
1413: if (c < 0x0C66)
1414: return false;
1415: if (c <= 0x0C6F)
1416: return true;
1417:
1418: if (c < 0x0CE6)
1419: return false;
1420: if (c <= 0x0CEF)
1421: return true;
1422: if (c < 0x0D66)
1423: return false;
1424: if (c <= 0x0D6F)
1425: return true;
1426: if (c < 0x0E50)
1427: return false;
1428: if (c <= 0x0E59)
1429: return true;
1430:
1431: if (c < 0x0ED0)
1432: return false;
1433: if (c <= 0x0ED9)
1434: return true;
1435: if (c < 0x0F20)
1436: return false;
1437: if (c <= 0x0F29)
1438: return true;
1439:
1440: return false;
1441: }
1442: }
|