/*
* #!
* Ontopia Engine
* #-
* Copyright (C) 2001 - 2013 The Ontopia Project
* #-
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* !#
*/
package net.ontopia.topicmaps.xml;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Collection;
import net.ontopia.infoset.core.LocatorIF;
import net.ontopia.topicmaps.core.ReifiableIF;
import net.ontopia.topicmaps.core.TMObjectIF;
import net.ontopia.topicmaps.core.TopicIF;
import net.ontopia.topicmaps.core.TopicMapIF;
import org.xml.sax.helpers.AttributesImpl;
import net.ontopia.utils.DeciderIF;
import net.ontopia.utils.CharacterSet;
/**
* INTERNAL: Abstract class providing common operations used by XML
* exporters.
*/
public abstract class AbstractTopicMapExporter {
protected static final String EMPTY_NAMESPACE = "";
protected static final String EMPTY_LOCALNAME = "";
protected DeciderIF filter;
/**
* PUBLIC: Sets the filter that decides which topic map constructs
* are accepted in the exported TM/XML. Uses 'filter' to identify
* individual topic constructs as allowed or disallowed. TM
* constructs that depend on the disallowed topics are also
* disallowed.
* @param filter Places constraints on individual topicmap constructs.
* @since 3.2
*/
public void setFilter(DeciderIF filter) {
// WARNING: Do NOT use the TMExporterDecider or any other kind of
// wrapper around the filter here. Filters should be used raw. If
// any client code wants a utility wrapper, let them set it up
// explicitly.
this.filter = filter;
}
/**
* Filter a whole collection of objects.
* @param unfiltered The objects to filter.
* @return A new collection containing all objects accepted by the filter, or
* if this.filter is null, returns the original collection.
*/
protected Collection filterCollection(Collection unfiltered) {
if (filter == null)
return unfiltered;
Collection retVal = new ArrayList();
Iterator unfilteredIt = unfiltered.iterator();
while (unfilteredIt.hasNext()) {
Object current = unfilteredIt.next();
if (filter.ok(current))
retVal.add(current);
}
return retVal;
}
/**
* INTERNAL: Filter a single object.
* @param unfiltered The object to filter.
* @return True if the object is accepted by the filter or the filter is null.
* False otherwise.
*/
protected boolean filterOk(Object unfiltered) {
if (filter == null)
return true;
return filter.ok(unfiltered);
}
/**
* INTERNAL: Whether or not IDs should be added to all elements.
*/
protected boolean add_ids = true;
protected void addId(AttributesImpl atts, TMObjectIF tmobject) {
String id = getElementId(tmobject);
if (id != null)
atts.addAttribute(EMPTY_NAMESPACE, EMPTY_LOCALNAME, "id", "ID", id);
}
/**
* INTERNAL: Method used to extract the XTM element id from a topic
* map object when a source locator relative to the topic map base
* address exists.
*
* <p>This method is critical because we want to preserve the
* connection between subject indicators used to reify local objects,
* and at the same time we wish to keep the symbolic IDs often used
* in XTM and LTM files.
*
* <p>When setting the IDs of elements we set the ID to "fragment"
* if the object has a source locator of the form "base#fragment",
* where base is the base address of the topic map store. If no such
* source locator is found, the ID becomes "id" + object ID.
*
* <p>See the getSubjectIndicatorRef method in XTMTopicMapExporter
* to see how subject indicators are exported. Synchronization of
* these two methods is vital.
*/
public String getElementId(TMObjectIF tmobject) {
if (tmobject instanceof ReifiableIF && ((ReifiableIF)tmobject).getReifier() != null)
return "reified-id" + ((ReifiableIF)tmobject).getReifier().getObjectId();
if (!(add_ids || (tmobject instanceof TopicIF)))
return null; // don't output an ID
String id = null;
TopicMapIF tm = tmobject.getTopicMap();
LocatorIF baseloc =
(tm == null ? null : tm.getStore().getBaseAddress());
if (baseloc != null) {
String base = baseloc.getAddress();
Iterator it = tmobject.getItemIdentifiers().iterator();
while (it.hasNext()) {
LocatorIF sloc = (LocatorIF) it.next();
if (sloc.getAddress().startsWith(base)) {
String addr = sloc.getAddress();
int pos = addr.indexOf('#');
if (pos != -1) {
id = addr.substring(pos + 1);
if (mayCollide(id) || !isValidXMLId(id))
// reject this ID if it may collide with object ID-based ones
id = null;
else
break;
}
}
}
}
if (id == null)
id = "id" + tmobject.getObjectId();
return id;
}
// --- Internal methods
/**
* INTERNAL: Used to find out whether this ID may collide with IDs
* produced from object IDs. See bug #654. Works for both id234234
* and idT234234.
*/
static public boolean mayCollide(String id) {
if (!(id.startsWith("id") && id.length() > 2))
return false;
int ix = 2;
if (id.charAt(ix) >= 'A' && id.charAt(ix) <= 'Z')
ix++; // we accept an uppercase character in this position
// the rest must be digits
for (; ix < id.length(); ix++)
if (id.charAt(ix) < '0' || id.charAt(ix) > '9')
return false;
return true;
}
/**
* INTERNAL: Used to test whether the ID is a syntactically valid
* XML ID.
*/
protected boolean isValidXMLId(String id) {
// [5] Name ::= (Letter | '_' | ':') (NameChar)*
// [84] Letter ::= BaseChar | Ideographic
// [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar |
// Extender
if (namestart == null)
buildSets();
if (id.length() < 1 || !namestart.contains(id.charAt(0)))
return false;
for (int ix = 1; ix < id.length(); ix++)
if (!namechar.contains(id.charAt(ix)))
return false;
return true;
}
static private CharacterSet namestart = null;
static private CharacterSet namechar = null;
private static void buildSets() {
// this Java code autogenerated by src/python/lmg/xml-names/mkcode.py
// DO NOT MODIFY HERE!
namestart = new CharacterSet();
namestart.addInterval((char) 0x003A, (char) 0x003A);
namestart.addInterval((char) 0x0041, (char) 0x005A);
namestart.addInterval((char) 0x005F, (char) 0x005F);
namestart.addInterval((char) 0x0061, (char) 0x007A);
namestart.addInterval((char) 0x00C0, (char) 0x00D6);
namestart.addInterval((char) 0x00D8, (char) 0x00F6);
namestart.addInterval((char) 0x00F8, (char) 0x00FF);
namestart.addInterval((char) 0x0100, (char) 0x0131);
namestart.addInterval((char) 0x0134, (char) 0x013E);
namestart.addInterval((char) 0x0141, (char) 0x0148);
namestart.addInterval((char) 0x014A, (char) 0x017E);
namestart.addInterval((char) 0x0180, (char) 0x01C3);
namestart.addInterval((char) 0x01CD, (char) 0x01F0);
namestart.addInterval((char) 0x01F4, (char) 0x01F5);
namestart.addInterval((char) 0x01FA, (char) 0x0217);
namestart.addInterval((char) 0x0250, (char) 0x02A8);
namestart.addInterval((char) 0x02BB, (char) 0x02C1);
namestart.addInterval((char) 0x0386, (char) 0x0386);
namestart.addInterval((char) 0x0388, (char) 0x038A);
namestart.addInterval((char) 0x038C, (char) 0x038C);
namestart.addInterval((char) 0x038E, (char) 0x03A1);
namestart.addInterval((char) 0x03A3, (char) 0x03CE);
namestart.addInterval((char) 0x03D0, (char) 0x03D6);
namestart.addInterval((char) 0x03DA, (char) 0x03DA);
namestart.addInterval((char) 0x03DC, (char) 0x03DC);
namestart.addInterval((char) 0x03DE, (char) 0x03DE);
namestart.addInterval((char) 0x03E0, (char) 0x03E0);
namestart.addInterval((char) 0x03E2, (char) 0x03F3);
namestart.addInterval((char) 0x0401, (char) 0x040C);
namestart.addInterval((char) 0x040E, (char) 0x044F);
namestart.addInterval((char) 0x0451, (char) 0x045C);
namestart.addInterval((char) 0x045E, (char) 0x0481);
namestart.addInterval((char) 0x0490, (char) 0x04C4);
namestart.addInterval((char) 0x04C7, (char) 0x04C8);
namestart.addInterval((char) 0x04CB, (char) 0x04CC);
namestart.addInterval((char) 0x04D0, (char) 0x04EB);
namestart.addInterval((char) 0x04EE, (char) 0x04F5);
namestart.addInterval((char) 0x04F8, (char) 0x04F9);
namestart.addInterval((char) 0x0531, (char) 0x0556);
namestart.addInterval((char) 0x0559, (char) 0x0559);
namestart.addInterval((char) 0x0561, (char) 0x0586);
namestart.addInterval((char) 0x05D0, (char) 0x05EA);
namestart.addInterval((char) 0x05F0, (char) 0x05F2);
namestart.addInterval((char) 0x0621, (char) 0x063A);
namestart.addInterval((char) 0x0641, (char) 0x064A);
namestart.addInterval((char) 0x0671, (char) 0x06B7);
namestart.addInterval((char) 0x06BA, (char) 0x06BE);
namestart.addInterval((char) 0x06C0, (char) 0x06CE);
namestart.addInterval((char) 0x06D0, (char) 0x06D3);
namestart.addInterval((char) 0x06D5, (char) 0x06D5);
namestart.addInterval((char) 0x06E5, (char) 0x06E6);
namestart.addInterval((char) 0x0905, (char) 0x0939);
namestart.addInterval((char) 0x093D, (char) 0x093D);
namestart.addInterval((char) 0x0958, (char) 0x0961);
namestart.addInterval((char) 0x0985, (char) 0x098C);
namestart.addInterval((char) 0x098F, (char) 0x0990);
namestart.addInterval((char) 0x0993, (char) 0x09A8);
namestart.addInterval((char) 0x09AA, (char) 0x09B0);
namestart.addInterval((char) 0x09B2, (char) 0x09B2);
namestart.addInterval((char) 0x09B6, (char) 0x09B9);
namestart.addInterval((char) 0x09DC, (char) 0x09DD);
namestart.addInterval((char) 0x09DF, (char) 0x09E1);
namestart.addInterval((char) 0x09F0, (char) 0x09F1);
namestart.addInterval((char) 0x0A05, (char) 0x0A0A);
namestart.addInterval((char) 0x0A0F, (char) 0x0A10);
namestart.addInterval((char) 0x0A13, (char) 0x0A28);
namestart.addInterval((char) 0x0A2A, (char) 0x0A30);
namestart.addInterval((char) 0x0A32, (char) 0x0A33);
namestart.addInterval((char) 0x0A35, (char) 0x0A36);
namestart.addInterval((char) 0x0A38, (char) 0x0A39);
namestart.addInterval((char) 0x0A59, (char) 0x0A5C);
namestart.addInterval((char) 0x0A5E, (char) 0x0A5E);
namestart.addInterval((char) 0x0A72, (char) 0x0A74);
namestart.addInterval((char) 0x0A85, (char) 0x0A8B);
namestart.addInterval((char) 0x0A8D, (char) 0x0A8D);
namestart.addInterval((char) 0x0A8F, (char) 0x0A91);
namestart.addInterval((char) 0x0A93, (char) 0x0AA8);
namestart.addInterval((char) 0x0AAA, (char) 0x0AB0);
namestart.addInterval((char) 0x0AB2, (char) 0x0AB3);
namestart.addInterval((char) 0x0AB5, (char) 0x0AB9);
namestart.addInterval((char) 0x0ABD, (char) 0x0ABD);
namestart.addInterval((char) 0x0AE0, (char) 0x0AE0);
namestart.addInterval((char) 0x0B05, (char) 0x0B0C);
namestart.addInterval((char) 0x0B0F, (char) 0x0B10);
namestart.addInterval((char) 0x0B13, (char) 0x0B28);
namestart.addInterval((char) 0x0B2A, (char) 0x0B30);
namestart.addInterval((char) 0x0B32, (char) 0x0B33);
namestart.addInterval((char) 0x0B36, (char) 0x0B39);
namestart.addInterval((char) 0x0B3D, (char) 0x0B3D);
namestart.addInterval((char) 0x0B5C, (char) 0x0B5D);
namestart.addInterval((char) 0x0B5F, (char) 0x0B61);
namestart.addInterval((char) 0x0B85, (char) 0x0B8A);
namestart.addInterval((char) 0x0B8E, (char) 0x0B90);
namestart.addInterval((char) 0x0B92, (char) 0x0B95);
namestart.addInterval((char) 0x0B99, (char) 0x0B9A);
namestart.addInterval((char) 0x0B9C, (char) 0x0B9C);
namestart.addInterval((char) 0x0B9E, (char) 0x0B9F);
namestart.addInterval((char) 0x0BA3, (char) 0x0BA4);
namestart.addInterval((char) 0x0BA8, (char) 0x0BAA);
namestart.addInterval((char) 0x0BAE, (char) 0x0BB5);
namestart.addInterval((char) 0x0BB7, (char) 0x0BB9);
namestart.addInterval((char) 0x0C05, (char) 0x0C0C);
namestart.addInterval((char) 0x0C0E, (char) 0x0C10);
namestart.addInterval((char) 0x0C12, (char) 0x0C28);
namestart.addInterval((char) 0x0C2A, (char) 0x0C33);
namestart.addInterval((char) 0x0C35, (char) 0x0C39);
namestart.addInterval((char) 0x0C60, (char) 0x0C61);
namestart.addInterval((char) 0x0C85, (char) 0x0C8C);
namestart.addInterval((char) 0x0C8E, (char) 0x0C90);
namestart.addInterval((char) 0x0C92, (char) 0x0CA8);
namestart.addInterval((char) 0x0CAA, (char) 0x0CB3);
namestart.addInterval((char) 0x0CB5, (char) 0x0CB9);
namestart.addInterval((char) 0x0CDE, (char) 0x0CDE);
namestart.addInterval((char) 0x0CE0, (char) 0x0CE1);
namestart.addInterval((char) 0x0D05, (char) 0x0D0C);
namestart.addInterval((char) 0x0D0E, (char) 0x0D10);
namestart.addInterval((char) 0x0D12, (char) 0x0D28);
namestart.addInterval((char) 0x0D2A, (char) 0x0D39);
namestart.addInterval((char) 0x0D60, (char) 0x0D61);
namestart.addInterval((char) 0x0E01, (char) 0x0E2E);
namestart.addInterval((char) 0x0E30, (char) 0x0E30);
namestart.addInterval((char) 0x0E32, (char) 0x0E33);
namestart.addInterval((char) 0x0E40, (char) 0x0E45);
namestart.addInterval((char) 0x0E81, (char) 0x0E82);
namestart.addInterval((char) 0x0E84, (char) 0x0E84);
namestart.addInterval((char) 0x0E87, (char) 0x0E88);
namestart.addInterval((char) 0x0E8A, (char) 0x0E8A);
namestart.addInterval((char) 0x0E8D, (char) 0x0E8D);
namestart.addInterval((char) 0x0E94, (char) 0x0E97);
namestart.addInterval((char) 0x0E99, (char) 0x0E9F);
namestart.addInterval((char) 0x0EA1, (char) 0x0EA3);
namestart.addInterval((char) 0x0EA5, (char) 0x0EA5);
namestart.addInterval((char) 0x0EA7, (char) 0x0EA7);
namestart.addInterval((char) 0x0EAA, (char) 0x0EAB);
namestart.addInterval((char) 0x0EAD, (char) 0x0EAE);
namestart.addInterval((char) 0x0EB0, (char) 0x0EB0);
namestart.addInterval((char) 0x0EB2, (char) 0x0EB3);
namestart.addInterval((char) 0x0EBD, (char) 0x0EBD);
namestart.addInterval((char) 0x0EC0, (char) 0x0EC4);
namestart.addInterval((char) 0x0F40, (char) 0x0F47);
namestart.addInterval((char) 0x0F49, (char) 0x0F69);
namestart.addInterval((char) 0x10A0, (char) 0x10C5);
namestart.addInterval((char) 0x10D0, (char) 0x10F6);
namestart.addInterval((char) 0x1100, (char) 0x1100);
namestart.addInterval((char) 0x1102, (char) 0x1103);
namestart.addInterval((char) 0x1105, (char) 0x1107);
namestart.addInterval((char) 0x1109, (char) 0x1109);
namestart.addInterval((char) 0x110B, (char) 0x110C);
namestart.addInterval((char) 0x110E, (char) 0x1112);
namestart.addInterval((char) 0x113C, (char) 0x113C);
namestart.addInterval((char) 0x113E, (char) 0x113E);
namestart.addInterval((char) 0x1140, (char) 0x1140);
namestart.addInterval((char) 0x114C, (char) 0x114C);
namestart.addInterval((char) 0x114E, (char) 0x114E);
namestart.addInterval((char) 0x1150, (char) 0x1150);
namestart.addInterval((char) 0x1154, (char) 0x1155);
namestart.addInterval((char) 0x1159, (char) 0x1159);
namestart.addInterval((char) 0x115F, (char) 0x1161);
namestart.addInterval((char) 0x1163, (char) 0x1163);
namestart.addInterval((char) 0x1165, (char) 0x1165);
namestart.addInterval((char) 0x1167, (char) 0x1167);
namestart.addInterval((char) 0x1169, (char) 0x1169);
namestart.addInterval((char) 0x116D, (char) 0x116E);
namestart.addInterval((char) 0x1172, (char) 0x1173);
namestart.addInterval((char) 0x1175, (char) 0x1175);
namestart.addInterval((char) 0x119E, (char) 0x119E);
namestart.addInterval((char) 0x11A8, (char) 0x11A8);
namestart.addInterval((char) 0x11AB, (char) 0x11AB);
namestart.addInterval((char) 0x11AE, (char) 0x11AF);
namestart.addInterval((char) 0x11B7, (char) 0x11B8);
namestart.addInterval((char) 0x11BA, (char) 0x11BA);
namestart.addInterval((char) 0x11BC, (char) 0x11C2);
namestart.addInterval((char) 0x11EB, (char) 0x11EB);
namestart.addInterval((char) 0x11F0, (char) 0x11F0);
namestart.addInterval((char) 0x11F9, (char) 0x11F9);
namestart.addInterval((char) 0x1E00, (char) 0x1E9B);
namestart.addInterval((char) 0x1EA0, (char) 0x1EF9);
namestart.addInterval((char) 0x1F00, (char) 0x1F15);
namestart.addInterval((char) 0x1F18, (char) 0x1F1D);
namestart.addInterval((char) 0x1F20, (char) 0x1F45);
namestart.addInterval((char) 0x1F48, (char) 0x1F4D);
namestart.addInterval((char) 0x1F50, (char) 0x1F57);
namestart.addInterval((char) 0x1F59, (char) 0x1F59);
namestart.addInterval((char) 0x1F5B, (char) 0x1F5B);
namestart.addInterval((char) 0x1F5D, (char) 0x1F5D);
namestart.addInterval((char) 0x1F5F, (char) 0x1F7D);
namestart.addInterval((char) 0x1F80, (char) 0x1FB4);
namestart.addInterval((char) 0x1FB6, (char) 0x1FBC);
namestart.addInterval((char) 0x1FBE, (char) 0x1FBE);
namestart.addInterval((char) 0x1FC2, (char) 0x1FC4);
namestart.addInterval((char) 0x1FC6, (char) 0x1FCC);
namestart.addInterval((char) 0x1FD0, (char) 0x1FD3);
namestart.addInterval((char) 0x1FD6, (char) 0x1FDB);
namestart.addInterval((char) 0x1FE0, (char) 0x1FEC);
namestart.addInterval((char) 0x1FF2, (char) 0x1FF4);
namestart.addInterval((char) 0x1FF6, (char) 0x1FFC);
namestart.addInterval((char) 0x2126, (char) 0x2126);
namestart.addInterval((char) 0x212A, (char) 0x212B);
namestart.addInterval((char) 0x212E, (char) 0x212E);
namestart.addInterval((char) 0x2180, (char) 0x2182);
namestart.addInterval((char) 0x3007, (char) 0x3007);
namestart.addInterval((char) 0x3021, (char) 0x3029);
namestart.addInterval((char) 0x3041, (char) 0x3094);
namestart.addInterval((char) 0x30A1, (char) 0x30FA);
namestart.addInterval((char) 0x3105, (char) 0x312C);
namestart.addInterval((char) 0x4E00, (char) 0x9FA5);
namestart.addInterval((char) 0xAC00, (char) 0xD7A3);
namestart.close();
namechar = new CharacterSet();
namechar.addInterval((char) 0x002D, (char) 0x002E);
namechar.addInterval((char) 0x0030, (char) 0x0039);
namechar.addInterval((char) 0x003A, (char) 0x003A);
namechar.addInterval((char) 0x0041, (char) 0x005A);
namechar.addInterval((char) 0x005F, (char) 0x005F);
namechar.addInterval((char) 0x0061, (char) 0x007A);
namechar.addInterval((char) 0x00B7, (char) 0x00B7);
namechar.addInterval((char) 0x00C0, (char) 0x00D6);
namechar.addInterval((char) 0x00D8, (char) 0x00F6);
namechar.addInterval((char) 0x00F8, (char) 0x00FF);
namechar.addInterval((char) 0x0100, (char) 0x0131);
namechar.addInterval((char) 0x0134, (char) 0x013E);
namechar.addInterval((char) 0x0141, (char) 0x0148);
namechar.addInterval((char) 0x014A, (char) 0x017E);
namechar.addInterval((char) 0x0180, (char) 0x01C3);
namechar.addInterval((char) 0x01CD, (char) 0x01F0);
namechar.addInterval((char) 0x01F4, (char) 0x01F5);
namechar.addInterval((char) 0x01FA, (char) 0x0217);
namechar.addInterval((char) 0x0250, (char) 0x02A8);
namechar.addInterval((char) 0x02BB, (char) 0x02C1);
namechar.addInterval((char) 0x02D0, (char) 0x02D0);
namechar.addInterval((char) 0x02D1, (char) 0x02D1);
namechar.addInterval((char) 0x0300, (char) 0x0345);
namechar.addInterval((char) 0x0360, (char) 0x0361);
namechar.addInterval((char) 0x0386, (char) 0x0386);
namechar.addInterval((char) 0x0387, (char) 0x0387);
namechar.addInterval((char) 0x0388, (char) 0x038A);
namechar.addInterval((char) 0x038C, (char) 0x038C);
namechar.addInterval((char) 0x038E, (char) 0x03A1);
namechar.addInterval((char) 0x03A3, (char) 0x03CE);
namechar.addInterval((char) 0x03D0, (char) 0x03D6);
namechar.addInterval((char) 0x03DA, (char) 0x03DA);
namechar.addInterval((char) 0x03DC, (char) 0x03DC);
namechar.addInterval((char) 0x03DE, (char) 0x03DE);
namechar.addInterval((char) 0x03E0, (char) 0x03E0);
namechar.addInterval((char) 0x03E2, (char) 0x03F3);
namechar.addInterval((char) 0x0401, (char) 0x040C);
namechar.addInterval((char) 0x040E, (char) 0x044F);
namechar.addInterval((char) 0x0451, (char) 0x045C);
namechar.addInterval((char) 0x045E, (char) 0x0481);
namechar.addInterval((char) 0x0483, (char) 0x0486);
namechar.addInterval((char) 0x0490, (char) 0x04C4);
namechar.addInterval((char) 0x04C7, (char) 0x04C8);
namechar.addInterval((char) 0x04CB, (char) 0x04CC);
namechar.addInterval((char) 0x04D0, (char) 0x04EB);
namechar.addInterval((char) 0x04EE, (char) 0x04F5);
namechar.addInterval((char) 0x04F8, (char) 0x04F9);
namechar.addInterval((char) 0x0531, (char) 0x0556);
namechar.addInterval((char) 0x0559, (char) 0x0559);
namechar.addInterval((char) 0x0561, (char) 0x0586);
namechar.addInterval((char) 0x0591, (char) 0x05A1);
namechar.addInterval((char) 0x05A3, (char) 0x05B9);
namechar.addInterval((char) 0x05BB, (char) 0x05BD);
namechar.addInterval((char) 0x05BF, (char) 0x05BF);
namechar.addInterval((char) 0x05C1, (char) 0x05C2);
namechar.addInterval((char) 0x05C4, (char) 0x05C4);
namechar.addInterval((char) 0x05D0, (char) 0x05EA);
namechar.addInterval((char) 0x05F0, (char) 0x05F2);
namechar.addInterval((char) 0x0621, (char) 0x063A);
namechar.addInterval((char) 0x0640, (char) 0x0640);
namechar.addInterval((char) 0x0641, (char) 0x064A);
namechar.addInterval((char) 0x064B, (char) 0x0652);
namechar.addInterval((char) 0x0660, (char) 0x0669);
namechar.addInterval((char) 0x0670, (char) 0x0670);
namechar.addInterval((char) 0x0671, (char) 0x06B7);
namechar.addInterval((char) 0x06BA, (char) 0x06BE);
namechar.addInterval((char) 0x06C0, (char) 0x06CE);
namechar.addInterval((char) 0x06D0, (char) 0x06D3);
namechar.addInterval((char) 0x06D5, (char) 0x06D5);
namechar.addInterval((char) 0x06D6, (char) 0x06DC);
namechar.addInterval((char) 0x06DD, (char) 0x06DF);
namechar.addInterval((char) 0x06E0, (char) 0x06E4);
namechar.addInterval((char) 0x06E5, (char) 0x06E6);
namechar.addInterval((char) 0x06E7, (char) 0x06E8);
namechar.addInterval((char) 0x06EA, (char) 0x06ED);
namechar.addInterval((char) 0x06F0, (char) 0x06F9);
namechar.addInterval((char) 0x0901, (char) 0x0903);
namechar.addInterval((char) 0x0905, (char) 0x0939);
namechar.addInterval((char) 0x093C, (char) 0x093C);
namechar.addInterval((char) 0x093D, (char) 0x093D);
namechar.addInterval((char) 0x093E, (char) 0x094C);
namechar.addInterval((char) 0x094D, (char) 0x094D);
namechar.addInterval((char) 0x0951, (char) 0x0954);
namechar.addInterval((char) 0x0958, (char) 0x0961);
namechar.addInterval((char) 0x0962, (char) 0x0963);
namechar.addInterval((char) 0x0966, (char) 0x096F);
namechar.addInterval((char) 0x0981, (char) 0x0983);
namechar.addInterval((char) 0x0985, (char) 0x098C);
namechar.addInterval((char) 0x098F, (char) 0x0990);
namechar.addInterval((char) 0x0993, (char) 0x09A8);
namechar.addInterval((char) 0x09AA, (char) 0x09B0);
namechar.addInterval((char) 0x09B2, (char) 0x09B2);
namechar.addInterval((char) 0x09B6, (char) 0x09B9);
namechar.addInterval((char) 0x09BC, (char) 0x09BC);
namechar.addInterval((char) 0x09BE, (char) 0x09BE);
namechar.addInterval((char) 0x09BF, (char) 0x09BF);
namechar.addInterval((char) 0x09C0, (char) 0x09C4);
namechar.addInterval((char) 0x09C7, (char) 0x09C8);
namechar.addInterval((char) 0x09CB, (char) 0x09CD);
namechar.addInterval((char) 0x09D7, (char) 0x09D7);
namechar.addInterval((char) 0x09DC, (char) 0x09DD);
namechar.addInterval((char) 0x09DF, (char) 0x09E1);
namechar.addInterval((char) 0x09E2, (char) 0x09E3);
namechar.addInterval((char) 0x09E6, (char) 0x09EF);
namechar.addInterval((char) 0x09F0, (char) 0x09F1);
namechar.addInterval((char) 0x0A02, (char) 0x0A02);
namechar.addInterval((char) 0x0A05, (char) 0x0A0A);
namechar.addInterval((char) 0x0A0F, (char) 0x0A10);
namechar.addInterval((char) 0x0A13, (char) 0x0A28);
namechar.addInterval((char) 0x0A2A, (char) 0x0A30);
namechar.addInterval((char) 0x0A32, (char) 0x0A33);
namechar.addInterval((char) 0x0A35, (char) 0x0A36);
namechar.addInterval((char) 0x0A38, (char) 0x0A39);
namechar.addInterval((char) 0x0A3C, (char) 0x0A3C);
namechar.addInterval((char) 0x0A3E, (char) 0x0A3E);
namechar.addInterval((char) 0x0A3F, (char) 0x0A3F);
namechar.addInterval((char) 0x0A40, (char) 0x0A42);
namechar.addInterval((char) 0x0A47, (char) 0x0A48);
namechar.addInterval((char) 0x0A4B, (char) 0x0A4D);
namechar.addInterval((char) 0x0A59, (char) 0x0A5C);
namechar.addInterval((char) 0x0A5E, (char) 0x0A5E);
namechar.addInterval((char) 0x0A66, (char) 0x0A6F);
namechar.addInterval((char) 0x0A70, (char) 0x0A71);
namechar.addInterval((char) 0x0A72, (char) 0x0A74);
namechar.addInterval((char) 0x0A81, (char) 0x0A83);
namechar.addInterval((char) 0x0A85, (char) 0x0A8B);
namechar.addInterval((char) 0x0A8D, (char) 0x0A8D);
namechar.addInterval((char) 0x0A8F, (char) 0x0A91);
namechar.addInterval((char) 0x0A93, (char) 0x0AA8);
namechar.addInterval((char) 0x0AAA, (char) 0x0AB0);
namechar.addInterval((char) 0x0AB2, (char) 0x0AB3);
namechar.addInterval((char) 0x0AB5, (char) 0x0AB9);
namechar.addInterval((char) 0x0ABC, (char) 0x0ABC);
namechar.addInterval((char) 0x0ABD, (char) 0x0ABD);
namechar.addInterval((char) 0x0ABE, (char) 0x0AC5);
namechar.addInterval((char) 0x0AC7, (char) 0x0AC9);
namechar.addInterval((char) 0x0ACB, (char) 0x0ACD);
namechar.addInterval((char) 0x0AE0, (char) 0x0AE0);
namechar.addInterval((char) 0x0AE6, (char) 0x0AEF);
namechar.addInterval((char) 0x0B01, (char) 0x0B03);
namechar.addInterval((char) 0x0B05, (char) 0x0B0C);
namechar.addInterval((char) 0x0B0F, (char) 0x0B10);
namechar.addInterval((char) 0x0B13, (char) 0x0B28);
namechar.addInterval((char) 0x0B2A, (char) 0x0B30);
namechar.addInterval((char) 0x0B32, (char) 0x0B33);
namechar.addInterval((char) 0x0B36, (char) 0x0B39);
namechar.addInterval((char) 0x0B3C, (char) 0x0B3C);
namechar.addInterval((char) 0x0B3D, (char) 0x0B3D);
namechar.addInterval((char) 0x0B3E, (char) 0x0B43);
namechar.addInterval((char) 0x0B47, (char) 0x0B48);
namechar.addInterval((char) 0x0B4B, (char) 0x0B4D);
namechar.addInterval((char) 0x0B56, (char) 0x0B57);
namechar.addInterval((char) 0x0B5C, (char) 0x0B5D);
namechar.addInterval((char) 0x0B5F, (char) 0x0B61);
namechar.addInterval((char) 0x0B66, (char) 0x0B6F);
namechar.addInterval((char) 0x0B82, (char) 0x0B83);
namechar.addInterval((char) 0x0B85, (char) 0x0B8A);
namechar.addInterval((char) 0x0B8E, (char) 0x0B90);
namechar.addInterval((char) 0x0B92, (char) 0x0B95);
namechar.addInterval((char) 0x0B99, (char) 0x0B9A);
namechar.addInterval((char) 0x0B9C, (char) 0x0B9C);
namechar.addInterval((char) 0x0B9E, (char) 0x0B9F);
namechar.addInterval((char) 0x0BA3, (char) 0x0BA4);
namechar.addInterval((char) 0x0BA8, (char) 0x0BAA);
namechar.addInterval((char) 0x0BAE, (char) 0x0BB5);
namechar.addInterval((char) 0x0BB7, (char) 0x0BB9);
namechar.addInterval((char) 0x0BBE, (char) 0x0BC2);
namechar.addInterval((char) 0x0BC6, (char) 0x0BC8);
namechar.addInterval((char) 0x0BCA, (char) 0x0BCD);
namechar.addInterval((char) 0x0BD7, (char) 0x0BD7);
namechar.addInterval((char) 0x0BE7, (char) 0x0BEF);
namechar.addInterval((char) 0x0C01, (char) 0x0C03);
namechar.addInterval((char) 0x0C05, (char) 0x0C0C);
namechar.addInterval((char) 0x0C0E, (char) 0x0C10);
namechar.addInterval((char) 0x0C12, (char) 0x0C28);
namechar.addInterval((char) 0x0C2A, (char) 0x0C33);
namechar.addInterval((char) 0x0C35, (char) 0x0C39);
namechar.addInterval((char) 0x0C3E, (char) 0x0C44);
namechar.addInterval((char) 0x0C46, (char) 0x0C48);
namechar.addInterval((char) 0x0C4A, (char) 0x0C4D);
namechar.addInterval((char) 0x0C55, (char) 0x0C56);
namechar.addInterval((char) 0x0C60, (char) 0x0C61);
namechar.addInterval((char) 0x0C66, (char) 0x0C6F);
namechar.addInterval((char) 0x0C82, (char) 0x0C83);
namechar.addInterval((char) 0x0C85, (char) 0x0C8C);
namechar.addInterval((char) 0x0C8E, (char) 0x0C90);
namechar.addInterval((char) 0x0C92, (char) 0x0CA8);
namechar.addInterval((char) 0x0CAA, (char) 0x0CB3);
namechar.addInterval((char) 0x0CB5, (char) 0x0CB9);
namechar.addInterval((char) 0x0CBE, (char) 0x0CC4);
namechar.addInterval((char) 0x0CC6, (char) 0x0CC8);
namechar.addInterval((char) 0x0CCA, (char) 0x0CCD);
namechar.addInterval((char) 0x0CD5, (char) 0x0CD6);
namechar.addInterval((char) 0x0CDE, (char) 0x0CDE);
namechar.addInterval((char) 0x0CE0, (char) 0x0CE1);
namechar.addInterval((char) 0x0CE6, (char) 0x0CEF);
namechar.addInterval((char) 0x0D02, (char) 0x0D03);
namechar.addInterval((char) 0x0D05, (char) 0x0D0C);
namechar.addInterval((char) 0x0D0E, (char) 0x0D10);
namechar.addInterval((char) 0x0D12, (char) 0x0D28);
namechar.addInterval((char) 0x0D2A, (char) 0x0D39);
namechar.addInterval((char) 0x0D3E, (char) 0x0D43);
namechar.addInterval((char) 0x0D46, (char) 0x0D48);
namechar.addInterval((char) 0x0D4A, (char) 0x0D4D);
namechar.addInterval((char) 0x0D57, (char) 0x0D57);
namechar.addInterval((char) 0x0D60, (char) 0x0D61);
namechar.addInterval((char) 0x0D66, (char) 0x0D6F);
namechar.addInterval((char) 0x0E01, (char) 0x0E2E);
namechar.addInterval((char) 0x0E30, (char) 0x0E30);
namechar.addInterval((char) 0x0E31, (char) 0x0E31);
namechar.addInterval((char) 0x0E32, (char) 0x0E33);
namechar.addInterval((char) 0x0E34, (char) 0x0E3A);
namechar.addInterval((char) 0x0E40, (char) 0x0E45);
namechar.addInterval((char) 0x0E46, (char) 0x0E46);
namechar.addInterval((char) 0x0E47, (char) 0x0E4E);
namechar.addInterval((char) 0x0E50, (char) 0x0E59);
namechar.addInterval((char) 0x0E81, (char) 0x0E82);
namechar.addInterval((char) 0x0E84, (char) 0x0E84);
namechar.addInterval((char) 0x0E87, (char) 0x0E88);
namechar.addInterval((char) 0x0E8A, (char) 0x0E8A);
namechar.addInterval((char) 0x0E8D, (char) 0x0E8D);
namechar.addInterval((char) 0x0E94, (char) 0x0E97);
namechar.addInterval((char) 0x0E99, (char) 0x0E9F);
namechar.addInterval((char) 0x0EA1, (char) 0x0EA3);
namechar.addInterval((char) 0x0EA5, (char) 0x0EA5);
namechar.addInterval((char) 0x0EA7, (char) 0x0EA7);
namechar.addInterval((char) 0x0EAA, (char) 0x0EAB);
namechar.addInterval((char) 0x0EAD, (char) 0x0EAE);
namechar.addInterval((char) 0x0EB0, (char) 0x0EB0);
namechar.addInterval((char) 0x0EB1, (char) 0x0EB1);
namechar.addInterval((char) 0x0EB2, (char) 0x0EB3);
namechar.addInterval((char) 0x0EB4, (char) 0x0EB9);
namechar.addInterval((char) 0x0EBB, (char) 0x0EBC);
namechar.addInterval((char) 0x0EBD, (char) 0x0EBD);
namechar.addInterval((char) 0x0EC0, (char) 0x0EC4);
namechar.addInterval((char) 0x0EC6, (char) 0x0EC6);
namechar.addInterval((char) 0x0EC8, (char) 0x0ECD);
namechar.addInterval((char) 0x0ED0, (char) 0x0ED9);
namechar.addInterval((char) 0x0F18, (char) 0x0F19);
namechar.addInterval((char) 0x0F20, (char) 0x0F29);
namechar.addInterval((char) 0x0F35, (char) 0x0F35);
namechar.addInterval((char) 0x0F37, (char) 0x0F37);
namechar.addInterval((char) 0x0F39, (char) 0x0F39);
namechar.addInterval((char) 0x0F3E, (char) 0x0F3E);
namechar.addInterval((char) 0x0F3F, (char) 0x0F3F);
namechar.addInterval((char) 0x0F40, (char) 0x0F47);
namechar.addInterval((char) 0x0F49, (char) 0x0F69);
namechar.addInterval((char) 0x0F71, (char) 0x0F84);
namechar.addInterval((char) 0x0F86, (char) 0x0F8B);
namechar.addInterval((char) 0x0F90, (char) 0x0F95);
namechar.addInterval((char) 0x0F97, (char) 0x0F97);
namechar.addInterval((char) 0x0F99, (char) 0x0FAD);
namechar.addInterval((char) 0x0FB1, (char) 0x0FB7);
namechar.addInterval((char) 0x0FB9, (char) 0x0FB9);
namechar.addInterval((char) 0x10A0, (char) 0x10C5);
namechar.addInterval((char) 0x10D0, (char) 0x10F6);
namechar.addInterval((char) 0x1100, (char) 0x1100);
namechar.addInterval((char) 0x1102, (char) 0x1103);
namechar.addInterval((char) 0x1105, (char) 0x1107);
namechar.addInterval((char) 0x1109, (char) 0x1109);
namechar.addInterval((char) 0x110B, (char) 0x110C);
namechar.addInterval((char) 0x110E, (char) 0x1112);
namechar.addInterval((char) 0x113C, (char) 0x113C);
namechar.addInterval((char) 0x113E, (char) 0x113E);
namechar.addInterval((char) 0x1140, (char) 0x1140);
namechar.addInterval((char) 0x114C, (char) 0x114C);
namechar.addInterval((char) 0x114E, (char) 0x114E);
namechar.addInterval((char) 0x1150, (char) 0x1150);
namechar.addInterval((char) 0x1154, (char) 0x1155);
namechar.addInterval((char) 0x1159, (char) 0x1159);
namechar.addInterval((char) 0x115F, (char) 0x1161);
namechar.addInterval((char) 0x1163, (char) 0x1163);
namechar.addInterval((char) 0x1165, (char) 0x1165);
namechar.addInterval((char) 0x1167, (char) 0x1167);
namechar.addInterval((char) 0x1169, (char) 0x1169);
namechar.addInterval((char) 0x116D, (char) 0x116E);
namechar.addInterval((char) 0x1172, (char) 0x1173);
namechar.addInterval((char) 0x1175, (char) 0x1175);
namechar.addInterval((char) 0x119E, (char) 0x119E);
namechar.addInterval((char) 0x11A8, (char) 0x11A8);
namechar.addInterval((char) 0x11AB, (char) 0x11AB);
namechar.addInterval((char) 0x11AE, (char) 0x11AF);
namechar.addInterval((char) 0x11B7, (char) 0x11B8);
namechar.addInterval((char) 0x11BA, (char) 0x11BA);
namechar.addInterval((char) 0x11BC, (char) 0x11C2);
namechar.addInterval((char) 0x11EB, (char) 0x11EB);
namechar.addInterval((char) 0x11F0, (char) 0x11F0);
namechar.addInterval((char) 0x11F9, (char) 0x11F9);
namechar.addInterval((char) 0x1E00, (char) 0x1E9B);
namechar.addInterval((char) 0x1EA0, (char) 0x1EF9);
namechar.addInterval((char) 0x1F00, (char) 0x1F15);
namechar.addInterval((char) 0x1F18, (char) 0x1F1D);
namechar.addInterval((char) 0x1F20, (char) 0x1F45);
namechar.addInterval((char) 0x1F48, (char) 0x1F4D);
namechar.addInterval((char) 0x1F50, (char) 0x1F57);
namechar.addInterval((char) 0x1F59, (char) 0x1F59);
namechar.addInterval((char) 0x1F5B, (char) 0x1F5B);
namechar.addInterval((char) 0x1F5D, (char) 0x1F5D);
namechar.addInterval((char) 0x1F5F, (char) 0x1F7D);
namechar.addInterval((char) 0x1F80, (char) 0x1FB4);
namechar.addInterval((char) 0x1FB6, (char) 0x1FBC);
namechar.addInterval((char) 0x1FBE, (char) 0x1FBE);
namechar.addInterval((char) 0x1FC2, (char) 0x1FC4);
namechar.addInterval((char) 0x1FC6, (char) 0x1FCC);
namechar.addInterval((char) 0x1FD0, (char) 0x1FD3);
namechar.addInterval((char) 0x1FD6, (char) 0x1FDB);
namechar.addInterval((char) 0x1FE0, (char) 0x1FEC);
namechar.addInterval((char) 0x1FF2, (char) 0x1FF4);
namechar.addInterval((char) 0x1FF6, (char) 0x1FFC);
namechar.addInterval((char) 0x20D0, (char) 0x20DC);
namechar.addInterval((char) 0x20E1, (char) 0x20E1);
namechar.addInterval((char) 0x2126, (char) 0x2126);
namechar.addInterval((char) 0x212A, (char) 0x212B);
namechar.addInterval((char) 0x212E, (char) 0x212E);
namechar.addInterval((char) 0x2180, (char) 0x2182);
namechar.addInterval((char) 0x3005, (char) 0x3005);
namechar.addInterval((char) 0x3007, (char) 0x3007);
namechar.addInterval((char) 0x3021, (char) 0x3029);
namechar.addInterval((char) 0x302A, (char) 0x302F);
namechar.addInterval((char) 0x3031, (char) 0x3035);
namechar.addInterval((char) 0x3041, (char) 0x3094);
namechar.addInterval((char) 0x3099, (char) 0x3099);
namechar.addInterval((char) 0x309A, (char) 0x309A);
namechar.addInterval((char) 0x309D, (char) 0x309E);
namechar.addInterval((char) 0x30A1, (char) 0x30FA);
namechar.addInterval((char) 0x30FC, (char) 0x30FE);
namechar.addInterval((char) 0x3105, (char) 0x312C);
namechar.addInterval((char) 0x4E00, (char) 0x9FA5);
namechar.addInterval((char) 0xAC00, (char) 0xD7A3);
namechar.close();
}
}