Initial merge of nxml
authorMark A. Hershberger <mah@everybody.org>
Fri, 23 Nov 2007 06:58:00 +0000 (06:58 +0000)
committerMark A. Hershberger <mah@everybody.org>
Fri, 23 Nov 2007 06:58:00 +0000 (06:58 +0000)
187 files changed:
doc/emacs/ChangeLog
doc/emacs/nxml-mode.texi [new file with mode: 0644]
etc/ChangeLog
etc/schema/calstbl.rnc [new file with mode: 0644]
etc/schema/dbcalstbl.rnc [new file with mode: 0644]
etc/schema/dbdyntbl.rnc [new file with mode: 0644]
etc/schema/dbhier.rnc [new file with mode: 0644]
etc/schema/dbnotn.rnc [new file with mode: 0644]
etc/schema/dbpool.rnc [new file with mode: 0644]
etc/schema/dbsoextbl.rnc [new file with mode: 0644]
etc/schema/dbstart.rnc [new file with mode: 0644]
etc/schema/docbook-dyntbl.rnc [new file with mode: 0644]
etc/schema/docbook-soextbl.rnc [new file with mode: 0644]
etc/schema/docbook.rnc [new file with mode: 0644]
etc/schema/locate.rnc [new file with mode: 0644]
etc/schema/rdfxml.rnc [new file with mode: 0644]
etc/schema/relaxng.rnc [new file with mode: 0644]
etc/schema/schemas.xml [new file with mode: 0644]
etc/schema/soextbl.rnc [new file with mode: 0644]
etc/schema/xhtml-applet.rnc [new file with mode: 0644]
etc/schema/xhtml-attribs.rnc [new file with mode: 0644]
etc/schema/xhtml-base.rnc [new file with mode: 0644]
etc/schema/xhtml-basic-form.rnc [new file with mode: 0644]
etc/schema/xhtml-basic-table.rnc [new file with mode: 0644]
etc/schema/xhtml-bdo.rnc [new file with mode: 0644]
etc/schema/xhtml-csismap.rnc [new file with mode: 0644]
etc/schema/xhtml-datatypes.rnc [new file with mode: 0644]
etc/schema/xhtml-edit.rnc [new file with mode: 0644]
etc/schema/xhtml-events.rnc [new file with mode: 0644]
etc/schema/xhtml-form.rnc [new file with mode: 0644]
etc/schema/xhtml-frames.rnc [new file with mode: 0644]
etc/schema/xhtml-hypertext.rnc [new file with mode: 0644]
etc/schema/xhtml-iframe.rnc [new file with mode: 0644]
etc/schema/xhtml-image.rnc [new file with mode: 0644]
etc/schema/xhtml-inlstyle.rnc [new file with mode: 0644]
etc/schema/xhtml-legacy.rnc [new file with mode: 0644]
etc/schema/xhtml-link.rnc [new file with mode: 0644]
etc/schema/xhtml-list.rnc [new file with mode: 0644]
etc/schema/xhtml-meta.rnc [new file with mode: 0644]
etc/schema/xhtml-nameident.rnc [new file with mode: 0644]
etc/schema/xhtml-object.rnc [new file with mode: 0644]
etc/schema/xhtml-param.rnc [new file with mode: 0644]
etc/schema/xhtml-pres.rnc [new file with mode: 0644]
etc/schema/xhtml-ruby.rnc [new file with mode: 0644]
etc/schema/xhtml-script.rnc [new file with mode: 0644]
etc/schema/xhtml-ssismap.rnc [new file with mode: 0644]
etc/schema/xhtml-struct.rnc [new file with mode: 0644]
etc/schema/xhtml-style.rnc [new file with mode: 0644]
etc/schema/xhtml-table.rnc [new file with mode: 0644]
etc/schema/xhtml-target.rnc [new file with mode: 0644]
etc/schema/xhtml-text.rnc [new file with mode: 0644]
etc/schema/xhtml.rnc [new file with mode: 0644]
etc/schema/xslt.rnc [new file with mode: 0644]
lisp/ChangeLog
lisp/makefile.w32-in
lisp/nxml/Makefile [new file with mode: 0644]
lisp/nxml/NEWS [new file with mode: 0644]
lisp/nxml/README [new file with mode: 0644]
lisp/nxml/TODO [new file with mode: 0644]
lisp/nxml/char-name/subdirs.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00000-0007F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00080-000FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00100-0017F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00180-0024F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00250-002AF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/002B0-002FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00300-0036F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00370-003FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00400-004FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00500-0052F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00530-0058F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00590-005FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00600-006FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00700-0074F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00780-007BF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00900-0097F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00980-009FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00A00-00A7F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00A80-00AFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00B00-00B7F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00B80-00BFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00C00-00C7F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00C80-00CFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00D00-00D7F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00D80-00DFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00E00-00E7F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00E80-00EFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/00F00-00FFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01000-0109F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/010A0-010FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01100-011FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01200-0137F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/013A0-013FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01400-0167F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01680-0169F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/016A0-016FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01700-0171F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01720-0173F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01740-0175F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01760-0177F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01780-017FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01800-018AF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01E00-01EFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/01F00-01FFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02000-0206F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02070-0209F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/020A0-020CF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/020D0-020FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02100-0214F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02150-0218F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02190-021FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02200-022FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02300-023FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02400-0243F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02440-0245F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02460-024FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02500-0257F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02580-0259F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/025A0-025FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02600-026FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02700-027BF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/027C0-027EF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/027F0-027FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02800-028FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02900-0297F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02980-029FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02A00-02AFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02E80-02EFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02F00-02FDF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/02FF0-02FFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03000-0303F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03040-0309F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/030A0-030FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03100-0312F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03130-0318F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03190-0319F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/031A0-031BF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/031F0-031FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03200-032FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03300-033FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/03400-04DBF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0A000-0A48F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0A490-0A4CF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FB00-0FB4F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FB50-0FDFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FE00-0FE0F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FE20-0FE2F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FE30-0FE4F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FE50-0FE6F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FE70-0FEFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FF00-0FFEF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/0FFF0-0FFFF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/10300-1032F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/10330-1034F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/10400-1044F.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/1D000-1D0FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/1D100-1D1FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/1D400-1D7FF.el [new file with mode: 0644]
lisp/nxml/char-name/unicode/E0000-E007F.el [new file with mode: 0644]
lisp/nxml/nxml-enc.el [new file with mode: 0644]
lisp/nxml/nxml-glyph.el [new file with mode: 0644]
lisp/nxml/nxml-maint.el [new file with mode: 0644]
lisp/nxml/nxml-mode.el [new file with mode: 0644]
lisp/nxml/nxml-ns.el [new file with mode: 0644]
lisp/nxml/nxml-outln.el [new file with mode: 0644]
lisp/nxml/nxml-parse.el [new file with mode: 0644]
lisp/nxml/nxml-rap.el [new file with mode: 0644]
lisp/nxml/nxml-uchnm.el [new file with mode: 0644]
lisp/nxml/nxml-util.el [new file with mode: 0644]
lisp/nxml/rng-auto.el [new file with mode: 0644]
lisp/nxml/rng-cmpct.el [new file with mode: 0644]
lisp/nxml/rng-dt.el [new file with mode: 0644]
lisp/nxml/rng-loc.el [new file with mode: 0644]
lisp/nxml/rng-maint.el [new file with mode: 0644]
lisp/nxml/rng-match.el [new file with mode: 0644]
lisp/nxml/rng-nxml.el [new file with mode: 0644]
lisp/nxml/rng-parse.el [new file with mode: 0644]
lisp/nxml/rng-pttrn.el [new file with mode: 0644]
lisp/nxml/rng-uri.el [new file with mode: 0644]
lisp/nxml/rng-util.el [new file with mode: 0644]
lisp/nxml/rng-valid.el [new file with mode: 0644]
lisp/nxml/rng-xsd.el [new file with mode: 0644]
lisp/nxml/subdirs.el [new file with mode: 0644]
lisp/nxml/test.invalid.xml [new file with mode: 0644]
lisp/nxml/test.valid.xml [new file with mode: 0644]
lisp/nxml/xmltok.el [new file with mode: 0644]
lisp/nxml/xsd-regexp.el [new file with mode: 0644]

index 02d9e85..634782b 100644 (file)
@@ -1,3 +1,7 @@
+2007-11-23  Mark A. Hershberger  <mah@everybody.org>
+
+       * nxml-mode.texi: Initial merge of nxml.
+
 2007-11-18  Richard Stallman  <rms@gnu.org>
 
        * flymake.texi (Example -- Configuring a tool called directly): 
diff --git a/doc/emacs/nxml-mode.texi b/doc/emacs/nxml-mode.texi
new file mode 100644 (file)
index 0000000..e2ab3fd
--- /dev/null
@@ -0,0 +1,834 @@
+\input texinfo @c -*- texinfo -*-
+@c %**start of header
+@setfilename nxml-mode.info
+@settitle nXML Mode
+@c %**end of header
+
+@dircategory Emacs
+@direntry
+* nXML Mode: (nxml-mode.info).
+@end direntry
+
+@node Top
+@top nXML Mode
+
+This manual documents nxml-mode, an Emacs major mode for editing
+XML with RELAX NG support.  This manual is not yet complete.
+
+@menu
+* Completion::                  
+* Inserting end-tags::          
+* Paragraphs::                  
+* Outlining::                   
+* Locating a schema::           
+* DTDs::                        
+* Limitations::                 
+@end menu
+
+@node Completion
+@chapter Completion
+
+Apart from real-time validation, the most important feature that
+nxml-mode provides for assisting in document creation is "completion".
+Completion assists the user in inserting characters at point, based on
+knowledge of the schema and on the contents of the buffer before
+point.
+
+The traditional GNU Emacs key combination for completion in a
+buffer is @kbd{M-@key{TAB}}. However, many window systems
+and window managers use this key combination themselves (typically for
+switching between windows) and do not pass it to applications. It's
+hard to find key combinations in GNU Emacs that are both easy to type
+and not taken by something else.  @kbd{C-@key{RET}} (i.e.
+pressing the Enter or Return key, while the Ctrl key is held down) is
+available.  It won't be available on a traditional terminal (because
+it is indistinguishable from Return), but it will work with a window
+system.  Therefore we adopt the following solution by default: use
+@kbd{C-@key{RET}} when there's a window system and
+@kbd{M-@key{TAB}} when there's not.  In the following, I
+will assume that a window system is being used and will therefore
+refer to @kbd{C-@key{RET}}.
+
+Completion works by examining the symbol preceding point.  This
+is the symbol to be completed. The symbol to be completed may be the
+empty. Completion considers what symbols starting with the symbol to
+be completed would be valid replacements for the symbol to be
+completed, given the schema and the contents of the buffer before
+point.  These symbols are the possible completions.  An example may
+make this clearer.  Suppose the buffer looks like this (where @point{}
+indicates point):
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<h@point{}
+@end example
+
+@noindent
+and the schema is XHTML.  In this context, the symbol to be completed
+is @samp{h}.  The possible completions consist of just
+@samp{head}.  Another example, is
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<@point{}
+@end example
+
+@noindent
+In this case, the symbol to be completed is empty, and the possible
+completions are @samp{base}, @samp{isindex},
+@samp{link}, @samp{meta}, @samp{script},
+@samp{style}, @samp{title}.  Another example is:
+
+@example
+<html xmlns="@point{}
+@end example
+
+@noindent
+In this case, the symbol to be completed is empty, and the possible
+completions are just @samp{http://www.w3.org/1999/xhtml}.
+
+When you type @kbd{C-@key{RET}}, what happens depends
+on what the set of possible completions are.
+
+@itemize @bullet
+@item
+If the set of completions is empty, nothing
+happens.
+@item
+If there is one possible completion, then that completion is
+inserted, together with any following characters that are
+required. For example, in this case:
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<@point{}
+@end example
+
+@noindent
+@kbd{C-@key{RET}} will yield
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head@point{}
+@end example
+@item
+If there is more than one possible completion, but all
+possible completions share a common non-empty prefix, then that prefix
+is inserted. For example, suppose the buffer is:
+
+@example
+<html x@point{}
+@end example
+
+@noindent
+The symbol to be completed is @samp{x}. The possible completions
+are @samp{xmlns} and @samp{xml:lang}.  These share a
+common prefix of @samp{xml}.  Thus, @kbd{C-@key{RET}}
+will yield:
+
+@example
+<html xml@point{}
+@end example
+
+@noindent
+Typically, you would do @kbd{C-@key{RET}} again, which would
+have the result described in the next item.
+@item
+If there is more than one possible completion, but the
+possible completions do not share a non-empty prefix, then Emacs will
+prompt you to input the symbol in the minibuffer, initializing the
+minibuffer with the symbol to be completed, and popping up a buffer
+showing the possible completions.  You can now input the symbol to be
+inserted.  The symbol you input will be inserted in the buffer instead
+of the symbol to be completed.  Emacs will then insert any required
+characters after the symbol.  For example, if it contains:
+
+@example
+<html xml@point{}
+@end example
+
+@noindent
+Emacs will prompt you in the minibuffer with
+
+@example
+Attribute: xml@point{}
+@end example
+
+@noindent
+and the buffer showing possible completions will contain
+
+@example
+Possible completions are:
+xml:lang                          xmlns
+@end example
+
+@noindent
+If you input @kbd{xmlns}, the result will be:
+
+@example
+<html xmlns="@point{}
+@end example
+
+@noindent
+(If you do @kbd{C-@key{RET}} again, the namespace URI will
+be inserted. Should that happen automatically?)
+@end itemize
+
+@node Inserting end-tags
+@chapter Inserting end-tags
+
+The main redundancy in XML syntax is end-tags.  nxml-mode provides
+several ways to make it easier to enter end-tags.  You can use all of
+these without a schema.
+
+You can use @kbd{C-@key{RET}} after @samp{</}
+to complete the rest of the end-tag.
+
+@kbd{C-c C-f} inserts an end-tag for the element containing
+point. This command is useful when you want to input the start-tag,
+then input the content and finally input the end-tag. The @samp{f}
+is mnemonic for finish.
+
+If you want to keep tags balanced and input the end-tag at the
+same time as the start-tag, before inputting the content, then you can
+use @kbd{C-c C-i}. This inserts a @samp{>}, then inserts
+the end-tag and leaves point before the end-tag.  @kbd{C-c C-b}
+is similar but more convenient for block-level elements: it puts the
+start-tag, point and the end-tag on successive lines, appropriately
+indented. The @samp{i} is mnemonic for inline and the
+@samp{b} is mnemonic for block.
+
+Finally, you can customize nxml-mode so that @kbd{/}
+automatically inserts the rest of the end-tag when it occurs after
+@samp{<}, by doing
+
+@display
+@kbd{M-x customize-variable @key{RET} nxml-slash-auto-complete-flag @key{RET}}
+@end display
+
+@noindent
+and then following the instructions in the displayed buffer.
+
+@node Paragraphs
+@chapter Paragraphs
+
+Emacs has several commands that operate on paragraphs, most
+notably @kbd{M-q}. nXML mode redefines these to work in a way
+that is useful for XML.  The exact rules that are used to find the
+beginning and end of a paragraph are complicated; they are designed
+mainly to ensure that @kbd{M-q} does the right thing.
+
+A paragraph consists of one or more complete, consecutive lines.
+A group of lines is not considered a paragraph unless it contains some
+non-whitespace characters between tags or inside comments.  A blank
+line separates paragraphs.  A single tag on a line by itself also
+separates paragraphs.  More precisely, if one tag together with any
+leading and trailing whitespace completely occupy one or more lines,
+then those lines will not be included in any paragraph.
+
+A start-tag at the beginning of the line (possibly indented) may
+be treated as starting a paragraph.  Similarly, an end-tag at the end
+of the line may be treated as ending a paragraph. The following rules
+are used to determine whether such a tag is in fact treated as a
+paragraph boundary:
+
+@itemize @bullet
+@item
+If the schema does not allow text at that point, then it
+is a paragraph boundary.
+@item
+If the end-tag corresponding to the start-tag is not at
+the end of its line, or the start-tag corresponding to the end-tag is
+not at the beginning of its line, then it is not a paragraph
+boundary. For example, in
+
+@example
+<p>This is a paragraph with an
+<emph>emphasized</emph> phrase.
+@end example
+
+@noindent
+the @samp{<emph>} start-tag would not be considered as
+starting a paragraph, because its corresponding end-tag is not at the
+end of the line.
+@item
+If there is text that is a sibling in element tree, then
+it is not a paragraph boundary.  For example, in
+
+@example
+<p>This is a paragraph with an
+<emph>emphasized phrase that takes one source line</emph>
+@end example
+
+@noindent
+the @samp{<emph>} start-tag would not be considered as
+starting a paragraph, even though its end-tag is at the end of its
+line, because there the text @samp{This is a paragraph with an}
+is a sibling of the @samp{emph} element.
+@item
+Otherwise, it is a paragraph boundary.
+@end itemize
+
+@node Outlining
+@chapter Outlining
+
+nXML mode allows you to display all or part of a buffer as an
+outline, in a similar way to Emacs' outline mode.  An outline in nXML
+mode is based on recognizing two kinds of element: sections and
+headings.  There is one heading for every section and one section for
+every heading.  A section contains its heading as or within its first
+child element.  A section also contains its subordinate sections (its
+subsections).  The text content of a section consists of anything in a
+section that is neither a subsection nor a heading.
+
+Note that this is a different model from that used by XHTML.
+nXML mode's outline support will not be useful for XHTML unless you
+adopt a convention of adding a @code{div} to enclose each
+section, rather than having sections implicitly delimited by different
+@code{h@var{n}} elements.  This limitation may be removed
+in a future version.
+
+The variable @code{nxml-section-element-name-regexp} gives
+a regexp for the local names (i.e. the part of the name following any
+prefix) of section elements. The variable
+@code{nxml-heading-element-name-regexp} gives a regexp for the
+local names of heading elements. For an element to be recognized
+as a section
+
+@itemize @bullet
+@item
+its start-tag must occur at the beginning of a line
+(possibly indented);
+@item
+its local name must match
+@code{nxml-section-element-name-regexp};
+@item
+either its first child element or a descendant of that
+first child element must have a local name that matches
+@code{nxml-heading-element-name-regexp}; the first such element
+is treated as the section's heading.
+@end itemize
+
+@noindent
+You can customize these variables using @kbd{M-x
+customize-variable}.
+
+There are three possible outline states for a section:
+
+@itemize @bullet
+@item
+normal, showing everything, including its heading, text
+content and subsections; each subsection is displayed according to the
+state of that subsection;
+@item
+showing just its heading, with both its text content and
+its subsections hidden; all subsections are hidden regardless of their
+state;
+@item
+showing its heading and its subsections, with its text
+content hidden; each subsection is displayed according to the state of
+that subsection.
+@end itemize
+
+In the last two states, where the text content is hidden, the
+heading is displayed specially, in an abbreviated form. An element
+like this:
+
+@example
+<section>
+<title>Food</title>
+<para>There are many kinds of food.</para>
+</section>
+@end example
+
+@noindent
+would be displayed on a single line like this:
+
+@example
+<-section>Food...</>
+@end example
+
+@noindent
+If there are hidden subsections, then a @code{+} will be used
+instead of a @code{-} like this:
+
+@example
+<+section>Food...</>
+@end example
+
+@noindent
+If there are non-hidden subsections, then the section will instead be
+displayed like this:
+
+@example
+<-section>Food...
+  <-section>Delicious Food...</>
+  <-section>Distasteful Food...</>
+</-section>
+@end example
+
+@noindent
+The heading is always displayed with an indent that corresponds to its
+depth in the outline, even it is not actually indented in the buffer.
+The variable @code{nxml-outline-child-indent} controls how much
+a subheading is indented with respect to its parent heading when the
+heading is being displayed specially.
+
+Commands to change the outline state of sections are bound to
+key sequences that start with @kbd{C-c C-o} (@kbd{o} is
+mnemonic for outline).  The third and final key has been chosen to be
+consistent with outline mode.  In the following descriptions
+current section means the section containing point, or, more precisely,
+the innermost section containing the character immediately following
+point.
+
+@itemize @bullet
+@item
+@kbd{C-c C-o C-a} shows all sections in the buffer
+normally.
+@item
+@kbd{C-c C-o C-t} hides the text content
+of all sections in the buffer.
+@item
+@kbd{C-c C-o C-c} hides the text content
+of the current section.
+@item
+@kbd{C-c C-o C-e} shows the text content
+of the current section.
+@item
+@kbd{C-c C-o C-d} hides the text content
+and subsections of the current section.
+@item
+@kbd{C-c C-o C-s} shows the current section 
+and all its direct and indirect subsections normally.
+@item
+@kbd{C-c C-o C-k} shows the headings of the
+direct and indirect subsections of the current section.
+@item
+@kbd{C-c C-o C-l} hides the text content of the
+current section and of its direct and indirect
+subsections.
+@item
+@kbd{C-c C-o C-i} shows the headings of the
+direct subsections of the current section.
+@item
+@kbd{C-c C-o C-o} hides as much as possible without
+hiding the current section's text content; the headings of ancestor
+sections of the current section and their child section sections will
+not be hidden.
+@end itemize
+
+When a heading is displayed specially, you can use
+@key{RET} in that heading to show the text content of the section
+in the same way as @kbd{C-c C-o C-e}.
+
+You can also use the mouse to change the outline state:
+@kbd{S-mouse-2} hides the text content of a section in the same
+way as@kbd{C-c C-o C-c}; @kbd{mouse-2} on a specially
+displayed heading shows the text content of the section in the same
+way as @kbd{C-c C-o C-e}; @kbd{mouse-1} on a specially
+displayed start-tag toggles the display of subheadings on and
+off.
+
+The outline state for each section is stored with the first
+character of the section (as a text property). Every command that
+changes the outline state of any section updates the display of the
+buffer so that each section is displayed correctly according to its
+outline state.  If the section structure is subsequently changed, then
+it is possible for the display to no longer correctly reflect the
+stored outline state. @kbd{C-c C-o C-r} can be used to refresh
+the display so it is correct again.
+
+@node Locating a schema
+@chapter Locating a schema
+
+nXML mode has a configurable set of rules to locate a schema for
+the file being edited.  The rules are contained in one or more schema
+locating files, which are XML documents.
+
+The variable @samp{rng-schema-locating-files} specifies
+the list of the file-names of schema locating files that nXML mode
+should use.  The order of the list is significant: when file
+@var{x} occurs in the list before file @var{y} then rules
+from file @var{x} have precedence over rules from file
+@var{y}.  A filename specified in
+@samp{rng-schema-locating-files} may be relative. If so, it will
+be resolved relative to the document for which a schema is being
+located. It is not an error if relative file-names in
+@samp{rng-schema-locating-files} do not not exist. You can use
+@kbd{M-x customize-variable @key{RET} rng-schema-locating-files
+@key{RET}} to customize the list of schema locating
+files.
+
+By default, @samp{rng-schema-locating-files} list has two
+members: @samp{schemas.xml}, and
+@samp{@var{dist-dir}/schema/schemas.xml} where
+@samp{@var{dist-dir}} is the directory containing the nXML
+distribution. The first member will cause nXML mode to use a file
+@samp{schemas.xml} in the same directory as the document being
+edited if such a file exist.  The second member contains rules for the
+schemas that are included with the nXML distribution.
+
+@menu
+* Commands for locating a schema::  
+* Schema locating files::       
+@end menu
+
+@node Commands for locating a schema
+@section Commands for locating a schema
+
+The command @kbd{C-c C-s C-w} will tell you what schema
+is currently being used.
+
+The rules for locating a schema are applied automatically when
+you visit a file in nXML mode. However, if you have just created a new
+file and the schema cannot be inferred from the file-name, then this
+will not locate the right schema.  In this case, you should insert the
+start-tag of the root element and then use the command @kbd{C-c
+C-a}, which reapplies the rules based on the current content of
+the document.  It is usually not necessary to insert the complete
+start-tag; often just @samp{<@var{name}} is
+enough.
+
+If you want to use a schema that has not yet been added to the
+schema locating files, you can use the command @kbd{C-c C-s C-f}
+to manually select the file contaiing the schema for the document in
+current buffer.  Emacs will read the file-name of the schema from the
+minibuffer. After reading the file-name, Emacs will ask whether you
+wish to add a rule to a schema locating file that persistently
+associates the document with the selected schema.  The rule will be
+added to the first file in the list specified
+@samp{rng-schema-locating-files}; it will create the file if
+necessary, but will not create a directory. If the variable
+@samp{rng-schema-locating-files} has not been customized, this
+means that the rule will be added to the file @samp{schemas.xml}
+in the same directory as the document being edited.
+
+The command @kbd{C-c C-s C-t} allows you to select a schema by
+specifying an identifier for the type of the document.  The schema
+locating files determine the available type identifiers and what
+schema is used for each type identifier. This is useful when it is
+impossible to infer the right schema from either the file-name or the
+content of the document, even though the schema is already in the
+schema locating file.  A situation in which this can occur is when
+there are multiple variants of a schema where all valid documents have
+the same document element.  For example, XHTML has Strict and
+Transitional variants.  In a situation like this, a schema locating file
+can define a type identifier for each variant. As with @kbd{C-c
+C-s C-f}, Emacs will ask whether you wish to add a rule to a schema
+locating file that persistently associates the document with the
+specified type identifier.
+
+The command @kbd{C-c C-s C-l} adds a rule to a schema
+locating file that persistently associates the document with
+the schema that is currently being used.
+
+@node Schema locating files
+@section Schema locating files
+
+Each schema locating file specifies a list of rules.  The rules
+from each file are appended in order. To locate a schema each rule is
+applied in turn until a rule matches.  The first matching rule is then
+used to determine the schema.
+
+Schema locating files are designed to be useful for other
+applications that need to locate a schema for a document. In fact,
+there is nothing specific to locating schemas in the design; it could
+equally well be used for locating a stylesheet.
+
+@menu
+* Schema locating file syntax basics::  
+* Using the document's URI to locate a schema::  
+* Using the document element to locate a schema::  
+* Using type identifiers in schema locating files::  
+* Using multiple schema locating files::  
+@end menu
+
+@node Schema locating file syntax basics
+@subsection Schema locating file syntax basics
+
+There is a schema for schema locating files in the file
+@samp{locate.rnc} in the schema directory.  Schema locating
+files must be valid with respect to this schema.
+
+The document element of a schema locating file must be
+@samp{locatingRules} and the namespace URI must be
+@samp{http://thaiopensource.com/ns/locating-rules/1.0}.  The
+children of the document element specify rules. The order of the
+children is the same as the order of the rules.  Here's a complete
+example of a schema locating file:
+
+@example
+<?xml version="1.0"?>
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml.rnc"/>
+  <documentElement localName="book" uri="docbook.rnc"/>
+</locatingRules>
+@end example
+
+@noindent
+This says to use the schema @samp{xhtml.rnc} for a document with
+namespace @samp{http://www.w3.org/1999/xhtml}, and to use the
+schema @samp{docbook.rnc} for a document whose local name is
+@samp{book}.  If the document element had both a namespace URI
+of @samp{http://www.w3.org/1999/xhtml} and a local name of
+@samp{book}, then the matching rule that comes first will be
+used and so the schema @samp{xhtml.rnc} would be used.  There is
+no precedence between different types of rule; the first matching rule
+of any type is used.
+
+As usual with XML-related technologies, resources are identified
+by URIs.  The @samp{uri} attribute identifies the schema by
+specifying the URI.  The URI may be relative.  If so, it is resolved
+relative to the URI of the schema locating file that contains
+attribute. This means that if the value of @samp{uri} attribute
+does not contain a @samp{/}, then it will refer to a filename in
+the same directory as the schema locating file.
+
+@node Using the document's URI to locate a schema
+@subsection Using the document's URI to locate a schema
+
+A @samp{uri} rule locates a schema based on the URI of the
+document.  The @samp{uri} attribute specifies the URI of the
+schema.  The @samp{resource} attribute can be used to specify
+the schema for a particular document.  For example,
+
+@example
+<uri resource="spec.xml" uri="docbook.rnc"/>
+@end example
+
+@noindent
+specifies that that the schema for @samp{spec.xml} is
+@samp{docbook.rnc}.
+
+The @samp{pattern} attribute can be used instead of the
+@samp{resource} attribute to specify the schema for any document
+whose URI matches a pattern.  The pattern has the same syntax as an
+absolute or relative URI except that the path component of the URI can
+use a @samp{*} character to stand for zero or more characters
+within a path segment (i.e. any character other @samp{/}).
+Typically, the URI pattern looks like a relative URI, but, whereas a
+relative URI in the @samp{resource} attribute is resolved into a
+particular absolute URI using the base URI of the schema locating
+file, a relative URI pattern matches if it matches some number of
+complete path segments of the document's URI ending with the last path
+segment of the document's URI. For example,
+
+@example
+<uri pattern="*.xsl" uri="xslt.rnc"/>
+@end example
+
+@noindent
+specifies that the schema for documents with a URI whose path ends
+with @samp{.xsl} is @samp{xslt.rnc}.
+
+A @samp{transformURI} rule locates a schema by
+transforming the URI of the document. The @samp{fromPattern}
+attribute specifies a URI pattern with the same meaning as the
+@samp{pattern} attribute of the @samp{uri} element.  The
+@samp{toPattern} attribute is a URI pattern that is used to
+generate the URI of the schema.  Each @samp{*} in the
+@samp{toPattern} is replaced by the string that matched the
+corresponding @samp{*} in the @samp{fromPattern}.  The
+resulting string is appended to the initial part of the document's URI
+that was not explicitly matched by the @samp{fromPattern}.  The
+rule matches only if the transformed URI identifies an existing
+resource.  For example, the rule
+
+@example
+<transformURI fromPattern="*.xml" toPattern="*.rnc"/>
+@end example
+
+@noindent
+would transform the URI @samp{file:///home/jjc/docs/spec.xml}
+into the URI @samp{file:///home/jjc/docs/spec.rnc}.  Thus, this
+rule specifies that to locate a schema for a document
+@samp{@var{foo}.xml}, Emacs should test whether a file
+@samp{@var{foo}.rnc} exists in the same directory as
+@samp{@var{foo}.xml}, and, if so, should use it as the
+schema.
+
+@node Using the document element to locate a schema
+@subsection Using the document element to locate a schema
+
+A @samp{documentElement} rule locates a schema based on
+the local name and prefix of the document element. For example, a rule
+
+@example
+<documentElement prefix="xsl" localName="stylesheet" uri="xslt.rnc"/>
+@end example
+
+@noindent
+specifies that when the name of the document element is
+@samp{xsl:stylesheet}, then @samp{xslt.rnc} should be used
+as the schema. Either the @samp{prefix} or
+@samp{localName} attribute may be omitted to allow any prefix or
+local name.
+
+A @samp{namespace} rule locates a schema based on the
+namespace URI of the document element. For example, a rule
+
+@example
+<namespace ns="http://www.w3.org/1999/XSL/Transform" uri="xslt.rnc"/>
+@end example
+
+@noindent
+specifies that when the namespace URI of the document is
+@samp{http://www.w3.org/1999/XSL/Transform}, then
+@samp{xslt.rnc} should be used as the schema.
+
+@node Using type identifiers in schema locating files
+@subsection Using type identifiers in schema locating files
+
+Type identifiers allow a level of indirection in locating the
+schema for a document.  Instead of associating the document directly
+with a schema URI, the document is associated with a type identifier,
+which is in turn associated with a schema URI. nXML mode does not
+constrain the format of type identifiers.  They can be simply strings
+without any formal structure or they can be public identifiers or
+URIs.  Note that these type identifiers have nothing to do with the
+DOCTYPE declaration.  When comparing type identifiers, whitespace is
+normalized in the same way as with the @samp{xsd:token}
+datatype: leading and trailing whitespace is stripped; other sequences
+of whitespace are normalized to a single space character.
+
+Each of the rules described in previous sections that uses a
+@samp{uri} attribute to specify a schema, can instead use a
+@samp{typeId} attribute to specify a type identifier.  The type
+identifier can be associated with a URI using a @samp{typeId}
+element. For example,
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <namespace ns="http://www.w3.org/1999/xhtml" typeId="XHTML"/>
+  <typeId id="XHTML" typeId="XHTML Strict"/>
+  <typeId id="XHTML Strict" uri="xhtml-strict.rnc"/>
+  <typeId id="XHTML Transitional" uri="xhtml-transitional.rnc"/>
+</locatingRules>
+@end example
+
+@noindent
+declares three type identifiers @samp{XHTML} (representing the
+default variant of XHTML to be used), @samp{XHTML Strict} and
+@samp{XHTML Transitional}.  Such a schema locating file would
+use @samp{xhtml-strict.rnc} for a document whose namespace is
+@samp{http://www.w3.org/1999/xhtml}.  But it is considerably
+more flexible than a schema locating file that simply specified
+
+@example
+<namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml-strict.rnc"/>
+@end example
+
+@noindent
+A user can easily use @kbd{C-c C-s C-t} to select between XHTML
+Strict and XHTML Transitional. Also, a user can easily add a catalog
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <typeId id="XHTML" typeId="XHTML Transitional"/>
+</locatingRules>
+@end example
+
+@noindent
+that makes the default variant of XHTML be XHTML Transitional.
+
+@node Using multiple schema locating files
+@subsection Using multiple schema locating files
+
+The @samp{include} element includes rules from another
+schema locating file.  The behavior is exactly as if the rules from
+that file were included in place of the @samp{include} element.
+Relative URIs are resolved into absolute URIs before the inclusion is
+performed. For example,
+
+@example
+<include rules="../rules.xml"/>
+@end example
+
+@noindent
+includes the rules from @samp{rules.xml}.
+
+The process of locating a schema takes as input a list of schema
+locating files.  The rules in all these files and in the files they
+include are resolved into a single list of rules, which are applied
+strictly in order.  Sometimes this order is not what is needed.
+For example, suppose you have two schema locating files, a private
+file
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml.rnc"/>
+</locatingRules>
+@end example
+
+@noindent
+followed by a public file
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <transformURI pathSuffix=".xml" replacePathSuffix=".rnc"/>
+  <namespace ns="http://www.w3.org/1999/XSL/Transform" typeId="XSLT"/>
+</locatingRules>
+@end example
+
+@noindent
+The effect of these two files is that the XHTML @samp{namespace}
+rule takes precedence over the @samp{transformURI} rule, which
+is almost certainly not what is needed.  This can be solved by adding
+an @samp{applyFollowingRules} to the private file.
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <applyFollowingRules ruleType="transformURI"/>
+  <namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml.rnc"/>
+</locatingRules>
+@end example
+
+@node DTDs
+@chapter DTDs
+
+nxml-mode is designed to support the creation of standalone XML
+documents that do not depend on a DTD.  Although it is common practice
+to insert a DOCTYPE declaration referencing an external DTD, this has
+undesirable side-effects.  It means that the document is no longer
+self-contained. It also means that different XML parsers may interpret
+the document in different ways, since the XML Recommendation does not
+require XML parsers to read the DTD.  With DTDs, it was impractical to
+get validation without using an external DTD or reference to an
+parameter entity.  With RELAX NG and other schema languages, you can
+simulataneously get the benefits of validation and standalone XML
+documents.  Therefore, I recommend that you do not reference an
+external DOCTYPE in your XML documents.
+
+One problem is entities for characters. Typically, as well as
+providing validation, DTDs also provide a set of character entities
+for documents to use. Schemas cannot provide this functionality,
+because schema validation happens after XML parsing.  The recommended
+solution is to either use the Unicode characters directly, or, if this
+is impractical, use character references.  nXML mode supports this by
+providing commands for entering characters and character references
+using the Unicode names, and can display the glyph corresponding to a
+character reference.
+
+@node Limitations
+@chapter Limitations
+
+nXML mode has some limitations:
+
+@itemize @bullet
+@item
+DTD support is limited.  Internal parsed general entities declared
+in the internal subset are supported provided they do not contain
+elements. Other usage of DTDs is ignored.
+@item
+The restrictions on RELAX NG schemas in section 7 of the RELAX NG
+specification are not enforced.
+@item
+Unicode support has problems. This stems mostly from the fact that
+the XML (and RELAX NG) character model is based squarely on Unicode,
+whereas the Emacs character model is not.  Emacs 22 is slated to have
+full Unicode support, which should improve the situation here.
+@end itemize
+
+@bye
index 67bf2d8..419522c 100644 (file)
@@ -1,3 +1,7 @@
+2007-11-23  Mark A. Hershberger  <mah@everybody.org>
+
+       * schema: Initial merge of nxml.
+
 2007-11-22  Francesco Potort\e,Al\e(B  <pot@gnu.org>
 
        * NEWS: etags: the --members option is now the default.
diff --git a/etc/schema/calstbl.rnc b/etc/schema/calstbl.rnc
new file mode 100644 (file)
index 0000000..5d334e8
--- /dev/null
@@ -0,0 +1,184 @@
+# This file was generated automatically by Trang, and then manually
+# edited to add back definitions for overridden parameter entities and
+# undefined elements, specifically: bodyatt, secur, paracon,
+# tbl.table.mdl, tbl.entry.mdl, caution, graphic, legend, note, para,
+# title, warning.  This makes the semantics of this module as close as
+# possible to the original DTD and also allows this schema to be used
+# independently of DocBook.
+
+# ......................................................................
+
+# DocBook CALS Table Model V4.2 ........................................
+
+# File calstblx.mod ....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# This DTD is based on the CALS Table Model
+# PUBLIC "-//USA-DOD//DTD Table Model 951010//EN"
+# 
+# $Id: calstbl.rnc,v 1.2 2003/08/30 06:04:02 jjc Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the definitions for the CALS Table Model
+# converted to XML.
+
+# These definitions are not directly related to the table model, but are
+# used in the default CALS table model and are usually defined elsewhere
+# (and prior to the inclusion of this table module) in a CALS DTD.
+
+bodyatt = empty
+secur = empty
+
+# no if zero(s),
+# yes if any other digits value
+
+yesorno = string
+titles = title?
+# default for use in entry content
+paracon = text
+
+# The parameter entities as defined below provide the CALS table model
+# as published (as part of the Example DTD) in MIL-HDBK-28001.
+# 
+# These following declarations provide the CALS-compliant default definitions
+# for these entities.  However, these entities can and should be redefined
+# (by giving the appropriate parameter entity declaration(s) prior to the
+# reference to this Table Model declaration set entity) to fit the needs
+# of the current application.
+tbl.table-titles.mdl = titles
+tbl.table-main.mdl = tgroup+ | graphic+
+tbl.table.mdl = tbl.table-titles.mdl | tbl.table-main.mdl
+tbl.table.att =
+  attribute tabstyle { text }?,
+  attribute tocentry { yesorno }?,
+  attribute shortentry { yesorno }?,
+  attribute orient { "port" | "land" }?,
+  attribute pgwide { yesorno }?
+tbl.tgroup.mdl = colspec*, spanspec*, thead?, tfoot?, tbody
+tbl.tgroup.att = attribute tgroupstyle { text }?
+tbl.hdft.mdl = colspec*, row+
+tbl.row.mdl = (entry | entrytbl)+
+tbl.entrytbl.mdl = colspec*, spanspec*, thead?, tbody
+tbl.entry.mdl = paracon | para | warning | caution | note | legend
+# =====  Element and attribute declarations follow. =====
+start = table
+table = element table { table.attlist, tbl.table.mdl }
+table.attlist &=
+  attribute frame {
+    "top" | "bottom" | "topbot" | "all" | "sides" | "none"
+  }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  tbl.table.att,
+  bodyatt,
+  secur
+tgroup = element tgroup { tgroup.attlist, tbl.tgroup.mdl }
+tgroup.attlist &=
+  attribute cols { text },
+  tbl.tgroup.att,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?,
+  secur
+colspec = element colspec { colspec.attlist, empty }
+colspec.attlist &=
+  attribute colnum { text }?,
+  attribute colname { text }?,
+  attribute colwidth { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?
+spanspec = element spanspec { spanspec.attlist, empty }
+spanspec.attlist &=
+  attribute namest { text },
+  attribute nameend { text },
+  attribute spanname { text },
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?
+thead = element thead { thead.attlist, tbl.hdft.mdl }
+thead.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+tfoot = element tfoot { tfoot.attlist, tbl.hdft.mdl }
+tfoot.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+tbody = element tbody { tbody.attlist, row+ }
+tbody.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+row = element row { row.attlist, tbl.row.mdl }
+row.attlist &=
+  attribute rowsep { yesorno }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+entrytbl = element entrytbl { entrytbl.attlist, tbl.entrytbl.mdl }
+entrytbl.attlist &=
+  attribute cols { text },
+  tbl.tgroup.att,
+  attribute colname { text }?,
+  attribute spanname { text }?,
+  attribute namest { text }?,
+  attribute nameend { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?,
+  secur
+entry = element entry { entry.attlist, tbl.entry.mdl* }
+entry.attlist &=
+  attribute colname { text }?,
+  attribute namest { text }?,
+  attribute nameend { text }?,
+  attribute spanname { text }?,
+  attribute morerows { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?,
+  attribute rotate { yesorno }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+caution |= notAllowed
+graphic |= notAllowed
+legend |= notAllowed
+note |= notAllowed
+para |= notAllowed
+title |= notAllowed
+warning |= notAllowed
+
+# End of DocBook CALS Table Model V4.2 .................................
+
+# ......................................................................
diff --git a/etc/schema/dbcalstbl.rnc b/etc/schema/dbcalstbl.rnc
new file mode 100644 (file)
index 0000000..9841df2
--- /dev/null
@@ -0,0 +1,25 @@
+# Definitions specific to the CALS Table Model.
+
+# Reference CALS Table Model
+include "calstbl.rnc" {
+  # Override definition of start
+  start |= notAllowed
+  # Add label and role attributes to table and informaltable
+  bodyatt = label.attrib
+  # Add common attributes to Table, TGroup, TBody, THead, TFoot, Row,
+  # EntryTbl, and Entry (and InformalTable element).
+  secur = common.attrib, tables.role.attrib
+  # Content model for Table.
+  tbl.table.mdl =
+    blockinfo?,
+    formalobject.title.content,
+    ndxterm.class*,
+    textobject*,
+    (graphic+ | mediaobject+ | tgroup+)
+  # Allow either objects or inlines; beware of REs between elements.
+  tbl.entry.mdl = para.char.mix | tabentry.mix
+}
+
+common.table.attribs = bodyatt, secur
+
+# end of table.module
diff --git a/etc/schema/dbdyntbl.rnc b/etc/schema/dbdyntbl.rnc
new file mode 100644 (file)
index 0000000..8e85914
--- /dev/null
@@ -0,0 +1,116 @@
+# This is an alternative to dbsoextbl.rnc and dbcalstbl.rnc that
+# allows the table model to be selected dynamically based on the
+# definitions of cals.table.module and exchange.table.module.
+#
+# To use this copy, docbook.rnc to docbook-dyntbl.rnc replacing
+# "dbcalstbl.rnc" by "dbdyntbl.rnc".  Then, you can override the
+# choice of table model by doing
+#
+# include "docbook-dyntbl.rnc" {
+#   cals.table.model = IGNORE
+#   exchange.table.model = INCLUDE
+# }
+
+INCLUDE = empty
+IGNORE = notAllowed
+cals.table.module = INCLUDE
+exchange.table.module = IGNORE
+
+# Add common attributes and the Label attribute to Table and
+# InformalTable.
+bodyatt = common.attrib, label.attrib, tables.role.attrib
+
+# Content model for Table.
+tbl.table.mdl =
+  blockinfo?,
+  formalobject.title.content,
+  ndxterm.class*,
+  textobject*,
+  (graphic+ | mediaobject+ | tgroup+)
+
+table = cals.table | exchange.table
+
+cals.table =
+  cals.table.module,
+  grammar {
+    # Reference CALS Table Model
+    include "calstbl.rnc" {
+      # Add label and role attributes to table and informaltable
+      bodyatt = parent label.attrib
+      # Add common attributes to Table, TGroup, TBody, THead, TFoot, Row,
+      # EntryTbl, and Entry (and InformalTable element).
+      secur = parent common.attrib, parent tables.role.attrib
+      tbl.table.mdl = parent tbl.table.mdl
+    }
+  }
+
+exchange.table =
+  exchange.table.module,
+  grammar {
+    # Reference OASIS Exchange Table Model
+    include "soextbl.rnc" {
+      # Add common attributes and the Label attribute to Table and
+      # InformalTable.
+      bodyatt = parent bodyatt
+      tbl.table.mdl = parent tbl.table.mdl
+    }
+  }
+
+tgroup = cals.tgroup | exchange.tgroup
+
+cals.tgroup =
+  cals.table.module,
+  grammar {
+    # Reference CALS Table Model
+    include "calstbl.rnc" {
+      start = tgroup
+      # Add label and role attributes to table and informaltable
+      bodyatt = parent label.attrib
+      # Add common attributes to Table, TGroup, TBody, THead, TFoot, Row,
+      # EntryTbl, and Entry (and InformalTable element).
+      secur = parent common.attrib, parent tables.role.attrib
+      # Allow either objects or inlines; beware of REs between elements.
+      tbl.entry.mdl = parent para.char.mix | parent tabentry.mix
+    }
+  }
+
+exchange.tgroup =
+  exchange.table.module,
+  grammar {
+    # Reference OASIS Exchange Table Model
+    include "soextbl.rnc" {
+      start = tgroup
+      bodyatt = parent bodyatt
+      # Add common attributes to TGroup, ColSpec, TBody, THead, Row, Entry
+      tbl.tgroup.att = parent common.attrib
+      tbl.colspec.att = parent common.attrib
+      tbl.tbody.att = parent common.attrib
+      tbl.thead.att = parent common.attrib
+      tbl.row.att = parent common.attrib
+      tbl.entry.att = parent common.attrib
+      # Allow either objects or inlines; beware of REs between elements.
+      tbl.entry.mdl = (parent para.char.mix | parent tabentry.mix)*
+    }
+  }
+
+tbl.table.att = cals.tbl.table.att | exchange.tbl.table.att
+
+cals.tbl.table.att =
+  cals.table.module,
+  grammar {
+    include "calstbl.rnc" {
+      start = tbl.table.att
+    }
+  }
+
+exchange.tbl.table.att =
+  exchange.table.module,
+  grammar {
+    include "soextbl.rnc" {
+      start = tbl.table.att
+    }
+  }
+
+common.table.attribs = bodyatt
+
+# end of table.module
diff --git a/etc/schema/dbhier.rnc b/etc/schema/dbhier.rnc
new file mode 100644 (file)
index 0000000..1671b01
--- /dev/null
@@ -0,0 +1,1467 @@
+# ......................................................................
+
+# DocBook document hierarchy module V4.2 ...............................
+
+# File dbhierx.mod .....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# $Id: dbhier.rnc,v 1.1 2003/08/30 04:19:27 jjc Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the definitions for the overall document
+# hierarchies of DocBook documents.  It covers computer documentation
+# manuals and manual fragments, as well as reference entries (such as
+# man pages) and technical journals or anthologies containing
+# articles.
+# 
+# This module depends on the DocBook information pool module.  All
+# elements and entities referenced but not defined here are assumed
+# to be defined in the information pool module.
+# 
+# In DTD driver files referring to this module, please use an entity
+# declaration that uses the public identifier shown below:
+# 
+# <!ENTITY % dbhier PUBLIC
+# "-//OASIS//ELEMENTS DocBook Document Hierarchy V4.2//EN"
+# "dbhierx.mod">
+# %dbhier;
+# 
+# See the documentation for detailed information on the parameter
+# entity and module scheme used in DocBook, customizing DocBook and
+# planning for interchange, and changes made since the last release
+# of DocBook.
+
+# ......................................................................
+
+# Entities for module inclusions .......................................
+
+# ......................................................................
+
+# Entities for element classes .........................................
+
+local.appendix.class = notAllowed
+appendix.class = appendix | local.appendix.class
+local.article.class = notAllowed
+article.class = article | local.article.class
+local.book.class = notAllowed
+book.class = book | local.book.class
+local.chapter.class = notAllowed
+chapter.class = chapter | local.chapter.class
+local.index.class = notAllowed
+index.class = index | setindex | local.index.class
+local.refentry.class = notAllowed
+refentry.class = refentry | local.refentry.class
+local.section.class = notAllowed
+section.class = section | local.section.class
+local.nav.class = notAllowed
+nav.class =
+  toc | lot | index | glossary | bibliography | local.nav.class
+# Redeclaration placeholder ............................................
+
+# For redeclaring entities that are declared after this point while
+# retaining their references to the entities that are declared before
+# this point
+
+# ......................................................................
+
+# Entities for element mixtures ........................................
+
+# The DocBook TC may produce an official forms module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+forms.hook = notAllowed
+local.divcomponent.mix = notAllowed
+divcomponent.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | compound.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | forms.hook
+  | local.divcomponent.mix
+local.refcomponent.mix = notAllowed
+refcomponent.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | compound.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | local.refcomponent.mix
+local.indexdivcomponent.mix = notAllowed
+indexdivcomponent.mix =
+  itemizedlist
+  | orderedlist
+  | variablelist
+  | simplelist
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | anchor
+  | remark
+  | link.char.class
+  | beginpage
+  | local.indexdivcomponent.mix
+local.refname.char.mix = notAllowed
+refname.char.mix = text | tech.char.class | local.refname.char.mix
+local.partcontent.mix = notAllowed
+partcontent.mix =
+  appendix.class
+  | chapter.class
+  | nav.class
+  | article.class
+  | preface
+  | refentry.class
+  | reference
+  | local.partcontent.mix
+local.refinline.char.mix = notAllowed
+refinline.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | ndxterm.class
+  | beginpage
+  | local.refinline.char.mix
+local.refclass.char.mix = notAllowed
+refclass.char.mix = text | application | local.refclass.char.mix
+# Redeclaration placeholder 2 ..........................................
+
+# For redeclaring entities that are declared after this point while
+# retaining their references to the entities that are declared before
+# this point
+
+# ......................................................................
+
+# Entities for content models ..........................................
+div.title.content = title, subtitle?, titleabbrev?
+bookcomponent.title.content = title, subtitle?, titleabbrev?
+sect.title.content = title, subtitle?, titleabbrev?
+refsect.title.content = title, subtitle?, titleabbrev?
+bookcomponent.content =
+  (divcomponent.mix+,
+   (sect1* | refentry.class* | simplesect* | section.class*))
+  | (sect1+ | refentry.class+ | simplesect+ | section.class+)
+# ......................................................................
+
+# Set and SetInfo ......................................................
+local.set.attrib = empty
+set.role.attrib = role.attrib
+set =
+  element set {
+    set.attlist,
+    div.title.content?,
+    setinfo?,
+    toc?,
+    book.class+,
+    setindex?
+  }
+# end of set.element
+
+# FPI: SGML formal public identifier
+set.attlist &=
+  attribute fpi { text }?,
+  status.attrib,
+  common.attrib,
+  set.role.attrib,
+  local.set.attrib
+# end of set.attlist
+
+# end of set.module
+local.setinfo.attrib = empty
+setinfo.role.attrib = role.attrib
+setinfo = element setinfo { setinfo.attlist, info.class+ }
+# end of setinfo.element
+
+# Contents: IDs of the ToC, Books, and SetIndex that comprise
+# the set, in the order of their appearance
+setinfo.attlist &=
+  attribute contents { xsd:IDREFS }?,
+  common.attrib,
+  setinfo.role.attrib,
+  local.setinfo.attrib
+# end of setinfo.attlist
+
+# end of setinfo.module
+
+# end of set.content.module
+
+# ......................................................................
+
+# Book and BookInfo ....................................................
+local.book.attrib = empty
+book.role.attrib = role.attrib
+book =
+  element book {
+    book.attlist,
+    div.title.content?,
+    bookinfo?,
+    (dedication
+     | toc
+     | lot
+     | glossary
+     | bibliography
+     | preface
+     | chapter.class
+     | reference
+     | part
+     | article.class
+     | appendix.class
+     | index.class
+     | colophon)*
+  }
+# end of book.element
+
+# FPI: SGML formal public identifier
+book.attlist &=
+  attribute fpi { text }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  book.role.attrib,
+  local.book.attrib
+# end of book.attlist
+
+# end of book.module
+local.bookinfo.attrib = empty
+bookinfo.role.attrib = role.attrib
+bookinfo = element bookinfo { bookinfo.attlist, info.class+ }
+# end of bookinfo.element
+
+# Contents: IDs of the ToC, LoTs, Prefaces, Parts, Chapters,
+# Appendixes, References, GLossary, Bibliography, and indexes
+# comprising the Book, in the order of their appearance
+bookinfo.attlist &=
+  attribute contents { xsd:IDREFS }?,
+  common.attrib,
+  bookinfo.role.attrib,
+  local.bookinfo.attrib
+# end of bookinfo.attlist
+
+# end of bookinfo.module
+
+# end of book.content.module
+
+# ......................................................................
+
+# Dedication, ToC, and LoT .............................................
+local.dedication.attrib = empty
+dedication.role.attrib = role.attrib
+dedication =
+  element dedication {
+    dedication.attlist, sect.title.content?, legalnotice.mix+
+  }
+# end of dedication.element
+dedication.attlist &=
+  status.attrib,
+  common.attrib,
+  dedication.role.attrib,
+  local.dedication.attrib
+# end of dedication.attlist
+
+# end of dedication.module
+local.colophon.attrib = empty
+colophon.role.attrib = role.attrib
+colophon =
+  element colophon {
+    colophon.attlist, sect.title.content?, textobject.mix+
+  }
+# end of colophon.element
+colophon.attlist &=
+  status.attrib,
+  common.attrib,
+  colophon.role.attrib,
+  local.colophon.attrib
+# end of colophon.attlist
+
+# end of colophon.module
+local.toc.attrib = empty
+toc.role.attrib = role.attrib
+toc =
+  element toc {
+    toc.attlist,
+    beginpage?,
+    bookcomponent.title.content?,
+    tocfront*,
+    (tocpart | tocchap)*,
+    tocback*
+  }
+# end of toc.element
+toc.attlist &=
+  pagenum.attrib, common.attrib, toc.role.attrib, local.toc.attrib
+# end of toc.attlist
+
+# end of toc.module
+local.tocfront.attrib = empty
+tocfront.role.attrib = role.attrib
+tocfront = element tocfront { tocfront.attlist, para.char.mix* }
+# end of tocfront.element
+
+# to element that this entry represents
+tocfront.attlist &=
+  label.attrib,
+  linkend.attrib,
+  pagenum.attrib,
+  common.attrib,
+  tocfront.role.attrib,
+  local.tocfront.attrib
+# end of tocfront.attlist
+
+# end of tocfront.module
+local.tocentry.attrib = empty
+tocentry.role.attrib = role.attrib
+tocentry = element tocentry { tocentry.attlist, para.char.mix* }
+# end of tocentry.element
+
+# to element that this entry represents
+tocentry.attlist &=
+  linkend.attrib,
+  pagenum.attrib,
+  common.attrib,
+  tocentry.role.attrib,
+  local.tocentry.attrib
+# end of tocentry.attlist
+
+# end of tocentry.module
+local.tocpart.attrib = empty
+tocpart.role.attrib = role.attrib
+tocpart = element tocpart { tocpart.attlist, tocentry+, tocchap* }
+# end of tocpart.element
+tocpart.attlist &=
+  common.attrib, tocpart.role.attrib, local.tocpart.attrib
+# end of tocpart.attlist
+
+# end of tocpart.module
+local.tocchap.attrib = empty
+tocchap.role.attrib = role.attrib
+tocchap = element tocchap { tocchap.attlist, tocentry+, toclevel1* }
+# end of tocchap.element
+tocchap.attlist &=
+  label.attrib, common.attrib, tocchap.role.attrib, local.tocchap.attrib
+# end of tocchap.attlist
+
+# end of tocchap.module
+local.toclevel1.attrib = empty
+toclevel1.role.attrib = role.attrib
+toclevel1 =
+  element toclevel1 { toclevel1.attlist, tocentry+, toclevel2* }
+# end of toclevel1.element
+toclevel1.attlist &=
+  common.attrib, toclevel1.role.attrib, local.toclevel1.attrib
+# end of toclevel1.attlist
+
+# end of toclevel1.module
+local.toclevel2.attrib = empty
+toclevel2.role.attrib = role.attrib
+toclevel2 =
+  element toclevel2 { toclevel2.attlist, tocentry+, toclevel3* }
+# end of toclevel2.element
+toclevel2.attlist &=
+  common.attrib, toclevel2.role.attrib, local.toclevel2.attrib
+# end of toclevel2.attlist
+
+# end of toclevel2.module
+local.toclevel3.attrib = empty
+toclevel3.role.attrib = role.attrib
+toclevel3 =
+  element toclevel3 { toclevel3.attlist, tocentry+, toclevel4* }
+# end of toclevel3.element
+toclevel3.attlist &=
+  common.attrib, toclevel3.role.attrib, local.toclevel3.attrib
+# end of toclevel3.attlist
+
+# end of toclevel3.module
+local.toclevel4.attrib = empty
+toclevel4.role.attrib = role.attrib
+toclevel4 =
+  element toclevel4 { toclevel4.attlist, tocentry+, toclevel5* }
+# end of toclevel4.element
+toclevel4.attlist &=
+  common.attrib, toclevel4.role.attrib, local.toclevel4.attrib
+# end of toclevel4.attlist
+
+# end of toclevel4.module
+local.toclevel5.attrib = empty
+toclevel5.role.attrib = role.attrib
+toclevel5 = element toclevel5 { toclevel5.attlist, tocentry+ }
+# end of toclevel5.element
+toclevel5.attlist &=
+  common.attrib, toclevel5.role.attrib, local.toclevel5.attrib
+# end of toclevel5.attlist
+
+# end of toclevel5.module
+local.tocback.attrib = empty
+tocback.role.attrib = role.attrib
+tocback = element tocback { tocback.attlist, para.char.mix* }
+# end of tocback.element
+
+# to element that this entry represents
+tocback.attlist &=
+  label.attrib,
+  linkend.attrib,
+  pagenum.attrib,
+  common.attrib,
+  tocback.role.attrib,
+  local.tocback.attrib
+# end of tocback.attlist
+
+# end of tocback.module
+
+# end of toc.content.module
+local.lot.attrib = empty
+lot.role.attrib = role.attrib
+lot =
+  element lot {
+    lot.attlist, beginpage?, bookcomponent.title.content?, lotentry*
+  }
+# end of lot.element
+lot.attlist &=
+  label.attrib, common.attrib, lot.role.attrib, local.lot.attrib
+# end of lot.attlist
+
+# end of lot.module
+local.lotentry.attrib = empty
+lotentry.role.attrib = role.attrib
+lotentry = element lotentry { lotentry.attlist, para.char.mix* }
+# end of lotentry.element
+
+# SrcCredit: Information about the source of the entry,
+# as for a list of illustrations
+
+#  linkend: to element that this entry represents
+lotentry.attlist &=
+  linkend.attrib,
+  pagenum.attrib,
+  attribute srccredit { text }?,
+  common.attrib,
+  lotentry.role.attrib,
+  local.lotentry.attrib
+# end of lotentry.attlist
+
+# end of lotentry.module
+
+# end of lot.content.module
+
+# ......................................................................
+
+# Appendix, Chapter, Part, Preface, Reference, PartIntro ...............
+local.appendix.attrib = empty
+appendix.role.attrib = role.attrib
+appendix =
+  element appendix {
+    appendix.attlist,
+    beginpage?,
+    appendixinfo?,
+    bookcomponent.title.content,
+    nav.class*,
+    tocchap?,
+    bookcomponent.content,
+    nav.class*
+  }
+# end of appendix.element
+appendix.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  appendix.role.attrib,
+  local.appendix.attrib
+# end of appendix.attlist
+
+# end of appendix.module
+local.chapter.attrib = empty
+chapter.role.attrib = role.attrib
+chapter =
+  element chapter {
+    chapter.attlist,
+    beginpage?,
+    chapterinfo?,
+    bookcomponent.title.content,
+    nav.class*,
+    tocchap?,
+    bookcomponent.content,
+    nav.class*
+  }
+# end of chapter.element
+chapter.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  chapter.role.attrib,
+  local.chapter.attrib
+# end of chapter.attlist
+
+# end of chapter.module
+
+# Note that Part was to have its content model reduced in V4.2.  This
+# change will not be made after all.
+local.part.attrib = empty
+part.role.attrib = role.attrib
+part =
+  element part {
+    part.attlist,
+    beginpage?,
+    partinfo?,
+    bookcomponent.title.content,
+    partintro?,
+    partcontent.mix+
+  }
+# end of part.element
+part.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  part.role.attrib,
+  local.part.attrib
+# end of part.attlist
+
+# ELEMENT PartIntro (defined below)
+
+# end of part.module
+local.preface.attrib = empty
+preface.role.attrib = role.attrib
+preface =
+  element preface {
+    preface.attlist,
+    beginpage?,
+    prefaceinfo?,
+    bookcomponent.title.content,
+    nav.class*,
+    tocchap?,
+    bookcomponent.content,
+    nav.class*
+  }
+# end of preface.element
+preface.attlist &=
+  status.attrib,
+  common.attrib,
+  preface.role.attrib,
+  local.preface.attrib
+# end of preface.attlist
+
+# end of preface.module
+local.reference.attrib = empty
+reference.role.attrib = role.attrib
+reference =
+  element reference {
+    reference.attlist,
+    beginpage?,
+    referenceinfo?,
+    bookcomponent.title.content,
+    partintro?,
+    refentry.class+
+  }
+# end of reference.element
+reference.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  reference.role.attrib,
+  local.reference.attrib
+# end of reference.attlist
+
+# ELEMENT PartIntro (defined below)
+
+# end of reference.module
+local.partintro.attrib = empty
+partintro.role.attrib = role.attrib
+partintro =
+  element partintro {
+    partintro.attlist, div.title.content?, bookcomponent.content
+  }
+# end of partintro.element
+partintro.attlist &=
+  label.attrib,
+  common.attrib,
+  partintro.role.attrib,
+  local.partintro.attrib
+# end of partintro.attlist
+
+# end of partintro.module
+
+# ......................................................................
+
+# Other Info elements ..................................................
+local.appendixinfo.attrib = empty
+appendixinfo.role.attrib = role.attrib
+appendixinfo =
+  element appendixinfo { appendixinfo.attlist, info.class+ }
+# end of appendixinfo.element
+appendixinfo.attlist &=
+  common.attrib, appendixinfo.role.attrib, local.appendixinfo.attrib
+# end of appendixinfo.attlist
+
+# end of appendixinfo.module
+local.bibliographyinfo.attrib = empty
+bibliographyinfo.role.attrib = role.attrib
+bibliographyinfo =
+  element bibliographyinfo { bibliographyinfo.attlist, info.class+ }
+# end of bibliographyinfo.element
+bibliographyinfo.attlist &=
+  common.attrib,
+  bibliographyinfo.role.attrib,
+  local.bibliographyinfo.attrib
+# end of bibliographyinfo.attlist
+
+# end of bibliographyinfo.module
+local.chapterinfo.attrib = empty
+chapterinfo.role.attrib = role.attrib
+chapterinfo = element chapterinfo { chapterinfo.attlist, info.class+ }
+# end of chapterinfo.element
+chapterinfo.attlist &=
+  common.attrib, chapterinfo.role.attrib, local.chapterinfo.attrib
+# end of chapterinfo.attlist
+
+# end of chapterinfo.module
+local.glossaryinfo.attrib = empty
+glossaryinfo.role.attrib = role.attrib
+glossaryinfo =
+  element glossaryinfo { glossaryinfo.attlist, info.class+ }
+# end of glossaryinfo.element
+glossaryinfo.attlist &=
+  common.attrib, glossaryinfo.role.attrib, local.glossaryinfo.attrib
+# end of glossaryinfo.attlist
+
+# end of glossaryinfo.module
+local.indexinfo.attrib = empty
+indexinfo.role.attrib = role.attrib
+indexinfo = element indexinfo { indexinfo.attlist, info.class+ }
+# end of indexinfo.element
+indexinfo.attlist &=
+  common.attrib, indexinfo.role.attrib, local.indexinfo.attrib
+# end of indexinfo.attlist
+
+# end of indexinfo.module
+local.setindexinfo.attrib = empty
+setindexinfo.role.attrib = role.attrib
+setindexinfo =
+  element setindexinfo { setindexinfo.attlist, info.class+ }
+# end of setindexinfo.element
+setindexinfo.attlist &=
+  common.attrib, setindexinfo.role.attrib, local.setindexinfo.attrib
+# end of setindexinfo.attlist
+
+# end of setindexinfo.module
+local.partinfo.attrib = empty
+partinfo.role.attrib = role.attrib
+partinfo = element partinfo { partinfo.attlist, info.class+ }
+# end of partinfo.element
+partinfo.attlist &=
+  common.attrib, partinfo.role.attrib, local.partinfo.attrib
+# end of partinfo.attlist
+
+# end of partinfo.module
+local.prefaceinfo.attrib = empty
+prefaceinfo.role.attrib = role.attrib
+prefaceinfo = element prefaceinfo { prefaceinfo.attlist, info.class+ }
+# end of prefaceinfo.element
+prefaceinfo.attlist &=
+  common.attrib, prefaceinfo.role.attrib, local.prefaceinfo.attrib
+# end of prefaceinfo.attlist
+
+# end of prefaceinfo.module
+local.refentryinfo.attrib = empty
+refentryinfo.role.attrib = role.attrib
+refentryinfo =
+  element refentryinfo { refentryinfo.attlist, info.class+ }
+# end of refentryinfo.element
+refentryinfo.attlist &=
+  common.attrib, refentryinfo.role.attrib, local.refentryinfo.attrib
+# end of refentryinfo.attlist
+
+# end of refentryinfo.module
+local.refsectioninfo.attrib = empty
+refsectioninfo.role.attrib = role.attrib
+refsectioninfo =
+  element refsectioninfo { refsectioninfo.attlist, info.class+ }
+# end of refsectioninfo.element
+refsectioninfo.attlist &=
+  common.attrib, refsectioninfo.role.attrib, local.refsectioninfo.attrib
+# end of refsectioninfo.attlist
+
+# end of refsectioninfo.module
+local.refsect1info.attrib = empty
+refsect1info.role.attrib = role.attrib
+refsect1info =
+  element refsect1info { refsect1info.attlist, info.class+ }
+# end of refsect1info.element
+refsect1info.attlist &=
+  common.attrib, refsect1info.role.attrib, local.refsect1info.attrib
+# end of refsect1info.attlist
+
+# end of refsect1info.module
+local.refsect2info.attrib = empty
+refsect2info.role.attrib = role.attrib
+refsect2info =
+  element refsect2info { refsect2info.attlist, info.class+ }
+# end of refsect2info.element
+refsect2info.attlist &=
+  common.attrib, refsect2info.role.attrib, local.refsect2info.attrib
+# end of refsect2info.attlist
+
+# end of refsect2info.module
+local.refsect3info.attrib = empty
+refsect3info.role.attrib = role.attrib
+refsect3info =
+  element refsect3info { refsect3info.attlist, info.class+ }
+# end of refsect3info.element
+refsect3info.attlist &=
+  common.attrib, refsect3info.role.attrib, local.refsect3info.attrib
+# end of refsect3info.attlist
+
+# end of refsect3info.module
+local.refsynopsisdivinfo.attrib = empty
+refsynopsisdivinfo.role.attrib = role.attrib
+refsynopsisdivinfo =
+  element refsynopsisdivinfo { refsynopsisdivinfo.attlist, info.class+ }
+# end of refsynopsisdivinfo.element
+refsynopsisdivinfo.attlist &=
+  common.attrib,
+  refsynopsisdivinfo.role.attrib,
+  local.refsynopsisdivinfo.attrib
+# end of refsynopsisdivinfo.attlist
+
+# end of refsynopsisdivinfo.module
+local.referenceinfo.attrib = empty
+referenceinfo.role.attrib = role.attrib
+referenceinfo =
+  element referenceinfo { referenceinfo.attlist, info.class+ }
+# end of referenceinfo.element
+referenceinfo.attlist &=
+  common.attrib, referenceinfo.role.attrib, local.referenceinfo.attrib
+# end of referenceinfo.attlist
+
+# end of referenceinfo.module
+local.sect1info.attrib = empty
+sect1info.role.attrib = role.attrib
+sect1info = element sect1info { sect1info.attlist, info.class+ }
+# end of sect1info.element
+sect1info.attlist &=
+  common.attrib, sect1info.role.attrib, local.sect1info.attrib
+# end of sect1info.attlist
+local.sect2info.attrib = empty
+sect2info.role.attrib = role.attrib
+sect2info = element sect2info { sect2info.attlist, info.class+ }
+# end of sect2info.element
+sect2info.attlist &=
+  common.attrib, sect2info.role.attrib, local.sect2info.attrib
+# end of sect2info.attlist
+local.sect3info.attrib = empty
+sect3info.role.attrib = role.attrib
+sect3info = element sect3info { sect3info.attlist, info.class+ }
+# end of sect3info.element
+sect3info.attlist &=
+  common.attrib, sect3info.role.attrib, local.sect3info.attrib
+# end of sect3info.attlist
+local.sect4info.attrib = empty
+sect4info.role.attrib = role.attrib
+sect4info = element sect4info { sect4info.attlist, info.class+ }
+# end of sect4info.element
+sect4info.attlist &=
+  common.attrib, sect4info.role.attrib, local.sect4info.attrib
+# end of sect4info.attlist
+local.sect5info.attrib = empty
+sect5info.role.attrib = role.attrib
+sect5info = element sect5info { sect5info.attlist, info.class+ }
+# end of sect5info.element
+sect5info.attlist &=
+  common.attrib, sect5info.role.attrib, local.sect5info.attrib
+# end of sect5info.attlist
+
+# ......................................................................
+
+# Section (parallel to Sect*) .........................................
+local.section.attrib = empty
+section.role.attrib = role.attrib
+section =
+  element section {
+    section.attlist,
+    sectioninfo?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+,
+      (refentry.class* | section.class* | simplesect*))
+     | refentry.class+
+     | section.class+
+     | simplesect+),
+    nav.class*
+  }
+# end of section.element
+section.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  section.role.attrib,
+  local.section.attrib
+# end of section.attlist
+
+# end of section.module
+sectioninfo.role.attrib = role.attrib
+local.sectioninfo.attrib = empty
+sectioninfo = element sectioninfo { sectioninfo.attlist, info.class+ }
+# end of sectioninfo.element
+sectioninfo.attlist &=
+  common.attrib, sectioninfo.role.attrib, local.sectioninfo.attrib
+# end of sectioninfo.attlist
+
+# end of sectioninfo.module
+
+# end of section.content.module
+
+# ......................................................................
+
+# Sect1, Sect2, Sect3, Sect4, Sect5 ....................................
+local.sect1.attrib = empty
+sect1.role.attrib = role.attrib
+sect1 =
+  element sect1 {
+    sect1.attlist,
+    sect1info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect2* | simplesect*))
+     | refentry.class+
+     | sect2+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect1.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect1.attlist &=
+  attribute renderas { "sect2" | "sect3" | "sect4" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect1.role.attrib,
+  local.sect1.attrib
+# end of sect1.attlist
+
+# end of sect1.module
+local.sect2.attrib = empty
+sect2.role.attrib = role.attrib
+sect2 =
+  element sect2 {
+    sect2.attlist,
+    sect2info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect3* | simplesect*))
+     | refentry.class+
+     | sect3+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect2.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect2.attlist &=
+  attribute renderas { "sect1" | "sect3" | "sect4" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect2.role.attrib,
+  local.sect2.attrib
+# end of sect2.attlist
+
+# end of sect2.module
+local.sect3.attrib = empty
+sect3.role.attrib = role.attrib
+sect3 =
+  element sect3 {
+    sect3.attlist,
+    sect3info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect4* | simplesect*))
+     | refentry.class+
+     | sect4+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect3.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect3.attlist &=
+  attribute renderas { "sect1" | "sect2" | "sect4" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect3.role.attrib,
+  local.sect3.attrib
+# end of sect3.attlist
+
+# end of sect3.module
+local.sect4.attrib = empty
+sect4.role.attrib = role.attrib
+sect4 =
+  element sect4 {
+    sect4.attlist,
+    sect4info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect5* | simplesect*))
+     | refentry.class+
+     | sect5+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect4.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect4.attlist &=
+  attribute renderas { "sect1" | "sect2" | "sect3" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect4.role.attrib,
+  local.sect4.attrib
+# end of sect4.attlist
+
+# end of sect4.module
+local.sect5.attrib = empty
+sect5.role.attrib = role.attrib
+sect5 =
+  element sect5 {
+    sect5.attlist,
+    sect5info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | simplesect*))
+     | refentry.class+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect5.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect5.attlist &=
+  attribute renderas { "sect1" | "sect2" | "sect3" | "sect4" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect5.role.attrib,
+  local.sect5.attrib
+# end of sect5.attlist
+
+# end of sect5.module
+local.simplesect.attrib = empty
+simplesect.role.attrib = role.attrib
+simplesect =
+  element simplesect {
+    simplesect.attlist, sect.title.content, divcomponent.mix+
+  }
+# end of simplesect.element
+simplesect.attlist &=
+  common.attrib, simplesect.role.attrib, local.simplesect.attrib
+# end of simplesect.attlist
+
+# end of simplesect.module
+
+# ......................................................................
+
+# Bibliography .........................................................
+local.bibliography.attrib = empty
+bibliography.role.attrib = role.attrib
+bibliography =
+  element bibliography {
+    bibliography.attlist,
+    bibliographyinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (bibliodiv+ | (biblioentry | bibliomixed)+)
+  }
+# end of bibliography.element
+bibliography.attlist &=
+  status.attrib,
+  common.attrib,
+  bibliography.role.attrib,
+  local.bibliography.attrib
+# end of bibliography.attlist
+
+# end of bibliography.module
+local.bibliodiv.attrib = empty
+bibliodiv.role.attrib = role.attrib
+bibliodiv =
+  element bibliodiv {
+    bibliodiv.attlist,
+    sect.title.content?,
+    component.mix*,
+    (biblioentry | bibliomixed)+
+  }
+# end of bibliodiv.element
+bibliodiv.attlist &=
+  status.attrib,
+  common.attrib,
+  bibliodiv.role.attrib,
+  local.bibliodiv.attrib
+# end of bibliodiv.attlist
+
+# end of bibliodiv.module
+
+# end of bibliography.content.module
+
+# ......................................................................
+
+# Glossary .............................................................
+local.glossary.attrib = empty
+glossary.role.attrib = role.attrib
+glossary =
+  element glossary {
+    glossary.attlist,
+    glossaryinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (glossdiv+ | glossentry+),
+    bibliography?
+  }
+# end of glossary.element
+glossary.attlist &=
+  status.attrib,
+  common.attrib,
+  glossary.role.attrib,
+  local.glossary.attrib
+# end of glossary.attlist
+
+# end of glossary.module
+local.glossdiv.attrib = empty
+glossdiv.role.attrib = role.attrib
+glossdiv =
+  element glossdiv {
+    glossdiv.attlist, sect.title.content, component.mix*, glossentry+
+  }
+# end of glossdiv.element
+glossdiv.attlist &=
+  status.attrib,
+  common.attrib,
+  glossdiv.role.attrib,
+  local.glossdiv.attrib
+# end of glossdiv.attlist
+
+# end of glossdiv.module
+
+# end of glossary.content.module
+
+# ......................................................................
+
+# Index and SetIndex ...................................................
+local.indexes.attrib = empty
+indexes.role.attrib = role.attrib
+index =
+  element index {
+    index.attlist,
+    indexinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (indexdiv* | indexentry*)
+  }
+# end of index.element
+index.attlist &=
+  common.attrib, indexes.role.attrib, local.indexes.attrib
+# end of index.attlist
+setindex =
+  element setindex {
+    setindex.attlist,
+    setindexinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (indexdiv* | indexentry*)
+  }
+# end of setindex.element
+setindex.attlist &=
+  common.attrib, indexes.role.attrib, local.indexes.attrib
+# end of setindex.attlist
+
+# end of indexes.module
+
+# SegmentedList in this content is useful for marking up permuted
+# indices.
+local.indexdiv.attrib = empty
+indexdiv.role.attrib = role.attrib
+indexdiv =
+  element indexdiv {
+    indexdiv.attlist,
+    sect.title.content?,
+    (indexdivcomponent.mix*, (indexentry+ | segmentedlist))
+  }
+# end of indexdiv.element
+indexdiv.attlist &=
+  common.attrib, indexdiv.role.attrib, local.indexdiv.attrib
+# end of indexdiv.attlist
+
+# end of indexdiv.module
+
+# Index entries appear in the index, not the text.
+local.indexentry.attrib = empty
+indexentry.role.attrib = role.attrib
+indexentry =
+  element indexentry {
+    indexentry.attlist,
+    primaryie,
+    (seeie | seealsoie)*,
+    (secondaryie, (seeie | seealsoie | tertiaryie)*)*
+  }
+# end of indexentry.element
+indexentry.attlist &=
+  common.attrib, indexentry.role.attrib, local.indexentry.attrib
+# end of indexentry.attlist
+
+# end of indexentry.module
+local.primsecterie.attrib = empty
+primsecterie.role.attrib = role.attrib
+primaryie = element primaryie { primaryie.attlist, ndxterm.char.mix* }
+# end of primaryie.element
+
+# to IndexTerms that these entries represent
+primaryie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  primsecterie.role.attrib,
+  local.primsecterie.attrib
+# end of primaryie.attlist
+secondaryie =
+  element secondaryie { secondaryie.attlist, ndxterm.char.mix* }
+# end of secondaryie.element
+
+# to IndexTerms that these entries represent
+secondaryie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  primsecterie.role.attrib,
+  local.primsecterie.attrib
+# end of secondaryie.attlist
+tertiaryie =
+  element tertiaryie { tertiaryie.attlist, ndxterm.char.mix* }
+# end of tertiaryie.element
+
+# to IndexTerms that these entries represent
+tertiaryie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  primsecterie.role.attrib,
+  local.primsecterie.attrib
+# end of tertiaryie.attlist
+
+# end of primsecterie.module
+local.seeie.attrib = empty
+seeie.role.attrib = role.attrib
+seeie = element seeie { seeie.attlist, ndxterm.char.mix* }
+# end of seeie.element
+
+# to IndexEntry to look up
+seeie.attlist &=
+  linkend.attrib, common.attrib, seeie.role.attrib, local.seeie.attrib
+# end of seeie.attlist
+
+# end of seeie.module
+local.seealsoie.attrib = empty
+seealsoie.role.attrib = role.attrib
+seealsoie = element seealsoie { seealsoie.attlist, ndxterm.char.mix* }
+# end of seealsoie.element
+
+# to related IndexEntries
+seealsoie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  seealsoie.role.attrib,
+  local.seealsoie.attrib
+# end of seealsoie.attlist
+
+# end of seealsoie.module
+
+# end of index.content.module
+
+# ......................................................................
+
+# RefEntry .............................................................
+local.refentry.attrib = empty
+refentry.role.attrib = role.attrib
+refentry =
+  element refentry {
+    refentry.attlist,
+    beginpage?,
+    ndxterm.class*,
+    refentryinfo?,
+    refmeta?,
+    (remark | link.char.class)*,
+    refnamediv,
+    refsynopsisdiv?,
+    (refsect1+ | refsection+)
+  }
+# end of refentry.element
+refentry.attlist &=
+  status.attrib,
+  common.attrib,
+  refentry.role.attrib,
+  local.refentry.attrib
+# end of refentry.attlist
+
+# end of refentry.module
+local.refmeta.attrib = empty
+refmeta.role.attrib = role.attrib
+refmeta =
+  element refmeta {
+    refmeta.attlist,
+    ndxterm.class*,
+    refentrytitle,
+    manvolnum?,
+    refmiscinfo*,
+    ndxterm.class*
+  }
+# end of refmeta.element
+refmeta.attlist &=
+  common.attrib, refmeta.role.attrib, local.refmeta.attrib
+# end of refmeta.attlist
+
+# end of refmeta.module
+local.refmiscinfo.attrib = empty
+refmiscinfo.role.attrib = role.attrib
+refmiscinfo =
+  element refmiscinfo { refmiscinfo.attlist, docinfo.char.mix* }
+# end of refmiscinfo.element
+
+# Class: Freely assignable parameter; no default
+refmiscinfo.attlist &=
+  attribute class { text }?,
+  common.attrib,
+  refmiscinfo.role.attrib,
+  local.refmiscinfo.attrib
+# end of refmiscinfo.attlist
+
+# end of refmiscinfo.module
+local.refnamediv.attrib = empty
+refnamediv.role.attrib = role.attrib
+refnamediv =
+  element refnamediv {
+    refnamediv.attlist,
+    refdescriptor?,
+    refname+,
+    refpurpose,
+    refclass*,
+    (remark | link.char.class)*
+  }
+# end of refnamediv.element
+refnamediv.attlist &=
+  common.attrib, refnamediv.role.attrib, local.refnamediv.attrib
+# end of refnamediv.attlist
+
+# end of refnamediv.module
+local.refdescriptor.attrib = empty
+refdescriptor.role.attrib = role.attrib
+refdescriptor =
+  element refdescriptor { refdescriptor.attlist, refname.char.mix* }
+# end of refdescriptor.element
+refdescriptor.attlist &=
+  common.attrib, refdescriptor.role.attrib, local.refdescriptor.attrib
+# end of refdescriptor.attlist
+
+# end of refdescriptor.module
+local.refname.attrib = empty
+refname.role.attrib = role.attrib
+refname = element refname { refname.attlist, refname.char.mix* }
+# end of refname.element
+refname.attlist &=
+  common.attrib, refname.role.attrib, local.refname.attrib
+# end of refname.attlist
+
+# end of refname.module
+local.refpurpose.attrib = empty
+refpurpose.role.attrib = role.attrib
+refpurpose =
+  element refpurpose { refpurpose.attlist, refinline.char.mix* }
+# end of refpurpose.element
+refpurpose.attlist &=
+  common.attrib, refpurpose.role.attrib, local.refpurpose.attrib
+# end of refpurpose.attlist
+
+# end of refpurpose.module
+local.refclass.attrib = empty
+refclass.role.attrib = role.attrib
+refclass = element refclass { refclass.attlist, refclass.char.mix* }
+# end of refclass.element
+refclass.attlist &=
+  common.attrib, refclass.role.attrib, local.refclass.attrib
+# end of refclass.attlist
+
+# end of refclass.module
+local.refsynopsisdiv.attrib = empty
+refsynopsisdiv.role.attrib = role.attrib
+refsynopsisdiv =
+  element refsynopsisdiv {
+    refsynopsisdiv.attlist,
+    refsynopsisdivinfo?,
+    refsect.title.content?,
+    ((refcomponent.mix+, refsect2*) | refsect2+)
+  }
+# end of refsynopsisdiv.element
+refsynopsisdiv.attlist &=
+  common.attrib, refsynopsisdiv.role.attrib, local.refsynopsisdiv.attrib
+# end of refsynopsisdiv.attlist
+
+# end of refsynopsisdiv.module
+local.refsection.attrib = empty
+refsection.role.attrib = role.attrib
+refsection =
+  element refsection {
+    refsection.attlist,
+    refsectioninfo?,
+    refsect.title.content,
+    ((refcomponent.mix+, refsection*) | refsection+)
+  }
+# end of refsection.element
+refsection.attlist &=
+  status.attrib,
+  common.attrib,
+  refsection.role.attrib,
+  local.refsection.attrib
+# end of refsection.attlist
+
+# end of refsection.module
+local.refsect1.attrib = empty
+refsect1.role.attrib = role.attrib
+refsect1 =
+  element refsect1 {
+    refsect1.attlist,
+    refsect1info?,
+    refsect.title.content,
+    ((refcomponent.mix+, refsect2*) | refsect2+)
+  }
+# end of refsect1.element
+refsect1.attlist &=
+  status.attrib,
+  common.attrib,
+  refsect1.role.attrib,
+  local.refsect1.attrib
+# end of refsect1.attlist
+
+# end of refsect1.module
+local.refsect2.attrib = empty
+refsect2.role.attrib = role.attrib
+refsect2 =
+  element refsect2 {
+    refsect2.attlist,
+    refsect2info?,
+    refsect.title.content,
+    ((refcomponent.mix+, refsect3*) | refsect3+)
+  }
+# end of refsect2.element
+refsect2.attlist &=
+  status.attrib,
+  common.attrib,
+  refsect2.role.attrib,
+  local.refsect2.attrib
+# end of refsect2.attlist
+
+# end of refsect2.module
+local.refsect3.attrib = empty
+refsect3.role.attrib = role.attrib
+refsect3 =
+  element refsect3 {
+    refsect3.attlist,
+    refsect3info?,
+    refsect.title.content,
+    refcomponent.mix+
+  }
+# end of refsect3.element
+refsect3.attlist &=
+  status.attrib,
+  common.attrib,
+  refsect3.role.attrib,
+  local.refsect3.attrib
+# end of refsect3.attlist
+
+# end of refsect3.module
+
+# end of refentry.content.module
+
+# ......................................................................
+
+# Article ..............................................................
+
+# An Article is a chapter-level, stand-alone document that is often,
+# but need not be, collected into a Book.
+local.article.attrib = empty
+article.role.attrib = role.attrib
+article =
+  element article {
+    article.attlist,
+    div.title.content?,
+    articleinfo?,
+    tocchap?,
+    lot*,
+    bookcomponent.content,
+    (nav.class | appendix.class | ackno)*
+  }
+# end of article.element
+
+# Class: Indicates the type of a particular article;
+# all articles have the same structure and general purpose.
+# No default.
+
+# ParentBook: ID of the enclosing Book
+article.attlist &=
+  attribute class {
+    "journalarticle"
+    | "productsheet"
+    | "whitepaper"
+    | "techreport"
+    | "specification"
+    | "faq"
+  }?,
+  attribute parentbook { xsd:IDREF }?,
+  status.attrib,
+  common.attrib,
+  article.role.attrib,
+  local.article.attrib
+# end of article.attlist
+
+# end of article.module
+
+# End of DocBook document hierarchy module V4.2 ........................
+
+# ......................................................................
diff --git a/etc/schema/dbnotn.rnc b/etc/schema/dbnotn.rnc
new file mode 100644 (file)
index 0000000..2a6185f
--- /dev/null
@@ -0,0 +1,84 @@
+# ......................................................................
+
+# DocBook notations module V4.2 ........................................
+
+# File dbnotnx.mod .....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# $Id: dbnotn.rnc,v 1.1 2003/08/30 04:19:27 jjc Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the entity declarations for the standard ISO
+# entity sets used by DocBook.
+# 
+# In DTD driver files referring to this module, please use an entity
+# declaration that uses the public identifier shown below:
+# 
+# <!ENTITY % dbnotn PUBLIC
+# "-//OASIS//ENTITIES DocBook Notations V4.2//EN"
+# "dbnotnx.mod">
+# %dbnotn;
+# 
+# See the documentation for detailed information on the parameter
+# entity and module scheme used in DocBook, customizing DocBook and
+# planning for interchange, and changes made since the last release
+# of DocBook.
+
+local.notation.class = notAllowed
+notation.class =
+  "BMP"
+  | "CGM-CHAR"
+  | "CGM-BINARY"
+  | "CGM-CLEAR"
+  | "DITROFF"
+  | "DVI"
+  | "EPS"
+  | "EQN"
+  | "FAX"
+  | "GIF"
+  | "GIF87a"
+  | "GIF89a"
+  | "JPG"
+  | "JPEG"
+  | "IGES"
+  | "PCX"
+  | "PIC"
+  | "PNG"
+  | "PS"
+  | "SGML"
+  | "TBL"
+  | "TEX"
+  | "TIFF"
+  | "WMF"
+  | "WPG"
+  | "SVG"
+  | "linespecific"
+  | local.notation.class
+# WordPerfect Graphic format
+
+# End of DocBook notations module V4.2 .................................
+
+# ......................................................................
diff --git a/etc/schema/dbpool.rnc b/etc/schema/dbpool.rnc
new file mode 100644 (file)
index 0000000..46236eb
--- /dev/null
@@ -0,0 +1,5083 @@
+# This file was generated automatically by Trang.  The table model
+# dependent definitions have been moved into separate files.
+
+# ......................................................................
+
+# DocBook XML information pool module V4.2 .............................
+
+# File dbpoolx.mod .....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# $Id: dbpool.rnc,v 1.4 2003/08/30 07:48:31 jjc Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook XML DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook XML DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the definitions for the objects, inline
+# elements, and so on that are available to be used as the main
+# content of DocBook documents.  Some elements are useful for general
+# publishing, and others are useful specifically for computer
+# documentation.
+# 
+# This module has the following dependencies on other modules:
+# 
+# o It assumes that a %notation.class; entity is defined by the
+#   driver file or other high-level module.  This entity is
+#   referenced in the NOTATION attributes for the graphic-related and
+#   ModeSpec elements.
+# 
+# o It assumes that an appropriately parameterized table module is
+#   available for use with the table-related elements.
+# 
+# In DTD driver files referring to this module, please use an entity
+# declaration that uses the public identifier shown below:
+# 
+# <!ENTITY % dbpool PUBLIC
+# "-//OASIS//ELEMENTS DocBook XML Information Pool V4.2//EN"
+# "dbpoolx.mod">
+# %dbpool;
+# 
+# See the documentation for detailed information on the parameter
+# entity and module scheme used in DocBook, customizing DocBook and
+# planning for interchange, and changes made since the last release
+# of DocBook.
+
+# ......................................................................
+
+# General-purpose semantics entities ...................................
+
+namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
+
+yesorno.attvals = string
+# ......................................................................
+
+# Entities for module inclusions .......................................
+
+# ......................................................................
+
+# Entities for element classes and mixtures ............................
+
+# "Ubiquitous" classes: ndxterm.class and beginpage
+local.ndxterm.class = notAllowed
+ndxterm.class = indexterm | local.ndxterm.class
+# Object-level classes .................................................
+local.list.class = notAllowed
+list.class =
+  calloutlist
+  | glosslist
+  | itemizedlist
+  | orderedlist
+  | segmentedlist
+  | simplelist
+  | variablelist
+  | local.list.class
+local.admon.class = notAllowed
+admon.class =
+  caution | important | note | tip | warning | local.admon.class
+local.linespecific.class = notAllowed
+linespecific.class =
+  literallayout
+  | programlisting
+  | programlistingco
+  | screen
+  | screenco
+  | screenshot
+  | local.linespecific.class
+local.method.synop.class = notAllowed
+method.synop.class =
+  constructorsynopsis
+  | destructorsynopsis
+  | methodsynopsis
+  | local.method.synop.class
+local.synop.class = notAllowed
+synop.class =
+  synopsis
+  | cmdsynopsis
+  | funcsynopsis
+  | classsynopsis
+  | fieldsynopsis
+  | method.synop.class
+  | local.synop.class
+local.para.class = notAllowed
+para.class = formalpara | para | simpara | local.para.class
+local.informal.class = notAllowed
+informal.class =
+  address
+  | blockquote
+  | graphic
+  | graphicco
+  | mediaobject
+  | mediaobjectco
+  | informalequation
+  | informalexample
+  | informalfigure
+  | informaltable
+  | local.informal.class
+local.formal.class = notAllowed
+formal.class = equation | example | figure | table | local.formal.class
+# The DocBook TC may produce an official EBNF module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+ebnf.block.hook = notAllowed
+local.compound.class = notAllowed
+compound.class =
+  msgset
+  | procedure
+  | sidebar
+  | qandaset
+  | ebnf.block.hook
+  | local.compound.class
+local.genobj.class = notAllowed
+genobj.class =
+  anchor | bridgehead | remark | highlights | local.genobj.class
+local.descobj.class = notAllowed
+descobj.class = abstract | authorblurb | epigraph | local.descobj.class
+# Character-level classes ..............................................
+local.xref.char.class = notAllowed
+xref.char.class = footnoteref | xref | local.xref.char.class
+local.gen.char.class = notAllowed
+gen.char.class =
+  abbrev
+  | acronym
+  | citation
+  | citerefentry
+  | citetitle
+  | emphasis
+  | firstterm
+  | foreignphrase
+  | glossterm
+  | footnote
+  | phrase
+  | quote
+  | trademark
+  | wordasword
+  | personname
+  | local.gen.char.class
+local.link.char.class = notAllowed
+link.char.class = link | olink | ulink | local.link.char.class
+# The DocBook TC may produce an official EBNF module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+ebnf.inline.hook = notAllowed
+local.tech.char.class = notAllowed
+tech.char.class =
+  action
+  | application
+  | classname
+  | methodname
+  | interfacename
+  | exceptionname
+  | ooclass
+  | oointerface
+  | ooexception
+  | command
+  | computeroutput
+  | database
+  | email
+  | envar
+  | errorcode
+  | errorname
+  | errortype
+  | errortext
+  | filename
+  | function
+  | guibutton
+  | guiicon
+  | guilabel
+  | guimenu
+  | guimenuitem
+  | guisubmenu
+  | hardware
+  | interface
+  | keycap
+  | keycode
+  | keycombo
+  | keysym
+  | literal
+  | constant
+  | markup
+  | medialabel
+  | menuchoice
+  | mousebutton
+  | option
+  | optional
+  | parameter
+  | prompt
+  | property
+  | replaceable
+  | returnvalue
+  | sgmltag
+  | structfield
+  | structname
+  | symbol
+  | systemitem
+  | \token
+  | type
+  | userinput
+  | varname
+  | ebnf.inline.hook
+  | local.tech.char.class
+local.base.char.class = notAllowed
+base.char.class = anchor | local.base.char.class
+local.docinfo.char.class = notAllowed
+docinfo.char.class =
+  author
+  | authorinitials
+  | corpauthor
+  | modespec
+  | othercredit
+  | productname
+  | productnumber
+  | revhistory
+  | local.docinfo.char.class
+local.other.char.class = notAllowed
+other.char.class =
+  remark | subscript | superscript | local.other.char.class
+local.inlineobj.char.class = notAllowed
+inlineobj.char.class =
+  inlinegraphic
+  | inlinemediaobject
+  | inlineequation
+  | local.inlineobj.char.class
+# ......................................................................
+
+# Entities for content models ..........................................
+formalobject.title.content = title, titleabbrev?
+# Redeclaration placeholder ............................................
+
+# For redeclaring entities that are declared after this point while
+# retaining their references to the entities that are declared before
+# this point
+
+# Object-level mixtures ................................................
+
+#                       list admn line synp para infm form cmpd gen  desc
+# Component mixture       X    X    X    X    X    X    X    X    X    X
+# Sidebar mixture         X    X    X    X    X    X    X    a    X
+# Footnote mixture        X         X    X    X    X
+# Example mixture         X         X    X    X    X
+# Highlights mixture      X    X              X
+# Paragraph mixture       X         X    X         X
+# Admonition mixture      X         X    X    X    X    X    b    c
+# Figure mixture                    X    X         X
+# Table entry mixture     X    X    X         X    d
+# Glossary def mixture    X         X    X    X    X         e
+# Legal notice mixture    X    X    X         X    f
+# 
+# a. Just Procedure; not Sidebar itself or MsgSet.
+# b. No MsgSet.
+# c. No Highlights.
+# d. Just Graphic; no other informal objects.
+# e. No Anchor, BridgeHead, or Highlights.
+# f. Just BlockQuote; no other informal objects.
+local.component.mix = notAllowed
+component.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | compound.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | local.component.mix
+local.sidebar.mix = notAllowed
+sidebar.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | genobj.class
+  | ndxterm.class
+  | beginpage
+  | local.sidebar.mix
+local.qandaset.mix = notAllowed
+qandaset.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | genobj.class
+  | ndxterm.class
+  | local.qandaset.mix
+local.revdescription.mix = notAllowed
+revdescription.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | genobj.class
+  | ndxterm.class
+  | local.revdescription.mix
+local.footnote.mix = notAllowed
+footnote.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | local.footnote.mix
+local.example.mix = notAllowed
+example.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | ndxterm.class
+  | beginpage
+  | local.example.mix
+local.highlights.mix = notAllowed
+highlights.mix =
+  list.class
+  | admon.class
+  | para.class
+  | ndxterm.class
+  | local.highlights.mix
+# %formal.class; is explicitly excluded from many contexts in which
+# paragraphs are used
+local.para.mix = notAllowed
+para.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | informal.class
+  | formal.class
+  | local.para.mix
+local.admon.mix = notAllowed
+admon.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | sidebar
+  | anchor
+  | bridgehead
+  | remark
+  | ndxterm.class
+  | beginpage
+  | local.admon.mix
+local.figure.mix = notAllowed
+figure.mix =
+  linespecific.class
+  | synop.class
+  | informal.class
+  | ndxterm.class
+  | beginpage
+  | local.figure.mix
+local.tabentry.mix = notAllowed
+tabentry.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | para.class
+  | graphic
+  | mediaobject
+  | local.tabentry.mix
+local.glossdef.mix = notAllowed
+glossdef.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | remark
+  | ndxterm.class
+  | beginpage
+  | local.glossdef.mix
+local.legalnotice.mix = notAllowed
+legalnotice.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | para.class
+  | blockquote
+  | ndxterm.class
+  | beginpage
+  | local.legalnotice.mix
+local.textobject.mix = notAllowed
+textobject.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | para.class
+  | blockquote
+  | local.textobject.mix
+local.mediaobject.mix = notAllowed
+mediaobject.mix =
+  videoobject
+  | audioobject
+  | imageobject
+  | textobject
+  | local.mediaobject.mix
+local.listpreamble.mix = notAllowed
+listpreamble.mix =
+  admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | local.listpreamble.mix
+# Character-level mixtures .............................................
+
+# sgml.features
+
+# not [sgml.features[
+
+# ]] not sgml.features
+
+#                     #PCD xref word link cptr base dnfo othr inob (synop)
+# para.char.mix         X    X    X    X    X    X    X    X    X
+# title.char.mix        X    X    X    X    X    X    X    X    X
+# ndxterm.char.mix      X    X    X    X    X    X    X    X    a
+# cptr.char.mix         X              X    X    X         X    a
+# smallcptr.char.mix    X                   b                   a
+# word.char.mix         X         c    X         X         X    a
+# docinfo.char.mix      X         d    X    b              X    a
+# 
+# a. Just InlineGraphic; no InlineEquation.
+# b. Just Replaceable; no other computer terms.
+# c. Just Emphasis and Trademark; no other word elements.
+# d. Just Acronym, Emphasis, and Trademark; no other word elements.
+
+# The DocBook TC may produce an official forms module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+forminlines.hook = notAllowed
+local.para.char.mix = notAllowed
+para.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | inlineobj.char.class
+  | synop.class
+  | ndxterm.class
+  | beginpage
+  | forminlines.hook
+  | local.para.char.mix
+local.title.char.mix = notAllowed
+title.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | inlineobj.char.class
+  | ndxterm.class
+  | local.title.char.mix
+local.ndxterm.char.mix = notAllowed
+ndxterm.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | local.ndxterm.char.mix
+local.cptr.char.mix = notAllowed
+cptr.char.mix =
+  text
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | beginpage
+  | local.cptr.char.mix
+local.smallcptr.char.mix = notAllowed
+smallcptr.char.mix =
+  text
+  | replaceable
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | beginpage
+  | local.smallcptr.char.mix
+local.word.char.mix = notAllowed
+word.char.mix =
+  text
+  | acronym
+  | emphasis
+  | trademark
+  | link.char.class
+  | base.char.class
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | beginpage
+  | local.word.char.mix
+local.docinfo.char.mix = notAllowed
+docinfo.char.mix =
+  text
+  | link.char.class
+  | emphasis
+  | trademark
+  | replaceable
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | local.docinfo.char.mix
+# ENTITY % bibliocomponent.mix (see Bibliographic section, below)
+
+# ENTITY % person.ident.mix (see Bibliographic section, below)
+
+# ......................................................................
+
+# Entities for attributes and attribute components .....................
+
+# Effectivity attributes ...............................................
+
+# Arch: Computer or chip architecture to which element applies; no
+# default
+arch.attrib = attribute arch { text }?
+# Condition: General-purpose effectivity attribute
+condition.attrib = attribute condition { text }?
+# Conformance: Standards conformance characteristics
+conformance.attrib = attribute conformance { xsd:NMTOKENS }?
+# OS: Operating system to which element applies; no default
+os.attrib = attribute os { text }?
+# Revision: Editorial revision to which element belongs; no default
+revision.attrib = attribute revision { text }?
+# Security: Security classification; no default
+security.attrib = attribute security { text }?
+# UserLevel: Level of user experience to which element applies; no
+# default
+userlevel.attrib = attribute userlevel { text }?
+# Vendor: Computer vendor to which element applies; no default
+vendor.attrib = attribute vendor { text }?
+local.effectivity.attrib = empty
+effectivity.attrib =
+  arch.attrib,
+  condition.attrib,
+  conformance.attrib,
+  os.attrib,
+  revision.attrib,
+  security.attrib,
+  userlevel.attrib,
+  vendor.attrib,
+  local.effectivity.attrib
+# Common attributes ....................................................
+
+# Id: Unique identifier of element; no default
+id.attrib = attribute id { xsd:ID }?
+# Id: Unique identifier of element; a value must be supplied; no
+# default
+idreq.attrib = attribute id { xsd:ID }
+# Lang: Indicator of language in which element is written, for
+# translation, character set management, etc.; no default
+lang.attrib = attribute lang { text }?
+# Remap: Previous role of element before conversion; no default
+remap.attrib = attribute remap { text }?
+# Role: New role of element in local environment; no default
+role.attrib = attribute role { text }?
+# XRefLabel: Alternate labeling string for XRef text generation;
+# default is usually title or other appropriate label text already
+# contained in element
+xreflabel.attrib = attribute xreflabel { text }?
+# RevisionFlag: Revision status of element; default is that element
+# wasn't revised
+revisionflag.attrib =
+  attribute revisionflag { "changed" | "added" | "deleted" | "off" }?
+local.common.attrib = empty
+# Role is included explicitly on each element
+common.attrib =
+  id.attrib,
+  lang.attrib,
+  remap.attrib,
+  xreflabel.attrib,
+  revisionflag.attrib,
+  effectivity.attrib,
+  local.common.attrib
+# Role is included explicitly on each element
+idreq.common.attrib =
+  idreq.attrib,
+  lang.attrib,
+  remap.attrib,
+  xreflabel.attrib,
+  revisionflag.attrib,
+  effectivity.attrib,
+  local.common.attrib
+# Semi-common attributes and other attribute entities ..................
+local.graphics.attrib = empty
+# EntityRef: Name of an external entity containing the content
+# of the graphic
+
+# FileRef: Filename, qualified by a pathname if desired,
+# designating the file containing the content of the graphic
+
+# Format: Notation of the element content, if any
+
+# SrcCredit: Information about the source of the Graphic
+
+# Width: Same as CALS reprowid (desired width)
+
+# Depth: Same as CALS reprodep (desired depth)
+
+# Align: Same as CALS hplace with 'none' removed; #IMPLIED means
+# application-specific
+
+# Scale: Conflation of CALS hscale and vscale
+
+# Scalefit: Same as CALS scalefit
+graphics.attrib =
+  attribute entityref { xsd:ENTITY }?,
+  attribute fileref { text }?,
+  attribute format { notation.class }?,
+  attribute srccredit { text }?,
+  attribute width { text }?,
+  attribute contentwidth { text }?,
+  attribute depth { text }?,
+  attribute contentdepth { text }?,
+  attribute align { "left" | "right" | "center" }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  attribute scale { text }?,
+  attribute scalefit { yesorno.attvals }?,
+  local.graphics.attrib
+local.keyaction.attrib = empty
+# Action: Key combination type; default is unspecified if one
+# child element, Simul if there is more than one; if value is
+# Other, the OtherAction attribute must have a nonempty value
+
+# OtherAction: User-defined key combination type
+keyaction.attrib =
+  attribute action {
+    "click" | "double-click" | "press" | "seq" | "simul" | "other"
+  }?,
+  attribute otheraction { text }?,
+  local.keyaction.attrib
+# Label: Identifying number or string; default is usually the
+# appropriate number or string autogenerated by a formatter
+label.attrib = attribute label { text }?
+# Format: whether element is assumed to contain significant white
+# space
+linespecific.attrib =
+  [ a:defaultValue = "linespecific" ]
+  attribute format { "linespecific" }?,
+  attribute linenumbering { "numbered" | "unnumbered" }?
+# Linkend: link to related information; no default
+linkend.attrib = attribute linkend { xsd:IDREF }?
+# Linkend: required link to related information
+linkendreq.attrib = attribute linkend { xsd:IDREF }
+# Linkends: link to one or more sets of related information; no
+# default
+linkends.attrib = attribute linkends { xsd:IDREFS }?
+local.mark.attrib = empty
+mark.attrib =
+  attribute mark { text }?,
+  local.mark.attrib
+# MoreInfo: whether element's content has an associated RefEntry
+moreinfo.attrib =
+  [ a:defaultValue = "none" ]
+  attribute moreinfo { "refentry" | "none" }?
+# Pagenum: number of page on which element appears; no default
+pagenum.attrib = attribute pagenum { text }?
+local.status.attrib = empty
+# Status: Editorial or publication status of the element
+# it applies to, such as "in review" or "approved for distribution"
+status.attrib =
+  attribute status { text }?,
+  local.status.attrib
+# Width: width of the longest line in the element to which it
+# pertains, in number of characters
+width.attrib = attribute width { text }?
+# ......................................................................
+
+# Title elements .......................................................
+local.title.attrib = empty
+title.role.attrib = role.attrib
+title = element title { title.attlist, title.char.mix* }
+# end of title.element
+title.attlist &=
+  pagenum.attrib, common.attrib, title.role.attrib, local.title.attrib
+# end of title.attlist
+
+# end of title.module
+local.titleabbrev.attrib = empty
+titleabbrev.role.attrib = role.attrib
+titleabbrev =
+  element titleabbrev { titleabbrev.attlist, title.char.mix* }
+# end of titleabbrev.element
+titleabbrev.attlist &=
+  common.attrib, titleabbrev.role.attrib, local.titleabbrev.attrib
+# end of titleabbrev.attlist
+
+# end of titleabbrev.module
+local.subtitle.attrib = empty
+subtitle.role.attrib = role.attrib
+subtitle = element subtitle { subtitle.attlist, title.char.mix* }
+# end of subtitle.element
+subtitle.attlist &=
+  common.attrib, subtitle.role.attrib, local.subtitle.attrib
+# end of subtitle.attlist
+
+# end of subtitle.module
+
+# ......................................................................
+
+# Bibliographic entities and elements ..................................
+
+# The bibliographic elements are typically used in the document
+# hierarchy. They do not appear in content models of information
+# pool elements.  See also the document information elements,
+# below.
+local.person.ident.mix = notAllowed
+person.ident.mix =
+  honorific
+  | firstname
+  | surname
+  | lineage
+  | othername
+  | affiliation
+  | authorblurb
+  | contrib
+  | local.person.ident.mix
+local.bibliocomponent.mix = notAllowed
+bibliocomponent.mix =
+  abbrev
+  | abstract
+  | address
+  | artpagenums
+  | author
+  | authorgroup
+  | authorinitials
+  | bibliomisc
+  | biblioset
+  | collab
+  | confgroup
+  | contractnum
+  | contractsponsor
+  | copyright
+  | corpauthor
+  | corpname
+  | date
+  | edition
+  | editor
+  | invpartnumber
+  | isbn
+  | issn
+  | issuenum
+  | orgname
+  | biblioid
+  | citebiblioid
+  | bibliosource
+  | bibliorelation
+  | bibliocoverage
+  | othercredit
+  | pagenums
+  | printhistory
+  | productname
+  | productnumber
+  | pubdate
+  | publisher
+  | publishername
+  | pubsnumber
+  | releaseinfo
+  | revhistory
+  | seriesvolnums
+  | subtitle
+  | title
+  | titleabbrev
+  | volumenum
+  | citetitle
+  | personname
+  | person.ident.mix
+  | ndxterm.class
+  | local.bibliocomponent.mix
+# I don't think this is well placed, but it needs to be here because of
+
+# the reference to bibliocomponent.mix
+local.info.class = notAllowed
+info.class =
+  graphic
+  | mediaobject
+  | legalnotice
+  | modespec
+  | subjectset
+  | keywordset
+  | itermset
+  | bibliocomponent.mix
+  | local.info.class
+local.biblioentry.attrib = empty
+biblioentry.role.attrib = role.attrib
+biblioentry =
+  element biblioentry {
+    biblioentry.attlist, (articleinfo | bibliocomponent.mix)+
+  }
+# end of biblioentry.element
+biblioentry.attlist &=
+  common.attrib, biblioentry.role.attrib, local.biblioentry.attrib
+# end of biblioentry.attlist
+
+# end of biblioentry.module
+local.bibliomixed.attrib = empty
+bibliomixed.role.attrib = role.attrib
+bibliomixed =
+  element bibliomixed {
+    bibliomixed.attlist, (text | bibliocomponent.mix | bibliomset)*
+  }
+# end of bibliomixed.element
+bibliomixed.attlist &=
+  common.attrib, bibliomixed.role.attrib, local.bibliomixed.attrib
+# end of bibliomixed.attlist
+
+# end of bibliomixed.module
+local.articleinfo.attrib = empty
+articleinfo.role.attrib = role.attrib
+articleinfo = element articleinfo { articleinfo.attlist, info.class+ }
+# end of articleinfo.element
+articleinfo.attlist &=
+  common.attrib, articleinfo.role.attrib, local.articleinfo.attrib
+# end of articleinfo.attlist
+
+# end of articleinfo.module
+local.biblioset.attrib = empty
+biblioset.role.attrib = role.attrib
+biblioset =
+  element biblioset { biblioset.attlist, bibliocomponent.mix+ }
+# end of biblioset.element
+
+# Relation: Relationship of elements contained within BiblioSet
+biblioset.attlist &=
+  attribute relation { text }?,
+  common.attrib,
+  biblioset.role.attrib,
+  local.biblioset.attrib
+# end of biblioset.attlist
+
+# end of biblioset.module
+bibliomset.role.attrib = role.attrib
+local.bibliomset.attrib = empty
+bibliomset =
+  element bibliomset {
+    bibliomset.attlist, (text | bibliocomponent.mix | bibliomset)*
+  }
+# end of bibliomset.element
+
+# Relation: Relationship of elements contained within BiblioMSet
+bibliomset.attlist &=
+  attribute relation { text }?,
+  common.attrib,
+  bibliomset.role.attrib,
+  local.bibliomset.attrib
+# end of bibliomset.attlist
+
+# end of bibliomset.module
+local.bibliomisc.attrib = empty
+bibliomisc.role.attrib = role.attrib
+bibliomisc = element bibliomisc { bibliomisc.attlist, para.char.mix* }
+# end of bibliomisc.element
+bibliomisc.attlist &=
+  common.attrib, bibliomisc.role.attrib, local.bibliomisc.attrib
+# end of bibliomisc.attlist
+
+# end of bibliomisc.module
+
+# ......................................................................
+
+# Subject, Keyword, and ITermSet elements ..............................
+local.subjectset.attrib = empty
+subjectset.role.attrib = role.attrib
+subjectset = element subjectset { subjectset.attlist, subject+ }
+# end of subjectset.element
+
+# Scheme: Controlled vocabulary employed in SubjectTerms
+subjectset.attlist &=
+  attribute scheme { xsd:NMTOKEN }?,
+  common.attrib,
+  subjectset.role.attrib,
+  local.subjectset.attrib
+# end of subjectset.attlist
+
+# end of subjectset.module
+local.subject.attrib = empty
+subject.role.attrib = role.attrib
+subject = element subject { subject.attlist, subjectterm+ }
+# end of subject.element
+
+# Weight: Ranking of this group of SubjectTerms relative
+# to others, 0 is low, no highest value specified
+subject.attlist &=
+  attribute weight { text }?,
+  common.attrib,
+  subject.role.attrib,
+  local.subject.attrib
+# end of subject.attlist
+
+# end of subject.module
+local.subjectterm.attrib = empty
+subjectterm.role.attrib = role.attrib
+subjectterm = element subjectterm { subjectterm.attlist, text }
+# end of subjectterm.element
+subjectterm.attlist &=
+  common.attrib, subjectterm.role.attrib, local.subjectterm.attrib
+# end of subjectterm.attlist
+
+# end of subjectterm.module
+
+# end of subjectset.content.module
+local.keywordset.attrib = empty
+keywordset.role.attrib = role.attrib
+keywordset = element keywordset { keywordset.attlist, keyword+ }
+# end of keywordset.element
+keywordset.attlist &=
+  common.attrib, keywordset.role.attrib, local.keywordset.attrib
+# end of keywordset.attlist
+
+# end of keywordset.module
+local.keyword.attrib = empty
+keyword.role.attrib = role.attrib
+keyword = element keyword { keyword.attlist, text }
+# end of keyword.element
+keyword.attlist &=
+  common.attrib, keyword.role.attrib, local.keyword.attrib
+# end of keyword.attlist
+
+# end of keyword.module
+
+# end of keywordset.content.module
+local.itermset.attrib = empty
+itermset.role.attrib = role.attrib
+itermset = element itermset { itermset.attlist, indexterm+ }
+# end of itermset.element
+itermset.attlist &=
+  common.attrib, itermset.role.attrib, local.itermset.attrib
+# end of itermset.attlist
+
+# end of itermset.module
+
+# Bibliographic info for "blocks"
+local.blockinfo.attrib = empty
+blockinfo.role.attrib = role.attrib
+blockinfo = element blockinfo { blockinfo.attlist, info.class+ }
+# end of blockinfo.element
+blockinfo.attlist &=
+  common.attrib, blockinfo.role.attrib, local.blockinfo.attrib
+# end of blockinfo.attlist
+
+# end of blockinfo.module
+
+# ......................................................................
+
+# Compound (section-ish) elements ......................................
+
+# Message set ......................
+local.msgset.attrib = empty
+msgset.role.attrib = role.attrib
+msgset =
+  element msgset {
+    msgset.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    (msgentry+ | simplemsgentry+)
+  }
+# end of msgset.element
+msgset.attlist &= common.attrib, msgset.role.attrib, local.msgset.attrib
+# end of msgset.attlist
+
+# end of msgset.module
+local.msgentry.attrib = empty
+msgentry.role.attrib = role.attrib
+msgentry =
+  element msgentry { msgentry.attlist, msg+, msginfo?, msgexplan* }
+# end of msgentry.element
+msgentry.attlist &=
+  common.attrib, msgentry.role.attrib, local.msgentry.attrib
+# end of msgentry.attlist
+
+# end of msgentry.module
+local.simplemsgentry.attrib = empty
+simplemsgentry.role.attrib = role.attrib
+simplemsgentry =
+  element simplemsgentry { simplemsgentry.attlist, msgtext, msgexplan+ }
+# end of simplemsgentry.element
+simplemsgentry.attlist &=
+  attribute audience { text }?,
+  attribute level { text }?,
+  attribute origin { text }?,
+  common.attrib,
+  simplemsgentry.role.attrib,
+  local.simplemsgentry.attrib
+# end of simplemsgentry.attlist
+
+# end of simplemsgentry.module
+local.msg.attrib = empty
+msg.role.attrib = role.attrib
+msg = element msg { msg.attlist, title?, msgmain, (msgsub | msgrel)* }
+# end of msg.element
+msg.attlist &= common.attrib, msg.role.attrib, local.msg.attrib
+# end of msg.attlist
+
+# end of msg.module
+local.msgmain.attrib = empty
+msgmain.role.attrib = role.attrib
+msgmain = element msgmain { msgmain.attlist, title?, msgtext }
+# end of msgmain.element
+msgmain.attlist &=
+  common.attrib, msgmain.role.attrib, local.msgmain.attrib
+# end of msgmain.attlist
+
+# end of msgmain.module
+local.msgsub.attrib = empty
+msgsub.role.attrib = role.attrib
+msgsub = element msgsub { msgsub.attlist, title?, msgtext }
+# end of msgsub.element
+msgsub.attlist &= common.attrib, msgsub.role.attrib, local.msgsub.attrib
+# end of msgsub.attlist
+
+# end of msgsub.module
+local.msgrel.attrib = empty
+msgrel.role.attrib = role.attrib
+msgrel = element msgrel { msgrel.attlist, title?, msgtext }
+# end of msgrel.element
+msgrel.attlist &= common.attrib, msgrel.role.attrib, local.msgrel.attrib
+# end of msgrel.attlist
+
+# end of msgrel.module
+
+#  MsgText (defined in the Inlines section, below)
+local.msginfo.attrib = empty
+msginfo.role.attrib = role.attrib
+msginfo =
+  element msginfo { msginfo.attlist, (msglevel | msgorig | msgaud)* }
+# end of msginfo.element
+msginfo.attlist &=
+  common.attrib, msginfo.role.attrib, local.msginfo.attrib
+# end of msginfo.attlist
+
+# end of msginfo.module
+local.msglevel.attrib = empty
+msglevel.role.attrib = role.attrib
+msglevel = element msglevel { msglevel.attlist, smallcptr.char.mix* }
+# end of msglevel.element
+msglevel.attlist &=
+  common.attrib, msglevel.role.attrib, local.msglevel.attrib
+# end of msglevel.attlist
+
+# end of msglevel.module
+local.msgorig.attrib = empty
+msgorig.role.attrib = role.attrib
+msgorig = element msgorig { msgorig.attlist, smallcptr.char.mix* }
+# end of msgorig.element
+msgorig.attlist &=
+  common.attrib, msgorig.role.attrib, local.msgorig.attrib
+# end of msgorig.attlist
+
+# end of msgorig.module
+local.msgaud.attrib = empty
+msgaud.role.attrib = role.attrib
+msgaud = element msgaud { msgaud.attlist, para.char.mix* }
+# end of msgaud.element
+msgaud.attlist &= common.attrib, msgaud.role.attrib, local.msgaud.attrib
+# end of msgaud.attlist
+
+# end of msgaud.module
+local.msgexplan.attrib = empty
+msgexplan.role.attrib = role.attrib
+msgexplan =
+  element msgexplan { msgexplan.attlist, title?, component.mix+ }
+# end of msgexplan.element
+msgexplan.attlist &=
+  common.attrib, msgexplan.role.attrib, local.msgexplan.attrib
+# end of msgexplan.attlist
+
+# end of msgexplan.module
+
+# end of msgset.content.module
+
+# QandASet ........................
+local.qandaset.attrib = empty
+qandaset.role.attrib = role.attrib
+qandaset =
+  element qandaset {
+    qandaset.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    qandaset.mix*,
+    (qandadiv+ | qandaentry+)
+  }
+# end of qandaset.element
+qandaset.attlist &=
+  attribute defaultlabel { "qanda" | "number" | "none" }?,
+  common.attrib,
+  qandaset.role.attrib,
+  local.qandaset.attrib
+# end of qandaset.attlist
+
+# end of qandaset.module
+local.qandadiv.attrib = empty
+qandadiv.role.attrib = role.attrib
+qandadiv =
+  element qandadiv {
+    qandadiv.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    qandaset.mix*,
+    (qandadiv+ | qandaentry+)
+  }
+# end of qandadiv.element
+qandadiv.attlist &=
+  common.attrib, qandadiv.role.attrib, local.qandadiv.attrib
+# end of qandadiv.attlist
+
+# end of qandadiv.module
+local.qandaentry.attrib = empty
+qandaentry.role.attrib = role.attrib
+qandaentry =
+  element qandaentry {
+    qandaentry.attlist, blockinfo?, revhistory?, question, answer*
+  }
+# end of qandaentry.element
+qandaentry.attlist &=
+  common.attrib, qandaentry.role.attrib, local.qandaentry.attrib
+# end of qandaentry.attlist
+
+# end of qandaentry.module
+local.question.attrib = empty
+question.role.attrib = role.attrib
+question = element question { question.attlist, label?, qandaset.mix+ }
+# end of question.element
+question.attlist &=
+  common.attrib, question.role.attrib, local.question.attrib
+# end of question.attlist
+
+# end of question.module
+local.answer.attrib = empty
+answer.role.attrib = role.attrib
+answer =
+  element answer { answer.attlist, label?, qandaset.mix*, qandaentry* }
+# end of answer.element
+answer.attlist &= common.attrib, answer.role.attrib, local.answer.attrib
+# end of answer.attlist
+
+# end of answer.module
+local.label.attrib = empty
+label.role.attrib = role.attrib
+label = element label { label.attlist, word.char.mix* }
+# end of label.element
+label.attlist &= common.attrib, label.role.attrib, local.label.attrib
+# end of label.attlist
+
+# end of label.module
+
+# end of qandaset.content.module
+
+# Procedure ........................
+local.procedure.attrib = empty
+procedure.role.attrib = role.attrib
+procedure =
+  element procedure {
+    procedure.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    component.mix*,
+    step+
+  }
+# end of procedure.element
+procedure.attlist &=
+  common.attrib, procedure.role.attrib, local.procedure.attrib
+# end of procedure.attlist
+
+# end of procedure.module
+local.step.attrib = empty
+step.role.attrib = role.attrib
+step =
+  element step {
+    step.attlist,
+    title?,
+    ((component.mix+, (substeps, component.mix*)?)
+     | (substeps, component.mix*))
+  }
+# end of step.element
+
+# Performance: Whether the Step must be performed
+
+# not #REQUIRED!
+step.attlist &=
+  [ a:defaultValue = "required" ]
+  attribute performance { "optional" | "required" }?,
+  common.attrib,
+  step.role.attrib,
+  local.step.attrib
+# end of step.attlist
+
+# end of step.module
+local.substeps.attrib = empty
+substeps.role.attrib = role.attrib
+substeps = element substeps { substeps.attlist, step+ }
+# end of substeps.element
+
+# Performance: whether entire set of substeps must be performed
+
+# not #REQUIRED!
+substeps.attlist &=
+  [ a:defaultValue = "required" ]
+  attribute performance { "optional" | "required" }?,
+  common.attrib,
+  substeps.role.attrib,
+  local.substeps.attrib
+# end of substeps.attlist
+
+# end of substeps.module
+
+# end of procedure.content.module
+
+# Sidebar ..........................
+local.sidebarinfo.attrib = empty
+sidebarinfo.role.attrib = role.attrib
+sidebarinfo = element sidebarinfo { sidebarinfo.attlist, info.class+ }
+# end of sidebarinfo.element
+sidebarinfo.attlist &=
+  common.attrib, sidebarinfo.role.attrib, local.sidebarinfo.attrib
+# end of sidebarinfo.attlist
+
+# end of sidebarinfo.module
+local.sidebar.attrib = empty
+sidebar.role.attrib = role.attrib
+sidebar =
+  element sidebar {
+    sidebar.attlist,
+    sidebarinfo?,
+    formalobject.title.content?,
+    sidebar.mix+
+  }
+# end of sidebar.element
+sidebar.attlist &=
+  common.attrib, sidebar.role.attrib, local.sidebar.attrib
+# end of sidebar.attlist
+
+# end of sidebar.module
+
+# end of sidebar.content.model
+
+# ......................................................................
+
+# Paragraph-related elements ...........................................
+local.abstract.attrib = empty
+abstract.role.attrib = role.attrib
+abstract = element abstract { abstract.attlist, title?, para.class+ }
+# end of abstract.element
+abstract.attlist &=
+  common.attrib, abstract.role.attrib, local.abstract.attrib
+# end of abstract.attlist
+
+# end of abstract.module
+local.authorblurb.attrib = empty
+authorblurb.role.attrib = role.attrib
+authorblurb =
+  element authorblurb { authorblurb.attlist, title?, para.class+ }
+# end of authorblurb.element
+authorblurb.attlist &=
+  common.attrib, authorblurb.role.attrib, local.authorblurb.attrib
+# end of authorblurb.attlist
+
+# end of authorblurb.module
+local.personblurb.attrib = empty
+personblurb.role.attrib = role.attrib
+personblurb =
+  element personblurb { personblurb.attlist, title?, para.class+ }
+# end of personblurb.element
+personblurb.attlist &=
+  common.attrib, personblurb.role.attrib, local.personblurb.attrib
+# end of personblurb.attlist
+
+# end of personblurb.module
+local.blockquote.attrib = empty
+blockquote.role.attrib = role.attrib
+blockquote =
+  element blockquote {
+    blockquote.attlist, title?, attribution?, component.mix+
+  }
+# end of blockquote.element
+blockquote.attlist &=
+  common.attrib, blockquote.role.attrib, local.blockquote.attrib
+# end of blockquote.attlist
+
+# end of blockquote.module
+local.attribution.attrib = empty
+attribution.role.attrib = role.attrib
+attribution =
+  element attribution { attribution.attlist, para.char.mix* }
+# end of attribution.element
+attribution.attlist &=
+  common.attrib, attribution.role.attrib, local.attribution.attrib
+# end of attribution.attlist
+
+# end of attribution.module
+local.bridgehead.attrib = empty
+bridgehead.role.attrib = role.attrib
+bridgehead = element bridgehead { bridgehead.attlist, title.char.mix* }
+# end of bridgehead.element
+
+# Renderas: Indicates the format in which the BridgeHead
+# should appear
+bridgehead.attlist &=
+  attribute renderas {
+    "other" | "sect1" | "sect2" | "sect3" | "sect4" | "sect5"
+  }?,
+  common.attrib,
+  bridgehead.role.attrib,
+  local.bridgehead.attrib
+# end of bridgehead.attlist
+
+# end of bridgehead.module
+local.remark.attrib = empty
+remark.role.attrib = role.attrib
+remark = element remark { remark.attlist, para.char.mix* }
+# end of remark.element
+remark.attlist &= common.attrib, remark.role.attrib, local.remark.attrib
+# end of remark.attlist
+
+# end of remark.module
+local.epigraph.attrib = empty
+epigraph.role.attrib = role.attrib
+epigraph =
+  element epigraph {
+    epigraph.attlist, attribution?, (para.class | literallayout)+
+  }
+# end of epigraph.element
+epigraph.attlist &=
+  common.attrib, epigraph.role.attrib, local.epigraph.attrib
+# end of epigraph.attlist
+
+#  Attribution (defined above)
+
+# end of epigraph.module
+local.footnote.attrib = empty
+footnote.role.attrib = role.attrib
+footnote = element footnote { footnote.attlist, footnote.mix+ }
+# end of footnote.element
+footnote.attlist &=
+  label.attrib,
+  common.attrib,
+  footnote.role.attrib,
+  local.footnote.attrib
+# end of footnote.attlist
+
+# end of footnote.module
+local.highlights.attrib = empty
+highlights.role.attrib = role.attrib
+highlights = element highlights { highlights.attlist, highlights.mix+ }
+# end of highlights.element
+highlights.attlist &=
+  common.attrib, highlights.role.attrib, local.highlights.attrib
+# end of highlights.attlist
+
+# end of highlights.module
+local.formalpara.attrib = empty
+formalpara.role.attrib = role.attrib
+formalpara =
+  element formalpara { formalpara.attlist, title, ndxterm.class*, para }
+# end of formalpara.element
+formalpara.attlist &=
+  common.attrib, formalpara.role.attrib, local.formalpara.attrib
+# end of formalpara.attlist
+
+# end of formalpara.module
+local.para.attrib = empty
+para.role.attrib = role.attrib
+para = element para { para.attlist, (para.char.mix | para.mix)* }
+# end of para.element
+para.attlist &= common.attrib, para.role.attrib, local.para.attrib
+# end of para.attlist
+
+# end of para.module
+local.simpara.attrib = empty
+simpara.role.attrib = role.attrib
+simpara = element simpara { simpara.attlist, para.char.mix* }
+# end of simpara.element
+simpara.attlist &=
+  common.attrib, simpara.role.attrib, local.simpara.attrib
+# end of simpara.attlist
+
+# end of simpara.module
+local.admon.attrib = empty
+admon.role.attrib = role.attrib
+caution = element caution { caution.attlist, title?, admon.mix+ }
+# end of caution.element
+caution.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of caution.attlist
+important = element important { important.attlist, title?, admon.mix+ }
+# end of important.element
+important.attlist &=
+  common.attrib, admon.role.attrib, local.admon.attrib
+# end of important.attlist
+note = element note { note.attlist, title?, admon.mix+ }
+# end of note.element
+note.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of note.attlist
+tip = element tip { tip.attlist, title?, admon.mix+ }
+# end of tip.element
+tip.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of tip.attlist
+warning = element warning { warning.attlist, title?, admon.mix+ }
+# end of warning.element
+warning.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of warning.attlist
+
+# end of admon.module
+
+# ......................................................................
+
+# Lists ................................................................
+
+# GlossList ........................
+local.glosslist.attrib = empty
+glosslist.role.attrib = role.attrib
+glosslist = element glosslist { glosslist.attlist, glossentry+ }
+# end of glosslist.element
+glosslist.attlist &=
+  common.attrib, glosslist.role.attrib, local.glosslist.attrib
+# end of glosslist.attlist
+
+# end of glosslist.module
+local.glossentry.attrib = empty
+glossentry.role.attrib = role.attrib
+glossentry =
+  element glossentry {
+    glossentry.attlist,
+    glossterm,
+    acronym?,
+    abbrev?,
+    ndxterm.class*,
+    revhistory?,
+    (glosssee | glossdef+)
+  }
+# end of glossentry.element
+
+# SortAs: String by which the GlossEntry is to be sorted
+# (alphabetized) in lieu of its proper content
+glossentry.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  glossentry.role.attrib,
+  local.glossentry.attrib
+# end of glossentry.attlist
+
+# end of glossentry.module
+
+#  GlossTerm (defined in the Inlines section, below)
+local.glossdef.attrib = empty
+glossdef.role.attrib = role.attrib
+glossdef =
+  element glossdef { glossdef.attlist, glossdef.mix+, glossseealso* }
+# end of glossdef.element
+
+# Subject: List of subjects; keywords for the definition
+glossdef.attlist &=
+  attribute subject { text }?,
+  common.attrib,
+  glossdef.role.attrib,
+  local.glossdef.attrib
+# end of glossdef.attlist
+
+# end of glossdef.module
+local.glosssee.attrib = empty
+glosssee.role.attrib = role.attrib
+glosssee = element glosssee { glosssee.attlist, para.char.mix* }
+# end of glosssee.element
+
+# OtherTerm: Reference to the GlossEntry whose GlossTerm
+# should be displayed at the point of the GlossSee
+glosssee.attlist &=
+  attribute otherterm { xsd:IDREF }?,
+  common.attrib,
+  glosssee.role.attrib,
+  local.glosssee.attrib
+# end of glosssee.attlist
+
+# end of glosssee.module
+local.glossseealso.attrib = empty
+glossseealso.role.attrib = role.attrib
+glossseealso =
+  element glossseealso { glossseealso.attlist, para.char.mix* }
+# end of glossseealso.element
+
+# OtherTerm: Reference to the GlossEntry whose GlossTerm
+# should be displayed at the point of the GlossSeeAlso
+glossseealso.attlist &=
+  attribute otherterm { xsd:IDREF }?,
+  common.attrib,
+  glossseealso.role.attrib,
+  local.glossseealso.attrib
+# end of glossseealso.attlist
+
+# end of glossseealso.module
+
+# end of glossentry.content.module
+
+# ItemizedList and OrderedList .....
+local.itemizedlist.attrib = empty
+itemizedlist.role.attrib = role.attrib
+itemizedlist =
+  element itemizedlist {
+    itemizedlist.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    listpreamble.mix*,
+    listitem+
+  }
+# end of itemizedlist.element
+
+# Spacing: Whether the vertical space in the list should be
+# compressed
+
+# Mark: Keyword, e.g., bullet, dash, checkbox, none;
+# list of keywords and defaults are implementation specific
+itemizedlist.attlist &=
+  attribute spacing { "normal" | "compact" }?,
+  mark.attrib,
+  common.attrib,
+  itemizedlist.role.attrib,
+  local.itemizedlist.attrib
+# end of itemizedlist.attlist
+
+# end of itemizedlist.module
+local.orderedlist.attrib = empty
+orderedlist.role.attrib = role.attrib
+orderedlist =
+  element orderedlist {
+    orderedlist.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    listpreamble.mix*,
+    listitem+
+  }
+# end of orderedlist.element
+
+# Numeration: Style of ListItem numbered; default is expected
+# to be Arabic
+
+# InheritNum: Specifies for a nested list that the numbering
+# of ListItems should include the number of the item
+# within which they are nested (e.g., 1a and 1b within 1,
+# rather than a and b)
+
+# Continuation: Where list numbering begins afresh (Restarts,
+# the default) or continues that of the immediately preceding
+# list (Continues)
+
+# Spacing: Whether the vertical space in the list should be
+# compressed
+orderedlist.attlist &=
+  attribute numeration {
+    "arabic" | "upperalpha" | "loweralpha" | "upperroman" | "lowerroman"
+  }?,
+  [ a:defaultValue = "ignore" ]
+  attribute inheritnum { "inherit" | "ignore" }?,
+  [ a:defaultValue = "restarts" ]
+  attribute continuation { "continues" | "restarts" }?,
+  attribute spacing { "normal" | "compact" }?,
+  common.attrib,
+  orderedlist.role.attrib,
+  local.orderedlist.attrib
+# end of orderedlist.attlist
+
+# end of orderedlist.module
+local.listitem.attrib = empty
+listitem.role.attrib = role.attrib
+listitem = element listitem { listitem.attlist, component.mix+ }
+# end of listitem.element
+
+# Override: Indicates the mark to be used for this ListItem
+# instead of the default mark or the mark specified by
+# the Mark attribute on the enclosing ItemizedList
+listitem.attlist &=
+  attribute override { text }?,
+  common.attrib,
+  listitem.role.attrib,
+  local.listitem.attrib
+# end of listitem.attlist
+
+# end of listitem.module
+
+# SegmentedList ....................
+local.segmentedlist.attrib = empty
+segmentedlist.role.attrib = role.attrib
+segmentedlist =
+  element segmentedlist {
+    segmentedlist.attlist,
+    formalobject.title.content?,
+    segtitle+,
+    seglistitem+
+  }
+# end of segmentedlist.element
+segmentedlist.attlist &=
+  common.attrib, segmentedlist.role.attrib, local.segmentedlist.attrib
+# end of segmentedlist.attlist
+
+# end of segmentedlist.module
+local.segtitle.attrib = empty
+segtitle.role.attrib = role.attrib
+segtitle = element segtitle { segtitle.attlist, title.char.mix* }
+# end of segtitle.element
+segtitle.attlist &=
+  common.attrib, segtitle.role.attrib, local.segtitle.attrib
+# end of segtitle.attlist
+
+# end of segtitle.module
+local.seglistitem.attrib = empty
+seglistitem.role.attrib = role.attrib
+seglistitem = element seglistitem { seglistitem.attlist, seg+ }
+# end of seglistitem.element
+seglistitem.attlist &=
+  common.attrib, seglistitem.role.attrib, local.seglistitem.attrib
+# end of seglistitem.attlist
+
+# end of seglistitem.module
+local.seg.attrib = empty
+seg.role.attrib = role.attrib
+seg = element seg { seg.attlist, para.char.mix* }
+# end of seg.element
+seg.attlist &= common.attrib, seg.role.attrib, local.seg.attrib
+# end of seg.attlist
+
+# end of seg.module
+
+# end of segmentedlist.content.module
+
+# SimpleList .......................
+local.simplelist.attrib = empty
+simplelist.role.attrib = role.attrib
+simplelist = element simplelist { simplelist.attlist, member+ }
+# end of simplelist.element
+
+# Columns: The number of columns the array should contain
+
+# Type: How the Members of the SimpleList should be
+# formatted: Inline (members separated with commas etc.
+# inline), Vert (top to bottom in n Columns), or Horiz (in
+# the direction of text flow) in n Columns.  If Column
+# is 1 or implied, Type=Vert and Type=Horiz give the same
+# results.
+simplelist.attlist &=
+  attribute columns { text }?,
+  [ a:defaultValue = "vert" ]
+  attribute type { "inline" | "vert" | "horiz" }?,
+  common.attrib,
+  simplelist.role.attrib,
+  local.simplelist.attrib
+# end of simplelist.attlist
+
+# end of simplelist.module
+local.member.attrib = empty
+member.role.attrib = role.attrib
+member = element member { member.attlist, para.char.mix* }
+# end of member.element
+member.attlist &= common.attrib, member.role.attrib, local.member.attrib
+# end of member.attlist
+
+# end of member.module
+
+# end of simplelist.content.module
+
+# VariableList .....................
+local.variablelist.attrib = empty
+variablelist.role.attrib = role.attrib
+variablelist =
+  element variablelist {
+    variablelist.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    listpreamble.mix*,
+    varlistentry+
+  }
+# end of variablelist.element
+
+# TermLength: Length beyond which the presentation engine
+# may consider the Term too long and select an alternate
+# presentation of the Term and, or, its associated ListItem.
+variablelist.attlist &=
+  attribute termlength { text }?,
+  common.attrib,
+  variablelist.role.attrib,
+  local.variablelist.attrib
+# end of variablelist.attlist
+
+# end of variablelist.module
+local.varlistentry.attrib = empty
+varlistentry.role.attrib = role.attrib
+varlistentry =
+  element varlistentry { varlistentry.attlist, term+, listitem }
+# end of varlistentry.element
+varlistentry.attlist &=
+  common.attrib, varlistentry.role.attrib, local.varlistentry.attrib
+# end of varlistentry.attlist
+
+# end of varlistentry.module
+local.term.attrib = empty
+term.role.attrib = role.attrib
+term = element term { term.attlist, para.char.mix* }
+# end of term.element
+term.attlist &= common.attrib, term.role.attrib, local.term.attrib
+# end of term.attlist
+
+# end of term.module
+
+#  ListItem (defined above)
+
+# end of variablelist.content.module
+
+# CalloutList ......................
+local.calloutlist.attrib = empty
+calloutlist.role.attrib = role.attrib
+calloutlist =
+  element calloutlist {
+    calloutlist.attlist, formalobject.title.content?, callout+
+  }
+# end of calloutlist.element
+calloutlist.attlist &=
+  common.attrib, calloutlist.role.attrib, local.calloutlist.attrib
+# end of calloutlist.attlist
+
+# end of calloutlist.module
+local.callout.attrib = empty
+callout.role.attrib = role.attrib
+callout = element callout { callout.attlist, component.mix+ }
+# end of callout.element
+
+# AreaRefs: IDs of one or more Areas or AreaSets described
+# by this Callout
+callout.attlist &=
+  attribute arearefs { xsd:IDREFS },
+  common.attrib,
+  callout.role.attrib,
+  local.callout.attrib
+# end of callout.attlist
+
+# end of callout.module
+
+# end of calloutlist.content.module
+
+# ......................................................................
+
+# Objects ..............................................................
+
+# Examples etc. ....................
+local.example.attrib = empty
+example.role.attrib = role.attrib
+example =
+  element example {
+    example.attlist,
+    blockinfo?,
+    formalobject.title.content,
+    example.mix+
+  }
+# end of example.element
+example.attlist &=
+  label.attrib,
+  width.attrib,
+  common.attrib,
+  example.role.attrib,
+  local.example.attrib
+# end of example.attlist
+
+# end of example.module
+local.informalexample.attrib = empty
+informalexample.role.attrib = role.attrib
+informalexample =
+  element informalexample {
+    informalexample.attlist, blockinfo?, example.mix+
+  }
+# end of informalexample.element
+informalexample.attlist &=
+  width.attrib,
+  common.attrib,
+  informalexample.role.attrib,
+  local.informalexample.attrib
+# end of informalexample.attlist
+
+# end of informalexample.module
+local.programlistingco.attrib = empty
+programlistingco.role.attrib = role.attrib
+programlistingco =
+  element programlistingco {
+    programlistingco.attlist, areaspec, programlisting, calloutlist*
+  }
+# end of programlistingco.element
+programlistingco.attlist &=
+  common.attrib,
+  programlistingco.role.attrib,
+  local.programlistingco.attrib
+# end of programlistingco.attlist
+
+#  CalloutList (defined above in Lists)
+
+# end of informalexample.module
+local.areaspec.attrib = empty
+areaspec.role.attrib = role.attrib
+areaspec = element areaspec { areaspec.attlist, (area | areaset)+ }
+# end of areaspec.element
+
+# Units: global unit of measure in which coordinates in
+# this spec are expressed:
+# 
+# - CALSPair "x1,y1 x2,y2": lower-left and upper-right
+# coordinates in a rectangle describing repro area in which
+# graphic is placed, where X and Y dimensions are each some
+# number 0..10000 (taken from CALS graphic attributes)
+# 
+# - LineColumn "line column": line number and column number
+# at which to start callout text in "linespecific" content
+# 
+# - LineRange "startline endline": whole lines from startline
+# to endline in "linespecific" content
+# 
+# - LineColumnPair "line1 col1 line2 col2": starting and ending
+# points of area in "linespecific" content that starts at
+# first position and ends at second position (including the
+# beginnings of any intervening lines)
+# 
+# - Other: directive to look at value of OtherUnits attribute
+# to get implementation-specific keyword
+# 
+# The default is implementation-specific; usually dependent on
+# the parent element (GraphicCO gets CALSPair, ProgramListingCO
+# and ScreenCO get LineColumn)
+
+# OtherUnits: User-defined units
+areaspec.attlist &=
+  attribute units {
+    "calspair" | "linecolumn" | "linerange" | "linecolumnpair" | "other"
+  }?,
+  attribute otherunits { xsd:NMTOKEN }?,
+  common.attrib,
+  areaspec.role.attrib,
+  local.areaspec.attrib
+# end of areaspec.attlist
+
+# end of areaspec.module
+local.area.attrib = empty
+area.role.attrib = role.attrib
+area = element area { area.attlist, empty }
+# end of area.element
+
+# bug number/symbol override or initialization
+
+# to any related information
+
+# Units: unit of measure in which coordinates in this
+# area are expressed; inherits from AreaSet and AreaSpec
+
+# OtherUnits: User-defined units
+area.attlist &=
+  label.attrib,
+  linkends.attrib,
+  attribute units {
+    "calspair" | "linecolumn" | "linerange" | "linecolumnpair" | "other"
+  }?,
+  attribute otherunits { xsd:NMTOKEN }?,
+  attribute coords { text },
+  idreq.common.attrib,
+  area.role.attrib,
+  local.area.attrib
+# end of area.attlist
+
+# end of area.module
+local.areaset.attrib = empty
+areaset.role.attrib = role.attrib
+areaset = element areaset { areaset.attlist, area+ }
+# end of areaset.element
+
+# bug number/symbol override or initialization
+
+# Units: unit of measure in which coordinates in this
+# area are expressed; inherits from AreaSpec
+areaset.attlist &=
+  label.attrib,
+  attribute units {
+    "calspair" | "linecolumn" | "linerange" | "linecolumnpair" | "other"
+  }?,
+  attribute otherunits { xsd:NMTOKEN }?,
+  attribute coords { text },
+  idreq.common.attrib,
+  areaset.role.attrib,
+  local.areaset.attrib
+# end of areaset.attlist
+
+# end of areaset.module
+
+# end of areaspec.content.module
+local.programlisting.attrib = empty
+programlisting.role.attrib = role.attrib
+programlisting =
+  element programlisting {
+    programlisting.attlist,
+    (para.char.mix | co | coref | lineannotation | textobject)*
+  }
+# end of programlisting.element
+programlisting.attlist &=
+  width.attrib,
+  linespecific.attrib,
+  common.attrib,
+  programlisting.role.attrib,
+  local.programlisting.attrib
+# end of programlisting.attlist
+
+# end of programlisting.module
+local.literallayout.attrib = empty
+literallayout.role.attrib = role.attrib
+literallayout =
+  element literallayout {
+    literallayout.attlist,
+    (para.char.mix | co | coref | textobject | lineannotation)*
+  }
+# end of literallayout.element
+literallayout.attlist &=
+  width.attrib,
+  linespecific.attrib,
+  [ a:defaultValue = "normal" ]
+  attribute class { "monospaced" | "normal" }?,
+  common.attrib,
+  literallayout.role.attrib,
+  local.literallayout.attrib
+# end of literallayout.attlist
+
+#  LineAnnotation (defined in the Inlines section, below)
+
+# end of literallayout.module
+local.screenco.attrib = empty
+screenco.role.attrib = role.attrib
+screenco =
+  element screenco { screenco.attlist, areaspec, screen, calloutlist* }
+# end of screenco.element
+screenco.attlist &=
+  common.attrib, screenco.role.attrib, local.screenco.attrib
+# end of screenco.attlist
+
+#  AreaSpec (defined above)
+
+#  CalloutList (defined above in Lists)
+
+# end of screenco.module
+local.screen.attrib = empty
+screen.role.attrib = role.attrib
+screen =
+  element screen {
+    screen.attlist,
+    (para.char.mix | co | coref | textobject | lineannotation)*
+  }
+# end of screen.element
+screen.attlist &=
+  width.attrib,
+  linespecific.attrib,
+  common.attrib,
+  screen.role.attrib,
+  local.screen.attrib
+# end of screen.attlist
+
+# end of screen.module
+local.screenshot.attrib = empty
+screenshot.role.attrib = role.attrib
+screenshot =
+  element screenshot {
+    screenshot.attlist,
+    screeninfo?,
+    (graphic | graphicco | mediaobject | mediaobjectco)
+  }
+# end of screenshot.element
+screenshot.attlist &=
+  common.attrib, screenshot.role.attrib, local.screenshot.attrib
+# end of screenshot.attlist
+
+# end of screenshot.module
+local.screeninfo.attrib = empty
+screeninfo.role.attrib = role.attrib
+screeninfo = element screeninfo { screeninfo.attlist, para.char.mix* }
+# end of screeninfo.element
+screeninfo.attlist &=
+  common.attrib, screeninfo.role.attrib, local.screeninfo.attrib
+# end of screeninfo.attlist
+
+# end of screeninfo.module
+
+# end of screenshot.content.module
+
+# Figures etc. .....................
+local.figure.attrib = empty
+figure.role.attrib = role.attrib
+figure =
+  element figure {
+    figure.attlist,
+    blockinfo?,
+    formalobject.title.content,
+    (figure.mix | link.char.class)+
+  }
+# end of figure.element
+
+# Float: Whether the Figure is supposed to be rendered
+# where convenient (yes (1) value) or at the place it occurs
+# in the text (no (0) value, the default)
+figure.attlist &=
+  [ a:defaultValue = "0" ] attribute float { yesorno.attvals }?,
+  attribute pgwide { yesorno.attvals }?,
+  label.attrib,
+  common.attrib,
+  figure.role.attrib,
+  local.figure.attrib
+# end of figure.attlist
+
+# end of figure.module
+local.informalfigure.attrib = empty
+informalfigure.role.attrib = role.attrib
+informalfigure =
+  element informalfigure {
+    informalfigure.attlist, blockinfo?, (figure.mix | link.char.class)+
+  }
+# end of informalfigure.element
+
+# Float: Whether the Figure is supposed to be rendered
+# where convenient (yes (1) value) or at the place it occurs
+# in the text (no (0) value, the default)
+informalfigure.attlist &=
+  [ a:defaultValue = "0" ] attribute float { yesorno.attvals }?,
+  attribute pgwide { yesorno.attvals }?,
+  label.attrib,
+  common.attrib,
+  informalfigure.role.attrib,
+  local.informalfigure.attrib
+# end of informalfigure.attlist
+
+# end of informalfigure.module
+local.graphicco.attrib = empty
+graphicco.role.attrib = role.attrib
+graphicco =
+  element graphicco {
+    graphicco.attlist, areaspec, graphic, calloutlist*
+  }
+# end of graphicco.element
+graphicco.attlist &=
+  common.attrib, graphicco.role.attrib, local.graphicco.attrib
+# end of graphicco.attlist
+
+#  AreaSpec (defined above in Examples)
+
+#  CalloutList (defined above in Lists)
+
+# end of graphicco.module
+
+# Graphical data can be the content of Graphic, or you can reference
+# an external file either as an entity (Entitref) or a filename
+# (Fileref).
+local.graphic.attrib = empty
+graphic.role.attrib = role.attrib
+graphic = element graphic { graphic.attlist, empty }
+# end of graphic.element
+graphic.attlist &=
+  graphics.attrib,
+  common.attrib,
+  graphic.role.attrib,
+  local.graphic.attrib
+# end of graphic.attlist
+
+# end of graphic.module
+local.inlinegraphic.attrib = empty
+inlinegraphic.role.attrib = role.attrib
+inlinegraphic = element inlinegraphic { inlinegraphic.attlist, empty }
+# end of inlinegraphic.element
+inlinegraphic.attlist &=
+  graphics.attrib,
+  common.attrib,
+  inlinegraphic.role.attrib,
+  local.inlinegraphic.attrib
+# end of inlinegraphic.attlist
+
+# end of inlinegraphic.module
+local.mediaobject.attrib = empty
+mediaobject.role.attrib = role.attrib
+mediaobject =
+  element mediaobject {
+    mediaobject.attlist, objectinfo?, mediaobject.mix+, caption?
+  }
+# end of mediaobject.element
+mediaobject.attlist &=
+  common.attrib, mediaobject.role.attrib, local.mediaobject.attrib
+# end of mediaobject.attlist
+
+# end of mediaobject.module
+local.inlinemediaobject.attrib = empty
+inlinemediaobject.role.attrib = role.attrib
+inlinemediaobject =
+  element inlinemediaobject {
+    inlinemediaobject.attlist, objectinfo?, mediaobject.mix+
+  }
+# end of inlinemediaobject.element
+inlinemediaobject.attlist &=
+  common.attrib,
+  inlinemediaobject.role.attrib,
+  local.inlinemediaobject.attrib
+# end of inlinemediaobject.attlist
+
+# end of inlinemediaobject.module
+local.videoobject.attrib = empty
+videoobject.role.attrib = role.attrib
+videoobject =
+  element videoobject { videoobject.attlist, objectinfo?, videodata }
+# end of videoobject.element
+videoobject.attlist &=
+  common.attrib, videoobject.role.attrib, local.videoobject.attrib
+# end of videoobject.attlist
+
+# end of videoobject.module
+local.audioobject.attrib = empty
+audioobject.role.attrib = role.attrib
+audioobject =
+  element audioobject { audioobject.attlist, objectinfo?, audiodata }
+# end of audioobject.element
+audioobject.attlist &=
+  common.attrib, audioobject.role.attrib, local.audioobject.attrib
+# end of audioobject.attlist
+
+# end of audioobject.module
+local.imageobject.attrib = empty
+imageobject.role.attrib = role.attrib
+imageobject =
+  element imageobject { imageobject.attlist, objectinfo?, imagedata }
+# end of imageobject.element
+imageobject.attlist &=
+  common.attrib, imageobject.role.attrib, local.imageobject.attrib
+# end of imageobject.attlist
+
+# end of imageobject.module
+local.textobject.attrib = empty
+textobject.role.attrib = role.attrib
+textobject =
+  element textobject {
+    textobject.attlist,
+    objectinfo?,
+    (phrase | textdata | textobject.mix+)
+  }
+# end of textobject.element
+textobject.attlist &=
+  common.attrib, textobject.role.attrib, local.textobject.attrib
+# end of textobject.attlist
+
+# end of textobject.module
+local.objectinfo.attrib = empty
+objectinfo.role.attrib = role.attrib
+objectinfo = element objectinfo { objectinfo.attlist, info.class+ }
+# end of objectinfo.element
+objectinfo.attlist &=
+  common.attrib, objectinfo.role.attrib, local.objectinfo.attrib
+# end of objectinfo.attlist
+
+# end of objectinfo.module
+
+# EntityRef: Name of an external entity containing the content
+# of the object data
+
+# FileRef: Filename, qualified by a pathname if desired,
+# designating the file containing the content of the object data
+
+# Format: Notation of the element content, if any
+
+# SrcCredit: Information about the source of the image
+local.objectdata.attrib = empty
+objectdata.attrib =
+  attribute entityref { xsd:ENTITY }?,
+  attribute fileref { text }?,
+  attribute format { notation.class }?,
+  attribute srccredit { text }?,
+  local.objectdata.attrib
+local.videodata.attrib = empty
+videodata.role.attrib = role.attrib
+videodata = element videodata { videodata.attlist, empty }
+# end of videodata.element
+
+# Width: Same as CALS reprowid (desired width)
+
+# Depth: Same as CALS reprodep (desired depth)
+
+# Align: Same as CALS hplace with 'none' removed; #IMPLIED means
+# application-specific
+
+# Scale: Conflation of CALS hscale and vscale
+
+# Scalefit: Same as CALS scalefit
+videodata.attlist &=
+  attribute width { text }?,
+  attribute contentwidth { text }?,
+  attribute depth { text }?,
+  attribute contentdepth { text }?,
+  attribute align { "left" | "right" | "center" }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  attribute scale { text }?,
+  attribute scalefit { yesorno.attvals }?,
+  objectdata.attrib,
+  common.attrib,
+  videodata.role.attrib,
+  local.videodata.attrib
+# end of videodata.attlist
+
+# end of videodata.module
+local.audiodata.attrib = empty
+audiodata.role.attrib = role.attrib
+audiodata = element audiodata { audiodata.attlist, empty }
+# end of audiodata.element
+audiodata.attlist &=
+  objectdata.attrib,
+  common.attrib,
+  audiodata.role.attrib,
+  local.audiodata.attrib
+# end of audiodata.attlist
+
+# end of audiodata.module
+local.imagedata.attrib = empty
+imagedata.role.attrib = role.attrib
+imagedata = element imagedata { imagedata.attlist, empty }
+# end of imagedata.element
+
+# Width: Same as CALS reprowid (desired width)
+
+# Depth: Same as CALS reprodep (desired depth)
+
+# Align: Same as CALS hplace with 'none' removed; #IMPLIED means
+# application-specific
+
+# Scale: Conflation of CALS hscale and vscale
+
+# Scalefit: Same as CALS scalefit
+imagedata.attlist &=
+  attribute width { text }?,
+  attribute contentwidth { text }?,
+  attribute depth { text }?,
+  attribute contentdepth { text }?,
+  attribute align { "left" | "right" | "center" }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  attribute scale { text }?,
+  attribute scalefit { yesorno.attvals }?,
+  objectdata.attrib,
+  common.attrib,
+  imagedata.role.attrib,
+  local.imagedata.attrib
+# end of imagedata.attlist
+
+# end of imagedata.module
+local.textdata.attrib = empty
+textdata.role.attrib = role.attrib
+textdata = element textdata { textdata.attlist, empty }
+# end of textdata.element
+textdata.attlist &=
+  attribute encoding { text }?,
+  objectdata.attrib,
+  common.attrib,
+  textdata.role.attrib,
+  local.textdata.attrib
+# end of textdata.attlist
+
+# end of textdata.module
+local.caption.attrib = empty
+caption.role.attrib = role.attrib
+caption = element caption { caption.attlist, textobject.mix* }
+# end of caption.element
+caption.attlist &=
+  common.attrib, caption.role.attrib, local.caption.attrib
+# end of caption.attlist
+
+# end of caption.module
+local.mediaobjectco.attrib = empty
+mediaobjectco.role.attrib = role.attrib
+mediaobjectco =
+  element mediaobjectco {
+    mediaobjectco.attlist,
+    objectinfo?,
+    imageobjectco,
+    (imageobjectco | textobject)*
+  }
+# end of mediaobjectco.element
+mediaobjectco.attlist &=
+  common.attrib, mediaobjectco.role.attrib, local.mediaobjectco.attrib
+# end of mediaobjectco.attlist
+
+# end of mediaobjectco.module
+local.imageobjectco.attrib = empty
+imageobjectco.role.attrib = role.attrib
+imageobjectco =
+  element imageobjectco {
+    imageobjectco.attlist, areaspec, imageobject, calloutlist*
+  }
+# end of imageobjectco.element
+imageobjectco.attlist &=
+  common.attrib, imageobjectco.role.attrib, local.imageobjectco.attrib
+# end of imageobjectco.attlist
+
+# end of imageobjectco.module
+
+# end of mediaobject.content.module
+
+# Equations ........................
+
+# This PE provides a mechanism for replacing equation content,
+
+# perhaps adding a new or different model (e.g., MathML)
+equation.content = alt?, (graphic+ | mediaobject+)
+inlineequation.content = alt?, (graphic+ | inlinemediaobject+)
+local.equation.attrib = empty
+equation.role.attrib = role.attrib
+equation =
+  element equation {
+    equation.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    (informalequation | equation.content)
+  }
+# end of equation.element
+equation.attlist &=
+  label.attrib,
+  common.attrib,
+  equation.role.attrib,
+  local.equation.attrib
+# end of equation.attlist
+
+# end of equation.module
+local.informalequation.attrib = empty
+informalequation.role.attrib = role.attrib
+informalequation =
+  element informalequation {
+    informalequation.attlist, blockinfo?, equation.content
+  }
+# end of informalequation.element
+informalequation.attlist &=
+  common.attrib,
+  informalequation.role.attrib,
+  local.informalequation.attrib
+# end of informalequation.attlist
+
+# end of informalequation.module
+local.inlineequation.attrib = empty
+inlineequation.role.attrib = role.attrib
+inlineequation =
+  element inlineequation {
+    inlineequation.attlist, inlineequation.content
+  }
+# end of inlineequation.element
+inlineequation.attlist &=
+  common.attrib, inlineequation.role.attrib, local.inlineequation.attrib
+# end of inlineequation.attlist
+
+# end of inlineequation.module
+local.alt.attrib = empty
+alt.role.attrib = role.attrib
+alt = element alt { alt.attlist, text }
+# end of alt.element
+alt.attlist &= common.attrib, alt.role.attrib, local.alt.attrib
+# end of alt.attlist
+
+# end of alt.module
+
+# Tables ...........................
+
+tables.role.attrib = role.attrib
+
+# Note that InformalTable is dependent on some of the entity
+# declarations that customize Table.
+local.informaltable.attrib = empty
+informaltable =
+  element informaltable {
+    informaltable.attlist,
+    blockinfo?,
+    textobject*,
+    (graphic+ | mediaobject+ | tgroup+)
+  }
+# end of informaltable.element
+
+# Frame, Colsep, and Rowsep must be repeated because
+# they are not in entities in the table module.
+
+# includes TabStyle, ToCentry, ShortEntry,
+# Orient, PgWide
+
+# includes Label
+
+# includes common attributes
+informaltable.attlist &=
+  attribute frame {
+    "top" | "bottom" | "topbot" | "all" | "sides" | "none"
+  }?,
+  attribute colsep { yesorno.attvals }?,
+  attribute rowsep { yesorno.attvals }?,
+  common.table.attribs,
+  tbl.table.att,
+  local.informaltable.attrib
+# end of informaltable.attlist
+
+# end of informaltable.module
+
+# ......................................................................
+
+# Synopses .............................................................
+
+# Synopsis .........................
+local.synopsis.attrib = empty
+synopsis.role.attrib = role.attrib
+synopsis =
+  element synopsis {
+    synopsis.attlist,
+    (para.char.mix
+     | graphic
+     | mediaobject
+     | co
+     | coref
+     | textobject
+     | lineannotation)*
+  }
+# end of synopsis.element
+synopsis.attlist &=
+  label.attrib,
+  linespecific.attrib,
+  common.attrib,
+  synopsis.role.attrib,
+  local.synopsis.attrib
+# end of synopsis.attlist
+
+#  LineAnnotation (defined in the Inlines section, below)
+
+# end of synopsis.module
+
+# CmdSynopsis ......................
+local.cmdsynopsis.attrib = empty
+cmdsynopsis.role.attrib = role.attrib
+cmdsynopsis =
+  element cmdsynopsis {
+    cmdsynopsis.attlist, (command | arg | group | sbr)+, synopfragment*
+  }
+# end of cmdsynopsis.element
+
+# Sepchar: Character that should separate command and all
+# top-level arguments; alternate value might be e.g., &Delta;
+cmdsynopsis.attlist &=
+  label.attrib,
+  [ a:defaultValue = " " ] attribute sepchar { text }?,
+  attribute cmdlength { text }?,
+  common.attrib,
+  cmdsynopsis.role.attrib,
+  local.cmdsynopsis.attrib
+# end of cmdsynopsis.attlist
+
+# end of cmdsynopsis.module
+local.arg.attrib = empty
+arg.role.attrib = role.attrib
+arg =
+  element arg {
+    arg.attlist,
+    (text
+     | arg
+     | group
+     | option
+     | synopfragmentref
+     | replaceable
+     | sbr)*
+  }
+# end of arg.element
+
+# Choice: Whether Arg must be supplied: Opt (optional to
+# supply, e.g. [arg]; the default), Req (required to supply,
+# e.g. {arg}), or Plain (required to supply, e.g. arg)
+
+# Rep: whether Arg is repeatable: Norepeat (e.g. arg without
+# ellipsis; the default), or Repeat (e.g. arg...)
+arg.attlist &=
+  [ a:defaultValue = "opt" ]
+  attribute choice { "opt" | "req" | "plain" }?,
+  [ a:defaultValue = "norepeat" ]
+  attribute rep { "norepeat" | "repeat" }?,
+  common.attrib,
+  arg.role.attrib,
+  local.arg.attrib
+# end of arg.attlist
+
+# end of arg.module
+local.group.attrib = empty
+group.role.attrib = role.attrib
+group =
+  element group {
+    group.attlist,
+    (arg | group | option | synopfragmentref | replaceable | sbr)+
+  }
+# end of group.element
+
+# Choice: Whether Group must be supplied: Opt (optional to
+# supply, e.g.  [g1|g2|g3]; the default), Req (required to
+# supply, e.g.  {g1|g2|g3}), Plain (required to supply,
+# e.g.  g1|g2|g3), OptMult (can supply zero or more, e.g.
+# [[g1|g2|g3]]), or ReqMult (must supply one or more, e.g.
+# {{g1|g2|g3}})
+
+# Rep: whether Group is repeatable: Norepeat (e.g. group
+# without ellipsis; the default), or Repeat (e.g. group...)
+group.attlist &=
+  [ a:defaultValue = "opt" ]
+  attribute choice { "opt" | "req" | "plain" }?,
+  [ a:defaultValue = "norepeat" ]
+  attribute rep { "norepeat" | "repeat" }?,
+  common.attrib,
+  group.role.attrib,
+  local.group.attrib
+# end of group.attlist
+
+# end of group.module
+local.sbr.attrib = empty
+# Synopsis break
+sbr.role.attrib = role.attrib
+sbr = element sbr { sbr.attlist, empty }
+# end of sbr.element
+sbr.attlist &= common.attrib, sbr.role.attrib, local.sbr.attrib
+# end of sbr.attlist
+
+# end of sbr.module
+local.synopfragmentref.attrib = empty
+synopfragmentref.role.attrib = role.attrib
+synopfragmentref =
+  element synopfragmentref { synopfragmentref.attlist, text }
+# end of synopfragmentref.element
+
+# to SynopFragment of complex synopsis
+# material for separate referencing
+synopfragmentref.attlist &=
+  linkendreq.attrib,
+  common.attrib,
+  synopfragmentref.role.attrib,
+  local.synopfragmentref.attrib
+# end of synopfragmentref.attlist
+
+# end of synopfragmentref.module
+local.synopfragment.attrib = empty
+synopfragment.role.attrib = role.attrib
+synopfragment =
+  element synopfragment { synopfragment.attlist, (arg | group)+ }
+# end of synopfragment.element
+synopfragment.attlist &=
+  idreq.common.attrib,
+  synopfragment.role.attrib,
+  local.synopfragment.attrib
+# end of synopfragment.attlist
+
+# end of synopfragment.module
+
+#  Command (defined in the Inlines section, below)
+
+#  Option (defined in the Inlines section, below)
+
+#  Replaceable (defined in the Inlines section, below)
+
+# end of cmdsynopsis.content.module
+
+# FuncSynopsis .....................
+local.funcsynopsis.attrib = empty
+funcsynopsis.role.attrib = role.attrib
+funcsynopsis =
+  element funcsynopsis {
+    funcsynopsis.attlist, (funcsynopsisinfo | funcprototype)+
+  }
+# end of funcsynopsis.element
+funcsynopsis.attlist &=
+  label.attrib,
+  common.attrib,
+  funcsynopsis.role.attrib,
+  local.funcsynopsis.attrib
+# end of funcsynopsis.attlist
+
+# end of funcsynopsis.module
+local.funcsynopsisinfo.attrib = empty
+funcsynopsisinfo.role.attrib = role.attrib
+funcsynopsisinfo =
+  element funcsynopsisinfo {
+    funcsynopsisinfo.attlist,
+    (cptr.char.mix | textobject | lineannotation)*
+  }
+# end of funcsynopsisinfo.element
+funcsynopsisinfo.attlist &=
+  linespecific.attrib,
+  common.attrib,
+  funcsynopsisinfo.role.attrib,
+  local.funcsynopsisinfo.attrib
+# end of funcsynopsisinfo.attlist
+
+# end of funcsynopsisinfo.module
+local.funcprototype.attrib = empty
+funcprototype.role.attrib = role.attrib
+funcprototype =
+  element funcprototype {
+    funcprototype.attlist, funcdef, (void | varargs | paramdef+)
+  }
+# end of funcprototype.element
+funcprototype.attlist &=
+  common.attrib, funcprototype.role.attrib, local.funcprototype.attrib
+# end of funcprototype.attlist
+
+# end of funcprototype.module
+local.funcdef.attrib = empty
+funcdef.role.attrib = role.attrib
+funcdef =
+  element funcdef {
+    funcdef.attlist, (text | type | replaceable | function)*
+  }
+# end of funcdef.element
+funcdef.attlist &=
+  common.attrib, funcdef.role.attrib, local.funcdef.attrib
+# end of funcdef.attlist
+
+# end of funcdef.module
+local.void.attrib = empty
+void.role.attrib = role.attrib
+void = element void { void.attlist, empty }
+# end of void.element
+void.attlist &= common.attrib, void.role.attrib, local.void.attrib
+# end of void.attlist
+
+# end of void.module
+local.varargs.attrib = empty
+varargs.role.attrib = role.attrib
+varargs = element varargs { varargs.attlist, empty }
+# end of varargs.element
+varargs.attlist &=
+  common.attrib, varargs.role.attrib, local.varargs.attrib
+# end of varargs.attlist
+
+# end of varargs.module
+
+# Processing assumes that only one Parameter will appear in a
+# ParamDef, and that FuncParams will be used at most once, for
+# providing information on the "inner parameters" for parameters that
+# are pointers to functions.
+local.paramdef.attrib = empty
+paramdef.role.attrib = role.attrib
+paramdef =
+  element paramdef {
+    paramdef.attlist,
+    (text | type | replaceable | parameter | funcparams)*
+  }
+# end of paramdef.element
+paramdef.attlist &=
+  common.attrib, paramdef.role.attrib, local.paramdef.attrib
+# end of paramdef.attlist
+
+# end of paramdef.module
+local.funcparams.attrib = empty
+funcparams.role.attrib = role.attrib
+funcparams = element funcparams { funcparams.attlist, cptr.char.mix* }
+# end of funcparams.element
+funcparams.attlist &=
+  common.attrib, funcparams.role.attrib, local.funcparams.attrib
+# end of funcparams.attlist
+
+# end of funcparams.module
+
+#  LineAnnotation (defined in the Inlines section, below)
+
+#  Replaceable (defined in the Inlines section, below)
+
+#  Function (defined in the Inlines section, below)
+
+#  Parameter (defined in the Inlines section, below)
+
+# end of funcsynopsis.content.module
+
+# ClassSynopsis .....................
+local.classsynopsis.attrib = empty
+classsynopsis.role.attrib = role.attrib
+classsynopsis =
+  element classsynopsis {
+    classsynopsis.attlist,
+    (ooclass | oointerface | ooexception)+,
+    (classsynopsisinfo | fieldsynopsis | method.synop.class)*
+  }
+# end of classsynopsis.element
+classsynopsis.attlist &=
+  attribute language { text }?,
+  [ a:defaultValue = "class" ]
+  attribute class { "class" | "interface" }?,
+  common.attrib,
+  classsynopsis.role.attrib,
+  local.classsynopsis.attrib
+# end of classsynopsis.attlist
+
+# end of classsynopsis.module
+local.classsynopsisinfo.attrib = empty
+classsynopsisinfo.role.attrib = role.attrib
+classsynopsisinfo =
+  element classsynopsisinfo {
+    classsynopsisinfo.attlist,
+    (cptr.char.mix | textobject | lineannotation)*
+  }
+# end of classsynopsisinfo.element
+classsynopsisinfo.attlist &=
+  linespecific.attrib,
+  common.attrib,
+  classsynopsisinfo.role.attrib,
+  local.classsynopsisinfo.attrib
+# end of classsynopsisinfo.attlist
+
+# end of classsynopsisinfo.module
+local.ooclass.attrib = empty
+ooclass.role.attrib = role.attrib
+ooclass = element ooclass { ooclass.attlist, modifier*, classname }
+# end of ooclass.element
+ooclass.attlist &=
+  common.attrib, ooclass.role.attrib, local.ooclass.attrib
+# end of ooclass.attlist
+
+# end of ooclass.module
+local.oointerface.attrib = empty
+oointerface.role.attrib = role.attrib
+oointerface =
+  element oointerface { oointerface.attlist, modifier*, interfacename }
+# end of oointerface.element
+oointerface.attlist &=
+  common.attrib, oointerface.role.attrib, local.oointerface.attrib
+# end of oointerface.attlist
+
+# end of oointerface.module
+local.ooexception.attrib = empty
+ooexception.role.attrib = role.attrib
+ooexception =
+  element ooexception { ooexception.attlist, modifier*, exceptionname }
+# end of ooexception.element
+ooexception.attlist &=
+  common.attrib, ooexception.role.attrib, local.ooexception.attrib
+# end of ooexception.attlist
+
+# end of ooexception.module
+local.modifier.attrib = empty
+modifier.role.attrib = role.attrib
+modifier = element modifier { modifier.attlist, smallcptr.char.mix* }
+# end of modifier.element
+modifier.attlist &=
+  common.attrib, modifier.role.attrib, local.modifier.attrib
+# end of modifier.attlist
+
+# end of modifier.module
+local.interfacename.attrib = empty
+interfacename.role.attrib = role.attrib
+interfacename =
+  element interfacename { interfacename.attlist, cptr.char.mix* }
+# end of interfacename.element
+interfacename.attlist &=
+  common.attrib, interfacename.role.attrib, local.interfacename.attrib
+# end of interfacename.attlist
+
+# end of interfacename.module
+local.exceptionname.attrib = empty
+exceptionname.role.attrib = role.attrib
+exceptionname =
+  element exceptionname { exceptionname.attlist, smallcptr.char.mix* }
+# end of exceptionname.element
+exceptionname.attlist &=
+  common.attrib, exceptionname.role.attrib, local.exceptionname.attrib
+# end of exceptionname.attlist
+
+# end of exceptionname.module
+local.fieldsynopsis.attrib = empty
+fieldsynopsis.role.attrib = role.attrib
+fieldsynopsis =
+  element fieldsynopsis {
+    fieldsynopsis.attlist, modifier*, type?, varname, initializer?
+  }
+# end of fieldsynopsis.element
+fieldsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  fieldsynopsis.role.attrib,
+  local.fieldsynopsis.attrib
+# end of fieldsynopsis.attlist
+
+# end of fieldsynopsis.module
+local.initializer.attrib = empty
+initializer.role.attrib = role.attrib
+initializer =
+  element initializer { initializer.attlist, smallcptr.char.mix* }
+# end of initializer.element
+initializer.attlist &=
+  common.attrib, initializer.role.attrib, local.initializer.attrib
+# end of initializer.attlist
+
+# end of initializer.module
+local.constructorsynopsis.attrib = empty
+constructorsynopsis.role.attrib = role.attrib
+constructorsynopsis =
+  element constructorsynopsis {
+    constructorsynopsis.attlist,
+    modifier*,
+    methodname?,
+    (methodparam+ | void),
+    exceptionname*
+  }
+# end of constructorsynopsis.element
+constructorsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  constructorsynopsis.role.attrib,
+  local.constructorsynopsis.attrib
+# end of constructorsynopsis.attlist
+
+# end of constructorsynopsis.module
+local.destructorsynopsis.attrib = empty
+destructorsynopsis.role.attrib = role.attrib
+destructorsynopsis =
+  element destructorsynopsis {
+    destructorsynopsis.attlist,
+    modifier*,
+    methodname?,
+    (methodparam+ | void),
+    exceptionname*
+  }
+# end of destructorsynopsis.element
+destructorsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  destructorsynopsis.role.attrib,
+  local.destructorsynopsis.attrib
+# end of destructorsynopsis.attlist
+
+# end of destructorsynopsis.module
+local.methodsynopsis.attrib = empty
+methodsynopsis.role.attrib = role.attrib
+methodsynopsis =
+  element methodsynopsis {
+    methodsynopsis.attlist,
+    modifier*,
+    (type | void)?,
+    methodname,
+    (methodparam+ | void),
+    exceptionname*,
+    modifier*
+  }
+# end of methodsynopsis.element
+methodsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  methodsynopsis.role.attrib,
+  local.methodsynopsis.attrib
+# end of methodsynopsis.attlist
+
+# end of methodsynopsis.module
+local.methodname.attrib = empty
+methodname.role.attrib = role.attrib
+methodname =
+  element methodname { methodname.attlist, smallcptr.char.mix* }
+# end of methodname.element
+methodname.attlist &=
+  common.attrib, methodname.role.attrib, local.methodname.attrib
+# end of methodname.attlist
+
+# end of methodname.module
+local.methodparam.attrib = empty
+methodparam.role.attrib = role.attrib
+methodparam =
+  element methodparam {
+    methodparam.attlist,
+    modifier*,
+    type?,
+    ((parameter, initializer?) | funcparams),
+    modifier*
+  }
+# end of methodparam.element
+methodparam.attlist &=
+  [ a:defaultValue = "req" ]
+  attribute choice { "opt" | "req" | "plain" }?,
+  [ a:defaultValue = "norepeat" ]
+  attribute rep { "norepeat" | "repeat" }?,
+  common.attrib,
+  methodparam.role.attrib,
+  local.methodparam.attrib
+# end of methodparam.attlist
+
+# end of methodparam.module
+
+# end of classsynopsis.content.module
+
+# ......................................................................
+
+# Document information entities and elements ...........................
+
+# The document information elements include some elements that are
+# currently used only in the document hierarchy module. They are
+# defined here so that they will be available for use in customized
+# document hierarchies.
+
+# ..................................
+
+# Ackno ............................
+local.ackno.attrib = empty
+ackno.role.attrib = role.attrib
+ackno = element ackno { ackno.attlist, docinfo.char.mix* }
+# end of ackno.element
+ackno.attlist &= common.attrib, ackno.role.attrib, local.ackno.attrib
+# end of ackno.attlist
+
+# end of ackno.module
+
+# Address ..........................
+local.address.attrib = empty
+address.role.attrib = role.attrib
+address =
+  element address {
+    address.attlist,
+    (text
+     | personname
+     | person.ident.mix
+     | street
+     | pob
+     | postcode
+     | city
+     | state
+     | country
+     | phone
+     | fax
+     | email
+     | otheraddr)*
+  }
+# end of address.element
+address.attlist &=
+  linespecific.attrib,
+  common.attrib,
+  address.role.attrib,
+  local.address.attrib
+# end of address.attlist
+
+# end of address.module
+local.street.attrib = empty
+street.role.attrib = role.attrib
+street = element street { street.attlist, docinfo.char.mix* }
+# end of street.element
+street.attlist &= common.attrib, street.role.attrib, local.street.attrib
+# end of street.attlist
+
+# end of street.module
+local.pob.attrib = empty
+pob.role.attrib = role.attrib
+pob = element pob { pob.attlist, docinfo.char.mix* }
+# end of pob.element
+pob.attlist &= common.attrib, pob.role.attrib, local.pob.attrib
+# end of pob.attlist
+
+# end of pob.module
+local.postcode.attrib = empty
+postcode.role.attrib = role.attrib
+postcode = element postcode { postcode.attlist, docinfo.char.mix* }
+# end of postcode.element
+postcode.attlist &=
+  common.attrib, postcode.role.attrib, local.postcode.attrib
+# end of postcode.attlist
+
+# end of postcode.module
+local.city.attrib = empty
+city.role.attrib = role.attrib
+city = element city { city.attlist, docinfo.char.mix* }
+# end of city.element
+city.attlist &= common.attrib, city.role.attrib, local.city.attrib
+# end of city.attlist
+
+# end of city.module
+local.state.attrib = empty
+state.role.attrib = role.attrib
+state = element state { state.attlist, docinfo.char.mix* }
+# end of state.element
+state.attlist &= common.attrib, state.role.attrib, local.state.attrib
+# end of state.attlist
+
+# end of state.module
+local.country.attrib = empty
+country.role.attrib = role.attrib
+country = element country { country.attlist, docinfo.char.mix* }
+# end of country.element
+country.attlist &=
+  common.attrib, country.role.attrib, local.country.attrib
+# end of country.attlist
+
+# end of country.module
+local.phone.attrib = empty
+phone.role.attrib = role.attrib
+phone = element phone { phone.attlist, docinfo.char.mix* }
+# end of phone.element
+phone.attlist &= common.attrib, phone.role.attrib, local.phone.attrib
+# end of phone.attlist
+
+# end of phone.module
+local.fax.attrib = empty
+fax.role.attrib = role.attrib
+fax = element fax { fax.attlist, docinfo.char.mix* }
+# end of fax.element
+fax.attlist &= common.attrib, fax.role.attrib, local.fax.attrib
+# end of fax.attlist
+
+# end of fax.module
+
+#  Email (defined in the Inlines section, below)
+local.otheraddr.attrib = empty
+otheraddr.role.attrib = role.attrib
+otheraddr = element otheraddr { otheraddr.attlist, docinfo.char.mix* }
+# end of otheraddr.element
+otheraddr.attlist &=
+  common.attrib, otheraddr.role.attrib, local.otheraddr.attrib
+# end of otheraddr.attlist
+
+# end of otheraddr.module
+
+# end of address.content.module
+
+# Affiliation ......................
+local.affiliation.attrib = empty
+affiliation.role.attrib = role.attrib
+affiliation =
+  element affiliation {
+    affiliation.attlist,
+    shortaffil?,
+    jobtitle*,
+    orgname?,
+    orgdiv*,
+    address*
+  }
+# end of affiliation.element
+affiliation.attlist &=
+  common.attrib, affiliation.role.attrib, local.affiliation.attrib
+# end of affiliation.attlist
+
+# end of affiliation.module
+local.shortaffil.attrib = empty
+shortaffil.role.attrib = role.attrib
+shortaffil =
+  element shortaffil { shortaffil.attlist, docinfo.char.mix* }
+# end of shortaffil.element
+shortaffil.attlist &=
+  common.attrib, shortaffil.role.attrib, local.shortaffil.attrib
+# end of shortaffil.attlist
+
+# end of shortaffil.module
+local.jobtitle.attrib = empty
+jobtitle.role.attrib = role.attrib
+jobtitle = element jobtitle { jobtitle.attlist, docinfo.char.mix* }
+# end of jobtitle.element
+jobtitle.attlist &=
+  common.attrib, jobtitle.role.attrib, local.jobtitle.attrib
+# end of jobtitle.attlist
+
+# end of jobtitle.module
+
+#  OrgName (defined elsewhere in this section)
+local.orgdiv.attrib = empty
+orgdiv.role.attrib = role.attrib
+orgdiv = element orgdiv { orgdiv.attlist, docinfo.char.mix* }
+# end of orgdiv.element
+orgdiv.attlist &= common.attrib, orgdiv.role.attrib, local.orgdiv.attrib
+# end of orgdiv.attlist
+
+# end of orgdiv.module
+
+#  Address (defined elsewhere in this section)
+
+# end of affiliation.content.module
+
+# ArtPageNums ......................
+local.artpagenums.attrib = empty
+artpagenums.role.attrib = role.attrib
+artpagenums =
+  element artpagenums { artpagenums.attlist, docinfo.char.mix* }
+# end of artpagenums.element
+artpagenums.attlist &=
+  common.attrib, artpagenums.role.attrib, local.artpagenums.attrib
+# end of artpagenums.attlist
+
+# end of artpagenums.module
+
+# PersonName
+local.personname.attrib = empty
+personname.role.attrib = role.attrib
+personname =
+  element personname {
+    personname.attlist,
+    (honorific | firstname | surname | lineage | othername)+
+  }
+# end of personname.element
+personname.attlist &=
+  common.attrib, personname.role.attrib, local.personname.attrib
+# end of personname.attlist
+
+# end of personname.module
+
+# Author ...........................
+local.author.attrib = empty
+author.role.attrib = role.attrib
+author =
+  element author {
+    author.attlist,
+    (personname | person.ident.mix+),
+    (personblurb | email | address)*
+  }
+# end of author.element
+author.attlist &= common.attrib, author.role.attrib, local.author.attrib
+# end of author.attlist
+
+# (see "Personal identity elements" for %person.ident.mix;)
+
+# end of author.module
+
+# AuthorGroup ......................
+local.authorgroup.attrib = empty
+authorgroup.role.attrib = role.attrib
+authorgroup =
+  element authorgroup {
+    authorgroup.attlist,
+    (author | editor | collab | corpauthor | othercredit)+
+  }
+# end of authorgroup.element
+authorgroup.attlist &=
+  common.attrib, authorgroup.role.attrib, local.authorgroup.attrib
+# end of authorgroup.attlist
+
+# end of authorgroup.module
+
+#  Author (defined elsewhere in this section)
+
+#  Editor (defined elsewhere in this section)
+local.collab.attrib = empty
+collab.role.attrib = role.attrib
+collab = element collab { collab.attlist, collabname, affiliation* }
+# end of collab.element
+collab.attlist &= common.attrib, collab.role.attrib, local.collab.attrib
+# end of collab.attlist
+
+# end of collab.module
+local.collabname.attrib = empty
+collabname.role.attrib = role.attrib
+collabname =
+  element collabname { collabname.attlist, docinfo.char.mix* }
+# end of collabname.element
+collabname.attlist &=
+  common.attrib, collabname.role.attrib, local.collabname.attrib
+# end of collabname.attlist
+
+# end of collabname.module
+
+#  Affiliation (defined elsewhere in this section)
+
+# end of collab.content.module
+
+#  CorpAuthor (defined elsewhere in this section)
+
+#  OtherCredit (defined elsewhere in this section)
+
+# end of authorgroup.content.module
+
+# AuthorInitials ...................
+local.authorinitials.attrib = empty
+authorinitials.role.attrib = role.attrib
+authorinitials =
+  element authorinitials { authorinitials.attlist, docinfo.char.mix* }
+# end of authorinitials.element
+authorinitials.attlist &=
+  common.attrib, authorinitials.role.attrib, local.authorinitials.attrib
+# end of authorinitials.attlist
+
+# end of authorinitials.module
+
+# ConfGroup ........................
+local.confgroup.attrib = empty
+confgroup.role.attrib = role.attrib
+confgroup =
+  element confgroup {
+    confgroup.attlist,
+    (confdates | conftitle | confnum | address | confsponsor)*
+  }
+# end of confgroup.element
+confgroup.attlist &=
+  common.attrib, confgroup.role.attrib, local.confgroup.attrib
+# end of confgroup.attlist
+
+# end of confgroup.module
+local.confdates.attrib = empty
+confdates.role.attrib = role.attrib
+confdates = element confdates { confdates.attlist, docinfo.char.mix* }
+# end of confdates.element
+confdates.attlist &=
+  common.attrib, confdates.role.attrib, local.confdates.attrib
+# end of confdates.attlist
+
+# end of confdates.module
+local.conftitle.attrib = empty
+conftitle.role.attrib = role.attrib
+conftitle = element conftitle { conftitle.attlist, docinfo.char.mix* }
+# end of conftitle.element
+conftitle.attlist &=
+  common.attrib, conftitle.role.attrib, local.conftitle.attrib
+# end of conftitle.attlist
+
+# end of conftitle.module
+local.confnum.attrib = empty
+confnum.role.attrib = role.attrib
+confnum = element confnum { confnum.attlist, docinfo.char.mix* }
+# end of confnum.element
+confnum.attlist &=
+  common.attrib, confnum.role.attrib, local.confnum.attrib
+# end of confnum.attlist
+
+# end of confnum.module
+
+#  Address (defined elsewhere in this section)
+local.confsponsor.attrib = empty
+confsponsor.role.attrib = role.attrib
+confsponsor =
+  element confsponsor { confsponsor.attlist, docinfo.char.mix* }
+# end of confsponsor.element
+confsponsor.attlist &=
+  common.attrib, confsponsor.role.attrib, local.confsponsor.attrib
+# end of confsponsor.attlist
+
+# end of confsponsor.module
+
+# end of confgroup.content.module
+
+# ContractNum ......................
+local.contractnum.attrib = empty
+contractnum.role.attrib = role.attrib
+contractnum =
+  element contractnum { contractnum.attlist, docinfo.char.mix* }
+# end of contractnum.element
+contractnum.attlist &=
+  common.attrib, contractnum.role.attrib, local.contractnum.attrib
+# end of contractnum.attlist
+
+# end of contractnum.module
+
+# ContractSponsor ..................
+local.contractsponsor.attrib = empty
+contractsponsor.role.attrib = role.attrib
+contractsponsor =
+  element contractsponsor { contractsponsor.attlist, docinfo.char.mix* }
+# end of contractsponsor.element
+contractsponsor.attlist &=
+  common.attrib,
+  contractsponsor.role.attrib,
+  local.contractsponsor.attrib
+# end of contractsponsor.attlist
+
+# end of contractsponsor.module
+
+# Copyright ........................
+local.copyright.attrib = empty
+copyright.role.attrib = role.attrib
+copyright = element copyright { copyright.attlist, year+, holder* }
+# end of copyright.element
+copyright.attlist &=
+  common.attrib, copyright.role.attrib, local.copyright.attrib
+# end of copyright.attlist
+
+# end of copyright.module
+local.year.attrib = empty
+year.role.attrib = role.attrib
+year = element year { year.attlist, docinfo.char.mix* }
+# end of year.element
+year.attlist &= common.attrib, year.role.attrib, local.year.attrib
+# end of year.attlist
+
+# end of year.module
+local.holder.attrib = empty
+holder.role.attrib = role.attrib
+holder = element holder { holder.attlist, docinfo.char.mix* }
+# end of holder.element
+holder.attlist &= common.attrib, holder.role.attrib, local.holder.attrib
+# end of holder.attlist
+
+# end of holder.module
+
+# end of copyright.content.module
+
+# CorpAuthor .......................
+local.corpauthor.attrib = empty
+corpauthor.role.attrib = role.attrib
+corpauthor =
+  element corpauthor { corpauthor.attlist, docinfo.char.mix* }
+# end of corpauthor.element
+corpauthor.attlist &=
+  common.attrib, corpauthor.role.attrib, local.corpauthor.attrib
+# end of corpauthor.attlist
+
+# end of corpauthor.module
+
+# CorpName .........................
+local.corpname.attrib = empty
+corpname = element corpname { corpname.attlist, docinfo.char.mix* }
+# end of corpname.element
+corpname.role.attrib = role.attrib
+corpname.attlist &=
+  common.attrib, corpname.role.attrib, local.corpname.attrib
+# end of corpname.attlist
+
+# end of corpname.module
+
+# Date .............................
+local.date.attrib = empty
+date.role.attrib = role.attrib
+date = element date { date.attlist, docinfo.char.mix* }
+# end of date.element
+date.attlist &= common.attrib, date.role.attrib, local.date.attrib
+# end of date.attlist
+
+# end of date.module
+
+# Edition ..........................
+local.edition.attrib = empty
+edition.role.attrib = role.attrib
+edition = element edition { edition.attlist, docinfo.char.mix* }
+# end of edition.element
+edition.attlist &=
+  common.attrib, edition.role.attrib, local.edition.attrib
+# end of edition.attlist
+
+# end of edition.module
+
+# Editor ...........................
+local.editor.attrib = empty
+editor.role.attrib = role.attrib
+editor =
+  element editor {
+    editor.attlist,
+    (personname | person.ident.mix+),
+    (personblurb | email | address)*
+  }
+# end of editor.element
+editor.attlist &= common.attrib, editor.role.attrib, local.editor.attrib
+# end of editor.attlist
+
+# (see "Personal identity elements" for %person.ident.mix;)
+
+# end of editor.module
+
+# ISBN .............................
+local.isbn.attrib = empty
+isbn.role.attrib = role.attrib
+isbn = element isbn { isbn.attlist, docinfo.char.mix* }
+# end of isbn.element
+isbn.attlist &= common.attrib, isbn.role.attrib, local.isbn.attrib
+# end of isbn.attlist
+
+# end of isbn.module
+
+# ISSN .............................
+local.issn.attrib = empty
+issn.role.attrib = role.attrib
+issn = element issn { issn.attlist, docinfo.char.mix* }
+# end of issn.element
+issn.attlist &= common.attrib, issn.role.attrib, local.issn.attrib
+# end of issn.attlist
+
+# end of issn.module
+
+# BiblioId .................
+biblio.class.attrib =
+  attribute class {
+    "uri"
+    | "doi"
+    | "isbn"
+    | "issn"
+    | "libraryofcongress"
+    | "pubnumber"
+    | "other"
+  }?,
+  attribute otherclass { text }?
+local.biblioid.attrib = empty
+biblioid.role.attrib = role.attrib
+biblioid = element biblioid { biblioid.attlist, docinfo.char.mix* }
+# end of biblioid.element
+biblioid.attlist &=
+  biblio.class.attrib,
+  common.attrib,
+  biblioid.role.attrib,
+  local.biblioid.attrib
+# end of biblioid.attlist
+
+# end of biblioid.module
+
+# CiteBiblioId .................
+local.citebiblioid.attrib = empty
+citebiblioid.role.attrib = role.attrib
+citebiblioid =
+  element citebiblioid { citebiblioid.attlist, docinfo.char.mix* }
+# end of citebiblioid.element
+citebiblioid.attlist &=
+  biblio.class.attrib,
+  common.attrib,
+  citebiblioid.role.attrib,
+  local.citebiblioid.attrib
+# end of citebiblioid.attlist
+
+# end of citebiblioid.module
+
+# BiblioSource .................
+local.bibliosource.attrib = empty
+bibliosource.role.attrib = role.attrib
+bibliosource =
+  element bibliosource { bibliosource.attlist, docinfo.char.mix* }
+# end of bibliosource.element
+bibliosource.attlist &=
+  biblio.class.attrib,
+  common.attrib,
+  bibliosource.role.attrib,
+  local.bibliosource.attrib
+# end of bibliosource.attlist
+
+# end of bibliosource.module
+
+# BiblioRelation .................
+local.bibliorelation.attrib = empty
+local.bibliorelation.types = notAllowed
+bibliorelation.type.attrib =
+  attribute type {
+    "isversionof"
+    | "hasversion"
+    | "isreplacedby"
+    | "replaces"
+    | "isrequiredby"
+    | "requires"
+    | "ispartof"
+    | "haspart"
+    | "isreferencedby"
+    | "references"
+    | "isformatof"
+    | "hasformat"
+    | "othertype"
+    | local.bibliorelation.types
+  }?,
+  attribute othertype { text }?
+bibliorelation.role.attrib = role.attrib
+bibliorelation =
+  element bibliorelation { bibliorelation.attlist, docinfo.char.mix* }
+# end of bibliorelation.element
+bibliorelation.attlist &=
+  biblio.class.attrib,
+  bibliorelation.type.attrib,
+  common.attrib,
+  bibliorelation.role.attrib,
+  local.bibliorelation.attrib
+# end of bibliorelation.attlist
+
+# end of bibliorelation.module
+
+# BiblioCoverage .................
+local.bibliocoverage.attrib = empty
+bibliocoverage.role.attrib = role.attrib
+bibliocoverage =
+  element bibliocoverage { bibliocoverage.attlist, docinfo.char.mix* }
+# end of bibliocoverage.element
+bibliocoverage.attlist &=
+  attribute spatial {
+    "dcmipoint" | "iso3166" | "dcmibox" | "tgn" | "otherspatial"
+  }?,
+  attribute otherspatial { text }?,
+  attribute temporal { "dcmiperiod" | "w3c-dtf" | "othertemporal" }?,
+  attribute othertemporal { text }?,
+  common.attrib,
+  bibliocoverage.role.attrib,
+  local.bibliocoverage.attrib
+# end of bibliocoverage.attlist
+
+# end of bibliocoverage.module
+
+# InvPartNumber ....................
+local.invpartnumber.attrib = empty
+invpartnumber.role.attrib = role.attrib
+invpartnumber =
+  element invpartnumber { invpartnumber.attlist, docinfo.char.mix* }
+# end of invpartnumber.element
+invpartnumber.attlist &=
+  common.attrib, invpartnumber.role.attrib, local.invpartnumber.attrib
+# end of invpartnumber.attlist
+
+# end of invpartnumber.module
+
+# IssueNum .........................
+local.issuenum.attrib = empty
+issuenum.role.attrib = role.attrib
+issuenum = element issuenum { issuenum.attlist, docinfo.char.mix* }
+# end of issuenum.element
+issuenum.attlist &=
+  common.attrib, issuenum.role.attrib, local.issuenum.attrib
+# end of issuenum.attlist
+
+# end of issuenum.module
+
+# LegalNotice ......................
+local.legalnotice.attrib = empty
+legalnotice.role.attrib = role.attrib
+legalnotice =
+  element legalnotice {
+    legalnotice.attlist, blockinfo?, title?, legalnotice.mix+
+  }
+# end of legalnotice.element
+legalnotice.attlist &=
+  common.attrib, legalnotice.role.attrib, local.legalnotice.attrib
+# end of legalnotice.attlist
+
+# end of legalnotice.module
+
+# ModeSpec .........................
+local.modespec.attrib = empty
+modespec.role.attrib = role.attrib
+modespec = element modespec { modespec.attlist, docinfo.char.mix* }
+# end of modespec.element
+
+# Application: Type of action required for completion
+# of the links to which the ModeSpec is relevant (e.g.,
+# retrieval query)
+modespec.attlist &=
+  attribute application { notation.class }?,
+  common.attrib,
+  modespec.role.attrib,
+  local.modespec.attrib
+# end of modespec.attlist
+
+# end of modespec.module
+
+# OrgName ..........................
+local.orgname.attrib = empty
+orgname.role.attrib = role.attrib
+orgname = element orgname { orgname.attlist, docinfo.char.mix* }
+# end of orgname.element
+orgname.attlist &=
+  common.attrib,
+  attribute class {
+    "corporation" | "nonprofit" | "consortium" | "informal" | "other"
+  }?,
+  attribute otherclass { text }?,
+  orgname.role.attrib,
+  local.orgname.attrib
+# end of orgname.attlist
+
+# end of orgname.module
+
+# OtherCredit ......................
+local.othercredit.attrib = empty
+othercredit.role.attrib = role.attrib
+othercredit =
+  element othercredit {
+    othercredit.attlist,
+    (personname | person.ident.mix+),
+    (personblurb | email | address)*
+  }
+# end of othercredit.element
+othercredit.attlist &=
+  common.attrib, othercredit.role.attrib, local.othercredit.attrib
+# end of othercredit.attlist
+
+# (see "Personal identity elements" for %person.ident.mix;)
+
+# end of othercredit.module
+
+# PageNums .........................
+local.pagenums.attrib = empty
+pagenums.role.attrib = role.attrib
+pagenums = element pagenums { pagenums.attlist, docinfo.char.mix* }
+# end of pagenums.element
+pagenums.attlist &=
+  common.attrib, pagenums.role.attrib, local.pagenums.attrib
+# end of pagenums.attlist
+
+# end of pagenums.module
+
+# Personal identity elements .......
+
+# These elements are used only within Author, Editor, and
+# OtherCredit.
+local.contrib.attrib = empty
+contrib.role.attrib = role.attrib
+contrib = element contrib { contrib.attlist, docinfo.char.mix* }
+# end of contrib.element
+contrib.attlist &=
+  common.attrib, contrib.role.attrib, local.contrib.attrib
+# end of contrib.attlist
+
+# end of contrib.module
+local.firstname.attrib = empty
+firstname.role.attrib = role.attrib
+firstname = element firstname { firstname.attlist, docinfo.char.mix* }
+# end of firstname.element
+firstname.attlist &=
+  common.attrib, firstname.role.attrib, local.firstname.attrib
+# end of firstname.attlist
+
+# end of firstname.module
+local.honorific.attrib = empty
+honorific.role.attrib = role.attrib
+honorific = element honorific { honorific.attlist, docinfo.char.mix* }
+# end of honorific.element
+honorific.attlist &=
+  common.attrib, honorific.role.attrib, local.honorific.attrib
+# end of honorific.attlist
+
+# end of honorific.module
+local.lineage.attrib = empty
+lineage.role.attrib = role.attrib
+lineage = element lineage { lineage.attlist, docinfo.char.mix* }
+# end of lineage.element
+lineage.attlist &=
+  common.attrib, lineage.role.attrib, local.lineage.attrib
+# end of lineage.attlist
+
+# end of lineage.module
+local.othername.attrib = empty
+othername.role.attrib = role.attrib
+othername = element othername { othername.attlist, docinfo.char.mix* }
+# end of othername.element
+othername.attlist &=
+  common.attrib, othername.role.attrib, local.othername.attrib
+# end of othername.attlist
+
+# end of othername.module
+local.surname.attrib = empty
+surname.role.attrib = role.attrib
+surname = element surname { surname.attlist, docinfo.char.mix* }
+# end of surname.element
+surname.attlist &=
+  common.attrib, surname.role.attrib, local.surname.attrib
+# end of surname.attlist
+
+# end of surname.module
+
+# end of person.ident.module
+
+# PrintHistory .....................
+local.printhistory.attrib = empty
+printhistory.role.attrib = role.attrib
+printhistory =
+  element printhistory { printhistory.attlist, para.class+ }
+# end of printhistory.element
+printhistory.attlist &=
+  common.attrib, printhistory.role.attrib, local.printhistory.attrib
+# end of printhistory.attlist
+
+# end of printhistory.module
+
+# ProductName ......................
+local.productname.attrib = empty
+productname.role.attrib = role.attrib
+productname =
+  element productname { productname.attlist, para.char.mix* }
+# end of productname.element
+
+# Class: More precisely identifies the item the element names
+productname.attlist &=
+  [ a:defaultValue = "trade" ]
+  attribute class { "service" | "trade" | "registered" | "copyright" }?,
+  common.attrib,
+  productname.role.attrib,
+  local.productname.attrib
+# end of productname.attlist
+
+# end of productname.module
+
+# ProductNumber ....................
+local.productnumber.attrib = empty
+productnumber.role.attrib = role.attrib
+productnumber =
+  element productnumber { productnumber.attlist, docinfo.char.mix* }
+# end of productnumber.element
+productnumber.attlist &=
+  common.attrib, productnumber.role.attrib, local.productnumber.attrib
+# end of productnumber.attlist
+
+# end of productnumber.module
+
+# PubDate ..........................
+local.pubdate.attrib = empty
+pubdate.role.attrib = role.attrib
+pubdate = element pubdate { pubdate.attlist, docinfo.char.mix* }
+# end of pubdate.element
+pubdate.attlist &=
+  common.attrib, pubdate.role.attrib, local.pubdate.attrib
+# end of pubdate.attlist
+
+# end of pubdate.module
+
+# Publisher ........................
+local.publisher.attrib = empty
+publisher.role.attrib = role.attrib
+publisher =
+  element publisher { publisher.attlist, publishername, address* }
+# end of publisher.element
+publisher.attlist &=
+  common.attrib, publisher.role.attrib, local.publisher.attrib
+# end of publisher.attlist
+
+# end of publisher.module
+local.publishername.attrib = empty
+publishername.role.attrib = role.attrib
+publishername =
+  element publishername { publishername.attlist, docinfo.char.mix* }
+# end of publishername.element
+publishername.attlist &=
+  common.attrib, publishername.role.attrib, local.publishername.attrib
+# end of publishername.attlist
+
+# end of publishername.module
+
+#  Address (defined elsewhere in this section)
+
+# end of publisher.content.module
+
+# PubsNumber .......................
+local.pubsnumber.attrib = empty
+pubsnumber.role.attrib = role.attrib
+pubsnumber =
+  element pubsnumber { pubsnumber.attlist, docinfo.char.mix* }
+# end of pubsnumber.element
+pubsnumber.attlist &=
+  common.attrib, pubsnumber.role.attrib, local.pubsnumber.attrib
+# end of pubsnumber.attlist
+
+# end of pubsnumber.module
+
+# ReleaseInfo ......................
+local.releaseinfo.attrib = empty
+releaseinfo.role.attrib = role.attrib
+releaseinfo =
+  element releaseinfo { releaseinfo.attlist, docinfo.char.mix* }
+# end of releaseinfo.element
+releaseinfo.attlist &=
+  common.attrib, releaseinfo.role.attrib, local.releaseinfo.attrib
+# end of releaseinfo.attlist
+
+# end of releaseinfo.module
+
+# RevHistory .......................
+local.revhistory.attrib = empty
+revhistory.role.attrib = role.attrib
+revhistory = element revhistory { revhistory.attlist, revision+ }
+# end of revhistory.element
+revhistory.attlist &=
+  common.attrib, revhistory.role.attrib, local.revhistory.attrib
+# end of revhistory.attlist
+
+# end of revhistory.module
+local.revision.attrib = empty
+revision.role.attrib = role.attrib
+revision =
+  element revision {
+    revision.attlist,
+    revnumber,
+    date,
+    authorinitials*,
+    (revremark | revdescription)?
+  }
+# end of revision.element
+revision.attlist &=
+  common.attrib, revision.role.attrib, local.revision.attrib
+# end of revision.attlist
+
+# end of revision.module
+local.revnumber.attrib = empty
+revnumber.role.attrib = role.attrib
+revnumber = element revnumber { revnumber.attlist, docinfo.char.mix* }
+# end of revnumber.element
+revnumber.attlist &=
+  common.attrib, revnumber.role.attrib, local.revnumber.attrib
+# end of revnumber.attlist
+
+# end of revnumber.module
+
+#  Date (defined elsewhere in this section)
+
+#  AuthorInitials (defined elsewhere in this section)
+local.revremark.attrib = empty
+revremark.role.attrib = role.attrib
+revremark = element revremark { revremark.attlist, docinfo.char.mix* }
+# end of revremark.element
+revremark.attlist &=
+  common.attrib, revremark.role.attrib, local.revremark.attrib
+# end of revremark.attlist
+
+# end of revremark.module
+local.revdescription.attrib = empty
+revdescription.role.attrib = role.attrib
+revdescription =
+  element revdescription { revdescription.attlist, revdescription.mix+ }
+# end of revdescription.element
+revdescription.attlist &=
+  common.attrib, revdescription.role.attrib, local.revdescription.attrib
+# end of revdescription.attlist
+
+# end of revdescription.module
+
+# end of revhistory.content.module
+
+# SeriesVolNums ....................
+local.seriesvolnums.attrib = empty
+seriesvolnums.role.attrib = role.attrib
+seriesvolnums =
+  element seriesvolnums { seriesvolnums.attlist, docinfo.char.mix* }
+# end of seriesvolnums.element
+seriesvolnums.attlist &=
+  common.attrib, seriesvolnums.role.attrib, local.seriesvolnums.attrib
+# end of seriesvolnums.attlist
+
+# end of seriesvolnums.module
+
+# VolumeNum ........................
+local.volumenum.attrib = empty
+volumenum.role.attrib = role.attrib
+volumenum = element volumenum { volumenum.attlist, docinfo.char.mix* }
+# end of volumenum.element
+volumenum.attlist &=
+  common.attrib, volumenum.role.attrib, local.volumenum.attrib
+# end of volumenum.attlist
+
+# end of volumenum.module
+
+# ..................................
+
+# end of docinfo.content.module
+
+# ......................................................................
+
+# Inline, link, and ubiquitous elements ................................
+
+# Technical and computer terms .........................................
+local.accel.attrib = empty
+accel.role.attrib = role.attrib
+accel = element accel { accel.attlist, smallcptr.char.mix* }
+# end of accel.element
+accel.attlist &= common.attrib, accel.role.attrib, local.accel.attrib
+# end of accel.attlist
+
+# end of accel.module
+local.action.attrib = empty
+action.role.attrib = role.attrib
+action = element action { action.attlist, cptr.char.mix* }
+# end of action.element
+action.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  action.role.attrib,
+  local.action.attrib
+# end of action.attlist
+
+# end of action.module
+local.application.attrib = empty
+application.role.attrib = role.attrib
+application =
+  element application { application.attlist, para.char.mix* }
+# end of application.element
+application.attlist &=
+  attribute class { "hardware" | "software" }?,
+  moreinfo.attrib,
+  common.attrib,
+  application.role.attrib,
+  local.application.attrib
+# end of application.attlist
+
+# end of application.module
+local.classname.attrib = empty
+classname.role.attrib = role.attrib
+classname = element classname { classname.attlist, smallcptr.char.mix* }
+# end of classname.element
+classname.attlist &=
+  common.attrib, classname.role.attrib, local.classname.attrib
+# end of classname.attlist
+
+# end of classname.module
+local.co.attrib = empty
+# CO is a callout area of the LineColumn unit type (a single character
+# position); the position is directly indicated by the location of CO.
+co.role.attrib = role.attrib
+co = element co { co.attlist, empty }
+# end of co.element
+
+# bug number/symbol override or initialization
+
+# to any related information
+co.attlist &=
+  label.attrib,
+  linkends.attrib,
+  idreq.common.attrib,
+  co.role.attrib,
+  local.co.attrib
+# end of co.attlist
+
+# end of co.module
+local.coref.attrib = empty
+# COREF is a reference to a CO
+coref.role.attrib = role.attrib
+coref = element coref { coref.attlist, empty }
+# end of coref.element
+
+# bug number/symbol override or initialization
+
+# to any related information
+coref.attlist &=
+  label.attrib,
+  linkendreq.attrib,
+  common.attrib,
+  coref.role.attrib,
+  local.coref.attrib
+# end of coref.attlist
+
+# end of coref.module
+local.command.attrib = empty
+command.role.attrib = role.attrib
+command = element command { command.attlist, cptr.char.mix* }
+# end of command.element
+command.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  command.role.attrib,
+  local.command.attrib
+# end of command.attlist
+
+# end of command.module
+local.computeroutput.attrib = empty
+computeroutput.role.attrib = role.attrib
+computeroutput =
+  element computeroutput {
+    computeroutput.attlist, (cptr.char.mix | co)*
+  }
+# end of computeroutput.element
+computeroutput.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  computeroutput.role.attrib,
+  local.computeroutput.attrib
+# end of computeroutput.attlist
+
+# end of computeroutput.module
+local.database.attrib = empty
+database.role.attrib = role.attrib
+database = element database { database.attlist, cptr.char.mix* }
+# end of database.element
+
+# Class: Type of database the element names; no default
+database.attlist &=
+  attribute class {
+    "name" | "table" | "field" | "key1" | "key2" | "record"
+  }?,
+  moreinfo.attrib,
+  common.attrib,
+  database.role.attrib,
+  local.database.attrib
+# end of database.attlist
+
+# end of database.module
+local.email.attrib = empty
+email.role.attrib = role.attrib
+email = element email { email.attlist, docinfo.char.mix* }
+# end of email.element
+email.attlist &= common.attrib, email.role.attrib, local.email.attrib
+# end of email.attlist
+
+# end of email.module
+local.envar.attrib = empty
+envar.role.attrib = role.attrib
+envar = element envar { envar.attlist, smallcptr.char.mix* }
+# end of envar.element
+envar.attlist &= common.attrib, envar.role.attrib, local.envar.attrib
+# end of envar.attlist
+
+# end of envar.module
+local.errorcode.attrib = empty
+errorcode.role.attrib = role.attrib
+errorcode = element errorcode { errorcode.attlist, smallcptr.char.mix* }
+# end of errorcode.element
+errorcode.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  errorcode.role.attrib,
+  local.errorcode.attrib
+# end of errorcode.attlist
+
+# end of errorcode.module
+local.errorname.attrib = empty
+errorname.role.attrib = role.attrib
+errorname = element errorname { errorname.attlist, smallcptr.char.mix* }
+# end of errorname.element
+errorname.attlist &=
+  common.attrib, errorname.role.attrib, local.errorname.attrib
+# end of errorname.attlist
+
+# end of errorname.module
+local.errortext.attrib = empty
+errortext.role.attrib = role.attrib
+errortext = element errortext { errortext.attlist, smallcptr.char.mix* }
+# end of errortext.element
+errortext.attlist &=
+  common.attrib, errortext.role.attrib, local.errortext.attrib
+# end of errortext.attlist
+
+# end of errortext.module
+local.errortype.attrib = empty
+errortype.role.attrib = role.attrib
+errortype = element errortype { errortype.attlist, smallcptr.char.mix* }
+# end of errortype.element
+errortype.attlist &=
+  common.attrib, errortype.role.attrib, local.errortype.attrib
+# end of errortype.attlist
+
+# end of errortype.module
+local.filename.attrib = empty
+filename.role.attrib = role.attrib
+filename = element filename { filename.attlist, cptr.char.mix* }
+# end of filename.element
+
+# Class: Type of filename the element names; no default
+
+# Path: Search path (possibly system-specific) in which
+# file can be found
+filename.attlist &=
+  attribute class {
+    "headerfile"
+    | "partition"
+    | "devicefile"
+    | "libraryfile"
+    | "directory"
+    | "extension"
+    | "symlink"
+  }?,
+  attribute path { text }?,
+  moreinfo.attrib,
+  common.attrib,
+  filename.role.attrib,
+  local.filename.attrib
+# end of filename.attlist
+
+# end of filename.module
+local.function.attrib = empty
+function.role.attrib = role.attrib
+function = element function { function.attlist, cptr.char.mix* }
+# end of function.element
+function.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  function.role.attrib,
+  local.function.attrib
+# end of function.attlist
+
+# end of function.module
+local.guibutton.attrib = empty
+guibutton.role.attrib = role.attrib
+guibutton =
+  element guibutton { guibutton.attlist, (smallcptr.char.mix | accel)* }
+# end of guibutton.element
+guibutton.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guibutton.role.attrib,
+  local.guibutton.attrib
+# end of guibutton.attlist
+
+# end of guibutton.module
+local.guiicon.attrib = empty
+guiicon.role.attrib = role.attrib
+guiicon =
+  element guiicon { guiicon.attlist, (smallcptr.char.mix | accel)* }
+# end of guiicon.element
+guiicon.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guiicon.role.attrib,
+  local.guiicon.attrib
+# end of guiicon.attlist
+
+# end of guiicon.module
+local.guilabel.attrib = empty
+guilabel.role.attrib = role.attrib
+guilabel =
+  element guilabel { guilabel.attlist, (smallcptr.char.mix | accel)* }
+# end of guilabel.element
+guilabel.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guilabel.role.attrib,
+  local.guilabel.attrib
+# end of guilabel.attlist
+
+# end of guilabel.module
+local.guimenu.attrib = empty
+guimenu.role.attrib = role.attrib
+guimenu =
+  element guimenu { guimenu.attlist, (smallcptr.char.mix | accel)* }
+# end of guimenu.element
+guimenu.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guimenu.role.attrib,
+  local.guimenu.attrib
+# end of guimenu.attlist
+
+# end of guimenu.module
+local.guimenuitem.attrib = empty
+guimenuitem.role.attrib = role.attrib
+guimenuitem =
+  element guimenuitem {
+    guimenuitem.attlist, (smallcptr.char.mix | accel)*
+  }
+# end of guimenuitem.element
+guimenuitem.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guimenuitem.role.attrib,
+  local.guimenuitem.attrib
+# end of guimenuitem.attlist
+
+# end of guimenuitem.module
+local.guisubmenu.attrib = empty
+guisubmenu.role.attrib = role.attrib
+guisubmenu =
+  element guisubmenu {
+    guisubmenu.attlist, (smallcptr.char.mix | accel)*
+  }
+# end of guisubmenu.element
+guisubmenu.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guisubmenu.role.attrib,
+  local.guisubmenu.attrib
+# end of guisubmenu.attlist
+
+# end of guisubmenu.module
+local.hardware.attrib = empty
+hardware.role.attrib = role.attrib
+hardware = element hardware { hardware.attlist, cptr.char.mix* }
+# end of hardware.element
+hardware.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  hardware.role.attrib,
+  local.hardware.attrib
+# end of hardware.attlist
+
+# end of hardware.module
+local.interface.attrib = empty
+interface.role.attrib = role.attrib
+interface =
+  element interface { interface.attlist, (smallcptr.char.mix | accel)* }
+# end of interface.element
+
+# Class: Type of the Interface item; no default
+interface.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  interface.role.attrib,
+  local.interface.attrib
+# end of interface.attlist
+
+# end of interface.module
+local.keycap.attrib = empty
+keycap.role.attrib = role.attrib
+keycap = element keycap { keycap.attlist, cptr.char.mix* }
+# end of keycap.element
+keycap.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  keycap.role.attrib,
+  local.keycap.attrib
+# end of keycap.attlist
+
+# end of keycap.module
+local.keycode.attrib = empty
+keycode.role.attrib = role.attrib
+keycode = element keycode { keycode.attlist, smallcptr.char.mix* }
+# end of keycode.element
+keycode.attlist &=
+  common.attrib, keycode.role.attrib, local.keycode.attrib
+# end of keycode.attlist
+
+# end of keycode.module
+local.keycombo.attrib = empty
+keycombo.role.attrib = role.attrib
+keycombo =
+  element keycombo {
+    keycombo.attlist, (keycap | keycombo | keysym | mousebutton)+
+  }
+# end of keycombo.element
+keycombo.attlist &=
+  keyaction.attrib,
+  moreinfo.attrib,
+  common.attrib,
+  keycombo.role.attrib,
+  local.keycombo.attrib
+# end of keycombo.attlist
+
+# end of keycombo.module
+local.keysym.attrib = empty
+keysysm.role.attrib = role.attrib
+keysym = element keysym { keysym.attlist, smallcptr.char.mix* }
+# end of keysym.element
+keysym.attlist &=
+  common.attrib, keysysm.role.attrib, local.keysym.attrib
+# end of keysym.attlist
+
+# end of keysym.module
+local.lineannotation.attrib = empty
+lineannotation.role.attrib = role.attrib
+lineannotation =
+  element lineannotation { lineannotation.attlist, para.char.mix* }
+# end of lineannotation.element
+lineannotation.attlist &=
+  common.attrib, lineannotation.role.attrib, local.lineannotation.attrib
+# end of lineannotation.attlist
+
+# end of lineannotation.module
+local.literal.attrib = empty
+literal.role.attrib = role.attrib
+literal = element literal { literal.attlist, cptr.char.mix* }
+# end of literal.element
+literal.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  literal.role.attrib,
+  local.literal.attrib
+# end of literal.attlist
+
+# end of literal.module
+local.constant.attrib = empty
+constant.role.attrib = role.attrib
+constant = element constant { constant.attlist, smallcptr.char.mix* }
+# end of constant.element
+constant.attlist &=
+  attribute class { "limit" }?,
+  common.attrib,
+  constant.role.attrib,
+  local.constant.attrib
+# end of constant.attlist
+
+# end of constant.module
+local.varname.attrib = empty
+varname.role.attrib = role.attrib
+varname = element varname { varname.attlist, smallcptr.char.mix* }
+# end of varname.element
+varname.attlist &=
+  common.attrib, varname.role.attrib, local.varname.attrib
+# end of varname.attlist
+
+# end of varname.module
+local.markup.attrib = empty
+markup.role.attrib = role.attrib
+markup = element markup { markup.attlist, smallcptr.char.mix* }
+# end of markup.element
+markup.attlist &= common.attrib, markup.role.attrib, local.markup.attrib
+# end of markup.attlist
+
+# end of markup.module
+local.medialabel.attrib = empty
+medialabel.role.attrib = role.attrib
+medialabel =
+  element medialabel { medialabel.attlist, smallcptr.char.mix* }
+# end of medialabel.element
+
+# Class: Type of medium named by the element; no default
+medialabel.attlist &=
+  attribute class { "cartridge" | "cdrom" | "disk" | "tape" }?,
+  common.attrib,
+  medialabel.role.attrib,
+  local.medialabel.attrib
+# end of medialabel.attlist
+
+# end of medialabel.module
+local.menuchoice.attrib = empty
+menuchoice.role.attrib = role.attrib
+menuchoice =
+  element menuchoice {
+    menuchoice.attlist,
+    shortcut?,
+    (guibutton
+     | guiicon
+     | guilabel
+     | guimenu
+     | guimenuitem
+     | guisubmenu
+     | interface)+
+  }
+# end of menuchoice.element
+menuchoice.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  menuchoice.role.attrib,
+  local.menuchoice.attrib
+# end of menuchoice.attlist
+
+# end of menuchoice.module
+
+# See also KeyCombo
+local.shortcut.attrib = empty
+shortcut.role.attrib = role.attrib
+shortcut =
+  element shortcut {
+    shortcut.attlist, (keycap | keycombo | keysym | mousebutton)+
+  }
+# end of shortcut.element
+shortcut.attlist &=
+  keyaction.attrib,
+  moreinfo.attrib,
+  common.attrib,
+  shortcut.role.attrib,
+  local.shortcut.attrib
+# end of shortcut.attlist
+
+# end of shortcut.module
+
+# end of menuchoice.content.module
+local.mousebutton.attrib = empty
+mousebutton.role.attrib = role.attrib
+mousebutton =
+  element mousebutton { mousebutton.attlist, smallcptr.char.mix* }
+# end of mousebutton.element
+mousebutton.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  mousebutton.role.attrib,
+  local.mousebutton.attrib
+# end of mousebutton.attlist
+
+# end of mousebutton.module
+local.msgtext.attrib = empty
+msgtext.role.attrib = role.attrib
+msgtext = element msgtext { msgtext.attlist, component.mix+ }
+# end of msgtext.element
+msgtext.attlist &=
+  common.attrib, msgtext.role.attrib, local.msgtext.attrib
+# end of msgtext.attlist
+
+# end of msgtext.module
+local.option.attrib = empty
+option.role.attrib = role.attrib
+option = element option { option.attlist, cptr.char.mix* }
+# end of option.element
+option.attlist &= common.attrib, option.role.attrib, local.option.attrib
+# end of option.attlist
+
+# end of option.module
+local.optional.attrib = empty
+optional.role.attrib = role.attrib
+optional = element optional { optional.attlist, cptr.char.mix* }
+# end of optional.element
+optional.attlist &=
+  common.attrib, optional.role.attrib, local.optional.attrib
+# end of optional.attlist
+
+# end of optional.module
+local.parameter.attrib = empty
+parameter.role.attrib = role.attrib
+parameter = element parameter { parameter.attlist, cptr.char.mix* }
+# end of parameter.element
+
+# Class: Type of the Parameter; no default
+parameter.attlist &=
+  attribute class { "command" | "function" | "option" }?,
+  moreinfo.attrib,
+  common.attrib,
+  parameter.role.attrib,
+  local.parameter.attrib
+# end of parameter.attlist
+
+# end of parameter.module
+local.prompt.attrib = empty
+prompt.role.attrib = role.attrib
+prompt = element prompt { prompt.attlist, (smallcptr.char.mix | co)* }
+# end of prompt.element
+prompt.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  prompt.role.attrib,
+  local.prompt.attrib
+# end of prompt.attlist
+
+# end of prompt.module
+local.property.attrib = empty
+property.role.attrib = role.attrib
+property = element property { property.attlist, cptr.char.mix* }
+# end of property.element
+property.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  property.role.attrib,
+  local.property.attrib
+# end of property.attlist
+
+# end of property.module
+local.replaceable.attrib = empty
+replaceable.role.attrib = role.attrib
+replaceable =
+  element replaceable {
+    replaceable.attlist,
+    (text
+     | link.char.class
+     | optional
+     | base.char.class
+     | other.char.class
+     | inlinegraphic
+     | inlinemediaobject
+     | co)*
+  }
+# end of replaceable.element
+
+# Class: Type of information the element represents; no
+# default
+replaceable.attlist &=
+  attribute class { "command" | "function" | "option" | "parameter" }?,
+  common.attrib,
+  replaceable.role.attrib,
+  local.replaceable.attrib
+# end of replaceable.attlist
+
+# end of replaceable.module
+local.returnvalue.attrib = empty
+returnvalue.role.attrib = role.attrib
+returnvalue =
+  element returnvalue { returnvalue.attlist, smallcptr.char.mix* }
+# end of returnvalue.element
+returnvalue.attlist &=
+  common.attrib, returnvalue.role.attrib, local.returnvalue.attrib
+# end of returnvalue.attlist
+
+# end of returnvalue.module
+local.sgmltag.attrib = empty
+sgmltag.role.attrib = role.attrib
+sgmltag = element sgmltag { sgmltag.attlist, smallcptr.char.mix* }
+# end of sgmltag.element
+
+# Class: Type of SGML construct the element names; no default
+sgmltag.attlist &=
+  attribute class {
+    "attribute"
+    | "attvalue"
+    | "element"
+    | "endtag"
+    | "emptytag"
+    | "genentity"
+    | "numcharref"
+    | "paramentity"
+    | "pi"
+    | "xmlpi"
+    | "starttag"
+    | "sgmlcomment"
+  }?,
+  common.attrib,
+  sgmltag.role.attrib,
+  local.sgmltag.attrib
+# end of sgmltag.attlist
+
+# end of sgmltag.module
+local.structfield.attrib = empty
+structfield.role.attrib = role.attrib
+structfield =
+  element structfield { structfield.attlist, smallcptr.char.mix* }
+# end of structfield.element
+structfield.attlist &=
+  common.attrib, structfield.role.attrib, local.structfield.attrib
+# end of structfield.attlist
+
+# end of structfield.module
+local.structname.attrib = empty
+structname.role.attrib = role.attrib
+structname =
+  element structname { structname.attlist, smallcptr.char.mix* }
+# end of structname.element
+structname.attlist &=
+  common.attrib, structname.role.attrib, local.structname.attrib
+# end of structname.attlist
+
+# end of structname.module
+local.symbol.attrib = empty
+symbol.role.attrib = role.attrib
+symbol = element symbol { symbol.attlist, smallcptr.char.mix* }
+# end of symbol.element
+
+# Class: Type of symbol; no default
+symbol.attlist &=
+  attribute class { "limit" }?,
+  common.attrib,
+  symbol.role.attrib,
+  local.symbol.attrib
+# end of symbol.attlist
+
+# end of symbol.module
+local.systemitem.attrib = empty
+systemitem.role.attrib = role.attrib
+systemitem =
+  element systemitem {
+    systemitem.attlist, (cptr.char.mix | acronym | co)*
+  }
+# end of systemitem.element
+
+# Class: Type of system item the element names; no default
+systemitem.attlist &=
+  attribute class {
+    "constant"
+    | "event"
+    | "eventhandler"
+    | "domainname"
+    | "fqdomainname"
+    | "ipaddress"
+    | "netmask"
+    | "etheraddress"
+    | "groupname"
+    | "library"
+    | "macro"
+    | "osname"
+    | "filesystem"
+    | "resource"
+    | "systemname"
+    | "username"
+    | "newsgroup"
+  }?,
+  moreinfo.attrib,
+  common.attrib,
+  systemitem.role.attrib,
+  local.systemitem.attrib
+# end of systemitem.attlist
+
+# end of systemitem.module
+local.token.attrib = empty
+token.role.attrib = role.attrib
+\token = element token { token.attlist, smallcptr.char.mix* }
+# end of token.element
+token.attlist &= common.attrib, token.role.attrib, local.token.attrib
+# end of token.attlist
+
+# end of token.module
+local.type.attrib = empty
+type.role.attrib = role.attrib
+type = element type { type.attlist, smallcptr.char.mix* }
+# end of type.element
+type.attlist &= common.attrib, type.role.attrib, local.type.attrib
+# end of type.attlist
+
+# end of type.module
+local.userinput.attrib = empty
+userinput.role.attrib = role.attrib
+userinput =
+  element userinput { userinput.attlist, (cptr.char.mix | co)* }
+# end of userinput.element
+userinput.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  userinput.role.attrib,
+  local.userinput.attrib
+# end of userinput.attlist
+
+# end of userinput.module
+
+# General words and phrases ............................................
+local.abbrev.attrib = empty
+abbrev.role.attrib = role.attrib
+abbrev = element abbrev { abbrev.attlist, word.char.mix* }
+# end of abbrev.element
+abbrev.attlist &= common.attrib, abbrev.role.attrib, local.abbrev.attrib
+# end of abbrev.attlist
+
+# end of abbrev.module
+local.acronym.attrib = empty
+acronym.role.attrib = role.attrib
+acronym = element acronym { acronym.attlist, word.char.mix* }
+# end of acronym.element
+acronym.attlist &=
+  common.attrib, acronym.role.attrib, local.acronym.attrib
+# end of acronym.attlist
+
+# end of acronym.module
+local.citation.attrib = empty
+citation.role.attrib = role.attrib
+citation = element citation { citation.attlist, para.char.mix* }
+# end of citation.element
+citation.attlist &=
+  common.attrib, citation.role.attrib, local.citation.attrib
+# end of citation.attlist
+
+# end of citation.module
+local.citerefentry.attrib = empty
+citerefentry.role.attrib = role.attrib
+citerefentry =
+  element citerefentry {
+    citerefentry.attlist, refentrytitle, manvolnum?
+  }
+# end of citerefentry.element
+citerefentry.attlist &=
+  common.attrib, citerefentry.role.attrib, local.citerefentry.attrib
+# end of citerefentry.attlist
+
+# end of citerefentry.module
+local.refentrytitle.attrib = empty
+refentrytitle.role.attrib = role.attrib
+refentrytitle =
+  element refentrytitle { refentrytitle.attlist, para.char.mix* }
+# end of refentrytitle.element
+refentrytitle.attlist &=
+  common.attrib, refentrytitle.role.attrib, local.refentrytitle.attrib
+# end of refentrytitle.attlist
+
+# end of refentrytitle.module
+local.manvolnum.attrib = empty
+namvolnum.role.attrib = role.attrib
+manvolnum = element manvolnum { manvolnum.attlist, word.char.mix* }
+# end of manvolnum.element
+manvolnum.attlist &=
+  common.attrib, namvolnum.role.attrib, local.manvolnum.attrib
+# end of manvolnum.attlist
+
+# end of manvolnum.module
+local.citetitle.attrib = empty
+citetitle.role.attrib = role.attrib
+citetitle = element citetitle { citetitle.attlist, para.char.mix* }
+# end of citetitle.element
+
+# Pubwork: Genre of published work cited; no default
+citetitle.attlist &=
+  attribute pubwork {
+    "article"
+    | "book"
+    | "chapter"
+    | "part"
+    | "refentry"
+    | "section"
+    | "journal"
+    | "series"
+    | "set"
+    | "manuscript"
+  }?,
+  common.attrib,
+  citetitle.role.attrib,
+  local.citetitle.attrib
+# end of citetitle.attlist
+
+# end of citetitle.module
+local.emphasis.attrib = empty
+emphasis.role.attrib = role.attrib
+emphasis = element emphasis { emphasis.attlist, para.char.mix* }
+# end of emphasis.element
+emphasis.attlist &=
+  common.attrib, emphasis.role.attrib, local.emphasis.attrib
+# end of emphasis.attlist
+
+# end of emphasis.module
+local.firstterm.attrib = empty
+firstterm.role.attrib = role.attrib
+firstterm = element firstterm { firstterm.attlist, word.char.mix* }
+# end of firstterm.element
+
+# to GlossEntry or other explanation
+firstterm.attlist &=
+  linkend.attrib,
+  common.attrib,
+  firstterm.role.attrib,
+  local.firstterm.attrib
+# end of firstterm.attlist
+
+# end of firstterm.module
+local.foreignphrase.attrib = empty
+foreignphrase.role.attrib = role.attrib
+foreignphrase =
+  element foreignphrase { foreignphrase.attlist, para.char.mix* }
+# end of foreignphrase.element
+foreignphrase.attlist &=
+  common.attrib, foreignphrase.role.attrib, local.foreignphrase.attrib
+# end of foreignphrase.attlist
+
+# end of foreignphrase.module
+local.glossterm.attrib = empty
+glossterm.role.attrib = role.attrib
+glossterm = element glossterm { glossterm.attlist, para.char.mix* }
+# end of glossterm.element
+
+# to GlossEntry if Glossterm used in text
+
+# BaseForm: Provides the form of GlossTerm to be used
+# for indexing
+glossterm.attlist &=
+  linkend.attrib,
+  attribute baseform { text }?,
+  common.attrib,
+  glossterm.role.attrib,
+  local.glossterm.attrib
+# end of glossterm.attlist
+
+# end of glossterm.module
+local.phrase.attrib = empty
+phrase.role.attrib = role.attrib
+phrase = element phrase { phrase.attlist, para.char.mix* }
+# end of phrase.element
+phrase.attlist &= common.attrib, phrase.role.attrib, local.phrase.attrib
+# end of phrase.attlist
+
+# end of phrase.module
+local.quote.attrib = empty
+quote.role.attrib = role.attrib
+quote = element quote { quote.attlist, para.char.mix* }
+# end of quote.element
+quote.attlist &= common.attrib, quote.role.attrib, local.quote.attrib
+# end of quote.attlist
+
+# end of quote.module
+local.ssscript.attrib = empty
+ssscript.role.attrib = role.attrib
+subscript =
+  element subscript {
+    subscript.attlist,
+    (text
+     | link.char.class
+     | emphasis
+     | replaceable
+     | symbol
+     | inlinegraphic
+     | inlinemediaobject
+     | base.char.class
+     | other.char.class)*
+  }
+# end of subscript.element
+subscript.attlist &=
+  common.attrib, ssscript.role.attrib, local.ssscript.attrib
+# end of subscript.attlist
+superscript =
+  element superscript {
+    superscript.attlist,
+    (text
+     | link.char.class
+     | emphasis
+     | replaceable
+     | symbol
+     | inlinegraphic
+     | inlinemediaobject
+     | base.char.class
+     | other.char.class)*
+  }
+# end of superscript.element
+superscript.attlist &=
+  common.attrib, ssscript.role.attrib, local.ssscript.attrib
+# end of superscript.attlist
+
+# end of ssscript.module
+local.trademark.attrib = empty
+trademark.role.attrib = role.attrib
+trademark =
+  element trademark {
+    trademark.attlist,
+    (text
+     | link.char.class
+     | tech.char.class
+     | base.char.class
+     | other.char.class
+     | inlinegraphic
+     | inlinemediaobject
+     | emphasis)*
+  }
+# end of trademark.element
+
+# Class: More precisely identifies the item the element names
+trademark.attlist &=
+  [ a:defaultValue = "trade" ]
+  attribute class { "service" | "trade" | "registered" | "copyright" }?,
+  common.attrib,
+  trademark.role.attrib,
+  local.trademark.attrib
+# end of trademark.attlist
+
+# end of trademark.module
+local.wordasword.attrib = empty
+wordasword.role.attrib = role.attrib
+wordasword = element wordasword { wordasword.attlist, word.char.mix* }
+# end of wordasword.element
+wordasword.attlist &=
+  common.attrib, wordasword.role.attrib, local.wordasword.attrib
+# end of wordasword.attlist
+
+# end of wordasword.module
+
+# Links and cross-references ...........................................
+local.link.attrib = empty
+link.role.attrib = role.attrib
+link = element link { link.attlist, para.char.mix* }
+# end of link.element
+
+# Endterm: ID of element containing text that is to be
+# fetched from elsewhere in the document to appear as
+# the content of this element
+
+# to linked-to object
+
+# Type: Freely assignable parameter
+link.attlist &=
+  attribute endterm { xsd:IDREF }?,
+  linkendreq.attrib,
+  attribute type { text }?,
+  common.attrib,
+  link.role.attrib,
+  local.link.attrib
+# end of link.attlist
+
+# end of link.module
+local.olink.attrib = empty
+olink.role.attrib = role.attrib
+olink = element olink { olink.attlist, para.char.mix* }
+# end of olink.element
+
+# TargetDocEnt: Name of an entity to be the target of the link
+
+# LinkMode: ID of a ModeSpec containing instructions for
+# operating on the entity named by TargetDocEnt
+
+# LocalInfo: Information that may be passed to ModeSpec
+
+# Type: Freely assignable parameter
+olink.attlist &=
+  attribute targetdocent { xsd:ENTITY }?,
+  attribute linkmode { xsd:IDREF }?,
+  attribute localinfo { text }?,
+  attribute type { text }?,
+  attribute targetdoc { text }?,
+  attribute targetptr { text }?,
+  common.attrib,
+  olink.role.attrib,
+  local.olink.attrib
+# end of olink.attlist
+
+# end of olink.module
+local.ulink.attrib = empty
+ulink.role.attrib = role.attrib
+ulink = element ulink { ulink.attlist, para.char.mix* }
+# end of ulink.element
+
+# URL: uniform resource locator; the target of the ULink
+
+# Type: Freely assignable parameter
+ulink.attlist &=
+  attribute url { text },
+  attribute type { text }?,
+  common.attrib,
+  ulink.role.attrib,
+  local.ulink.attrib
+# end of ulink.attlist
+
+# end of ulink.module
+local.footnoteref.attrib = empty
+footnoteref.role.attrib = role.attrib
+footnoteref = element footnoteref { footnoteref.attlist, empty }
+# end of footnoteref.element
+
+# to footnote content supplied elsewhere
+footnoteref.attlist &=
+  linkendreq.attrib,
+  label.attrib,
+  common.attrib,
+  footnoteref.role.attrib,
+  local.footnoteref.attrib
+# end of footnoteref.attlist
+
+# end of footnoteref.module
+local.xref.attrib = empty
+xref.role.attrib = role.attrib
+xref = element xref { xref.attlist, empty }
+# end of xref.element
+
+# Endterm: ID of element containing text that is to be
+# fetched from elsewhere in the document to appear as
+# the content of this element
+
+# to linked-to object
+xref.attlist &=
+  attribute endterm { xsd:IDREF }?,
+  linkendreq.attrib,
+  common.attrib,
+  xref.role.attrib,
+  local.xref.attrib
+# end of xref.attlist
+
+# end of xref.module
+
+# Ubiquitous elements ..................................................
+local.anchor.attrib = empty
+anchor.role.attrib = role.attrib
+anchor = element anchor { anchor.attlist, empty }
+# end of anchor.element
+
+# required
+
+# replaces Lang
+anchor.attlist &=
+  idreq.attrib,
+  pagenum.attrib,
+  remap.attrib,
+  xreflabel.attrib,
+  revisionflag.attrib,
+  effectivity.attrib,
+  anchor.role.attrib,
+  local.anchor.attrib
+# end of anchor.attlist
+
+# end of anchor.module
+local.beginpage.attrib = empty
+beginpage.role.attrib = role.attrib
+beginpage = element beginpage { beginpage.attlist, empty }
+# end of beginpage.element
+
+# PageNum: Number of page that begins at this point
+beginpage.attlist &=
+  pagenum.attrib,
+  common.attrib,
+  beginpage.role.attrib,
+  local.beginpage.attrib
+# end of beginpage.attlist
+
+# end of beginpage.module
+
+# IndexTerms appear in the text flow for generating or linking an
+# index.
+local.indexterm.attrib = empty
+indexterm.role.attrib = role.attrib
+indexterm =
+  element indexterm {
+    indexterm.attlist,
+    primary?,
+    ((secondary,
+      ((tertiary, (see | seealso+)?)
+       | see
+       | seealso+)?)
+     | see
+     | seealso+)?
+  }
+# end of indexterm.element
+
+# Scope: Indicates which generated indices the IndexTerm
+# should appear in: Global (whole document set), Local (this
+# document only), or All (both)
+
+# Significance: Whether this IndexTerm is the most pertinent
+# of its series (Preferred) or not (Normal, the default)
+
+# Class: Indicates type of IndexTerm; default is Singular,
+# or EndOfRange if StartRef is supplied; StartOfRange value
+# must be supplied explicitly on starts of ranges
+
+# StartRef: ID of the IndexTerm that starts the indexing
+# range ended by this IndexTerm
+
+# Zone: IDs of the elements to which the IndexTerm applies,
+# and indicates that the IndexTerm applies to those entire
+# elements rather than the point at which the IndexTerm
+# occurs
+indexterm.attlist &=
+  pagenum.attrib,
+  attribute scope { "all" | "global" | "local" }?,
+  [ a:defaultValue = "normal" ]
+  attribute significance { "preferred" | "normal" }?,
+  attribute class { "singular" | "startofrange" | "endofrange" }?,
+  attribute startref { xsd:IDREF }?,
+  attribute zone { xsd:IDREFS }?,
+  common.attrib,
+  indexterm.role.attrib,
+  local.indexterm.attrib
+# end of indexterm.attlist
+
+# end of indexterm.module
+local.primsecter.attrib = empty
+primsecter.role.attrib = role.attrib
+primary = element primary { primary.attlist, ndxterm.char.mix* }
+# end of primary.element
+
+# SortAs: Alternate sort string for index sorting, e.g.,
+# "fourteen" for an element containing "14"
+primary.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  primsecter.role.attrib,
+  local.primsecter.attrib
+# end of primary.attlist
+secondary = element secondary { secondary.attlist, ndxterm.char.mix* }
+# end of secondary.element
+
+# SortAs: Alternate sort string for index sorting, e.g.,
+# "fourteen" for an element containing "14"
+secondary.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  primsecter.role.attrib,
+  local.primsecter.attrib
+# end of secondary.attlist
+tertiary = element tertiary { tertiary.attlist, ndxterm.char.mix* }
+# end of tertiary.element
+
+# SortAs: Alternate sort string for index sorting, e.g.,
+# "fourteen" for an element containing "14"
+tertiary.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  primsecter.role.attrib,
+  local.primsecter.attrib
+# end of tertiary.attlist
+
+# end of primsecter.module
+local.seeseealso.attrib = empty
+seeseealso.role.attrib = role.attrib
+see = element see { see.attlist, ndxterm.char.mix* }
+# end of see.element
+see.attlist &=
+  common.attrib, seeseealso.role.attrib, local.seeseealso.attrib
+# end of see.attlist
+seealso = element seealso { seealso.attlist, ndxterm.char.mix* }
+# end of seealso.element
+seealso.attlist &=
+  common.attrib, seeseealso.role.attrib, local.seeseealso.attrib
+# end of seealso.attlist
+
+# end of seeseealso.module
+
+# end of indexterm.content.module
+
+# End of DocBook XML information pool module V4.2 ......................
+
+# ......................................................................
diff --git a/etc/schema/dbsoextbl.rnc b/etc/schema/dbsoextbl.rnc
new file mode 100644 (file)
index 0000000..a547586
--- /dev/null
@@ -0,0 +1,30 @@
+# Definitions specific to the OASIS XML Exchange Table Model.
+
+# Reference OASIS Exchange Table Model
+include "soextbl.rnc" {
+  # Override definition of start
+  start |= notAllowed
+  # Add common attributes and the Label attribute to Table and
+  # InformalTable.
+  bodyatt = common.attrib, label.attrib, tables.role.attrib
+  # Add common attributes to TGroup, ColSpec, TBody, THead, Row, Entry
+  tbl.tgroup.att = common.attrib
+  tbl.colspec.att = common.attrib
+  tbl.tbody.att = common.attrib
+  tbl.thead.att = common.attrib
+  tbl.row.att = common.attrib
+  tbl.entry.att = common.attrib
+  # Content model for Table.
+  tbl.table.mdl =
+    blockinfo?,
+    formalobject.title.content,
+    ndxterm.class*,
+    textobject*,
+    (graphic+ | mediaobject+ | tgroup+)
+  # Allow either objects or inlines; beware of REs between elements.
+  tbl.entry.mdl = (para.char.mix | tabentry.mix)*
+}
+
+common.table.attribs = bodyatt
+
+# end of table.module
diff --git a/etc/schema/dbstart.rnc b/etc/schema/dbstart.rnc
new file mode 100644 (file)
index 0000000..284f9b5
--- /dev/null
@@ -0,0 +1,23 @@
+# This choice of root elements comes from the 1.0b1 RNG schema at
+# http://www.oasis-open.org/docbook/relaxng/1.0b1/index.shtml
+
+start = 
+  set
+  | setindex
+  | book
+  | part
+  | reference
+  | preface
+  | chapter
+  | appendix
+  | article
+  | bibliography
+  | glossary
+  | index
+  | refentry
+  | sect1
+  | sect2
+  | sect3
+  | sect4
+  | sect5
+  | section
diff --git a/etc/schema/docbook-dyntbl.rnc b/etc/schema/docbook-dyntbl.rnc
new file mode 100644 (file)
index 0000000..9bb997f
--- /dev/null
@@ -0,0 +1,18 @@
+# Variant of docbook.rnc that allows the table model to be selected
+# dynamically based on the definitions of cals.table.module and
+# exchange.table.module.  See dbdyntbl.rnc.
+
+# Document (root) elements
+include "dbstart.rnc"
+
+# Notation declarations
+include "dbnotn.rnc"
+
+# Information pool
+include "dbpool.rnc"
+
+# Dynamic Table Model
+include "dbdyntbl.rnc"
+
+# Document hierarchy
+include "dbhier.rnc"
diff --git a/etc/schema/docbook-soextbl.rnc b/etc/schema/docbook-soextbl.rnc
new file mode 100644 (file)
index 0000000..945a621
--- /dev/null
@@ -0,0 +1,17 @@
+# Variant of docbook.rnc that uses the OASIS XML Exchange Table Model
+# rather than the CALS Table Model.
+
+# Document (root) elements
+include "dbstart.rnc"
+
+# Notation declarations
+include "dbnotn.rnc"
+
+# Information pool
+include "dbpool.rnc"
+
+# OASIS XML Exchange Table Model
+include "dbsoextbl.rnc"
+
+# Document hierarchy
+include "dbhier.rnc"
diff --git a/etc/schema/docbook.rnc b/etc/schema/docbook.rnc
new file mode 100644 (file)
index 0000000..d10f614
--- /dev/null
@@ -0,0 +1,48 @@
+# Unofficial DocBook RELAX NG Compact Syntax schema
+
+# This file was generated automatically by Trang
+# (http://www.thaiopensource.com/relaxng/trang.html) from the DocBook
+# XML DTD V4.2 (http://www.oasis-open.org/docbook/xml/4.2/), then
+# changing the definition of start, changing the filenames,
+# editing the comments and adding includes of dbstart.rnc
+# and dbcalstbl.rnc.
+
+# The following copyright applies to the DocBook XML DTD V4.2.
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# Permission to use, copy, modify and distribute the DocBook XML DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# Document (root) elements
+include "dbstart.rnc"
+
+# Notation declarations
+include "dbnotn.rnc"
+
+# Information pool
+include "dbpool.rnc"
+
+# CALS Table Model
+include "dbcalstbl.rnc"
+
+# Document hierarchy
+include "dbhier.rnc"
diff --git a/etc/schema/locate.rnc b/etc/schema/locate.rnc
new file mode 100644 (file)
index 0000000..89230ad
--- /dev/null
@@ -0,0 +1,200 @@
+default namespace this = "http://thaiopensource.com/ns/locating-rules/1.0"
+namespace local = ""
+
+start = locatingRules
+
+locatingRules =  element locatingRules { common, rule* }
+
+rule =
+  \include
+  # | group
+  | applyFollowingRules
+  | documentElement
+  # | doctypePublicId
+  | \namespace
+  | uri
+  | transformURI
+  # | typeIdProcessingInstruction
+  | \default
+  | typeId
+  # | typeIdBase
+  | extensionRule
+## Group of rules. Useful with xml:base.
+group = element group { common, rule* }
+
+\include =
+  element include {
+    common,
+    attribute rules { xsd:anyURI }
+  }
+
+applyFollowingRules =
+  element applyFollowingRules {
+    common,
+    attribute ruleType {
+      "documentElement"
+      | "doctypePublicId"
+      | "namespace"
+      | "uri"
+      | "transformURI"
+      | "typeIdProcessingInstruction"
+      | "default"
+    }
+  }
+
+documentElement =
+  ## Matches if the prefix and/or local name of document element
+  ## match the values of the prefix and localName attributes.
+  element documentElement {
+    common,
+    nameAtts,
+    targetAtt
+  }
+
+## If there's no prefix attribute, then only the local name must match.
+## If there's no local name attribute, then only the prefix must match.
+nameAtts = (prefixAtt, localNameAtt?) | localNameAtt
+
+## prefix="" matches if the document element has no prefix.
+prefixAtt = attribute prefix { (xsd:NCName - "xmlns") | "" }
+localNameAtt = attribute localName { xsd:NCName - "xmlns" }
+
+doctypePublicId =
+  ## Matches if the document has a DOCTYPE declaration with a public
+  ## identifier that, after normalization, matches the value of the
+  ## publicId attribute.
+  element doctypePublicId {
+    common,
+    attribute publicId { publicIdValue },
+    targetAtt
+  }
+
+publicIdValue =
+  xsd:token {
+    ## Newline and tab are excluded, because pattern applies to
+    ## the post-normalization value.
+    pattern = "[\-'()+,./:=?;!*#@$_%a-zA-Z0-9 ]*"
+  }
+
+# This is separate from documentElement so it can be distinguished
+# by applyFollowingRules.
+\namespace =
+  ## Matches if the document element has a namespace URI equal to the value
+  ## of the ns attribute.  A document element with no namespace matches if
+  ## the value of the ns attribute is the empty string.
+  element namespace {
+    common,
+    attribute ns { xsd:string },
+    targetAtt
+  }
+
+uri =
+  ## Matches based on the URI of the document.
+  element uri {
+    common,
+    (resourceAtt | patternAtt),
+    targetAtt
+  }
+
+## Matches if it can be determined that the document resource is
+## the same resource as that identified by the value of the resource
+## attribute.  In determining this, the implementation should apply
+## the semantics of the URI scheme used by the URI.
+resourceAtt = attribute resource { xsd:anyURI }
+
+## Matches if the document's URI matches the pattern specified
+## by the pattern attribute.  A * in the path component matches
+## zero or more characters other than / (after resolving escapes).
+## If the pattern is a relative URI, it means that there must
+## be some URI such that when the pattern is resolved relative
+## to that URI, it matches the document's URI. Thus an empty
+## pattern will always match.
+patternAtt = attribute pattern { uriPattern }
+
+## A pattern for a URI. Same syntax as a URI, except that a * in
+## the path component has a special meaning.
+uriPattern = xsd:anyURI
+
+transformURI =
+  ## Generates a URI for the related resource by transforming
+  ## the URI of the document. Matches if the transformation
+  ## yields a valid URI that identifies an existing resource.
+  element transformURI {
+    common,
+    ## Semantics are the same as the pattern attribute of the uri element.
+    attribute fromPattern { uriPattern },
+    ## The result of the transformation is produced from the toPattern
+    ## by replacing each * by the string that matched the corresponding
+    ## * in the toPattern.  The toPattern is appended to the initial
+    ## part of the document's URI that was not explicitly matched
+    ## by fromPattern.
+    attribute toPattern { uriPattern }
+  }
+
+\default =
+  ## Always matches.
+  element default {
+    common,
+    targetAtt
+  }
+
+## A document can be mapped onto a URI either indirectly via a typeId
+## or directly.
+targetAtt = uriAtt | typeIdAtt
+
+## Specifies the URI of the related resource.
+## xml:base is used if it's relative.
+uriAtt = attribute uri { xsd:anyURI }
+
+## Specifies an identifier of the type of document. typeId and
+## typeIdBase rules will be used to map this to a URI.
+typeIdAtt = attribute typeId { typeIdValue }
+
+## A type identifier can be anything convenient (e.g. a public identifier,
+## a URL or just a string with no formal structure).  Whitespace is
+## normalized like a public identifier before comparing type identifiers
+## for equality.
+typeIdValue = xsd:token
+
+typeIdProcessingInstruction =
+  ## Matches if there's a processing instruction in the prolog
+  ## before any DOCTYPE declaration whose target is the value of
+  ## the target attribute.  The value of the processing instruction
+  ## is interpreted as a typeId, which will be mapped to a
+  ## URI as normal.
+  element typeIdProcessingInstruction {
+    common,
+    attribute target { xsd:NCName }
+  }
+
+typeId =
+  ## Maps a typeId onto a URI.
+  element typeId {
+    common,
+    attribute id { typeIdValue },
+    targetAtt
+  }
+
+typeIdBase =
+  ## Used to map a typeId onto a URI. First, any URI reserved characters
+  ## are URI encoded. If the append attribute is specified, it is appended.
+  ## This is then treated as a URI. If relative, it is resolved using
+  ## the applicable base URI as usual.  If the resulting URI identifies
+  ## an existing resource, then the typeId is mapped to this resource.
+  ## This is intended to be useful with file URIs.
+  element typeIdBase {
+    common,
+    attribute append { xsd:string }?
+  }
+
+extensionRule =
+  element * - this:* {
+    attribute * { text }*, (text|anyElement)*
+  }
+
+anyElement = element * { attribute * { text }*, (text|anyElement)* }
+
+common = 
+  # attribute xml:base { xsd:anyURI }?,
+  attribute * - (xml:base|this:*|local:*) { text }*
diff --git a/etc/schema/rdfxml.rnc b/etc/schema/rdfxml.rnc
new file mode 100644 (file)
index 0000000..9730322
--- /dev/null
@@ -0,0 +1,205 @@
+#
+# RELAX NG Compact Schema for RDF/XML Syntax
+#
+# This schema is for information only and NON-NORMATIVE
+#
+# It is based on one originally written by James Clark in
+# http://lists.w3.org/Archives/Public/www-rdf-comments/2001JulSep/0248.html
+# and updated with later changes.
+#
+
+namespace local = ""
+namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
+
+
+start = doc
+
+
+# I cannot seem to do this in RNGC so they are expanded in-line
+
+# coreSyntaxTerms = rdf:RDF | rdf:ID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype
+# syntaxTerms = coreSyntaxTerms | rdf:Description | rdf:li
+# oldTerms    = rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID
+# nodeElementURIs       = * - ( coreSyntaxTerms | rdf:li | oldTerms )
+# propertyElementURIs   = * - ( coreSyntaxTerms | rdf:Description | oldTerms )
+# propertyAttributeURIs = * - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms )
+
+# Also needed to allow rdf:li on all property element productions
+# since we can't capture the rdf:li rewriting to rdf_<n> in relaxng
+
+# Need to add these explicitly
+xmllang = attribute xml:lang { text }
+xmlbase = attribute xml:base { text }
+# and to forbid every other xml:* attribute, element
+
+doc = 
+  RDF
+
+RDF =
+  element rdf:RDF { 
+     xmllang?, xmlbase?, nodeElementList
+}
+
+nodeElementList = 
+  nodeElement*
+
+  # Should be something like:
+  #  ws* , (  nodeElement , ws* )*
+  # but RELAXNG does this by default, ignoring whitespace separating tags.
+
+nodeElement =
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype | rdf:li |
+                rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID ) {
+      (idAttr | nodeIdAttr | aboutAttr )?, xmllang?, xmlbase?, propertyAttr*, propertyEltList
+  }
+
+  # It is not possible to say "and not things
+  # beginning with _ in the rdf: namespace" in RELAX NG.
+
+ws = 
+  " "
+
+  # Not used in this RELAX NG schema; but should be any legal XML
+  # whitespace defined by http://www.w3.org/TR/2000/REC-xml-20001006#NT-S
+
+
+propertyEltList = 
+  propertyElt*
+
+  # Should be something like:
+  #  ws* , ( propertyElt , ws* )*
+  # but RELAXNG does this by default, ignoring whitespace separating tags.
+
+propertyElt = 
+  resourcePropertyElt | 
+  literalPropertyElt | 
+  parseTypeLiteralPropertyElt |
+  parseTypeResourcePropertyElt |
+  parseTypeCollectionPropertyElt |
+  parseTypeOtherPropertyElt |
+  emptyPropertyElt
+
+resourcePropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, xmllang?, xmlbase?, nodeElement
+  }
+
+literalPropertyElt =
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      (idAttr | datatypeAttr )?, xmllang?, xmlbase?, text 
+  }
+
+parseTypeLiteralPropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, parseLiteral, xmllang?, xmlbase?, literal 
+  }
+
+parseTypeResourcePropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, parseResource, xmllang?, xmlbase?, propertyEltList
+  }
+
+parseTypeCollectionPropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, xmllang?, xmlbase?, parseCollection, nodeElementList
+  }
+
+parseTypeOtherPropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, xmllang?, xmlbase?, parseOther, any
+  }
+
+emptyPropertyElt =
+   element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                 rdf:resource | rdf:nodeID | rdf:datatype |
+                 rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                 xml:* ) {
+       idAttr?, (resourceAttr | nodeIdAttr)?, xmllang?, xmlbase?, propertyAttr*
+   }
+
+idAttr = 
+  attribute rdf:ID { 
+      IDsymbol 
+  }
+
+nodeIdAttr = 
+  attribute rdf:nodeID { 
+      IDsymbol 
+  }
+
+aboutAttr = 
+  attribute rdf:about { 
+      URI-reference 
+  }
+
+propertyAttr = 
+  attribute * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                  rdf:resource | rdf:nodeID | rdf:datatype | rdf:li |
+                  rdf:Description | rdf:aboutEach |
+                 rdf:aboutEachPrefix | rdf:bagID |
+                  xml:* ) {
+      string
+  }
+
+resourceAttr = 
+  attribute rdf:resource {
+      URI-reference 
+  }
+
+datatypeAttr = 
+  attribute rdf:datatype {
+      URI-reference 
+  }
+
+parseLiteral = 
+  attribute rdf:parseType {
+      "Literal" 
+  }
+
+parseResource = 
+  attribute rdf:parseType {
+      "Resource"
+  }
+
+parseCollection = 
+  attribute rdf:parseType {
+      "Collection"
+  }
+
+parseOther = 
+  attribute rdf:parseType {
+      text
+  }
+
+URI-reference = 
+  string
+
+literal =
+  any
+
+IDsymbol = 
+  xsd:NMTOKEN
+
+any =
+  mixed { element * { attribute * { text }*, any }* }
+
diff --git a/etc/schema/relaxng.rnc b/etc/schema/relaxng.rnc
new file mode 100644 (file)
index 0000000..08686ac
--- /dev/null
@@ -0,0 +1,63 @@
+# RELAX NG XML syntax expressed in RELAX NG Compact syntax.
+
+default namespace rng = "http://relaxng.org/ns/structure/1.0"
+namespace local = ""
+datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
+
+start = pattern
+
+pattern =
+  element element { (nameQName | nameClass), (common & pattern+) }
+  | element attribute { (nameQName | nameClass), (common & pattern?) }
+  | element group|interleave|choice|optional
+            |zeroOrMore|oneOrMore|list|mixed { common & pattern+ }
+  | element ref|parentRef { nameNCName, common }
+  | element empty|notAllowed|text { common }
+  | element data { type, param*, (common & exceptPattern?) }
+  | element value { commonAttributes, type?, xsd:string }
+  | element externalRef { href, common }
+  | element grammar { common & grammarContent* }
+
+param = element param { commonAttributes, nameNCName, xsd:string }
+
+exceptPattern = element except { common & pattern+ }
+
+grammarContent = 
+  definition
+  | element div { common & grammarContent* }
+  | element include { href, (common & includeContent*) }
+
+includeContent =
+  definition
+  | element div { common & includeContent* }
+
+definition =
+  element start { combine?, (common & pattern+) }
+  | element define { nameNCName, combine?, (common & pattern+) }
+
+combine = attribute combine { "choice" | "interleave" }
+
+nameClass = 
+  element name { commonAttributes, xsd:QName }
+  | element anyName { common & exceptNameClass? }
+  | element nsName { common & exceptNameClass? }
+  | element choice { common & nameClass+ }
+
+exceptNameClass = element except { common & nameClass+ }
+
+nameQName = attribute name { xsd:QName }
+nameNCName = attribute name { xsd:NCName }
+href = attribute href { xsd:anyURI }
+type = attribute type { xsd:NCName }
+
+common = commonAttributes, foreignElement*
+
+commonAttributes = 
+  attribute ns { xsd:string }?,
+  attribute datatypeLibrary { xsd:anyURI }?,
+  foreignAttribute*
+
+foreignElement = element * - rng:* { (anyAttribute | text | anyElement)* }
+foreignAttribute = attribute * - (rng:*|local:*) { text }
+anyElement = element * { (anyAttribute | text | anyElement)* }
+anyAttribute = attribute * { text }
diff --git a/etc/schema/schemas.xml b/etc/schema/schemas.xml
new file mode 100644 (file)
index 0000000..e17b063
--- /dev/null
@@ -0,0 +1,36 @@
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <transformURI fromPattern="*.xml" toPattern="*.rnc"/>
+
+  <uri pattern="*.xsl" typeId="XSLT"/>
+  <uri pattern="*.html" typeId="XHTML"/>
+  <uri pattern="*.rng" typeId="RELAX NG"/>
+  <uri pattern="*.rdf" typeId="RDF"/>
+  
+  <namespace ns="http://www.w3.org/1999/XSL/Transform" typeId="XSLT"/>
+  <namespace ns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" typeId="RDF"/>
+  <namespace ns="http://www.w3.org/1999/xhtml" typeId="XHTML"/>
+  <namespace ns="http://relaxng.org/ns/structure/1.0" typeId="RELAX NG"/>
+  <namespace ns="http://thaiopensource.com/ns/locating-rules/1.0"
+            uri="locate.rnc"/>
+
+  <documentElement localName="stylesheet" typeId="XSLT"/>
+  <documentElement prefix="xsl" localName="transform" typeId="XSLT"/>
+
+  <documentElement localName="html" typeId="XHTML"/>
+
+  <documentElement localName="grammar" typeId="RELAX NG"/>
+
+  <documentElement prefix="" localName="article" typeId="DocBook"/>
+  <documentElement prefix="" localName="book" typeId="DocBook"/>
+
+  <documentElement localName="RDF" typeId="RDF"/>
+  <documentElement prefix="rdf" typeId="RDF"/>
+  
+  <documentElement localName="locatingRules" uri="locate.rnc"/>
+
+  <typeId id="XSLT" uri="xslt.rnc"/>
+  <typeId id="RELAX NG" uri="relaxng.rnc"/>
+  <typeId id="XHTML" uri="xhtml.rnc"/>
+  <typeId id="DocBook" uri="docbook.rnc"/>
+  <typeId id="RDF" uri="rdfxml.rnc"/>
+</locatingRules>
diff --git a/etc/schema/soextbl.rnc b/etc/schema/soextbl.rnc
new file mode 100644 (file)
index 0000000..2e69127
--- /dev/null
@@ -0,0 +1,260 @@
+# XML EXCHANGE TABLE MODEL DECLARATION MODULE
+
+# This set of declarations defines the XML version of the Exchange
+# Table Model as of the date shown in the Formal Public Identifier
+# (FPI) for this entity.
+# 
+# This set of declarations may be referred to using a public external
+# entity declaration and reference as shown in the following three
+# lines:
+# 
+# <!ENTITY % calstblx
+#   PUBLIC "-//OASIS//DTD XML Exchange Table Model 19990315//EN">
+#   %calstblx;
+# 
+# If various parameter entities used within this set of declarations
+# are to be given non-default values, the appropriate declarations
+# should be given before calling in this package (i.e., before the
+# "%calstblx;" reference).
+
+# The motivation for this XML version of the Exchange Table Model
+# is simply to create an XML version of the SGML Exchange Table
+# Model. By design, no effort has been made to "improve" the model.
+# 
+# This XML version incorporates the logical bare minimum changes
+# necessary to make the Exchange Table Model a valid XML DTD.
+
+# The XML version of the Exchange Table Model differs from
+# the SGML version in the following ways:
+# 
+# The following parameter entities have been removed:
+# 
+#   - tbl.table.excep, tbl.hdft.excep, tbl.row.excep, tbl.entry.excep
+#     There are no exceptions in XML. The following normative statement
+#     is made in lieu of exceptions: the exchange table model explicitly
+#     forbids a table from occurring within another table. If the
+#     content model of an entry includes a table element, then this
+#     cannot be enforced by the DTD, but it is a deviation from the
+#     exchange table model to include a table within a table.
+# 
+#   - tbl.hdft.name, tbl.hdft.mdl, tbl.hdft.excep, tbl.hdft.att
+#     The motivation for these elements was to change the table
+#     header/footer elements. Since XML does not allow element declarations
+#     to contain name groups, and the exchange table model does not
+#     allow a table to contain footers, the continued presence of these
+#     attributes seems unnecessary.
+# 
+# The following parameter entity has been added:
+# 
+#   - tbl.thead.att
+#     This entity parameterizes the attributes on thead. It replaces
+#     the tbl.hdft.att parameter entity.
+# 
+# Other miscellaneous changes:
+# 
+#   - Tag ommission indicators have been removed
+#   - Comments have been removed from declarations
+#   - NUMBER attributes have been changed to NMTOKEN
+#   - NUTOKEN attributes have been to changed to NMTOKEN
+#   - Removed the grouping characters around the content model
+#     parameter entry for the 'entry' element. This is necessary
+#     so that an entry can contain #PCDATA and be defined as an
+#     optional, repeatable OR group beginning with #PCDATA.
+
+# This entity includes a set of element and attribute declarations
+# that partially defines the Exchange table model.  However, the model
+# is not well-defined without the accompanying natural language
+# description of the semantics (meanings) of these various elements,
+# attributes, and attribute values.  The semantic writeup, also available
+# from SGML Open, should be used in conjunction with this entity.
+
+# In order to use the Exchange table model, various parameter entity
+# declarations are required.  A brief description is as follows:
+# 
+# ENTITY NAME      WHERE USED              WHAT IT IS
+# 
+# %yesorno         In ATTLIST of:          An attribute declared value
+#                  almost all elements     for a "boolean" attribute
+# 
+# %paracon         In content model of:    The "text" (logical content)
+#                  <entry>                 of the model group for <entry>
+# 
+# %titles          In content model of:    The "title" part of the model
+#                  table element           group for the table element
+# 
+# %tbl.table.name  In declaration of:      The name of the "table"
+#                  table element           element
+# 
+# %tbl.table-titles.mdl In content model of: The model group for the title
+#                  table elements          part of the content model for
+#                                          table element
+# 
+# %tbl.table.mdl   In content model of:    The model group for the content
+#                  table elements          model for table element,
+#                                          often (and by default) defined
+#                                          in terms of %tbl.table-titles.mdl
+#                                          and tgroup
+# 
+# %tbl.table.att   In ATTLIST of:          Additional attributes on the
+#                  table element           table element
+# 
+# %bodyatt         In ATTLIST of:          Additional attributes on the
+#                  table element           table element (for backward
+#                                          compatibility with the SGML
+#                                          model)
+# 
+# %tbl.tgroup.mdl  In content model of:    The model group for the content
+#                  <tgroup>                model for <tgroup>
+# 
+# %tbl.tgroup.att  In ATTLIST of:          Additional attributes on the
+#                  <tgroup>                <tgroup> element
+# 
+# %tbl.thead.att   In ATTLIST of:          Additional attributes on the
+#                  <thead>                 <thead> element
+# 
+# %tbl.tbody.att   In ATTLIST of:          Additional attributes on the
+#                  <tbody>                 <tbody> element
+# 
+# %tbl.colspec.att In ATTLIST of:          Additional attributes on the
+#                  <colspec>               <colspec> element
+# 
+# %tbl.row.mdl     In content model of:    The model group for the content
+#                  <row>                   model for <row>
+# 
+# %tbl.row.att     In ATTLIST of:          Additional attributes on the
+#                  <row>                   <row> element
+# 
+# %tbl.entry.mdl   In content model of:    The model group for the content
+#                  <entry>                 model for <entry>
+# 
+# %tbl.entry.att   In ATTLIST of:          Additional attributes on the
+#                  <entry>                 <entry> element
+# 
+# This set of declarations will use the default definitions shown below
+# for any of these parameter entities that are not declared before this
+# set of declarations is referenced.
+
+# These definitions are not directly related to the table model, but are
+# used in the default CALS table model and may be defined elsewhere (and
+# prior to the inclusion of this table module) in the referencing DTD.
+
+yesorno = xsd:NMTOKEN
+# no if zero(s), yes if any other value
+pcd = text
+paracon = pcd
+# default for use in entry content
+
+# The parameter entities as defined below change and simplify the CALS table
+# model as published (as part of the Example DTD) in MIL-HDBK-28001.  The
+# resulting simplified DTD has support from the SGML Open vendors and is
+# therefore more interoperable among different systems.
+# 
+# These following declarations provide the Exchange default definitions
+# for these entities.  However, these entities can be redefined (by giving
+# the appropriate parameter entity declaration(s) prior to the reference
+# to this Table Model declaration set entity) to fit the needs of the
+# current application.
+# 
+# Note, however, that changes may have significant effect on the ability to
+# interchange table information.  These changes may manifest themselves
+# in useability, presentation, and possible structure information degradation.
+tbl.table-titles.mdl = title
+tbl.table-main.mdl = tgroup+
+tbl.table.mdl = tbl.table-titles.mdl | tbl.table-main.mdl
+tbl.table.att = attribute pgwide { yesorno }?
+bodyatt = empty
+tbl.tgroup.mdl = colspec*, thead?, tbody
+tbl.tgroup.att = empty
+tbl.thead.att = empty
+tbl.tbody.att = empty
+tbl.colspec.att = empty
+tbl.row.mdl = entry+
+tbl.row.att = empty
+tbl.entry.mdl = paracon*
+tbl.entry.att = empty
+# =====  Element and attribute declarations follow. =====
+
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.table.name       "table"
+# ENTITY % tbl.table-titles.mdl "%titles;,"
+# ENTITY % tbl.table.mdl        "%tbl.table-titles; tgroup+"
+# ENTITY % tbl.table.att        "
+#                    pgwide          %yesorno;       #IMPLIED "
+table = element table { table.attlist, tbl.table.mdl }
+table.attlist &=
+  attribute frame {
+    "top" | "bottom" | "topbot" | "all" | "sides" | "none"
+  }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  tbl.table.att,
+  bodyatt
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.tgroup.mdl    "colspec*,thead?,tbody"
+# ENTITY % tbl.tgroup.att    ""
+tgroup = element tgroup { tgroup.attlist, tbl.tgroup.mdl }
+tgroup.attlist &=
+  attribute cols { xsd:NMTOKEN },
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  tbl.tgroup.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.colspec.att   ""
+colspec = element colspec { colspec.attlist, empty }
+colspec.attlist &=
+  attribute colnum { xsd:NMTOKEN }?,
+  attribute colname { xsd:NMTOKEN }?,
+  attribute colwidth { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { xsd:NMTOKEN }?,
+  tbl.colspec.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.thead.att      ""
+thead = element thead { thead.attlist, row+ }
+thead.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.thead.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.tbody.att     ""
+tbody = element tbody { tbody.attlist, row+ }
+tbody.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.tbody.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.row.mdl       "entry+"
+# ENTITY % tbl.row.att       ""
+row = element row { row.attlist, tbl.row.mdl }
+row.attlist &=
+  attribute rowsep { yesorno }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.row.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % paracon           "#PCDATA"
+# ENTITY % tbl.entry.mdl     "(%paracon;)*"
+# ENTITY % tbl.entry.att     ""
+entry = element entry { entry.attlist, tbl.entry.mdl }
+entry.attlist &=
+  attribute colname { xsd:NMTOKEN }?,
+  attribute namest { xsd:NMTOKEN }?,
+  attribute nameend { xsd:NMTOKEN }?,
+  attribute morerows { xsd:NMTOKEN }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { xsd:NMTOKEN }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.entry.att
+title |= notAllowed
+start = table
diff --git a/etc/schema/xhtml-applet.rnc b/etc/schema/xhtml-applet.rnc
new file mode 100644 (file)
index 0000000..115f1cb
--- /dev/null
@@ -0,0 +1,19 @@
+# Applet Module
+
+applet =
+  element applet {
+    applet.attlist,
+    # No restrictions on mixed content in TREX.
+    param*,
+    Flow.model
+  }
+applet.attlist =
+  Core.attrib,
+  attribute alt { Text.datatype },
+  attribute archive { text }?,
+  attribute code { text }?,
+  attribute codebase { URI.datatype }?,
+  attribute object { text }?,
+  attribute height { Length.datatype },
+  attribute width { Length.datatype }
+Inline.class |= applet
diff --git a/etc/schema/xhtml-attribs.rnc b/etc/schema/xhtml-attribs.rnc
new file mode 100644 (file)
index 0000000..ef653c7
--- /dev/null
@@ -0,0 +1,14 @@
+# Common Attributes Module
+
+id.attrib = attribute id { ID.datatype }?
+class.attrib = attribute class { NMTOKENS.datatype }?
+title.attrib = attribute title { Text.datatype }?
+Core.attrib = id.attrib, class.attrib, title.attrib
+lang.attrib = attribute xml:lang { LanguageCode.datatype }?
+I18n.attrib = lang.attrib
+Common.attrib = Core.attrib, I18n.attrib
+CommonIdRequired.attrib =
+  attribute id { ID.datatype },
+  class.attrib,
+  title.attrib,
+  I18n.attrib
diff --git a/etc/schema/xhtml-base.rnc b/etc/schema/xhtml-base.rnc
new file mode 100644 (file)
index 0000000..154dfce
--- /dev/null
@@ -0,0 +1,5 @@
+# Base Module
+
+base = element base { base.attlist }
+base.attlist = attribute href { URI.datatype }
+head.content &= base?
diff --git a/etc/schema/xhtml-basic-form.rnc b/etc/schema/xhtml-basic-form.rnc
new file mode 100644 (file)
index 0000000..c0a78a1
--- /dev/null
@@ -0,0 +1,63 @@
+# Simplified Forms Module
+
+form =
+  element form {
+    form.attlist,
+    # Don't use Block.model, because this gets redefined by the
+    # legacy module.
+    Block.class+
+  }
+form.attlist =
+  Common.attrib,
+  attribute action { URI.datatype },
+  attribute method { "get" | "post" }?,
+  attribute enctype { ContentType.datatype }?
+label = element label { label.attlist, Inline.model }
+label.attlist =
+  Common.attrib,
+  attribute for { IDREF.datatype }?,
+  attribute accesskey { Character.datatype }?
+input = element input { input.attlist }
+input.attlist =
+  Common.attrib,
+  attribute type { InputType.class }?,
+  attribute name { text }?,
+  attribute value { text }?,
+  attribute checked { "checked" }?,
+  attribute size { text }?,
+  attribute maxlength { Number.datatype }?,
+  attribute src { URI.datatype }?,
+  attribute accesskey { Character.datatype }?
+InputType.class =
+  "text"
+  | "password"
+  | "checkbox"
+  | "radio"
+  | "submit"
+  | "reset"
+  | "hidden"
+select = element select { select.attlist, option+ }
+select.attlist =
+  Common.attrib,
+  attribute name { text }?,
+  attribute size { Number.datatype }?,
+  attribute multiple { "multiple" }?
+option =
+  element option {
+    Common.attrib,
+    attribute selected { "selected" }?,
+    attribute value { text }?,
+    text
+  }
+textarea = element textarea { textarea.attlist }
+textarea.attlist =
+  Common.attrib,
+  attribute name { text }?,
+  attribute rows { Number.datatype },
+  attribute cols { Number.datatype },
+  attribute accesskey { Character.datatype }?,
+  text
+Form.class = form
+Formctrl.class = input | label | select | textarea
+Block.class |= Form.class
+Inline.class |= Formctrl.class
diff --git a/etc/schema/xhtml-basic-table.rnc b/etc/schema/xhtml-basic-table.rnc
new file mode 100644 (file)
index 0000000..97e10a5
--- /dev/null
@@ -0,0 +1,28 @@
+# Basic Tables Module
+
+table = element table { table.attlist, caption?, tr+ }
+table.attlist =
+  Common.attrib,
+  attribute summary { Text.datatype }?
+caption = element caption { caption.attlist, Inline.model }
+caption.attlist = Common.attrib
+tr = element tr { tr.attlist, (th | td)+ }
+tr.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+th = element th { th.attlist, Flow.model }
+th.attlist = Cell.attrib
+td = element td { td.attlist, Flow.model }
+td.attlist = Cell.attrib
+Cell.attrib =
+  Common.attrib,
+  attribute abbr { Text.datatype }?,
+  attribute axis { text }?,
+  attribute headers { IDREFS.datatype }?,
+  scope.attrib,
+  attribute rowspan { Number.datatype }?,
+  attribute colspan { Number.datatype }?,
+  CellHAlign.attrib,
+  CellVAlign.attrib
+CellHAlign.attrib = attribute align { "left" | "center" | "right" }?
+CellVAlign.attrib = attribute valign { "top" | "middle" | "bottom" }?
+scope.attrib = attribute scope { "row" | "col" }?
+Block.class |= table
diff --git a/etc/schema/xhtml-bdo.rnc b/etc/schema/xhtml-bdo.rnc
new file mode 100644 (file)
index 0000000..5658be3
--- /dev/null
@@ -0,0 +1,7 @@
+# Bi-directional Module
+
+bdo = element bdo { bdo.attlist, Inline.model }
+bdo.attlist = Core.attrib, lang.attrib, dir.attrib
+dir.attrib = attribute dir { "ltr" | "rtl" }
+I18n.attrib &= dir.attrib?
+Inline.class |= bdo
diff --git a/etc/schema/xhtml-csismap.rnc b/etc/schema/xhtml-csismap.rnc
new file mode 100644 (file)
index 0000000..abd51f1
--- /dev/null
@@ -0,0 +1,29 @@
+# Client-side Image Map Module
+
+area = element area { area.attlist }
+area.attlist =
+  Common.attrib,
+  attribute href { URI.datatype }?,
+  shape.attrib,
+  coords.attrib,
+  attribute nohref { "nohref" }?,
+  attribute alt { Text.datatype },
+  attribute tabindex { Number.datatype }?,
+  attribute accesskey { Character.datatype }?
+map =
+  element map {
+    map.attlist,
+    (# This does not use Block.mix
+     # because loose.dtd doesn't use %Flow;
+     Block.class
+     | area)+
+  }
+map.attlist = CommonIdRequired.attrib
+a.attlist &= shape.attrib, coords.attrib
+img.attlist &= usemap.attlist
+object.attlist &= usemap.attlist
+usemap.attlist = attribute usemap { IDREF.datatype }?
+shape.attrib =
+  attribute shape { "rect" | "circle" | "poly" | "default" }?
+coords.attrib = attribute coords { text }?
+Inline.class |= map
diff --git a/etc/schema/xhtml-datatypes.rnc b/etc/schema/xhtml-datatypes.rnc
new file mode 100644 (file)
index 0000000..5965980
--- /dev/null
@@ -0,0 +1,47 @@
+# Datatypes Module
+
+# Length defined for cellpadding/cellspacing
+
+# nn for pixels or nn% for percentage length
+Length.datatype = text
+# space-separated list of link types
+LinkTypes.datatype = NMTOKENS.datatype
+# single or comma-separated list of media descriptors
+MediaDesc.datatype = text
+# pixel, percentage, or relative
+MultiLength.datatype = text
+# one or more digits (NUMBER)
+Number.datatype = text
+# integer representing length in pixels
+Pixels.datatype = text
+# script expression
+Script.datatype = text
+# textual content
+Text.datatype = text
+# Imported Datatypes ................................
+
+# a single character from [ISO10646]
+Character.datatype = text
+# a character encoding, as per [RFC2045]
+Charset.datatype = text
+# a space separated list of character encodings, as per [RFC2045]
+Charsets.datatype = text
+# media type, as per [RFC2045]
+ContentType.datatype = text
+# comma-separated list of media types, as per [RFC2045]
+ContentTypes.datatype = text
+# date and time information. ISO date format
+Datetime.datatype = text
+# formal public identifier, as per [ISO8879]
+FPI.datatype = text
+# a language code, as per [RFC1766]
+LanguageCode.datatype = xsd:language
+# a Uniform Resource Identifier, see [URI]
+URI.datatype = xsd:anyURI
+# a space-separated list of Uniform Resource Identifiers, see [URI]
+URIs.datatype = text
+NMTOKEN.datatype = xsd:NMTOKEN
+NMTOKENS.datatype = xsd:NMTOKENS
+ID.datatype = xsd:ID
+IDREF.datatype = xsd:IDREF
+IDREFS.datatype = xsd:IDREFS
diff --git a/etc/schema/xhtml-edit.rnc b/etc/schema/xhtml-edit.rnc
new file mode 100644 (file)
index 0000000..4301fc2
--- /dev/null
@@ -0,0 +1,12 @@
+# Edit Module
+
+del = element del { del.attlist, Inline.model }
+del.attlist = Edit.attrib
+ins = element ins { ins.attlist, Inline.model }
+ins.attlist = Edit.attrib
+Edit.attrib =
+  attribute cite { URI.datatype }?,
+  attribute datetime { Datetime.datatype }?
+Edit.class = del | ins
+Inline.class |= Edit.class
+Block.class |= Edit.class
diff --git a/etc/schema/xhtml-events.rnc b/etc/schema/xhtml-events.rnc
new file mode 100644 (file)
index 0000000..5368742
--- /dev/null
@@ -0,0 +1,47 @@
+# Events Module
+
+a.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+area.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+form.attlist &=
+  attribute onreset { Script.datatype }?,
+  attribute onsubmit { Script.datatype }?
+body.attlist &=
+  attribute onload { Script.datatype }?,
+  attribute onunload { Script.datatype }?
+label.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+input.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onchange { Script.datatype }?,
+  attribute onfocus { Script.datatype }?,
+  attribute onselect { Script.datatype }?
+select.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onchange { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+textarea.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onchange { Script.datatype }?,
+  attribute onfocus { Script.datatype }?,
+  attribute onselect { Script.datatype }?
+button.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+Events.attrib =
+  attribute onclick { Script.datatype }?,
+  attribute ondblclick { Script.datatype }?,
+  attribute onmousedown { Script.datatype }?,
+  attribute onmouseup { Script.datatype }?,
+  attribute onmouseover { Script.datatype }?,
+  attribute onmousemove { Script.datatype }?,
+  attribute onmouseout { Script.datatype }?,
+  attribute onkeypress { Script.datatype }?,
+  attribute onkeydown { Script.datatype }?,
+  attribute onkeyup { Script.datatype }?
+Common.attrib &= Events.attrib
+CommonIdRequired.attrib &= Events.attrib
diff --git a/etc/schema/xhtml-form.rnc b/etc/schema/xhtml-form.rnc
new file mode 100644 (file)
index 0000000..f554419
--- /dev/null
@@ -0,0 +1,49 @@
+# Forms Module
+
+# Unlike the DTD implementation, this builds on the basic-form module
+
+include "xhtml-basic-form.rnc" {
+  select = element select { select.attlist, (option | optgroup)+ }
+}
+form.attlist &=
+  attribute accept-charset { Charsets.datatype }?,
+  attribute accept { ContentTypes.datatype }?
+input.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute readonly { "readonly" }?,
+  attribute alt { text }?,
+  attribute tabindex { Number.datatype }?,
+  attribute accept { ContentTypes.datatype }?
+InputType.class |= "image" | "button"
+select.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute tabindex { Number.datatype }?
+option.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute label { Text.datatype }?
+optgroup = element optgroup { optgroup.attlist, option+ }
+optgroup.attlist =
+  Common.attrib,
+  attribute disabled { "disabled" }?,
+  attribute label { Text.datatype }
+textarea.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute readonly { "readonly" }?,
+  attribute tabindex { Number.datatype }?
+fieldset = element fieldset { fieldset.attlist, legend, Flow.model }
+fieldset.attlist = Common.attrib
+button = element button { button.attlist, Flow.model }
+button.attlist =
+  Common.attrib,
+  attribute name { text }?,
+  attribute value { text }?,
+  attribute type { "button" | "submit" | "reset" }?,
+  attribute disabled { "disabled" }?,
+  attribute tabindex { Number.datatype }?,
+  attribute accesskey { Character.datatype }?
+legend = element legend { legend.attlist, Inline.model }
+legend.attlist =
+  Common.attrib,
+  attribute accesskey { Character.datatype }?
+Form.class |= fieldset
+Formctrl.class |= button
diff --git a/etc/schema/xhtml-frames.rnc b/etc/schema/xhtml-frames.rnc
new file mode 100644 (file)
index 0000000..9b9f9ba
--- /dev/null
@@ -0,0 +1,26 @@
+# Frames Module
+
+include "xhtml-struct.rnc" {
+  html = element html { html.attlist, head, frameset }
+}
+frameset =
+  element frameset {
+    frameset.attlist,
+    ((frameset | frame)+ & noframes?)
+  }
+frameset.attlist =
+  Core.attrib,
+  attribute cols { MultiLength.datatype }?,
+  attribute rows { MultiLength.datatype }?
+frame = element frame { frame.attlist }
+frame.attlist =
+  Core.attrib,
+  attribute longdesc { URI.datatype }?,
+  attribute src { URI.datatype }?,
+  attribute frameborder { "1" | "0" }?,
+  attribute marginwidth { Pixels.datatype }?,
+  attribute marginheight { Pixels.datatype }?,
+  attribute noresize { "noresize" }?,
+  attribute scrolling { "yes" | "no" | "auto" }?
+noframes = element noframes { noframes.attlist, body }
+noframes.attlist = Common.attrib
diff --git a/etc/schema/xhtml-hypertext.rnc b/etc/schema/xhtml-hypertext.rnc
new file mode 100644 (file)
index 0000000..82e7686
--- /dev/null
@@ -0,0 +1,16 @@
+# Hypertext Module
+
+# Depends on text module.
+
+a = element a { a.attlist, Inline.model }
+a.attlist =
+  Common.attrib,
+  attribute href { URI.datatype }?,
+  attribute charset { Charset.datatype }?,
+  attribute type { ContentType.datatype }?,
+  attribute hreflang { LanguageCode.datatype }?,
+  attribute rel { LinkTypes.datatype }?,
+  attribute rev { LinkTypes.datatype }?,
+  attribute accesskey { Character.datatype }?,
+  attribute tabindex { Number.datatype }?
+Inline.class |= a
diff --git a/etc/schema/xhtml-iframe.rnc b/etc/schema/xhtml-iframe.rnc
new file mode 100644 (file)
index 0000000..bbcdd44
--- /dev/null
@@ -0,0 +1,14 @@
+# Iframe Module
+
+iframe = element iframe { iframe.attlist, Flow.model }
+iframe.attlist =
+  Core.attrib,
+  attribute longdesc { URI.datatype }?,
+  attribute src { URI.datatype }?,
+  attribute frameborder { "1" | "0" }?,
+  attribute width { Length.datatype }?,
+  attribute height { Length.datatype }?,
+  attribute marginwidth { Pixels.datatype }?,
+  attribute marginheight { Pixels.datatype }?,
+  attribute scrolling { "yes" | "no" | "auto" }?
+Inline.class |= iframe
diff --git a/etc/schema/xhtml-image.rnc b/etc/schema/xhtml-image.rnc
new file mode 100644 (file)
index 0000000..e1d6e56
--- /dev/null
@@ -0,0 +1,11 @@
+# Image Module
+
+img = element img { img.attlist }
+img.attlist =
+  Common.attrib,
+  attribute src { URI.datatype },
+  attribute alt { Text.datatype },
+  attribute longdesc { URI.datatype }?,
+  attribute height { Length.datatype }?,
+  attribute width { Length.datatype }?
+Inline.class |= img
diff --git a/etc/schema/xhtml-inlstyle.rnc b/etc/schema/xhtml-inlstyle.rnc
new file mode 100644 (file)
index 0000000..aa69b75
--- /dev/null
@@ -0,0 +1,3 @@
+# Inline Style Module
+
+Core.attrib &= attribute style { text }?
diff --git a/etc/schema/xhtml-legacy.rnc b/etc/schema/xhtml-legacy.rnc
new file mode 100644 (file)
index 0000000..b15061f
--- /dev/null
@@ -0,0 +1,100 @@
+# Legacy Module
+
+lang.attrib &= attribute lang { LanguageCode.datatype }?
+basefont = element basefont { basefont.attlist }
+basefont.attlist = id.attrib, Font.attrib
+center = element center { center.attlist, Flow.model }
+center.attlist = Common.attrib
+font = element font { font.attlist, Inline.model }
+font.attlist = Core.attrib, I18n.attrib, Font.attrib
+Font.attrib =
+  attribute size { text }?,
+  attribute color { Color.datatype }?,
+  attribute face { text }?
+s = element s { s.attlist, Inline.model }
+s.attlist = Common.attrib
+strike = element strike { strike.attlist, Inline.model }
+strike.attlist = Common.attrib
+u = element u { u.attlist, Inline.model }
+u.attlist = Common.attrib
+dir = element dir { dir.attlist, li.noblock+ }
+dir.attlist =
+  Common.attrib,
+  attribute compact { "compact" }?
+menu = element menu { menu.attlist, li.noblock+ }
+menu.attlist =
+  Common.attrib,
+  attribute compact { "compact" }?
+li.noblock = element li { li.attlist, Inline.model }
+isindex = element isindex { isindex.attlist }
+isindex.attlist =
+  Core.attrib,
+  I18n.attrib,
+  attribute prompt { Text.datatype }?
+applet.attlist &=
+  attribute align { "top" | "middle" | "bottom" | "left" | "right" }?,
+  attribute hspace { Pixels.datatype }?,
+  attribute vspace { Pixels.datatype }?
+body.attlist &=
+  attribute background { URI.datatype }?,
+  attribute bgcolor { Color.datatype }?,
+  attribute text { Color.datatype }?,
+  attribute link { Color.datatype }?,
+  attribute vlink { Color.datatype }?,
+  attribute alink { Color.datatype }?
+br.attlist &= attribute clear { "left" | "all" | "right" | "none" }?
+caption.attlist &= align.attrib
+div.attlist &= align.attrib
+# Not in the CR, but surely an error.
+dl.attlist &= attribute compact { "compact" }?
+Heading.attrib &= align.attrib
+hr.attlist &=
+  attribute align { "left" | "center" | "right" }?,
+  attribute noshade { "noshade" }?,
+  attribute size { Pixels.datatype }?,
+  attribute width { Pixels.datatype }?
+img.attlist &=
+  attribute align { "top" | "middle" | "bottom" | "left" | "right" }?,
+  attribute border { Pixels.datatype }?,
+  attribute hspace { Pixels.datatype }?,
+  attribute vspace { Pixels.datatype }?
+input.attlist &= align.attrib
+legend.attlist &=
+  attribute align { "top" | "bottom" | "left" | "right" }?
+li.attlist &=
+  attribute type { text }?,
+  attribute value { text }?
+object.attlist &=
+  attribute align { "top" | "middle" | "bottom" | "left" | "right" }?,
+  attribute border { Pixels.datatype }?,
+  attribute hspace { Pixels.datatype }?,
+  attribute vspace { Pixels.datatype }?
+ol.attlist &=
+  attribute type { text }?,
+  attribute compact { "compact" }?,
+  attribute start { text }?
+p.attlist &= align.attrib
+pre.attlist &= attribute width { Length.datatype }?
+script.attlist &= attribute language { ContentType.datatype }?
+table.attlist &=
+  align.attrib,
+  attribute bgcolor { Color.datatype }?
+tr.attlist &= attribute bgcolor { Color.datatype }?
+Cell.attrib &=
+  attribute nowrap { "nowrap" }?,
+  attribute bgcolor { Color.datatype }?,
+  attribute width { Pixels.datatype }?,
+  attribute height { Pixels.datatype }?
+ul.attlist &=
+  attribute type { text }?,
+  attribute compact { "compact" }?
+align.attrib = attribute align { "left" | "all" | "right" | "none" }?
+Color.datatype = text
+Inline.class |= font | basefont | s | strike | u
+Block.class |= center | isindex
+List.class |= dir | menu
+head.content &= isindex?
+Block.mix |= text | Inline.class
+# With the legacy module and the frames modules, the html
+# element can contain either body or frameset.
+frameset |= body
diff --git a/etc/schema/xhtml-link.rnc b/etc/schema/xhtml-link.rnc
new file mode 100644 (file)
index 0000000..9d0d6f1
--- /dev/null
@@ -0,0 +1,13 @@
+# Link Module
+
+link = element link { link.attlist }
+link.attlist =
+  Common.attrib,
+  attribute charset { Charset.datatype }?,
+  attribute href { URI.datatype }?,
+  attribute hreflang { LanguageCode.datatype }?,
+  attribute type { ContentType.datatype }?,
+  attribute rel { LinkTypes.datatype }?,
+  attribute rev { LinkTypes.datatype }?,
+  attribute media { MediaDesc.datatype }?
+head.content &= link*
diff --git a/etc/schema/xhtml-list.rnc b/etc/schema/xhtml-list.rnc
new file mode 100644 (file)
index 0000000..8b99404
--- /dev/null
@@ -0,0 +1,16 @@
+# List Module
+
+dl = element dl { dl.attlist, (dt | dd)+ }
+dl.attlist = Common.attrib
+dt = element dt { dt.attlist, Inline.model }
+dt.attlist = Common.attrib
+dd = element dd { dd.attlist, Flow.model }
+dd.attlist = Common.attrib
+ol = element ol { ol.attlist, li+ }
+ol.attlist = Common.attrib
+ul = element ul { ul.attlist, li+ }
+ul.attlist = Common.attrib
+li = element li { li.attlist, Flow.model }
+li.attlist = Common.attrib
+List.class = ul | ol | dl
+Block.class |= List.class
diff --git a/etc/schema/xhtml-meta.rnc b/etc/schema/xhtml-meta.rnc
new file mode 100644 (file)
index 0000000..ab0b5eb
--- /dev/null
@@ -0,0 +1,10 @@
+# Meta Module
+
+meta = element meta { meta.attlist }
+meta.attlist =
+  I18n.attrib,
+  attribute http-equiv { NMTOKEN.datatype }?,
+  attribute name { NMTOKEN.datatype }?,
+  attribute content { text }?,
+  attribute scheme { text }?
+head.content &= meta*
diff --git a/etc/schema/xhtml-nameident.rnc b/etc/schema/xhtml-nameident.rnc
new file mode 100644 (file)
index 0000000..ef4ad70
--- /dev/null
@@ -0,0 +1,10 @@
+# Name Identification Module
+
+a.attlist &= name.attlist
+applet.attlist &= name.attlist
+form.attlist &= name.attlist
+frame.attrib &= name.attlist
+iframe.attlist &= name.attlist
+img.attlist &= name.attlist
+map.attlist &= name.attlist
+name.attlist = attribute name { text }?
diff --git a/etc/schema/xhtml-object.rnc b/etc/schema/xhtml-object.rnc
new file mode 100644 (file)
index 0000000..ac65238
--- /dev/null
@@ -0,0 +1,24 @@
+# Object Module
+
+object =
+  element object {
+    object.attlist,
+    # No restrictions on mixed content in TREX.
+    param*,
+    Flow.model
+  }
+object.attlist =
+  Common.attrib,
+  attribute declare { "declare" }?,
+  attribute classid { URI.datatype }?,
+  attribute codebase { URI.datatype }?,
+  attribute data { URI.datatype }?,
+  attribute type { ContentType.datatype }?,
+  attribute codetype { ContentType.datatype }?,
+  attribute archive { URIs.datatype }?,
+  attribute standby { Text.datatype }?,
+  attribute height { Length.datatype }?,
+  attribute width { Length.datatype }?,
+  attribute name { text }?,
+  attribute tabindex { Number.datatype }?
+Inline.class |= object
diff --git a/etc/schema/xhtml-param.rnc b/etc/schema/xhtml-param.rnc
new file mode 100644 (file)
index 0000000..8a921ca
--- /dev/null
@@ -0,0 +1,9 @@
+# Param Module
+
+param = element param { param.attlist }
+param.attlist =
+  id.attrib,
+  attribute name { text },
+  attribute value { text }?,
+  attribute valuetype { "data" | "ref" | "object" }?,
+  attribute type { ContentType.datatype }?
diff --git a/etc/schema/xhtml-pres.rnc b/etc/schema/xhtml-pres.rnc
new file mode 100644 (file)
index 0000000..677372b
--- /dev/null
@@ -0,0 +1,18 @@
+hr = element hr { hr.attlist }
+hr.attlist = Common.attrib
+Block.class |= hr
+b = element b { b.attlist, Inline.model }
+b.attlist = Common.attrib
+big = element big { big.attlist, Inline.model }
+big.attlist = Common.attrib
+i = element i { i.attlist, Inline.model }
+i.attlist = Common.attrib
+small = element small { small.attlist, Inline.model }
+small.attlist = Common.attrib
+sub = element sub { sub.attlist, Inline.model }
+sub.attlist = Common.attrib
+sup = element sup { sup.attlist, Inline.model }
+sup.attlist = Common.attrib
+tt = element tt { tt.attlist, Inline.model }
+tt.attlist = Common.attrib
+Inline.class |= b | big | i | small | sub | sup | tt
diff --git a/etc/schema/xhtml-ruby.rnc b/etc/schema/xhtml-ruby.rnc
new file mode 100644 (file)
index 0000000..e55614d
--- /dev/null
@@ -0,0 +1,21 @@
+ruby =
+  element ruby {
+    ruby.attlist,
+    ((rb,
+      (rt | (rp, rt, rp)))
+     | (rbc, rtc, rtc?))
+  }
+ruby.attlist = Common.attrib
+rbc = element rbc { rbc.attlist, rb+ }
+rbc.attlist = Common.attrib
+rtc = element rtc { rtc.attlist, rt+ }
+rtc.attlist = Common.attrib
+rb = element rb { rb.attlist, Inline.model }
+rb.attlist = Common.attrib
+rt = element rt { rt.attlist, Inline.model }
+rt.attlist =
+  Common.attrib,
+  attribute rt { Number.datatype }?
+rp = element rp { rp.attlist, text }
+rp.attlist = Common.attrib
+Inline.class |= ruby
diff --git a/etc/schema/xhtml-script.rnc b/etc/schema/xhtml-script.rnc
new file mode 100644 (file)
index 0000000..fcf35b0
--- /dev/null
@@ -0,0 +1,15 @@
+# Script Module
+
+script = element script { script.attlist, text }
+script.attlist =
+  attribute charset { Charset.datatype }?,
+  attribute type { ContentType.datatype },
+  attribute src { URI.datatype }?,
+  attribute defer { "defer" }?,
+  attribute xml:space { "preserve" }?
+noscript = element noscript { noscript.attlist, Block.model }
+noscript.attlist = Common.attrib
+head.content &= script*
+Script.class = noscript | script
+Inline.class |= Script.class
+Block.class |= Script.class
diff --git a/etc/schema/xhtml-ssismap.rnc b/etc/schema/xhtml-ssismap.rnc
new file mode 100644 (file)
index 0000000..21a7496
--- /dev/null
@@ -0,0 +1,5 @@
+# Server-side Image Map Module
+
+# Depends on image module.
+
+img.attlist &= attribute ismap { "ismap" }?
diff --git a/etc/schema/xhtml-struct.rnc b/etc/schema/xhtml-struct.rnc
new file mode 100644 (file)
index 0000000..4c919c2
--- /dev/null
@@ -0,0 +1,14 @@
+# Structure Module
+
+start = html
+title = element title { title.attlist, text }
+title.attlist = I18n.attrib
+head = element head { head.attlist, head.content }
+head.attlist = I18n.attrib, profile.attlist
+head.content = title
+profile.attlist = attribute profile { URI.datatype }?
+body = element body { body.attlist, Block.model }
+body.attlist = Common.attrib
+html = element html { html.attlist, head, body }
+html.attlist = XHTML.version.attrib, I18n.attrib
+XHTML.version.attrib = attribute version { FPI.datatype }?
diff --git a/etc/schema/xhtml-style.rnc b/etc/schema/xhtml-style.rnc
new file mode 100644 (file)
index 0000000..93a52d5
--- /dev/null
@@ -0,0 +1,10 @@
+# Style Module
+
+style = element style { style.attlist, text }
+style.attlist =
+  title.attrib,
+  I18n.attrib,
+  attribute type { ContentType.datatype },
+  attribute media { MediaDesc.datatype }?,
+  attribute xml:space { "preserve" }?
+head.content &= style*
diff --git a/etc/schema/xhtml-table.rnc b/etc/schema/xhtml-table.rnc
new file mode 100644 (file)
index 0000000..70055b1
--- /dev/null
@@ -0,0 +1,67 @@
+# Tables Module
+
+# This builds on the basic tables module, unlike with the DTD
+# implementation.
+
+include "xhtml-basic-table.rnc" {
+  table =
+    element table {
+      table.attlist,
+      caption?,
+      (col* | colgroup*),
+      ((thead?, tfoot?, tbody+) | tr+)
+    }
+  th = element th { th.attlist, Flow.model }
+  td = element td { td.attlist, Flow.model }
+  CellHAlign.attrib =
+    attribute align {
+      "left" | "center" | "right" | "justify" | "char"
+    }?,
+    attribute char { Character.datatype }?,
+    attribute charoff { Length.datatype }?
+  CellVAlign.attrib =
+    attribute valign { "top" | "middle" | "bottom" | "baseline" }?
+  scope.attrib =
+    attribute scope { "row" | "col" | "rowgroup" | "colgroup" }?
+}
+table.attlist &=
+  attribute width { Length.datatype }?,
+  attribute border { Pixels.datatype }?,
+  frame.attrib,
+  rules.attrib,
+  attribute cellspacing { Length.datatype }?,
+  attribute cellpadding { Length.datatype }?
+col = element col { col.attlist }
+col.attlist =
+  Common.attrib,
+  attribute span { Number.datatype }?,
+  attribute width { MultiLength.datatype }?,
+  CellHAlign.attrib,
+  CellVAlign.attrib
+colgroup = element colgroup { colgroup.attlist, col* }
+colgroup.attlist =
+  Common.attrib,
+  attribute span { Number.datatype }?,
+  attribute width { MultiLength.datatype }?,
+  CellHAlign.attrib,
+  CellVAlign.attrib
+tbody = element tbody { tbody.attlist, tr+ }
+tbody.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+thead = element thead { thead.attlist, tr+ }
+thead.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+tfoot = element tfoot { tfoot.attlist, tr+ }
+tfoot.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+frame.attrib =
+  attribute frame {
+    "void"
+    | "above"
+    | "below"
+    | "hsides"
+    | "lhs"
+    | "rhs"
+    | "vsides"
+    | "box"
+    | "border"
+  }?
+rules.attrib =
+  attribute rules { "none" | "groups" | "rows" | "cols" | "all" }?
diff --git a/etc/schema/xhtml-target.rnc b/etc/schema/xhtml-target.rnc
new file mode 100644 (file)
index 0000000..505b379
--- /dev/null
@@ -0,0 +1,8 @@
+# Target Module
+
+a.attlist &= target.attrib
+area.attlist &= target.attrib
+base.attlist &= target.attrib
+link.attrib &= target.attrib
+form.attlist &= target.attrib
+target.attrib = attribute target { text }?
diff --git a/etc/schema/xhtml-text.rnc b/etc/schema/xhtml-text.rnc
new file mode 100644 (file)
index 0000000..c4283d4
--- /dev/null
@@ -0,0 +1,73 @@
+# Text Module
+
+br = element br { br.attlist, empty }
+br.attlist = Core.attrib
+span = element span { span.attlist, Inline.model }
+span.attlist = Common.attrib
+abbr = element abbr { abbr.attlist, Inline.model }
+abbr.attlist = Common.attrib
+acronym = element acronym { acronym.attlist, Inline.model }
+acronym.attlist = Common.attrib
+cite = element cite { cite.attlist, Inline.model }
+cite.attlist = Common.attrib
+code = element code { code.attlist, Inline.model }
+code.attlist = Common.attrib
+dfn = element dfn { dfn.attlist, Inline.model }
+dfn.attlist = Common.attrib
+em = element em { em.attlist, Inline.model }
+em.attlist = Common.attrib
+kbd = element kbd { kbd.attlist, Inline.model }
+kbd.attlist = Common.attrib
+q = element q { q.attlist, Inline.model }
+q.attlist =
+  Common.attrib,
+  attribute cite { URI.datatype }?
+samp = element samp { samp.attlist, Inline.model }
+samp.attlist = Common.attrib
+strong = element strong { strong.attlist, Inline.model }
+strong.attlist = Common.attrib
+var = element var { var.attlist, Inline.model }
+var.attlist = Common.attrib
+\div = element div { div.attlist, Flow.model }
+div.attlist = Common.attrib
+p = element p { p.attlist, Inline.model }
+p.attlist = Common.attrib
+address = element address { address.attlist, Inline.model }
+address.attlist = Common.attrib
+blockquote = element blockquote { blockquote.attlist, Block.model }
+blockquote.attlist =
+  Common.attrib,
+  attribute cite { URI.datatype }?
+pre = element pre { pre.attlist, Inline.model }
+pre.attlist =
+  Common.attrib,
+  attribute xml:space { "preserve" }?
+h1 = element h1 { Heading.attrib, Heading.content }
+h2 = element h2 { Heading.attrib, Heading.content }
+h3 = element h3 { Heading.attrib, Heading.content }
+h4 = element h4 { Heading.attrib, Heading.content }
+h5 = element h5 { Heading.attrib, Heading.content }
+h6 = element h6 { Heading.attrib, Heading.content }
+Heading.attrib = Common.attrib
+Heading.content = Inline.model
+Heading.class = h1 | h2 | h3 | h4 | h5 | h6
+Block.class = address | blockquote | \div | p | pre | Heading.class
+Inline.class =
+  abbr
+  | acronym
+  | br
+  | cite
+  | code
+  | dfn
+  | em
+  | kbd
+  | q
+  | samp
+  | span
+  | strong
+  | var
+Inline.model = (text | Inline.class)*
+# This is redefined by the legacy module to include inlines.
+Block.mix = Block.class
+Block.model = Block.mix+
+Flow.model = (text | Inline.class | Block.class)*
diff --git a/etc/schema/xhtml.rnc b/etc/schema/xhtml.rnc
new file mode 100644 (file)
index 0000000..3218cd7
--- /dev/null
@@ -0,0 +1,37 @@
+# XHTML
+
+# This corresponds to the union of transitional and frameset.
+
+default namespace = "http://www.w3.org/1999/xhtml"
+
+include "xhtml-datatypes.rnc"
+include "xhtml-attribs.rnc"
+# include "xhtml-struct.rnc"
+include "xhtml-frames.rnc"
+include "xhtml-text.rnc"
+include "xhtml-hypertext.rnc"
+include "xhtml-list.rnc"
+include "xhtml-image.rnc"
+include "xhtml-ssismap.rnc"
+include "xhtml-base.rnc"
+include "xhtml-link.rnc"
+include "xhtml-meta.rnc"
+include "xhtml-param.rnc"
+include "xhtml-object.rnc"
+include "xhtml-bdo.rnc"
+include "xhtml-pres.rnc"
+include "xhtml-edit.rnc"
+include "xhtml-applet.rnc"
+# include "xhtml-basic-form.rnc"
+include "xhtml-form.rnc"
+include "xhtml-style.rnc"
+include "xhtml-script.rnc"
+# include "xhtml-basic-table.rnc"
+include "xhtml-table.rnc"
+include "xhtml-csismap.rnc"
+include "xhtml-events.rnc"
+include "xhtml-inlstyle.rnc"
+include "xhtml-target.rnc"
+include "xhtml-iframe.rnc"
+include "xhtml-nameident.rnc"
+include "xhtml-legacy.rnc"
diff --git a/etc/schema/xslt.rnc b/etc/schema/xslt.rnc
new file mode 100644 (file)
index 0000000..eaa332f
--- /dev/null
@@ -0,0 +1,356 @@
+# $Id: xslt.rnc,v 1.2 2003/08/30 08:09:03 jjc Exp $
+
+# This was mostly generated from the syntax summary in the XSLT
+# Recommendation (using XSLT of course).
+
+# Issues: this validates extension elements as literal result
+# elements, which is overly restrictive.
+
+namespace local = ""
+default namespace xsl = "http://www.w3.org/1999/XSL/Transform"
+
+start =
+  stylesheet.element
+  | transform.element
+  | literal-result-element-as-stylesheet
+version = "1.0"
+top-level-elements.model =
+  (top-level-element.category | top-level-extension)*
+top-level-extension =
+  element * - (xsl:* | local:*) {
+    grammar {
+      start = any
+      any =
+        (attribute * { text }
+         | text
+         | element * { any })*
+    }
+  }
+template.model = (instruction.category | literal-result-element | text)*
+literal-result-element-as-stylesheet =
+  element * - xsl:* {
+    attribute xsl:version { version },
+    literal-result-element-no-version.atts,
+    template.model
+  }
+literal-result-element =
+  element * - xsl:* { literal-result-element.atts, template.model }
+literal-result-element.atts =
+  literal-result-element-no-version.atts,
+  attribute xsl:version { version }?
+literal-result-element-no-version.atts =
+  (attribute * - xsl:* { avt.datatype }
+   | attribute xsl:extension-element-prefixes { prefixes.datatype }
+   | attribute xsl:exclude-result-prefixes { prefixes.datatype }
+   | attribute xsl:use-attribute-sets { qnames.datatype })*
+top-level-element.category =
+  include.element
+  | strip-space.element
+  | preserve-space.element
+  | template.element
+  | namespace-alias.element
+  | attribute-set.element
+  | variable.element
+  | param.element
+  | key.element
+  | decimal-format.element
+  | output.element
+instruction.category =
+  apply-templates.element
+  | apply-imports.element
+  | call-template.element
+  | element.element
+  | attribute.element
+  | text.element
+  | processing-instruction.element
+  | comment.element
+  | copy.element
+  | value-of.element
+  | number.element
+  | for-each.element
+  | if.element
+  | choose.element
+  | variable.element
+  | copy-of.element
+  | message.element
+  | fallback.element
+extension.atts = attribute * - (xsl:* | local:*) { text }*
+stylesheet.element = element stylesheet { stylesheet.model }
+transform.element = element transform { stylesheet.model }
+stylesheet.model =
+  extension.atts,
+  attribute id { xsd:NCName }?,
+  attribute extension-element-prefixes { prefixes.datatype }?,
+  attribute exclude-result-prefixes { prefixes.datatype }?,
+  attribute version { version },
+  (import.element*, top-level-elements.model)
+include.element =
+  element include {
+    extension.atts,
+    attribute href { xsd:anyURI }
+  }
+import.element =
+  element import {
+    extension.atts,
+    attribute href { xsd:anyURI }
+  }
+strip-space.element =
+  element strip-space {
+    extension.atts,
+    attribute elements { wildcards.datatype }
+  }
+preserve-space.element =
+  element preserve-space {
+    extension.atts,
+    attribute elements { wildcards.datatype }
+  }
+template.element =
+  element template {
+    extension.atts,
+    attribute match { pattern.datatype }?,
+    attribute name { qname.datatype }?,
+    attribute priority { number.datatype }?,
+    attribute mode { qname.datatype }?,
+    (param.element*, template.model)
+  }
+apply-templates.element =
+  element apply-templates {
+    extension.atts,
+    attribute select { expression.datatype }?,
+    attribute mode { qname.datatype }?,
+    (sort.element | with-param.element)*
+  }
+apply-imports.element = element apply-imports { extension.atts }
+call-template.element =
+  element call-template {
+    extension.atts,
+    attribute name { qname.datatype },
+    with-param.element*
+  }
+namespace-alias.element =
+  element namespace-alias {
+    extension.atts,
+    attribute stylesheet-prefix { prefix.datatype },
+    attribute result-prefix { prefix.datatype }
+  }
+element.element =
+  element element {
+    extension.atts,
+    attribute name { qname.datatype | expr-avt.datatype },
+    attribute namespace { xsd:anyURI | brace-avt.datatype }?,
+    attribute use-attribute-sets { qnames.datatype }?,
+    template.model
+  }
+attribute.element =
+  element attribute {
+    extension.atts,
+    attribute name { qname.datatype | expr-avt.datatype },
+    attribute namespace { xsd:anyURI | brace-avt.datatype }?,
+    template.model
+  }
+attribute-set.element =
+  element attribute-set {
+    extension.atts,
+    attribute name { qname.datatype },
+    attribute use-attribute-sets { qnames.datatype }?,
+    attribute.element*
+  }
+text.element =
+  element text {
+    extension.atts,
+    attribute disable-output-escaping {
+      xsd:string "yes" | xsd:string "no"
+    }?,
+    text
+  }
+processing-instruction.element =
+  element processing-instruction {
+    extension.atts,
+    attribute name { xsd:NCName | expr-avt.datatype },
+    template.model
+  }
+comment.element = element comment { extension.atts, template.model }
+copy.element =
+  element copy {
+    extension.atts,
+    attribute use-attribute-sets { qnames.datatype }?,
+    template.model
+  }
+value-of.element =
+  element value-of {
+    extension.atts,
+    attribute select { expression.datatype },
+    attribute disable-output-escaping {
+      xsd:string "yes" | xsd:string "no"
+    }?
+  }
+number.element =
+  element number {
+    extension.atts,
+    attribute level {
+      xsd:string "single" | xsd:string "multiple" | xsd:string "any"
+    }?,
+    attribute count { pattern.datatype }?,
+    attribute from { pattern.datatype }?,
+    attribute value { expression.datatype }?,
+    attribute format { avt.datatype }?,
+    attribute lang { xsd:NMTOKEN | expr-avt.datatype }?,
+    attribute letter-value {
+      xsd:string "alphabetic"
+      | xsd:string "traditional"
+      | expr-avt.datatype
+    }?,
+    attribute grouping-separator { char.datatype | expr-avt.datatype }?,
+    attribute grouping-size { number.datatype | expr-avt.datatype }?
+  }
+for-each.element =
+  element for-each {
+    extension.atts,
+    attribute select { expression.datatype },
+    (sort.element*, template.model)
+  }
+if.element =
+  element if {
+    extension.atts,
+    attribute test { expression.datatype },
+    template.model
+  }
+choose.element =
+  element choose { extension.atts, (when.element+, otherwise.element?) }
+when.element =
+  element when {
+    extension.atts,
+    attribute test { expression.datatype },
+    template.model
+  }
+otherwise.element = element otherwise { extension.atts, template.model }
+sort.element =
+  element sort {
+    extension.atts,
+    attribute select { expression.datatype }?,
+    attribute lang { xsd:NMTOKEN | expr-avt.datatype }?,
+    attribute data-type {
+      xsd:string "text"
+      | xsd:string "number"
+      | qname-but-not-ncname.datatype
+      | expr-avt.datatype
+    }?,
+    attribute order {
+      xsd:string "ascending"
+      | xsd:string "descending"
+      | expr-avt.datatype
+    }?,
+    attribute case-order {
+      xsd:string "upper-first"
+      | xsd:string "lower-first"
+      | expr-avt.datatype
+    }?
+  }
+variable.element =
+  element variable {
+    extension.atts,
+    attribute name { qname.datatype },
+    (attribute select { expression.datatype }
+     | template.model)
+  }
+param.element =
+  element param {
+    extension.atts,
+    attribute name { qname.datatype },
+    (attribute select { expression.datatype }
+     | template.model)
+  }
+copy-of.element =
+  element copy-of {
+    extension.atts,
+    attribute select { expression.datatype }
+  }
+with-param.element =
+  element with-param {
+    extension.atts,
+    attribute name { qname.datatype },
+    (attribute select { expression.datatype }
+     | template.model)
+  }
+key.element =
+  element key {
+    extension.atts,
+    attribute name { qname.datatype },
+    attribute match { pattern.datatype },
+    attribute use { expression.datatype }
+  }
+decimal-format.element =
+  element decimal-format {
+    extension.atts,
+    attribute name { qname.datatype }?,
+    attribute decimal-separator { char.datatype }?,
+    attribute grouping-separator { char.datatype }?,
+    attribute infinity { text }?,
+    attribute minus-sign { char.datatype }?,
+    attribute NaN { text }?,
+    attribute percent { char.datatype }?,
+    attribute per-mille { char.datatype }?,
+    attribute zero-digit { char.datatype }?,
+    attribute digit { char.datatype }?,
+    attribute pattern-separator { char.datatype }?
+  }
+message.element =
+  element message {
+    extension.atts,
+    attribute terminate { xsd:string "yes" | xsd:string "no" }?,
+    template.model
+  }
+fallback.element = element fallback { extension.atts, template.model }
+output.element =
+  element output {
+    extension.atts,
+    attribute method {
+      xsd:string "xml"
+      | xsd:string "html"
+      | xsd:string "text"
+      | qname-but-not-ncname.datatype
+    }?,
+    attribute version { xsd:NMTOKEN }?,
+    attribute encoding { text }?,
+    attribute omit-xml-declaration {
+      xsd:string "yes" | xsd:string "no"
+    }?,
+    attribute standalone { xsd:string "yes" | xsd:string "no" }?,
+    attribute doctype-public { text }?,
+    attribute doctype-system { text }?,
+    attribute cdata-section-elements { qnames.datatype }?,
+    attribute indent { xsd:string "yes" | xsd:string "no" }?,
+    attribute media-type { text }?
+  }
+prefixes.datatype = list { (xsd:NCName | "#default")* }
+prefix.datatype = xsd:NCName | "#default"
+wildcards.datatype =
+  list {
+    (xsd:QName
+     | xsd:token { pattern = "\*|\i\c*:\*" })*
+  }
+qname.datatype = xsd:QName
+qnames.datatype = list { xsd:QName* }
+char.datatype = xsd:string { length = "1" }
+number.datatype = xsd:decimal
+expression.datatype = text
+pattern.datatype = text
+qname-but-not-ncname.datatype = xsd:QName { pattern = ".*:.*" }
+# An AVT containing at least one expression.
+expr-avt.datatype =
+  xsd:string {
+    pattern =
+      """([^\{\}]|\{\{|\}\})*\{([^"'\{\}]|"[^"]*"|'[^']*')+\}([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
+  }
+# An AVT containing at least one brace; ie where instantiated AVT
+# is not the same as the literal AVT.
+brace-avt.datatype =
+  xsd:string {
+    pattern =
+      """[^\{\}]*(\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
+  }
+avt.datatype =
+  xsd:string {
+    pattern =
+      """([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
+  }
index 2a18864..c2f40af 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-23  Mark A. Hershberger  <mah@everybody.org>
+
+       * nxml: Initial merge of nxml.  Kept nxml/char-name subdir for
+       now.
+
 2007-11-23  Juri Linkov  <juri@jurta.org>
 
        * dired.el (dired-read-dir-and-switches): For C-x d, set the
index 71f5ce9..5af406a 100644 (file)
@@ -76,6 +76,7 @@ WINS_ALMOST=\
        erc \
        eshell \
        gnus \
+       nxml \
        international \
        language \
        mail \
diff --git a/lisp/nxml/Makefile b/lisp/nxml/Makefile
new file mode 100644 (file)
index 0000000..13eee93
--- /dev/null
@@ -0,0 +1,80 @@
+EXTRA=README NEWS VERSION TODO COPYING Makefile rng-auto.el \
+  nxml-mode.xml nxml-mode.rnc nxml-mode.texi nxml-mode.info dir \
+  test.valid.xml test.invalid.xml 
+
+SRC=nxml-rap.el nxml-outln.el nxml-mode.el nxml-parse.el nxml-enc.el \
+  nxml-uchnm.el nxml-glyph.el nxml-maint.el nxml-util.el nxml-ns.el \
+  rng-dt.el rng-valid.el rng-pttrn.el rng-xsd.el rng-cmpct.el \
+  rng-match.el rng-nxml.el rng-util.el rng-loc.el rng-uri.el \
+  rng-parse.el rng-maint.el xsd-regexp.el xmltok.el
+
+ELC=nxml-rap.elc nxml-outln.elc nxml-mode.elc nxml-parse.elc nxml-enc.elc \
+  nxml-uchnm.elc nxml-glyph.elc nxml-maint.elc nxml-util.elc nxml-ns.elc \
+  rng-dt.elc rng-valid.elc rng-pttrn.elc rng-xsd.elc rng-cmpct.elc \
+  rng-match.elc rng-nxml.elc rng-util.elc rng-loc.elc rng-uri.elc \
+  rng-parse.elc rng-maint.elc xsd-regexp.elc xmltok.elc
+
+FILESTOCLEAN=stamp-byte-compile $(ELC) VERSION TAGS \
+  nxml-mode.texi nxml-mode.info dir
+
+EMACS=emacs
+ETAGS=etags
+MAKEINFO=makeinfo
+INSTALL-INFO=install-info
+PACKAGE=nxml-mode
+
+stamp-byte-compile: $(SRC)
+       -rm -f $(ELC)
+       $(EMACS) -batch -l rng-auto.el -f rng-byte-compile-load
+       touch $(@)
+
+all: stamp-byte-compile nxml-mode.info
+
+dir: nxml-mode.info
+       rm -f $@
+       $(INSTALL-INFO) $< $@
+
+info: nxml-mode.info
+
+nxml-mode.info: nxml-mode.texi
+       $(MAKEINFO) $<
+
+nxml-mode.texi: nxml-mode.xml
+       $(EMACS) -batch -l rng-auto.el -f rng-format-manual
+
+VERSION: stamp-byte-compile rng-auto.el
+       $(EMACS) -batch -l rng-auto.el -f rng-write-version
+
+TAGS: $(SRC)
+       $(ETAGS) $(SRC)
+
+dist: stamp-byte-compile $(EXTRA)
+       @version=`cat VERSION`; \
+       set -e; \
+       echo Making $(PACKAGE)-$$version.tar.gz; \
+       rm -fr $(PACKAGE)-$$version; \
+       mkdir $(PACKAGE)-$$version; \
+       cd $(PACKAGE)-$$version; \
+       for f in $(EXTRA) $(SRC) $(ELC); do \
+         ln -s ../$$f .; \
+       done; \
+       mkdir schema; \
+       cd schema; \
+       for f in ../../schema/*.rnc ../../schema/*.xml; do \
+         ln -s $$f .; \
+       done; \
+       cd ..; \
+       mkdir char-name; \
+       mkdir char-name/unicode; \
+       cd char-name/unicode; \
+       for f in ../../../char-name/unicode/*-*.el; do \
+         ln -s $$f .; \
+       done; \
+       cd ../../..; \
+       tar cfhz $(PACKAGE)-$$version.tar.gz $(PACKAGE)-$$version; \
+       rm -fr $(PACKAGE)-$$version
+
+clean:
+       -rm -f $(FILESTOCLEAN)
+
+.PHONY: all clean info
diff --git a/lisp/nxml/NEWS b/lisp/nxml/NEWS
new file mode 100644 (file)
index 0000000..cebbab8
--- /dev/null
@@ -0,0 +1,199 @@
+20041004
+--------
+
+Support for outlining has been added. See the manual for more details.
+
+C-u C-c C-n goes to the first error.
+
+20040910
+--------
+
+C-c RET splits the current element as in PSGML.
+
+20040908
+--------
+
+Indentation has been rewritten.  Indentation of attribute names and
+values should work better.  The default value of
+`nxml-attribute-indent' has been changed to 4.
+
+Syntax highlighting with a dark background should now work.
+
+20040726
+--------
+
+The attribute pathSuffix on the uri element in schema locating files
+has been replaced by a more general pattern attribute. The
+transformURI element now has required fromPattern and toPattern
+attributes.
+
+The schema related bindings have been changed to use C-c C-s as a prefix
+as follows:
+
+  C-c C-s => C-c C-s C-f (f for file)
+  C-c C-a => C-c C-s C-a
+  C-c C-t => C-c C-s C-t
+  C-c C-l => C-c C-s C-l
+  C-c C-w => C-c C-s C-w
+
+There's now an XML menu on the menu-bar.
+
+20031031
+--------
+
+C-c C-d "dynamically" chooses a tag to put around the word before
+point, rather like M-/.
+
+The mechanism for locating the schema has changed completely.  The new
+mechanism is described in the manual.  Any existing customizations of
+`rng-auto-element-alist' or `rng-auto-file-name-alist' will no longer
+be effective.
+
+C-c C-a is now bound to rng-auto-set-schema.
+
+20031018
+--------
+
+Unicode names can be used to insert characters with the new command
+C-c C-u.  Normally, this inserts a character reference.  With a prefix
+arg (i.e. C-u C-c C-u), it inserts the character directly.  You can
+customize `nxml-enabled-unicode-blocks' to control what Unicode blocks
+are used for completing names.
+
+Extra information is displayed for character references.  The Unicode
+name is displayed in a tooltip. A glyph for the referenced character
+is displayed in a distinguished face following the character
+reference; this can be disabled by customizing
+`nxml-char-ref-display-glyph-flag'.  The command
+`nxml-toggle-char-ref-extra-display' dynamically toggles the display
+of extra information for character references for a particular buffer.
+This can be used if the display of extra information is causing
+performance problems. nXML mode tries to figure out which glyphs can
+be displayed. Unfortunately Emacs doesn't provide the primitives
+necessary to do this properly, so nXML mode has to guess and will
+sometimes guess wrong.  The hook `nxml-glyph-set-hook' can be used to
+change nXML mode's guess.
+
+New command C-c C-w says what schema is being used.
+
+C-c C-s now turns on validation if it is not already on.
+
+20030928
+--------
+
+M-q has been implemented so that it works reasonably with XML.  Other
+paragraph-related commands (M-{, M-}, M-h) have also been implemented.
+
+New command M-x rng-auto-set-schema to set the schema based on the
+buffer's current contents and file-name. This is called automatically
+when rng-validate-mode is first enabled.
+
+There's now a C-M-d to go with C-M-u.  C-M-d moves forward down into
+the content of an element.  C-M-n and C-M-p move to the next or
+previous element.
+
+By default, the sexp commands (C-M-f, C-M-b, C-M-k, C-M-SPC) operate
+on tags rather than elements.  To restore the old behaviour,
+customize nxml-sexp-element-flag.
+
+The file TUTORIAL has been replaced by nxml-mode.info; this is in info
+format and can be read using Emacs.  The source is maintained in a
+simple, ad-hoc XML format.
+
+20030915
+--------
+
+XML encodings should now work properly.  When saving a buffer,
+nxml-mode arranges to use the encoding declared in the XML
+declaration.  If there is no encoding declared, then nxml-mode will
+use utf-8 or utf-16 according to the user options
+`nxml-prefer-utf-16-to-utf-8-flag' and
+`nxml-prefer-utf-16-little-to-big-endian-flag'. If the chosen encoding
+cannot encode all the characters in the buffer, nxml-mode will
+complain and give the user an opportunity to use an encoding that can.
+
+A new command C-c C-x inserts an XML declaration.
+
+The option `nxml-auto-insert-xml-declaration-flag' automatically
+inserts an XML declaration in new files.
+
+The `nxml-default-buffer-file-coding-system' option allows a different
+default buffer-file-coding-system for nXML mode buffers.  This affects
+what XML declaration is inserted.
+
+Encoding names in XML declarations are now validated by
+rng-validate-mode.
+
+RDF/XML schema was updated to version in 05 September 2003 WD.
+
+20030912
+--------
+
+The tutorial has a new section on inserting end-tags.
+
+By default </ no longer automatically inserts the rest of the end-tag.
+You can do
+
+  M-x customize-variable RET nxml-slash-auto-complete-flag RET
+
+and then follow the instructions displayed in the buffer to get the
+old behaviour.
+
+Completion after </ will complete the rest of the end-tag. Completion
+after < will include the end-tag in the possibilities if allowed by
+the schema.
+
+You can use C-c C-i instead of > to close the start-tag of an
+inline-level element.  After inserting the >, it will insert the
+end-tag and leave point before the end-tag. The `i' is supposed to be
+mnemonic for `inline'. C-c C-b is similar, but for block elements: the
+start-tag, point and the end-tag will all be on separate lines.
+
+The binding for inserting an end-tag has changed from C-c / to C-c C-f
+to comply with Emacs guidelines about what keys major modes should
+bind.  The `f' is supposed to be mnemonic for `finish'.
+
+Completion always puts point after all the characters it inserts. It
+doesn't insert a `>' after completing a start-tag name.
+
+Completion no longer completes CDATA section and comment delimiters.
+
+The nxml-start-auto-coding command enables auto-detection of a file's
+encoding as specified in the XML Recommendation for files that use
+nxml-mode; rng-auto.el calls this.
+
+20030906
+--------
+
+Validation messages applicable to point are displayed automatically.
+
+Completion can deal with prefixes that haven't yet been declared.
+
+rng-preferred-prefix-alist variable added.
+
+Namespace URIs can be completed.
+
+xmlns and xmlns:* attributes can be completed.
+
+CDATA section and comment delimiters can be completed.
+
+Each kind of completion has its own history.
+
+Completion function moved to nxml-mode; uses a hook to allow
+schema-sensitive completion.  Completion function bound to C-return.
+Also bound to M-TAB as before, unless
+nxml-bind-meta-tab-to-complete-flag is nil.  When there is a window
+system, nxml-bind-meta-tab-to-complete-flag is nil by default, This
+avoid problems with M-TAB, which is not passed through by several
+window systems/managers.
+
+TUTORIAL file added.
+
+NEWS file added.
+
+Bug fixes.
+
+20030901
+--------
+
+Initial release.
diff --git a/lisp/nxml/README b/lisp/nxml/README
new file mode 100644 (file)
index 0000000..4f3fc96
--- /dev/null
@@ -0,0 +1,106 @@
+This is a new major mode for GNU Emacs for editing XML documents. It
+supports editing well-formed XML documents and also provides
+schema-sensitive editing of XML documents using RELAX NG Compact
+Syntax.
+
+To use this, you need GNU Emacs version 21.x, preferably 21.3. GNU
+Emacs version 20 will not work properly, nor will XEmacs.
+
+To get started, do
+
+  M-x load-file <RET> rng-auto.el <RET>
+
+This defines the necessary autoloads.  Now, visit a file containing
+an XML document, and do
+
+  M-x nxml-mode
+
+Now do
+
+  C-h m
+
+for information on how to use nxml-mode.
+
+The beginnings of a manual are in nxml-mode.info.  You can read this
+using
+
+  C-u M-x info RET nxml-mode.info RET
+
+It's also installed as an entry at the end of the top-level info
+directory.  So you can read it with C-h i as usual.
+
+You can use test.valid.xml and test.invalid.xml as examples of valid
+and invalid XML documents.
+
+To get things automatically loaded each time you start Emacs, add
+
+  (load "~/nxml-mode-200YMMDD/rng-auto.el")
+
+to your .emacs, where ~/nxml-mode-200YMMDD is the directory containing
+the .elc files.  Note that rng-auto.el does not load all of the
+nxml-mode code; it merely sets things up so that all the features of
+nxml-mode will be autoloaded properly.  You should not try to autoload
+rng-auto.el itself.
+
+To use nxml-mode automatically for files with an extension of xml,
+xsl, rng or xhtml, add
+
+  (setq auto-mode-alist
+        (cons '("\\.\\(xml\\|xsl\\|rng\\|xhtml\\)\\'" . nxml-mode)
+             auto-mode-alist))
+
+to your .emacs.
+
+If you edit XML using iso-8859-N encodings other than iso-8859-1 and
+you are running Emacs 21.3 or later, then I recommend enabling
+unify-8859-on-decoding-mode, by adding
+
+  (unify-8859-on-decoding-mode)
+
+to you .emacs.
+
+To get validation and schema-sensitive editing, you need a RELAX NG
+Compact Syntax (RNC) schema for you document. The schema directory
+includes some schemas for popular document types.
+
+For more on RELAX NG, see
+
+  http://relaxng.org
+
+For a tutorial on RELAX NG Compact Syntax, see
+
+  http://relaxng.org/compact-tutorial.html
+
+For automatically creating RNC schemas, I recommend my Trang program:
+
+  http://www.thaiopensource.com/relaxng/trang.html
+
+You can use this to
+
+- infer an RNC schema from an instance document;
+
+- convert a DTD to an RNC schema;
+
+- convert a RELAX NG XML syntax schema to an RNC schema.
+
+To convert a RELAX NG XML syntax (.rng) schema to a RNC schema, you
+can also use the XSLT stylesheet from
+
+  http://www.pantor.com/download.html
+
+To convert a W3C XML Schema to an RNC schema, you need first to
+convert it to RELAX NG XML syntax using Sun's RELAX NG converter tool
+rngconv (built on top of MSV). See
+
+  https://msv.dev.java.net/
+
+The file NEWS describes recent changes.
+
+Please use the list
+
+  http://groups.yahoo.com/group/emacs-nxml-mode/
+
+for bug reports, discussion. I will announce all new versions there.
+
+James Clark
+http://www.jclark.com/contact.html
diff --git a/lisp/nxml/TODO b/lisp/nxml/TODO
new file mode 100644 (file)
index 0000000..3e7d501
--- /dev/null
@@ -0,0 +1,468 @@
+* High priority
+
+** Command to insert an element template, including all required
+attributes and child elements.  When there's a choice of elements
+possible, we could insert a comment, and put an overlay on that
+comment that makes it behave like a button with a pop-up menu to
+select the appropriate choice.
+
+** Command to tag a region.  With a schema should complete using legal
+tags, but should work without a schema as well.
+
+** Provide a way to conveniently rename an element. With a schema should
+complete using legal tags, but should work without a schema as well.
+
+* Outlining
+
+** Implement C-c C-o C-q.
+
+** Install pre/post command hook for moving out of invisible section.
+
+** Put a modify hook on invisible sections that expands them.
+
+** Integrate dumb folding somehow.
+
+** An element should be able to be its own heading.
+
+** Optimize to avoid complete buffer scan on each command.
+
+** Make it work with HTML-style headings (i.e. level indicated by
+name of heading element rather than depth of section nesting).
+
+** Recognize root element as a section provided it has a title, even
+if it doesn't match section-element-name-regex.
+
+** Support for incremental search automatically making hidden text
+visible.
+
+** Allow title to be an attribute.
+
+** Command that says to recognize the tag at point as a section/heading.
+
+** Explore better ways to determine when an element is a section
+or a heading.
+
+** rng-next-error needs to either ignore invisible portion or reveal it
+(maybe use isearch oriented text properties).
+
+** Errors within hidden section should be highlighted by underlining the
+ellipsis.
+
+** Make indirect buffers work.
+
+** How should nxml-refresh outline recover from non well-formed tags?
+
+** Hide tags in title elements?
+
+** Use overlays instead of text properties for holding outline state?
+Necessary for indirect buffers to work?
+
+** Allow an outline to go in the speedbar.
+
+** Split up outlining manual section into subsections.
+
+** More detail in the manual about each outlining command.
+
+** More menu entries for hiding/showing?
+
+** Indication of many lines have been hidden?
+
+* Locating schemas
+
+** Should rng-validate-mode give the user an opportunity to specify a
+schema if there is currently none? Or should it at least give a hint
+to the user how to specify a non-vacuous schema?
+
+** Support for adding new schemas to schema-locating files. Add
+documentElement and namespace elements.
+
+** C-c C-w should be able to report current type id.
+
+** Implement doctypePublicId.
+
+** Implement typeIdBase.
+
+** Implement typeIdProcessingInstruction.
+
+** Support xml:base.
+
+** Implement group.
+
+** Find preferred prefix from schema-locating files.  Get rid of
+rng-preferred-prefix-alist.
+
+** Inserting document element with vacuous schema should complete using
+document elements declared in schema locating files, and set schema
+appropriately.
+
+** Add a ruleType attribute to the <include> element?
+
+** Allow processing instruction in prolog to contain the compact syntax
+schema directly.
+
+** Use RDDL to locate a schema based on the namespace URI.
+
+** Should not prompt to add redundant association to schema locating
+file.
+
+** Command to reload current schema.
+
+* Schema-sensitive features
+
+** Should filter dynamic markup possibilities using schema validity, by
+adding hook to nxml-mode.
+
+** Dynamic markup word should (at least optionally) be able to look in
+other buffers that are using nxml-mode.
+
+** Should clicking on Invalid move to next error if already on an error?
+
+** Take advantage of a:documentation. Needs change to schema format.
+
+** Provide feasible validation (as in Jing) toggle.
+
+** Save the validation state as a property on the error overlay to enable
+more detailed diagnosis.
+
+** Provide an Error Summary buffer showing all the validation errors.
+
+** Pop-up menu.  What is useful?  Tag a region (should be greyed out if
+the region is not balanced).  Suggestions based on error messages.
+
+** Have configurable list of namespace URIs so that we can provide
+namespace URI completion on extension elements or with schema-less
+documents.
+
+** Allow validation to handle XInclude.
+
+** ID/IDREF support.
+
+* Completion
+
+** Make it work with icomplete.  Only use a function to complete when
+some of the possible names have undeclared namespaces.
+
+** How should C-return in mixed text work?
+
+** When there's a vacuous schema, C-return after < will insert the
+end-tag.  Is this a bug or a feature?
+
+** After completing start-tag, ensure we don't get unhelpful message
+from validation
+
+** Syntax table for completion.
+
+** Should complete start-tag name with a space if namespace attributes
+are required.
+
+** When completing start-tag name with no prefix and it doesn't match
+should try to infer namespace from local name.
+
+** Should completion pay attention to characters after point?  If so,
+how?
+
+** When completing start-tag name, add required atts if only one required
+attribute.
+
+** When completing attribute name, add attribute value if only one value
+is possible.
+
+** After attribute-value completion, insert space after close delimiter
+if more attributes are required.
+
+** Complete on enumerated data values in elements.
+
+** When in context that allows only elements, should get tag
+completion without having to type < first.
+
+** When immediately after start-tag name, and name is valid and not
+prefix of any other name, should C-return complete on attribute names?
+
+** When completing attributes, more consistent to ignore all attributes
+after point.
+
+** Inserting attribute value completions needs to be sensitive to what
+delimiter is used so that it quotes the correct character.
+
+** Complete on encoding-names in XML decl.
+
+** Complete namespace declarations by searching for all namespaces
+mentioned in the schema.
+
+* Well-formed XML support
+
+** Deal better with Mule-UCS
+
+** Deal with UTF-8 BOM when reading.
+
+** Complete entity names.
+
+** Provide some support for entity names for MathML.
+
+** Command to repeat the last tag.
+
+** Support for changing between character references and characters.
+Need to check that context is one in which character references are
+allowed.  xmltok prolog parsing will need to distinguish parameter
+literals from other kinds of literal.
+
+** Provide a comment command to bind to M-; that works better than the
+normal one.
+
+** Make indenting in a multi-line comment work.
+
+** Structure view.  Separate buffer displaying element tree. Be able to
+navigate from structure view to document and vice-versa.
+
+** Flash matching >.
+
+** Smart selection command that selects increasingly large syntactically
+coherent chunks of XML.  If point is in an attribute value, first
+select complete value; then if command is repeated, select value plus
+delimiters, then select attribute name as well, then complete
+start-tag, then complete element, then enclosing element, etc.
+
+** ispell integration.
+
+** Block-level items in mixed content should be indented, e.g:
+  <para>This is list:
+    <ul>
+      <li>item</li>
+
+** Provide option to indent like this:
+
+**   <para>This is a paragraph
+    occupying multiple lines.</para>
+
+** Option to add make a / that closes a start-tag electrically insert a
+space for the XHTML guys.
+
+** C-M-q should work.
+
+* Datatypes
+
+** Figure out workaround for CJK characters with regexps.
+
+** Does category C contain Cn?
+
+** Do ENTITY datatype properly.
+
+* XML Parsing Library
+
+** Parameter entity parsing option, nil (never), t (always),
+unless-standalone (unless standalone="yes" in XML declaration).
+
+** When a file is currently being edited, there should be an option to
+use its buffer instead of the on-disk copy.
+
+* Handling all XML features
+
+** Provide better support for editing external general parsed entities.
+Perhaps provide a way to force ignoring undefined entities; maybe turn
+this on automatically with <?xml encoding=""?> (with no version
+pseudo-att).
+
+** Handle internal general entity declarations containing elements.
+
+** Handle external general entity declarations.
+
+** Handle default attribute declarations in internal subset.
+
+** Handle parameter entities (including DTD).
+
+* RELAX NG
+
+** Do complete schema checking, at least optionally.
+
+** Detect include/external loops during schema parse.
+
+** Coding system detection for schemas.  Should use utf-8/utf-16 per the
+spec. But also need to allow encodings other than UTF-8/16 to support
+CJK charsets that Emacs cannot represent in Unicode.
+
+* Catching XML errors
+
+** Check public identifiers.
+
+** Check default attribute values.
+
+* Performance
+
+** Explore whether overlay-recenter can cure overlays performance
+problems.
+
+** Cache schemas. Need to have list of files and mtimes.
+
+** Make it possible to reduce rng-validate-chunk-size significantly,
+perhaps to 500 bytes, without bad performance impact: don't do
+redisplay on every chunk; pass continue functions on other uses of
+rng-do-some-validation.
+
+** Cache after first tag.
+
+** Introduce a new name class that is a choice between names (so that
+we can use member)
+
+** intern-choice should simplify after patterns with same 1st/2nd args
+
+** Large numbers of overlays slow things down dramatically.  Represent
+errors using text properties.  This implies we cannot incrementally
+keep track of the number of errors, in order to determine validity.
+Instead, when validation completes, scan for any characters with an
+error text property; this seems to be fast enough even with large
+buffers. Problem with error at end of buffer, where there's no
+character; need special variable for this.  Need to merge face from
+font-lock with the error face: use :inherit attribute with list of two
+faces.  How do we avoid making rng-valid depend on nxml-mode?
+
+* Error recovery
+
+** Don't stop at newline in looking for close of start-tag.
+
+** Use indentation to guide recovery from mismatched end-tags
+
+** Don't keep parsing when currently not well-formed but previously
+well-formed
+
+** Try to recover from a bad start-tag by popping an open element if
+there was a mismatched end-tag unaccounted for.
+
+** Try to recover from a bad start-tag open on the hypothesis that there
+was an error in the namespace URI.
+
+** Better recovery from ill-formed XML declarations.
+
+* Useability improvements
+
+** Should print a "Parsing..." message during long movements.
+
+** Provide better position for reference to undefined pattern error.
+
+** Put Well-formed in the mode-line when validating against any-content.
+
+** Trim marking of illegal data for leading and trailing whitespace.
+
+** Show Invalid status as soon as we are sure it's invalid, rather than
+waiting for everything to be completely up to date.
+
+** When narrowed, Valid or Invalid status should probably consider only
+validity of narrowed region.
+
+* Bug fixes
+
+** Need to give an error for a document like: <foo/><![CDATA[  ]]>
+
+** Make nxml-forward-balanced-item work better for the prolog.
+
+** Make filling and indenting comments work in the prolog.
+
+** Should delete RNC Input buffers.
+
+** Figure out what regex use for NCName and use it consistently,
+
+** Should have not-well-formed tokens in ref.
+
+** Require version in XML declaration? Probably not because prevents
+use for external parsed entities. At least forbid standalone
+without version.
+
+** Reject schema that compiles to rng-not-allowed-ipattern.
+
+** Move point backwards on schema parse error so that it's on the right token.
+
+* Internal
+
+** Use rng-quote-string consistently.
+
+** Use parsing library for XML to texinfo conversion.
+
+** Rename xmltok.el to nxml-token.el.  Use nxml-t- prefix instead of
+xmltok-. Change nxml-t-type to nxml-t-token-type, nxml-t-start to
+nxml-t-token-start.
+
+** Can we set fill-prefix to nil and rely on indenting?
+
+** xmltok should make available replacement text of entities containing
+elements
+
+** In rng-valid, instead of using modification-hooks and
+insert-behind-hooks on dependent overlays, use same technique as
+nxml-mode.
+
+** Port to XEmacs.  Issues include: Unicode (XEmacs seems to be based on
+Mule-UCS); overlays/text properties vs extents; absence of
+fontification-functions hook.
+
+* Fontification
+
+** Allow face to depend on element qname, attribute qname, attribute
+value.  Use list with pairs of (R . F), where R specifies regexps and
+F specifies faces.  How can this list be made to depend on the
+document type?
+
+* Other
+
+** Support RELAX NG XML syntax (use XML parsing library).
+
+** Support W3C XML Schema (use XML parsing library).
+
+** Command to infer schema from current document (like trang).
+
+* Schemas
+
+** XSLT schema should take advantage of RELAX NG to express cooccurrence
+constraints on attributes (e.g. xsl:template).
+
+* Documentation
+
+** Move material from README to manual.
+
+** Document encodings.
+
+* Notes
+
+** How can we allow an error to be displayed on a different token from
+where it is detected?  In particular, for a missing closing ">" we
+will need to display it at the beginning of the following token.  At
+the moment, when we parse the following token the error overlay will
+get cleared.
+
+** How should rng-goto-next-error deal with narrowing?
+
+** Perhaps should merge errors having same start position even if they
+have different ends.
+
+** How to handle surrogates? One possibility is to be compatible with
+utf8.e: represent as sequence of 4 chars.  But utf-16 is incompatible
+with this.
+
+** Should we distinguish well-formedness errors from invalidity errors?
+(I think not: we may want to recover from a bad start-tag by implying
+an end-tag.)
+
+** Seems to be a bug with Emacs, where a mouse movement that causes
+help-echo text to appear counts as pending input but does not cause
+idle timer to be restarted.
+
+** Use XML to represent this file.
+
+** I had a TODO which said simply "split-string". What did I mean?
+
+** Investigate performance on large files all on one line.
+
+* CVS emacs issues
+
+** Take advantage of UTF-8 CJK support.
+
+** Supply a next-error-function.
+
+** Investigate this NEWS item "Emacs now tries to set up buffer coding
+systems for HTML/XML files automatically."
+
+** Take advantage of the pointer text property.
+
+** Leverage char-displayable-p.
+
+Local variables:
+mode: outline
+end:
diff --git a/lisp/nxml/char-name/subdirs.el b/lisp/nxml/char-name/subdirs.el
new file mode 100644 (file)
index 0000000..28d8936
--- /dev/null
@@ -0,0 +1,8 @@
+;; -*- no-byte-compile: t -*-
+;; In load-path, after this directory should come
+;; certain of its subdirectories.  Here we specify them.
+(normal-top-level-add-to-load-path '("unicode" ))
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; End:
diff --git a/lisp/nxml/char-name/unicode/00000-0007F.el b/lisp/nxml/char-name/unicode/00000-0007F.el
new file mode 100644 (file)
index 0000000..122804f
--- /dev/null
@@ -0,0 +1,97 @@
+(nxml-define-char-name-set 'basic-latin
+  '(("SPACE" #x0020)
+    ("EXCLAMATION MARK" #x0021)
+    ("QUOTATION MARK" #x0022)
+    ("NUMBER SIGN" #x0023)
+    ("DOLLAR SIGN" #x0024)
+    ("PERCENT SIGN" #x0025)
+    ("AMPERSAND" #x0026)
+    ("APOSTROPHE" #x0027)
+    ("LEFT PARENTHESIS" #x0028)
+    ("RIGHT PARENTHESIS" #x0029)
+    ("ASTERISK" #x002A)
+    ("PLUS SIGN" #x002B)
+    ("COMMA" #x002C)
+    ("HYPHEN-MINUS" #x002D)
+    ("FULL STOP" #x002E)
+    ("SOLIDUS" #x002F)
+    ("DIGIT ZERO" #x0030)
+    ("DIGIT ONE" #x0031)
+    ("DIGIT TWO" #x0032)
+    ("DIGIT THREE" #x0033)
+    ("DIGIT FOUR" #x0034)
+    ("DIGIT FIVE" #x0035)
+    ("DIGIT SIX" #x0036)
+    ("DIGIT SEVEN" #x0037)
+    ("DIGIT EIGHT" #x0038)
+    ("DIGIT NINE" #x0039)
+    ("COLON" #x003A)
+    ("SEMICOLON" #x003B)
+    ("LESS-THAN SIGN" #x003C)
+    ("EQUALS SIGN" #x003D)
+    ("GREATER-THAN SIGN" #x003E)
+    ("QUESTION MARK" #x003F)
+    ("COMMERCIAL AT" #x0040)
+    ("LATIN CAPITAL LETTER A" #x0041)
+    ("LATIN CAPITAL LETTER B" #x0042)
+    ("LATIN CAPITAL LETTER C" #x0043)
+    ("LATIN CAPITAL LETTER D" #x0044)
+    ("LATIN CAPITAL LETTER E" #x0045)
+    ("LATIN CAPITAL LETTER F" #x0046)
+    ("LATIN CAPITAL LETTER G" #x0047)
+    ("LATIN CAPITAL LETTER H" #x0048)
+    ("LATIN CAPITAL LETTER I" #x0049)
+    ("LATIN CAPITAL LETTER J" #x004A)
+    ("LATIN CAPITAL LETTER K" #x004B)
+    ("LATIN CAPITAL LETTER L" #x004C)
+    ("LATIN CAPITAL LETTER M" #x004D)
+    ("LATIN CAPITAL LETTER N" #x004E)
+    ("LATIN CAPITAL LETTER O" #x004F)
+    ("LATIN CAPITAL LETTER P" #x0050)
+    ("LATIN CAPITAL LETTER Q" #x0051)
+    ("LATIN CAPITAL LETTER R" #x0052)
+    ("LATIN CAPITAL LETTER S" #x0053)
+    ("LATIN CAPITAL LETTER T" #x0054)
+    ("LATIN CAPITAL LETTER U" #x0055)
+    ("LATIN CAPITAL LETTER V" #x0056)
+    ("LATIN CAPITAL LETTER W" #x0057)
+    ("LATIN CAPITAL LETTER X" #x0058)
+    ("LATIN CAPITAL LETTER Y" #x0059)
+    ("LATIN CAPITAL LETTER Z" #x005A)
+    ("LEFT SQUARE BRACKET" #x005B)
+    ("REVERSE SOLIDUS" #x005C)
+    ("RIGHT SQUARE BRACKET" #x005D)
+    ("CIRCUMFLEX ACCENT" #x005E)
+    ("LOW LINE" #x005F)
+    ("GRAVE ACCENT" #x0060)
+    ("LATIN SMALL LETTER A" #x0061)
+    ("LATIN SMALL LETTER B" #x0062)
+    ("LATIN SMALL LETTER C" #x0063)
+    ("LATIN SMALL LETTER D" #x0064)
+    ("LATIN SMALL LETTER E" #x0065)
+    ("LATIN SMALL LETTER F" #x0066)
+    ("LATIN SMALL LETTER G" #x0067)
+    ("LATIN SMALL LETTER H" #x0068)
+    ("LATIN SMALL LETTER I" #x0069)
+    ("LATIN SMALL LETTER J" #x006A)
+    ("LATIN SMALL LETTER K" #x006B)
+    ("LATIN SMALL LETTER L" #x006C)
+    ("LATIN SMALL LETTER M" #x006D)
+    ("LATIN SMALL LETTER N" #x006E)
+    ("LATIN SMALL LETTER O" #x006F)
+    ("LATIN SMALL LETTER P" #x0070)
+    ("LATIN SMALL LETTER Q" #x0071)
+    ("LATIN SMALL LETTER R" #x0072)
+    ("LATIN SMALL LETTER S" #x0073)
+    ("LATIN SMALL LETTER T" #x0074)
+    ("LATIN SMALL LETTER U" #x0075)
+    ("LATIN SMALL LETTER V" #x0076)
+    ("LATIN SMALL LETTER W" #x0077)
+    ("LATIN SMALL LETTER X" #x0078)
+    ("LATIN SMALL LETTER Y" #x0079)
+    ("LATIN SMALL LETTER Z" #x007A)
+    ("LEFT CURLY BRACKET" #x007B)
+    ("VERTICAL LINE" #x007C)
+    ("RIGHT CURLY BRACKET" #x007D)
+    ("TILDE" #x007E)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00080-000FF.el b/lisp/nxml/char-name/unicode/00080-000FF.el
new file mode 100644 (file)
index 0000000..1d7f463
--- /dev/null
@@ -0,0 +1,98 @@
+(nxml-define-char-name-set 'latin-1-supplement
+  '(("NO-BREAK SPACE" #x00A0)
+    ("INVERTED EXCLAMATION MARK" #x00A1)
+    ("CENT SIGN" #x00A2)
+    ("POUND SIGN" #x00A3)
+    ("CURRENCY SIGN" #x00A4)
+    ("YEN SIGN" #x00A5)
+    ("BROKEN BAR" #x00A6)
+    ("SECTION SIGN" #x00A7)
+    ("DIAERESIS" #x00A8)
+    ("COPYRIGHT SIGN" #x00A9)
+    ("FEMININE ORDINAL INDICATOR" #x00AA)
+    ("LEFT-POINTING DOUBLE ANGLE QUOTATION MARK" #x00AB)
+    ("NOT SIGN" #x00AC)
+    ("SOFT HYPHEN" #x00AD)
+    ("REGISTERED SIGN" #x00AE)
+    ("MACRON" #x00AF)
+    ("DEGREE SIGN" #x00B0)
+    ("PLUS-MINUS SIGN" #x00B1)
+    ("SUPERSCRIPT TWO" #x00B2)
+    ("SUPERSCRIPT THREE" #x00B3)
+    ("ACUTE ACCENT" #x00B4)
+    ("MICRO SIGN" #x00B5)
+    ("PILCROW SIGN" #x00B6)
+    ("MIDDLE DOT" #x00B7)
+    ("CEDILLA" #x00B8)
+    ("SUPERSCRIPT ONE" #x00B9)
+    ("MASCULINE ORDINAL INDICATOR" #x00BA)
+    ("RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK" #x00BB)
+    ("VULGAR FRACTION ONE QUARTER" #x00BC)
+    ("VULGAR FRACTION ONE HALF" #x00BD)
+    ("VULGAR FRACTION THREE QUARTERS" #x00BE)
+    ("INVERTED QUESTION MARK" #x00BF)
+    ("LATIN CAPITAL LETTER A WITH GRAVE" #x00C0)
+    ("LATIN CAPITAL LETTER A WITH ACUTE" #x00C1)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX" #x00C2)
+    ("LATIN CAPITAL LETTER A WITH TILDE" #x00C3)
+    ("LATIN CAPITAL LETTER A WITH DIAERESIS" #x00C4)
+    ("LATIN CAPITAL LETTER A WITH RING ABOVE" #x00C5)
+    ("LATIN CAPITAL LETTER AE" #x00C6)
+    ("LATIN CAPITAL LETTER C WITH CEDILLA" #x00C7)
+    ("LATIN CAPITAL LETTER E WITH GRAVE" #x00C8)
+    ("LATIN CAPITAL LETTER E WITH ACUTE" #x00C9)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX" #x00CA)
+    ("LATIN CAPITAL LETTER E WITH DIAERESIS" #x00CB)
+    ("LATIN CAPITAL LETTER I WITH GRAVE" #x00CC)
+    ("LATIN CAPITAL LETTER I WITH ACUTE" #x00CD)
+    ("LATIN CAPITAL LETTER I WITH CIRCUMFLEX" #x00CE)
+    ("LATIN CAPITAL LETTER I WITH DIAERESIS" #x00CF)
+    ("LATIN CAPITAL LETTER ETH" #x00D0)
+    ("LATIN CAPITAL LETTER N WITH TILDE" #x00D1)
+    ("LATIN CAPITAL LETTER O WITH GRAVE" #x00D2)
+    ("LATIN CAPITAL LETTER O WITH ACUTE" #x00D3)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX" #x00D4)
+    ("LATIN CAPITAL LETTER O WITH TILDE" #x00D5)
+    ("LATIN CAPITAL LETTER O WITH DIAERESIS" #x00D6)
+    ("MULTIPLICATION SIGN" #x00D7)
+    ("LATIN CAPITAL LETTER O WITH STROKE" #x00D8)
+    ("LATIN CAPITAL LETTER U WITH GRAVE" #x00D9)
+    ("LATIN CAPITAL LETTER U WITH ACUTE" #x00DA)
+    ("LATIN CAPITAL LETTER U WITH CIRCUMFLEX" #x00DB)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS" #x00DC)
+    ("LATIN CAPITAL LETTER Y WITH ACUTE" #x00DD)
+    ("LATIN CAPITAL LETTER THORN" #x00DE)
+    ("LATIN SMALL LETTER SHARP S" #x00DF)
+    ("LATIN SMALL LETTER A WITH GRAVE" #x00E0)
+    ("LATIN SMALL LETTER A WITH ACUTE" #x00E1)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX" #x00E2)
+    ("LATIN SMALL LETTER A WITH TILDE" #x00E3)
+    ("LATIN SMALL LETTER A WITH DIAERESIS" #x00E4)
+    ("LATIN SMALL LETTER A WITH RING ABOVE" #x00E5)
+    ("LATIN SMALL LETTER AE" #x00E6)
+    ("LATIN SMALL LETTER C WITH CEDILLA" #x00E7)
+    ("LATIN SMALL LETTER E WITH GRAVE" #x00E8)
+    ("LATIN SMALL LETTER E WITH ACUTE" #x00E9)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX" #x00EA)
+    ("LATIN SMALL LETTER E WITH DIAERESIS" #x00EB)
+    ("LATIN SMALL LETTER I WITH GRAVE" #x00EC)
+    ("LATIN SMALL LETTER I WITH ACUTE" #x00ED)
+    ("LATIN SMALL LETTER I WITH CIRCUMFLEX" #x00EE)
+    ("LATIN SMALL LETTER I WITH DIAERESIS" #x00EF)
+    ("LATIN SMALL LETTER ETH" #x00F0)
+    ("LATIN SMALL LETTER N WITH TILDE" #x00F1)
+    ("LATIN SMALL LETTER O WITH GRAVE" #x00F2)
+    ("LATIN SMALL LETTER O WITH ACUTE" #x00F3)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX" #x00F4)
+    ("LATIN SMALL LETTER O WITH TILDE" #x00F5)
+    ("LATIN SMALL LETTER O WITH DIAERESIS" #x00F6)
+    ("DIVISION SIGN" #x00F7)
+    ("LATIN SMALL LETTER O WITH STROKE" #x00F8)
+    ("LATIN SMALL LETTER U WITH GRAVE" #x00F9)
+    ("LATIN SMALL LETTER U WITH ACUTE" #x00FA)
+    ("LATIN SMALL LETTER U WITH CIRCUMFLEX" #x00FB)
+    ("LATIN SMALL LETTER U WITH DIAERESIS" #x00FC)
+    ("LATIN SMALL LETTER Y WITH ACUTE" #x00FD)
+    ("LATIN SMALL LETTER THORN" #x00FE)
+    ("LATIN SMALL LETTER Y WITH DIAERESIS" #x00FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00100-0017F.el b/lisp/nxml/char-name/unicode/00100-0017F.el
new file mode 100644 (file)
index 0000000..7a97964
--- /dev/null
@@ -0,0 +1,130 @@
+(nxml-define-char-name-set 'latin-extended-a
+  '(("LATIN CAPITAL LETTER A WITH MACRON" #x0100)
+    ("LATIN SMALL LETTER A WITH MACRON" #x0101)
+    ("LATIN CAPITAL LETTER A WITH BREVE" #x0102)
+    ("LATIN SMALL LETTER A WITH BREVE" #x0103)
+    ("LATIN CAPITAL LETTER A WITH OGONEK" #x0104)
+    ("LATIN SMALL LETTER A WITH OGONEK" #x0105)
+    ("LATIN CAPITAL LETTER C WITH ACUTE" #x0106)
+    ("LATIN SMALL LETTER C WITH ACUTE" #x0107)
+    ("LATIN CAPITAL LETTER C WITH CIRCUMFLEX" #x0108)
+    ("LATIN SMALL LETTER C WITH CIRCUMFLEX" #x0109)
+    ("LATIN CAPITAL LETTER C WITH DOT ABOVE" #x010A)
+    ("LATIN SMALL LETTER C WITH DOT ABOVE" #x010B)
+    ("LATIN CAPITAL LETTER C WITH CARON" #x010C)
+    ("LATIN SMALL LETTER C WITH CARON" #x010D)
+    ("LATIN CAPITAL LETTER D WITH CARON" #x010E)
+    ("LATIN SMALL LETTER D WITH CARON" #x010F)
+    ("LATIN CAPITAL LETTER D WITH STROKE" #x0110)
+    ("LATIN SMALL LETTER D WITH STROKE" #x0111)
+    ("LATIN CAPITAL LETTER E WITH MACRON" #x0112)
+    ("LATIN SMALL LETTER E WITH MACRON" #x0113)
+    ("LATIN CAPITAL LETTER E WITH BREVE" #x0114)
+    ("LATIN SMALL LETTER E WITH BREVE" #x0115)
+    ("LATIN CAPITAL LETTER E WITH DOT ABOVE" #x0116)
+    ("LATIN SMALL LETTER E WITH DOT ABOVE" #x0117)
+    ("LATIN CAPITAL LETTER E WITH OGONEK" #x0118)
+    ("LATIN SMALL LETTER E WITH OGONEK" #x0119)
+    ("LATIN CAPITAL LETTER E WITH CARON" #x011A)
+    ("LATIN SMALL LETTER E WITH CARON" #x011B)
+    ("LATIN CAPITAL LETTER G WITH CIRCUMFLEX" #x011C)
+    ("LATIN SMALL LETTER G WITH CIRCUMFLEX" #x011D)
+    ("LATIN CAPITAL LETTER G WITH BREVE" #x011E)
+    ("LATIN SMALL LETTER G WITH BREVE" #x011F)
+    ("LATIN CAPITAL LETTER G WITH DOT ABOVE" #x0120)
+    ("LATIN SMALL LETTER G WITH DOT ABOVE" #x0121)
+    ("LATIN CAPITAL LETTER G WITH CEDILLA" #x0122)
+    ("LATIN SMALL LETTER G WITH CEDILLA" #x0123)
+    ("LATIN CAPITAL LETTER H WITH CIRCUMFLEX" #x0124)
+    ("LATIN SMALL LETTER H WITH CIRCUMFLEX" #x0125)
+    ("LATIN CAPITAL LETTER H WITH STROKE" #x0126)
+    ("LATIN SMALL LETTER H WITH STROKE" #x0127)
+    ("LATIN CAPITAL LETTER I WITH TILDE" #x0128)
+    ("LATIN SMALL LETTER I WITH TILDE" #x0129)
+    ("LATIN CAPITAL LETTER I WITH MACRON" #x012A)
+    ("LATIN SMALL LETTER I WITH MACRON" #x012B)
+    ("LATIN CAPITAL LETTER I WITH BREVE" #x012C)
+    ("LATIN SMALL LETTER I WITH BREVE" #x012D)
+    ("LATIN CAPITAL LETTER I WITH OGONEK" #x012E)
+    ("LATIN SMALL LETTER I WITH OGONEK" #x012F)
+    ("LATIN CAPITAL LETTER I WITH DOT ABOVE" #x0130)
+    ("LATIN SMALL LETTER DOTLESS I" #x0131)
+    ("LATIN CAPITAL LIGATURE IJ" #x0132)
+    ("LATIN SMALL LIGATURE IJ" #x0133)
+    ("LATIN CAPITAL LETTER J WITH CIRCUMFLEX" #x0134)
+    ("LATIN SMALL LETTER J WITH CIRCUMFLEX" #x0135)
+    ("LATIN CAPITAL LETTER K WITH CEDILLA" #x0136)
+    ("LATIN SMALL LETTER K WITH CEDILLA" #x0137)
+    ("LATIN SMALL LETTER KRA" #x0138)
+    ("LATIN CAPITAL LETTER L WITH ACUTE" #x0139)
+    ("LATIN SMALL LETTER L WITH ACUTE" #x013A)
+    ("LATIN CAPITAL LETTER L WITH CEDILLA" #x013B)
+    ("LATIN SMALL LETTER L WITH CEDILLA" #x013C)
+    ("LATIN CAPITAL LETTER L WITH CARON" #x013D)
+    ("LATIN SMALL LETTER L WITH CARON" #x013E)
+    ("LATIN CAPITAL LETTER L WITH MIDDLE DOT" #x013F)
+    ("LATIN SMALL LETTER L WITH MIDDLE DOT" #x0140)
+    ("LATIN CAPITAL LETTER L WITH STROKE" #x0141)
+    ("LATIN SMALL LETTER L WITH STROKE" #x0142)
+    ("LATIN CAPITAL LETTER N WITH ACUTE" #x0143)
+    ("LATIN SMALL LETTER N WITH ACUTE" #x0144)
+    ("LATIN CAPITAL LETTER N WITH CEDILLA" #x0145)
+    ("LATIN SMALL LETTER N WITH CEDILLA" #x0146)
+    ("LATIN CAPITAL LETTER N WITH CARON" #x0147)
+    ("LATIN SMALL LETTER N WITH CARON" #x0148)
+    ("LATIN SMALL LETTER N PRECEDED BY APOSTROPHE" #x0149)
+    ("LATIN CAPITAL LETTER ENG" #x014A)
+    ("LATIN SMALL LETTER ENG" #x014B)
+    ("LATIN CAPITAL LETTER O WITH MACRON" #x014C)
+    ("LATIN SMALL LETTER O WITH MACRON" #x014D)
+    ("LATIN CAPITAL LETTER O WITH BREVE" #x014E)
+    ("LATIN SMALL LETTER O WITH BREVE" #x014F)
+    ("LATIN CAPITAL LETTER O WITH DOUBLE ACUTE" #x0150)
+    ("LATIN SMALL LETTER O WITH DOUBLE ACUTE" #x0151)
+    ("LATIN CAPITAL LIGATURE OE" #x0152)
+    ("LATIN SMALL LIGATURE OE" #x0153)
+    ("LATIN CAPITAL LETTER R WITH ACUTE" #x0154)
+    ("LATIN SMALL LETTER R WITH ACUTE" #x0155)
+    ("LATIN CAPITAL LETTER R WITH CEDILLA" #x0156)
+    ("LATIN SMALL LETTER R WITH CEDILLA" #x0157)
+    ("LATIN CAPITAL LETTER R WITH CARON" #x0158)
+    ("LATIN SMALL LETTER R WITH CARON" #x0159)
+    ("LATIN CAPITAL LETTER S WITH ACUTE" #x015A)
+    ("LATIN SMALL LETTER S WITH ACUTE" #x015B)
+    ("LATIN CAPITAL LETTER S WITH CIRCUMFLEX" #x015C)
+    ("LATIN SMALL LETTER S WITH CIRCUMFLEX" #x015D)
+    ("LATIN CAPITAL LETTER S WITH CEDILLA" #x015E)
+    ("LATIN SMALL LETTER S WITH CEDILLA" #x015F)
+    ("LATIN CAPITAL LETTER S WITH CARON" #x0160)
+    ("LATIN SMALL LETTER S WITH CARON" #x0161)
+    ("LATIN CAPITAL LETTER T WITH CEDILLA" #x0162)
+    ("LATIN SMALL LETTER T WITH CEDILLA" #x0163)
+    ("LATIN CAPITAL LETTER T WITH CARON" #x0164)
+    ("LATIN SMALL LETTER T WITH CARON" #x0165)
+    ("LATIN CAPITAL LETTER T WITH STROKE" #x0166)
+    ("LATIN SMALL LETTER T WITH STROKE" #x0167)
+    ("LATIN CAPITAL LETTER U WITH TILDE" #x0168)
+    ("LATIN SMALL LETTER U WITH TILDE" #x0169)
+    ("LATIN CAPITAL LETTER U WITH MACRON" #x016A)
+    ("LATIN SMALL LETTER U WITH MACRON" #x016B)
+    ("LATIN CAPITAL LETTER U WITH BREVE" #x016C)
+    ("LATIN SMALL LETTER U WITH BREVE" #x016D)
+    ("LATIN CAPITAL LETTER U WITH RING ABOVE" #x016E)
+    ("LATIN SMALL LETTER U WITH RING ABOVE" #x016F)
+    ("LATIN CAPITAL LETTER U WITH DOUBLE ACUTE" #x0170)
+    ("LATIN SMALL LETTER U WITH DOUBLE ACUTE" #x0171)
+    ("LATIN CAPITAL LETTER U WITH OGONEK" #x0172)
+    ("LATIN SMALL LETTER U WITH OGONEK" #x0173)
+    ("LATIN CAPITAL LETTER W WITH CIRCUMFLEX" #x0174)
+    ("LATIN SMALL LETTER W WITH CIRCUMFLEX" #x0175)
+    ("LATIN CAPITAL LETTER Y WITH CIRCUMFLEX" #x0176)
+    ("LATIN SMALL LETTER Y WITH CIRCUMFLEX" #x0177)
+    ("LATIN CAPITAL LETTER Y WITH DIAERESIS" #x0178)
+    ("LATIN CAPITAL LETTER Z WITH ACUTE" #x0179)
+    ("LATIN SMALL LETTER Z WITH ACUTE" #x017A)
+    ("LATIN CAPITAL LETTER Z WITH DOT ABOVE" #x017B)
+    ("LATIN SMALL LETTER Z WITH DOT ABOVE" #x017C)
+    ("LATIN CAPITAL LETTER Z WITH CARON" #x017D)
+    ("LATIN SMALL LETTER Z WITH CARON" #x017E)
+    ("LATIN SMALL LETTER LONG S" #x017F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00180-0024F.el b/lisp/nxml/char-name/unicode/00180-0024F.el
new file mode 100644 (file)
index 0000000..6a6a7ff
--- /dev/null
@@ -0,0 +1,181 @@
+(nxml-define-char-name-set 'latin-extended-b
+  '(("LATIN SMALL LETTER B WITH STROKE" #x0180)
+    ("LATIN CAPITAL LETTER B WITH HOOK" #x0181)
+    ("LATIN CAPITAL LETTER B WITH TOPBAR" #x0182)
+    ("LATIN SMALL LETTER B WITH TOPBAR" #x0183)
+    ("LATIN CAPITAL LETTER TONE SIX" #x0184)
+    ("LATIN SMALL LETTER TONE SIX" #x0185)
+    ("LATIN CAPITAL LETTER OPEN O" #x0186)
+    ("LATIN CAPITAL LETTER C WITH HOOK" #x0187)
+    ("LATIN SMALL LETTER C WITH HOOK" #x0188)
+    ("LATIN CAPITAL LETTER AFRICAN D" #x0189)
+    ("LATIN CAPITAL LETTER D WITH HOOK" #x018A)
+    ("LATIN CAPITAL LETTER D WITH TOPBAR" #x018B)
+    ("LATIN SMALL LETTER D WITH TOPBAR" #x018C)
+    ("LATIN SMALL LETTER TURNED DELTA" #x018D)
+    ("LATIN CAPITAL LETTER REVERSED E" #x018E)
+    ("LATIN CAPITAL LETTER SCHWA" #x018F)
+    ("LATIN CAPITAL LETTER OPEN E" #x0190)
+    ("LATIN CAPITAL LETTER F WITH HOOK" #x0191)
+    ("LATIN SMALL LETTER F WITH HOOK" #x0192)
+    ("LATIN CAPITAL LETTER G WITH HOOK" #x0193)
+    ("LATIN CAPITAL LETTER GAMMA" #x0194)
+    ("LATIN SMALL LETTER HV" #x0195)
+    ("LATIN CAPITAL LETTER IOTA" #x0196)
+    ("LATIN CAPITAL LETTER I WITH STROKE" #x0197)
+    ("LATIN CAPITAL LETTER K WITH HOOK" #x0198)
+    ("LATIN SMALL LETTER K WITH HOOK" #x0199)
+    ("LATIN SMALL LETTER L WITH BAR" #x019A)
+    ("LATIN SMALL LETTER LAMBDA WITH STROKE" #x019B)
+    ("LATIN CAPITAL LETTER TURNED M" #x019C)
+    ("LATIN CAPITAL LETTER N WITH LEFT HOOK" #x019D)
+    ("LATIN SMALL LETTER N WITH LONG RIGHT LEG" #x019E)
+    ("LATIN CAPITAL LETTER O WITH MIDDLE TILDE" #x019F)
+    ("LATIN CAPITAL LETTER O WITH HORN" #x01A0)
+    ("LATIN SMALL LETTER O WITH HORN" #x01A1)
+    ("LATIN CAPITAL LETTER OI" #x01A2)
+    ("LATIN SMALL LETTER OI" #x01A3)
+    ("LATIN CAPITAL LETTER P WITH HOOK" #x01A4)
+    ("LATIN SMALL LETTER P WITH HOOK" #x01A5)
+    ("LATIN LETTER YR" #x01A6)
+    ("LATIN CAPITAL LETTER TONE TWO" #x01A7)
+    ("LATIN SMALL LETTER TONE TWO" #x01A8)
+    ("LATIN CAPITAL LETTER ESH" #x01A9)
+    ("LATIN LETTER REVERSED ESH LOOP" #x01AA)
+    ("LATIN SMALL LETTER T WITH PALATAL HOOK" #x01AB)
+    ("LATIN CAPITAL LETTER T WITH HOOK" #x01AC)
+    ("LATIN SMALL LETTER T WITH HOOK" #x01AD)
+    ("LATIN CAPITAL LETTER T WITH RETROFLEX HOOK" #x01AE)
+    ("LATIN CAPITAL LETTER U WITH HORN" #x01AF)
+    ("LATIN SMALL LETTER U WITH HORN" #x01B0)
+    ("LATIN CAPITAL LETTER UPSILON" #x01B1)
+    ("LATIN CAPITAL LETTER V WITH HOOK" #x01B2)
+    ("LATIN CAPITAL LETTER Y WITH HOOK" #x01B3)
+    ("LATIN SMALL LETTER Y WITH HOOK" #x01B4)
+    ("LATIN CAPITAL LETTER Z WITH STROKE" #x01B5)
+    ("LATIN SMALL LETTER Z WITH STROKE" #x01B6)
+    ("LATIN CAPITAL LETTER EZH" #x01B7)
+    ("LATIN CAPITAL LETTER EZH REVERSED" #x01B8)
+    ("LATIN SMALL LETTER EZH REVERSED" #x01B9)
+    ("LATIN SMALL LETTER EZH WITH TAIL" #x01BA)
+    ("LATIN LETTER TWO WITH STROKE" #x01BB)
+    ("LATIN CAPITAL LETTER TONE FIVE" #x01BC)
+    ("LATIN SMALL LETTER TONE FIVE" #x01BD)
+    ("LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE" #x01BE)
+    ("LATIN LETTER WYNN" #x01BF)
+    ("LATIN LETTER DENTAL CLICK" #x01C0)
+    ("LATIN LETTER LATERAL CLICK" #x01C1)
+    ("LATIN LETTER ALVEOLAR CLICK" #x01C2)
+    ("LATIN LETTER RETROFLEX CLICK" #x01C3)
+    ("LATIN CAPITAL LETTER DZ WITH CARON" #x01C4)
+    ("LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON" #x01C5)
+    ("LATIN SMALL LETTER DZ WITH CARON" #x01C6)
+    ("LATIN CAPITAL LETTER LJ" #x01C7)
+    ("LATIN CAPITAL LETTER L WITH SMALL LETTER J" #x01C8)
+    ("LATIN SMALL LETTER LJ" #x01C9)
+    ("LATIN CAPITAL LETTER NJ" #x01CA)
+    ("LATIN CAPITAL LETTER N WITH SMALL LETTER J" #x01CB)
+    ("LATIN SMALL LETTER NJ" #x01CC)
+    ("LATIN CAPITAL LETTER A WITH CARON" #x01CD)
+    ("LATIN SMALL LETTER A WITH CARON" #x01CE)
+    ("LATIN CAPITAL LETTER I WITH CARON" #x01CF)
+    ("LATIN SMALL LETTER I WITH CARON" #x01D0)
+    ("LATIN CAPITAL LETTER O WITH CARON" #x01D1)
+    ("LATIN SMALL LETTER O WITH CARON" #x01D2)
+    ("LATIN CAPITAL LETTER U WITH CARON" #x01D3)
+    ("LATIN SMALL LETTER U WITH CARON" #x01D4)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON" #x01D5)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND MACRON" #x01D6)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE" #x01D7)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE" #x01D8)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON" #x01D9)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND CARON" #x01DA)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE" #x01DB)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE" #x01DC)
+    ("LATIN SMALL LETTER TURNED E" #x01DD)
+    ("LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON" #x01DE)
+    ("LATIN SMALL LETTER A WITH DIAERESIS AND MACRON" #x01DF)
+    ("LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON" #x01E0)
+    ("LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON" #x01E1)
+    ("LATIN CAPITAL LETTER AE WITH MACRON" #x01E2)
+    ("LATIN SMALL LETTER AE WITH MACRON" #x01E3)
+    ("LATIN CAPITAL LETTER G WITH STROKE" #x01E4)
+    ("LATIN SMALL LETTER G WITH STROKE" #x01E5)
+    ("LATIN CAPITAL LETTER G WITH CARON" #x01E6)
+    ("LATIN SMALL LETTER G WITH CARON" #x01E7)
+    ("LATIN CAPITAL LETTER K WITH CARON" #x01E8)
+    ("LATIN SMALL LETTER K WITH CARON" #x01E9)
+    ("LATIN CAPITAL LETTER O WITH OGONEK" #x01EA)
+    ("LATIN SMALL LETTER O WITH OGONEK" #x01EB)
+    ("LATIN CAPITAL LETTER O WITH OGONEK AND MACRON" #x01EC)
+    ("LATIN SMALL LETTER O WITH OGONEK AND MACRON" #x01ED)
+    ("LATIN CAPITAL LETTER EZH WITH CARON" #x01EE)
+    ("LATIN SMALL LETTER EZH WITH CARON" #x01EF)
+    ("LATIN SMALL LETTER J WITH CARON" #x01F0)
+    ("LATIN CAPITAL LETTER DZ" #x01F1)
+    ("LATIN CAPITAL LETTER D WITH SMALL LETTER Z" #x01F2)
+    ("LATIN SMALL LETTER DZ" #x01F3)
+    ("LATIN CAPITAL LETTER G WITH ACUTE" #x01F4)
+    ("LATIN SMALL LETTER G WITH ACUTE" #x01F5)
+    ("LATIN CAPITAL LETTER HWAIR" #x01F6)
+    ("LATIN CAPITAL LETTER WYNN" #x01F7)
+    ("LATIN CAPITAL LETTER N WITH GRAVE" #x01F8)
+    ("LATIN SMALL LETTER N WITH GRAVE" #x01F9)
+    ("LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE" #x01FA)
+    ("LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE" #x01FB)
+    ("LATIN CAPITAL LETTER AE WITH ACUTE" #x01FC)
+    ("LATIN SMALL LETTER AE WITH ACUTE" #x01FD)
+    ("LATIN CAPITAL LETTER O WITH STROKE AND ACUTE" #x01FE)
+    ("LATIN SMALL LETTER O WITH STROKE AND ACUTE" #x01FF)
+    ("LATIN CAPITAL LETTER A WITH DOUBLE GRAVE" #x0200)
+    ("LATIN SMALL LETTER A WITH DOUBLE GRAVE" #x0201)
+    ("LATIN CAPITAL LETTER A WITH INVERTED BREVE" #x0202)
+    ("LATIN SMALL LETTER A WITH INVERTED BREVE" #x0203)
+    ("LATIN CAPITAL LETTER E WITH DOUBLE GRAVE" #x0204)
+    ("LATIN SMALL LETTER E WITH DOUBLE GRAVE" #x0205)
+    ("LATIN CAPITAL LETTER E WITH INVERTED BREVE" #x0206)
+    ("LATIN SMALL LETTER E WITH INVERTED BREVE" #x0207)
+    ("LATIN CAPITAL LETTER I WITH DOUBLE GRAVE" #x0208)
+    ("LATIN SMALL LETTER I WITH DOUBLE GRAVE" #x0209)
+    ("LATIN CAPITAL LETTER I WITH INVERTED BREVE" #x020A)
+    ("LATIN SMALL LETTER I WITH INVERTED BREVE" #x020B)
+    ("LATIN CAPITAL LETTER O WITH DOUBLE GRAVE" #x020C)
+    ("LATIN SMALL LETTER O WITH DOUBLE GRAVE" #x020D)
+    ("LATIN CAPITAL LETTER O WITH INVERTED BREVE" #x020E)
+    ("LATIN SMALL LETTER O WITH INVERTED BREVE" #x020F)
+    ("LATIN CAPITAL LETTER R WITH DOUBLE GRAVE" #x0210)
+    ("LATIN SMALL LETTER R WITH DOUBLE GRAVE" #x0211)
+    ("LATIN CAPITAL LETTER R WITH INVERTED BREVE" #x0212)
+    ("LATIN SMALL LETTER R WITH INVERTED BREVE" #x0213)
+    ("LATIN CAPITAL LETTER U WITH DOUBLE GRAVE" #x0214)
+    ("LATIN SMALL LETTER U WITH DOUBLE GRAVE" #x0215)
+    ("LATIN CAPITAL LETTER U WITH INVERTED BREVE" #x0216)
+    ("LATIN SMALL LETTER U WITH INVERTED BREVE" #x0217)
+    ("LATIN CAPITAL LETTER S WITH COMMA BELOW" #x0218)
+    ("LATIN SMALL LETTER S WITH COMMA BELOW" #x0219)
+    ("LATIN CAPITAL LETTER T WITH COMMA BELOW" #x021A)
+    ("LATIN SMALL LETTER T WITH COMMA BELOW" #x021B)
+    ("LATIN CAPITAL LETTER YOGH" #x021C)
+    ("LATIN SMALL LETTER YOGH" #x021D)
+    ("LATIN CAPITAL LETTER H WITH CARON" #x021E)
+    ("LATIN SMALL LETTER H WITH CARON" #x021F)
+    ("LATIN CAPITAL LETTER N WITH LONG RIGHT LEG" #x0220)
+    ("LATIN CAPITAL LETTER OU" #x0222)
+    ("LATIN SMALL LETTER OU" #x0223)
+    ("LATIN CAPITAL LETTER Z WITH HOOK" #x0224)
+    ("LATIN SMALL LETTER Z WITH HOOK" #x0225)
+    ("LATIN CAPITAL LETTER A WITH DOT ABOVE" #x0226)
+    ("LATIN SMALL LETTER A WITH DOT ABOVE" #x0227)
+    ("LATIN CAPITAL LETTER E WITH CEDILLA" #x0228)
+    ("LATIN SMALL LETTER E WITH CEDILLA" #x0229)
+    ("LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON" #x022A)
+    ("LATIN SMALL LETTER O WITH DIAERESIS AND MACRON" #x022B)
+    ("LATIN CAPITAL LETTER O WITH TILDE AND MACRON" #x022C)
+    ("LATIN SMALL LETTER O WITH TILDE AND MACRON" #x022D)
+    ("LATIN CAPITAL LETTER O WITH DOT ABOVE" #x022E)
+    ("LATIN SMALL LETTER O WITH DOT ABOVE" #x022F)
+    ("LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON" #x0230)
+    ("LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON" #x0231)
+    ("LATIN CAPITAL LETTER Y WITH MACRON" #x0232)
+    ("LATIN SMALL LETTER Y WITH MACRON" #x0233)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00250-002AF.el b/lisp/nxml/char-name/unicode/00250-002AF.el
new file mode 100644 (file)
index 0000000..8481421
--- /dev/null
@@ -0,0 +1,96 @@
+(nxml-define-char-name-set 'ipa-extensions
+  '(("LATIN SMALL LETTER TURNED A" #x0250)
+    ("LATIN SMALL LETTER ALPHA" #x0251)
+    ("LATIN SMALL LETTER TURNED ALPHA" #x0252)
+    ("LATIN SMALL LETTER B WITH HOOK" #x0253)
+    ("LATIN SMALL LETTER OPEN O" #x0254)
+    ("LATIN SMALL LETTER C WITH CURL" #x0255)
+    ("LATIN SMALL LETTER D WITH TAIL" #x0256)
+    ("LATIN SMALL LETTER D WITH HOOK" #x0257)
+    ("LATIN SMALL LETTER REVERSED E" #x0258)
+    ("LATIN SMALL LETTER SCHWA" #x0259)
+    ("LATIN SMALL LETTER SCHWA WITH HOOK" #x025A)
+    ("LATIN SMALL LETTER OPEN E" #x025B)
+    ("LATIN SMALL LETTER REVERSED OPEN E" #x025C)
+    ("LATIN SMALL LETTER REVERSED OPEN E WITH HOOK" #x025D)
+    ("LATIN SMALL LETTER CLOSED REVERSED OPEN E" #x025E)
+    ("LATIN SMALL LETTER DOTLESS J WITH STROKE" #x025F)
+    ("LATIN SMALL LETTER G WITH HOOK" #x0260)
+    ("LATIN SMALL LETTER SCRIPT G" #x0261)
+    ("LATIN LETTER SMALL CAPITAL G" #x0262)
+    ("LATIN SMALL LETTER GAMMA" #x0263)
+    ("LATIN SMALL LETTER RAMS HORN" #x0264)
+    ("LATIN SMALL LETTER TURNED H" #x0265)
+    ("LATIN SMALL LETTER H WITH HOOK" #x0266)
+    ("LATIN SMALL LETTER HENG WITH HOOK" #x0267)
+    ("LATIN SMALL LETTER I WITH STROKE" #x0268)
+    ("LATIN SMALL LETTER IOTA" #x0269)
+    ("LATIN LETTER SMALL CAPITAL I" #x026A)
+    ("LATIN SMALL LETTER L WITH MIDDLE TILDE" #x026B)
+    ("LATIN SMALL LETTER L WITH BELT" #x026C)
+    ("LATIN SMALL LETTER L WITH RETROFLEX HOOK" #x026D)
+    ("LATIN SMALL LETTER LEZH" #x026E)
+    ("LATIN SMALL LETTER TURNED M" #x026F)
+    ("LATIN SMALL LETTER TURNED M WITH LONG LEG" #x0270)
+    ("LATIN SMALL LETTER M WITH HOOK" #x0271)
+    ("LATIN SMALL LETTER N WITH LEFT HOOK" #x0272)
+    ("LATIN SMALL LETTER N WITH RETROFLEX HOOK" #x0273)
+    ("LATIN LETTER SMALL CAPITAL N" #x0274)
+    ("LATIN SMALL LETTER BARRED O" #x0275)
+    ("LATIN LETTER SMALL CAPITAL OE" #x0276)
+    ("LATIN SMALL LETTER CLOSED OMEGA" #x0277)
+    ("LATIN SMALL LETTER PHI" #x0278)
+    ("LATIN SMALL LETTER TURNED R" #x0279)
+    ("LATIN SMALL LETTER TURNED R WITH LONG LEG" #x027A)
+    ("LATIN SMALL LETTER TURNED R WITH HOOK" #x027B)
+    ("LATIN SMALL LETTER R WITH LONG LEG" #x027C)
+    ("LATIN SMALL LETTER R WITH TAIL" #x027D)
+    ("LATIN SMALL LETTER R WITH FISHHOOK" #x027E)
+    ("LATIN SMALL LETTER REVERSED R WITH FISHHOOK" #x027F)
+    ("LATIN LETTER SMALL CAPITAL R" #x0280)
+    ("LATIN LETTER SMALL CAPITAL INVERTED R" #x0281)
+    ("LATIN SMALL LETTER S WITH HOOK" #x0282)
+    ("LATIN SMALL LETTER ESH" #x0283)
+    ("LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK" #x0284)
+    ("LATIN SMALL LETTER SQUAT REVERSED ESH" #x0285)
+    ("LATIN SMALL LETTER ESH WITH CURL" #x0286)
+    ("LATIN SMALL LETTER TURNED T" #x0287)
+    ("LATIN SMALL LETTER T WITH RETROFLEX HOOK" #x0288)
+    ("LATIN SMALL LETTER U BAR" #x0289)
+    ("LATIN SMALL LETTER UPSILON" #x028A)
+    ("LATIN SMALL LETTER V WITH HOOK" #x028B)
+    ("LATIN SMALL LETTER TURNED V" #x028C)
+    ("LATIN SMALL LETTER TURNED W" #x028D)
+    ("LATIN SMALL LETTER TURNED Y" #x028E)
+    ("LATIN LETTER SMALL CAPITAL Y" #x028F)
+    ("LATIN SMALL LETTER Z WITH RETROFLEX HOOK" #x0290)
+    ("LATIN SMALL LETTER Z WITH CURL" #x0291)
+    ("LATIN SMALL LETTER EZH" #x0292)
+    ("LATIN SMALL LETTER EZH WITH CURL" #x0293)
+    ("LATIN LETTER GLOTTAL STOP" #x0294)
+    ("LATIN LETTER PHARYNGEAL VOICED FRICATIVE" #x0295)
+    ("LATIN LETTER INVERTED GLOTTAL STOP" #x0296)
+    ("LATIN LETTER STRETCHED C" #x0297)
+    ("LATIN LETTER BILABIAL CLICK" #x0298)
+    ("LATIN LETTER SMALL CAPITAL B" #x0299)
+    ("LATIN SMALL LETTER CLOSED OPEN E" #x029A)
+    ("LATIN LETTER SMALL CAPITAL G WITH HOOK" #x029B)
+    ("LATIN LETTER SMALL CAPITAL H" #x029C)
+    ("LATIN SMALL LETTER J WITH CROSSED-TAIL" #x029D)
+    ("LATIN SMALL LETTER TURNED K" #x029E)
+    ("LATIN LETTER SMALL CAPITAL L" #x029F)
+    ("LATIN SMALL LETTER Q WITH HOOK" #x02A0)
+    ("LATIN LETTER GLOTTAL STOP WITH STROKE" #x02A1)
+    ("LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE" #x02A2)
+    ("LATIN SMALL LETTER DZ DIGRAPH" #x02A3)
+    ("LATIN SMALL LETTER DEZH DIGRAPH" #x02A4)
+    ("LATIN SMALL LETTER DZ DIGRAPH WITH CURL" #x02A5)
+    ("LATIN SMALL LETTER TS DIGRAPH" #x02A6)
+    ("LATIN SMALL LETTER TESH DIGRAPH" #x02A7)
+    ("LATIN SMALL LETTER TC DIGRAPH WITH CURL" #x02A8)
+    ("LATIN SMALL LETTER FENG DIGRAPH" #x02A9)
+    ("LATIN SMALL LETTER LS DIGRAPH" #x02AA)
+    ("LATIN SMALL LETTER LZ DIGRAPH" #x02AB)
+    ("LATIN LETTER BILABIAL PERCUSSIVE" #x02AC)
+    ("LATIN LETTER BIDENTAL PERCUSSIVE" #x02AD)
+    ))
diff --git a/lisp/nxml/char-name/unicode/002B0-002FF.el b/lisp/nxml/char-name/unicode/002B0-002FF.el
new file mode 100644 (file)
index 0000000..4f74699
--- /dev/null
@@ -0,0 +1,65 @@
+(nxml-define-char-name-set 'spacing-modifier-letters
+  '(("MODIFIER LETTER SMALL H" #x02B0)
+    ("MODIFIER LETTER SMALL H WITH HOOK" #x02B1)
+    ("MODIFIER LETTER SMALL J" #x02B2)
+    ("MODIFIER LETTER SMALL R" #x02B3)
+    ("MODIFIER LETTER SMALL TURNED R" #x02B4)
+    ("MODIFIER LETTER SMALL TURNED R WITH HOOK" #x02B5)
+    ("MODIFIER LETTER SMALL CAPITAL INVERTED R" #x02B6)
+    ("MODIFIER LETTER SMALL W" #x02B7)
+    ("MODIFIER LETTER SMALL Y" #x02B8)
+    ("MODIFIER LETTER PRIME" #x02B9)
+    ("MODIFIER LETTER DOUBLE PRIME" #x02BA)
+    ("MODIFIER LETTER TURNED COMMA" #x02BB)
+    ("MODIFIER LETTER APOSTROPHE" #x02BC)
+    ("MODIFIER LETTER REVERSED COMMA" #x02BD)
+    ("MODIFIER LETTER RIGHT HALF RING" #x02BE)
+    ("MODIFIER LETTER LEFT HALF RING" #x02BF)
+    ("MODIFIER LETTER GLOTTAL STOP" #x02C0)
+    ("MODIFIER LETTER REVERSED GLOTTAL STOP" #x02C1)
+    ("MODIFIER LETTER LEFT ARROWHEAD" #x02C2)
+    ("MODIFIER LETTER RIGHT ARROWHEAD" #x02C3)
+    ("MODIFIER LETTER UP ARROWHEAD" #x02C4)
+    ("MODIFIER LETTER DOWN ARROWHEAD" #x02C5)
+    ("MODIFIER LETTER CIRCUMFLEX ACCENT" #x02C6)
+    ("CARON" #x02C7)
+    ("MODIFIER LETTER VERTICAL LINE" #x02C8)
+    ("MODIFIER LETTER MACRON" #x02C9)
+    ("MODIFIER LETTER ACUTE ACCENT" #x02CA)
+    ("MODIFIER LETTER GRAVE ACCENT" #x02CB)
+    ("MODIFIER LETTER LOW VERTICAL LINE" #x02CC)
+    ("MODIFIER LETTER LOW MACRON" #x02CD)
+    ("MODIFIER LETTER LOW GRAVE ACCENT" #x02CE)
+    ("MODIFIER LETTER LOW ACUTE ACCENT" #x02CF)
+    ("MODIFIER LETTER TRIANGULAR COLON" #x02D0)
+    ("MODIFIER LETTER HALF TRIANGULAR COLON" #x02D1)
+    ("MODIFIER LETTER CENTRED RIGHT HALF RING" #x02D2)
+    ("MODIFIER LETTER CENTRED LEFT HALF RING" #x02D3)
+    ("MODIFIER LETTER UP TACK" #x02D4)
+    ("MODIFIER LETTER DOWN TACK" #x02D5)
+    ("MODIFIER LETTER PLUS SIGN" #x02D6)
+    ("MODIFIER LETTER MINUS SIGN" #x02D7)
+    ("BREVE" #x02D8)
+    ("DOT ABOVE" #x02D9)
+    ("RING ABOVE" #x02DA)
+    ("OGONEK" #x02DB)
+    ("SMALL TILDE" #x02DC)
+    ("DOUBLE ACUTE ACCENT" #x02DD)
+    ("MODIFIER LETTER RHOTIC HOOK" #x02DE)
+    ("MODIFIER LETTER CROSS ACCENT" #x02DF)
+    ("MODIFIER LETTER SMALL GAMMA" #x02E0)
+    ("MODIFIER LETTER SMALL L" #x02E1)
+    ("MODIFIER LETTER SMALL S" #x02E2)
+    ("MODIFIER LETTER SMALL X" #x02E3)
+    ("MODIFIER LETTER SMALL REVERSED GLOTTAL STOP" #x02E4)
+    ("MODIFIER LETTER EXTRA-HIGH TONE BAR" #x02E5)
+    ("MODIFIER LETTER HIGH TONE BAR" #x02E6)
+    ("MODIFIER LETTER MID TONE BAR" #x02E7)
+    ("MODIFIER LETTER LOW TONE BAR" #x02E8)
+    ("MODIFIER LETTER EXTRA-LOW TONE BAR" #x02E9)
+    ("MODIFIER LETTER YIN DEPARTING TONE MARK" #x02EA)
+    ("MODIFIER LETTER YANG DEPARTING TONE MARK" #x02EB)
+    ("MODIFIER LETTER VOICING" #x02EC)
+    ("MODIFIER LETTER UNASPIRATED" #x02ED)
+    ("MODIFIER LETTER DOUBLE APOSTROPHE" #x02EE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00300-0036F.el b/lisp/nxml/char-name/unicode/00300-0036F.el
new file mode 100644 (file)
index 0000000..33e9627
--- /dev/null
@@ -0,0 +1,98 @@
+(nxml-define-char-name-set 'combining-diacritical-marks
+  '(("COMBINING GRAVE ACCENT" #x0300)
+    ("COMBINING ACUTE ACCENT" #x0301)
+    ("COMBINING CIRCUMFLEX ACCENT" #x0302)
+    ("COMBINING TILDE" #x0303)
+    ("COMBINING MACRON" #x0304)
+    ("COMBINING OVERLINE" #x0305)
+    ("COMBINING BREVE" #x0306)
+    ("COMBINING DOT ABOVE" #x0307)
+    ("COMBINING DIAERESIS" #x0308)
+    ("COMBINING HOOK ABOVE" #x0309)
+    ("COMBINING RING ABOVE" #x030A)
+    ("COMBINING DOUBLE ACUTE ACCENT" #x030B)
+    ("COMBINING CARON" #x030C)
+    ("COMBINING VERTICAL LINE ABOVE" #x030D)
+    ("COMBINING DOUBLE VERTICAL LINE ABOVE" #x030E)
+    ("COMBINING DOUBLE GRAVE ACCENT" #x030F)
+    ("COMBINING CANDRABINDU" #x0310)
+    ("COMBINING INVERTED BREVE" #x0311)
+    ("COMBINING TURNED COMMA ABOVE" #x0312)
+    ("COMBINING COMMA ABOVE" #x0313)
+    ("COMBINING REVERSED COMMA ABOVE" #x0314)
+    ("COMBINING COMMA ABOVE RIGHT" #x0315)
+    ("COMBINING GRAVE ACCENT BELOW" #x0316)
+    ("COMBINING ACUTE ACCENT BELOW" #x0317)
+    ("COMBINING LEFT TACK BELOW" #x0318)
+    ("COMBINING RIGHT TACK BELOW" #x0319)
+    ("COMBINING LEFT ANGLE ABOVE" #x031A)
+    ("COMBINING HORN" #x031B)
+    ("COMBINING LEFT HALF RING BELOW" #x031C)
+    ("COMBINING UP TACK BELOW" #x031D)
+    ("COMBINING DOWN TACK BELOW" #x031E)
+    ("COMBINING PLUS SIGN BELOW" #x031F)
+    ("COMBINING MINUS SIGN BELOW" #x0320)
+    ("COMBINING PALATALIZED HOOK BELOW" #x0321)
+    ("COMBINING RETROFLEX HOOK BELOW" #x0322)
+    ("COMBINING DOT BELOW" #x0323)
+    ("COMBINING DIAERESIS BELOW" #x0324)
+    ("COMBINING RING BELOW" #x0325)
+    ("COMBINING COMMA BELOW" #x0326)
+    ("COMBINING CEDILLA" #x0327)
+    ("COMBINING OGONEK" #x0328)
+    ("COMBINING VERTICAL LINE BELOW" #x0329)
+    ("COMBINING BRIDGE BELOW" #x032A)
+    ("COMBINING INVERTED DOUBLE ARCH BELOW" #x032B)
+    ("COMBINING CARON BELOW" #x032C)
+    ("COMBINING CIRCUMFLEX ACCENT BELOW" #x032D)
+    ("COMBINING BREVE BELOW" #x032E)
+    ("COMBINING INVERTED BREVE BELOW" #x032F)
+    ("COMBINING TILDE BELOW" #x0330)
+    ("COMBINING MACRON BELOW" #x0331)
+    ("COMBINING LOW LINE" #x0332)
+    ("COMBINING DOUBLE LOW LINE" #x0333)
+    ("COMBINING TILDE OVERLAY" #x0334)
+    ("COMBINING SHORT STROKE OVERLAY" #x0335)
+    ("COMBINING LONG STROKE OVERLAY" #x0336)
+    ("COMBINING SHORT SOLIDUS OVERLAY" #x0337)
+    ("COMBINING LONG SOLIDUS OVERLAY" #x0338)
+    ("COMBINING RIGHT HALF RING BELOW" #x0339)
+    ("COMBINING INVERTED BRIDGE BELOW" #x033A)
+    ("COMBINING SQUARE BELOW" #x033B)
+    ("COMBINING SEAGULL BELOW" #x033C)
+    ("COMBINING X ABOVE" #x033D)
+    ("COMBINING VERTICAL TILDE" #x033E)
+    ("COMBINING DOUBLE OVERLINE" #x033F)
+    ("COMBINING GRAVE TONE MARK" #x0340)
+    ("COMBINING ACUTE TONE MARK" #x0341)
+    ("COMBINING GREEK PERISPOMENI" #x0342)
+    ("COMBINING GREEK KORONIS" #x0343)
+    ("COMBINING GREEK DIALYTIKA TONOS" #x0344)
+    ("COMBINING GREEK YPOGEGRAMMENI" #x0345)
+    ("COMBINING BRIDGE ABOVE" #x0346)
+    ("COMBINING EQUALS SIGN BELOW" #x0347)
+    ("COMBINING DOUBLE VERTICAL LINE BELOW" #x0348)
+    ("COMBINING LEFT ANGLE BELOW" #x0349)
+    ("COMBINING NOT TILDE ABOVE" #x034A)
+    ("COMBINING HOMOTHETIC ABOVE" #x034B)
+    ("COMBINING ALMOST EQUAL TO ABOVE" #x034C)
+    ("COMBINING LEFT RIGHT ARROW BELOW" #x034D)
+    ("COMBINING UPWARDS ARROW BELOW" #x034E)
+    ("COMBINING GRAPHEME JOINER" #x034F)
+    ("COMBINING DOUBLE TILDE" #x0360)
+    ("COMBINING DOUBLE INVERTED BREVE" #x0361)
+    ("COMBINING DOUBLE RIGHTWARDS ARROW BELOW" #x0362)
+    ("COMBINING LATIN SMALL LETTER A" #x0363)
+    ("COMBINING LATIN SMALL LETTER E" #x0364)
+    ("COMBINING LATIN SMALL LETTER I" #x0365)
+    ("COMBINING LATIN SMALL LETTER O" #x0366)
+    ("COMBINING LATIN SMALL LETTER U" #x0367)
+    ("COMBINING LATIN SMALL LETTER C" #x0368)
+    ("COMBINING LATIN SMALL LETTER D" #x0369)
+    ("COMBINING LATIN SMALL LETTER H" #x036A)
+    ("COMBINING LATIN SMALL LETTER M" #x036B)
+    ("COMBINING LATIN SMALL LETTER R" #x036C)
+    ("COMBINING LATIN SMALL LETTER T" #x036D)
+    ("COMBINING LATIN SMALL LETTER V" #x036E)
+    ("COMBINING LATIN SMALL LETTER X" #x036F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00370-003FF.el b/lisp/nxml/char-name/unicode/00370-003FF.el
new file mode 100644 (file)
index 0000000..031b58d
--- /dev/null
@@ -0,0 +1,117 @@
+(nxml-define-char-name-set 'greek-and-coptic
+  '(("GREEK NUMERAL SIGN" #x0374)
+    ("GREEK LOWER NUMERAL SIGN" #x0375)
+    ("GREEK YPOGEGRAMMENI" #x037A)
+    ("GREEK QUESTION MARK" #x037E)
+    ("GREEK TONOS" #x0384)
+    ("GREEK DIALYTIKA TONOS" #x0385)
+    ("GREEK CAPITAL LETTER ALPHA WITH TONOS" #x0386)
+    ("GREEK ANO TELEIA" #x0387)
+    ("GREEK CAPITAL LETTER EPSILON WITH TONOS" #x0388)
+    ("GREEK CAPITAL LETTER ETA WITH TONOS" #x0389)
+    ("GREEK CAPITAL LETTER IOTA WITH TONOS" #x038A)
+    ("GREEK CAPITAL LETTER OMICRON WITH TONOS" #x038C)
+    ("GREEK CAPITAL LETTER UPSILON WITH TONOS" #x038E)
+    ("GREEK CAPITAL LETTER OMEGA WITH TONOS" #x038F)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS" #x0390)
+    ("GREEK CAPITAL LETTER ALPHA" #x0391)
+    ("GREEK CAPITAL LETTER BETA" #x0392)
+    ("GREEK CAPITAL LETTER GAMMA" #x0393)
+    ("GREEK CAPITAL LETTER DELTA" #x0394)
+    ("GREEK CAPITAL LETTER EPSILON" #x0395)
+    ("GREEK CAPITAL LETTER ZETA" #x0396)
+    ("GREEK CAPITAL LETTER ETA" #x0397)
+    ("GREEK CAPITAL LETTER THETA" #x0398)
+    ("GREEK CAPITAL LETTER IOTA" #x0399)
+    ("GREEK CAPITAL LETTER KAPPA" #x039A)
+    ("GREEK CAPITAL LETTER LAMDA" #x039B)
+    ("GREEK CAPITAL LETTER MU" #x039C)
+    ("GREEK CAPITAL LETTER NU" #x039D)
+    ("GREEK CAPITAL LETTER XI" #x039E)
+    ("GREEK CAPITAL LETTER OMICRON" #x039F)
+    ("GREEK CAPITAL LETTER PI" #x03A0)
+    ("GREEK CAPITAL LETTER RHO" #x03A1)
+    ("GREEK CAPITAL LETTER SIGMA" #x03A3)
+    ("GREEK CAPITAL LETTER TAU" #x03A4)
+    ("GREEK CAPITAL LETTER UPSILON" #x03A5)
+    ("GREEK CAPITAL LETTER PHI" #x03A6)
+    ("GREEK CAPITAL LETTER CHI" #x03A7)
+    ("GREEK CAPITAL LETTER PSI" #x03A8)
+    ("GREEK CAPITAL LETTER OMEGA" #x03A9)
+    ("GREEK CAPITAL LETTER IOTA WITH DIALYTIKA" #x03AA)
+    ("GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA" #x03AB)
+    ("GREEK SMALL LETTER ALPHA WITH TONOS" #x03AC)
+    ("GREEK SMALL LETTER EPSILON WITH TONOS" #x03AD)
+    ("GREEK SMALL LETTER ETA WITH TONOS" #x03AE)
+    ("GREEK SMALL LETTER IOTA WITH TONOS" #x03AF)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS" #x03B0)
+    ("GREEK SMALL LETTER ALPHA" #x03B1)
+    ("GREEK SMALL LETTER BETA" #x03B2)
+    ("GREEK SMALL LETTER GAMMA" #x03B3)
+    ("GREEK SMALL LETTER DELTA" #x03B4)
+    ("GREEK SMALL LETTER EPSILON" #x03B5)
+    ("GREEK SMALL LETTER ZETA" #x03B6)
+    ("GREEK SMALL LETTER ETA" #x03B7)
+    ("GREEK SMALL LETTER THETA" #x03B8)
+    ("GREEK SMALL LETTER IOTA" #x03B9)
+    ("GREEK SMALL LETTER KAPPA" #x03BA)
+    ("GREEK SMALL LETTER LAMDA" #x03BB)
+    ("GREEK SMALL LETTER MU" #x03BC)
+    ("GREEK SMALL LETTER NU" #x03BD)
+    ("GREEK SMALL LETTER XI" #x03BE)
+    ("GREEK SMALL LETTER OMICRON" #x03BF)
+    ("GREEK SMALL LETTER PI" #x03C0)
+    ("GREEK SMALL LETTER RHO" #x03C1)
+    ("GREEK SMALL LETTER FINAL SIGMA" #x03C2)
+    ("GREEK SMALL LETTER SIGMA" #x03C3)
+    ("GREEK SMALL LETTER TAU" #x03C4)
+    ("GREEK SMALL LETTER UPSILON" #x03C5)
+    ("GREEK SMALL LETTER PHI" #x03C6)
+    ("GREEK SMALL LETTER CHI" #x03C7)
+    ("GREEK SMALL LETTER PSI" #x03C8)
+    ("GREEK SMALL LETTER OMEGA" #x03C9)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA" #x03CA)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA" #x03CB)
+    ("GREEK SMALL LETTER OMICRON WITH TONOS" #x03CC)
+    ("GREEK SMALL LETTER UPSILON WITH TONOS" #x03CD)
+    ("GREEK SMALL LETTER OMEGA WITH TONOS" #x03CE)
+    ("GREEK BETA SYMBOL" #x03D0)
+    ("GREEK THETA SYMBOL" #x03D1)
+    ("GREEK UPSILON WITH HOOK SYMBOL" #x03D2)
+    ("GREEK UPSILON WITH ACUTE AND HOOK SYMBOL" #x03D3)
+    ("GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL" #x03D4)
+    ("GREEK PHI SYMBOL" #x03D5)
+    ("GREEK PI SYMBOL" #x03D6)
+    ("GREEK KAI SYMBOL" #x03D7)
+    ("GREEK LETTER ARCHAIC KOPPA" #x03D8)
+    ("GREEK SMALL LETTER ARCHAIC KOPPA" #x03D9)
+    ("GREEK LETTER STIGMA" #x03DA)
+    ("GREEK SMALL LETTER STIGMA" #x03DB)
+    ("GREEK LETTER DIGAMMA" #x03DC)
+    ("GREEK SMALL LETTER DIGAMMA" #x03DD)
+    ("GREEK LETTER KOPPA" #x03DE)
+    ("GREEK SMALL LETTER KOPPA" #x03DF)
+    ("GREEK LETTER SAMPI" #x03E0)
+    ("GREEK SMALL LETTER SAMPI" #x03E1)
+    ("COPTIC CAPITAL LETTER SHEI" #x03E2)
+    ("COPTIC SMALL LETTER SHEI" #x03E3)
+    ("COPTIC CAPITAL LETTER FEI" #x03E4)
+    ("COPTIC SMALL LETTER FEI" #x03E5)
+    ("COPTIC CAPITAL LETTER KHEI" #x03E6)
+    ("COPTIC SMALL LETTER KHEI" #x03E7)
+    ("COPTIC CAPITAL LETTER HORI" #x03E8)
+    ("COPTIC SMALL LETTER HORI" #x03E9)
+    ("COPTIC CAPITAL LETTER GANGIA" #x03EA)
+    ("COPTIC SMALL LETTER GANGIA" #x03EB)
+    ("COPTIC CAPITAL LETTER SHIMA" #x03EC)
+    ("COPTIC SMALL LETTER SHIMA" #x03ED)
+    ("COPTIC CAPITAL LETTER DEI" #x03EE)
+    ("COPTIC SMALL LETTER DEI" #x03EF)
+    ("GREEK KAPPA SYMBOL" #x03F0)
+    ("GREEK RHO SYMBOL" #x03F1)
+    ("GREEK LUNATE SIGMA SYMBOL" #x03F2)
+    ("GREEK LETTER YOT" #x03F3)
+    ("GREEK CAPITAL THETA SYMBOL" #x03F4)
+    ("GREEK LUNATE EPSILON SYMBOL" #x03F5)
+    ("GREEK REVERSED LUNATE EPSILON SYMBOL" #x03F6)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00400-004FF.el b/lisp/nxml/char-name/unicode/00400-004FF.el
new file mode 100644 (file)
index 0000000..9de27e0
--- /dev/null
@@ -0,0 +1,248 @@
+(nxml-define-char-name-set 'cyrillic
+  '(("CYRILLIC CAPITAL LETTER IE WITH GRAVE" #x0400)
+    ("CYRILLIC CAPITAL LETTER IO" #x0401)
+    ("CYRILLIC CAPITAL LETTER DJE" #x0402)
+    ("CYRILLIC CAPITAL LETTER GJE" #x0403)
+    ("CYRILLIC CAPITAL LETTER UKRAINIAN IE" #x0404)
+    ("CYRILLIC CAPITAL LETTER DZE" #x0405)
+    ("CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I" #x0406)
+    ("CYRILLIC CAPITAL LETTER YI" #x0407)
+    ("CYRILLIC CAPITAL LETTER JE" #x0408)
+    ("CYRILLIC CAPITAL LETTER LJE" #x0409)
+    ("CYRILLIC CAPITAL LETTER NJE" #x040A)
+    ("CYRILLIC CAPITAL LETTER TSHE" #x040B)
+    ("CYRILLIC CAPITAL LETTER KJE" #x040C)
+    ("CYRILLIC CAPITAL LETTER I WITH GRAVE" #x040D)
+    ("CYRILLIC CAPITAL LETTER SHORT U" #x040E)
+    ("CYRILLIC CAPITAL LETTER DZHE" #x040F)
+    ("CYRILLIC CAPITAL LETTER A" #x0410)
+    ("CYRILLIC CAPITAL LETTER BE" #x0411)
+    ("CYRILLIC CAPITAL LETTER VE" #x0412)
+    ("CYRILLIC CAPITAL LETTER GHE" #x0413)
+    ("CYRILLIC CAPITAL LETTER DE" #x0414)
+    ("CYRILLIC CAPITAL LETTER IE" #x0415)
+    ("CYRILLIC CAPITAL LETTER ZHE" #x0416)
+    ("CYRILLIC CAPITAL LETTER ZE" #x0417)
+    ("CYRILLIC CAPITAL LETTER I" #x0418)
+    ("CYRILLIC CAPITAL LETTER SHORT I" #x0419)
+    ("CYRILLIC CAPITAL LETTER KA" #x041A)
+    ("CYRILLIC CAPITAL LETTER EL" #x041B)
+    ("CYRILLIC CAPITAL LETTER EM" #x041C)
+    ("CYRILLIC CAPITAL LETTER EN" #x041D)
+    ("CYRILLIC CAPITAL LETTER O" #x041E)
+    ("CYRILLIC CAPITAL LETTER PE" #x041F)
+    ("CYRILLIC CAPITAL LETTER ER" #x0420)
+    ("CYRILLIC CAPITAL LETTER ES" #x0421)
+    ("CYRILLIC CAPITAL LETTER TE" #x0422)
+    ("CYRILLIC CAPITAL LETTER U" #x0423)
+    ("CYRILLIC CAPITAL LETTER EF" #x0424)
+    ("CYRILLIC CAPITAL LETTER HA" #x0425)
+    ("CYRILLIC CAPITAL LETTER TSE" #x0426)
+    ("CYRILLIC CAPITAL LETTER CHE" #x0427)
+    ("CYRILLIC CAPITAL LETTER SHA" #x0428)
+    ("CYRILLIC CAPITAL LETTER SHCHA" #x0429)
+    ("CYRILLIC CAPITAL LETTER HARD SIGN" #x042A)
+    ("CYRILLIC CAPITAL LETTER YERU" #x042B)
+    ("CYRILLIC CAPITAL LETTER SOFT SIGN" #x042C)
+    ("CYRILLIC CAPITAL LETTER E" #x042D)
+    ("CYRILLIC CAPITAL LETTER YU" #x042E)
+    ("CYRILLIC CAPITAL LETTER YA" #x042F)
+    ("CYRILLIC SMALL LETTER A" #x0430)
+    ("CYRILLIC SMALL LETTER BE" #x0431)
+    ("CYRILLIC SMALL LETTER VE" #x0432)
+    ("CYRILLIC SMALL LETTER GHE" #x0433)
+    ("CYRILLIC SMALL LETTER DE" #x0434)
+    ("CYRILLIC SMALL LETTER IE" #x0435)
+    ("CYRILLIC SMALL LETTER ZHE" #x0436)
+    ("CYRILLIC SMALL LETTER ZE" #x0437)
+    ("CYRILLIC SMALL LETTER I" #x0438)
+    ("CYRILLIC SMALL LETTER SHORT I" #x0439)
+    ("CYRILLIC SMALL LETTER KA" #x043A)
+    ("CYRILLIC SMALL LETTER EL" #x043B)
+    ("CYRILLIC SMALL LETTER EM" #x043C)
+    ("CYRILLIC SMALL LETTER EN" #x043D)
+    ("CYRILLIC SMALL LETTER O" #x043E)
+    ("CYRILLIC SMALL LETTER PE" #x043F)
+    ("CYRILLIC SMALL LETTER ER" #x0440)
+    ("CYRILLIC SMALL LETTER ES" #x0441)
+    ("CYRILLIC SMALL LETTER TE" #x0442)
+    ("CYRILLIC SMALL LETTER U" #x0443)
+    ("CYRILLIC SMALL LETTER EF" #x0444)
+    ("CYRILLIC SMALL LETTER HA" #x0445)
+    ("CYRILLIC SMALL LETTER TSE" #x0446)
+    ("CYRILLIC SMALL LETTER CHE" #x0447)
+    ("CYRILLIC SMALL LETTER SHA" #x0448)
+    ("CYRILLIC SMALL LETTER SHCHA" #x0449)
+    ("CYRILLIC SMALL LETTER HARD SIGN" #x044A)
+    ("CYRILLIC SMALL LETTER YERU" #x044B)
+    ("CYRILLIC SMALL LETTER SOFT SIGN" #x044C)
+    ("CYRILLIC SMALL LETTER E" #x044D)
+    ("CYRILLIC SMALL LETTER YU" #x044E)
+    ("CYRILLIC SMALL LETTER YA" #x044F)
+    ("CYRILLIC SMALL LETTER IE WITH GRAVE" #x0450)
+    ("CYRILLIC SMALL LETTER IO" #x0451)
+    ("CYRILLIC SMALL LETTER DJE" #x0452)
+    ("CYRILLIC SMALL LETTER GJE" #x0453)
+    ("CYRILLIC SMALL LETTER UKRAINIAN IE" #x0454)
+    ("CYRILLIC SMALL LETTER DZE" #x0455)
+    ("CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I" #x0456)
+    ("CYRILLIC SMALL LETTER YI" #x0457)
+    ("CYRILLIC SMALL LETTER JE" #x0458)
+    ("CYRILLIC SMALL LETTER LJE" #x0459)
+    ("CYRILLIC SMALL LETTER NJE" #x045A)
+    ("CYRILLIC SMALL LETTER TSHE" #x045B)
+    ("CYRILLIC SMALL LETTER KJE" #x045C)
+    ("CYRILLIC SMALL LETTER I WITH GRAVE" #x045D)
+    ("CYRILLIC SMALL LETTER SHORT U" #x045E)
+    ("CYRILLIC SMALL LETTER DZHE" #x045F)
+    ("CYRILLIC CAPITAL LETTER OMEGA" #x0460)
+    ("CYRILLIC SMALL LETTER OMEGA" #x0461)
+    ("CYRILLIC CAPITAL LETTER YAT" #x0462)
+    ("CYRILLIC SMALL LETTER YAT" #x0463)
+    ("CYRILLIC CAPITAL LETTER IOTIFIED E" #x0464)
+    ("CYRILLIC SMALL LETTER IOTIFIED E" #x0465)
+    ("CYRILLIC CAPITAL LETTER LITTLE YUS" #x0466)
+    ("CYRILLIC SMALL LETTER LITTLE YUS" #x0467)
+    ("CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS" #x0468)
+    ("CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS" #x0469)
+    ("CYRILLIC CAPITAL LETTER BIG YUS" #x046A)
+    ("CYRILLIC SMALL LETTER BIG YUS" #x046B)
+    ("CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS" #x046C)
+    ("CYRILLIC SMALL LETTER IOTIFIED BIG YUS" #x046D)
+    ("CYRILLIC CAPITAL LETTER KSI" #x046E)
+    ("CYRILLIC SMALL LETTER KSI" #x046F)
+    ("CYRILLIC CAPITAL LETTER PSI" #x0470)
+    ("CYRILLIC SMALL LETTER PSI" #x0471)
+    ("CYRILLIC CAPITAL LETTER FITA" #x0472)
+    ("CYRILLIC SMALL LETTER FITA" #x0473)
+    ("CYRILLIC CAPITAL LETTER IZHITSA" #x0474)
+    ("CYRILLIC SMALL LETTER IZHITSA" #x0475)
+    ("CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT" #x0476)
+    ("CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT" #x0477)
+    ("CYRILLIC CAPITAL LETTER UK" #x0478)
+    ("CYRILLIC SMALL LETTER UK" #x0479)
+    ("CYRILLIC CAPITAL LETTER ROUND OMEGA" #x047A)
+    ("CYRILLIC SMALL LETTER ROUND OMEGA" #x047B)
+    ("CYRILLIC CAPITAL LETTER OMEGA WITH TITLO" #x047C)
+    ("CYRILLIC SMALL LETTER OMEGA WITH TITLO" #x047D)
+    ("CYRILLIC CAPITAL LETTER OT" #x047E)
+    ("CYRILLIC SMALL LETTER OT" #x047F)
+    ("CYRILLIC CAPITAL LETTER KOPPA" #x0480)
+    ("CYRILLIC SMALL LETTER KOPPA" #x0481)
+    ("CYRILLIC THOUSANDS SIGN" #x0482)
+    ("COMBINING CYRILLIC TITLO" #x0483)
+    ("COMBINING CYRILLIC PALATALIZATION" #x0484)
+    ("COMBINING CYRILLIC DASIA PNEUMATA" #x0485)
+    ("COMBINING CYRILLIC PSILI PNEUMATA" #x0486)
+    ("COMBINING CYRILLIC HUNDRED THOUSANDS SIGN" #x0488)
+    ("COMBINING CYRILLIC MILLIONS SIGN" #x0489)
+    ("CYRILLIC CAPITAL LETTER SHORT I WITH TAIL" #x048A)
+    ("CYRILLIC SMALL LETTER SHORT I WITH TAIL" #x048B)
+    ("CYRILLIC CAPITAL LETTER SEMISOFT SIGN" #x048C)
+    ("CYRILLIC SMALL LETTER SEMISOFT SIGN" #x048D)
+    ("CYRILLIC CAPITAL LETTER ER WITH TICK" #x048E)
+    ("CYRILLIC SMALL LETTER ER WITH TICK" #x048F)
+    ("CYRILLIC CAPITAL LETTER GHE WITH UPTURN" #x0490)
+    ("CYRILLIC SMALL LETTER GHE WITH UPTURN" #x0491)
+    ("CYRILLIC CAPITAL LETTER GHE WITH STROKE" #x0492)
+    ("CYRILLIC SMALL LETTER GHE WITH STROKE" #x0493)
+    ("CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK" #x0494)
+    ("CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK" #x0495)
+    ("CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER" #x0496)
+    ("CYRILLIC SMALL LETTER ZHE WITH DESCENDER" #x0497)
+    ("CYRILLIC CAPITAL LETTER ZE WITH DESCENDER" #x0498)
+    ("CYRILLIC SMALL LETTER ZE WITH DESCENDER" #x0499)
+    ("CYRILLIC CAPITAL LETTER KA WITH DESCENDER" #x049A)
+    ("CYRILLIC SMALL LETTER KA WITH DESCENDER" #x049B)
+    ("CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE" #x049C)
+    ("CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE" #x049D)
+    ("CYRILLIC CAPITAL LETTER KA WITH STROKE" #x049E)
+    ("CYRILLIC SMALL LETTER KA WITH STROKE" #x049F)
+    ("CYRILLIC CAPITAL LETTER BASHKIR KA" #x04A0)
+    ("CYRILLIC SMALL LETTER BASHKIR KA" #x04A1)
+    ("CYRILLIC CAPITAL LETTER EN WITH DESCENDER" #x04A2)
+    ("CYRILLIC SMALL LETTER EN WITH DESCENDER" #x04A3)
+    ("CYRILLIC CAPITAL LIGATURE EN GHE" #x04A4)
+    ("CYRILLIC SMALL LIGATURE EN GHE" #x04A5)
+    ("CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK" #x04A6)
+    ("CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK" #x04A7)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN HA" #x04A8)
+    ("CYRILLIC SMALL LETTER ABKHASIAN HA" #x04A9)
+    ("CYRILLIC CAPITAL LETTER ES WITH DESCENDER" #x04AA)
+    ("CYRILLIC SMALL LETTER ES WITH DESCENDER" #x04AB)
+    ("CYRILLIC CAPITAL LETTER TE WITH DESCENDER" #x04AC)
+    ("CYRILLIC SMALL LETTER TE WITH DESCENDER" #x04AD)
+    ("CYRILLIC CAPITAL LETTER STRAIGHT U" #x04AE)
+    ("CYRILLIC SMALL LETTER STRAIGHT U" #x04AF)
+    ("CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE" #x04B0)
+    ("CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE" #x04B1)
+    ("CYRILLIC CAPITAL LETTER HA WITH DESCENDER" #x04B2)
+    ("CYRILLIC SMALL LETTER HA WITH DESCENDER" #x04B3)
+    ("CYRILLIC CAPITAL LIGATURE TE TSE" #x04B4)
+    ("CYRILLIC SMALL LIGATURE TE TSE" #x04B5)
+    ("CYRILLIC CAPITAL LETTER CHE WITH DESCENDER" #x04B6)
+    ("CYRILLIC SMALL LETTER CHE WITH DESCENDER" #x04B7)
+    ("CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE" #x04B8)
+    ("CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE" #x04B9)
+    ("CYRILLIC CAPITAL LETTER SHHA" #x04BA)
+    ("CYRILLIC SMALL LETTER SHHA" #x04BB)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN CHE" #x04BC)
+    ("CYRILLIC SMALL LETTER ABKHASIAN CHE" #x04BD)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER" #x04BE)
+    ("CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER" #x04BF)
+    ("CYRILLIC LETTER PALOCHKA" #x04C0)
+    ("CYRILLIC CAPITAL LETTER ZHE WITH BREVE" #x04C1)
+    ("CYRILLIC SMALL LETTER ZHE WITH BREVE" #x04C2)
+    ("CYRILLIC CAPITAL LETTER KA WITH HOOK" #x04C3)
+    ("CYRILLIC SMALL LETTER KA WITH HOOK" #x04C4)
+    ("CYRILLIC CAPITAL LETTER EL WITH TAIL" #x04C5)
+    ("CYRILLIC SMALL LETTER EL WITH TAIL" #x04C6)
+    ("CYRILLIC CAPITAL LETTER EN WITH HOOK" #x04C7)
+    ("CYRILLIC SMALL LETTER EN WITH HOOK" #x04C8)
+    ("CYRILLIC CAPITAL LETTER EN WITH TAIL" #x04C9)
+    ("CYRILLIC SMALL LETTER EN WITH TAIL" #x04CA)
+    ("CYRILLIC CAPITAL LETTER KHAKASSIAN CHE" #x04CB)
+    ("CYRILLIC SMALL LETTER KHAKASSIAN CHE" #x04CC)
+    ("CYRILLIC CAPITAL LETTER EM WITH TAIL" #x04CD)
+    ("CYRILLIC SMALL LETTER EM WITH TAIL" #x04CE)
+    ("CYRILLIC CAPITAL LETTER A WITH BREVE" #x04D0)
+    ("CYRILLIC SMALL LETTER A WITH BREVE" #x04D1)
+    ("CYRILLIC CAPITAL LETTER A WITH DIAERESIS" #x04D2)
+    ("CYRILLIC SMALL LETTER A WITH DIAERESIS" #x04D3)
+    ("CYRILLIC CAPITAL LIGATURE A IE" #x04D4)
+    ("CYRILLIC SMALL LIGATURE A IE" #x04D5)
+    ("CYRILLIC CAPITAL LETTER IE WITH BREVE" #x04D6)
+    ("CYRILLIC SMALL LETTER IE WITH BREVE" #x04D7)
+    ("CYRILLIC CAPITAL LETTER SCHWA" #x04D8)
+    ("CYRILLIC SMALL LETTER SCHWA" #x04D9)
+    ("CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS" #x04DA)
+    ("CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS" #x04DB)
+    ("CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS" #x04DC)
+    ("CYRILLIC SMALL LETTER ZHE WITH DIAERESIS" #x04DD)
+    ("CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS" #x04DE)
+    ("CYRILLIC SMALL LETTER ZE WITH DIAERESIS" #x04DF)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN DZE" #x04E0)
+    ("CYRILLIC SMALL LETTER ABKHASIAN DZE" #x04E1)
+    ("CYRILLIC CAPITAL LETTER I WITH MACRON" #x04E2)
+    ("CYRILLIC SMALL LETTER I WITH MACRON" #x04E3)
+    ("CYRILLIC CAPITAL LETTER I WITH DIAERESIS" #x04E4)
+    ("CYRILLIC SMALL LETTER I WITH DIAERESIS" #x04E5)
+    ("CYRILLIC CAPITAL LETTER O WITH DIAERESIS" #x04E6)
+    ("CYRILLIC SMALL LETTER O WITH DIAERESIS" #x04E7)
+    ("CYRILLIC CAPITAL LETTER BARRED O" #x04E8)
+    ("CYRILLIC SMALL LETTER BARRED O" #x04E9)
+    ("CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS" #x04EA)
+    ("CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS" #x04EB)
+    ("CYRILLIC CAPITAL LETTER E WITH DIAERESIS" #x04EC)
+    ("CYRILLIC SMALL LETTER E WITH DIAERESIS" #x04ED)
+    ("CYRILLIC CAPITAL LETTER U WITH MACRON" #x04EE)
+    ("CYRILLIC SMALL LETTER U WITH MACRON" #x04EF)
+    ("CYRILLIC CAPITAL LETTER U WITH DIAERESIS" #x04F0)
+    ("CYRILLIC SMALL LETTER U WITH DIAERESIS" #x04F1)
+    ("CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE" #x04F2)
+    ("CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE" #x04F3)
+    ("CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS" #x04F4)
+    ("CYRILLIC SMALL LETTER CHE WITH DIAERESIS" #x04F5)
+    ("CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS" #x04F8)
+    ("CYRILLIC SMALL LETTER YERU WITH DIAERESIS" #x04F9)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00500-0052F.el b/lisp/nxml/char-name/unicode/00500-0052F.el
new file mode 100644 (file)
index 0000000..a595411
--- /dev/null
@@ -0,0 +1,18 @@
+(nxml-define-char-name-set 'cyrillic-supplementary
+  '(("CYRILLIC CAPITAL LETTER KOMI DE" #x0500)
+    ("CYRILLIC SMALL LETTER KOMI DE" #x0501)
+    ("CYRILLIC CAPITAL LETTER KOMI DJE" #x0502)
+    ("CYRILLIC SMALL LETTER KOMI DJE" #x0503)
+    ("CYRILLIC CAPITAL LETTER KOMI ZJE" #x0504)
+    ("CYRILLIC SMALL LETTER KOMI ZJE" #x0505)
+    ("CYRILLIC CAPITAL LETTER KOMI DZJE" #x0506)
+    ("CYRILLIC SMALL LETTER KOMI DZJE" #x0507)
+    ("CYRILLIC CAPITAL LETTER KOMI LJE" #x0508)
+    ("CYRILLIC SMALL LETTER KOMI LJE" #x0509)
+    ("CYRILLIC CAPITAL LETTER KOMI NJE" #x050A)
+    ("CYRILLIC SMALL LETTER KOMI NJE" #x050B)
+    ("CYRILLIC CAPITAL LETTER KOMI SJE" #x050C)
+    ("CYRILLIC SMALL LETTER KOMI SJE" #x050D)
+    ("CYRILLIC CAPITAL LETTER KOMI TJE" #x050E)
+    ("CYRILLIC SMALL LETTER KOMI TJE" #x050F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00530-0058F.el b/lisp/nxml/char-name/unicode/00530-0058F.el
new file mode 100644 (file)
index 0000000..0f5d0ed
--- /dev/null
@@ -0,0 +1,88 @@
+(nxml-define-char-name-set 'armenian
+  '(("ARMENIAN CAPITAL LETTER AYB" #x0531)
+    ("ARMENIAN CAPITAL LETTER BEN" #x0532)
+    ("ARMENIAN CAPITAL LETTER GIM" #x0533)
+    ("ARMENIAN CAPITAL LETTER DA" #x0534)
+    ("ARMENIAN CAPITAL LETTER ECH" #x0535)
+    ("ARMENIAN CAPITAL LETTER ZA" #x0536)
+    ("ARMENIAN CAPITAL LETTER EH" #x0537)
+    ("ARMENIAN CAPITAL LETTER ET" #x0538)
+    ("ARMENIAN CAPITAL LETTER TO" #x0539)
+    ("ARMENIAN CAPITAL LETTER ZHE" #x053A)
+    ("ARMENIAN CAPITAL LETTER INI" #x053B)
+    ("ARMENIAN CAPITAL LETTER LIWN" #x053C)
+    ("ARMENIAN CAPITAL LETTER XEH" #x053D)
+    ("ARMENIAN CAPITAL LETTER CA" #x053E)
+    ("ARMENIAN CAPITAL LETTER KEN" #x053F)
+    ("ARMENIAN CAPITAL LETTER HO" #x0540)
+    ("ARMENIAN CAPITAL LETTER JA" #x0541)
+    ("ARMENIAN CAPITAL LETTER GHAD" #x0542)
+    ("ARMENIAN CAPITAL LETTER CHEH" #x0543)
+    ("ARMENIAN CAPITAL LETTER MEN" #x0544)
+    ("ARMENIAN CAPITAL LETTER YI" #x0545)
+    ("ARMENIAN CAPITAL LETTER NOW" #x0546)
+    ("ARMENIAN CAPITAL LETTER SHA" #x0547)
+    ("ARMENIAN CAPITAL LETTER VO" #x0548)
+    ("ARMENIAN CAPITAL LETTER CHA" #x0549)
+    ("ARMENIAN CAPITAL LETTER PEH" #x054A)
+    ("ARMENIAN CAPITAL LETTER JHEH" #x054B)
+    ("ARMENIAN CAPITAL LETTER RA" #x054C)
+    ("ARMENIAN CAPITAL LETTER SEH" #x054D)
+    ("ARMENIAN CAPITAL LETTER VEW" #x054E)
+    ("ARMENIAN CAPITAL LETTER TIWN" #x054F)
+    ("ARMENIAN CAPITAL LETTER REH" #x0550)
+    ("ARMENIAN CAPITAL LETTER CO" #x0551)
+    ("ARMENIAN CAPITAL LETTER YIWN" #x0552)
+    ("ARMENIAN CAPITAL LETTER PIWR" #x0553)
+    ("ARMENIAN CAPITAL LETTER KEH" #x0554)
+    ("ARMENIAN CAPITAL LETTER OH" #x0555)
+    ("ARMENIAN CAPITAL LETTER FEH" #x0556)
+    ("ARMENIAN MODIFIER LETTER LEFT HALF RING" #x0559)
+    ("ARMENIAN APOSTROPHE" #x055A)
+    ("ARMENIAN EMPHASIS MARK" #x055B)
+    ("ARMENIAN EXCLAMATION MARK" #x055C)
+    ("ARMENIAN COMMA" #x055D)
+    ("ARMENIAN QUESTION MARK" #x055E)
+    ("ARMENIAN ABBREVIATION MARK" #x055F)
+    ("ARMENIAN SMALL LETTER AYB" #x0561)
+    ("ARMENIAN SMALL LETTER BEN" #x0562)
+    ("ARMENIAN SMALL LETTER GIM" #x0563)
+    ("ARMENIAN SMALL LETTER DA" #x0564)
+    ("ARMENIAN SMALL LETTER ECH" #x0565)
+    ("ARMENIAN SMALL LETTER ZA" #x0566)
+    ("ARMENIAN SMALL LETTER EH" #x0567)
+    ("ARMENIAN SMALL LETTER ET" #x0568)
+    ("ARMENIAN SMALL LETTER TO" #x0569)
+    ("ARMENIAN SMALL LETTER ZHE" #x056A)
+    ("ARMENIAN SMALL LETTER INI" #x056B)
+    ("ARMENIAN SMALL LETTER LIWN" #x056C)
+    ("ARMENIAN SMALL LETTER XEH" #x056D)
+    ("ARMENIAN SMALL LETTER CA" #x056E)
+    ("ARMENIAN SMALL LETTER KEN" #x056F)
+    ("ARMENIAN SMALL LETTER HO" #x0570)
+    ("ARMENIAN SMALL LETTER JA" #x0571)
+    ("ARMENIAN SMALL LETTER GHAD" #x0572)
+    ("ARMENIAN SMALL LETTER CHEH" #x0573)
+    ("ARMENIAN SMALL LETTER MEN" #x0574)
+    ("ARMENIAN SMALL LETTER YI" #x0575)
+    ("ARMENIAN SMALL LETTER NOW" #x0576)
+    ("ARMENIAN SMALL LETTER SHA" #x0577)
+    ("ARMENIAN SMALL LETTER VO" #x0578)
+    ("ARMENIAN SMALL LETTER CHA" #x0579)
+    ("ARMENIAN SMALL LETTER PEH" #x057A)
+    ("ARMENIAN SMALL LETTER JHEH" #x057B)
+    ("ARMENIAN SMALL LETTER RA" #x057C)
+    ("ARMENIAN SMALL LETTER SEH" #x057D)
+    ("ARMENIAN SMALL LETTER VEW" #x057E)
+    ("ARMENIAN SMALL LETTER TIWN" #x057F)
+    ("ARMENIAN SMALL LETTER REH" #x0580)
+    ("ARMENIAN SMALL LETTER CO" #x0581)
+    ("ARMENIAN SMALL LETTER YIWN" #x0582)
+    ("ARMENIAN SMALL LETTER PIWR" #x0583)
+    ("ARMENIAN SMALL LETTER KEH" #x0584)
+    ("ARMENIAN SMALL LETTER OH" #x0585)
+    ("ARMENIAN SMALL LETTER FEH" #x0586)
+    ("ARMENIAN SMALL LIGATURE ECH YIWN" #x0587)
+    ("ARMENIAN FULL STOP" #x0589)
+    ("ARMENIAN HYPHEN" #x058A)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00590-005FF.el b/lisp/nxml/char-name/unicode/00590-005FF.el
new file mode 100644 (file)
index 0000000..b33d5ea
--- /dev/null
@@ -0,0 +1,84 @@
+(nxml-define-char-name-set 'hebrew
+  '(("HEBREW ACCENT ETNAHTA" #x0591)
+    ("HEBREW ACCENT SEGOL" #x0592)
+    ("HEBREW ACCENT SHALSHELET" #x0593)
+    ("HEBREW ACCENT ZAQEF QATAN" #x0594)
+    ("HEBREW ACCENT ZAQEF GADOL" #x0595)
+    ("HEBREW ACCENT TIPEHA" #x0596)
+    ("HEBREW ACCENT REVIA" #x0597)
+    ("HEBREW ACCENT ZARQA" #x0598)
+    ("HEBREW ACCENT PASHTA" #x0599)
+    ("HEBREW ACCENT YETIV" #x059A)
+    ("HEBREW ACCENT TEVIR" #x059B)
+    ("HEBREW ACCENT GERESH" #x059C)
+    ("HEBREW ACCENT GERESH MUQDAM" #x059D)
+    ("HEBREW ACCENT GERSHAYIM" #x059E)
+    ("HEBREW ACCENT QARNEY PARA" #x059F)
+    ("HEBREW ACCENT TELISHA GEDOLA" #x05A0)
+    ("HEBREW ACCENT PAZER" #x05A1)
+    ("HEBREW ACCENT MUNAH" #x05A3)
+    ("HEBREW ACCENT MAHAPAKH" #x05A4)
+    ("HEBREW ACCENT MERKHA" #x05A5)
+    ("HEBREW ACCENT MERKHA KEFULA" #x05A6)
+    ("HEBREW ACCENT DARGA" #x05A7)
+    ("HEBREW ACCENT QADMA" #x05A8)
+    ("HEBREW ACCENT TELISHA QETANA" #x05A9)
+    ("HEBREW ACCENT YERAH BEN YOMO" #x05AA)
+    ("HEBREW ACCENT OLE" #x05AB)
+    ("HEBREW ACCENT ILUY" #x05AC)
+    ("HEBREW ACCENT DEHI" #x05AD)
+    ("HEBREW ACCENT ZINOR" #x05AE)
+    ("HEBREW MARK MASORA CIRCLE" #x05AF)
+    ("HEBREW POINT SHEVA" #x05B0)
+    ("HEBREW POINT HATAF SEGOL" #x05B1)
+    ("HEBREW POINT HATAF PATAH" #x05B2)
+    ("HEBREW POINT HATAF QAMATS" #x05B3)
+    ("HEBREW POINT HIRIQ" #x05B4)
+    ("HEBREW POINT TSERE" #x05B5)
+    ("HEBREW POINT SEGOL" #x05B6)
+    ("HEBREW POINT PATAH" #x05B7)
+    ("HEBREW POINT QAMATS" #x05B8)
+    ("HEBREW POINT HOLAM" #x05B9)
+    ("HEBREW POINT QUBUTS" #x05BB)
+    ("HEBREW POINT DAGESH OR MAPIQ" #x05BC)
+    ("HEBREW POINT METEG" #x05BD)
+    ("HEBREW PUNCTUATION MAQAF" #x05BE)
+    ("HEBREW POINT RAFE" #x05BF)
+    ("HEBREW PUNCTUATION PASEQ" #x05C0)
+    ("HEBREW POINT SHIN DOT" #x05C1)
+    ("HEBREW POINT SIN DOT" #x05C2)
+    ("HEBREW PUNCTUATION SOF PASUQ" #x05C3)
+    ("HEBREW MARK UPPER DOT" #x05C4)
+    ("HEBREW LETTER ALEF" #x05D0)
+    ("HEBREW LETTER BET" #x05D1)
+    ("HEBREW LETTER GIMEL" #x05D2)
+    ("HEBREW LETTER DALET" #x05D3)
+    ("HEBREW LETTER HE" #x05D4)
+    ("HEBREW LETTER VAV" #x05D5)
+    ("HEBREW LETTER ZAYIN" #x05D6)
+    ("HEBREW LETTER HET" #x05D7)
+    ("HEBREW LETTER TET" #x05D8)
+    ("HEBREW LETTER YOD" #x05D9)
+    ("HEBREW LETTER FINAL KAF" #x05DA)
+    ("HEBREW LETTER KAF" #x05DB)
+    ("HEBREW LETTER LAMED" #x05DC)
+    ("HEBREW LETTER FINAL MEM" #x05DD)
+    ("HEBREW LETTER MEM" #x05DE)
+    ("HEBREW LETTER FINAL NUN" #x05DF)
+    ("HEBREW LETTER NUN" #x05E0)
+    ("HEBREW LETTER SAMEKH" #x05E1)
+    ("HEBREW LETTER AYIN" #x05E2)
+    ("HEBREW LETTER FINAL PE" #x05E3)
+    ("HEBREW LETTER PE" #x05E4)
+    ("HEBREW LETTER FINAL TSADI" #x05E5)
+    ("HEBREW LETTER TSADI" #x05E6)
+    ("HEBREW LETTER QOF" #x05E7)
+    ("HEBREW LETTER RESH" #x05E8)
+    ("HEBREW LETTER SHIN" #x05E9)
+    ("HEBREW LETTER TAV" #x05EA)
+    ("HEBREW LIGATURE YIDDISH DOUBLE VAV" #x05F0)
+    ("HEBREW LIGATURE YIDDISH VAV YOD" #x05F1)
+    ("HEBREW LIGATURE YIDDISH DOUBLE YOD" #x05F2)
+    ("HEBREW PUNCTUATION GERESH" #x05F3)
+    ("HEBREW PUNCTUATION GERSHAYIM" #x05F4)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00600-006FF.el b/lisp/nxml/char-name/unicode/00600-006FF.el
new file mode 100644 (file)
index 0000000..9009737
--- /dev/null
@@ -0,0 +1,210 @@
+(nxml-define-char-name-set 'arabic
+  '(("ARABIC COMMA" #x060C)
+    ("ARABIC SEMICOLON" #x061B)
+    ("ARABIC QUESTION MARK" #x061F)
+    ("ARABIC LETTER HAMZA" #x0621)
+    ("ARABIC LETTER ALEF WITH MADDA ABOVE" #x0622)
+    ("ARABIC LETTER ALEF WITH HAMZA ABOVE" #x0623)
+    ("ARABIC LETTER WAW WITH HAMZA ABOVE" #x0624)
+    ("ARABIC LETTER ALEF WITH HAMZA BELOW" #x0625)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE" #x0626)
+    ("ARABIC LETTER ALEF" #x0627)
+    ("ARABIC LETTER BEH" #x0628)
+    ("ARABIC LETTER TEH MARBUTA" #x0629)
+    ("ARABIC LETTER TEH" #x062A)
+    ("ARABIC LETTER THEH" #x062B)
+    ("ARABIC LETTER JEEM" #x062C)
+    ("ARABIC LETTER HAH" #x062D)
+    ("ARABIC LETTER KHAH" #x062E)
+    ("ARABIC LETTER DAL" #x062F)
+    ("ARABIC LETTER THAL" #x0630)
+    ("ARABIC LETTER REH" #x0631)
+    ("ARABIC LETTER ZAIN" #x0632)
+    ("ARABIC LETTER SEEN" #x0633)
+    ("ARABIC LETTER SHEEN" #x0634)
+    ("ARABIC LETTER SAD" #x0635)
+    ("ARABIC LETTER DAD" #x0636)
+    ("ARABIC LETTER TAH" #x0637)
+    ("ARABIC LETTER ZAH" #x0638)
+    ("ARABIC LETTER AIN" #x0639)
+    ("ARABIC LETTER GHAIN" #x063A)
+    ("ARABIC TATWEEL" #x0640)
+    ("ARABIC LETTER FEH" #x0641)
+    ("ARABIC LETTER QAF" #x0642)
+    ("ARABIC LETTER KAF" #x0643)
+    ("ARABIC LETTER LAM" #x0644)
+    ("ARABIC LETTER MEEM" #x0645)
+    ("ARABIC LETTER NOON" #x0646)
+    ("ARABIC LETTER HEH" #x0647)
+    ("ARABIC LETTER WAW" #x0648)
+    ("ARABIC LETTER ALEF MAKSURA" #x0649)
+    ("ARABIC LETTER YEH" #x064A)
+    ("ARABIC FATHATAN" #x064B)
+    ("ARABIC DAMMATAN" #x064C)
+    ("ARABIC KASRATAN" #x064D)
+    ("ARABIC FATHA" #x064E)
+    ("ARABIC DAMMA" #x064F)
+    ("ARABIC KASRA" #x0650)
+    ("ARABIC SHADDA" #x0651)
+    ("ARABIC SUKUN" #x0652)
+    ("ARABIC MADDAH ABOVE" #x0653)
+    ("ARABIC HAMZA ABOVE" #x0654)
+    ("ARABIC HAMZA BELOW" #x0655)
+    ("ARABIC-INDIC DIGIT ZERO" #x0660)
+    ("ARABIC-INDIC DIGIT ONE" #x0661)
+    ("ARABIC-INDIC DIGIT TWO" #x0662)
+    ("ARABIC-INDIC DIGIT THREE" #x0663)
+    ("ARABIC-INDIC DIGIT FOUR" #x0664)
+    ("ARABIC-INDIC DIGIT FIVE" #x0665)
+    ("ARABIC-INDIC DIGIT SIX" #x0666)
+    ("ARABIC-INDIC DIGIT SEVEN" #x0667)
+    ("ARABIC-INDIC DIGIT EIGHT" #x0668)
+    ("ARABIC-INDIC DIGIT NINE" #x0669)
+    ("ARABIC PERCENT SIGN" #x066A)
+    ("ARABIC DECIMAL SEPARATOR" #x066B)
+    ("ARABIC THOUSANDS SEPARATOR" #x066C)
+    ("ARABIC FIVE POINTED STAR" #x066D)
+    ("ARABIC LETTER DOTLESS BEH" #x066E)
+    ("ARABIC LETTER DOTLESS QAF" #x066F)
+    ("ARABIC LETTER SUPERSCRIPT ALEF" #x0670)
+    ("ARABIC LETTER ALEF WASLA" #x0671)
+    ("ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE" #x0672)
+    ("ARABIC LETTER ALEF WITH WAVY HAMZA BELOW" #x0673)
+    ("ARABIC LETTER HIGH HAMZA" #x0674)
+    ("ARABIC LETTER HIGH HAMZA ALEF" #x0675)
+    ("ARABIC LETTER HIGH HAMZA WAW" #x0676)
+    ("ARABIC LETTER U WITH HAMZA ABOVE" #x0677)
+    ("ARABIC LETTER HIGH HAMZA YEH" #x0678)
+    ("ARABIC LETTER TTEH" #x0679)
+    ("ARABIC LETTER TTEHEH" #x067A)
+    ("ARABIC LETTER BEEH" #x067B)
+    ("ARABIC LETTER TEH WITH RING" #x067C)
+    ("ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS" #x067D)
+    ("ARABIC LETTER PEH" #x067E)
+    ("ARABIC LETTER TEHEH" #x067F)
+    ("ARABIC LETTER BEHEH" #x0680)
+    ("ARABIC LETTER HAH WITH HAMZA ABOVE" #x0681)
+    ("ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE" #x0682)
+    ("ARABIC LETTER NYEH" #x0683)
+    ("ARABIC LETTER DYEH" #x0684)
+    ("ARABIC LETTER HAH WITH THREE DOTS ABOVE" #x0685)
+    ("ARABIC LETTER TCHEH" #x0686)
+    ("ARABIC LETTER TCHEHEH" #x0687)
+    ("ARABIC LETTER DDAL" #x0688)
+    ("ARABIC LETTER DAL WITH RING" #x0689)
+    ("ARABIC LETTER DAL WITH DOT BELOW" #x068A)
+    ("ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH" #x068B)
+    ("ARABIC LETTER DAHAL" #x068C)
+    ("ARABIC LETTER DDAHAL" #x068D)
+    ("ARABIC LETTER DUL" #x068E)
+    ("ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS" #x068F)
+    ("ARABIC LETTER DAL WITH FOUR DOTS ABOVE" #x0690)
+    ("ARABIC LETTER RREH" #x0691)
+    ("ARABIC LETTER REH WITH SMALL V" #x0692)
+    ("ARABIC LETTER REH WITH RING" #x0693)
+    ("ARABIC LETTER REH WITH DOT BELOW" #x0694)
+    ("ARABIC LETTER REH WITH SMALL V BELOW" #x0695)
+    ("ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE" #x0696)
+    ("ARABIC LETTER REH WITH TWO DOTS ABOVE" #x0697)
+    ("ARABIC LETTER JEH" #x0698)
+    ("ARABIC LETTER REH WITH FOUR DOTS ABOVE" #x0699)
+    ("ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE" #x069A)
+    ("ARABIC LETTER SEEN WITH THREE DOTS BELOW" #x069B)
+    ("ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE" #x069C)
+    ("ARABIC LETTER SAD WITH TWO DOTS BELOW" #x069D)
+    ("ARABIC LETTER SAD WITH THREE DOTS ABOVE" #x069E)
+    ("ARABIC LETTER TAH WITH THREE DOTS ABOVE" #x069F)
+    ("ARABIC LETTER AIN WITH THREE DOTS ABOVE" #x06A0)
+    ("ARABIC LETTER DOTLESS FEH" #x06A1)
+    ("ARABIC LETTER FEH WITH DOT MOVED BELOW" #x06A2)
+    ("ARABIC LETTER FEH WITH DOT BELOW" #x06A3)
+    ("ARABIC LETTER VEH" #x06A4)
+    ("ARABIC LETTER FEH WITH THREE DOTS BELOW" #x06A5)
+    ("ARABIC LETTER PEHEH" #x06A6)
+    ("ARABIC LETTER QAF WITH DOT ABOVE" #x06A7)
+    ("ARABIC LETTER QAF WITH THREE DOTS ABOVE" #x06A8)
+    ("ARABIC LETTER KEHEH" #x06A9)
+    ("ARABIC LETTER SWASH KAF" #x06AA)
+    ("ARABIC LETTER KAF WITH RING" #x06AB)
+    ("ARABIC LETTER KAF WITH DOT ABOVE" #x06AC)
+    ("ARABIC LETTER NG" #x06AD)
+    ("ARABIC LETTER KAF WITH THREE DOTS BELOW" #x06AE)
+    ("ARABIC LETTER GAF" #x06AF)
+    ("ARABIC LETTER GAF WITH RING" #x06B0)
+    ("ARABIC LETTER NGOEH" #x06B1)
+    ("ARABIC LETTER GAF WITH TWO DOTS BELOW" #x06B2)
+    ("ARABIC LETTER GUEH" #x06B3)
+    ("ARABIC LETTER GAF WITH THREE DOTS ABOVE" #x06B4)
+    ("ARABIC LETTER LAM WITH SMALL V" #x06B5)
+    ("ARABIC LETTER LAM WITH DOT ABOVE" #x06B6)
+    ("ARABIC LETTER LAM WITH THREE DOTS ABOVE" #x06B7)
+    ("ARABIC LETTER LAM WITH THREE DOTS BELOW" #x06B8)
+    ("ARABIC LETTER NOON WITH DOT BELOW" #x06B9)
+    ("ARABIC LETTER NOON GHUNNA" #x06BA)
+    ("ARABIC LETTER RNOON" #x06BB)
+    ("ARABIC LETTER NOON WITH RING" #x06BC)
+    ("ARABIC LETTER NOON WITH THREE DOTS ABOVE" #x06BD)
+    ("ARABIC LETTER HEH DOACHASHMEE" #x06BE)
+    ("ARABIC LETTER TCHEH WITH DOT ABOVE" #x06BF)
+    ("ARABIC LETTER HEH WITH YEH ABOVE" #x06C0)
+    ("ARABIC LETTER HEH GOAL" #x06C1)
+    ("ARABIC LETTER HEH GOAL WITH HAMZA ABOVE" #x06C2)
+    ("ARABIC LETTER TEH MARBUTA GOAL" #x06C3)
+    ("ARABIC LETTER WAW WITH RING" #x06C4)
+    ("ARABIC LETTER KIRGHIZ OE" #x06C5)
+    ("ARABIC LETTER OE" #x06C6)
+    ("ARABIC LETTER U" #x06C7)
+    ("ARABIC LETTER YU" #x06C8)
+    ("ARABIC LETTER KIRGHIZ YU" #x06C9)
+    ("ARABIC LETTER WAW WITH TWO DOTS ABOVE" #x06CA)
+    ("ARABIC LETTER VE" #x06CB)
+    ("ARABIC LETTER FARSI YEH" #x06CC)
+    ("ARABIC LETTER YEH WITH TAIL" #x06CD)
+    ("ARABIC LETTER YEH WITH SMALL V" #x06CE)
+    ("ARABIC LETTER WAW WITH DOT ABOVE" #x06CF)
+    ("ARABIC LETTER E" #x06D0)
+    ("ARABIC LETTER YEH WITH THREE DOTS BELOW" #x06D1)
+    ("ARABIC LETTER YEH BARREE" #x06D2)
+    ("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE" #x06D3)
+    ("ARABIC FULL STOP" #x06D4)
+    ("ARABIC LETTER AE" #x06D5)
+    ("ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA" #x06D6)
+    ("ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA" #x06D7)
+    ("ARABIC SMALL HIGH MEEM INITIAL FORM" #x06D8)
+    ("ARABIC SMALL HIGH LAM ALEF" #x06D9)
+    ("ARABIC SMALL HIGH JEEM" #x06DA)
+    ("ARABIC SMALL HIGH THREE DOTS" #x06DB)
+    ("ARABIC SMALL HIGH SEEN" #x06DC)
+    ("ARABIC END OF AYAH" #x06DD)
+    ("ARABIC START OF RUB EL HIZB" #x06DE)
+    ("ARABIC SMALL HIGH ROUNDED ZERO" #x06DF)
+    ("ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO" #x06E0)
+    ("ARABIC SMALL HIGH DOTLESS HEAD OF KHAH" #x06E1)
+    ("ARABIC SMALL HIGH MEEM ISOLATED FORM" #x06E2)
+    ("ARABIC SMALL LOW SEEN" #x06E3)
+    ("ARABIC SMALL HIGH MADDA" #x06E4)
+    ("ARABIC SMALL WAW" #x06E5)
+    ("ARABIC SMALL YEH" #x06E6)
+    ("ARABIC SMALL HIGH YEH" #x06E7)
+    ("ARABIC SMALL HIGH NOON" #x06E8)
+    ("ARABIC PLACE OF SAJDAH" #x06E9)
+    ("ARABIC EMPTY CENTRE LOW STOP" #x06EA)
+    ("ARABIC EMPTY CENTRE HIGH STOP" #x06EB)
+    ("ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE" #x06EC)
+    ("ARABIC SMALL LOW MEEM" #x06ED)
+    ("EXTENDED ARABIC-INDIC DIGIT ZERO" #x06F0)
+    ("EXTENDED ARABIC-INDIC DIGIT ONE" #x06F1)
+    ("EXTENDED ARABIC-INDIC DIGIT TWO" #x06F2)
+    ("EXTENDED ARABIC-INDIC DIGIT THREE" #x06F3)
+    ("EXTENDED ARABIC-INDIC DIGIT FOUR" #x06F4)
+    ("EXTENDED ARABIC-INDIC DIGIT FIVE" #x06F5)
+    ("EXTENDED ARABIC-INDIC DIGIT SIX" #x06F6)
+    ("EXTENDED ARABIC-INDIC DIGIT SEVEN" #x06F7)
+    ("EXTENDED ARABIC-INDIC DIGIT EIGHT" #x06F8)
+    ("EXTENDED ARABIC-INDIC DIGIT NINE" #x06F9)
+    ("ARABIC LETTER SHEEN WITH DOT BELOW" #x06FA)
+    ("ARABIC LETTER DAD WITH DOT BELOW" #x06FB)
+    ("ARABIC LETTER GHAIN WITH DOT BELOW" #x06FC)
+    ("ARABIC SIGN SINDHI AMPERSAND" #x06FD)
+    ("ARABIC SIGN SINDHI POSTPOSITION MEN" #x06FE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00700-0074F.el b/lisp/nxml/char-name/unicode/00700-0074F.el
new file mode 100644 (file)
index 0000000..434861c
--- /dev/null
@@ -0,0 +1,73 @@
+(nxml-define-char-name-set 'syriac
+  '(("SYRIAC END OF PARAGRAPH" #x0700)
+    ("SYRIAC SUPRALINEAR FULL STOP" #x0701)
+    ("SYRIAC SUBLINEAR FULL STOP" #x0702)
+    ("SYRIAC SUPRALINEAR COLON" #x0703)
+    ("SYRIAC SUBLINEAR COLON" #x0704)
+    ("SYRIAC HORIZONTAL COLON" #x0705)
+    ("SYRIAC COLON SKEWED LEFT" #x0706)
+    ("SYRIAC COLON SKEWED RIGHT" #x0707)
+    ("SYRIAC SUPRALINEAR COLON SKEWED LEFT" #x0708)
+    ("SYRIAC SUBLINEAR COLON SKEWED RIGHT" #x0709)
+    ("SYRIAC CONTRACTION" #x070A)
+    ("SYRIAC HARKLEAN OBELUS" #x070B)
+    ("SYRIAC HARKLEAN METOBELUS" #x070C)
+    ("SYRIAC HARKLEAN ASTERISCUS" #x070D)
+    ("SYRIAC ABBREVIATION MARK" #x070F)
+    ("SYRIAC LETTER ALAPH" #x0710)
+    ("SYRIAC LETTER SUPERSCRIPT ALAPH" #x0711)
+    ("SYRIAC LETTER BETH" #x0712)
+    ("SYRIAC LETTER GAMAL" #x0713)
+    ("SYRIAC LETTER GAMAL GARSHUNI" #x0714)
+    ("SYRIAC LETTER DALATH" #x0715)
+    ("SYRIAC LETTER DOTLESS DALATH RISH" #x0716)
+    ("SYRIAC LETTER HE" #x0717)
+    ("SYRIAC LETTER WAW" #x0718)
+    ("SYRIAC LETTER ZAIN" #x0719)
+    ("SYRIAC LETTER HETH" #x071A)
+    ("SYRIAC LETTER TETH" #x071B)
+    ("SYRIAC LETTER TETH GARSHUNI" #x071C)
+    ("SYRIAC LETTER YUDH" #x071D)
+    ("SYRIAC LETTER YUDH HE" #x071E)
+    ("SYRIAC LETTER KAPH" #x071F)
+    ("SYRIAC LETTER LAMADH" #x0720)
+    ("SYRIAC LETTER MIM" #x0721)
+    ("SYRIAC LETTER NUN" #x0722)
+    ("SYRIAC LETTER SEMKATH" #x0723)
+    ("SYRIAC LETTER FINAL SEMKATH" #x0724)
+    ("SYRIAC LETTER E" #x0725)
+    ("SYRIAC LETTER PE" #x0726)
+    ("SYRIAC LETTER REVERSED PE" #x0727)
+    ("SYRIAC LETTER SADHE" #x0728)
+    ("SYRIAC LETTER QAPH" #x0729)
+    ("SYRIAC LETTER RISH" #x072A)
+    ("SYRIAC LETTER SHIN" #x072B)
+    ("SYRIAC LETTER TAW" #x072C)
+    ("SYRIAC PTHAHA ABOVE" #x0730)
+    ("SYRIAC PTHAHA BELOW" #x0731)
+    ("SYRIAC PTHAHA DOTTED" #x0732)
+    ("SYRIAC ZQAPHA ABOVE" #x0733)
+    ("SYRIAC ZQAPHA BELOW" #x0734)
+    ("SYRIAC ZQAPHA DOTTED" #x0735)
+    ("SYRIAC RBASA ABOVE" #x0736)
+    ("SYRIAC RBASA BELOW" #x0737)
+    ("SYRIAC DOTTED ZLAMA HORIZONTAL" #x0738)
+    ("SYRIAC DOTTED ZLAMA ANGULAR" #x0739)
+    ("SYRIAC HBASA ABOVE" #x073A)
+    ("SYRIAC HBASA BELOW" #x073B)
+    ("SYRIAC HBASA-ESASA DOTTED" #x073C)
+    ("SYRIAC ESASA ABOVE" #x073D)
+    ("SYRIAC ESASA BELOW" #x073E)
+    ("SYRIAC RWAHA" #x073F)
+    ("SYRIAC FEMININE DOT" #x0740)
+    ("SYRIAC QUSHSHAYA" #x0741)
+    ("SYRIAC RUKKAKHA" #x0742)
+    ("SYRIAC TWO VERTICAL DOTS ABOVE" #x0743)
+    ("SYRIAC TWO VERTICAL DOTS BELOW" #x0744)
+    ("SYRIAC THREE DOTS ABOVE" #x0745)
+    ("SYRIAC THREE DOTS BELOW" #x0746)
+    ("SYRIAC OBLIQUE LINE ABOVE" #x0747)
+    ("SYRIAC OBLIQUE LINE BELOW" #x0748)
+    ("SYRIAC MUSIC" #x0749)
+    ("SYRIAC BARREKH" #x074A)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00780-007BF.el b/lisp/nxml/char-name/unicode/00780-007BF.el
new file mode 100644 (file)
index 0000000..bb57292
--- /dev/null
@@ -0,0 +1,52 @@
+(nxml-define-char-name-set 'thaana
+  '(("THAANA LETTER HAA" #x0780)
+    ("THAANA LETTER SHAVIYANI" #x0781)
+    ("THAANA LETTER NOONU" #x0782)
+    ("THAANA LETTER RAA" #x0783)
+    ("THAANA LETTER BAA" #x0784)
+    ("THAANA LETTER LHAVIYANI" #x0785)
+    ("THAANA LETTER KAAFU" #x0786)
+    ("THAANA LETTER ALIFU" #x0787)
+    ("THAANA LETTER VAAVU" #x0788)
+    ("THAANA LETTER MEEMU" #x0789)
+    ("THAANA LETTER FAAFU" #x078A)
+    ("THAANA LETTER DHAALU" #x078B)
+    ("THAANA LETTER THAA" #x078C)
+    ("THAANA LETTER LAAMU" #x078D)
+    ("THAANA LETTER GAAFU" #x078E)
+    ("THAANA LETTER GNAVIYANI" #x078F)
+    ("THAANA LETTER SEENU" #x0790)
+    ("THAANA LETTER DAVIYANI" #x0791)
+    ("THAANA LETTER ZAVIYANI" #x0792)
+    ("THAANA LETTER TAVIYANI" #x0793)
+    ("THAANA LETTER YAA" #x0794)
+    ("THAANA LETTER PAVIYANI" #x0795)
+    ("THAANA LETTER JAVIYANI" #x0796)
+    ("THAANA LETTER CHAVIYANI" #x0797)
+    ("THAANA LETTER TTAA" #x0798)
+    ("THAANA LETTER HHAA" #x0799)
+    ("THAANA LETTER KHAA" #x079A)
+    ("THAANA LETTER THAALU" #x079B)
+    ("THAANA LETTER ZAA" #x079C)
+    ("THAANA LETTER SHEENU" #x079D)
+    ("THAANA LETTER SAADHU" #x079E)
+    ("THAANA LETTER DAADHU" #x079F)
+    ("THAANA LETTER TO" #x07A0)
+    ("THAANA LETTER ZO" #x07A1)
+    ("THAANA LETTER AINU" #x07A2)
+    ("THAANA LETTER GHAINU" #x07A3)
+    ("THAANA LETTER QAAFU" #x07A4)
+    ("THAANA LETTER WAAVU" #x07A5)
+    ("THAANA ABAFILI" #x07A6)
+    ("THAANA AABAAFILI" #x07A7)
+    ("THAANA IBIFILI" #x07A8)
+    ("THAANA EEBEEFILI" #x07A9)
+    ("THAANA UBUFILI" #x07AA)
+    ("THAANA OOBOOFILI" #x07AB)
+    ("THAANA EBEFILI" #x07AC)
+    ("THAANA EYBEYFILI" #x07AD)
+    ("THAANA OBOFILI" #x07AE)
+    ("THAANA OABOAFILI" #x07AF)
+    ("THAANA SUKUN" #x07B0)
+    ("THAANA LETTER NAA" #x07B1)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00900-0097F.el b/lisp/nxml/char-name/unicode/00900-0097F.el
new file mode 100644 (file)
index 0000000..c93dd46
--- /dev/null
@@ -0,0 +1,106 @@
+(nxml-define-char-name-set 'devanagari
+  '(("DEVANAGARI SIGN CANDRABINDU" #x0901)
+    ("DEVANAGARI SIGN ANUSVARA" #x0902)
+    ("DEVANAGARI SIGN VISARGA" #x0903)
+    ("DEVANAGARI LETTER A" #x0905)
+    ("DEVANAGARI LETTER AA" #x0906)
+    ("DEVANAGARI LETTER I" #x0907)
+    ("DEVANAGARI LETTER II" #x0908)
+    ("DEVANAGARI LETTER U" #x0909)
+    ("DEVANAGARI LETTER UU" #x090A)
+    ("DEVANAGARI LETTER VOCALIC R" #x090B)
+    ("DEVANAGARI LETTER VOCALIC L" #x090C)
+    ("DEVANAGARI LETTER CANDRA E" #x090D)
+    ("DEVANAGARI LETTER SHORT E" #x090E)
+    ("DEVANAGARI LETTER E" #x090F)
+    ("DEVANAGARI LETTER AI" #x0910)
+    ("DEVANAGARI LETTER CANDRA O" #x0911)
+    ("DEVANAGARI LETTER SHORT O" #x0912)
+    ("DEVANAGARI LETTER O" #x0913)
+    ("DEVANAGARI LETTER AU" #x0914)
+    ("DEVANAGARI LETTER KA" #x0915)
+    ("DEVANAGARI LETTER KHA" #x0916)
+    ("DEVANAGARI LETTER GA" #x0917)
+    ("DEVANAGARI LETTER GHA" #x0918)
+    ("DEVANAGARI LETTER NGA" #x0919)
+    ("DEVANAGARI LETTER CA" #x091A)
+    ("DEVANAGARI LETTER CHA" #x091B)
+    ("DEVANAGARI LETTER JA" #x091C)
+    ("DEVANAGARI LETTER JHA" #x091D)
+    ("DEVANAGARI LETTER NYA" #x091E)
+    ("DEVANAGARI LETTER TTA" #x091F)
+    ("DEVANAGARI LETTER TTHA" #x0920)
+    ("DEVANAGARI LETTER DDA" #x0921)
+    ("DEVANAGARI LETTER DDHA" #x0922)
+    ("DEVANAGARI LETTER NNA" #x0923)
+    ("DEVANAGARI LETTER TA" #x0924)
+    ("DEVANAGARI LETTER THA" #x0925)
+    ("DEVANAGARI LETTER DA" #x0926)
+    ("DEVANAGARI LETTER DHA" #x0927)
+    ("DEVANAGARI LETTER NA" #x0928)
+    ("DEVANAGARI LETTER NNNA" #x0929)
+    ("DEVANAGARI LETTER PA" #x092A)
+    ("DEVANAGARI LETTER PHA" #x092B)
+    ("DEVANAGARI LETTER BA" #x092C)
+    ("DEVANAGARI LETTER BHA" #x092D)
+    ("DEVANAGARI LETTER MA" #x092E)
+    ("DEVANAGARI LETTER YA" #x092F)
+    ("DEVANAGARI LETTER RA" #x0930)
+    ("DEVANAGARI LETTER RRA" #x0931)
+    ("DEVANAGARI LETTER LA" #x0932)
+    ("DEVANAGARI LETTER LLA" #x0933)
+    ("DEVANAGARI LETTER LLLA" #x0934)
+    ("DEVANAGARI LETTER VA" #x0935)
+    ("DEVANAGARI LETTER SHA" #x0936)
+    ("DEVANAGARI LETTER SSA" #x0937)
+    ("DEVANAGARI LETTER SA" #x0938)
+    ("DEVANAGARI LETTER HA" #x0939)
+    ("DEVANAGARI SIGN NUKTA" #x093C)
+    ("DEVANAGARI SIGN AVAGRAHA" #x093D)
+    ("DEVANAGARI VOWEL SIGN AA" #x093E)
+    ("DEVANAGARI VOWEL SIGN I" #x093F)
+    ("DEVANAGARI VOWEL SIGN II" #x0940)
+    ("DEVANAGARI VOWEL SIGN U" #x0941)
+    ("DEVANAGARI VOWEL SIGN UU" #x0942)
+    ("DEVANAGARI VOWEL SIGN VOCALIC R" #x0943)
+    ("DEVANAGARI VOWEL SIGN VOCALIC RR" #x0944)
+    ("DEVANAGARI VOWEL SIGN CANDRA E" #x0945)
+    ("DEVANAGARI VOWEL SIGN SHORT E" #x0946)
+    ("DEVANAGARI VOWEL SIGN E" #x0947)
+    ("DEVANAGARI VOWEL SIGN AI" #x0948)
+    ("DEVANAGARI VOWEL SIGN CANDRA O" #x0949)
+    ("DEVANAGARI VOWEL SIGN SHORT O" #x094A)
+    ("DEVANAGARI VOWEL SIGN O" #x094B)
+    ("DEVANAGARI VOWEL SIGN AU" #x094C)
+    ("DEVANAGARI SIGN VIRAMA" #x094D)
+    ("DEVANAGARI OM" #x0950)
+    ("DEVANAGARI STRESS SIGN UDATTA" #x0951)
+    ("DEVANAGARI STRESS SIGN ANUDATTA" #x0952)
+    ("DEVANAGARI GRAVE ACCENT" #x0953)
+    ("DEVANAGARI ACUTE ACCENT" #x0954)
+    ("DEVANAGARI LETTER QA" #x0958)
+    ("DEVANAGARI LETTER KHHA" #x0959)
+    ("DEVANAGARI LETTER GHHA" #x095A)
+    ("DEVANAGARI LETTER ZA" #x095B)
+    ("DEVANAGARI LETTER DDDHA" #x095C)
+    ("DEVANAGARI LETTER RHA" #x095D)
+    ("DEVANAGARI LETTER FA" #x095E)
+    ("DEVANAGARI LETTER YYA" #x095F)
+    ("DEVANAGARI LETTER VOCALIC RR" #x0960)
+    ("DEVANAGARI LETTER VOCALIC LL" #x0961)
+    ("DEVANAGARI VOWEL SIGN VOCALIC L" #x0962)
+    ("DEVANAGARI VOWEL SIGN VOCALIC LL" #x0963)
+    ("DEVANAGARI DANDA" #x0964)
+    ("DEVANAGARI DOUBLE DANDA" #x0965)
+    ("DEVANAGARI DIGIT ZERO" #x0966)
+    ("DEVANAGARI DIGIT ONE" #x0967)
+    ("DEVANAGARI DIGIT TWO" #x0968)
+    ("DEVANAGARI DIGIT THREE" #x0969)
+    ("DEVANAGARI DIGIT FOUR" #x096A)
+    ("DEVANAGARI DIGIT FIVE" #x096B)
+    ("DEVANAGARI DIGIT SIX" #x096C)
+    ("DEVANAGARI DIGIT SEVEN" #x096D)
+    ("DEVANAGARI DIGIT EIGHT" #x096E)
+    ("DEVANAGARI DIGIT NINE" #x096F)
+    ("DEVANAGARI ABBREVIATION SIGN" #x0970)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00980-009FF.el b/lisp/nxml/char-name/unicode/00980-009FF.el
new file mode 100644 (file)
index 0000000..cfae10e
--- /dev/null
@@ -0,0 +1,91 @@
+(nxml-define-char-name-set 'bengali
+  '(("BENGALI SIGN CANDRABINDU" #x0981)
+    ("BENGALI SIGN ANUSVARA" #x0982)
+    ("BENGALI SIGN VISARGA" #x0983)
+    ("BENGALI LETTER A" #x0985)
+    ("BENGALI LETTER AA" #x0986)
+    ("BENGALI LETTER I" #x0987)
+    ("BENGALI LETTER II" #x0988)
+    ("BENGALI LETTER U" #x0989)
+    ("BENGALI LETTER UU" #x098A)
+    ("BENGALI LETTER VOCALIC R" #x098B)
+    ("BENGALI LETTER VOCALIC L" #x098C)
+    ("BENGALI LETTER E" #x098F)
+    ("BENGALI LETTER AI" #x0990)
+    ("BENGALI LETTER O" #x0993)
+    ("BENGALI LETTER AU" #x0994)
+    ("BENGALI LETTER KA" #x0995)
+    ("BENGALI LETTER KHA" #x0996)
+    ("BENGALI LETTER GA" #x0997)
+    ("BENGALI LETTER GHA" #x0998)
+    ("BENGALI LETTER NGA" #x0999)
+    ("BENGALI LETTER CA" #x099A)
+    ("BENGALI LETTER CHA" #x099B)
+    ("BENGALI LETTER JA" #x099C)
+    ("BENGALI LETTER JHA" #x099D)
+    ("BENGALI LETTER NYA" #x099E)
+    ("BENGALI LETTER TTA" #x099F)
+    ("BENGALI LETTER TTHA" #x09A0)
+    ("BENGALI LETTER DDA" #x09A1)
+    ("BENGALI LETTER DDHA" #x09A2)
+    ("BENGALI LETTER NNA" #x09A3)
+    ("BENGALI LETTER TA" #x09A4)
+    ("BENGALI LETTER THA" #x09A5)
+    ("BENGALI LETTER DA" #x09A6)
+    ("BENGALI LETTER DHA" #x09A7)
+    ("BENGALI LETTER NA" #x09A8)
+    ("BENGALI LETTER PA" #x09AA)
+    ("BENGALI LETTER PHA" #x09AB)
+    ("BENGALI LETTER BA" #x09AC)
+    ("BENGALI LETTER BHA" #x09AD)
+    ("BENGALI LETTER MA" #x09AE)
+    ("BENGALI LETTER YA" #x09AF)
+    ("BENGALI LETTER RA" #x09B0)
+    ("BENGALI LETTER LA" #x09B2)
+    ("BENGALI LETTER SHA" #x09B6)
+    ("BENGALI LETTER SSA" #x09B7)
+    ("BENGALI LETTER SA" #x09B8)
+    ("BENGALI LETTER HA" #x09B9)
+    ("BENGALI SIGN NUKTA" #x09BC)
+    ("BENGALI VOWEL SIGN AA" #x09BE)
+    ("BENGALI VOWEL SIGN I" #x09BF)
+    ("BENGALI VOWEL SIGN II" #x09C0)
+    ("BENGALI VOWEL SIGN U" #x09C1)
+    ("BENGALI VOWEL SIGN UU" #x09C2)
+    ("BENGALI VOWEL SIGN VOCALIC R" #x09C3)
+    ("BENGALI VOWEL SIGN VOCALIC RR" #x09C4)
+    ("BENGALI VOWEL SIGN E" #x09C7)
+    ("BENGALI VOWEL SIGN AI" #x09C8)
+    ("BENGALI VOWEL SIGN O" #x09CB)
+    ("BENGALI VOWEL SIGN AU" #x09CC)
+    ("BENGALI SIGN VIRAMA" #x09CD)
+    ("BENGALI AU LENGTH MARK" #x09D7)
+    ("BENGALI LETTER RRA" #x09DC)
+    ("BENGALI LETTER RHA" #x09DD)
+    ("BENGALI LETTER YYA" #x09DF)
+    ("BENGALI LETTER VOCALIC RR" #x09E0)
+    ("BENGALI LETTER VOCALIC LL" #x09E1)
+    ("BENGALI VOWEL SIGN VOCALIC L" #x09E2)
+    ("BENGALI VOWEL SIGN VOCALIC LL" #x09E3)
+    ("BENGALI DIGIT ZERO" #x09E6)
+    ("BENGALI DIGIT ONE" #x09E7)
+    ("BENGALI DIGIT TWO" #x09E8)
+    ("BENGALI DIGIT THREE" #x09E9)
+    ("BENGALI DIGIT FOUR" #x09EA)
+    ("BENGALI DIGIT FIVE" #x09EB)
+    ("BENGALI DIGIT SIX" #x09EC)
+    ("BENGALI DIGIT SEVEN" #x09ED)
+    ("BENGALI DIGIT EIGHT" #x09EE)
+    ("BENGALI DIGIT NINE" #x09EF)
+    ("BENGALI LETTER RA WITH MIDDLE DIAGONAL" #x09F0)
+    ("BENGALI LETTER RA WITH LOWER DIAGONAL" #x09F1)
+    ("BENGALI RUPEE MARK" #x09F2)
+    ("BENGALI RUPEE SIGN" #x09F3)
+    ("BENGALI CURRENCY NUMERATOR ONE" #x09F4)
+    ("BENGALI CURRENCY NUMERATOR TWO" #x09F5)
+    ("BENGALI CURRENCY NUMERATOR THREE" #x09F6)
+    ("BENGALI CURRENCY NUMERATOR FOUR" #x09F7)
+    ("BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR" #x09F8)
+    ("BENGALI CURRENCY DENOMINATOR SIXTEEN" #x09F9)
+    ("BENGALI ISSHAR" #x09FA)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00A00-00A7F.el b/lisp/nxml/char-name/unicode/00A00-00A7F.el
new file mode 100644 (file)
index 0000000..5adfaed
--- /dev/null
@@ -0,0 +1,77 @@
+(nxml-define-char-name-set 'gurmukhi
+  '(("GURMUKHI SIGN BINDI" #x0A02)
+    ("GURMUKHI LETTER A" #x0A05)
+    ("GURMUKHI LETTER AA" #x0A06)
+    ("GURMUKHI LETTER I" #x0A07)
+    ("GURMUKHI LETTER II" #x0A08)
+    ("GURMUKHI LETTER U" #x0A09)
+    ("GURMUKHI LETTER UU" #x0A0A)
+    ("GURMUKHI LETTER EE" #x0A0F)
+    ("GURMUKHI LETTER AI" #x0A10)
+    ("GURMUKHI LETTER OO" #x0A13)
+    ("GURMUKHI LETTER AU" #x0A14)
+    ("GURMUKHI LETTER KA" #x0A15)
+    ("GURMUKHI LETTER KHA" #x0A16)
+    ("GURMUKHI LETTER GA" #x0A17)
+    ("GURMUKHI LETTER GHA" #x0A18)
+    ("GURMUKHI LETTER NGA" #x0A19)
+    ("GURMUKHI LETTER CA" #x0A1A)
+    ("GURMUKHI LETTER CHA" #x0A1B)
+    ("GURMUKHI LETTER JA" #x0A1C)
+    ("GURMUKHI LETTER JHA" #x0A1D)
+    ("GURMUKHI LETTER NYA" #x0A1E)
+    ("GURMUKHI LETTER TTA" #x0A1F)
+    ("GURMUKHI LETTER TTHA" #x0A20)
+    ("GURMUKHI LETTER DDA" #x0A21)
+    ("GURMUKHI LETTER DDHA" #x0A22)
+    ("GURMUKHI LETTER NNA" #x0A23)
+    ("GURMUKHI LETTER TA" #x0A24)
+    ("GURMUKHI LETTER THA" #x0A25)
+    ("GURMUKHI LETTER DA" #x0A26)
+    ("GURMUKHI LETTER DHA" #x0A27)
+    ("GURMUKHI LETTER NA" #x0A28)
+    ("GURMUKHI LETTER PA" #x0A2A)
+    ("GURMUKHI LETTER PHA" #x0A2B)
+    ("GURMUKHI LETTER BA" #x0A2C)
+    ("GURMUKHI LETTER BHA" #x0A2D)
+    ("GURMUKHI LETTER MA" #x0A2E)
+    ("GURMUKHI LETTER YA" #x0A2F)
+    ("GURMUKHI LETTER RA" #x0A30)
+    ("GURMUKHI LETTER LA" #x0A32)
+    ("GURMUKHI LETTER LLA" #x0A33)
+    ("GURMUKHI LETTER VA" #x0A35)
+    ("GURMUKHI LETTER SHA" #x0A36)
+    ("GURMUKHI LETTER SA" #x0A38)
+    ("GURMUKHI LETTER HA" #x0A39)
+    ("GURMUKHI SIGN NUKTA" #x0A3C)
+    ("GURMUKHI VOWEL SIGN AA" #x0A3E)
+    ("GURMUKHI VOWEL SIGN I" #x0A3F)
+    ("GURMUKHI VOWEL SIGN II" #x0A40)
+    ("GURMUKHI VOWEL SIGN U" #x0A41)
+    ("GURMUKHI VOWEL SIGN UU" #x0A42)
+    ("GURMUKHI VOWEL SIGN EE" #x0A47)
+    ("GURMUKHI VOWEL SIGN AI" #x0A48)
+    ("GURMUKHI VOWEL SIGN OO" #x0A4B)
+    ("GURMUKHI VOWEL SIGN AU" #x0A4C)
+    ("GURMUKHI SIGN VIRAMA" #x0A4D)
+    ("GURMUKHI LETTER KHHA" #x0A59)
+    ("GURMUKHI LETTER GHHA" #x0A5A)
+    ("GURMUKHI LETTER ZA" #x0A5B)
+    ("GURMUKHI LETTER RRA" #x0A5C)
+    ("GURMUKHI LETTER FA" #x0A5E)
+    ("GURMUKHI DIGIT ZERO" #x0A66)
+    ("GURMUKHI DIGIT ONE" #x0A67)
+    ("GURMUKHI DIGIT TWO" #x0A68)
+    ("GURMUKHI DIGIT THREE" #x0A69)
+    ("GURMUKHI DIGIT FOUR" #x0A6A)
+    ("GURMUKHI DIGIT FIVE" #x0A6B)
+    ("GURMUKHI DIGIT SIX" #x0A6C)
+    ("GURMUKHI DIGIT SEVEN" #x0A6D)
+    ("GURMUKHI DIGIT EIGHT" #x0A6E)
+    ("GURMUKHI DIGIT NINE" #x0A6F)
+    ("GURMUKHI TIPPI" #x0A70)
+    ("GURMUKHI ADDAK" #x0A71)
+    ("GURMUKHI IRI" #x0A72)
+    ("GURMUKHI URA" #x0A73)
+    ("GURMUKHI EK ONKAR" #x0A74)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00A80-00AFF.el b/lisp/nxml/char-name/unicode/00A80-00AFF.el
new file mode 100644 (file)
index 0000000..35be7fa
--- /dev/null
@@ -0,0 +1,80 @@
+(nxml-define-char-name-set 'gujarati
+  '(("GUJARATI SIGN CANDRABINDU" #x0A81)
+    ("GUJARATI SIGN ANUSVARA" #x0A82)
+    ("GUJARATI SIGN VISARGA" #x0A83)
+    ("GUJARATI LETTER A" #x0A85)
+    ("GUJARATI LETTER AA" #x0A86)
+    ("GUJARATI LETTER I" #x0A87)
+    ("GUJARATI LETTER II" #x0A88)
+    ("GUJARATI LETTER U" #x0A89)
+    ("GUJARATI LETTER UU" #x0A8A)
+    ("GUJARATI LETTER VOCALIC R" #x0A8B)
+    ("GUJARATI VOWEL CANDRA E" #x0A8D)
+    ("GUJARATI LETTER E" #x0A8F)
+    ("GUJARATI LETTER AI" #x0A90)
+    ("GUJARATI VOWEL CANDRA O" #x0A91)
+    ("GUJARATI LETTER O" #x0A93)
+    ("GUJARATI LETTER AU" #x0A94)
+    ("GUJARATI LETTER KA" #x0A95)
+    ("GUJARATI LETTER KHA" #x0A96)
+    ("GUJARATI LETTER GA" #x0A97)
+    ("GUJARATI LETTER GHA" #x0A98)
+    ("GUJARATI LETTER NGA" #x0A99)
+    ("GUJARATI LETTER CA" #x0A9A)
+    ("GUJARATI LETTER CHA" #x0A9B)
+    ("GUJARATI LETTER JA" #x0A9C)
+    ("GUJARATI LETTER JHA" #x0A9D)
+    ("GUJARATI LETTER NYA" #x0A9E)
+    ("GUJARATI LETTER TTA" #x0A9F)
+    ("GUJARATI LETTER TTHA" #x0AA0)
+    ("GUJARATI LETTER DDA" #x0AA1)
+    ("GUJARATI LETTER DDHA" #x0AA2)
+    ("GUJARATI LETTER NNA" #x0AA3)
+    ("GUJARATI LETTER TA" #x0AA4)
+    ("GUJARATI LETTER THA" #x0AA5)
+    ("GUJARATI LETTER DA" #x0AA6)
+    ("GUJARATI LETTER DHA" #x0AA7)
+    ("GUJARATI LETTER NA" #x0AA8)
+    ("GUJARATI LETTER PA" #x0AAA)
+    ("GUJARATI LETTER PHA" #x0AAB)
+    ("GUJARATI LETTER BA" #x0AAC)
+    ("GUJARATI LETTER BHA" #x0AAD)
+    ("GUJARATI LETTER MA" #x0AAE)
+    ("GUJARATI LETTER YA" #x0AAF)
+    ("GUJARATI LETTER RA" #x0AB0)
+    ("GUJARATI LETTER LA" #x0AB2)
+    ("GUJARATI LETTER LLA" #x0AB3)
+    ("GUJARATI LETTER VA" #x0AB5)
+    ("GUJARATI LETTER SHA" #x0AB6)
+    ("GUJARATI LETTER SSA" #x0AB7)
+    ("GUJARATI LETTER SA" #x0AB8)
+    ("GUJARATI LETTER HA" #x0AB9)
+    ("GUJARATI SIGN NUKTA" #x0ABC)
+    ("GUJARATI SIGN AVAGRAHA" #x0ABD)
+    ("GUJARATI VOWEL SIGN AA" #x0ABE)
+    ("GUJARATI VOWEL SIGN I" #x0ABF)
+    ("GUJARATI VOWEL SIGN II" #x0AC0)
+    ("GUJARATI VOWEL SIGN U" #x0AC1)
+    ("GUJARATI VOWEL SIGN UU" #x0AC2)
+    ("GUJARATI VOWEL SIGN VOCALIC R" #x0AC3)
+    ("GUJARATI VOWEL SIGN VOCALIC RR" #x0AC4)
+    ("GUJARATI VOWEL SIGN CANDRA E" #x0AC5)
+    ("GUJARATI VOWEL SIGN E" #x0AC7)
+    ("GUJARATI VOWEL SIGN AI" #x0AC8)
+    ("GUJARATI VOWEL SIGN CANDRA O" #x0AC9)
+    ("GUJARATI VOWEL SIGN O" #x0ACB)
+    ("GUJARATI VOWEL SIGN AU" #x0ACC)
+    ("GUJARATI SIGN VIRAMA" #x0ACD)
+    ("GUJARATI OM" #x0AD0)
+    ("GUJARATI LETTER VOCALIC RR" #x0AE0)
+    ("GUJARATI DIGIT ZERO" #x0AE6)
+    ("GUJARATI DIGIT ONE" #x0AE7)
+    ("GUJARATI DIGIT TWO" #x0AE8)
+    ("GUJARATI DIGIT THREE" #x0AE9)
+    ("GUJARATI DIGIT FOUR" #x0AEA)
+    ("GUJARATI DIGIT FIVE" #x0AEB)
+    ("GUJARATI DIGIT SIX" #x0AEC)
+    ("GUJARATI DIGIT SEVEN" #x0AED)
+    ("GUJARATI DIGIT EIGHT" #x0AEE)
+    ("GUJARATI DIGIT NINE" #x0AEF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00B00-00B7F.el b/lisp/nxml/char-name/unicode/00B00-00B7F.el
new file mode 100644 (file)
index 0000000..e0d0864
--- /dev/null
@@ -0,0 +1,81 @@
+(nxml-define-char-name-set 'oriya
+  '(("ORIYA SIGN CANDRABINDU" #x0B01)
+    ("ORIYA SIGN ANUSVARA" #x0B02)
+    ("ORIYA SIGN VISARGA" #x0B03)
+    ("ORIYA LETTER A" #x0B05)
+    ("ORIYA LETTER AA" #x0B06)
+    ("ORIYA LETTER I" #x0B07)
+    ("ORIYA LETTER II" #x0B08)
+    ("ORIYA LETTER U" #x0B09)
+    ("ORIYA LETTER UU" #x0B0A)
+    ("ORIYA LETTER VOCALIC R" #x0B0B)
+    ("ORIYA LETTER VOCALIC L" #x0B0C)
+    ("ORIYA LETTER E" #x0B0F)
+    ("ORIYA LETTER AI" #x0B10)
+    ("ORIYA LETTER O" #x0B13)
+    ("ORIYA LETTER AU" #x0B14)
+    ("ORIYA LETTER KA" #x0B15)
+    ("ORIYA LETTER KHA" #x0B16)
+    ("ORIYA LETTER GA" #x0B17)
+    ("ORIYA LETTER GHA" #x0B18)
+    ("ORIYA LETTER NGA" #x0B19)
+    ("ORIYA LETTER CA" #x0B1A)
+    ("ORIYA LETTER CHA" #x0B1B)
+    ("ORIYA LETTER JA" #x0B1C)
+    ("ORIYA LETTER JHA" #x0B1D)
+    ("ORIYA LETTER NYA" #x0B1E)
+    ("ORIYA LETTER TTA" #x0B1F)
+    ("ORIYA LETTER TTHA" #x0B20)
+    ("ORIYA LETTER DDA" #x0B21)
+    ("ORIYA LETTER DDHA" #x0B22)
+    ("ORIYA LETTER NNA" #x0B23)
+    ("ORIYA LETTER TA" #x0B24)
+    ("ORIYA LETTER THA" #x0B25)
+    ("ORIYA LETTER DA" #x0B26)
+    ("ORIYA LETTER DHA" #x0B27)
+    ("ORIYA LETTER NA" #x0B28)
+    ("ORIYA LETTER PA" #x0B2A)
+    ("ORIYA LETTER PHA" #x0B2B)
+    ("ORIYA LETTER BA" #x0B2C)
+    ("ORIYA LETTER BHA" #x0B2D)
+    ("ORIYA LETTER MA" #x0B2E)
+    ("ORIYA LETTER YA" #x0B2F)
+    ("ORIYA LETTER RA" #x0B30)
+    ("ORIYA LETTER LA" #x0B32)
+    ("ORIYA LETTER LLA" #x0B33)
+    ("ORIYA LETTER SHA" #x0B36)
+    ("ORIYA LETTER SSA" #x0B37)
+    ("ORIYA LETTER SA" #x0B38)
+    ("ORIYA LETTER HA" #x0B39)
+    ("ORIYA SIGN NUKTA" #x0B3C)
+    ("ORIYA SIGN AVAGRAHA" #x0B3D)
+    ("ORIYA VOWEL SIGN AA" #x0B3E)
+    ("ORIYA VOWEL SIGN I" #x0B3F)
+    ("ORIYA VOWEL SIGN II" #x0B40)
+    ("ORIYA VOWEL SIGN U" #x0B41)
+    ("ORIYA VOWEL SIGN UU" #x0B42)
+    ("ORIYA VOWEL SIGN VOCALIC R" #x0B43)
+    ("ORIYA VOWEL SIGN E" #x0B47)
+    ("ORIYA VOWEL SIGN AI" #x0B48)
+    ("ORIYA VOWEL SIGN O" #x0B4B)
+    ("ORIYA VOWEL SIGN AU" #x0B4C)
+    ("ORIYA SIGN VIRAMA" #x0B4D)
+    ("ORIYA AI LENGTH MARK" #x0B56)
+    ("ORIYA AU LENGTH MARK" #x0B57)
+    ("ORIYA LETTER RRA" #x0B5C)
+    ("ORIYA LETTER RHA" #x0B5D)
+    ("ORIYA LETTER YYA" #x0B5F)
+    ("ORIYA LETTER VOCALIC RR" #x0B60)
+    ("ORIYA LETTER VOCALIC LL" #x0B61)
+    ("ORIYA DIGIT ZERO" #x0B66)
+    ("ORIYA DIGIT ONE" #x0B67)
+    ("ORIYA DIGIT TWO" #x0B68)
+    ("ORIYA DIGIT THREE" #x0B69)
+    ("ORIYA DIGIT FOUR" #x0B6A)
+    ("ORIYA DIGIT FIVE" #x0B6B)
+    ("ORIYA DIGIT SIX" #x0B6C)
+    ("ORIYA DIGIT SEVEN" #x0B6D)
+    ("ORIYA DIGIT EIGHT" #x0B6E)
+    ("ORIYA DIGIT NINE" #x0B6F)
+    ("ORIYA ISSHAR" #x0B70)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00B80-00BFF.el b/lisp/nxml/char-name/unicode/00B80-00BFF.el
new file mode 100644 (file)
index 0000000..8e23e13
--- /dev/null
@@ -0,0 +1,63 @@
+(nxml-define-char-name-set 'tamil
+  '(("TAMIL SIGN ANUSVARA" #x0B82)
+    ("TAMIL SIGN VISARGA" #x0B83)
+    ("TAMIL LETTER A" #x0B85)
+    ("TAMIL LETTER AA" #x0B86)
+    ("TAMIL LETTER I" #x0B87)
+    ("TAMIL LETTER II" #x0B88)
+    ("TAMIL LETTER U" #x0B89)
+    ("TAMIL LETTER UU" #x0B8A)
+    ("TAMIL LETTER E" #x0B8E)
+    ("TAMIL LETTER EE" #x0B8F)
+    ("TAMIL LETTER AI" #x0B90)
+    ("TAMIL LETTER O" #x0B92)
+    ("TAMIL LETTER OO" #x0B93)
+    ("TAMIL LETTER AU" #x0B94)
+    ("TAMIL LETTER KA" #x0B95)
+    ("TAMIL LETTER NGA" #x0B99)
+    ("TAMIL LETTER CA" #x0B9A)
+    ("TAMIL LETTER JA" #x0B9C)
+    ("TAMIL LETTER NYA" #x0B9E)
+    ("TAMIL LETTER TTA" #x0B9F)
+    ("TAMIL LETTER NNA" #x0BA3)
+    ("TAMIL LETTER TA" #x0BA4)
+    ("TAMIL LETTER NA" #x0BA8)
+    ("TAMIL LETTER NNNA" #x0BA9)
+    ("TAMIL LETTER PA" #x0BAA)
+    ("TAMIL LETTER MA" #x0BAE)
+    ("TAMIL LETTER YA" #x0BAF)
+    ("TAMIL LETTER RA" #x0BB0)
+    ("TAMIL LETTER RRA" #x0BB1)
+    ("TAMIL LETTER LA" #x0BB2)
+    ("TAMIL LETTER LLA" #x0BB3)
+    ("TAMIL LETTER LLLA" #x0BB4)
+    ("TAMIL LETTER VA" #x0BB5)
+    ("TAMIL LETTER SSA" #x0BB7)
+    ("TAMIL LETTER SA" #x0BB8)
+    ("TAMIL LETTER HA" #x0BB9)
+    ("TAMIL VOWEL SIGN AA" #x0BBE)
+    ("TAMIL VOWEL SIGN I" #x0BBF)
+    ("TAMIL VOWEL SIGN II" #x0BC0)
+    ("TAMIL VOWEL SIGN U" #x0BC1)
+    ("TAMIL VOWEL SIGN UU" #x0BC2)
+    ("TAMIL VOWEL SIGN E" #x0BC6)
+    ("TAMIL VOWEL SIGN EE" #x0BC7)
+    ("TAMIL VOWEL SIGN AI" #x0BC8)
+    ("TAMIL VOWEL SIGN O" #x0BCA)
+    ("TAMIL VOWEL SIGN OO" #x0BCB)
+    ("TAMIL VOWEL SIGN AU" #x0BCC)
+    ("TAMIL SIGN VIRAMA" #x0BCD)
+    ("TAMIL AU LENGTH MARK" #x0BD7)
+    ("TAMIL DIGIT ONE" #x0BE7)
+    ("TAMIL DIGIT TWO" #x0BE8)
+    ("TAMIL DIGIT THREE" #x0BE9)
+    ("TAMIL DIGIT FOUR" #x0BEA)
+    ("TAMIL DIGIT FIVE" #x0BEB)
+    ("TAMIL DIGIT SIX" #x0BEC)
+    ("TAMIL DIGIT SEVEN" #x0BED)
+    ("TAMIL DIGIT EIGHT" #x0BEE)
+    ("TAMIL DIGIT NINE" #x0BEF)
+    ("TAMIL NUMBER TEN" #x0BF0)
+    ("TAMIL NUMBER ONE HUNDRED" #x0BF1)
+    ("TAMIL NUMBER ONE THOUSAND" #x0BF2)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00C00-00C7F.el b/lisp/nxml/char-name/unicode/00C00-00C7F.el
new file mode 100644 (file)
index 0000000..ef70b35
--- /dev/null
@@ -0,0 +1,82 @@
+(nxml-define-char-name-set 'telugu
+  '(("TELUGU SIGN CANDRABINDU" #x0C01)
+    ("TELUGU SIGN ANUSVARA" #x0C02)
+    ("TELUGU SIGN VISARGA" #x0C03)
+    ("TELUGU LETTER A" #x0C05)
+    ("TELUGU LETTER AA" #x0C06)
+    ("TELUGU LETTER I" #x0C07)
+    ("TELUGU LETTER II" #x0C08)
+    ("TELUGU LETTER U" #x0C09)
+    ("TELUGU LETTER UU" #x0C0A)
+    ("TELUGU LETTER VOCALIC R" #x0C0B)
+    ("TELUGU LETTER VOCALIC L" #x0C0C)
+    ("TELUGU LETTER E" #x0C0E)
+    ("TELUGU LETTER EE" #x0C0F)
+    ("TELUGU LETTER AI" #x0C10)
+    ("TELUGU LETTER O" #x0C12)
+    ("TELUGU LETTER OO" #x0C13)
+    ("TELUGU LETTER AU" #x0C14)
+    ("TELUGU LETTER KA" #x0C15)
+    ("TELUGU LETTER KHA" #x0C16)
+    ("TELUGU LETTER GA" #x0C17)
+    ("TELUGU LETTER GHA" #x0C18)
+    ("TELUGU LETTER NGA" #x0C19)
+    ("TELUGU LETTER CA" #x0C1A)
+    ("TELUGU LETTER CHA" #x0C1B)
+    ("TELUGU LETTER JA" #x0C1C)
+    ("TELUGU LETTER JHA" #x0C1D)
+    ("TELUGU LETTER NYA" #x0C1E)
+    ("TELUGU LETTER TTA" #x0C1F)
+    ("TELUGU LETTER TTHA" #x0C20)
+    ("TELUGU LETTER DDA" #x0C21)
+    ("TELUGU LETTER DDHA" #x0C22)
+    ("TELUGU LETTER NNA" #x0C23)
+    ("TELUGU LETTER TA" #x0C24)
+    ("TELUGU LETTER THA" #x0C25)
+    ("TELUGU LETTER DA" #x0C26)
+    ("TELUGU LETTER DHA" #x0C27)
+    ("TELUGU LETTER NA" #x0C28)
+    ("TELUGU LETTER PA" #x0C2A)
+    ("TELUGU LETTER PHA" #x0C2B)
+    ("TELUGU LETTER BA" #x0C2C)
+    ("TELUGU LETTER BHA" #x0C2D)
+    ("TELUGU LETTER MA" #x0C2E)
+    ("TELUGU LETTER YA" #x0C2F)
+    ("TELUGU LETTER RA" #x0C30)
+    ("TELUGU LETTER RRA" #x0C31)
+    ("TELUGU LETTER LA" #x0C32)
+    ("TELUGU LETTER LLA" #x0C33)
+    ("TELUGU LETTER VA" #x0C35)
+    ("TELUGU LETTER SHA" #x0C36)
+    ("TELUGU LETTER SSA" #x0C37)
+    ("TELUGU LETTER SA" #x0C38)
+    ("TELUGU LETTER HA" #x0C39)
+    ("TELUGU VOWEL SIGN AA" #x0C3E)
+    ("TELUGU VOWEL SIGN I" #x0C3F)
+    ("TELUGU VOWEL SIGN II" #x0C40)
+    ("TELUGU VOWEL SIGN U" #x0C41)
+    ("TELUGU VOWEL SIGN UU" #x0C42)
+    ("TELUGU VOWEL SIGN VOCALIC R" #x0C43)
+    ("TELUGU VOWEL SIGN VOCALIC RR" #x0C44)
+    ("TELUGU VOWEL SIGN E" #x0C46)
+    ("TELUGU VOWEL SIGN EE" #x0C47)
+    ("TELUGU VOWEL SIGN AI" #x0C48)
+    ("TELUGU VOWEL SIGN O" #x0C4A)
+    ("TELUGU VOWEL SIGN OO" #x0C4B)
+    ("TELUGU VOWEL SIGN AU" #x0C4C)
+    ("TELUGU SIGN VIRAMA" #x0C4D)
+    ("TELUGU LENGTH MARK" #x0C55)
+    ("TELUGU AI LENGTH MARK" #x0C56)
+    ("TELUGU LETTER VOCALIC RR" #x0C60)
+    ("TELUGU LETTER VOCALIC LL" #x0C61)
+    ("TELUGU DIGIT ZERO" #x0C66)
+    ("TELUGU DIGIT ONE" #x0C67)
+    ("TELUGU DIGIT TWO" #x0C68)
+    ("TELUGU DIGIT THREE" #x0C69)
+    ("TELUGU DIGIT FOUR" #x0C6A)
+    ("TELUGU DIGIT FIVE" #x0C6B)
+    ("TELUGU DIGIT SIX" #x0C6C)
+    ("TELUGU DIGIT SEVEN" #x0C6D)
+    ("TELUGU DIGIT EIGHT" #x0C6E)
+    ("TELUGU DIGIT NINE" #x0C6F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00C80-00CFF.el b/lisp/nxml/char-name/unicode/00C80-00CFF.el
new file mode 100644 (file)
index 0000000..b94e194
--- /dev/null
@@ -0,0 +1,82 @@
+(nxml-define-char-name-set 'kannada
+  '(("KANNADA SIGN ANUSVARA" #x0C82)
+    ("KANNADA SIGN VISARGA" #x0C83)
+    ("KANNADA LETTER A" #x0C85)
+    ("KANNADA LETTER AA" #x0C86)
+    ("KANNADA LETTER I" #x0C87)
+    ("KANNADA LETTER II" #x0C88)
+    ("KANNADA LETTER U" #x0C89)
+    ("KANNADA LETTER UU" #x0C8A)
+    ("KANNADA LETTER VOCALIC R" #x0C8B)
+    ("KANNADA LETTER VOCALIC L" #x0C8C)
+    ("KANNADA LETTER E" #x0C8E)
+    ("KANNADA LETTER EE" #x0C8F)
+    ("KANNADA LETTER AI" #x0C90)
+    ("KANNADA LETTER O" #x0C92)
+    ("KANNADA LETTER OO" #x0C93)
+    ("KANNADA LETTER AU" #x0C94)
+    ("KANNADA LETTER KA" #x0C95)
+    ("KANNADA LETTER KHA" #x0C96)
+    ("KANNADA LETTER GA" #x0C97)
+    ("KANNADA LETTER GHA" #x0C98)
+    ("KANNADA LETTER NGA" #x0C99)
+    ("KANNADA LETTER CA" #x0C9A)
+    ("KANNADA LETTER CHA" #x0C9B)
+    ("KANNADA LETTER JA" #x0C9C)
+    ("KANNADA LETTER JHA" #x0C9D)
+    ("KANNADA LETTER NYA" #x0C9E)
+    ("KANNADA LETTER TTA" #x0C9F)
+    ("KANNADA LETTER TTHA" #x0CA0)
+    ("KANNADA LETTER DDA" #x0CA1)
+    ("KANNADA LETTER DDHA" #x0CA2)
+    ("KANNADA LETTER NNA" #x0CA3)
+    ("KANNADA LETTER TA" #x0CA4)
+    ("KANNADA LETTER THA" #x0CA5)
+    ("KANNADA LETTER DA" #x0CA6)
+    ("KANNADA LETTER DHA" #x0CA7)
+    ("KANNADA LETTER NA" #x0CA8)
+    ("KANNADA LETTER PA" #x0CAA)
+    ("KANNADA LETTER PHA" #x0CAB)
+    ("KANNADA LETTER BA" #x0CAC)
+    ("KANNADA LETTER BHA" #x0CAD)
+    ("KANNADA LETTER MA" #x0CAE)
+    ("KANNADA LETTER YA" #x0CAF)
+    ("KANNADA LETTER RA" #x0CB0)
+    ("KANNADA LETTER RRA" #x0CB1)
+    ("KANNADA LETTER LA" #x0CB2)
+    ("KANNADA LETTER LLA" #x0CB3)
+    ("KANNADA LETTER VA" #x0CB5)
+    ("KANNADA LETTER SHA" #x0CB6)
+    ("KANNADA LETTER SSA" #x0CB7)
+    ("KANNADA LETTER SA" #x0CB8)
+    ("KANNADA LETTER HA" #x0CB9)
+    ("KANNADA VOWEL SIGN AA" #x0CBE)
+    ("KANNADA VOWEL SIGN I" #x0CBF)
+    ("KANNADA VOWEL SIGN II" #x0CC0)
+    ("KANNADA VOWEL SIGN U" #x0CC1)
+    ("KANNADA VOWEL SIGN UU" #x0CC2)
+    ("KANNADA VOWEL SIGN VOCALIC R" #x0CC3)
+    ("KANNADA VOWEL SIGN VOCALIC RR" #x0CC4)
+    ("KANNADA VOWEL SIGN E" #x0CC6)
+    ("KANNADA VOWEL SIGN EE" #x0CC7)
+    ("KANNADA VOWEL SIGN AI" #x0CC8)
+    ("KANNADA VOWEL SIGN O" #x0CCA)
+    ("KANNADA VOWEL SIGN OO" #x0CCB)
+    ("KANNADA VOWEL SIGN AU" #x0CCC)
+    ("KANNADA SIGN VIRAMA" #x0CCD)
+    ("KANNADA LENGTH MARK" #x0CD5)
+    ("KANNADA AI LENGTH MARK" #x0CD6)
+    ("KANNADA LETTER FA" #x0CDE)
+    ("KANNADA LETTER VOCALIC RR" #x0CE0)
+    ("KANNADA LETTER VOCALIC LL" #x0CE1)
+    ("KANNADA DIGIT ZERO" #x0CE6)
+    ("KANNADA DIGIT ONE" #x0CE7)
+    ("KANNADA DIGIT TWO" #x0CE8)
+    ("KANNADA DIGIT THREE" #x0CE9)
+    ("KANNADA DIGIT FOUR" #x0CEA)
+    ("KANNADA DIGIT FIVE" #x0CEB)
+    ("KANNADA DIGIT SIX" #x0CEC)
+    ("KANNADA DIGIT SEVEN" #x0CED)
+    ("KANNADA DIGIT EIGHT" #x0CEE)
+    ("KANNADA DIGIT NINE" #x0CEF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00D00-00D7F.el b/lisp/nxml/char-name/unicode/00D00-00D7F.el
new file mode 100644 (file)
index 0000000..e9ea7e2
--- /dev/null
@@ -0,0 +1,80 @@
+(nxml-define-char-name-set 'malayalam
+  '(("MALAYALAM SIGN ANUSVARA" #x0D02)
+    ("MALAYALAM SIGN VISARGA" #x0D03)
+    ("MALAYALAM LETTER A" #x0D05)
+    ("MALAYALAM LETTER AA" #x0D06)
+    ("MALAYALAM LETTER I" #x0D07)
+    ("MALAYALAM LETTER II" #x0D08)
+    ("MALAYALAM LETTER U" #x0D09)
+    ("MALAYALAM LETTER UU" #x0D0A)
+    ("MALAYALAM LETTER VOCALIC R" #x0D0B)
+    ("MALAYALAM LETTER VOCALIC L" #x0D0C)
+    ("MALAYALAM LETTER E" #x0D0E)
+    ("MALAYALAM LETTER EE" #x0D0F)
+    ("MALAYALAM LETTER AI" #x0D10)
+    ("MALAYALAM LETTER O" #x0D12)
+    ("MALAYALAM LETTER OO" #x0D13)
+    ("MALAYALAM LETTER AU" #x0D14)
+    ("MALAYALAM LETTER KA" #x0D15)
+    ("MALAYALAM LETTER KHA" #x0D16)
+    ("MALAYALAM LETTER GA" #x0D17)
+    ("MALAYALAM LETTER GHA" #x0D18)
+    ("MALAYALAM LETTER NGA" #x0D19)
+    ("MALAYALAM LETTER CA" #x0D1A)
+    ("MALAYALAM LETTER CHA" #x0D1B)
+    ("MALAYALAM LETTER JA" #x0D1C)
+    ("MALAYALAM LETTER JHA" #x0D1D)
+    ("MALAYALAM LETTER NYA" #x0D1E)
+    ("MALAYALAM LETTER TTA" #x0D1F)
+    ("MALAYALAM LETTER TTHA" #x0D20)
+    ("MALAYALAM LETTER DDA" #x0D21)
+    ("MALAYALAM LETTER DDHA" #x0D22)
+    ("MALAYALAM LETTER NNA" #x0D23)
+    ("MALAYALAM LETTER TA" #x0D24)
+    ("MALAYALAM LETTER THA" #x0D25)
+    ("MALAYALAM LETTER DA" #x0D26)
+    ("MALAYALAM LETTER DHA" #x0D27)
+    ("MALAYALAM LETTER NA" #x0D28)
+    ("MALAYALAM LETTER PA" #x0D2A)
+    ("MALAYALAM LETTER PHA" #x0D2B)
+    ("MALAYALAM LETTER BA" #x0D2C)
+    ("MALAYALAM LETTER BHA" #x0D2D)
+    ("MALAYALAM LETTER MA" #x0D2E)
+    ("MALAYALAM LETTER YA" #x0D2F)
+    ("MALAYALAM LETTER RA" #x0D30)
+    ("MALAYALAM LETTER RRA" #x0D31)
+    ("MALAYALAM LETTER LA" #x0D32)
+    ("MALAYALAM LETTER LLA" #x0D33)
+    ("MALAYALAM LETTER LLLA" #x0D34)
+    ("MALAYALAM LETTER VA" #x0D35)
+    ("MALAYALAM LETTER SHA" #x0D36)
+    ("MALAYALAM LETTER SSA" #x0D37)
+    ("MALAYALAM LETTER SA" #x0D38)
+    ("MALAYALAM LETTER HA" #x0D39)
+    ("MALAYALAM VOWEL SIGN AA" #x0D3E)
+    ("MALAYALAM VOWEL SIGN I" #x0D3F)
+    ("MALAYALAM VOWEL SIGN II" #x0D40)
+    ("MALAYALAM VOWEL SIGN U" #x0D41)
+    ("MALAYALAM VOWEL SIGN UU" #x0D42)
+    ("MALAYALAM VOWEL SIGN VOCALIC R" #x0D43)
+    ("MALAYALAM VOWEL SIGN E" #x0D46)
+    ("MALAYALAM VOWEL SIGN EE" #x0D47)
+    ("MALAYALAM VOWEL SIGN AI" #x0D48)
+    ("MALAYALAM VOWEL SIGN O" #x0D4A)
+    ("MALAYALAM VOWEL SIGN OO" #x0D4B)
+    ("MALAYALAM VOWEL SIGN AU" #x0D4C)
+    ("MALAYALAM SIGN VIRAMA" #x0D4D)
+    ("MALAYALAM AU LENGTH MARK" #x0D57)
+    ("MALAYALAM LETTER VOCALIC RR" #x0D60)
+    ("MALAYALAM LETTER VOCALIC LL" #x0D61)
+    ("MALAYALAM DIGIT ZERO" #x0D66)
+    ("MALAYALAM DIGIT ONE" #x0D67)
+    ("MALAYALAM DIGIT TWO" #x0D68)
+    ("MALAYALAM DIGIT THREE" #x0D69)
+    ("MALAYALAM DIGIT FOUR" #x0D6A)
+    ("MALAYALAM DIGIT FIVE" #x0D6B)
+    ("MALAYALAM DIGIT SIX" #x0D6C)
+    ("MALAYALAM DIGIT SEVEN" #x0D6D)
+    ("MALAYALAM DIGIT EIGHT" #x0D6E)
+    ("MALAYALAM DIGIT NINE" #x0D6F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00D80-00DFF.el b/lisp/nxml/char-name/unicode/00D80-00DFF.el
new file mode 100644 (file)
index 0000000..d0278dd
--- /dev/null
@@ -0,0 +1,82 @@
+(nxml-define-char-name-set 'sinhala
+  '(("SINHALA SIGN ANUSVARAYA" #x0D82)
+    ("SINHALA SIGN VISARGAYA" #x0D83)
+    ("SINHALA LETTER AYANNA" #x0D85)
+    ("SINHALA LETTER AAYANNA" #x0D86)
+    ("SINHALA LETTER AEYANNA" #x0D87)
+    ("SINHALA LETTER AEEYANNA" #x0D88)
+    ("SINHALA LETTER IYANNA" #x0D89)
+    ("SINHALA LETTER IIYANNA" #x0D8A)
+    ("SINHALA LETTER UYANNA" #x0D8B)
+    ("SINHALA LETTER UUYANNA" #x0D8C)
+    ("SINHALA LETTER IRUYANNA" #x0D8D)
+    ("SINHALA LETTER IRUUYANNA" #x0D8E)
+    ("SINHALA LETTER ILUYANNA" #x0D8F)
+    ("SINHALA LETTER ILUUYANNA" #x0D90)
+    ("SINHALA LETTER EYANNA" #x0D91)
+    ("SINHALA LETTER EEYANNA" #x0D92)
+    ("SINHALA LETTER AIYANNA" #x0D93)
+    ("SINHALA LETTER OYANNA" #x0D94)
+    ("SINHALA LETTER OOYANNA" #x0D95)
+    ("SINHALA LETTER AUYANNA" #x0D96)
+    ("SINHALA LETTER ALPAPRAANA KAYANNA" #x0D9A)
+    ("SINHALA LETTER MAHAAPRAANA KAYANNA" #x0D9B)
+    ("SINHALA LETTER ALPAPRAANA GAYANNA" #x0D9C)
+    ("SINHALA LETTER MAHAAPRAANA GAYANNA" #x0D9D)
+    ("SINHALA LETTER KANTAJA NAASIKYAYA" #x0D9E)
+    ("SINHALA LETTER SANYAKA GAYANNA" #x0D9F)
+    ("SINHALA LETTER ALPAPRAANA CAYANNA" #x0DA0)
+    ("SINHALA LETTER MAHAAPRAANA CAYANNA" #x0DA1)
+    ("SINHALA LETTER ALPAPRAANA JAYANNA" #x0DA2)
+    ("SINHALA LETTER MAHAAPRAANA JAYANNA" #x0DA3)
+    ("SINHALA LETTER TAALUJA NAASIKYAYA" #x0DA4)
+    ("SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA" #x0DA5)
+    ("SINHALA LETTER SANYAKA JAYANNA" #x0DA6)
+    ("SINHALA LETTER ALPAPRAANA TTAYANNA" #x0DA7)
+    ("SINHALA LETTER MAHAAPRAANA TTAYANNA" #x0DA8)
+    ("SINHALA LETTER ALPAPRAANA DDAYANNA" #x0DA9)
+    ("SINHALA LETTER MAHAAPRAANA DDAYANNA" #x0DAA)
+    ("SINHALA LETTER MUURDHAJA NAYANNA" #x0DAB)
+    ("SINHALA LETTER SANYAKA DDAYANNA" #x0DAC)
+    ("SINHALA LETTER ALPAPRAANA TAYANNA" #x0DAD)
+    ("SINHALA LETTER MAHAAPRAANA TAYANNA" #x0DAE)
+    ("SINHALA LETTER ALPAPRAANA DAYANNA" #x0DAF)
+    ("SINHALA LETTER MAHAAPRAANA DAYANNA" #x0DB0)
+    ("SINHALA LETTER DANTAJA NAYANNA" #x0DB1)
+    ("SINHALA LETTER SANYAKA DAYANNA" #x0DB3)
+    ("SINHALA LETTER ALPAPRAANA PAYANNA" #x0DB4)
+    ("SINHALA LETTER MAHAAPRAANA PAYANNA" #x0DB5)
+    ("SINHALA LETTER ALPAPRAANA BAYANNA" #x0DB6)
+    ("SINHALA LETTER MAHAAPRAANA BAYANNA" #x0DB7)
+    ("SINHALA LETTER MAYANNA" #x0DB8)
+    ("SINHALA LETTER AMBA BAYANNA" #x0DB9)
+    ("SINHALA LETTER YAYANNA" #x0DBA)
+    ("SINHALA LETTER RAYANNA" #x0DBB)
+    ("SINHALA LETTER DANTAJA LAYANNA" #x0DBD)
+    ("SINHALA LETTER VAYANNA" #x0DC0)
+    ("SINHALA LETTER TAALUJA SAYANNA" #x0DC1)
+    ("SINHALA LETTER MUURDHAJA SAYANNA" #x0DC2)
+    ("SINHALA LETTER DANTAJA SAYANNA" #x0DC3)
+    ("SINHALA LETTER HAYANNA" #x0DC4)
+    ("SINHALA LETTER MUURDHAJA LAYANNA" #x0DC5)
+    ("SINHALA LETTER FAYANNA" #x0DC6)
+    ("SINHALA SIGN AL-LAKUNA" #x0DCA)
+    ("SINHALA VOWEL SIGN AELA-PILLA" #x0DCF)
+    ("SINHALA VOWEL SIGN KETTI AEDA-PILLA" #x0DD0)
+    ("SINHALA VOWEL SIGN DIGA AEDA-PILLA" #x0DD1)
+    ("SINHALA VOWEL SIGN KETTI IS-PILLA" #x0DD2)
+    ("SINHALA VOWEL SIGN DIGA IS-PILLA" #x0DD3)
+    ("SINHALA VOWEL SIGN KETTI PAA-PILLA" #x0DD4)
+    ("SINHALA VOWEL SIGN DIGA PAA-PILLA" #x0DD6)
+    ("SINHALA VOWEL SIGN GAETTA-PILLA" #x0DD8)
+    ("SINHALA VOWEL SIGN KOMBUVA" #x0DD9)
+    ("SINHALA VOWEL SIGN DIGA KOMBUVA" #x0DDA)
+    ("SINHALA VOWEL SIGN KOMBU DEKA" #x0DDB)
+    ("SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA" #x0DDC)
+    ("SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA" #x0DDD)
+    ("SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA" #x0DDE)
+    ("SINHALA VOWEL SIGN GAYANUKITTA" #x0DDF)
+    ("SINHALA VOWEL SIGN DIGA GAETTA-PILLA" #x0DF2)
+    ("SINHALA VOWEL SIGN DIGA GAYANUKITTA" #x0DF3)
+    ("SINHALA PUNCTUATION KUNDDALIYA" #x0DF4)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00E00-00E7F.el b/lisp/nxml/char-name/unicode/00E00-00E7F.el
new file mode 100644 (file)
index 0000000..ef5a9bb
--- /dev/null
@@ -0,0 +1,89 @@
+(nxml-define-char-name-set 'thai
+  '(("THAI CHARACTER KO KAI" #x0E01)
+    ("THAI CHARACTER KHO KHAI" #x0E02)
+    ("THAI CHARACTER KHO KHUAT" #x0E03)
+    ("THAI CHARACTER KHO KHWAI" #x0E04)
+    ("THAI CHARACTER KHO KHON" #x0E05)
+    ("THAI CHARACTER KHO RAKHANG" #x0E06)
+    ("THAI CHARACTER NGO NGU" #x0E07)
+    ("THAI CHARACTER CHO CHAN" #x0E08)
+    ("THAI CHARACTER CHO CHING" #x0E09)
+    ("THAI CHARACTER CHO CHANG" #x0E0A)
+    ("THAI CHARACTER SO SO" #x0E0B)
+    ("THAI CHARACTER CHO CHOE" #x0E0C)
+    ("THAI CHARACTER YO YING" #x0E0D)
+    ("THAI CHARACTER DO CHADA" #x0E0E)
+    ("THAI CHARACTER TO PATAK" #x0E0F)
+    ("THAI CHARACTER THO THAN" #x0E10)
+    ("THAI CHARACTER THO NANGMONTHO" #x0E11)
+    ("THAI CHARACTER THO PHUTHAO" #x0E12)
+    ("THAI CHARACTER NO NEN" #x0E13)
+    ("THAI CHARACTER DO DEK" #x0E14)
+    ("THAI CHARACTER TO TAO" #x0E15)
+    ("THAI CHARACTER THO THUNG" #x0E16)
+    ("THAI CHARACTER THO THAHAN" #x0E17)
+    ("THAI CHARACTER THO THONG" #x0E18)
+    ("THAI CHARACTER NO NU" #x0E19)
+    ("THAI CHARACTER BO BAIMAI" #x0E1A)
+    ("THAI CHARACTER PO PLA" #x0E1B)
+    ("THAI CHARACTER PHO PHUNG" #x0E1C)
+    ("THAI CHARACTER FO FA" #x0E1D)
+    ("THAI CHARACTER PHO PHAN" #x0E1E)
+    ("THAI CHARACTER FO FAN" #x0E1F)
+    ("THAI CHARACTER PHO SAMPHAO" #x0E20)
+    ("THAI CHARACTER MO MA" #x0E21)
+    ("THAI CHARACTER YO YAK" #x0E22)
+    ("THAI CHARACTER RO RUA" #x0E23)
+    ("THAI CHARACTER RU" #x0E24)
+    ("THAI CHARACTER LO LING" #x0E25)
+    ("THAI CHARACTER LU" #x0E26)
+    ("THAI CHARACTER WO WAEN" #x0E27)
+    ("THAI CHARACTER SO SALA" #x0E28)
+    ("THAI CHARACTER SO RUSI" #x0E29)
+    ("THAI CHARACTER SO SUA" #x0E2A)
+    ("THAI CHARACTER HO HIP" #x0E2B)
+    ("THAI CHARACTER LO CHULA" #x0E2C)
+    ("THAI CHARACTER O ANG" #x0E2D)
+    ("THAI CHARACTER HO NOKHUK" #x0E2E)
+    ("THAI CHARACTER PAIYANNOI" #x0E2F)
+    ("THAI CHARACTER SARA A" #x0E30)
+    ("THAI CHARACTER MAI HAN-AKAT" #x0E31)
+    ("THAI CHARACTER SARA AA" #x0E32)
+    ("THAI CHARACTER SARA AM" #x0E33)
+    ("THAI CHARACTER SARA I" #x0E34)
+    ("THAI CHARACTER SARA II" #x0E35)
+    ("THAI CHARACTER SARA UE" #x0E36)
+    ("THAI CHARACTER SARA UEE" #x0E37)
+    ("THAI CHARACTER SARA U" #x0E38)
+    ("THAI CHARACTER SARA UU" #x0E39)
+    ("THAI CHARACTER PHINTHU" #x0E3A)
+    ("THAI CURRENCY SYMBOL BAHT" #x0E3F)
+    ("THAI CHARACTER SARA E" #x0E40)
+    ("THAI CHARACTER SARA AE" #x0E41)
+    ("THAI CHARACTER SARA O" #x0E42)
+    ("THAI CHARACTER SARA AI MAIMUAN" #x0E43)
+    ("THAI CHARACTER SARA AI MAIMALAI" #x0E44)
+    ("THAI CHARACTER LAKKHANGYAO" #x0E45)
+    ("THAI CHARACTER MAIYAMOK" #x0E46)
+    ("THAI CHARACTER MAITAIKHU" #x0E47)
+    ("THAI CHARACTER MAI EK" #x0E48)
+    ("THAI CHARACTER MAI THO" #x0E49)
+    ("THAI CHARACTER MAI TRI" #x0E4A)
+    ("THAI CHARACTER MAI CHATTAWA" #x0E4B)
+    ("THAI CHARACTER THANTHAKHAT" #x0E4C)
+    ("THAI CHARACTER NIKHAHIT" #x0E4D)
+    ("THAI CHARACTER YAMAKKAN" #x0E4E)
+    ("THAI CHARACTER FONGMAN" #x0E4F)
+    ("THAI DIGIT ZERO" #x0E50)
+    ("THAI DIGIT ONE" #x0E51)
+    ("THAI DIGIT TWO" #x0E52)
+    ("THAI DIGIT THREE" #x0E53)
+    ("THAI DIGIT FOUR" #x0E54)
+    ("THAI DIGIT FIVE" #x0E55)
+    ("THAI DIGIT SIX" #x0E56)
+    ("THAI DIGIT SEVEN" #x0E57)
+    ("THAI DIGIT EIGHT" #x0E58)
+    ("THAI DIGIT NINE" #x0E59)
+    ("THAI CHARACTER ANGKHANKHU" #x0E5A)
+    ("THAI CHARACTER KHOMUT" #x0E5B)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00E80-00EFF.el b/lisp/nxml/char-name/unicode/00E80-00EFF.el
new file mode 100644 (file)
index 0000000..f9842bc
--- /dev/null
@@ -0,0 +1,67 @@
+(nxml-define-char-name-set 'lao
+  '(("LAO LETTER KO" #x0E81)
+    ("LAO LETTER KHO SUNG" #x0E82)
+    ("LAO LETTER KHO TAM" #x0E84)
+    ("LAO LETTER NGO" #x0E87)
+    ("LAO LETTER CO" #x0E88)
+    ("LAO LETTER SO TAM" #x0E8A)
+    ("LAO LETTER NYO" #x0E8D)
+    ("LAO LETTER DO" #x0E94)
+    ("LAO LETTER TO" #x0E95)
+    ("LAO LETTER THO SUNG" #x0E96)
+    ("LAO LETTER THO TAM" #x0E97)
+    ("LAO LETTER NO" #x0E99)
+    ("LAO LETTER BO" #x0E9A)
+    ("LAO LETTER PO" #x0E9B)
+    ("LAO LETTER PHO SUNG" #x0E9C)
+    ("LAO LETTER FO TAM" #x0E9D)
+    ("LAO LETTER PHO TAM" #x0E9E)
+    ("LAO LETTER FO SUNG" #x0E9F)
+    ("LAO LETTER MO" #x0EA1)
+    ("LAO LETTER YO" #x0EA2)
+    ("LAO LETTER LO LING" #x0EA3)
+    ("LAO LETTER LO LOOT" #x0EA5)
+    ("LAO LETTER WO" #x0EA7)
+    ("LAO LETTER SO SUNG" #x0EAA)
+    ("LAO LETTER HO SUNG" #x0EAB)
+    ("LAO LETTER O" #x0EAD)
+    ("LAO LETTER HO TAM" #x0EAE)
+    ("LAO ELLIPSIS" #x0EAF)
+    ("LAO VOWEL SIGN A" #x0EB0)
+    ("LAO VOWEL SIGN MAI KAN" #x0EB1)
+    ("LAO VOWEL SIGN AA" #x0EB2)
+    ("LAO VOWEL SIGN AM" #x0EB3)
+    ("LAO VOWEL SIGN I" #x0EB4)
+    ("LAO VOWEL SIGN II" #x0EB5)
+    ("LAO VOWEL SIGN Y" #x0EB6)
+    ("LAO VOWEL SIGN YY" #x0EB7)
+    ("LAO VOWEL SIGN U" #x0EB8)
+    ("LAO VOWEL SIGN UU" #x0EB9)
+    ("LAO VOWEL SIGN MAI KON" #x0EBB)
+    ("LAO SEMIVOWEL SIGN LO" #x0EBC)
+    ("LAO SEMIVOWEL SIGN NYO" #x0EBD)
+    ("LAO VOWEL SIGN E" #x0EC0)
+    ("LAO VOWEL SIGN EI" #x0EC1)
+    ("LAO VOWEL SIGN O" #x0EC2)
+    ("LAO VOWEL SIGN AY" #x0EC3)
+    ("LAO VOWEL SIGN AI" #x0EC4)
+    ("LAO KO LA" #x0EC6)
+    ("LAO TONE MAI EK" #x0EC8)
+    ("LAO TONE MAI THO" #x0EC9)
+    ("LAO TONE MAI TI" #x0ECA)
+    ("LAO TONE MAI CATAWA" #x0ECB)
+    ("LAO CANCELLATION MARK" #x0ECC)
+    ("LAO NIGGAHITA" #x0ECD)
+    ("LAO DIGIT ZERO" #x0ED0)
+    ("LAO DIGIT ONE" #x0ED1)
+    ("LAO DIGIT TWO" #x0ED2)
+    ("LAO DIGIT THREE" #x0ED3)
+    ("LAO DIGIT FOUR" #x0ED4)
+    ("LAO DIGIT FIVE" #x0ED5)
+    ("LAO DIGIT SIX" #x0ED6)
+    ("LAO DIGIT SEVEN" #x0ED7)
+    ("LAO DIGIT EIGHT" #x0ED8)
+    ("LAO DIGIT NINE" #x0ED9)
+    ("LAO HO NO" #x0EDC)
+    ("LAO HO MO" #x0EDD)
+    ))
diff --git a/lisp/nxml/char-name/unicode/00F00-00FFF.el b/lisp/nxml/char-name/unicode/00F00-00FFF.el
new file mode 100644 (file)
index 0000000..7440269
--- /dev/null
@@ -0,0 +1,195 @@
+(nxml-define-char-name-set 'tibetan
+  '(("TIBETAN SYLLABLE OM" #x0F00)
+    ("TIBETAN MARK GTER YIG MGO TRUNCATED A" #x0F01)
+    ("TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA" #x0F02)
+    ("TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA" #x0F03)
+    ("TIBETAN MARK INITIAL YIG MGO MDUN MA" #x0F04)
+    ("TIBETAN MARK CLOSING YIG MGO SGAB MA" #x0F05)
+    ("TIBETAN MARK CARET YIG MGO PHUR SHAD MA" #x0F06)
+    ("TIBETAN MARK YIG MGO TSHEG SHAD MA" #x0F07)
+    ("TIBETAN MARK SBRUL SHAD" #x0F08)
+    ("TIBETAN MARK BSKUR YIG MGO" #x0F09)
+    ("TIBETAN MARK BKA- SHOG YIG MGO" #x0F0A)
+    ("TIBETAN MARK INTERSYLLABIC TSHEG" #x0F0B)
+    ("TIBETAN MARK DELIMITER TSHEG BSTAR" #x0F0C)
+    ("TIBETAN MARK SHAD" #x0F0D)
+    ("TIBETAN MARK NYIS SHAD" #x0F0E)
+    ("TIBETAN MARK TSHEG SHAD" #x0F0F)
+    ("TIBETAN MARK NYIS TSHEG SHAD" #x0F10)
+    ("TIBETAN MARK RIN CHEN SPUNGS SHAD" #x0F11)
+    ("TIBETAN MARK RGYA GRAM SHAD" #x0F12)
+    ("TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN" #x0F13)
+    ("TIBETAN MARK GTER TSHEG" #x0F14)
+    ("TIBETAN LOGOTYPE SIGN CHAD RTAGS" #x0F15)
+    ("TIBETAN LOGOTYPE SIGN LHAG RTAGS" #x0F16)
+    ("TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS" #x0F17)
+    ("TIBETAN ASTROLOGICAL SIGN -KHYUD PA" #x0F18)
+    ("TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS" #x0F19)
+    ("TIBETAN SIGN RDEL DKAR GCIG" #x0F1A)
+    ("TIBETAN SIGN RDEL DKAR GNYIS" #x0F1B)
+    ("TIBETAN SIGN RDEL DKAR GSUM" #x0F1C)
+    ("TIBETAN SIGN RDEL NAG GCIG" #x0F1D)
+    ("TIBETAN SIGN RDEL NAG GNYIS" #x0F1E)
+    ("TIBETAN SIGN RDEL DKAR RDEL NAG" #x0F1F)
+    ("TIBETAN DIGIT ZERO" #x0F20)
+    ("TIBETAN DIGIT ONE" #x0F21)
+    ("TIBETAN DIGIT TWO" #x0F22)
+    ("TIBETAN DIGIT THREE" #x0F23)
+    ("TIBETAN DIGIT FOUR" #x0F24)
+    ("TIBETAN DIGIT FIVE" #x0F25)
+    ("TIBETAN DIGIT SIX" #x0F26)
+    ("TIBETAN DIGIT SEVEN" #x0F27)
+    ("TIBETAN DIGIT EIGHT" #x0F28)
+    ("TIBETAN DIGIT NINE" #x0F29)
+    ("TIBETAN DIGIT HALF ONE" #x0F2A)
+    ("TIBETAN DIGIT HALF TWO" #x0F2B)
+    ("TIBETAN DIGIT HALF THREE" #x0F2C)
+    ("TIBETAN DIGIT HALF FOUR" #x0F2D)
+    ("TIBETAN DIGIT HALF FIVE" #x0F2E)
+    ("TIBETAN DIGIT HALF SIX" #x0F2F)
+    ("TIBETAN DIGIT HALF SEVEN" #x0F30)
+    ("TIBETAN DIGIT HALF EIGHT" #x0F31)
+    ("TIBETAN DIGIT HALF NINE" #x0F32)
+    ("TIBETAN DIGIT HALF ZERO" #x0F33)
+    ("TIBETAN MARK BSDUS RTAGS" #x0F34)
+    ("TIBETAN MARK NGAS BZUNG NYI ZLA" #x0F35)
+    ("TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN" #x0F36)
+    ("TIBETAN MARK NGAS BZUNG SGOR RTAGS" #x0F37)
+    ("TIBETAN MARK CHE MGO" #x0F38)
+    ("TIBETAN MARK TSA -PHRU" #x0F39)
+    ("TIBETAN MARK GUG RTAGS GYON" #x0F3A)
+    ("TIBETAN MARK GUG RTAGS GYAS" #x0F3B)
+    ("TIBETAN MARK ANG KHANG GYON" #x0F3C)
+    ("TIBETAN MARK ANG KHANG GYAS" #x0F3D)
+    ("TIBETAN SIGN YAR TSHES" #x0F3E)
+    ("TIBETAN SIGN MAR TSHES" #x0F3F)
+    ("TIBETAN LETTER KA" #x0F40)
+    ("TIBETAN LETTER KHA" #x0F41)
+    ("TIBETAN LETTER GA" #x0F42)
+    ("TIBETAN LETTER GHA" #x0F43)
+    ("TIBETAN LETTER NGA" #x0F44)
+    ("TIBETAN LETTER CA" #x0F45)
+    ("TIBETAN LETTER CHA" #x0F46)
+    ("TIBETAN LETTER JA" #x0F47)
+    ("TIBETAN LETTER NYA" #x0F49)
+    ("TIBETAN LETTER TTA" #x0F4A)
+    ("TIBETAN LETTER TTHA" #x0F4B)
+    ("TIBETAN LETTER DDA" #x0F4C)
+    ("TIBETAN LETTER DDHA" #x0F4D)
+    ("TIBETAN LETTER NNA" #x0F4E)
+    ("TIBETAN LETTER TA" #x0F4F)
+    ("TIBETAN LETTER THA" #x0F50)
+    ("TIBETAN LETTER DA" #x0F51)
+    ("TIBETAN LETTER DHA" #x0F52)
+    ("TIBETAN LETTER NA" #x0F53)
+    ("TIBETAN LETTER PA" #x0F54)
+    ("TIBETAN LETTER PHA" #x0F55)
+    ("TIBETAN LETTER BA" #x0F56)
+    ("TIBETAN LETTER BHA" #x0F57)
+    ("TIBETAN LETTER MA" #x0F58)
+    ("TIBETAN LETTER TSA" #x0F59)
+    ("TIBETAN LETTER TSHA" #x0F5A)
+    ("TIBETAN LETTER DZA" #x0F5B)
+    ("TIBETAN LETTER DZHA" #x0F5C)
+    ("TIBETAN LETTER WA" #x0F5D)
+    ("TIBETAN LETTER ZHA" #x0F5E)
+    ("TIBETAN LETTER ZA" #x0F5F)
+    ("TIBETAN LETTER -A" #x0F60)
+    ("TIBETAN LETTER YA" #x0F61)
+    ("TIBETAN LETTER RA" #x0F62)
+    ("TIBETAN LETTER LA" #x0F63)
+    ("TIBETAN LETTER SHA" #x0F64)
+    ("TIBETAN LETTER SSA" #x0F65)
+    ("TIBETAN LETTER SA" #x0F66)
+    ("TIBETAN LETTER HA" #x0F67)
+    ("TIBETAN LETTER A" #x0F68)
+    ("TIBETAN LETTER KSSA" #x0F69)
+    ("TIBETAN LETTER FIXED-FORM RA" #x0F6A)
+    ("TIBETAN VOWEL SIGN AA" #x0F71)
+    ("TIBETAN VOWEL SIGN I" #x0F72)
+    ("TIBETAN VOWEL SIGN II" #x0F73)
+    ("TIBETAN VOWEL SIGN U" #x0F74)
+    ("TIBETAN VOWEL SIGN UU" #x0F75)
+    ("TIBETAN VOWEL SIGN VOCALIC R" #x0F76)
+    ("TIBETAN VOWEL SIGN VOCALIC RR" #x0F77)
+    ("TIBETAN VOWEL SIGN VOCALIC L" #x0F78)
+    ("TIBETAN VOWEL SIGN VOCALIC LL" #x0F79)
+    ("TIBETAN VOWEL SIGN E" #x0F7A)
+    ("TIBETAN VOWEL SIGN EE" #x0F7B)
+    ("TIBETAN VOWEL SIGN O" #x0F7C)
+    ("TIBETAN VOWEL SIGN OO" #x0F7D)
+    ("TIBETAN SIGN RJES SU NGA RO" #x0F7E)
+    ("TIBETAN SIGN RNAM BCAD" #x0F7F)
+    ("TIBETAN VOWEL SIGN REVERSED I" #x0F80)
+    ("TIBETAN VOWEL SIGN REVERSED II" #x0F81)
+    ("TIBETAN SIGN NYI ZLA NAA DA" #x0F82)
+    ("TIBETAN SIGN SNA LDAN" #x0F83)
+    ("TIBETAN MARK HALANTA" #x0F84)
+    ("TIBETAN MARK PALUTA" #x0F85)
+    ("TIBETAN SIGN LCI RTAGS" #x0F86)
+    ("TIBETAN SIGN YANG RTAGS" #x0F87)
+    ("TIBETAN SIGN LCE TSA CAN" #x0F88)
+    ("TIBETAN SIGN MCHU CAN" #x0F89)
+    ("TIBETAN SIGN GRU CAN RGYINGS" #x0F8A)
+    ("TIBETAN SIGN GRU MED RGYINGS" #x0F8B)
+    ("TIBETAN SUBJOINED LETTER KA" #x0F90)
+    ("TIBETAN SUBJOINED LETTER KHA" #x0F91)
+    ("TIBETAN SUBJOINED LETTER GA" #x0F92)
+    ("TIBETAN SUBJOINED LETTER GHA" #x0F93)
+    ("TIBETAN SUBJOINED LETTER NGA" #x0F94)
+    ("TIBETAN SUBJOINED LETTER CA" #x0F95)
+    ("TIBETAN SUBJOINED LETTER CHA" #x0F96)
+    ("TIBETAN SUBJOINED LETTER JA" #x0F97)
+    ("TIBETAN SUBJOINED LETTER NYA" #x0F99)
+    ("TIBETAN SUBJOINED LETTER TTA" #x0F9A)
+    ("TIBETAN SUBJOINED LETTER TTHA" #x0F9B)
+    ("TIBETAN SUBJOINED LETTER DDA" #x0F9C)
+    ("TIBETAN SUBJOINED LETTER DDHA" #x0F9D)
+    ("TIBETAN SUBJOINED LETTER NNA" #x0F9E)
+    ("TIBETAN SUBJOINED LETTER TA" #x0F9F)
+    ("TIBETAN SUBJOINED LETTER THA" #x0FA0)
+    ("TIBETAN SUBJOINED LETTER DA" #x0FA1)
+    ("TIBETAN SUBJOINED LETTER DHA" #x0FA2)
+    ("TIBETAN SUBJOINED LETTER NA" #x0FA3)
+    ("TIBETAN SUBJOINED LETTER PA" #x0FA4)
+    ("TIBETAN SUBJOINED LETTER PHA" #x0FA5)
+    ("TIBETAN SUBJOINED LETTER BA" #x0FA6)
+    ("TIBETAN SUBJOINED LETTER BHA" #x0FA7)
+    ("TIBETAN SUBJOINED LETTER MA" #x0FA8)
+    ("TIBETAN SUBJOINED LETTER TSA" #x0FA9)
+    ("TIBETAN SUBJOINED LETTER TSHA" #x0FAA)
+    ("TIBETAN SUBJOINED LETTER DZA" #x0FAB)
+    ("TIBETAN SUBJOINED LETTER DZHA" #x0FAC)
+    ("TIBETAN SUBJOINED LETTER WA" #x0FAD)
+    ("TIBETAN SUBJOINED LETTER ZHA" #x0FAE)
+    ("TIBETAN SUBJOINED LETTER ZA" #x0FAF)
+    ("TIBETAN SUBJOINED LETTER -A" #x0FB0)
+    ("TIBETAN SUBJOINED LETTER YA" #x0FB1)
+    ("TIBETAN SUBJOINED LETTER RA" #x0FB2)
+    ("TIBETAN SUBJOINED LETTER LA" #x0FB3)
+    ("TIBETAN SUBJOINED LETTER SHA" #x0FB4)
+    ("TIBETAN SUBJOINED LETTER SSA" #x0FB5)
+    ("TIBETAN SUBJOINED LETTER SA" #x0FB6)
+    ("TIBETAN SUBJOINED LETTER HA" #x0FB7)
+    ("TIBETAN SUBJOINED LETTER A" #x0FB8)
+    ("TIBETAN SUBJOINED LETTER KSSA" #x0FB9)
+    ("TIBETAN SUBJOINED LETTER FIXED-FORM WA" #x0FBA)
+    ("TIBETAN SUBJOINED LETTER FIXED-FORM YA" #x0FBB)
+    ("TIBETAN SUBJOINED LETTER FIXED-FORM RA" #x0FBC)
+    ("TIBETAN KU RU KHA" #x0FBE)
+    ("TIBETAN KU RU KHA BZHI MIG CAN" #x0FBF)
+    ("TIBETAN CANTILLATION SIGN HEAVY BEAT" #x0FC0)
+    ("TIBETAN CANTILLATION SIGN LIGHT BEAT" #x0FC1)
+    ("TIBETAN CANTILLATION SIGN CANG TE-U" #x0FC2)
+    ("TIBETAN CANTILLATION SIGN SBUB -CHAL" #x0FC3)
+    ("TIBETAN SYMBOL DRIL BU" #x0FC4)
+    ("TIBETAN SYMBOL RDO RJE" #x0FC5)
+    ("TIBETAN SYMBOL PADMA GDAN" #x0FC6)
+    ("TIBETAN SYMBOL RDO RJE RGYA GRAM" #x0FC7)
+    ("TIBETAN SYMBOL PHUR PA" #x0FC8)
+    ("TIBETAN SYMBOL NOR BU" #x0FC9)
+    ("TIBETAN SYMBOL NOR BU NYIS -KHYIL" #x0FCA)
+    ("TIBETAN SYMBOL NOR BU GSUM -KHYIL" #x0FCB)
+    ("TIBETAN SYMBOL NOR BU BZHI -KHYIL" #x0FCC)
+    ("TIBETAN SIGN RDEL NAG GSUM" #x0FCF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01000-0109F.el b/lisp/nxml/char-name/unicode/01000-0109F.el
new file mode 100644 (file)
index 0000000..4465de4
--- /dev/null
@@ -0,0 +1,80 @@
+(nxml-define-char-name-set 'myanmar
+  '(("MYANMAR LETTER KA" #x1000)
+    ("MYANMAR LETTER KHA" #x1001)
+    ("MYANMAR LETTER GA" #x1002)
+    ("MYANMAR LETTER GHA" #x1003)
+    ("MYANMAR LETTER NGA" #x1004)
+    ("MYANMAR LETTER CA" #x1005)
+    ("MYANMAR LETTER CHA" #x1006)
+    ("MYANMAR LETTER JA" #x1007)
+    ("MYANMAR LETTER JHA" #x1008)
+    ("MYANMAR LETTER NYA" #x1009)
+    ("MYANMAR LETTER NNYA" #x100A)
+    ("MYANMAR LETTER TTA" #x100B)
+    ("MYANMAR LETTER TTHA" #x100C)
+    ("MYANMAR LETTER DDA" #x100D)
+    ("MYANMAR LETTER DDHA" #x100E)
+    ("MYANMAR LETTER NNA" #x100F)
+    ("MYANMAR LETTER TA" #x1010)
+    ("MYANMAR LETTER THA" #x1011)
+    ("MYANMAR LETTER DA" #x1012)
+    ("MYANMAR LETTER DHA" #x1013)
+    ("MYANMAR LETTER NA" #x1014)
+    ("MYANMAR LETTER PA" #x1015)
+    ("MYANMAR LETTER PHA" #x1016)
+    ("MYANMAR LETTER BA" #x1017)
+    ("MYANMAR LETTER BHA" #x1018)
+    ("MYANMAR LETTER MA" #x1019)
+    ("MYANMAR LETTER YA" #x101A)
+    ("MYANMAR LETTER RA" #x101B)
+    ("MYANMAR LETTER LA" #x101C)
+    ("MYANMAR LETTER WA" #x101D)
+    ("MYANMAR LETTER SA" #x101E)
+    ("MYANMAR LETTER HA" #x101F)
+    ("MYANMAR LETTER LLA" #x1020)
+    ("MYANMAR LETTER A" #x1021)
+    ("MYANMAR LETTER I" #x1023)
+    ("MYANMAR LETTER II" #x1024)
+    ("MYANMAR LETTER U" #x1025)
+    ("MYANMAR LETTER UU" #x1026)
+    ("MYANMAR LETTER E" #x1027)
+    ("MYANMAR LETTER O" #x1029)
+    ("MYANMAR LETTER AU" #x102A)
+    ("MYANMAR VOWEL SIGN AA" #x102C)
+    ("MYANMAR VOWEL SIGN I" #x102D)
+    ("MYANMAR VOWEL SIGN II" #x102E)
+    ("MYANMAR VOWEL SIGN U" #x102F)
+    ("MYANMAR VOWEL SIGN UU" #x1030)
+    ("MYANMAR VOWEL SIGN E" #x1031)
+    ("MYANMAR VOWEL SIGN AI" #x1032)
+    ("MYANMAR SIGN ANUSVARA" #x1036)
+    ("MYANMAR SIGN DOT BELOW" #x1037)
+    ("MYANMAR SIGN VISARGA" #x1038)
+    ("MYANMAR SIGN VIRAMA" #x1039)
+    ("MYANMAR DIGIT ZERO" #x1040)
+    ("MYANMAR DIGIT ONE" #x1041)
+    ("MYANMAR DIGIT TWO" #x1042)
+    ("MYANMAR DIGIT THREE" #x1043)
+    ("MYANMAR DIGIT FOUR" #x1044)
+    ("MYANMAR DIGIT FIVE" #x1045)
+    ("MYANMAR DIGIT SIX" #x1046)
+    ("MYANMAR DIGIT SEVEN" #x1047)
+    ("MYANMAR DIGIT EIGHT" #x1048)
+    ("MYANMAR DIGIT NINE" #x1049)
+    ("MYANMAR SIGN LITTLE SECTION" #x104A)
+    ("MYANMAR SIGN SECTION" #x104B)
+    ("MYANMAR SYMBOL LOCATIVE" #x104C)
+    ("MYANMAR SYMBOL COMPLETED" #x104D)
+    ("MYANMAR SYMBOL AFOREMENTIONED" #x104E)
+    ("MYANMAR SYMBOL GENITIVE" #x104F)
+    ("MYANMAR LETTER SHA" #x1050)
+    ("MYANMAR LETTER SSA" #x1051)
+    ("MYANMAR LETTER VOCALIC R" #x1052)
+    ("MYANMAR LETTER VOCALIC RR" #x1053)
+    ("MYANMAR LETTER VOCALIC L" #x1054)
+    ("MYANMAR LETTER VOCALIC LL" #x1055)
+    ("MYANMAR VOWEL SIGN VOCALIC R" #x1056)
+    ("MYANMAR VOWEL SIGN VOCALIC RR" #x1057)
+    ("MYANMAR VOWEL SIGN VOCALIC L" #x1058)
+    ("MYANMAR VOWEL SIGN VOCALIC LL" #x1059)
+    ))
diff --git a/lisp/nxml/char-name/unicode/010A0-010FF.el b/lisp/nxml/char-name/unicode/010A0-010FF.el
new file mode 100644 (file)
index 0000000..26abf69
--- /dev/null
@@ -0,0 +1,82 @@
+(nxml-define-char-name-set 'georgian
+  '(("GEORGIAN CAPITAL LETTER AN" #x10A0)
+    ("GEORGIAN CAPITAL LETTER BAN" #x10A1)
+    ("GEORGIAN CAPITAL LETTER GAN" #x10A2)
+    ("GEORGIAN CAPITAL LETTER DON" #x10A3)
+    ("GEORGIAN CAPITAL LETTER EN" #x10A4)
+    ("GEORGIAN CAPITAL LETTER VIN" #x10A5)
+    ("GEORGIAN CAPITAL LETTER ZEN" #x10A6)
+    ("GEORGIAN CAPITAL LETTER TAN" #x10A7)
+    ("GEORGIAN CAPITAL LETTER IN" #x10A8)
+    ("GEORGIAN CAPITAL LETTER KAN" #x10A9)
+    ("GEORGIAN CAPITAL LETTER LAS" #x10AA)
+    ("GEORGIAN CAPITAL LETTER MAN" #x10AB)
+    ("GEORGIAN CAPITAL LETTER NAR" #x10AC)
+    ("GEORGIAN CAPITAL LETTER ON" #x10AD)
+    ("GEORGIAN CAPITAL LETTER PAR" #x10AE)
+    ("GEORGIAN CAPITAL LETTER ZHAR" #x10AF)
+    ("GEORGIAN CAPITAL LETTER RAE" #x10B0)
+    ("GEORGIAN CAPITAL LETTER SAN" #x10B1)
+    ("GEORGIAN CAPITAL LETTER TAR" #x10B2)
+    ("GEORGIAN CAPITAL LETTER UN" #x10B3)
+    ("GEORGIAN CAPITAL LETTER PHAR" #x10B4)
+    ("GEORGIAN CAPITAL LETTER KHAR" #x10B5)
+    ("GEORGIAN CAPITAL LETTER GHAN" #x10B6)
+    ("GEORGIAN CAPITAL LETTER QAR" #x10B7)
+    ("GEORGIAN CAPITAL LETTER SHIN" #x10B8)
+    ("GEORGIAN CAPITAL LETTER CHIN" #x10B9)
+    ("GEORGIAN CAPITAL LETTER CAN" #x10BA)
+    ("GEORGIAN CAPITAL LETTER JIL" #x10BB)
+    ("GEORGIAN CAPITAL LETTER CIL" #x10BC)
+    ("GEORGIAN CAPITAL LETTER CHAR" #x10BD)
+    ("GEORGIAN CAPITAL LETTER XAN" #x10BE)
+    ("GEORGIAN CAPITAL LETTER JHAN" #x10BF)
+    ("GEORGIAN CAPITAL LETTER HAE" #x10C0)
+    ("GEORGIAN CAPITAL LETTER HE" #x10C1)
+    ("GEORGIAN CAPITAL LETTER HIE" #x10C2)
+    ("GEORGIAN CAPITAL LETTER WE" #x10C3)
+    ("GEORGIAN CAPITAL LETTER HAR" #x10C4)
+    ("GEORGIAN CAPITAL LETTER HOE" #x10C5)
+    ("GEORGIAN LETTER AN" #x10D0)
+    ("GEORGIAN LETTER BAN" #x10D1)
+    ("GEORGIAN LETTER GAN" #x10D2)
+    ("GEORGIAN LETTER DON" #x10D3)
+    ("GEORGIAN LETTER EN" #x10D4)
+    ("GEORGIAN LETTER VIN" #x10D5)
+    ("GEORGIAN LETTER ZEN" #x10D6)
+    ("GEORGIAN LETTER TAN" #x10D7)
+    ("GEORGIAN LETTER IN" #x10D8)
+    ("GEORGIAN LETTER KAN" #x10D9)
+    ("GEORGIAN LETTER LAS" #x10DA)
+    ("GEORGIAN LETTER MAN" #x10DB)
+    ("GEORGIAN LETTER NAR" #x10DC)
+    ("GEORGIAN LETTER ON" #x10DD)
+    ("GEORGIAN LETTER PAR" #x10DE)
+    ("GEORGIAN LETTER ZHAR" #x10DF)
+    ("GEORGIAN LETTER RAE" #x10E0)
+    ("GEORGIAN LETTER SAN" #x10E1)
+    ("GEORGIAN LETTER TAR" #x10E2)
+    ("GEORGIAN LETTER UN" #x10E3)
+    ("GEORGIAN LETTER PHAR" #x10E4)
+    ("GEORGIAN LETTER KHAR" #x10E5)
+    ("GEORGIAN LETTER GHAN" #x10E6)
+    ("GEORGIAN LETTER QAR" #x10E7)
+    ("GEORGIAN LETTER SHIN" #x10E8)
+    ("GEORGIAN LETTER CHIN" #x10E9)
+    ("GEORGIAN LETTER CAN" #x10EA)
+    ("GEORGIAN LETTER JIL" #x10EB)
+    ("GEORGIAN LETTER CIL" #x10EC)
+    ("GEORGIAN LETTER CHAR" #x10ED)
+    ("GEORGIAN LETTER XAN" #x10EE)
+    ("GEORGIAN LETTER JHAN" #x10EF)
+    ("GEORGIAN LETTER HAE" #x10F0)
+    ("GEORGIAN LETTER HE" #x10F1)
+    ("GEORGIAN LETTER HIE" #x10F2)
+    ("GEORGIAN LETTER WE" #x10F3)
+    ("GEORGIAN LETTER HAR" #x10F4)
+    ("GEORGIAN LETTER HOE" #x10F5)
+    ("GEORGIAN LETTER FI" #x10F6)
+    ("GEORGIAN LETTER YN" #x10F7)
+    ("GEORGIAN LETTER ELIFI" #x10F8)
+    ("GEORGIAN PARAGRAPH SEPARATOR" #x10FB)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01100-011FF.el b/lisp/nxml/char-name/unicode/01100-011FF.el
new file mode 100644 (file)
index 0000000..b89d015
--- /dev/null
@@ -0,0 +1,242 @@
+(nxml-define-char-name-set 'hangul-jamo
+  '(("HANGUL CHOSEONG KIYEOK" #x1100)
+    ("HANGUL CHOSEONG SSANGKIYEOK" #x1101)
+    ("HANGUL CHOSEONG NIEUN" #x1102)
+    ("HANGUL CHOSEONG TIKEUT" #x1103)
+    ("HANGUL CHOSEONG SSANGTIKEUT" #x1104)
+    ("HANGUL CHOSEONG RIEUL" #x1105)
+    ("HANGUL CHOSEONG MIEUM" #x1106)
+    ("HANGUL CHOSEONG PIEUP" #x1107)
+    ("HANGUL CHOSEONG SSANGPIEUP" #x1108)
+    ("HANGUL CHOSEONG SIOS" #x1109)
+    ("HANGUL CHOSEONG SSANGSIOS" #x110A)
+    ("HANGUL CHOSEONG IEUNG" #x110B)
+    ("HANGUL CHOSEONG CIEUC" #x110C)
+    ("HANGUL CHOSEONG SSANGCIEUC" #x110D)
+    ("HANGUL CHOSEONG CHIEUCH" #x110E)
+    ("HANGUL CHOSEONG KHIEUKH" #x110F)
+    ("HANGUL CHOSEONG THIEUTH" #x1110)
+    ("HANGUL CHOSEONG PHIEUPH" #x1111)
+    ("HANGUL CHOSEONG HIEUH" #x1112)
+    ("HANGUL CHOSEONG NIEUN-KIYEOK" #x1113)
+    ("HANGUL CHOSEONG SSANGNIEUN" #x1114)
+    ("HANGUL CHOSEONG NIEUN-TIKEUT" #x1115)
+    ("HANGUL CHOSEONG NIEUN-PIEUP" #x1116)
+    ("HANGUL CHOSEONG TIKEUT-KIYEOK" #x1117)
+    ("HANGUL CHOSEONG RIEUL-NIEUN" #x1118)
+    ("HANGUL CHOSEONG SSANGRIEUL" #x1119)
+    ("HANGUL CHOSEONG RIEUL-HIEUH" #x111A)
+    ("HANGUL CHOSEONG KAPYEOUNRIEUL" #x111B)
+    ("HANGUL CHOSEONG MIEUM-PIEUP" #x111C)
+    ("HANGUL CHOSEONG KAPYEOUNMIEUM" #x111D)
+    ("HANGUL CHOSEONG PIEUP-KIYEOK" #x111E)
+    ("HANGUL CHOSEONG PIEUP-NIEUN" #x111F)
+    ("HANGUL CHOSEONG PIEUP-TIKEUT" #x1120)
+    ("HANGUL CHOSEONG PIEUP-SIOS" #x1121)
+    ("HANGUL CHOSEONG PIEUP-SIOS-KIYEOK" #x1122)
+    ("HANGUL CHOSEONG PIEUP-SIOS-TIKEUT" #x1123)
+    ("HANGUL CHOSEONG PIEUP-SIOS-PIEUP" #x1124)
+    ("HANGUL CHOSEONG PIEUP-SSANGSIOS" #x1125)
+    ("HANGUL CHOSEONG PIEUP-SIOS-CIEUC" #x1126)
+    ("HANGUL CHOSEONG PIEUP-CIEUC" #x1127)
+    ("HANGUL CHOSEONG PIEUP-CHIEUCH" #x1128)
+    ("HANGUL CHOSEONG PIEUP-THIEUTH" #x1129)
+    ("HANGUL CHOSEONG PIEUP-PHIEUPH" #x112A)
+    ("HANGUL CHOSEONG KAPYEOUNPIEUP" #x112B)
+    ("HANGUL CHOSEONG KAPYEOUNSSANGPIEUP" #x112C)
+    ("HANGUL CHOSEONG SIOS-KIYEOK" #x112D)
+    ("HANGUL CHOSEONG SIOS-NIEUN" #x112E)
+    ("HANGUL CHOSEONG SIOS-TIKEUT" #x112F)
+    ("HANGUL CHOSEONG SIOS-RIEUL" #x1130)
+    ("HANGUL CHOSEONG SIOS-MIEUM" #x1131)
+    ("HANGUL CHOSEONG SIOS-PIEUP" #x1132)
+    ("HANGUL CHOSEONG SIOS-PIEUP-KIYEOK" #x1133)
+    ("HANGUL CHOSEONG SIOS-SSANGSIOS" #x1134)
+    ("HANGUL CHOSEONG SIOS-IEUNG" #x1135)
+    ("HANGUL CHOSEONG SIOS-CIEUC" #x1136)
+    ("HANGUL CHOSEONG SIOS-CHIEUCH" #x1137)
+    ("HANGUL CHOSEONG SIOS-KHIEUKH" #x1138)
+    ("HANGUL CHOSEONG SIOS-THIEUTH" #x1139)
+    ("HANGUL CHOSEONG SIOS-PHIEUPH" #x113A)
+    ("HANGUL CHOSEONG SIOS-HIEUH" #x113B)
+    ("HANGUL CHOSEONG CHITUEUMSIOS" #x113C)
+    ("HANGUL CHOSEONG CHITUEUMSSANGSIOS" #x113D)
+    ("HANGUL CHOSEONG CEONGCHIEUMSIOS" #x113E)
+    ("HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS" #x113F)
+    ("HANGUL CHOSEONG PANSIOS" #x1140)
+    ("HANGUL CHOSEONG IEUNG-KIYEOK" #x1141)
+    ("HANGUL CHOSEONG IEUNG-TIKEUT" #x1142)
+    ("HANGUL CHOSEONG IEUNG-MIEUM" #x1143)
+    ("HANGUL CHOSEONG IEUNG-PIEUP" #x1144)
+    ("HANGUL CHOSEONG IEUNG-SIOS" #x1145)
+    ("HANGUL CHOSEONG IEUNG-PANSIOS" #x1146)
+    ("HANGUL CHOSEONG SSANGIEUNG" #x1147)
+    ("HANGUL CHOSEONG IEUNG-CIEUC" #x1148)
+    ("HANGUL CHOSEONG IEUNG-CHIEUCH" #x1149)
+    ("HANGUL CHOSEONG IEUNG-THIEUTH" #x114A)
+    ("HANGUL CHOSEONG IEUNG-PHIEUPH" #x114B)
+    ("HANGUL CHOSEONG YESIEUNG" #x114C)
+    ("HANGUL CHOSEONG CIEUC-IEUNG" #x114D)
+    ("HANGUL CHOSEONG CHITUEUMCIEUC" #x114E)
+    ("HANGUL CHOSEONG CHITUEUMSSANGCIEUC" #x114F)
+    ("HANGUL CHOSEONG CEONGCHIEUMCIEUC" #x1150)
+    ("HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC" #x1151)
+    ("HANGUL CHOSEONG CHIEUCH-KHIEUKH" #x1152)
+    ("HANGUL CHOSEONG CHIEUCH-HIEUH" #x1153)
+    ("HANGUL CHOSEONG CHITUEUMCHIEUCH" #x1154)
+    ("HANGUL CHOSEONG CEONGCHIEUMCHIEUCH" #x1155)
+    ("HANGUL CHOSEONG PHIEUPH-PIEUP" #x1156)
+    ("HANGUL CHOSEONG KAPYEOUNPHIEUPH" #x1157)
+    ("HANGUL CHOSEONG SSANGHIEUH" #x1158)
+    ("HANGUL CHOSEONG YEORINHIEUH" #x1159)
+    ("HANGUL CHOSEONG FILLER" #x115F)
+    ("HANGUL JUNGSEONG FILLER" #x1160)
+    ("HANGUL JUNGSEONG A" #x1161)
+    ("HANGUL JUNGSEONG AE" #x1162)
+    ("HANGUL JUNGSEONG YA" #x1163)
+    ("HANGUL JUNGSEONG YAE" #x1164)
+    ("HANGUL JUNGSEONG EO" #x1165)
+    ("HANGUL JUNGSEONG E" #x1166)
+    ("HANGUL JUNGSEONG YEO" #x1167)
+    ("HANGUL JUNGSEONG YE" #x1168)
+    ("HANGUL JUNGSEONG O" #x1169)
+    ("HANGUL JUNGSEONG WA" #x116A)
+    ("HANGUL JUNGSEONG WAE" #x116B)
+    ("HANGUL JUNGSEONG OE" #x116C)
+    ("HANGUL JUNGSEONG YO" #x116D)
+    ("HANGUL JUNGSEONG U" #x116E)
+    ("HANGUL JUNGSEONG WEO" #x116F)
+    ("HANGUL JUNGSEONG WE" #x1170)
+    ("HANGUL JUNGSEONG WI" #x1171)
+    ("HANGUL JUNGSEONG YU" #x1172)
+    ("HANGUL JUNGSEONG EU" #x1173)
+    ("HANGUL JUNGSEONG YI" #x1174)
+    ("HANGUL JUNGSEONG I" #x1175)
+    ("HANGUL JUNGSEONG A-O" #x1176)
+    ("HANGUL JUNGSEONG A-U" #x1177)
+    ("HANGUL JUNGSEONG YA-O" #x1178)
+    ("HANGUL JUNGSEONG YA-YO" #x1179)
+    ("HANGUL JUNGSEONG EO-O" #x117A)
+    ("HANGUL JUNGSEONG EO-U" #x117B)
+    ("HANGUL JUNGSEONG EO-EU" #x117C)
+    ("HANGUL JUNGSEONG YEO-O" #x117D)
+    ("HANGUL JUNGSEONG YEO-U" #x117E)
+    ("HANGUL JUNGSEONG O-EO" #x117F)
+    ("HANGUL JUNGSEONG O-E" #x1180)
+    ("HANGUL JUNGSEONG O-YE" #x1181)
+    ("HANGUL JUNGSEONG O-O" #x1182)
+    ("HANGUL JUNGSEONG O-U" #x1183)
+    ("HANGUL JUNGSEONG YO-YA" #x1184)
+    ("HANGUL JUNGSEONG YO-YAE" #x1185)
+    ("HANGUL JUNGSEONG YO-YEO" #x1186)
+    ("HANGUL JUNGSEONG YO-O" #x1187)
+    ("HANGUL JUNGSEONG YO-I" #x1188)
+    ("HANGUL JUNGSEONG U-A" #x1189)
+    ("HANGUL JUNGSEONG U-AE" #x118A)
+    ("HANGUL JUNGSEONG U-EO-EU" #x118B)
+    ("HANGUL JUNGSEONG U-YE" #x118C)
+    ("HANGUL JUNGSEONG U-U" #x118D)
+    ("HANGUL JUNGSEONG YU-A" #x118E)
+    ("HANGUL JUNGSEONG YU-EO" #x118F)
+    ("HANGUL JUNGSEONG YU-E" #x1190)
+    ("HANGUL JUNGSEONG YU-YEO" #x1191)
+    ("HANGUL JUNGSEONG YU-YE" #x1192)
+    ("HANGUL JUNGSEONG YU-U" #x1193)
+    ("HANGUL JUNGSEONG YU-I" #x1194)
+    ("HANGUL JUNGSEONG EU-U" #x1195)
+    ("HANGUL JUNGSEONG EU-EU" #x1196)
+    ("HANGUL JUNGSEONG YI-U" #x1197)
+    ("HANGUL JUNGSEONG I-A" #x1198)
+    ("HANGUL JUNGSEONG I-YA" #x1199)
+    ("HANGUL JUNGSEONG I-O" #x119A)
+    ("HANGUL JUNGSEONG I-U" #x119B)
+    ("HANGUL JUNGSEONG I-EU" #x119C)
+    ("HANGUL JUNGSEONG I-ARAEA" #x119D)
+    ("HANGUL JUNGSEONG ARAEA" #x119E)
+    ("HANGUL JUNGSEONG ARAEA-EO" #x119F)
+    ("HANGUL JUNGSEONG ARAEA-U" #x11A0)
+    ("HANGUL JUNGSEONG ARAEA-I" #x11A1)
+    ("HANGUL JUNGSEONG SSANGARAEA" #x11A2)
+    ("HANGUL JONGSEONG KIYEOK" #x11A8)
+    ("HANGUL JONGSEONG SSANGKIYEOK" #x11A9)
+    ("HANGUL JONGSEONG KIYEOK-SIOS" #x11AA)
+    ("HANGUL JONGSEONG NIEUN" #x11AB)
+    ("HANGUL JONGSEONG NIEUN-CIEUC" #x11AC)
+    ("HANGUL JONGSEONG NIEUN-HIEUH" #x11AD)
+    ("HANGUL JONGSEONG TIKEUT" #x11AE)
+    ("HANGUL JONGSEONG RIEUL" #x11AF)
+    ("HANGUL JONGSEONG RIEUL-KIYEOK" #x11B0)
+    ("HANGUL JONGSEONG RIEUL-MIEUM" #x11B1)
+    ("HANGUL JONGSEONG RIEUL-PIEUP" #x11B2)
+    ("HANGUL JONGSEONG RIEUL-SIOS" #x11B3)
+    ("HANGUL JONGSEONG RIEUL-THIEUTH" #x11B4)
+    ("HANGUL JONGSEONG RIEUL-PHIEUPH" #x11B5)
+    ("HANGUL JONGSEONG RIEUL-HIEUH" #x11B6)
+    ("HANGUL JONGSEONG MIEUM" #x11B7)
+    ("HANGUL JONGSEONG PIEUP" #x11B8)
+    ("HANGUL JONGSEONG PIEUP-SIOS" #x11B9)
+    ("HANGUL JONGSEONG SIOS" #x11BA)
+    ("HANGUL JONGSEONG SSANGSIOS" #x11BB)
+    ("HANGUL JONGSEONG IEUNG" #x11BC)
+    ("HANGUL JONGSEONG CIEUC" #x11BD)
+    ("HANGUL JONGSEONG CHIEUCH" #x11BE)
+    ("HANGUL JONGSEONG KHIEUKH" #x11BF)
+    ("HANGUL JONGSEONG THIEUTH" #x11C0)
+    ("HANGUL JONGSEONG PHIEUPH" #x11C1)
+    ("HANGUL JONGSEONG HIEUH" #x11C2)
+    ("HANGUL JONGSEONG KIYEOK-RIEUL" #x11C3)
+    ("HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK" #x11C4)
+    ("HANGUL JONGSEONG NIEUN-KIYEOK" #x11C5)
+    ("HANGUL JONGSEONG NIEUN-TIKEUT" #x11C6)
+    ("HANGUL JONGSEONG NIEUN-SIOS" #x11C7)
+    ("HANGUL JONGSEONG NIEUN-PANSIOS" #x11C8)
+    ("HANGUL JONGSEONG NIEUN-THIEUTH" #x11C9)
+    ("HANGUL JONGSEONG TIKEUT-KIYEOK" #x11CA)
+    ("HANGUL JONGSEONG TIKEUT-RIEUL" #x11CB)
+    ("HANGUL JONGSEONG RIEUL-KIYEOK-SIOS" #x11CC)
+    ("HANGUL JONGSEONG RIEUL-NIEUN" #x11CD)
+    ("HANGUL JONGSEONG RIEUL-TIKEUT" #x11CE)
+    ("HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH" #x11CF)
+    ("HANGUL JONGSEONG SSANGRIEUL" #x11D0)
+    ("HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK" #x11D1)
+    ("HANGUL JONGSEONG RIEUL-MIEUM-SIOS" #x11D2)
+    ("HANGUL JONGSEONG RIEUL-PIEUP-SIOS" #x11D3)
+    ("HANGUL JONGSEONG RIEUL-PIEUP-HIEUH" #x11D4)
+    ("HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP" #x11D5)
+    ("HANGUL JONGSEONG RIEUL-SSANGSIOS" #x11D6)
+    ("HANGUL JONGSEONG RIEUL-PANSIOS" #x11D7)
+    ("HANGUL JONGSEONG RIEUL-KHIEUKH" #x11D8)
+    ("HANGUL JONGSEONG RIEUL-YEORINHIEUH" #x11D9)
+    ("HANGUL JONGSEONG MIEUM-KIYEOK" #x11DA)
+    ("HANGUL JONGSEONG MIEUM-RIEUL" #x11DB)
+    ("HANGUL JONGSEONG MIEUM-PIEUP" #x11DC)
+    ("HANGUL JONGSEONG MIEUM-SIOS" #x11DD)
+    ("HANGUL JONGSEONG MIEUM-SSANGSIOS" #x11DE)
+    ("HANGUL JONGSEONG MIEUM-PANSIOS" #x11DF)
+    ("HANGUL JONGSEONG MIEUM-CHIEUCH" #x11E0)
+    ("HANGUL JONGSEONG MIEUM-HIEUH" #x11E1)
+    ("HANGUL JONGSEONG KAPYEOUNMIEUM" #x11E2)
+    ("HANGUL JONGSEONG PIEUP-RIEUL" #x11E3)
+    ("HANGUL JONGSEONG PIEUP-PHIEUPH" #x11E4)
+    ("HANGUL JONGSEONG PIEUP-HIEUH" #x11E5)
+    ("HANGUL JONGSEONG KAPYEOUNPIEUP" #x11E6)
+    ("HANGUL JONGSEONG SIOS-KIYEOK" #x11E7)
+    ("HANGUL JONGSEONG SIOS-TIKEUT" #x11E8)
+    ("HANGUL JONGSEONG SIOS-RIEUL" #x11E9)
+    ("HANGUL JONGSEONG SIOS-PIEUP" #x11EA)
+    ("HANGUL JONGSEONG PANSIOS" #x11EB)
+    ("HANGUL JONGSEONG IEUNG-KIYEOK" #x11EC)
+    ("HANGUL JONGSEONG IEUNG-SSANGKIYEOK" #x11ED)
+    ("HANGUL JONGSEONG SSANGIEUNG" #x11EE)
+    ("HANGUL JONGSEONG IEUNG-KHIEUKH" #x11EF)
+    ("HANGUL JONGSEONG YESIEUNG" #x11F0)
+    ("HANGUL JONGSEONG YESIEUNG-SIOS" #x11F1)
+    ("HANGUL JONGSEONG YESIEUNG-PANSIOS" #x11F2)
+    ("HANGUL JONGSEONG PHIEUPH-PIEUP" #x11F3)
+    ("HANGUL JONGSEONG KAPYEOUNPHIEUPH" #x11F4)
+    ("HANGUL JONGSEONG HIEUH-NIEUN" #x11F5)
+    ("HANGUL JONGSEONG HIEUH-RIEUL" #x11F6)
+    ("HANGUL JONGSEONG HIEUH-MIEUM" #x11F7)
+    ("HANGUL JONGSEONG HIEUH-PIEUP" #x11F8)
+    ("HANGUL JONGSEONG YEORINHIEUH" #x11F9)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01200-0137F.el b/lisp/nxml/char-name/unicode/01200-0137F.el
new file mode 100644 (file)
index 0000000..06f59a3
--- /dev/null
@@ -0,0 +1,347 @@
+(nxml-define-char-name-set 'ethiopic
+  '(("ETHIOPIC SYLLABLE HA" #x1200)
+    ("ETHIOPIC SYLLABLE HU" #x1201)
+    ("ETHIOPIC SYLLABLE HI" #x1202)
+    ("ETHIOPIC SYLLABLE HAA" #x1203)
+    ("ETHIOPIC SYLLABLE HEE" #x1204)
+    ("ETHIOPIC SYLLABLE HE" #x1205)
+    ("ETHIOPIC SYLLABLE HO" #x1206)
+    ("ETHIOPIC SYLLABLE LA" #x1208)
+    ("ETHIOPIC SYLLABLE LU" #x1209)
+    ("ETHIOPIC SYLLABLE LI" #x120A)
+    ("ETHIOPIC SYLLABLE LAA" #x120B)
+    ("ETHIOPIC SYLLABLE LEE" #x120C)
+    ("ETHIOPIC SYLLABLE LE" #x120D)
+    ("ETHIOPIC SYLLABLE LO" #x120E)
+    ("ETHIOPIC SYLLABLE LWA" #x120F)
+    ("ETHIOPIC SYLLABLE HHA" #x1210)
+    ("ETHIOPIC SYLLABLE HHU" #x1211)
+    ("ETHIOPIC SYLLABLE HHI" #x1212)
+    ("ETHIOPIC SYLLABLE HHAA" #x1213)
+    ("ETHIOPIC SYLLABLE HHEE" #x1214)
+    ("ETHIOPIC SYLLABLE HHE" #x1215)
+    ("ETHIOPIC SYLLABLE HHO" #x1216)
+    ("ETHIOPIC SYLLABLE HHWA" #x1217)
+    ("ETHIOPIC SYLLABLE MA" #x1218)
+    ("ETHIOPIC SYLLABLE MU" #x1219)
+    ("ETHIOPIC SYLLABLE MI" #x121A)
+    ("ETHIOPIC SYLLABLE MAA" #x121B)
+    ("ETHIOPIC SYLLABLE MEE" #x121C)
+    ("ETHIOPIC SYLLABLE ME" #x121D)
+    ("ETHIOPIC SYLLABLE MO" #x121E)
+    ("ETHIOPIC SYLLABLE MWA" #x121F)
+    ("ETHIOPIC SYLLABLE SZA" #x1220)
+    ("ETHIOPIC SYLLABLE SZU" #x1221)
+    ("ETHIOPIC SYLLABLE SZI" #x1222)
+    ("ETHIOPIC SYLLABLE SZAA" #x1223)
+    ("ETHIOPIC SYLLABLE SZEE" #x1224)
+    ("ETHIOPIC SYLLABLE SZE" #x1225)
+    ("ETHIOPIC SYLLABLE SZO" #x1226)
+    ("ETHIOPIC SYLLABLE SZWA" #x1227)
+    ("ETHIOPIC SYLLABLE RA" #x1228)
+    ("ETHIOPIC SYLLABLE RU" #x1229)
+    ("ETHIOPIC SYLLABLE RI" #x122A)
+    ("ETHIOPIC SYLLABLE RAA" #x122B)
+    ("ETHIOPIC SYLLABLE REE" #x122C)
+    ("ETHIOPIC SYLLABLE RE" #x122D)
+    ("ETHIOPIC SYLLABLE RO" #x122E)
+    ("ETHIOPIC SYLLABLE RWA" #x122F)
+    ("ETHIOPIC SYLLABLE SA" #x1230)
+    ("ETHIOPIC SYLLABLE SU" #x1231)
+    ("ETHIOPIC SYLLABLE SI" #x1232)
+    ("ETHIOPIC SYLLABLE SAA" #x1233)
+    ("ETHIOPIC SYLLABLE SEE" #x1234)
+    ("ETHIOPIC SYLLABLE SE" #x1235)
+    ("ETHIOPIC SYLLABLE SO" #x1236)
+    ("ETHIOPIC SYLLABLE SWA" #x1237)
+    ("ETHIOPIC SYLLABLE SHA" #x1238)
+    ("ETHIOPIC SYLLABLE SHU" #x1239)
+    ("ETHIOPIC SYLLABLE SHI" #x123A)
+    ("ETHIOPIC SYLLABLE SHAA" #x123B)
+    ("ETHIOPIC SYLLABLE SHEE" #x123C)
+    ("ETHIOPIC SYLLABLE SHE" #x123D)
+    ("ETHIOPIC SYLLABLE SHO" #x123E)
+    ("ETHIOPIC SYLLABLE SHWA" #x123F)
+    ("ETHIOPIC SYLLABLE QA" #x1240)
+    ("ETHIOPIC SYLLABLE QU" #x1241)
+    ("ETHIOPIC SYLLABLE QI" #x1242)
+    ("ETHIOPIC SYLLABLE QAA" #x1243)
+    ("ETHIOPIC SYLLABLE QEE" #x1244)
+    ("ETHIOPIC SYLLABLE QE" #x1245)
+    ("ETHIOPIC SYLLABLE QO" #x1246)
+    ("ETHIOPIC SYLLABLE QWA" #x1248)
+    ("ETHIOPIC SYLLABLE QWI" #x124A)
+    ("ETHIOPIC SYLLABLE QWAA" #x124B)
+    ("ETHIOPIC SYLLABLE QWEE" #x124C)
+    ("ETHIOPIC SYLLABLE QWE" #x124D)
+    ("ETHIOPIC SYLLABLE QHA" #x1250)
+    ("ETHIOPIC SYLLABLE QHU" #x1251)
+    ("ETHIOPIC SYLLABLE QHI" #x1252)
+    ("ETHIOPIC SYLLABLE QHAA" #x1253)
+    ("ETHIOPIC SYLLABLE QHEE" #x1254)
+    ("ETHIOPIC SYLLABLE QHE" #x1255)
+    ("ETHIOPIC SYLLABLE QHO" #x1256)
+    ("ETHIOPIC SYLLABLE QHWA" #x1258)
+    ("ETHIOPIC SYLLABLE QHWI" #x125A)
+    ("ETHIOPIC SYLLABLE QHWAA" #x125B)
+    ("ETHIOPIC SYLLABLE QHWEE" #x125C)
+    ("ETHIOPIC SYLLABLE QHWE" #x125D)
+    ("ETHIOPIC SYLLABLE BA" #x1260)
+    ("ETHIOPIC SYLLABLE BU" #x1261)
+    ("ETHIOPIC SYLLABLE BI" #x1262)
+    ("ETHIOPIC SYLLABLE BAA" #x1263)
+    ("ETHIOPIC SYLLABLE BEE" #x1264)
+    ("ETHIOPIC SYLLABLE BE" #x1265)
+    ("ETHIOPIC SYLLABLE BO" #x1266)
+    ("ETHIOPIC SYLLABLE BWA" #x1267)
+    ("ETHIOPIC SYLLABLE VA" #x1268)
+    ("ETHIOPIC SYLLABLE VU" #x1269)
+    ("ETHIOPIC SYLLABLE VI" #x126A)
+    ("ETHIOPIC SYLLABLE VAA" #x126B)
+    ("ETHIOPIC SYLLABLE VEE" #x126C)
+    ("ETHIOPIC SYLLABLE VE" #x126D)
+    ("ETHIOPIC SYLLABLE VO" #x126E)
+    ("ETHIOPIC SYLLABLE VWA" #x126F)
+    ("ETHIOPIC SYLLABLE TA" #x1270)
+    ("ETHIOPIC SYLLABLE TU" #x1271)
+    ("ETHIOPIC SYLLABLE TI" #x1272)
+    ("ETHIOPIC SYLLABLE TAA" #x1273)
+    ("ETHIOPIC SYLLABLE TEE" #x1274)
+    ("ETHIOPIC SYLLABLE TE" #x1275)
+    ("ETHIOPIC SYLLABLE TO" #x1276)
+    ("ETHIOPIC SYLLABLE TWA" #x1277)
+    ("ETHIOPIC SYLLABLE CA" #x1278)
+    ("ETHIOPIC SYLLABLE CU" #x1279)
+    ("ETHIOPIC SYLLABLE CI" #x127A)
+    ("ETHIOPIC SYLLABLE CAA" #x127B)
+    ("ETHIOPIC SYLLABLE CEE" #x127C)
+    ("ETHIOPIC SYLLABLE CE" #x127D)
+    ("ETHIOPIC SYLLABLE CO" #x127E)
+    ("ETHIOPIC SYLLABLE CWA" #x127F)
+    ("ETHIOPIC SYLLABLE XA" #x1280)
+    ("ETHIOPIC SYLLABLE XU" #x1281)
+    ("ETHIOPIC SYLLABLE XI" #x1282)
+    ("ETHIOPIC SYLLABLE XAA" #x1283)
+    ("ETHIOPIC SYLLABLE XEE" #x1284)
+    ("ETHIOPIC SYLLABLE XE" #x1285)
+    ("ETHIOPIC SYLLABLE XO" #x1286)
+    ("ETHIOPIC SYLLABLE XWA" #x1288)
+    ("ETHIOPIC SYLLABLE XWI" #x128A)
+    ("ETHIOPIC SYLLABLE XWAA" #x128B)
+    ("ETHIOPIC SYLLABLE XWEE" #x128C)
+    ("ETHIOPIC SYLLABLE XWE" #x128D)
+    ("ETHIOPIC SYLLABLE NA" #x1290)
+    ("ETHIOPIC SYLLABLE NU" #x1291)
+    ("ETHIOPIC SYLLABLE NI" #x1292)
+    ("ETHIOPIC SYLLABLE NAA" #x1293)
+    ("ETHIOPIC SYLLABLE NEE" #x1294)
+    ("ETHIOPIC SYLLABLE NE" #x1295)
+    ("ETHIOPIC SYLLABLE NO" #x1296)
+    ("ETHIOPIC SYLLABLE NWA" #x1297)
+    ("ETHIOPIC SYLLABLE NYA" #x1298)
+    ("ETHIOPIC SYLLABLE NYU" #x1299)
+    ("ETHIOPIC SYLLABLE NYI" #x129A)
+    ("ETHIOPIC SYLLABLE NYAA" #x129B)
+    ("ETHIOPIC SYLLABLE NYEE" #x129C)
+    ("ETHIOPIC SYLLABLE NYE" #x129D)
+    ("ETHIOPIC SYLLABLE NYO" #x129E)
+    ("ETHIOPIC SYLLABLE NYWA" #x129F)
+    ("ETHIOPIC SYLLABLE GLOTTAL A" #x12A0)
+    ("ETHIOPIC SYLLABLE GLOTTAL U" #x12A1)
+    ("ETHIOPIC SYLLABLE GLOTTAL I" #x12A2)
+    ("ETHIOPIC SYLLABLE GLOTTAL AA" #x12A3)
+    ("ETHIOPIC SYLLABLE GLOTTAL EE" #x12A4)
+    ("ETHIOPIC SYLLABLE GLOTTAL E" #x12A5)
+    ("ETHIOPIC SYLLABLE GLOTTAL O" #x12A6)
+    ("ETHIOPIC SYLLABLE GLOTTAL WA" #x12A7)
+    ("ETHIOPIC SYLLABLE KA" #x12A8)
+    ("ETHIOPIC SYLLABLE KU" #x12A9)
+    ("ETHIOPIC SYLLABLE KI" #x12AA)
+    ("ETHIOPIC SYLLABLE KAA" #x12AB)
+    ("ETHIOPIC SYLLABLE KEE" #x12AC)
+    ("ETHIOPIC SYLLABLE KE" #x12AD)
+    ("ETHIOPIC SYLLABLE KO" #x12AE)
+    ("ETHIOPIC SYLLABLE KWA" #x12B0)
+    ("ETHIOPIC SYLLABLE KWI" #x12B2)
+    ("ETHIOPIC SYLLABLE KWAA" #x12B3)
+    ("ETHIOPIC SYLLABLE KWEE" #x12B4)
+    ("ETHIOPIC SYLLABLE KWE" #x12B5)
+    ("ETHIOPIC SYLLABLE KXA" #x12B8)
+    ("ETHIOPIC SYLLABLE KXU" #x12B9)
+    ("ETHIOPIC SYLLABLE KXI" #x12BA)
+    ("ETHIOPIC SYLLABLE KXAA" #x12BB)
+    ("ETHIOPIC SYLLABLE KXEE" #x12BC)
+    ("ETHIOPIC SYLLABLE KXE" #x12BD)
+    ("ETHIOPIC SYLLABLE KXO" #x12BE)
+    ("ETHIOPIC SYLLABLE KXWA" #x12C0)
+    ("ETHIOPIC SYLLABLE KXWI" #x12C2)
+    ("ETHIOPIC SYLLABLE KXWAA" #x12C3)
+    ("ETHIOPIC SYLLABLE KXWEE" #x12C4)
+    ("ETHIOPIC SYLLABLE KXWE" #x12C5)
+    ("ETHIOPIC SYLLABLE WA" #x12C8)
+    ("ETHIOPIC SYLLABLE WU" #x12C9)
+    ("ETHIOPIC SYLLABLE WI" #x12CA)
+    ("ETHIOPIC SYLLABLE WAA" #x12CB)
+    ("ETHIOPIC SYLLABLE WEE" #x12CC)
+    ("ETHIOPIC SYLLABLE WE" #x12CD)
+    ("ETHIOPIC SYLLABLE WO" #x12CE)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL A" #x12D0)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL U" #x12D1)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL I" #x12D2)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL AA" #x12D3)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL EE" #x12D4)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL E" #x12D5)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL O" #x12D6)
+    ("ETHIOPIC SYLLABLE ZA" #x12D8)
+    ("ETHIOPIC SYLLABLE ZU" #x12D9)
+    ("ETHIOPIC SYLLABLE ZI" #x12DA)
+    ("ETHIOPIC SYLLABLE ZAA" #x12DB)
+    ("ETHIOPIC SYLLABLE ZEE" #x12DC)
+    ("ETHIOPIC SYLLABLE ZE" #x12DD)
+    ("ETHIOPIC SYLLABLE ZO" #x12DE)
+    ("ETHIOPIC SYLLABLE ZWA" #x12DF)
+    ("ETHIOPIC SYLLABLE ZHA" #x12E0)
+    ("ETHIOPIC SYLLABLE ZHU" #x12E1)
+    ("ETHIOPIC SYLLABLE ZHI" #x12E2)
+    ("ETHIOPIC SYLLABLE ZHAA" #x12E3)
+    ("ETHIOPIC SYLLABLE ZHEE" #x12E4)
+    ("ETHIOPIC SYLLABLE ZHE" #x12E5)
+    ("ETHIOPIC SYLLABLE ZHO" #x12E6)
+    ("ETHIOPIC SYLLABLE ZHWA" #x12E7)
+    ("ETHIOPIC SYLLABLE YA" #x12E8)
+    ("ETHIOPIC SYLLABLE YU" #x12E9)
+    ("ETHIOPIC SYLLABLE YI" #x12EA)
+    ("ETHIOPIC SYLLABLE YAA" #x12EB)
+    ("ETHIOPIC SYLLABLE YEE" #x12EC)
+    ("ETHIOPIC SYLLABLE YE" #x12ED)
+    ("ETHIOPIC SYLLABLE YO" #x12EE)
+    ("ETHIOPIC SYLLABLE DA" #x12F0)
+    ("ETHIOPIC SYLLABLE DU" #x12F1)
+    ("ETHIOPIC SYLLABLE DI" #x12F2)
+    ("ETHIOPIC SYLLABLE DAA" #x12F3)
+    ("ETHIOPIC SYLLABLE DEE" #x12F4)
+    ("ETHIOPIC SYLLABLE DE" #x12F5)
+    ("ETHIOPIC SYLLABLE DO" #x12F6)
+    ("ETHIOPIC SYLLABLE DWA" #x12F7)
+    ("ETHIOPIC SYLLABLE DDA" #x12F8)
+    ("ETHIOPIC SYLLABLE DDU" #x12F9)
+    ("ETHIOPIC SYLLABLE DDI" #x12FA)
+    ("ETHIOPIC SYLLABLE DDAA" #x12FB)
+    ("ETHIOPIC SYLLABLE DDEE" #x12FC)
+    ("ETHIOPIC SYLLABLE DDE" #x12FD)
+    ("ETHIOPIC SYLLABLE DDO" #x12FE)
+    ("ETHIOPIC SYLLABLE DDWA" #x12FF)
+    ("ETHIOPIC SYLLABLE JA" #x1300)
+    ("ETHIOPIC SYLLABLE JU" #x1301)
+    ("ETHIOPIC SYLLABLE JI" #x1302)
+    ("ETHIOPIC SYLLABLE JAA" #x1303)
+    ("ETHIOPIC SYLLABLE JEE" #x1304)
+    ("ETHIOPIC SYLLABLE JE" #x1305)
+    ("ETHIOPIC SYLLABLE JO" #x1306)
+    ("ETHIOPIC SYLLABLE JWA" #x1307)
+    ("ETHIOPIC SYLLABLE GA" #x1308)
+    ("ETHIOPIC SYLLABLE GU" #x1309)
+    ("ETHIOPIC SYLLABLE GI" #x130A)
+    ("ETHIOPIC SYLLABLE GAA" #x130B)
+    ("ETHIOPIC SYLLABLE GEE" #x130C)
+    ("ETHIOPIC SYLLABLE GE" #x130D)
+    ("ETHIOPIC SYLLABLE GO" #x130E)
+    ("ETHIOPIC SYLLABLE GWA" #x1310)
+    ("ETHIOPIC SYLLABLE GWI" #x1312)
+    ("ETHIOPIC SYLLABLE GWAA" #x1313)
+    ("ETHIOPIC SYLLABLE GWEE" #x1314)
+    ("ETHIOPIC SYLLABLE GWE" #x1315)
+    ("ETHIOPIC SYLLABLE GGA" #x1318)
+    ("ETHIOPIC SYLLABLE GGU" #x1319)
+    ("ETHIOPIC SYLLABLE GGI" #x131A)
+    ("ETHIOPIC SYLLABLE GGAA" #x131B)
+    ("ETHIOPIC SYLLABLE GGEE" #x131C)
+    ("ETHIOPIC SYLLABLE GGE" #x131D)
+    ("ETHIOPIC SYLLABLE GGO" #x131E)
+    ("ETHIOPIC SYLLABLE THA" #x1320)
+    ("ETHIOPIC SYLLABLE THU" #x1321)
+    ("ETHIOPIC SYLLABLE THI" #x1322)
+    ("ETHIOPIC SYLLABLE THAA" #x1323)
+    ("ETHIOPIC SYLLABLE THEE" #x1324)
+    ("ETHIOPIC SYLLABLE THE" #x1325)
+    ("ETHIOPIC SYLLABLE THO" #x1326)
+    ("ETHIOPIC SYLLABLE THWA" #x1327)
+    ("ETHIOPIC SYLLABLE CHA" #x1328)
+    ("ETHIOPIC SYLLABLE CHU" #x1329)
+    ("ETHIOPIC SYLLABLE CHI" #x132A)
+    ("ETHIOPIC SYLLABLE CHAA" #x132B)
+    ("ETHIOPIC SYLLABLE CHEE" #x132C)
+    ("ETHIOPIC SYLLABLE CHE" #x132D)
+    ("ETHIOPIC SYLLABLE CHO" #x132E)
+    ("ETHIOPIC SYLLABLE CHWA" #x132F)
+    ("ETHIOPIC SYLLABLE PHA" #x1330)
+    ("ETHIOPIC SYLLABLE PHU" #x1331)
+    ("ETHIOPIC SYLLABLE PHI" #x1332)
+    ("ETHIOPIC SYLLABLE PHAA" #x1333)
+    ("ETHIOPIC SYLLABLE PHEE" #x1334)
+    ("ETHIOPIC SYLLABLE PHE" #x1335)
+    ("ETHIOPIC SYLLABLE PHO" #x1336)
+    ("ETHIOPIC SYLLABLE PHWA" #x1337)
+    ("ETHIOPIC SYLLABLE TSA" #x1338)
+    ("ETHIOPIC SYLLABLE TSU" #x1339)
+    ("ETHIOPIC SYLLABLE TSI" #x133A)
+    ("ETHIOPIC SYLLABLE TSAA" #x133B)
+    ("ETHIOPIC SYLLABLE TSEE" #x133C)
+    ("ETHIOPIC SYLLABLE TSE" #x133D)
+    ("ETHIOPIC SYLLABLE TSO" #x133E)
+    ("ETHIOPIC SYLLABLE TSWA" #x133F)
+    ("ETHIOPIC SYLLABLE TZA" #x1340)
+    ("ETHIOPIC SYLLABLE TZU" #x1341)
+    ("ETHIOPIC SYLLABLE TZI" #x1342)
+    ("ETHIOPIC SYLLABLE TZAA" #x1343)
+    ("ETHIOPIC SYLLABLE TZEE" #x1344)
+    ("ETHIOPIC SYLLABLE TZE" #x1345)
+    ("ETHIOPIC SYLLABLE TZO" #x1346)
+    ("ETHIOPIC SYLLABLE FA" #x1348)
+    ("ETHIOPIC SYLLABLE FU" #x1349)
+    ("ETHIOPIC SYLLABLE FI" #x134A)
+    ("ETHIOPIC SYLLABLE FAA" #x134B)
+    ("ETHIOPIC SYLLABLE FEE" #x134C)
+    ("ETHIOPIC SYLLABLE FE" #x134D)
+    ("ETHIOPIC SYLLABLE FO" #x134E)
+    ("ETHIOPIC SYLLABLE FWA" #x134F)
+    ("ETHIOPIC SYLLABLE PA" #x1350)
+    ("ETHIOPIC SYLLABLE PU" #x1351)
+    ("ETHIOPIC SYLLABLE PI" #x1352)
+    ("ETHIOPIC SYLLABLE PAA" #x1353)
+    ("ETHIOPIC SYLLABLE PEE" #x1354)
+    ("ETHIOPIC SYLLABLE PE" #x1355)
+    ("ETHIOPIC SYLLABLE PO" #x1356)
+    ("ETHIOPIC SYLLABLE PWA" #x1357)
+    ("ETHIOPIC SYLLABLE RYA" #x1358)
+    ("ETHIOPIC SYLLABLE MYA" #x1359)
+    ("ETHIOPIC SYLLABLE FYA" #x135A)
+    ("ETHIOPIC WORDSPACE" #x1361)
+    ("ETHIOPIC FULL STOP" #x1362)
+    ("ETHIOPIC COMMA" #x1363)
+    ("ETHIOPIC SEMICOLON" #x1364)
+    ("ETHIOPIC COLON" #x1365)
+    ("ETHIOPIC PREFACE COLON" #x1366)
+    ("ETHIOPIC QUESTION MARK" #x1367)
+    ("ETHIOPIC PARAGRAPH SEPARATOR" #x1368)
+    ("ETHIOPIC DIGIT ONE" #x1369)
+    ("ETHIOPIC DIGIT TWO" #x136A)
+    ("ETHIOPIC DIGIT THREE" #x136B)
+    ("ETHIOPIC DIGIT FOUR" #x136C)
+    ("ETHIOPIC DIGIT FIVE" #x136D)
+    ("ETHIOPIC DIGIT SIX" #x136E)
+    ("ETHIOPIC DIGIT SEVEN" #x136F)
+    ("ETHIOPIC DIGIT EIGHT" #x1370)
+    ("ETHIOPIC DIGIT NINE" #x1371)
+    ("ETHIOPIC NUMBER TEN" #x1372)
+    ("ETHIOPIC NUMBER TWENTY" #x1373)
+    ("ETHIOPIC NUMBER THIRTY" #x1374)
+    ("ETHIOPIC NUMBER FORTY" #x1375)
+    ("ETHIOPIC NUMBER FIFTY" #x1376)
+    ("ETHIOPIC NUMBER SIXTY" #x1377)
+    ("ETHIOPIC NUMBER SEVENTY" #x1378)
+    ("ETHIOPIC NUMBER EIGHTY" #x1379)
+    ("ETHIOPIC NUMBER NINETY" #x137A)
+    ("ETHIOPIC NUMBER HUNDRED" #x137B)
+    ("ETHIOPIC NUMBER TEN THOUSAND" #x137C)
+    ))
diff --git a/lisp/nxml/char-name/unicode/013A0-013FF.el b/lisp/nxml/char-name/unicode/013A0-013FF.el
new file mode 100644 (file)
index 0000000..74111fb
--- /dev/null
@@ -0,0 +1,87 @@
+(nxml-define-char-name-set 'cherokee
+  '(("CHEROKEE LETTER A" #x13A0)
+    ("CHEROKEE LETTER E" #x13A1)
+    ("CHEROKEE LETTER I" #x13A2)
+    ("CHEROKEE LETTER O" #x13A3)
+    ("CHEROKEE LETTER U" #x13A4)
+    ("CHEROKEE LETTER V" #x13A5)
+    ("CHEROKEE LETTER GA" #x13A6)
+    ("CHEROKEE LETTER KA" #x13A7)
+    ("CHEROKEE LETTER GE" #x13A8)
+    ("CHEROKEE LETTER GI" #x13A9)
+    ("CHEROKEE LETTER GO" #x13AA)
+    ("CHEROKEE LETTER GU" #x13AB)
+    ("CHEROKEE LETTER GV" #x13AC)
+    ("CHEROKEE LETTER HA" #x13AD)
+    ("CHEROKEE LETTER HE" #x13AE)
+    ("CHEROKEE LETTER HI" #x13AF)
+    ("CHEROKEE LETTER HO" #x13B0)
+    ("CHEROKEE LETTER HU" #x13B1)
+    ("CHEROKEE LETTER HV" #x13B2)
+    ("CHEROKEE LETTER LA" #x13B3)
+    ("CHEROKEE LETTER LE" #x13B4)
+    ("CHEROKEE LETTER LI" #x13B5)
+    ("CHEROKEE LETTER LO" #x13B6)
+    ("CHEROKEE LETTER LU" #x13B7)
+    ("CHEROKEE LETTER LV" #x13B8)
+    ("CHEROKEE LETTER MA" #x13B9)
+    ("CHEROKEE LETTER ME" #x13BA)
+    ("CHEROKEE LETTER MI" #x13BB)
+    ("CHEROKEE LETTER MO" #x13BC)
+    ("CHEROKEE LETTER MU" #x13BD)
+    ("CHEROKEE LETTER NA" #x13BE)
+    ("CHEROKEE LETTER HNA" #x13BF)
+    ("CHEROKEE LETTER NAH" #x13C0)
+    ("CHEROKEE LETTER NE" #x13C1)
+    ("CHEROKEE LETTER NI" #x13C2)
+    ("CHEROKEE LETTER NO" #x13C3)
+    ("CHEROKEE LETTER NU" #x13C4)
+    ("CHEROKEE LETTER NV" #x13C5)
+    ("CHEROKEE LETTER QUA" #x13C6)
+    ("CHEROKEE LETTER QUE" #x13C7)
+    ("CHEROKEE LETTER QUI" #x13C8)
+    ("CHEROKEE LETTER QUO" #x13C9)
+    ("CHEROKEE LETTER QUU" #x13CA)
+    ("CHEROKEE LETTER QUV" #x13CB)
+    ("CHEROKEE LETTER SA" #x13CC)
+    ("CHEROKEE LETTER S" #x13CD)
+    ("CHEROKEE LETTER SE" #x13CE)
+    ("CHEROKEE LETTER SI" #x13CF)
+    ("CHEROKEE LETTER SO" #x13D0)
+    ("CHEROKEE LETTER SU" #x13D1)
+    ("CHEROKEE LETTER SV" #x13D2)
+    ("CHEROKEE LETTER DA" #x13D3)
+    ("CHEROKEE LETTER TA" #x13D4)
+    ("CHEROKEE LETTER DE" #x13D5)
+    ("CHEROKEE LETTER TE" #x13D6)
+    ("CHEROKEE LETTER DI" #x13D7)
+    ("CHEROKEE LETTER TI" #x13D8)
+    ("CHEROKEE LETTER DO" #x13D9)
+    ("CHEROKEE LETTER DU" #x13DA)
+    ("CHEROKEE LETTER DV" #x13DB)
+    ("CHEROKEE LETTER DLA" #x13DC)
+    ("CHEROKEE LETTER TLA" #x13DD)
+    ("CHEROKEE LETTER TLE" #x13DE)
+    ("CHEROKEE LETTER TLI" #x13DF)
+    ("CHEROKEE LETTER TLO" #x13E0)
+    ("CHEROKEE LETTER TLU" #x13E1)
+    ("CHEROKEE LETTER TLV" #x13E2)
+    ("CHEROKEE LETTER TSA" #x13E3)
+    ("CHEROKEE LETTER TSE" #x13E4)
+    ("CHEROKEE LETTER TSI" #x13E5)
+    ("CHEROKEE LETTER TSO" #x13E6)
+    ("CHEROKEE LETTER TSU" #x13E7)
+    ("CHEROKEE LETTER TSV" #x13E8)
+    ("CHEROKEE LETTER WA" #x13E9)
+    ("CHEROKEE LETTER WE" #x13EA)
+    ("CHEROKEE LETTER WI" #x13EB)
+    ("CHEROKEE LETTER WO" #x13EC)
+    ("CHEROKEE LETTER WU" #x13ED)
+    ("CHEROKEE LETTER WV" #x13EE)
+    ("CHEROKEE LETTER YA" #x13EF)
+    ("CHEROKEE LETTER YE" #x13F0)
+    ("CHEROKEE LETTER YI" #x13F1)
+    ("CHEROKEE LETTER YO" #x13F2)
+    ("CHEROKEE LETTER YU" #x13F3)
+    ("CHEROKEE LETTER YV" #x13F4)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01400-0167F.el b/lisp/nxml/char-name/unicode/01400-0167F.el
new file mode 100644 (file)
index 0000000..644b255
--- /dev/null
@@ -0,0 +1,632 @@
+(nxml-define-char-name-set 'unified-canadian-aboriginal-syllabics
+  '(("CANADIAN SYLLABICS E" #x1401)
+    ("CANADIAN SYLLABICS AAI" #x1402)
+    ("CANADIAN SYLLABICS I" #x1403)
+    ("CANADIAN SYLLABICS II" #x1404)
+    ("CANADIAN SYLLABICS O" #x1405)
+    ("CANADIAN SYLLABICS OO" #x1406)
+    ("CANADIAN SYLLABICS Y-CREE OO" #x1407)
+    ("CANADIAN SYLLABICS CARRIER EE" #x1408)
+    ("CANADIAN SYLLABICS CARRIER I" #x1409)
+    ("CANADIAN SYLLABICS A" #x140A)
+    ("CANADIAN SYLLABICS AA" #x140B)
+    ("CANADIAN SYLLABICS WE" #x140C)
+    ("CANADIAN SYLLABICS WEST-CREE WE" #x140D)
+    ("CANADIAN SYLLABICS WI" #x140E)
+    ("CANADIAN SYLLABICS WEST-CREE WI" #x140F)
+    ("CANADIAN SYLLABICS WII" #x1410)
+    ("CANADIAN SYLLABICS WEST-CREE WII" #x1411)
+    ("CANADIAN SYLLABICS WO" #x1412)
+    ("CANADIAN SYLLABICS WEST-CREE WO" #x1413)
+    ("CANADIAN SYLLABICS WOO" #x1414)
+    ("CANADIAN SYLLABICS WEST-CREE WOO" #x1415)
+    ("CANADIAN SYLLABICS NASKAPI WOO" #x1416)
+    ("CANADIAN SYLLABICS WA" #x1417)
+    ("CANADIAN SYLLABICS WEST-CREE WA" #x1418)
+    ("CANADIAN SYLLABICS WAA" #x1419)
+    ("CANADIAN SYLLABICS WEST-CREE WAA" #x141A)
+    ("CANADIAN SYLLABICS NASKAPI WAA" #x141B)
+    ("CANADIAN SYLLABICS AI" #x141C)
+    ("CANADIAN SYLLABICS Y-CREE W" #x141D)
+    ("CANADIAN SYLLABICS GLOTTAL STOP" #x141E)
+    ("CANADIAN SYLLABICS FINAL ACUTE" #x141F)
+    ("CANADIAN SYLLABICS FINAL GRAVE" #x1420)
+    ("CANADIAN SYLLABICS FINAL BOTTOM HALF RING" #x1421)
+    ("CANADIAN SYLLABICS FINAL TOP HALF RING" #x1422)
+    ("CANADIAN SYLLABICS FINAL RIGHT HALF RING" #x1423)
+    ("CANADIAN SYLLABICS FINAL RING" #x1424)
+    ("CANADIAN SYLLABICS FINAL DOUBLE ACUTE" #x1425)
+    ("CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES" #x1426)
+    ("CANADIAN SYLLABICS FINAL MIDDLE DOT" #x1427)
+    ("CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE" #x1428)
+    ("CANADIAN SYLLABICS FINAL PLUS" #x1429)
+    ("CANADIAN SYLLABICS FINAL DOWN TACK" #x142A)
+    ("CANADIAN SYLLABICS EN" #x142B)
+    ("CANADIAN SYLLABICS IN" #x142C)
+    ("CANADIAN SYLLABICS ON" #x142D)
+    ("CANADIAN SYLLABICS AN" #x142E)
+    ("CANADIAN SYLLABICS PE" #x142F)
+    ("CANADIAN SYLLABICS PAAI" #x1430)
+    ("CANADIAN SYLLABICS PI" #x1431)
+    ("CANADIAN SYLLABICS PII" #x1432)
+    ("CANADIAN SYLLABICS PO" #x1433)
+    ("CANADIAN SYLLABICS POO" #x1434)
+    ("CANADIAN SYLLABICS Y-CREE POO" #x1435)
+    ("CANADIAN SYLLABICS CARRIER HEE" #x1436)
+    ("CANADIAN SYLLABICS CARRIER HI" #x1437)
+    ("CANADIAN SYLLABICS PA" #x1438)
+    ("CANADIAN SYLLABICS PAA" #x1439)
+    ("CANADIAN SYLLABICS PWE" #x143A)
+    ("CANADIAN SYLLABICS WEST-CREE PWE" #x143B)
+    ("CANADIAN SYLLABICS PWI" #x143C)
+    ("CANADIAN SYLLABICS WEST-CREE PWI" #x143D)
+    ("CANADIAN SYLLABICS PWII" #x143E)
+    ("CANADIAN SYLLABICS WEST-CREE PWII" #x143F)
+    ("CANADIAN SYLLABICS PWO" #x1440)
+    ("CANADIAN SYLLABICS WEST-CREE PWO" #x1441)
+    ("CANADIAN SYLLABICS PWOO" #x1442)
+    ("CANADIAN SYLLABICS WEST-CREE PWOO" #x1443)
+    ("CANADIAN SYLLABICS PWA" #x1444)
+    ("CANADIAN SYLLABICS WEST-CREE PWA" #x1445)
+    ("CANADIAN SYLLABICS PWAA" #x1446)
+    ("CANADIAN SYLLABICS WEST-CREE PWAA" #x1447)
+    ("CANADIAN SYLLABICS Y-CREE PWAA" #x1448)
+    ("CANADIAN SYLLABICS P" #x1449)
+    ("CANADIAN SYLLABICS WEST-CREE P" #x144A)
+    ("CANADIAN SYLLABICS CARRIER H" #x144B)
+    ("CANADIAN SYLLABICS TE" #x144C)
+    ("CANADIAN SYLLABICS TAAI" #x144D)
+    ("CANADIAN SYLLABICS TI" #x144E)
+    ("CANADIAN SYLLABICS TII" #x144F)
+    ("CANADIAN SYLLABICS TO" #x1450)
+    ("CANADIAN SYLLABICS TOO" #x1451)
+    ("CANADIAN SYLLABICS Y-CREE TOO" #x1452)
+    ("CANADIAN SYLLABICS CARRIER DEE" #x1453)
+    ("CANADIAN SYLLABICS CARRIER DI" #x1454)
+    ("CANADIAN SYLLABICS TA" #x1455)
+    ("CANADIAN SYLLABICS TAA" #x1456)
+    ("CANADIAN SYLLABICS TWE" #x1457)
+    ("CANADIAN SYLLABICS WEST-CREE TWE" #x1458)
+    ("CANADIAN SYLLABICS TWI" #x1459)
+    ("CANADIAN SYLLABICS WEST-CREE TWI" #x145A)
+    ("CANADIAN SYLLABICS TWII" #x145B)
+    ("CANADIAN SYLLABICS WEST-CREE TWII" #x145C)
+    ("CANADIAN SYLLABICS TWO" #x145D)
+    ("CANADIAN SYLLABICS WEST-CREE TWO" #x145E)
+    ("CANADIAN SYLLABICS TWOO" #x145F)
+    ("CANADIAN SYLLABICS WEST-CREE TWOO" #x1460)
+    ("CANADIAN SYLLABICS TWA" #x1461)
+    ("CANADIAN SYLLABICS WEST-CREE TWA" #x1462)
+    ("CANADIAN SYLLABICS TWAA" #x1463)
+    ("CANADIAN SYLLABICS WEST-CREE TWAA" #x1464)
+    ("CANADIAN SYLLABICS NASKAPI TWAA" #x1465)
+    ("CANADIAN SYLLABICS T" #x1466)
+    ("CANADIAN SYLLABICS TTE" #x1467)
+    ("CANADIAN SYLLABICS TTI" #x1468)
+    ("CANADIAN SYLLABICS TTO" #x1469)
+    ("CANADIAN SYLLABICS TTA" #x146A)
+    ("CANADIAN SYLLABICS KE" #x146B)
+    ("CANADIAN SYLLABICS KAAI" #x146C)
+    ("CANADIAN SYLLABICS KI" #x146D)
+    ("CANADIAN SYLLABICS KII" #x146E)
+    ("CANADIAN SYLLABICS KO" #x146F)
+    ("CANADIAN SYLLABICS KOO" #x1470)
+    ("CANADIAN SYLLABICS Y-CREE KOO" #x1471)
+    ("CANADIAN SYLLABICS KA" #x1472)
+    ("CANADIAN SYLLABICS KAA" #x1473)
+    ("CANADIAN SYLLABICS KWE" #x1474)
+    ("CANADIAN SYLLABICS WEST-CREE KWE" #x1475)
+    ("CANADIAN SYLLABICS KWI" #x1476)
+    ("CANADIAN SYLLABICS WEST-CREE KWI" #x1477)
+    ("CANADIAN SYLLABICS KWII" #x1478)
+    ("CANADIAN SYLLABICS WEST-CREE KWII" #x1479)
+    ("CANADIAN SYLLABICS KWO" #x147A)
+    ("CANADIAN SYLLABICS WEST-CREE KWO" #x147B)
+    ("CANADIAN SYLLABICS KWOO" #x147C)
+    ("CANADIAN SYLLABICS WEST-CREE KWOO" #x147D)
+    ("CANADIAN SYLLABICS KWA" #x147E)
+    ("CANADIAN SYLLABICS WEST-CREE KWA" #x147F)
+    ("CANADIAN SYLLABICS KWAA" #x1480)
+    ("CANADIAN SYLLABICS WEST-CREE KWAA" #x1481)
+    ("CANADIAN SYLLABICS NASKAPI KWAA" #x1482)
+    ("CANADIAN SYLLABICS K" #x1483)
+    ("CANADIAN SYLLABICS KW" #x1484)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KEH" #x1485)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KIH" #x1486)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KOH" #x1487)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KAH" #x1488)
+    ("CANADIAN SYLLABICS CE" #x1489)
+    ("CANADIAN SYLLABICS CAAI" #x148A)
+    ("CANADIAN SYLLABICS CI" #x148B)
+    ("CANADIAN SYLLABICS CII" #x148C)
+    ("CANADIAN SYLLABICS CO" #x148D)
+    ("CANADIAN SYLLABICS COO" #x148E)
+    ("CANADIAN SYLLABICS Y-CREE COO" #x148F)
+    ("CANADIAN SYLLABICS CA" #x1490)
+    ("CANADIAN SYLLABICS CAA" #x1491)
+    ("CANADIAN SYLLABICS CWE" #x1492)
+    ("CANADIAN SYLLABICS WEST-CREE CWE" #x1493)
+    ("CANADIAN SYLLABICS CWI" #x1494)
+    ("CANADIAN SYLLABICS WEST-CREE CWI" #x1495)
+    ("CANADIAN SYLLABICS CWII" #x1496)
+    ("CANADIAN SYLLABICS WEST-CREE CWII" #x1497)
+    ("CANADIAN SYLLABICS CWO" #x1498)
+    ("CANADIAN SYLLABICS WEST-CREE CWO" #x1499)
+    ("CANADIAN SYLLABICS CWOO" #x149A)
+    ("CANADIAN SYLLABICS WEST-CREE CWOO" #x149B)
+    ("CANADIAN SYLLABICS CWA" #x149C)
+    ("CANADIAN SYLLABICS WEST-CREE CWA" #x149D)
+    ("CANADIAN SYLLABICS CWAA" #x149E)
+    ("CANADIAN SYLLABICS WEST-CREE CWAA" #x149F)
+    ("CANADIAN SYLLABICS NASKAPI CWAA" #x14A0)
+    ("CANADIAN SYLLABICS C" #x14A1)
+    ("CANADIAN SYLLABICS SAYISI TH" #x14A2)
+    ("CANADIAN SYLLABICS ME" #x14A3)
+    ("CANADIAN SYLLABICS MAAI" #x14A4)
+    ("CANADIAN SYLLABICS MI" #x14A5)
+    ("CANADIAN SYLLABICS MII" #x14A6)
+    ("CANADIAN SYLLABICS MO" #x14A7)
+    ("CANADIAN SYLLABICS MOO" #x14A8)
+    ("CANADIAN SYLLABICS Y-CREE MOO" #x14A9)
+    ("CANADIAN SYLLABICS MA" #x14AA)
+    ("CANADIAN SYLLABICS MAA" #x14AB)
+    ("CANADIAN SYLLABICS MWE" #x14AC)
+    ("CANADIAN SYLLABICS WEST-CREE MWE" #x14AD)
+    ("CANADIAN SYLLABICS MWI" #x14AE)
+    ("CANADIAN SYLLABICS WEST-CREE MWI" #x14AF)
+    ("CANADIAN SYLLABICS MWII" #x14B0)
+    ("CANADIAN SYLLABICS WEST-CREE MWII" #x14B1)
+    ("CANADIAN SYLLABICS MWO" #x14B2)
+    ("CANADIAN SYLLABICS WEST-CREE MWO" #x14B3)
+    ("CANADIAN SYLLABICS MWOO" #x14B4)
+    ("CANADIAN SYLLABICS WEST-CREE MWOO" #x14B5)
+    ("CANADIAN SYLLABICS MWA" #x14B6)
+    ("CANADIAN SYLLABICS WEST-CREE MWA" #x14B7)
+    ("CANADIAN SYLLABICS MWAA" #x14B8)
+    ("CANADIAN SYLLABICS WEST-CREE MWAA" #x14B9)
+    ("CANADIAN SYLLABICS NASKAPI MWAA" #x14BA)
+    ("CANADIAN SYLLABICS M" #x14BB)
+    ("CANADIAN SYLLABICS WEST-CREE M" #x14BC)
+    ("CANADIAN SYLLABICS MH" #x14BD)
+    ("CANADIAN SYLLABICS ATHAPASCAN M" #x14BE)
+    ("CANADIAN SYLLABICS SAYISI M" #x14BF)
+    ("CANADIAN SYLLABICS NE" #x14C0)
+    ("CANADIAN SYLLABICS NAAI" #x14C1)
+    ("CANADIAN SYLLABICS NI" #x14C2)
+    ("CANADIAN SYLLABICS NII" #x14C3)
+    ("CANADIAN SYLLABICS NO" #x14C4)
+    ("CANADIAN SYLLABICS NOO" #x14C5)
+    ("CANADIAN SYLLABICS Y-CREE NOO" #x14C6)
+    ("CANADIAN SYLLABICS NA" #x14C7)
+    ("CANADIAN SYLLABICS NAA" #x14C8)
+    ("CANADIAN SYLLABICS NWE" #x14C9)
+    ("CANADIAN SYLLABICS WEST-CREE NWE" #x14CA)
+    ("CANADIAN SYLLABICS NWA" #x14CB)
+    ("CANADIAN SYLLABICS WEST-CREE NWA" #x14CC)
+    ("CANADIAN SYLLABICS NWAA" #x14CD)
+    ("CANADIAN SYLLABICS WEST-CREE NWAA" #x14CE)
+    ("CANADIAN SYLLABICS NASKAPI NWAA" #x14CF)
+    ("CANADIAN SYLLABICS N" #x14D0)
+    ("CANADIAN SYLLABICS CARRIER NG" #x14D1)
+    ("CANADIAN SYLLABICS NH" #x14D2)
+    ("CANADIAN SYLLABICS LE" #x14D3)
+    ("CANADIAN SYLLABICS LAAI" #x14D4)
+    ("CANADIAN SYLLABICS LI" #x14D5)
+    ("CANADIAN SYLLABICS LII" #x14D6)
+    ("CANADIAN SYLLABICS LO" #x14D7)
+    ("CANADIAN SYLLABICS LOO" #x14D8)
+    ("CANADIAN SYLLABICS Y-CREE LOO" #x14D9)
+    ("CANADIAN SYLLABICS LA" #x14DA)
+    ("CANADIAN SYLLABICS LAA" #x14DB)
+    ("CANADIAN SYLLABICS LWE" #x14DC)
+    ("CANADIAN SYLLABICS WEST-CREE LWE" #x14DD)
+    ("CANADIAN SYLLABICS LWI" #x14DE)
+    ("CANADIAN SYLLABICS WEST-CREE LWI" #x14DF)
+    ("CANADIAN SYLLABICS LWII" #x14E0)
+    ("CANADIAN SYLLABICS WEST-CREE LWII" #x14E1)
+    ("CANADIAN SYLLABICS LWO" #x14E2)
+    ("CANADIAN SYLLABICS WEST-CREE LWO" #x14E3)
+    ("CANADIAN SYLLABICS LWOO" #x14E4)
+    ("CANADIAN SYLLABICS WEST-CREE LWOO" #x14E5)
+    ("CANADIAN SYLLABICS LWA" #x14E6)
+    ("CANADIAN SYLLABICS WEST-CREE LWA" #x14E7)
+    ("CANADIAN SYLLABICS LWAA" #x14E8)
+    ("CANADIAN SYLLABICS WEST-CREE LWAA" #x14E9)
+    ("CANADIAN SYLLABICS L" #x14EA)
+    ("CANADIAN SYLLABICS WEST-CREE L" #x14EB)
+    ("CANADIAN SYLLABICS MEDIAL L" #x14EC)
+    ("CANADIAN SYLLABICS SE" #x14ED)
+    ("CANADIAN SYLLABICS SAAI" #x14EE)
+    ("CANADIAN SYLLABICS SI" #x14EF)
+    ("CANADIAN SYLLABICS SII" #x14F0)
+    ("CANADIAN SYLLABICS SO" #x14F1)
+    ("CANADIAN SYLLABICS SOO" #x14F2)
+    ("CANADIAN SYLLABICS Y-CREE SOO" #x14F3)
+    ("CANADIAN SYLLABICS SA" #x14F4)
+    ("CANADIAN SYLLABICS SAA" #x14F5)
+    ("CANADIAN SYLLABICS SWE" #x14F6)
+    ("CANADIAN SYLLABICS WEST-CREE SWE" #x14F7)
+    ("CANADIAN SYLLABICS SWI" #x14F8)
+    ("CANADIAN SYLLABICS WEST-CREE SWI" #x14F9)
+    ("CANADIAN SYLLABICS SWII" #x14FA)
+    ("CANADIAN SYLLABICS WEST-CREE SWII" #x14FB)
+    ("CANADIAN SYLLABICS SWO" #x14FC)
+    ("CANADIAN SYLLABICS WEST-CREE SWO" #x14FD)
+    ("CANADIAN SYLLABICS SWOO" #x14FE)
+    ("CANADIAN SYLLABICS WEST-CREE SWOO" #x14FF)
+    ("CANADIAN SYLLABICS SWA" #x1500)
+    ("CANADIAN SYLLABICS WEST-CREE SWA" #x1501)
+    ("CANADIAN SYLLABICS SWAA" #x1502)
+    ("CANADIAN SYLLABICS WEST-CREE SWAA" #x1503)
+    ("CANADIAN SYLLABICS NASKAPI SWAA" #x1504)
+    ("CANADIAN SYLLABICS S" #x1505)
+    ("CANADIAN SYLLABICS ATHAPASCAN S" #x1506)
+    ("CANADIAN SYLLABICS SW" #x1507)
+    ("CANADIAN SYLLABICS BLACKFOOT S" #x1508)
+    ("CANADIAN SYLLABICS MOOSE-CREE SK" #x1509)
+    ("CANADIAN SYLLABICS NASKAPI SKW" #x150A)
+    ("CANADIAN SYLLABICS NASKAPI S-W" #x150B)
+    ("CANADIAN SYLLABICS NASKAPI SPWA" #x150C)
+    ("CANADIAN SYLLABICS NASKAPI STWA" #x150D)
+    ("CANADIAN SYLLABICS NASKAPI SKWA" #x150E)
+    ("CANADIAN SYLLABICS NASKAPI SCWA" #x150F)
+    ("CANADIAN SYLLABICS SHE" #x1510)
+    ("CANADIAN SYLLABICS SHI" #x1511)
+    ("CANADIAN SYLLABICS SHII" #x1512)
+    ("CANADIAN SYLLABICS SHO" #x1513)
+    ("CANADIAN SYLLABICS SHOO" #x1514)
+    ("CANADIAN SYLLABICS SHA" #x1515)
+    ("CANADIAN SYLLABICS SHAA" #x1516)
+    ("CANADIAN SYLLABICS SHWE" #x1517)
+    ("CANADIAN SYLLABICS WEST-CREE SHWE" #x1518)
+    ("CANADIAN SYLLABICS SHWI" #x1519)
+    ("CANADIAN SYLLABICS WEST-CREE SHWI" #x151A)
+    ("CANADIAN SYLLABICS SHWII" #x151B)
+    ("CANADIAN SYLLABICS WEST-CREE SHWII" #x151C)
+    ("CANADIAN SYLLABICS SHWO" #x151D)
+    ("CANADIAN SYLLABICS WEST-CREE SHWO" #x151E)
+    ("CANADIAN SYLLABICS SHWOO" #x151F)
+    ("CANADIAN SYLLABICS WEST-CREE SHWOO" #x1520)
+    ("CANADIAN SYLLABICS SHWA" #x1521)
+    ("CANADIAN SYLLABICS WEST-CREE SHWA" #x1522)
+    ("CANADIAN SYLLABICS SHWAA" #x1523)
+    ("CANADIAN SYLLABICS WEST-CREE SHWAA" #x1524)
+    ("CANADIAN SYLLABICS SH" #x1525)
+    ("CANADIAN SYLLABICS YE" #x1526)
+    ("CANADIAN SYLLABICS YAAI" #x1527)
+    ("CANADIAN SYLLABICS YI" #x1528)
+    ("CANADIAN SYLLABICS YII" #x1529)
+    ("CANADIAN SYLLABICS YO" #x152A)
+    ("CANADIAN SYLLABICS YOO" #x152B)
+    ("CANADIAN SYLLABICS Y-CREE YOO" #x152C)
+    ("CANADIAN SYLLABICS YA" #x152D)
+    ("CANADIAN SYLLABICS YAA" #x152E)
+    ("CANADIAN SYLLABICS YWE" #x152F)
+    ("CANADIAN SYLLABICS WEST-CREE YWE" #x1530)
+    ("CANADIAN SYLLABICS YWI" #x1531)
+    ("CANADIAN SYLLABICS WEST-CREE YWI" #x1532)
+    ("CANADIAN SYLLABICS YWII" #x1533)
+    ("CANADIAN SYLLABICS WEST-CREE YWII" #x1534)
+    ("CANADIAN SYLLABICS YWO" #x1535)
+    ("CANADIAN SYLLABICS WEST-CREE YWO" #x1536)
+    ("CANADIAN SYLLABICS YWOO" #x1537)
+    ("CANADIAN SYLLABICS WEST-CREE YWOO" #x1538)
+    ("CANADIAN SYLLABICS YWA" #x1539)
+    ("CANADIAN SYLLABICS WEST-CREE YWA" #x153A)
+    ("CANADIAN SYLLABICS YWAA" #x153B)
+    ("CANADIAN SYLLABICS WEST-CREE YWAA" #x153C)
+    ("CANADIAN SYLLABICS NASKAPI YWAA" #x153D)
+    ("CANADIAN SYLLABICS Y" #x153E)
+    ("CANADIAN SYLLABICS BIBLE-CREE Y" #x153F)
+    ("CANADIAN SYLLABICS WEST-CREE Y" #x1540)
+    ("CANADIAN SYLLABICS SAYISI YI" #x1541)
+    ("CANADIAN SYLLABICS RE" #x1542)
+    ("CANADIAN SYLLABICS R-CREE RE" #x1543)
+    ("CANADIAN SYLLABICS WEST-CREE LE" #x1544)
+    ("CANADIAN SYLLABICS RAAI" #x1545)
+    ("CANADIAN SYLLABICS RI" #x1546)
+    ("CANADIAN SYLLABICS RII" #x1547)
+    ("CANADIAN SYLLABICS RO" #x1548)
+    ("CANADIAN SYLLABICS ROO" #x1549)
+    ("CANADIAN SYLLABICS WEST-CREE LO" #x154A)
+    ("CANADIAN SYLLABICS RA" #x154B)
+    ("CANADIAN SYLLABICS RAA" #x154C)
+    ("CANADIAN SYLLABICS WEST-CREE LA" #x154D)
+    ("CANADIAN SYLLABICS RWAA" #x154E)
+    ("CANADIAN SYLLABICS WEST-CREE RWAA" #x154F)
+    ("CANADIAN SYLLABICS R" #x1550)
+    ("CANADIAN SYLLABICS WEST-CREE R" #x1551)
+    ("CANADIAN SYLLABICS MEDIAL R" #x1552)
+    ("CANADIAN SYLLABICS FE" #x1553)
+    ("CANADIAN SYLLABICS FAAI" #x1554)
+    ("CANADIAN SYLLABICS FI" #x1555)
+    ("CANADIAN SYLLABICS FII" #x1556)
+    ("CANADIAN SYLLABICS FO" #x1557)
+    ("CANADIAN SYLLABICS FOO" #x1558)
+    ("CANADIAN SYLLABICS FA" #x1559)
+    ("CANADIAN SYLLABICS FAA" #x155A)
+    ("CANADIAN SYLLABICS FWAA" #x155B)
+    ("CANADIAN SYLLABICS WEST-CREE FWAA" #x155C)
+    ("CANADIAN SYLLABICS F" #x155D)
+    ("CANADIAN SYLLABICS THE" #x155E)
+    ("CANADIAN SYLLABICS N-CREE THE" #x155F)
+    ("CANADIAN SYLLABICS THI" #x1560)
+    ("CANADIAN SYLLABICS N-CREE THI" #x1561)
+    ("CANADIAN SYLLABICS THII" #x1562)
+    ("CANADIAN SYLLABICS N-CREE THII" #x1563)
+    ("CANADIAN SYLLABICS THO" #x1564)
+    ("CANADIAN SYLLABICS THOO" #x1565)
+    ("CANADIAN SYLLABICS THA" #x1566)
+    ("CANADIAN SYLLABICS THAA" #x1567)
+    ("CANADIAN SYLLABICS THWAA" #x1568)
+    ("CANADIAN SYLLABICS WEST-CREE THWAA" #x1569)
+    ("CANADIAN SYLLABICS TH" #x156A)
+    ("CANADIAN SYLLABICS TTHE" #x156B)
+    ("CANADIAN SYLLABICS TTHI" #x156C)
+    ("CANADIAN SYLLABICS TTHO" #x156D)
+    ("CANADIAN SYLLABICS TTHA" #x156E)
+    ("CANADIAN SYLLABICS TTH" #x156F)
+    ("CANADIAN SYLLABICS TYE" #x1570)
+    ("CANADIAN SYLLABICS TYI" #x1571)
+    ("CANADIAN SYLLABICS TYO" #x1572)
+    ("CANADIAN SYLLABICS TYA" #x1573)
+    ("CANADIAN SYLLABICS NUNAVIK HE" #x1574)
+    ("CANADIAN SYLLABICS NUNAVIK HI" #x1575)
+    ("CANADIAN SYLLABICS NUNAVIK HII" #x1576)
+    ("CANADIAN SYLLABICS NUNAVIK HO" #x1577)
+    ("CANADIAN SYLLABICS NUNAVIK HOO" #x1578)
+    ("CANADIAN SYLLABICS NUNAVIK HA" #x1579)
+    ("CANADIAN SYLLABICS NUNAVIK HAA" #x157A)
+    ("CANADIAN SYLLABICS NUNAVIK H" #x157B)
+    ("CANADIAN SYLLABICS NUNAVUT H" #x157C)
+    ("CANADIAN SYLLABICS HK" #x157D)
+    ("CANADIAN SYLLABICS QAAI" #x157E)
+    ("CANADIAN SYLLABICS QI" #x157F)
+    ("CANADIAN SYLLABICS QII" #x1580)
+    ("CANADIAN SYLLABICS QO" #x1581)
+    ("CANADIAN SYLLABICS QOO" #x1582)
+    ("CANADIAN SYLLABICS QA" #x1583)
+    ("CANADIAN SYLLABICS QAA" #x1584)
+    ("CANADIAN SYLLABICS Q" #x1585)
+    ("CANADIAN SYLLABICS TLHE" #x1586)
+    ("CANADIAN SYLLABICS TLHI" #x1587)
+    ("CANADIAN SYLLABICS TLHO" #x1588)
+    ("CANADIAN SYLLABICS TLHA" #x1589)
+    ("CANADIAN SYLLABICS WEST-CREE RE" #x158A)
+    ("CANADIAN SYLLABICS WEST-CREE RI" #x158B)
+    ("CANADIAN SYLLABICS WEST-CREE RO" #x158C)
+    ("CANADIAN SYLLABICS WEST-CREE RA" #x158D)
+    ("CANADIAN SYLLABICS NGAAI" #x158E)
+    ("CANADIAN SYLLABICS NGI" #x158F)
+    ("CANADIAN SYLLABICS NGII" #x1590)
+    ("CANADIAN SYLLABICS NGO" #x1591)
+    ("CANADIAN SYLLABICS NGOO" #x1592)
+    ("CANADIAN SYLLABICS NGA" #x1593)
+    ("CANADIAN SYLLABICS NGAA" #x1594)
+    ("CANADIAN SYLLABICS NG" #x1595)
+    ("CANADIAN SYLLABICS NNG" #x1596)
+    ("CANADIAN SYLLABICS SAYISI SHE" #x1597)
+    ("CANADIAN SYLLABICS SAYISI SHI" #x1598)
+    ("CANADIAN SYLLABICS SAYISI SHO" #x1599)
+    ("CANADIAN SYLLABICS SAYISI SHA" #x159A)
+    ("CANADIAN SYLLABICS WOODS-CREE THE" #x159B)
+    ("CANADIAN SYLLABICS WOODS-CREE THI" #x159C)
+    ("CANADIAN SYLLABICS WOODS-CREE THO" #x159D)
+    ("CANADIAN SYLLABICS WOODS-CREE THA" #x159E)
+    ("CANADIAN SYLLABICS WOODS-CREE TH" #x159F)
+    ("CANADIAN SYLLABICS LHI" #x15A0)
+    ("CANADIAN SYLLABICS LHII" #x15A1)
+    ("CANADIAN SYLLABICS LHO" #x15A2)
+    ("CANADIAN SYLLABICS LHOO" #x15A3)
+    ("CANADIAN SYLLABICS LHA" #x15A4)
+    ("CANADIAN SYLLABICS LHAA" #x15A5)
+    ("CANADIAN SYLLABICS LH" #x15A6)
+    ("CANADIAN SYLLABICS TH-CREE THE" #x15A7)
+    ("CANADIAN SYLLABICS TH-CREE THI" #x15A8)
+    ("CANADIAN SYLLABICS TH-CREE THII" #x15A9)
+    ("CANADIAN SYLLABICS TH-CREE THO" #x15AA)
+    ("CANADIAN SYLLABICS TH-CREE THOO" #x15AB)
+    ("CANADIAN SYLLABICS TH-CREE THA" #x15AC)
+    ("CANADIAN SYLLABICS TH-CREE THAA" #x15AD)
+    ("CANADIAN SYLLABICS TH-CREE TH" #x15AE)
+    ("CANADIAN SYLLABICS AIVILIK B" #x15AF)
+    ("CANADIAN SYLLABICS BLACKFOOT E" #x15B0)
+    ("CANADIAN SYLLABICS BLACKFOOT I" #x15B1)
+    ("CANADIAN SYLLABICS BLACKFOOT O" #x15B2)
+    ("CANADIAN SYLLABICS BLACKFOOT A" #x15B3)
+    ("CANADIAN SYLLABICS BLACKFOOT WE" #x15B4)
+    ("CANADIAN SYLLABICS BLACKFOOT WI" #x15B5)
+    ("CANADIAN SYLLABICS BLACKFOOT WO" #x15B6)
+    ("CANADIAN SYLLABICS BLACKFOOT WA" #x15B7)
+    ("CANADIAN SYLLABICS BLACKFOOT NE" #x15B8)
+    ("CANADIAN SYLLABICS BLACKFOOT NI" #x15B9)
+    ("CANADIAN SYLLABICS BLACKFOOT NO" #x15BA)
+    ("CANADIAN SYLLABICS BLACKFOOT NA" #x15BB)
+    ("CANADIAN SYLLABICS BLACKFOOT KE" #x15BC)
+    ("CANADIAN SYLLABICS BLACKFOOT KI" #x15BD)
+    ("CANADIAN SYLLABICS BLACKFOOT KO" #x15BE)
+    ("CANADIAN SYLLABICS BLACKFOOT KA" #x15BF)
+    ("CANADIAN SYLLABICS SAYISI HE" #x15C0)
+    ("CANADIAN SYLLABICS SAYISI HI" #x15C1)
+    ("CANADIAN SYLLABICS SAYISI HO" #x15C2)
+    ("CANADIAN SYLLABICS SAYISI HA" #x15C3)
+    ("CANADIAN SYLLABICS CARRIER GHU" #x15C4)
+    ("CANADIAN SYLLABICS CARRIER GHO" #x15C5)
+    ("CANADIAN SYLLABICS CARRIER GHE" #x15C6)
+    ("CANADIAN SYLLABICS CARRIER GHEE" #x15C7)
+    ("CANADIAN SYLLABICS CARRIER GHI" #x15C8)
+    ("CANADIAN SYLLABICS CARRIER GHA" #x15C9)
+    ("CANADIAN SYLLABICS CARRIER RU" #x15CA)
+    ("CANADIAN SYLLABICS CARRIER RO" #x15CB)
+    ("CANADIAN SYLLABICS CARRIER RE" #x15CC)
+    ("CANADIAN SYLLABICS CARRIER REE" #x15CD)
+    ("CANADIAN SYLLABICS CARRIER RI" #x15CE)
+    ("CANADIAN SYLLABICS CARRIER RA" #x15CF)
+    ("CANADIAN SYLLABICS CARRIER WU" #x15D0)
+    ("CANADIAN SYLLABICS CARRIER WO" #x15D1)
+    ("CANADIAN SYLLABICS CARRIER WE" #x15D2)
+    ("CANADIAN SYLLABICS CARRIER WEE" #x15D3)
+    ("CANADIAN SYLLABICS CARRIER WI" #x15D4)
+    ("CANADIAN SYLLABICS CARRIER WA" #x15D5)
+    ("CANADIAN SYLLABICS CARRIER HWU" #x15D6)
+    ("CANADIAN SYLLABICS CARRIER HWO" #x15D7)
+    ("CANADIAN SYLLABICS CARRIER HWE" #x15D8)
+    ("CANADIAN SYLLABICS CARRIER HWEE" #x15D9)
+    ("CANADIAN SYLLABICS CARRIER HWI" #x15DA)
+    ("CANADIAN SYLLABICS CARRIER HWA" #x15DB)
+    ("CANADIAN SYLLABICS CARRIER THU" #x15DC)
+    ("CANADIAN SYLLABICS CARRIER THO" #x15DD)
+    ("CANADIAN SYLLABICS CARRIER THE" #x15DE)
+    ("CANADIAN SYLLABICS CARRIER THEE" #x15DF)
+    ("CANADIAN SYLLABICS CARRIER THI" #x15E0)
+    ("CANADIAN SYLLABICS CARRIER THA" #x15E1)
+    ("CANADIAN SYLLABICS CARRIER TTU" #x15E2)
+    ("CANADIAN SYLLABICS CARRIER TTO" #x15E3)
+    ("CANADIAN SYLLABICS CARRIER TTE" #x15E4)
+    ("CANADIAN SYLLABICS CARRIER TTEE" #x15E5)
+    ("CANADIAN SYLLABICS CARRIER TTI" #x15E6)
+    ("CANADIAN SYLLABICS CARRIER TTA" #x15E7)
+    ("CANADIAN SYLLABICS CARRIER PU" #x15E8)
+    ("CANADIAN SYLLABICS CARRIER PO" #x15E9)
+    ("CANADIAN SYLLABICS CARRIER PE" #x15EA)
+    ("CANADIAN SYLLABICS CARRIER PEE" #x15EB)
+    ("CANADIAN SYLLABICS CARRIER PI" #x15EC)
+    ("CANADIAN SYLLABICS CARRIER PA" #x15ED)
+    ("CANADIAN SYLLABICS CARRIER P" #x15EE)
+    ("CANADIAN SYLLABICS CARRIER GU" #x15EF)
+    ("CANADIAN SYLLABICS CARRIER GO" #x15F0)
+    ("CANADIAN SYLLABICS CARRIER GE" #x15F1)
+    ("CANADIAN SYLLABICS CARRIER GEE" #x15F2)
+    ("CANADIAN SYLLABICS CARRIER GI" #x15F3)
+    ("CANADIAN SYLLABICS CARRIER GA" #x15F4)
+    ("CANADIAN SYLLABICS CARRIER KHU" #x15F5)
+    ("CANADIAN SYLLABICS CARRIER KHO" #x15F6)
+    ("CANADIAN SYLLABICS CARRIER KHE" #x15F7)
+    ("CANADIAN SYLLABICS CARRIER KHEE" #x15F8)
+    ("CANADIAN SYLLABICS CARRIER KHI" #x15F9)
+    ("CANADIAN SYLLABICS CARRIER KHA" #x15FA)
+    ("CANADIAN SYLLABICS CARRIER KKU" #x15FB)
+    ("CANADIAN SYLLABICS CARRIER KKO" #x15FC)
+    ("CANADIAN SYLLABICS CARRIER KKE" #x15FD)
+    ("CANADIAN SYLLABICS CARRIER KKEE" #x15FE)
+    ("CANADIAN SYLLABICS CARRIER KKI" #x15FF)
+    ("CANADIAN SYLLABICS CARRIER KKA" #x1600)
+    ("CANADIAN SYLLABICS CARRIER KK" #x1601)
+    ("CANADIAN SYLLABICS CARRIER NU" #x1602)
+    ("CANADIAN SYLLABICS CARRIER NO" #x1603)
+    ("CANADIAN SYLLABICS CARRIER NE" #x1604)
+    ("CANADIAN SYLLABICS CARRIER NEE" #x1605)
+    ("CANADIAN SYLLABICS CARRIER NI" #x1606)
+    ("CANADIAN SYLLABICS CARRIER NA" #x1607)
+    ("CANADIAN SYLLABICS CARRIER MU" #x1608)
+    ("CANADIAN SYLLABICS CARRIER MO" #x1609)
+    ("CANADIAN SYLLABICS CARRIER ME" #x160A)
+    ("CANADIAN SYLLABICS CARRIER MEE" #x160B)
+    ("CANADIAN SYLLABICS CARRIER MI" #x160C)
+    ("CANADIAN SYLLABICS CARRIER MA" #x160D)
+    ("CANADIAN SYLLABICS CARRIER YU" #x160E)
+    ("CANADIAN SYLLABICS CARRIER YO" #x160F)
+    ("CANADIAN SYLLABICS CARRIER YE" #x1610)
+    ("CANADIAN SYLLABICS CARRIER YEE" #x1611)
+    ("CANADIAN SYLLABICS CARRIER YI" #x1612)
+    ("CANADIAN SYLLABICS CARRIER YA" #x1613)
+    ("CANADIAN SYLLABICS CARRIER JU" #x1614)
+    ("CANADIAN SYLLABICS SAYISI JU" #x1615)
+    ("CANADIAN SYLLABICS CARRIER JO" #x1616)
+    ("CANADIAN SYLLABICS CARRIER JE" #x1617)
+    ("CANADIAN SYLLABICS CARRIER JEE" #x1618)
+    ("CANADIAN SYLLABICS CARRIER JI" #x1619)
+    ("CANADIAN SYLLABICS SAYISI JI" #x161A)
+    ("CANADIAN SYLLABICS CARRIER JA" #x161B)
+    ("CANADIAN SYLLABICS CARRIER JJU" #x161C)
+    ("CANADIAN SYLLABICS CARRIER JJO" #x161D)
+    ("CANADIAN SYLLABICS CARRIER JJE" #x161E)
+    ("CANADIAN SYLLABICS CARRIER JJEE" #x161F)
+    ("CANADIAN SYLLABICS CARRIER JJI" #x1620)
+    ("CANADIAN SYLLABICS CARRIER JJA" #x1621)
+    ("CANADIAN SYLLABICS CARRIER LU" #x1622)
+    ("CANADIAN SYLLABICS CARRIER LO" #x1623)
+    ("CANADIAN SYLLABICS CARRIER LE" #x1624)
+    ("CANADIAN SYLLABICS CARRIER LEE" #x1625)
+    ("CANADIAN SYLLABICS CARRIER LI" #x1626)
+    ("CANADIAN SYLLABICS CARRIER LA" #x1627)
+    ("CANADIAN SYLLABICS CARRIER DLU" #x1628)
+    ("CANADIAN SYLLABICS CARRIER DLO" #x1629)
+    ("CANADIAN SYLLABICS CARRIER DLE" #x162A)
+    ("CANADIAN SYLLABICS CARRIER DLEE" #x162B)
+    ("CANADIAN SYLLABICS CARRIER DLI" #x162C)
+    ("CANADIAN SYLLABICS CARRIER DLA" #x162D)
+    ("CANADIAN SYLLABICS CARRIER LHU" #x162E)
+    ("CANADIAN SYLLABICS CARRIER LHO" #x162F)
+    ("CANADIAN SYLLABICS CARRIER LHE" #x1630)
+    ("CANADIAN SYLLABICS CARRIER LHEE" #x1631)
+    ("CANADIAN SYLLABICS CARRIER LHI" #x1632)
+    ("CANADIAN SYLLABICS CARRIER LHA" #x1633)
+    ("CANADIAN SYLLABICS CARRIER TLHU" #x1634)
+    ("CANADIAN SYLLABICS CARRIER TLHO" #x1635)
+    ("CANADIAN SYLLABICS CARRIER TLHE" #x1636)
+    ("CANADIAN SYLLABICS CARRIER TLHEE" #x1637)
+    ("CANADIAN SYLLABICS CARRIER TLHI" #x1638)
+    ("CANADIAN SYLLABICS CARRIER TLHA" #x1639)
+    ("CANADIAN SYLLABICS CARRIER TLU" #x163A)
+    ("CANADIAN SYLLABICS CARRIER TLO" #x163B)
+    ("CANADIAN SYLLABICS CARRIER TLE" #x163C)
+    ("CANADIAN SYLLABICS CARRIER TLEE" #x163D)
+    ("CANADIAN SYLLABICS CARRIER TLI" #x163E)
+    ("CANADIAN SYLLABICS CARRIER TLA" #x163F)
+    ("CANADIAN SYLLABICS CARRIER ZU" #x1640)
+    ("CANADIAN SYLLABICS CARRIER ZO" #x1641)
+    ("CANADIAN SYLLABICS CARRIER ZE" #x1642)
+    ("CANADIAN SYLLABICS CARRIER ZEE" #x1643)
+    ("CANADIAN SYLLABICS CARRIER ZI" #x1644)
+    ("CANADIAN SYLLABICS CARRIER ZA" #x1645)
+    ("CANADIAN SYLLABICS CARRIER Z" #x1646)
+    ("CANADIAN SYLLABICS CARRIER INITIAL Z" #x1647)
+    ("CANADIAN SYLLABICS CARRIER DZU" #x1648)
+    ("CANADIAN SYLLABICS CARRIER DZO" #x1649)
+    ("CANADIAN SYLLABICS CARRIER DZE" #x164A)
+    ("CANADIAN SYLLABICS CARRIER DZEE" #x164B)
+    ("CANADIAN SYLLABICS CARRIER DZI" #x164C)
+    ("CANADIAN SYLLABICS CARRIER DZA" #x164D)
+    ("CANADIAN SYLLABICS CARRIER SU" #x164E)
+    ("CANADIAN SYLLABICS CARRIER SO" #x164F)
+    ("CANADIAN SYLLABICS CARRIER SE" #x1650)
+    ("CANADIAN SYLLABICS CARRIER SEE" #x1651)
+    ("CANADIAN SYLLABICS CARRIER SI" #x1652)
+    ("CANADIAN SYLLABICS CARRIER SA" #x1653)
+    ("CANADIAN SYLLABICS CARRIER SHU" #x1654)
+    ("CANADIAN SYLLABICS CARRIER SHO" #x1655)
+    ("CANADIAN SYLLABICS CARRIER SHE" #x1656)
+    ("CANADIAN SYLLABICS CARRIER SHEE" #x1657)
+    ("CANADIAN SYLLABICS CARRIER SHI" #x1658)
+    ("CANADIAN SYLLABICS CARRIER SHA" #x1659)
+    ("CANADIAN SYLLABICS CARRIER SH" #x165A)
+    ("CANADIAN SYLLABICS CARRIER TSU" #x165B)
+    ("CANADIAN SYLLABICS CARRIER TSO" #x165C)
+    ("CANADIAN SYLLABICS CARRIER TSE" #x165D)
+    ("CANADIAN SYLLABICS CARRIER TSEE" #x165E)
+    ("CANADIAN SYLLABICS CARRIER TSI" #x165F)
+    ("CANADIAN SYLLABICS CARRIER TSA" #x1660)
+    ("CANADIAN SYLLABICS CARRIER CHU" #x1661)
+    ("CANADIAN SYLLABICS CARRIER CHO" #x1662)
+    ("CANADIAN SYLLABICS CARRIER CHE" #x1663)
+    ("CANADIAN SYLLABICS CARRIER CHEE" #x1664)
+    ("CANADIAN SYLLABICS CARRIER CHI" #x1665)
+    ("CANADIAN SYLLABICS CARRIER CHA" #x1666)
+    ("CANADIAN SYLLABICS CARRIER TTSU" #x1667)
+    ("CANADIAN SYLLABICS CARRIER TTSO" #x1668)
+    ("CANADIAN SYLLABICS CARRIER TTSE" #x1669)
+    ("CANADIAN SYLLABICS CARRIER TTSEE" #x166A)
+    ("CANADIAN SYLLABICS CARRIER TTSI" #x166B)
+    ("CANADIAN SYLLABICS CARRIER TTSA" #x166C)
+    ("CANADIAN SYLLABICS CHI SIGN" #x166D)
+    ("CANADIAN SYLLABICS FULL STOP" #x166E)
+    ("CANADIAN SYLLABICS QAI" #x166F)
+    ("CANADIAN SYLLABICS NGAI" #x1670)
+    ("CANADIAN SYLLABICS NNGI" #x1671)
+    ("CANADIAN SYLLABICS NNGII" #x1672)
+    ("CANADIAN SYLLABICS NNGO" #x1673)
+    ("CANADIAN SYLLABICS NNGOO" #x1674)
+    ("CANADIAN SYLLABICS NNGA" #x1675)
+    ("CANADIAN SYLLABICS NNGAA" #x1676)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01680-0169F.el b/lisp/nxml/char-name/unicode/01680-0169F.el
new file mode 100644 (file)
index 0000000..827b70e
--- /dev/null
@@ -0,0 +1,31 @@
+(nxml-define-char-name-set 'ogham
+  '(("OGHAM SPACE MARK" #x1680)
+    ("OGHAM LETTER BEITH" #x1681)
+    ("OGHAM LETTER LUIS" #x1682)
+    ("OGHAM LETTER FEARN" #x1683)
+    ("OGHAM LETTER SAIL" #x1684)
+    ("OGHAM LETTER NION" #x1685)
+    ("OGHAM LETTER UATH" #x1686)
+    ("OGHAM LETTER DAIR" #x1687)
+    ("OGHAM LETTER TINNE" #x1688)
+    ("OGHAM LETTER COLL" #x1689)
+    ("OGHAM LETTER CEIRT" #x168A)
+    ("OGHAM LETTER MUIN" #x168B)
+    ("OGHAM LETTER GORT" #x168C)
+    ("OGHAM LETTER NGEADAL" #x168D)
+    ("OGHAM LETTER STRAIF" #x168E)
+    ("OGHAM LETTER RUIS" #x168F)
+    ("OGHAM LETTER AILM" #x1690)
+    ("OGHAM LETTER ONN" #x1691)
+    ("OGHAM LETTER UR" #x1692)
+    ("OGHAM LETTER EADHADH" #x1693)
+    ("OGHAM LETTER IODHADH" #x1694)
+    ("OGHAM LETTER EABHADH" #x1695)
+    ("OGHAM LETTER OR" #x1696)
+    ("OGHAM LETTER UILLEANN" #x1697)
+    ("OGHAM LETTER IFIN" #x1698)
+    ("OGHAM LETTER EAMHANCHOLL" #x1699)
+    ("OGHAM LETTER PEITH" #x169A)
+    ("OGHAM FEATHER MARK" #x169B)
+    ("OGHAM REVERSED FEATHER MARK" #x169C)
+    ))
diff --git a/lisp/nxml/char-name/unicode/016A0-016FF.el b/lisp/nxml/char-name/unicode/016A0-016FF.el
new file mode 100644 (file)
index 0000000..ce67a40
--- /dev/null
@@ -0,0 +1,83 @@
+(nxml-define-char-name-set 'runic
+  '(("RUNIC LETTER FEHU FEOH FE F" #x16A0)
+    ("RUNIC LETTER V" #x16A1)
+    ("RUNIC LETTER URUZ UR U" #x16A2)
+    ("RUNIC LETTER YR" #x16A3)
+    ("RUNIC LETTER Y" #x16A4)
+    ("RUNIC LETTER W" #x16A5)
+    ("RUNIC LETTER THURISAZ THURS THORN" #x16A6)
+    ("RUNIC LETTER ETH" #x16A7)
+    ("RUNIC LETTER ANSUZ A" #x16A8)
+    ("RUNIC LETTER OS O" #x16A9)
+    ("RUNIC LETTER AC A" #x16AA)
+    ("RUNIC LETTER AESC" #x16AB)
+    ("RUNIC LETTER LONG-BRANCH-OSS O" #x16AC)
+    ("RUNIC LETTER SHORT-TWIG-OSS O" #x16AD)
+    ("RUNIC LETTER O" #x16AE)
+    ("RUNIC LETTER OE" #x16AF)
+    ("RUNIC LETTER ON" #x16B0)
+    ("RUNIC LETTER RAIDO RAD REID R" #x16B1)
+    ("RUNIC LETTER KAUNA" #x16B2)
+    ("RUNIC LETTER CEN" #x16B3)
+    ("RUNIC LETTER KAUN K" #x16B4)
+    ("RUNIC LETTER G" #x16B5)
+    ("RUNIC LETTER ENG" #x16B6)
+    ("RUNIC LETTER GEBO GYFU G" #x16B7)
+    ("RUNIC LETTER GAR" #x16B8)
+    ("RUNIC LETTER WUNJO WYNN W" #x16B9)
+    ("RUNIC LETTER HAGLAZ H" #x16BA)
+    ("RUNIC LETTER HAEGL H" #x16BB)
+    ("RUNIC LETTER LONG-BRANCH-HAGALL H" #x16BC)
+    ("RUNIC LETTER SHORT-TWIG-HAGALL H" #x16BD)
+    ("RUNIC LETTER NAUDIZ NYD NAUD N" #x16BE)
+    ("RUNIC LETTER SHORT-TWIG-NAUD N" #x16BF)
+    ("RUNIC LETTER DOTTED-N" #x16C0)
+    ("RUNIC LETTER ISAZ IS ISS I" #x16C1)
+    ("RUNIC LETTER E" #x16C2)
+    ("RUNIC LETTER JERAN J" #x16C3)
+    ("RUNIC LETTER GER" #x16C4)
+    ("RUNIC LETTER LONG-BRANCH-AR AE" #x16C5)
+    ("RUNIC LETTER SHORT-TWIG-AR A" #x16C6)
+    ("RUNIC LETTER IWAZ EOH" #x16C7)
+    ("RUNIC LETTER PERTHO PEORTH P" #x16C8)
+    ("RUNIC LETTER ALGIZ EOLHX" #x16C9)
+    ("RUNIC LETTER SOWILO S" #x16CA)
+    ("RUNIC LETTER SIGEL LONG-BRANCH-SOL S" #x16CB)
+    ("RUNIC LETTER SHORT-TWIG-SOL S" #x16CC)
+    ("RUNIC LETTER C" #x16CD)
+    ("RUNIC LETTER Z" #x16CE)
+    ("RUNIC LETTER TIWAZ TIR TYR T" #x16CF)
+    ("RUNIC LETTER SHORT-TWIG-TYR T" #x16D0)
+    ("RUNIC LETTER D" #x16D1)
+    ("RUNIC LETTER BERKANAN BEORC BJARKAN B" #x16D2)
+    ("RUNIC LETTER SHORT-TWIG-BJARKAN B" #x16D3)
+    ("RUNIC LETTER DOTTED-P" #x16D4)
+    ("RUNIC LETTER OPEN-P" #x16D5)
+    ("RUNIC LETTER EHWAZ EH E" #x16D6)
+    ("RUNIC LETTER MANNAZ MAN M" #x16D7)
+    ("RUNIC LETTER LONG-BRANCH-MADR M" #x16D8)
+    ("RUNIC LETTER SHORT-TWIG-MADR M" #x16D9)
+    ("RUNIC LETTER LAUKAZ LAGU LOGR L" #x16DA)
+    ("RUNIC LETTER DOTTED-L" #x16DB)
+    ("RUNIC LETTER INGWAZ" #x16DC)
+    ("RUNIC LETTER ING" #x16DD)
+    ("RUNIC LETTER DAGAZ DAEG D" #x16DE)
+    ("RUNIC LETTER OTHALAN ETHEL O" #x16DF)
+    ("RUNIC LETTER EAR" #x16E0)
+    ("RUNIC LETTER IOR" #x16E1)
+    ("RUNIC LETTER CWEORTH" #x16E2)
+    ("RUNIC LETTER CALC" #x16E3)
+    ("RUNIC LETTER CEALC" #x16E4)
+    ("RUNIC LETTER STAN" #x16E5)
+    ("RUNIC LETTER LONG-BRANCH-YR" #x16E6)
+    ("RUNIC LETTER SHORT-TWIG-YR" #x16E7)
+    ("RUNIC LETTER ICELANDIC-YR" #x16E8)
+    ("RUNIC LETTER Q" #x16E9)
+    ("RUNIC LETTER X" #x16EA)
+    ("RUNIC SINGLE PUNCTUATION" #x16EB)
+    ("RUNIC MULTIPLE PUNCTUATION" #x16EC)
+    ("RUNIC CROSS PUNCTUATION" #x16ED)
+    ("RUNIC ARLAUG SYMBOL" #x16EE)
+    ("RUNIC TVIMADUR SYMBOL" #x16EF)
+    ("RUNIC BELGTHOR SYMBOL" #x16F0)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01700-0171F.el b/lisp/nxml/char-name/unicode/01700-0171F.el
new file mode 100644 (file)
index 0000000..b305006
--- /dev/null
@@ -0,0 +1,22 @@
+(nxml-define-char-name-set 'tagalog
+  '(("TAGALOG LETTER A" #x1700)
+    ("TAGALOG LETTER I" #x1701)
+    ("TAGALOG LETTER U" #x1702)
+    ("TAGALOG LETTER KA" #x1703)
+    ("TAGALOG LETTER GA" #x1704)
+    ("TAGALOG LETTER NGA" #x1705)
+    ("TAGALOG LETTER TA" #x1706)
+    ("TAGALOG LETTER DA" #x1707)
+    ("TAGALOG LETTER NA" #x1708)
+    ("TAGALOG LETTER PA" #x1709)
+    ("TAGALOG LETTER BA" #x170A)
+    ("TAGALOG LETTER MA" #x170B)
+    ("TAGALOG LETTER YA" #x170C)
+    ("TAGALOG LETTER LA" #x170E)
+    ("TAGALOG LETTER WA" #x170F)
+    ("TAGALOG LETTER SA" #x1710)
+    ("TAGALOG LETTER HA" #x1711)
+    ("TAGALOG VOWEL SIGN I" #x1712)
+    ("TAGALOG VOWEL SIGN U" #x1713)
+    ("TAGALOG SIGN VIRAMA" #x1714)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01720-0173F.el b/lisp/nxml/char-name/unicode/01720-0173F.el
new file mode 100644 (file)
index 0000000..09f61ea
--- /dev/null
@@ -0,0 +1,25 @@
+(nxml-define-char-name-set 'hanunoo
+  '(("HANUNOO LETTER A" #x1720)
+    ("HANUNOO LETTER I" #x1721)
+    ("HANUNOO LETTER U" #x1722)
+    ("HANUNOO LETTER KA" #x1723)
+    ("HANUNOO LETTER GA" #x1724)
+    ("HANUNOO LETTER NGA" #x1725)
+    ("HANUNOO LETTER TA" #x1726)
+    ("HANUNOO LETTER DA" #x1727)
+    ("HANUNOO LETTER NA" #x1728)
+    ("HANUNOO LETTER PA" #x1729)
+    ("HANUNOO LETTER BA" #x172A)
+    ("HANUNOO LETTER MA" #x172B)
+    ("HANUNOO LETTER YA" #x172C)
+    ("HANUNOO LETTER RA" #x172D)
+    ("HANUNOO LETTER LA" #x172E)
+    ("HANUNOO LETTER WA" #x172F)
+    ("HANUNOO LETTER SA" #x1730)
+    ("HANUNOO LETTER HA" #x1731)
+    ("HANUNOO VOWEL SIGN I" #x1732)
+    ("HANUNOO VOWEL SIGN U" #x1733)
+    ("HANUNOO SIGN PAMUDPOD" #x1734)
+    ("PHILIPPINE SINGLE PUNCTUATION" #x1735)
+    ("PHILIPPINE DOUBLE PUNCTUATION" #x1736)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01740-0175F.el b/lisp/nxml/char-name/unicode/01740-0175F.el
new file mode 100644 (file)
index 0000000..b507c90
--- /dev/null
@@ -0,0 +1,22 @@
+(nxml-define-char-name-set 'buhid
+  '(("BUHID LETTER A" #x1740)
+    ("BUHID LETTER I" #x1741)
+    ("BUHID LETTER U" #x1742)
+    ("BUHID LETTER KA" #x1743)
+    ("BUHID LETTER GA" #x1744)
+    ("BUHID LETTER NGA" #x1745)
+    ("BUHID LETTER TA" #x1746)
+    ("BUHID LETTER DA" #x1747)
+    ("BUHID LETTER NA" #x1748)
+    ("BUHID LETTER PA" #x1749)
+    ("BUHID LETTER BA" #x174A)
+    ("BUHID LETTER MA" #x174B)
+    ("BUHID LETTER YA" #x174C)
+    ("BUHID LETTER RA" #x174D)
+    ("BUHID LETTER LA" #x174E)
+    ("BUHID LETTER WA" #x174F)
+    ("BUHID LETTER SA" #x1750)
+    ("BUHID LETTER HA" #x1751)
+    ("BUHID VOWEL SIGN I" #x1752)
+    ("BUHID VOWEL SIGN U" #x1753)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01760-0177F.el b/lisp/nxml/char-name/unicode/01760-0177F.el
new file mode 100644 (file)
index 0000000..e824c2b
--- /dev/null
@@ -0,0 +1,20 @@
+(nxml-define-char-name-set 'tagbanwa
+  '(("TAGBANWA LETTER A" #x1760)
+    ("TAGBANWA LETTER I" #x1761)
+    ("TAGBANWA LETTER U" #x1762)
+    ("TAGBANWA LETTER KA" #x1763)
+    ("TAGBANWA LETTER GA" #x1764)
+    ("TAGBANWA LETTER NGA" #x1765)
+    ("TAGBANWA LETTER TA" #x1766)
+    ("TAGBANWA LETTER DA" #x1767)
+    ("TAGBANWA LETTER NA" #x1768)
+    ("TAGBANWA LETTER PA" #x1769)
+    ("TAGBANWA LETTER BA" #x176A)
+    ("TAGBANWA LETTER MA" #x176B)
+    ("TAGBANWA LETTER YA" #x176C)
+    ("TAGBANWA LETTER LA" #x176E)
+    ("TAGBANWA LETTER WA" #x176F)
+    ("TAGBANWA LETTER SA" #x1770)
+    ("TAGBANWA VOWEL SIGN I" #x1772)
+    ("TAGBANWA VOWEL SIGN U" #x1773)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01780-017FF.el b/lisp/nxml/char-name/unicode/01780-017FF.el
new file mode 100644 (file)
index 0000000..e9671c9
--- /dev/null
@@ -0,0 +1,105 @@
+(nxml-define-char-name-set 'khmer
+  '(("KHMER LETTER KA" #x1780)
+    ("KHMER LETTER KHA" #x1781)
+    ("KHMER LETTER KO" #x1782)
+    ("KHMER LETTER KHO" #x1783)
+    ("KHMER LETTER NGO" #x1784)
+    ("KHMER LETTER CA" #x1785)
+    ("KHMER LETTER CHA" #x1786)
+    ("KHMER LETTER CO" #x1787)
+    ("KHMER LETTER CHO" #x1788)
+    ("KHMER LETTER NYO" #x1789)
+    ("KHMER LETTER DA" #x178A)
+    ("KHMER LETTER TTHA" #x178B)
+    ("KHMER LETTER DO" #x178C)
+    ("KHMER LETTER TTHO" #x178D)
+    ("KHMER LETTER NNO" #x178E)
+    ("KHMER LETTER TA" #x178F)
+    ("KHMER LETTER THA" #x1790)
+    ("KHMER LETTER TO" #x1791)
+    ("KHMER LETTER THO" #x1792)
+    ("KHMER LETTER NO" #x1793)
+    ("KHMER LETTER BA" #x1794)
+    ("KHMER LETTER PHA" #x1795)
+    ("KHMER LETTER PO" #x1796)
+    ("KHMER LETTER PHO" #x1797)
+    ("KHMER LETTER MO" #x1798)
+    ("KHMER LETTER YO" #x1799)
+    ("KHMER LETTER RO" #x179A)
+    ("KHMER LETTER LO" #x179B)
+    ("KHMER LETTER VO" #x179C)
+    ("KHMER LETTER SHA" #x179D)
+    ("KHMER LETTER SSO" #x179E)
+    ("KHMER LETTER SA" #x179F)
+    ("KHMER LETTER HA" #x17A0)
+    ("KHMER LETTER LA" #x17A1)
+    ("KHMER LETTER QA" #x17A2)
+    ("KHMER INDEPENDENT VOWEL QAQ" #x17A3)
+    ("KHMER INDEPENDENT VOWEL QAA" #x17A4)
+    ("KHMER INDEPENDENT VOWEL QI" #x17A5)
+    ("KHMER INDEPENDENT VOWEL QII" #x17A6)
+    ("KHMER INDEPENDENT VOWEL QU" #x17A7)
+    ("KHMER INDEPENDENT VOWEL QUK" #x17A8)
+    ("KHMER INDEPENDENT VOWEL QUU" #x17A9)
+    ("KHMER INDEPENDENT VOWEL QUUV" #x17AA)
+    ("KHMER INDEPENDENT VOWEL RY" #x17AB)
+    ("KHMER INDEPENDENT VOWEL RYY" #x17AC)
+    ("KHMER INDEPENDENT VOWEL LY" #x17AD)
+    ("KHMER INDEPENDENT VOWEL LYY" #x17AE)
+    ("KHMER INDEPENDENT VOWEL QE" #x17AF)
+    ("KHMER INDEPENDENT VOWEL QAI" #x17B0)
+    ("KHMER INDEPENDENT VOWEL QOO TYPE ONE" #x17B1)
+    ("KHMER INDEPENDENT VOWEL QOO TYPE TWO" #x17B2)
+    ("KHMER INDEPENDENT VOWEL QAU" #x17B3)
+    ("KHMER VOWEL INHERENT AQ" #x17B4)
+    ("KHMER VOWEL INHERENT AA" #x17B5)
+    ("KHMER VOWEL SIGN AA" #x17B6)
+    ("KHMER VOWEL SIGN I" #x17B7)
+    ("KHMER VOWEL SIGN II" #x17B8)
+    ("KHMER VOWEL SIGN Y" #x17B9)
+    ("KHMER VOWEL SIGN YY" #x17BA)
+    ("KHMER VOWEL SIGN U" #x17BB)
+    ("KHMER VOWEL SIGN UU" #x17BC)
+    ("KHMER VOWEL SIGN UA" #x17BD)
+    ("KHMER VOWEL SIGN OE" #x17BE)
+    ("KHMER VOWEL SIGN YA" #x17BF)
+    ("KHMER VOWEL SIGN IE" #x17C0)
+    ("KHMER VOWEL SIGN E" #x17C1)
+    ("KHMER VOWEL SIGN AE" #x17C2)
+    ("KHMER VOWEL SIGN AI" #x17C3)
+    ("KHMER VOWEL SIGN OO" #x17C4)
+    ("KHMER VOWEL SIGN AU" #x17C5)
+    ("KHMER SIGN NIKAHIT" #x17C6)
+    ("KHMER SIGN REAHMUK" #x17C7)
+    ("KHMER SIGN YUUKALEAPINTU" #x17C8)
+    ("KHMER SIGN MUUSIKATOAN" #x17C9)
+    ("KHMER SIGN TRIISAP" #x17CA)
+    ("KHMER SIGN BANTOC" #x17CB)
+    ("KHMER SIGN ROBAT" #x17CC)
+    ("KHMER SIGN TOANDAKHIAT" #x17CD)
+    ("KHMER SIGN KAKABAT" #x17CE)
+    ("KHMER SIGN AHSDA" #x17CF)
+    ("KHMER SIGN SAMYOK SANNYA" #x17D0)
+    ("KHMER SIGN VIRIAM" #x17D1)
+    ("KHMER SIGN COENG" #x17D2)
+    ("KHMER SIGN BATHAMASAT" #x17D3)
+    ("KHMER SIGN KHAN" #x17D4)
+    ("KHMER SIGN BARIYOOSAN" #x17D5)
+    ("KHMER SIGN CAMNUC PII KUUH" #x17D6)
+    ("KHMER SIGN LEK TOO" #x17D7)
+    ("KHMER SIGN BEYYAL" #x17D8)
+    ("KHMER SIGN PHNAEK MUAN" #x17D9)
+    ("KHMER SIGN KOOMUUT" #x17DA)
+    ("KHMER CURRENCY SYMBOL RIEL" #x17DB)
+    ("KHMER SIGN AVAKRAHASANYA" #x17DC)
+    ("KHMER DIGIT ZERO" #x17E0)
+    ("KHMER DIGIT ONE" #x17E1)
+    ("KHMER DIGIT TWO" #x17E2)
+    ("KHMER DIGIT THREE" #x17E3)
+    ("KHMER DIGIT FOUR" #x17E4)
+    ("KHMER DIGIT FIVE" #x17E5)
+    ("KHMER DIGIT SIX" #x17E6)
+    ("KHMER DIGIT SEVEN" #x17E7)
+    ("KHMER DIGIT EIGHT" #x17E8)
+    ("KHMER DIGIT NINE" #x17E9)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01800-018AF.el b/lisp/nxml/char-name/unicode/01800-018AF.el
new file mode 100644 (file)
index 0000000..fd3e245
--- /dev/null
@@ -0,0 +1,157 @@
+(nxml-define-char-name-set 'mongolian
+  '(("MONGOLIAN BIRGA" #x1800)
+    ("MONGOLIAN ELLIPSIS" #x1801)
+    ("MONGOLIAN COMMA" #x1802)
+    ("MONGOLIAN FULL STOP" #x1803)
+    ("MONGOLIAN COLON" #x1804)
+    ("MONGOLIAN FOUR DOTS" #x1805)
+    ("MONGOLIAN TODO SOFT HYPHEN" #x1806)
+    ("MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER" #x1807)
+    ("MONGOLIAN MANCHU COMMA" #x1808)
+    ("MONGOLIAN MANCHU FULL STOP" #x1809)
+    ("MONGOLIAN NIRUGU" #x180A)
+    ("MONGOLIAN FREE VARIATION SELECTOR ONE" #x180B)
+    ("MONGOLIAN FREE VARIATION SELECTOR TWO" #x180C)
+    ("MONGOLIAN FREE VARIATION SELECTOR THREE" #x180D)
+    ("MONGOLIAN VOWEL SEPARATOR" #x180E)
+    ("MONGOLIAN DIGIT ZERO" #x1810)
+    ("MONGOLIAN DIGIT ONE" #x1811)
+    ("MONGOLIAN DIGIT TWO" #x1812)
+    ("MONGOLIAN DIGIT THREE" #x1813)
+    ("MONGOLIAN DIGIT FOUR" #x1814)
+    ("MONGOLIAN DIGIT FIVE" #x1815)
+    ("MONGOLIAN DIGIT SIX" #x1816)
+    ("MONGOLIAN DIGIT SEVEN" #x1817)
+    ("MONGOLIAN DIGIT EIGHT" #x1818)
+    ("MONGOLIAN DIGIT NINE" #x1819)
+    ("MONGOLIAN LETTER A" #x1820)
+    ("MONGOLIAN LETTER E" #x1821)
+    ("MONGOLIAN LETTER I" #x1822)
+    ("MONGOLIAN LETTER O" #x1823)
+    ("MONGOLIAN LETTER U" #x1824)
+    ("MONGOLIAN LETTER OE" #x1825)
+    ("MONGOLIAN LETTER UE" #x1826)
+    ("MONGOLIAN LETTER EE" #x1827)
+    ("MONGOLIAN LETTER NA" #x1828)
+    ("MONGOLIAN LETTER ANG" #x1829)
+    ("MONGOLIAN LETTER BA" #x182A)
+    ("MONGOLIAN LETTER PA" #x182B)
+    ("MONGOLIAN LETTER QA" #x182C)
+    ("MONGOLIAN LETTER GA" #x182D)
+    ("MONGOLIAN LETTER MA" #x182E)
+    ("MONGOLIAN LETTER LA" #x182F)
+    ("MONGOLIAN LETTER SA" #x1830)
+    ("MONGOLIAN LETTER SHA" #x1831)
+    ("MONGOLIAN LETTER TA" #x1832)
+    ("MONGOLIAN LETTER DA" #x1833)
+    ("MONGOLIAN LETTER CHA" #x1834)
+    ("MONGOLIAN LETTER JA" #x1835)
+    ("MONGOLIAN LETTER YA" #x1836)
+    ("MONGOLIAN LETTER RA" #x1837)
+    ("MONGOLIAN LETTER WA" #x1838)
+    ("MONGOLIAN LETTER FA" #x1839)
+    ("MONGOLIAN LETTER KA" #x183A)
+    ("MONGOLIAN LETTER KHA" #x183B)
+    ("MONGOLIAN LETTER TSA" #x183C)
+    ("MONGOLIAN LETTER ZA" #x183D)
+    ("MONGOLIAN LETTER HAA" #x183E)
+    ("MONGOLIAN LETTER ZRA" #x183F)
+    ("MONGOLIAN LETTER LHA" #x1840)
+    ("MONGOLIAN LETTER ZHI" #x1841)
+    ("MONGOLIAN LETTER CHI" #x1842)
+    ("MONGOLIAN LETTER TODO LONG VOWEL SIGN" #x1843)
+    ("MONGOLIAN LETTER TODO E" #x1844)
+    ("MONGOLIAN LETTER TODO I" #x1845)
+    ("MONGOLIAN LETTER TODO O" #x1846)
+    ("MONGOLIAN LETTER TODO U" #x1847)
+    ("MONGOLIAN LETTER TODO OE" #x1848)
+    ("MONGOLIAN LETTER TODO UE" #x1849)
+    ("MONGOLIAN LETTER TODO ANG" #x184A)
+    ("MONGOLIAN LETTER TODO BA" #x184B)
+    ("MONGOLIAN LETTER TODO PA" #x184C)
+    ("MONGOLIAN LETTER TODO QA" #x184D)
+    ("MONGOLIAN LETTER TODO GA" #x184E)
+    ("MONGOLIAN LETTER TODO MA" #x184F)
+    ("MONGOLIAN LETTER TODO TA" #x1850)
+    ("MONGOLIAN LETTER TODO DA" #x1851)
+    ("MONGOLIAN LETTER TODO CHA" #x1852)
+    ("MONGOLIAN LETTER TODO JA" #x1853)
+    ("MONGOLIAN LETTER TODO TSA" #x1854)
+    ("MONGOLIAN LETTER TODO YA" #x1855)
+    ("MONGOLIAN LETTER TODO WA" #x1856)
+    ("MONGOLIAN LETTER TODO KA" #x1857)
+    ("MONGOLIAN LETTER TODO GAA" #x1858)
+    ("MONGOLIAN LETTER TODO HAA" #x1859)
+    ("MONGOLIAN LETTER TODO JIA" #x185A)
+    ("MONGOLIAN LETTER TODO NIA" #x185B)
+    ("MONGOLIAN LETTER TODO DZA" #x185C)
+    ("MONGOLIAN LETTER SIBE E" #x185D)
+    ("MONGOLIAN LETTER SIBE I" #x185E)
+    ("MONGOLIAN LETTER SIBE IY" #x185F)
+    ("MONGOLIAN LETTER SIBE UE" #x1860)
+    ("MONGOLIAN LETTER SIBE U" #x1861)
+    ("MONGOLIAN LETTER SIBE ANG" #x1862)
+    ("MONGOLIAN LETTER SIBE KA" #x1863)
+    ("MONGOLIAN LETTER SIBE GA" #x1864)
+    ("MONGOLIAN LETTER SIBE HA" #x1865)
+    ("MONGOLIAN LETTER SIBE PA" #x1866)
+    ("MONGOLIAN LETTER SIBE SHA" #x1867)
+    ("MONGOLIAN LETTER SIBE TA" #x1868)
+    ("MONGOLIAN LETTER SIBE DA" #x1869)
+    ("MONGOLIAN LETTER SIBE JA" #x186A)
+    ("MONGOLIAN LETTER SIBE FA" #x186B)
+    ("MONGOLIAN LETTER SIBE GAA" #x186C)
+    ("MONGOLIAN LETTER SIBE HAA" #x186D)
+    ("MONGOLIAN LETTER SIBE TSA" #x186E)
+    ("MONGOLIAN LETTER SIBE ZA" #x186F)
+    ("MONGOLIAN LETTER SIBE RAA" #x1870)
+    ("MONGOLIAN LETTER SIBE CHA" #x1871)
+    ("MONGOLIAN LETTER SIBE ZHA" #x1872)
+    ("MONGOLIAN LETTER MANCHU I" #x1873)
+    ("MONGOLIAN LETTER MANCHU KA" #x1874)
+    ("MONGOLIAN LETTER MANCHU RA" #x1875)
+    ("MONGOLIAN LETTER MANCHU FA" #x1876)
+    ("MONGOLIAN LETTER MANCHU ZHA" #x1877)
+    ("MONGOLIAN LETTER ALI GALI ANUSVARA ONE" #x1880)
+    ("MONGOLIAN LETTER ALI GALI VISARGA ONE" #x1881)
+    ("MONGOLIAN LETTER ALI GALI DAMARU" #x1882)
+    ("MONGOLIAN LETTER ALI GALI UBADAMA" #x1883)
+    ("MONGOLIAN LETTER ALI GALI INVERTED UBADAMA" #x1884)
+    ("MONGOLIAN LETTER ALI GALI BALUDA" #x1885)
+    ("MONGOLIAN LETTER ALI GALI THREE BALUDA" #x1886)
+    ("MONGOLIAN LETTER ALI GALI A" #x1887)
+    ("MONGOLIAN LETTER ALI GALI I" #x1888)
+    ("MONGOLIAN LETTER ALI GALI KA" #x1889)
+    ("MONGOLIAN LETTER ALI GALI NGA" #x188A)
+    ("MONGOLIAN LETTER ALI GALI CA" #x188B)
+    ("MONGOLIAN LETTER ALI GALI TTA" #x188C)
+    ("MONGOLIAN LETTER ALI GALI TTHA" #x188D)
+    ("MONGOLIAN LETTER ALI GALI DDA" #x188E)
+    ("MONGOLIAN LETTER ALI GALI NNA" #x188F)
+    ("MONGOLIAN LETTER ALI GALI TA" #x1890)
+    ("MONGOLIAN LETTER ALI GALI DA" #x1891)
+    ("MONGOLIAN LETTER ALI GALI PA" #x1892)
+    ("MONGOLIAN LETTER ALI GALI PHA" #x1893)
+    ("MONGOLIAN LETTER ALI GALI SSA" #x1894)
+    ("MONGOLIAN LETTER ALI GALI ZHA" #x1895)
+    ("MONGOLIAN LETTER ALI GALI ZA" #x1896)
+    ("MONGOLIAN LETTER ALI GALI AH" #x1897)
+    ("MONGOLIAN LETTER TODO ALI GALI TA" #x1898)
+    ("MONGOLIAN LETTER TODO ALI GALI ZHA" #x1899)
+    ("MONGOLIAN LETTER MANCHU ALI GALI GHA" #x189A)
+    ("MONGOLIAN LETTER MANCHU ALI GALI NGA" #x189B)
+    ("MONGOLIAN LETTER MANCHU ALI GALI CA" #x189C)
+    ("MONGOLIAN LETTER MANCHU ALI GALI JHA" #x189D)
+    ("MONGOLIAN LETTER MANCHU ALI GALI TTA" #x189E)
+    ("MONGOLIAN LETTER MANCHU ALI GALI DDHA" #x189F)
+    ("MONGOLIAN LETTER MANCHU ALI GALI TA" #x18A0)
+    ("MONGOLIAN LETTER MANCHU ALI GALI DHA" #x18A1)
+    ("MONGOLIAN LETTER MANCHU ALI GALI SSA" #x18A2)
+    ("MONGOLIAN LETTER MANCHU ALI GALI CYA" #x18A3)
+    ("MONGOLIAN LETTER MANCHU ALI GALI ZHA" #x18A4)
+    ("MONGOLIAN LETTER MANCHU ALI GALI ZA" #x18A5)
+    ("MONGOLIAN LETTER ALI GALI HALF U" #x18A6)
+    ("MONGOLIAN LETTER ALI GALI HALF YA" #x18A7)
+    ("MONGOLIAN LETTER MANCHU ALI GALI BHA" #x18A8)
+    ("MONGOLIAN LETTER ALI GALI DAGALGA" #x18A9)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01E00-01EFF.el b/lisp/nxml/char-name/unicode/01E00-01EFF.el
new file mode 100644 (file)
index 0000000..618b74c
--- /dev/null
@@ -0,0 +1,248 @@
+(nxml-define-char-name-set 'latin-extended-additional
+  '(("LATIN CAPITAL LETTER A WITH RING BELOW" #x1E00)
+    ("LATIN SMALL LETTER A WITH RING BELOW" #x1E01)
+    ("LATIN CAPITAL LETTER B WITH DOT ABOVE" #x1E02)
+    ("LATIN SMALL LETTER B WITH DOT ABOVE" #x1E03)
+    ("LATIN CAPITAL LETTER B WITH DOT BELOW" #x1E04)
+    ("LATIN SMALL LETTER B WITH DOT BELOW" #x1E05)
+    ("LATIN CAPITAL LETTER B WITH LINE BELOW" #x1E06)
+    ("LATIN SMALL LETTER B WITH LINE BELOW" #x1E07)
+    ("LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE" #x1E08)
+    ("LATIN SMALL LETTER C WITH CEDILLA AND ACUTE" #x1E09)
+    ("LATIN CAPITAL LETTER D WITH DOT ABOVE" #x1E0A)
+    ("LATIN SMALL LETTER D WITH DOT ABOVE" #x1E0B)
+    ("LATIN CAPITAL LETTER D WITH DOT BELOW" #x1E0C)
+    ("LATIN SMALL LETTER D WITH DOT BELOW" #x1E0D)
+    ("LATIN CAPITAL LETTER D WITH LINE BELOW" #x1E0E)
+    ("LATIN SMALL LETTER D WITH LINE BELOW" #x1E0F)
+    ("LATIN CAPITAL LETTER D WITH CEDILLA" #x1E10)
+    ("LATIN SMALL LETTER D WITH CEDILLA" #x1E11)
+    ("LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW" #x1E12)
+    ("LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW" #x1E13)
+    ("LATIN CAPITAL LETTER E WITH MACRON AND GRAVE" #x1E14)
+    ("LATIN SMALL LETTER E WITH MACRON AND GRAVE" #x1E15)
+    ("LATIN CAPITAL LETTER E WITH MACRON AND ACUTE" #x1E16)
+    ("LATIN SMALL LETTER E WITH MACRON AND ACUTE" #x1E17)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW" #x1E18)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW" #x1E19)
+    ("LATIN CAPITAL LETTER E WITH TILDE BELOW" #x1E1A)
+    ("LATIN SMALL LETTER E WITH TILDE BELOW" #x1E1B)
+    ("LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE" #x1E1C)
+    ("LATIN SMALL LETTER E WITH CEDILLA AND BREVE" #x1E1D)
+    ("LATIN CAPITAL LETTER F WITH DOT ABOVE" #x1E1E)
+    ("LATIN SMALL LETTER F WITH DOT ABOVE" #x1E1F)
+    ("LATIN CAPITAL LETTER G WITH MACRON" #x1E20)
+    ("LATIN SMALL LETTER G WITH MACRON" #x1E21)
+    ("LATIN CAPITAL LETTER H WITH DOT ABOVE" #x1E22)
+    ("LATIN SMALL LETTER H WITH DOT ABOVE" #x1E23)
+    ("LATIN CAPITAL LETTER H WITH DOT BELOW" #x1E24)
+    ("LATIN SMALL LETTER H WITH DOT BELOW" #x1E25)
+    ("LATIN CAPITAL LETTER H WITH DIAERESIS" #x1E26)
+    ("LATIN SMALL LETTER H WITH DIAERESIS" #x1E27)
+    ("LATIN CAPITAL LETTER H WITH CEDILLA" #x1E28)
+    ("LATIN SMALL LETTER H WITH CEDILLA" #x1E29)
+    ("LATIN CAPITAL LETTER H WITH BREVE BELOW" #x1E2A)
+    ("LATIN SMALL LETTER H WITH BREVE BELOW" #x1E2B)
+    ("LATIN CAPITAL LETTER I WITH TILDE BELOW" #x1E2C)
+    ("LATIN SMALL LETTER I WITH TILDE BELOW" #x1E2D)
+    ("LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE" #x1E2E)
+    ("LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE" #x1E2F)
+    ("LATIN CAPITAL LETTER K WITH ACUTE" #x1E30)
+    ("LATIN SMALL LETTER K WITH ACUTE" #x1E31)
+    ("LATIN CAPITAL LETTER K WITH DOT BELOW" #x1E32)
+    ("LATIN SMALL LETTER K WITH DOT BELOW" #x1E33)
+    ("LATIN CAPITAL LETTER K WITH LINE BELOW" #x1E34)
+    ("LATIN SMALL LETTER K WITH LINE BELOW" #x1E35)
+    ("LATIN CAPITAL LETTER L WITH DOT BELOW" #x1E36)
+    ("LATIN SMALL LETTER L WITH DOT BELOW" #x1E37)
+    ("LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON" #x1E38)
+    ("LATIN SMALL LETTER L WITH DOT BELOW AND MACRON" #x1E39)
+    ("LATIN CAPITAL LETTER L WITH LINE BELOW" #x1E3A)
+    ("LATIN SMALL LETTER L WITH LINE BELOW" #x1E3B)
+    ("LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW" #x1E3C)
+    ("LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW" #x1E3D)
+    ("LATIN CAPITAL LETTER M WITH ACUTE" #x1E3E)
+    ("LATIN SMALL LETTER M WITH ACUTE" #x1E3F)
+    ("LATIN CAPITAL LETTER M WITH DOT ABOVE" #x1E40)
+    ("LATIN SMALL LETTER M WITH DOT ABOVE" #x1E41)
+    ("LATIN CAPITAL LETTER M WITH DOT BELOW" #x1E42)
+    ("LATIN SMALL LETTER M WITH DOT BELOW" #x1E43)
+    ("LATIN CAPITAL LETTER N WITH DOT ABOVE" #x1E44)
+    ("LATIN SMALL LETTER N WITH DOT ABOVE" #x1E45)
+    ("LATIN CAPITAL LETTER N WITH DOT BELOW" #x1E46)
+    ("LATIN SMALL LETTER N WITH DOT BELOW" #x1E47)
+    ("LATIN CAPITAL LETTER N WITH LINE BELOW" #x1E48)
+    ("LATIN SMALL LETTER N WITH LINE BELOW" #x1E49)
+    ("LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW" #x1E4A)
+    ("LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW" #x1E4B)
+    ("LATIN CAPITAL LETTER O WITH TILDE AND ACUTE" #x1E4C)
+    ("LATIN SMALL LETTER O WITH TILDE AND ACUTE" #x1E4D)
+    ("LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS" #x1E4E)
+    ("LATIN SMALL LETTER O WITH TILDE AND DIAERESIS" #x1E4F)
+    ("LATIN CAPITAL LETTER O WITH MACRON AND GRAVE" #x1E50)
+    ("LATIN SMALL LETTER O WITH MACRON AND GRAVE" #x1E51)
+    ("LATIN CAPITAL LETTER O WITH MACRON AND ACUTE" #x1E52)
+    ("LATIN SMALL LETTER O WITH MACRON AND ACUTE" #x1E53)
+    ("LATIN CAPITAL LETTER P WITH ACUTE" #x1E54)
+    ("LATIN SMALL LETTER P WITH ACUTE" #x1E55)
+    ("LATIN CAPITAL LETTER P WITH DOT ABOVE" #x1E56)
+    ("LATIN SMALL LETTER P WITH DOT ABOVE" #x1E57)
+    ("LATIN CAPITAL LETTER R WITH DOT ABOVE" #x1E58)
+    ("LATIN SMALL LETTER R WITH DOT ABOVE" #x1E59)
+    ("LATIN CAPITAL LETTER R WITH DOT BELOW" #x1E5A)
+    ("LATIN SMALL LETTER R WITH DOT BELOW" #x1E5B)
+    ("LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON" #x1E5C)
+    ("LATIN SMALL LETTER R WITH DOT BELOW AND MACRON" #x1E5D)
+    ("LATIN CAPITAL LETTER R WITH LINE BELOW" #x1E5E)
+    ("LATIN SMALL LETTER R WITH LINE BELOW" #x1E5F)
+    ("LATIN CAPITAL LETTER S WITH DOT ABOVE" #x1E60)
+    ("LATIN SMALL LETTER S WITH DOT ABOVE" #x1E61)
+    ("LATIN CAPITAL LETTER S WITH DOT BELOW" #x1E62)
+    ("LATIN SMALL LETTER S WITH DOT BELOW" #x1E63)
+    ("LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE" #x1E64)
+    ("LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE" #x1E65)
+    ("LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE" #x1E66)
+    ("LATIN SMALL LETTER S WITH CARON AND DOT ABOVE" #x1E67)
+    ("LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE" #x1E68)
+    ("LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE" #x1E69)
+    ("LATIN CAPITAL LETTER T WITH DOT ABOVE" #x1E6A)
+    ("LATIN SMALL LETTER T WITH DOT ABOVE" #x1E6B)
+    ("LATIN CAPITAL LETTER T WITH DOT BELOW" #x1E6C)
+    ("LATIN SMALL LETTER T WITH DOT BELOW" #x1E6D)
+    ("LATIN CAPITAL LETTER T WITH LINE BELOW" #x1E6E)
+    ("LATIN SMALL LETTER T WITH LINE BELOW" #x1E6F)
+    ("LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW" #x1E70)
+    ("LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW" #x1E71)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS BELOW" #x1E72)
+    ("LATIN SMALL LETTER U WITH DIAERESIS BELOW" #x1E73)
+    ("LATIN CAPITAL LETTER U WITH TILDE BELOW" #x1E74)
+    ("LATIN SMALL LETTER U WITH TILDE BELOW" #x1E75)
+    ("LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW" #x1E76)
+    ("LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW" #x1E77)
+    ("LATIN CAPITAL LETTER U WITH TILDE AND ACUTE" #x1E78)
+    ("LATIN SMALL LETTER U WITH TILDE AND ACUTE" #x1E79)
+    ("LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS" #x1E7A)
+    ("LATIN SMALL LETTER U WITH MACRON AND DIAERESIS" #x1E7B)
+    ("LATIN CAPITAL LETTER V WITH TILDE" #x1E7C)
+    ("LATIN SMALL LETTER V WITH TILDE" #x1E7D)
+    ("LATIN CAPITAL LETTER V WITH DOT BELOW" #x1E7E)
+    ("LATIN SMALL LETTER V WITH DOT BELOW" #x1E7F)
+    ("LATIN CAPITAL LETTER W WITH GRAVE" #x1E80)
+    ("LATIN SMALL LETTER W WITH GRAVE" #x1E81)
+    ("LATIN CAPITAL LETTER W WITH ACUTE" #x1E82)
+    ("LATIN SMALL LETTER W WITH ACUTE" #x1E83)
+    ("LATIN CAPITAL LETTER W WITH DIAERESIS" #x1E84)
+    ("LATIN SMALL LETTER W WITH DIAERESIS" #x1E85)
+    ("LATIN CAPITAL LETTER W WITH DOT ABOVE" #x1E86)
+    ("LATIN SMALL LETTER W WITH DOT ABOVE" #x1E87)
+    ("LATIN CAPITAL LETTER W WITH DOT BELOW" #x1E88)
+    ("LATIN SMALL LETTER W WITH DOT BELOW" #x1E89)
+    ("LATIN CAPITAL LETTER X WITH DOT ABOVE" #x1E8A)
+    ("LATIN SMALL LETTER X WITH DOT ABOVE" #x1E8B)
+    ("LATIN CAPITAL LETTER X WITH DIAERESIS" #x1E8C)
+    ("LATIN SMALL LETTER X WITH DIAERESIS" #x1E8D)
+    ("LATIN CAPITAL LETTER Y WITH DOT ABOVE" #x1E8E)
+    ("LATIN SMALL LETTER Y WITH DOT ABOVE" #x1E8F)
+    ("LATIN CAPITAL LETTER Z WITH CIRCUMFLEX" #x1E90)
+    ("LATIN SMALL LETTER Z WITH CIRCUMFLEX" #x1E91)
+    ("LATIN CAPITAL LETTER Z WITH DOT BELOW" #x1E92)
+    ("LATIN SMALL LETTER Z WITH DOT BELOW" #x1E93)
+    ("LATIN CAPITAL LETTER Z WITH LINE BELOW" #x1E94)
+    ("LATIN SMALL LETTER Z WITH LINE BELOW" #x1E95)
+    ("LATIN SMALL LETTER H WITH LINE BELOW" #x1E96)
+    ("LATIN SMALL LETTER T WITH DIAERESIS" #x1E97)
+    ("LATIN SMALL LETTER W WITH RING ABOVE" #x1E98)
+    ("LATIN SMALL LETTER Y WITH RING ABOVE" #x1E99)
+    ("LATIN SMALL LETTER A WITH RIGHT HALF RING" #x1E9A)
+    ("LATIN SMALL LETTER LONG S WITH DOT ABOVE" #x1E9B)
+    ("LATIN CAPITAL LETTER A WITH DOT BELOW" #x1EA0)
+    ("LATIN SMALL LETTER A WITH DOT BELOW" #x1EA1)
+    ("LATIN CAPITAL LETTER A WITH HOOK ABOVE" #x1EA2)
+    ("LATIN SMALL LETTER A WITH HOOK ABOVE" #x1EA3)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE" #x1EA4)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE" #x1EA5)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE" #x1EA6)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE" #x1EA7)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE" #x1EA8)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE" #x1EA9)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE" #x1EAA)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE" #x1EAB)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW" #x1EAC)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW" #x1EAD)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND ACUTE" #x1EAE)
+    ("LATIN SMALL LETTER A WITH BREVE AND ACUTE" #x1EAF)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND GRAVE" #x1EB0)
+    ("LATIN SMALL LETTER A WITH BREVE AND GRAVE" #x1EB1)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE" #x1EB2)
+    ("LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE" #x1EB3)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND TILDE" #x1EB4)
+    ("LATIN SMALL LETTER A WITH BREVE AND TILDE" #x1EB5)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW" #x1EB6)
+    ("LATIN SMALL LETTER A WITH BREVE AND DOT BELOW" #x1EB7)
+    ("LATIN CAPITAL LETTER E WITH DOT BELOW" #x1EB8)
+    ("LATIN SMALL LETTER E WITH DOT BELOW" #x1EB9)
+    ("LATIN CAPITAL LETTER E WITH HOOK ABOVE" #x1EBA)
+    ("LATIN SMALL LETTER E WITH HOOK ABOVE" #x1EBB)
+    ("LATIN CAPITAL LETTER E WITH TILDE" #x1EBC)
+    ("LATIN SMALL LETTER E WITH TILDE" #x1EBD)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE" #x1EBE)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE" #x1EBF)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE" #x1EC0)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE" #x1EC1)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE" #x1EC2)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE" #x1EC3)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE" #x1EC4)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE" #x1EC5)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW" #x1EC6)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW" #x1EC7)
+    ("LATIN CAPITAL LETTER I WITH HOOK ABOVE" #x1EC8)
+    ("LATIN SMALL LETTER I WITH HOOK ABOVE" #x1EC9)
+    ("LATIN CAPITAL LETTER I WITH DOT BELOW" #x1ECA)
+    ("LATIN SMALL LETTER I WITH DOT BELOW" #x1ECB)
+    ("LATIN CAPITAL LETTER O WITH DOT BELOW" #x1ECC)
+    ("LATIN SMALL LETTER O WITH DOT BELOW" #x1ECD)
+    ("LATIN CAPITAL LETTER O WITH HOOK ABOVE" #x1ECE)
+    ("LATIN SMALL LETTER O WITH HOOK ABOVE" #x1ECF)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE" #x1ED0)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE" #x1ED1)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE" #x1ED2)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE" #x1ED3)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE" #x1ED4)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE" #x1ED5)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE" #x1ED6)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE" #x1ED7)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW" #x1ED8)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW" #x1ED9)
+    ("LATIN CAPITAL LETTER O WITH HORN AND ACUTE" #x1EDA)
+    ("LATIN SMALL LETTER O WITH HORN AND ACUTE" #x1EDB)
+    ("LATIN CAPITAL LETTER O WITH HORN AND GRAVE" #x1EDC)
+    ("LATIN SMALL LETTER O WITH HORN AND GRAVE" #x1EDD)
+    ("LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE" #x1EDE)
+    ("LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE" #x1EDF)
+    ("LATIN CAPITAL LETTER O WITH HORN AND TILDE" #x1EE0)
+    ("LATIN SMALL LETTER O WITH HORN AND TILDE" #x1EE1)
+    ("LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW" #x1EE2)
+    ("LATIN SMALL LETTER O WITH HORN AND DOT BELOW" #x1EE3)
+    ("LATIN CAPITAL LETTER U WITH DOT BELOW" #x1EE4)
+    ("LATIN SMALL LETTER U WITH DOT BELOW" #x1EE5)
+    ("LATIN CAPITAL LETTER U WITH HOOK ABOVE" #x1EE6)
+    ("LATIN SMALL LETTER U WITH HOOK ABOVE" #x1EE7)
+    ("LATIN CAPITAL LETTER U WITH HORN AND ACUTE" #x1EE8)
+    ("LATIN SMALL LETTER U WITH HORN AND ACUTE" #x1EE9)
+    ("LATIN CAPITAL LETTER U WITH HORN AND GRAVE" #x1EEA)
+    ("LATIN SMALL LETTER U WITH HORN AND GRAVE" #x1EEB)
+    ("LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE" #x1EEC)
+    ("LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE" #x1EED)
+    ("LATIN CAPITAL LETTER U WITH HORN AND TILDE" #x1EEE)
+    ("LATIN SMALL LETTER U WITH HORN AND TILDE" #x1EEF)
+    ("LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW" #x1EF0)
+    ("LATIN SMALL LETTER U WITH HORN AND DOT BELOW" #x1EF1)
+    ("LATIN CAPITAL LETTER Y WITH GRAVE" #x1EF2)
+    ("LATIN SMALL LETTER Y WITH GRAVE" #x1EF3)
+    ("LATIN CAPITAL LETTER Y WITH DOT BELOW" #x1EF4)
+    ("LATIN SMALL LETTER Y WITH DOT BELOW" #x1EF5)
+    ("LATIN CAPITAL LETTER Y WITH HOOK ABOVE" #x1EF6)
+    ("LATIN SMALL LETTER Y WITH HOOK ABOVE" #x1EF7)
+    ("LATIN CAPITAL LETTER Y WITH TILDE" #x1EF8)
+    ("LATIN SMALL LETTER Y WITH TILDE" #x1EF9)
+    ))
diff --git a/lisp/nxml/char-name/unicode/01F00-01FFF.el b/lisp/nxml/char-name/unicode/01F00-01FFF.el
new file mode 100644 (file)
index 0000000..56ce30a
--- /dev/null
@@ -0,0 +1,235 @@
+(nxml-define-char-name-set 'greek-extended
+  '(("GREEK SMALL LETTER ALPHA WITH PSILI" #x1F00)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA" #x1F01)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA" #x1F02)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA" #x1F03)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA" #x1F04)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA" #x1F05)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI" #x1F06)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI" #x1F07)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI" #x1F08)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA" #x1F09)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA" #x1F0A)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA" #x1F0B)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA" #x1F0C)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA" #x1F0D)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI" #x1F0E)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI" #x1F0F)
+    ("GREEK SMALL LETTER EPSILON WITH PSILI" #x1F10)
+    ("GREEK SMALL LETTER EPSILON WITH DASIA" #x1F11)
+    ("GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA" #x1F12)
+    ("GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA" #x1F13)
+    ("GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA" #x1F14)
+    ("GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA" #x1F15)
+    ("GREEK CAPITAL LETTER EPSILON WITH PSILI" #x1F18)
+    ("GREEK CAPITAL LETTER EPSILON WITH DASIA" #x1F19)
+    ("GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA" #x1F1A)
+    ("GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA" #x1F1B)
+    ("GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA" #x1F1C)
+    ("GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA" #x1F1D)
+    ("GREEK SMALL LETTER ETA WITH PSILI" #x1F20)
+    ("GREEK SMALL LETTER ETA WITH DASIA" #x1F21)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND VARIA" #x1F22)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND VARIA" #x1F23)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND OXIA" #x1F24)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND OXIA" #x1F25)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI" #x1F26)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI" #x1F27)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI" #x1F28)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA" #x1F29)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA" #x1F2A)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA" #x1F2B)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA" #x1F2C)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA" #x1F2D)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI" #x1F2E)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI" #x1F2F)
+    ("GREEK SMALL LETTER IOTA WITH PSILI" #x1F30)
+    ("GREEK SMALL LETTER IOTA WITH DASIA" #x1F31)
+    ("GREEK SMALL LETTER IOTA WITH PSILI AND VARIA" #x1F32)
+    ("GREEK SMALL LETTER IOTA WITH DASIA AND VARIA" #x1F33)
+    ("GREEK SMALL LETTER IOTA WITH PSILI AND OXIA" #x1F34)
+    ("GREEK SMALL LETTER IOTA WITH DASIA AND OXIA" #x1F35)
+    ("GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI" #x1F36)
+    ("GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI" #x1F37)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI" #x1F38)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA" #x1F39)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA" #x1F3A)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA" #x1F3B)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA" #x1F3C)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA" #x1F3D)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI" #x1F3E)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI" #x1F3F)
+    ("GREEK SMALL LETTER OMICRON WITH PSILI" #x1F40)
+    ("GREEK SMALL LETTER OMICRON WITH DASIA" #x1F41)
+    ("GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA" #x1F42)
+    ("GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA" #x1F43)
+    ("GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA" #x1F44)
+    ("GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA" #x1F45)
+    ("GREEK CAPITAL LETTER OMICRON WITH PSILI" #x1F48)
+    ("GREEK CAPITAL LETTER OMICRON WITH DASIA" #x1F49)
+    ("GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA" #x1F4A)
+    ("GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA" #x1F4B)
+    ("GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA" #x1F4C)
+    ("GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA" #x1F4D)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI" #x1F50)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA" #x1F51)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA" #x1F52)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA" #x1F53)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA" #x1F54)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA" #x1F55)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI" #x1F56)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI" #x1F57)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA" #x1F59)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA" #x1F5B)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA" #x1F5D)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI" #x1F5F)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI" #x1F60)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA" #x1F61)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA" #x1F62)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA" #x1F63)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA" #x1F64)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA" #x1F65)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI" #x1F66)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI" #x1F67)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI" #x1F68)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA" #x1F69)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA" #x1F6A)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA" #x1F6B)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA" #x1F6C)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA" #x1F6D)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI" #x1F6E)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI" #x1F6F)
+    ("GREEK SMALL LETTER ALPHA WITH VARIA" #x1F70)
+    ("GREEK SMALL LETTER ALPHA WITH OXIA" #x1F71)
+    ("GREEK SMALL LETTER EPSILON WITH VARIA" #x1F72)
+    ("GREEK SMALL LETTER EPSILON WITH OXIA" #x1F73)
+    ("GREEK SMALL LETTER ETA WITH VARIA" #x1F74)
+    ("GREEK SMALL LETTER ETA WITH OXIA" #x1F75)
+    ("GREEK SMALL LETTER IOTA WITH VARIA" #x1F76)
+    ("GREEK SMALL LETTER IOTA WITH OXIA" #x1F77)
+    ("GREEK SMALL LETTER OMICRON WITH VARIA" #x1F78)
+    ("GREEK SMALL LETTER OMICRON WITH OXIA" #x1F79)
+    ("GREEK SMALL LETTER UPSILON WITH VARIA" #x1F7A)
+    ("GREEK SMALL LETTER UPSILON WITH OXIA" #x1F7B)
+    ("GREEK SMALL LETTER OMEGA WITH VARIA" #x1F7C)
+    ("GREEK SMALL LETTER OMEGA WITH OXIA" #x1F7D)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI" #x1F80)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI" #x1F81)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI" #x1F82)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI" #x1F83)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI" #x1F84)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI" #x1F85)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI" #x1F86)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI" #x1F87)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI" #x1F88)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI" #x1F89)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI" #x1F8A)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI" #x1F8B)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI" #x1F8C)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI" #x1F8D)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI" #x1F8E)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI" #x1F8F)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI" #x1F90)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI" #x1F91)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI" #x1F92)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI" #x1F93)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI" #x1F94)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI" #x1F95)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI" #x1F96)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI" #x1F97)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI" #x1F98)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI" #x1F99)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI" #x1F9A)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI" #x1F9B)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI" #x1F9C)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI" #x1F9D)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI" #x1F9E)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI" #x1F9F)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI" #x1FA0)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI" #x1FA1)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI" #x1FA2)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI" #x1FA3)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI" #x1FA4)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI" #x1FA5)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI" #x1FA6)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI" #x1FA7)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI" #x1FA8)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI" #x1FA9)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI" #x1FAA)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI" #x1FAB)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI" #x1FAC)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI" #x1FAD)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI" #x1FAE)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI" #x1FAF)
+    ("GREEK SMALL LETTER ALPHA WITH VRACHY" #x1FB0)
+    ("GREEK SMALL LETTER ALPHA WITH MACRON" #x1FB1)
+    ("GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI" #x1FB2)
+    ("GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI" #x1FB3)
+    ("GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI" #x1FB4)
+    ("GREEK SMALL LETTER ALPHA WITH PERISPOMENI" #x1FB6)
+    ("GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI" #x1FB7)
+    ("GREEK CAPITAL LETTER ALPHA WITH VRACHY" #x1FB8)
+    ("GREEK CAPITAL LETTER ALPHA WITH MACRON" #x1FB9)
+    ("GREEK CAPITAL LETTER ALPHA WITH VARIA" #x1FBA)
+    ("GREEK CAPITAL LETTER ALPHA WITH OXIA" #x1FBB)
+    ("GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI" #x1FBC)
+    ("GREEK KORONIS" #x1FBD)
+    ("GREEK PROSGEGRAMMENI" #x1FBE)
+    ("GREEK PSILI" #x1FBF)
+    ("GREEK PERISPOMENI" #x1FC0)
+    ("GREEK DIALYTIKA AND PERISPOMENI" #x1FC1)
+    ("GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI" #x1FC2)
+    ("GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI" #x1FC3)
+    ("GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI" #x1FC4)
+    ("GREEK SMALL LETTER ETA WITH PERISPOMENI" #x1FC6)
+    ("GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI" #x1FC7)
+    ("GREEK CAPITAL LETTER EPSILON WITH VARIA" #x1FC8)
+    ("GREEK CAPITAL LETTER EPSILON WITH OXIA" #x1FC9)
+    ("GREEK CAPITAL LETTER ETA WITH VARIA" #x1FCA)
+    ("GREEK CAPITAL LETTER ETA WITH OXIA" #x1FCB)
+    ("GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI" #x1FCC)
+    ("GREEK PSILI AND VARIA" #x1FCD)
+    ("GREEK PSILI AND OXIA" #x1FCE)
+    ("GREEK PSILI AND PERISPOMENI" #x1FCF)
+    ("GREEK SMALL LETTER IOTA WITH VRACHY" #x1FD0)
+    ("GREEK SMALL LETTER IOTA WITH MACRON" #x1FD1)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA" #x1FD2)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA" #x1FD3)
+    ("GREEK SMALL LETTER IOTA WITH PERISPOMENI" #x1FD6)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI" #x1FD7)
+    ("GREEK CAPITAL LETTER IOTA WITH VRACHY" #x1FD8)
+    ("GREEK CAPITAL LETTER IOTA WITH MACRON" #x1FD9)
+    ("GREEK CAPITAL LETTER IOTA WITH VARIA" #x1FDA)
+    ("GREEK CAPITAL LETTER IOTA WITH OXIA" #x1FDB)
+    ("GREEK DASIA AND VARIA" #x1FDD)
+    ("GREEK DASIA AND OXIA" #x1FDE)
+    ("GREEK DASIA AND PERISPOMENI" #x1FDF)
+    ("GREEK SMALL LETTER UPSILON WITH VRACHY" #x1FE0)
+    ("GREEK SMALL LETTER UPSILON WITH MACRON" #x1FE1)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA" #x1FE2)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA" #x1FE3)
+    ("GREEK SMALL LETTER RHO WITH PSILI" #x1FE4)
+    ("GREEK SMALL LETTER RHO WITH DASIA" #x1FE5)
+    ("GREEK SMALL LETTER UPSILON WITH PERISPOMENI" #x1FE6)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI" #x1FE7)
+    ("GREEK CAPITAL LETTER UPSILON WITH VRACHY" #x1FE8)
+    ("GREEK CAPITAL LETTER UPSILON WITH MACRON" #x1FE9)
+    ("GREEK CAPITAL LETTER UPSILON WITH VARIA" #x1FEA)
+    ("GREEK CAPITAL LETTER UPSILON WITH OXIA" #x1FEB)
+    ("GREEK CAPITAL LETTER RHO WITH DASIA" #x1FEC)
+    ("GREEK DIALYTIKA AND VARIA" #x1FED)
+    ("GREEK DIALYTIKA AND OXIA" #x1FEE)
+    ("GREEK VARIA" #x1FEF)
+    ("GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI" #x1FF2)
+    ("GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI" #x1FF3)
+    ("GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI" #x1FF4)
+    ("GREEK SMALL LETTER OMEGA WITH PERISPOMENI" #x1FF6)
+    ("GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI" #x1FF7)
+    ("GREEK CAPITAL LETTER OMICRON WITH VARIA" #x1FF8)
+    ("GREEK CAPITAL LETTER OMICRON WITH OXIA" #x1FF9)
+    ("GREEK CAPITAL LETTER OMEGA WITH VARIA" #x1FFA)
+    ("GREEK CAPITAL LETTER OMEGA WITH OXIA" #x1FFB)
+    ("GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI" #x1FFC)
+    ("GREEK OXIA" #x1FFD)
+    ("GREEK DASIA" #x1FFE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02000-0206F.el b/lisp/nxml/char-name/unicode/02000-0206F.el
new file mode 100644 (file)
index 0000000..54f6207
--- /dev/null
@@ -0,0 +1,97 @@
+(nxml-define-char-name-set 'general-punctuation
+  '(("EN QUAD" #x2000)
+    ("EM QUAD" #x2001)
+    ("EN SPACE" #x2002)
+    ("EM SPACE" #x2003)
+    ("THREE-PER-EM SPACE" #x2004)
+    ("FOUR-PER-EM SPACE" #x2005)
+    ("SIX-PER-EM SPACE" #x2006)
+    ("FIGURE SPACE" #x2007)
+    ("PUNCTUATION SPACE" #x2008)
+    ("THIN SPACE" #x2009)
+    ("HAIR SPACE" #x200A)
+    ("ZERO WIDTH SPACE" #x200B)
+    ("ZERO WIDTH NON-JOINER" #x200C)
+    ("ZERO WIDTH JOINER" #x200D)
+    ("LEFT-TO-RIGHT MARK" #x200E)
+    ("RIGHT-TO-LEFT MARK" #x200F)
+    ("HYPHEN" #x2010)
+    ("NON-BREAKING HYPHEN" #x2011)
+    ("FIGURE DASH" #x2012)
+    ("EN DASH" #x2013)
+    ("EM DASH" #x2014)
+    ("HORIZONTAL BAR" #x2015)
+    ("DOUBLE VERTICAL LINE" #x2016)
+    ("DOUBLE LOW LINE" #x2017)
+    ("LEFT SINGLE QUOTATION MARK" #x2018)
+    ("RIGHT SINGLE QUOTATION MARK" #x2019)
+    ("SINGLE LOW-9 QUOTATION MARK" #x201A)
+    ("SINGLE HIGH-REVERSED-9 QUOTATION MARK" #x201B)
+    ("LEFT DOUBLE QUOTATION MARK" #x201C)
+    ("RIGHT DOUBLE QUOTATION MARK" #x201D)
+    ("DOUBLE LOW-9 QUOTATION MARK" #x201E)
+    ("DOUBLE HIGH-REVERSED-9 QUOTATION MARK" #x201F)
+    ("DAGGER" #x2020)
+    ("DOUBLE DAGGER" #x2021)
+    ("BULLET" #x2022)
+    ("TRIANGULAR BULLET" #x2023)
+    ("ONE DOT LEADER" #x2024)
+    ("TWO DOT LEADER" #x2025)
+    ("HORIZONTAL ELLIPSIS" #x2026)
+    ("HYPHENATION POINT" #x2027)
+    ("LINE SEPARATOR" #x2028)
+    ("PARAGRAPH SEPARATOR" #x2029)
+    ("LEFT-TO-RIGHT EMBEDDING" #x202A)
+    ("RIGHT-TO-LEFT EMBEDDING" #x202B)
+    ("POP DIRECTIONAL FORMATTING" #x202C)
+    ("LEFT-TO-RIGHT OVERRIDE" #x202D)
+    ("RIGHT-TO-LEFT OVERRIDE" #x202E)
+    ("NARROW NO-BREAK SPACE" #x202F)
+    ("PER MILLE SIGN" #x2030)
+    ("PER TEN THOUSAND SIGN" #x2031)
+    ("PRIME" #x2032)
+    ("DOUBLE PRIME" #x2033)
+    ("TRIPLE PRIME" #x2034)
+    ("REVERSED PRIME" #x2035)
+    ("REVERSED DOUBLE PRIME" #x2036)
+    ("REVERSED TRIPLE PRIME" #x2037)
+    ("CARET" #x2038)
+    ("SINGLE LEFT-POINTING ANGLE QUOTATION MARK" #x2039)
+    ("SINGLE RIGHT-POINTING ANGLE QUOTATION MARK" #x203A)
+    ("REFERENCE MARK" #x203B)
+    ("DOUBLE EXCLAMATION MARK" #x203C)
+    ("INTERROBANG" #x203D)
+    ("OVERLINE" #x203E)
+    ("UNDERTIE" #x203F)
+    ("CHARACTER TIE" #x2040)
+    ("CARET INSERTION POINT" #x2041)
+    ("ASTERISM" #x2042)
+    ("HYPHEN BULLET" #x2043)
+    ("FRACTION SLASH" #x2044)
+    ("LEFT SQUARE BRACKET WITH QUILL" #x2045)
+    ("RIGHT SQUARE BRACKET WITH QUILL" #x2046)
+    ("DOUBLE QUESTION MARK" #x2047)
+    ("QUESTION EXCLAMATION MARK" #x2048)
+    ("EXCLAMATION QUESTION MARK" #x2049)
+    ("TIRONIAN SIGN ET" #x204A)
+    ("REVERSED PILCROW SIGN" #x204B)
+    ("BLACK LEFTWARDS BULLET" #x204C)
+    ("BLACK RIGHTWARDS BULLET" #x204D)
+    ("LOW ASTERISK" #x204E)
+    ("REVERSED SEMICOLON" #x204F)
+    ("CLOSE UP" #x2050)
+    ("TWO ASTERISKS ALIGNED VERTICALLY" #x2051)
+    ("COMMERCIAL MINUS SIGN" #x2052)
+    ("QUADRUPLE PRIME" #x2057)
+    ("MEDIUM MATHEMATICAL SPACE" #x205F)
+    ("WORD JOINER" #x2060)
+    ("FUNCTION APPLICATION" #x2061)
+    ("INVISIBLE TIMES" #x2062)
+    ("INVISIBLE SEPARATOR" #x2063)
+    ("INHIBIT SYMMETRIC SWAPPING" #x206A)
+    ("ACTIVATE SYMMETRIC SWAPPING" #x206B)
+    ("INHIBIT ARABIC FORM SHAPING" #x206C)
+    ("ACTIVATE ARABIC FORM SHAPING" #x206D)
+    ("NATIONAL DIGIT SHAPES" #x206E)
+    ("NOMINAL DIGIT SHAPES" #x206F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02070-0209F.el b/lisp/nxml/char-name/unicode/02070-0209F.el
new file mode 100644 (file)
index 0000000..5d37880
--- /dev/null
@@ -0,0 +1,31 @@
+(nxml-define-char-name-set 'superscripts-and-subscripts
+  '(("SUPERSCRIPT ZERO" #x2070)
+    ("SUPERSCRIPT LATIN SMALL LETTER I" #x2071)
+    ("SUPERSCRIPT FOUR" #x2074)
+    ("SUPERSCRIPT FIVE" #x2075)
+    ("SUPERSCRIPT SIX" #x2076)
+    ("SUPERSCRIPT SEVEN" #x2077)
+    ("SUPERSCRIPT EIGHT" #x2078)
+    ("SUPERSCRIPT NINE" #x2079)
+    ("SUPERSCRIPT PLUS SIGN" #x207A)
+    ("SUPERSCRIPT MINUS" #x207B)
+    ("SUPERSCRIPT EQUALS SIGN" #x207C)
+    ("SUPERSCRIPT LEFT PARENTHESIS" #x207D)
+    ("SUPERSCRIPT RIGHT PARENTHESIS" #x207E)
+    ("SUPERSCRIPT LATIN SMALL LETTER N" #x207F)
+    ("SUBSCRIPT ZERO" #x2080)
+    ("SUBSCRIPT ONE" #x2081)
+    ("SUBSCRIPT TWO" #x2082)
+    ("SUBSCRIPT THREE" #x2083)
+    ("SUBSCRIPT FOUR" #x2084)
+    ("SUBSCRIPT FIVE" #x2085)
+    ("SUBSCRIPT SIX" #x2086)
+    ("SUBSCRIPT SEVEN" #x2087)
+    ("SUBSCRIPT EIGHT" #x2088)
+    ("SUBSCRIPT NINE" #x2089)
+    ("SUBSCRIPT PLUS SIGN" #x208A)
+    ("SUBSCRIPT MINUS" #x208B)
+    ("SUBSCRIPT EQUALS SIGN" #x208C)
+    ("SUBSCRIPT LEFT PARENTHESIS" #x208D)
+    ("SUBSCRIPT RIGHT PARENTHESIS" #x208E)
+    ))
diff --git a/lisp/nxml/char-name/unicode/020A0-020CF.el b/lisp/nxml/char-name/unicode/020A0-020CF.el
new file mode 100644 (file)
index 0000000..1cab37e
--- /dev/null
@@ -0,0 +1,20 @@
+(nxml-define-char-name-set 'currency-symbols
+  '(("EURO-CURRENCY SIGN" #x20A0)
+    ("COLON SIGN" #x20A1)
+    ("CRUZEIRO SIGN" #x20A2)
+    ("FRENCH FRANC SIGN" #x20A3)
+    ("LIRA SIGN" #x20A4)
+    ("MILL SIGN" #x20A5)
+    ("NAIRA SIGN" #x20A6)
+    ("PESETA SIGN" #x20A7)
+    ("RUPEE SIGN" #x20A8)
+    ("WON SIGN" #x20A9)
+    ("NEW SHEQEL SIGN" #x20AA)
+    ("DONG SIGN" #x20AB)
+    ("EURO SIGN" #x20AC)
+    ("KIP SIGN" #x20AD)
+    ("TUGRIK SIGN" #x20AE)
+    ("DRACHMA SIGN" #x20AF)
+    ("GERMAN PENNY SIGN" #x20B0)
+    ("PESO SIGN" #x20B1)
+    ))
diff --git a/lisp/nxml/char-name/unicode/020D0-020FF.el b/lisp/nxml/char-name/unicode/020D0-020FF.el
new file mode 100644 (file)
index 0000000..e610d39
--- /dev/null
@@ -0,0 +1,29 @@
+(nxml-define-char-name-set 'combining-diacritical-marks-for-symbols
+  '(("COMBINING LEFT HARPOON ABOVE" #x20D0)
+    ("COMBINING RIGHT HARPOON ABOVE" #x20D1)
+    ("COMBINING LONG VERTICAL LINE OVERLAY" #x20D2)
+    ("COMBINING SHORT VERTICAL LINE OVERLAY" #x20D3)
+    ("COMBINING ANTICLOCKWISE ARROW ABOVE" #x20D4)
+    ("COMBINING CLOCKWISE ARROW ABOVE" #x20D5)
+    ("COMBINING LEFT ARROW ABOVE" #x20D6)
+    ("COMBINING RIGHT ARROW ABOVE" #x20D7)
+    ("COMBINING RING OVERLAY" #x20D8)
+    ("COMBINING CLOCKWISE RING OVERLAY" #x20D9)
+    ("COMBINING ANTICLOCKWISE RING OVERLAY" #x20DA)
+    ("COMBINING THREE DOTS ABOVE" #x20DB)
+    ("COMBINING FOUR DOTS ABOVE" #x20DC)
+    ("COMBINING ENCLOSING CIRCLE" #x20DD)
+    ("COMBINING ENCLOSING SQUARE" #x20DE)
+    ("COMBINING ENCLOSING DIAMOND" #x20DF)
+    ("COMBINING ENCLOSING CIRCLE BACKSLASH" #x20E0)
+    ("COMBINING LEFT RIGHT ARROW ABOVE" #x20E1)
+    ("COMBINING ENCLOSING SCREEN" #x20E2)
+    ("COMBINING ENCLOSING KEYCAP" #x20E3)
+    ("COMBINING ENCLOSING UPWARD POINTING TRIANGLE" #x20E4)
+    ("COMBINING REVERSE SOLIDUS OVERLAY" #x20E5)
+    ("COMBINING DOUBLE VERTICAL STROKE OVERLAY" #x20E6)
+    ("COMBINING ANNUITY SYMBOL" #x20E7)
+    ("COMBINING TRIPLE UNDERDOT" #x20E8)
+    ("COMBINING WIDE BRIDGE ABOVE" #x20E9)
+    ("COMBINING LEFTWARDS ARROW OVERLAY" #x20EA)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02100-0214F.el b/lisp/nxml/char-name/unicode/02100-0214F.el
new file mode 100644 (file)
index 0000000..bdf929f
--- /dev/null
@@ -0,0 +1,76 @@
+(nxml-define-char-name-set 'letterlike-symbols
+  '(("ACCOUNT OF" #x2100)
+    ("ADDRESSED TO THE SUBJECT" #x2101)
+    ("DOUBLE-STRUCK CAPITAL C" #x2102)
+    ("DEGREE CELSIUS" #x2103)
+    ("CENTRE LINE SYMBOL" #x2104)
+    ("CARE OF" #x2105)
+    ("CADA UNA" #x2106)
+    ("EULER CONSTANT" #x2107)
+    ("SCRUPLE" #x2108)
+    ("DEGREE FAHRENHEIT" #x2109)
+    ("SCRIPT SMALL G" #x210A)
+    ("SCRIPT CAPITAL H" #x210B)
+    ("BLACK-LETTER CAPITAL H" #x210C)
+    ("DOUBLE-STRUCK CAPITAL H" #x210D)
+    ("PLANCK CONSTANT" #x210E)
+    ("PLANCK CONSTANT OVER TWO PI" #x210F)
+    ("SCRIPT CAPITAL I" #x2110)
+    ("BLACK-LETTER CAPITAL I" #x2111)
+    ("SCRIPT CAPITAL L" #x2112)
+    ("SCRIPT SMALL L" #x2113)
+    ("L B BAR SYMBOL" #x2114)
+    ("DOUBLE-STRUCK CAPITAL N" #x2115)
+    ("NUMERO SIGN" #x2116)
+    ("SOUND RECORDING COPYRIGHT" #x2117)
+    ("SCRIPT CAPITAL P" #x2118)
+    ("DOUBLE-STRUCK CAPITAL P" #x2119)
+    ("DOUBLE-STRUCK CAPITAL Q" #x211A)
+    ("SCRIPT CAPITAL R" #x211B)
+    ("BLACK-LETTER CAPITAL R" #x211C)
+    ("DOUBLE-STRUCK CAPITAL R" #x211D)
+    ("PRESCRIPTION TAKE" #x211E)
+    ("RESPONSE" #x211F)
+    ("SERVICE MARK" #x2120)
+    ("TELEPHONE SIGN" #x2121)
+    ("TRADE MARK SIGN" #x2122)
+    ("VERSICLE" #x2123)
+    ("DOUBLE-STRUCK CAPITAL Z" #x2124)
+    ("OUNCE SIGN" #x2125)
+    ("OHM SIGN" #x2126)
+    ("INVERTED OHM SIGN" #x2127)
+    ("BLACK-LETTER CAPITAL Z" #x2128)
+    ("TURNED GREEK SMALL LETTER IOTA" #x2129)
+    ("KELVIN SIGN" #x212A)
+    ("ANGSTROM SIGN" #x212B)
+    ("SCRIPT CAPITAL B" #x212C)
+    ("BLACK-LETTER CAPITAL C" #x212D)
+    ("ESTIMATED SYMBOL" #x212E)
+    ("SCRIPT SMALL E" #x212F)
+    ("SCRIPT CAPITAL E" #x2130)
+    ("SCRIPT CAPITAL F" #x2131)
+    ("TURNED CAPITAL F" #x2132)
+    ("SCRIPT CAPITAL M" #x2133)
+    ("SCRIPT SMALL O" #x2134)
+    ("ALEF SYMBOL" #x2135)
+    ("BET SYMBOL" #x2136)
+    ("GIMEL SYMBOL" #x2137)
+    ("DALET SYMBOL" #x2138)
+    ("INFORMATION SOURCE" #x2139)
+    ("ROTATED CAPITAL Q" #x213A)
+    ("DOUBLE-STRUCK SMALL GAMMA" #x213D)
+    ("DOUBLE-STRUCK CAPITAL GAMMA" #x213E)
+    ("DOUBLE-STRUCK CAPITAL PI" #x213F)
+    ("DOUBLE-STRUCK N-ARY SUMMATION" #x2140)
+    ("TURNED SANS-SERIF CAPITAL G" #x2141)
+    ("TURNED SANS-SERIF CAPITAL L" #x2142)
+    ("REVERSED SANS-SERIF CAPITAL L" #x2143)
+    ("TURNED SANS-SERIF CAPITAL Y" #x2144)
+    ("DOUBLE-STRUCK ITALIC CAPITAL D" #x2145)
+    ("DOUBLE-STRUCK ITALIC SMALL D" #x2146)
+    ("DOUBLE-STRUCK ITALIC SMALL E" #x2147)
+    ("DOUBLE-STRUCK ITALIC SMALL I" #x2148)
+    ("DOUBLE-STRUCK ITALIC SMALL J" #x2149)
+    ("PROPERTY LINE" #x214A)
+    ("TURNED AMPERSAND" #x214B)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02150-0218F.el b/lisp/nxml/char-name/unicode/02150-0218F.el
new file mode 100644 (file)
index 0000000..4300c49
--- /dev/null
@@ -0,0 +1,51 @@
+(nxml-define-char-name-set 'number-forms
+  '(("VULGAR FRACTION ONE THIRD" #x2153)
+    ("VULGAR FRACTION TWO THIRDS" #x2154)
+    ("VULGAR FRACTION ONE FIFTH" #x2155)
+    ("VULGAR FRACTION TWO FIFTHS" #x2156)
+    ("VULGAR FRACTION THREE FIFTHS" #x2157)
+    ("VULGAR FRACTION FOUR FIFTHS" #x2158)
+    ("VULGAR FRACTION ONE SIXTH" #x2159)
+    ("VULGAR FRACTION FIVE SIXTHS" #x215A)
+    ("VULGAR FRACTION ONE EIGHTH" #x215B)
+    ("VULGAR FRACTION THREE EIGHTHS" #x215C)
+    ("VULGAR FRACTION FIVE EIGHTHS" #x215D)
+    ("VULGAR FRACTION SEVEN EIGHTHS" #x215E)
+    ("FRACTION NUMERATOR ONE" #x215F)
+    ("ROMAN NUMERAL ONE" #x2160)
+    ("ROMAN NUMERAL TWO" #x2161)
+    ("ROMAN NUMERAL THREE" #x2162)
+    ("ROMAN NUMERAL FOUR" #x2163)
+    ("ROMAN NUMERAL FIVE" #x2164)
+    ("ROMAN NUMERAL SIX" #x2165)
+    ("ROMAN NUMERAL SEVEN" #x2166)
+    ("ROMAN NUMERAL EIGHT" #x2167)
+    ("ROMAN NUMERAL NINE" #x2168)
+    ("ROMAN NUMERAL TEN" #x2169)
+    ("ROMAN NUMERAL ELEVEN" #x216A)
+    ("ROMAN NUMERAL TWELVE" #x216B)
+    ("ROMAN NUMERAL FIFTY" #x216C)
+    ("ROMAN NUMERAL ONE HUNDRED" #x216D)
+    ("ROMAN NUMERAL FIVE HUNDRED" #x216E)
+    ("ROMAN NUMERAL ONE THOUSAND" #x216F)
+    ("SMALL ROMAN NUMERAL ONE" #x2170)
+    ("SMALL ROMAN NUMERAL TWO" #x2171)
+    ("SMALL ROMAN NUMERAL THREE" #x2172)
+    ("SMALL ROMAN NUMERAL FOUR" #x2173)
+    ("SMALL ROMAN NUMERAL FIVE" #x2174)
+    ("SMALL ROMAN NUMERAL SIX" #x2175)
+    ("SMALL ROMAN NUMERAL SEVEN" #x2176)
+    ("SMALL ROMAN NUMERAL EIGHT" #x2177)
+    ("SMALL ROMAN NUMERAL NINE" #x2178)
+    ("SMALL ROMAN NUMERAL TEN" #x2179)
+    ("SMALL ROMAN NUMERAL ELEVEN" #x217A)
+    ("SMALL ROMAN NUMERAL TWELVE" #x217B)
+    ("SMALL ROMAN NUMERAL FIFTY" #x217C)
+    ("SMALL ROMAN NUMERAL ONE HUNDRED" #x217D)
+    ("SMALL ROMAN NUMERAL FIVE HUNDRED" #x217E)
+    ("SMALL ROMAN NUMERAL ONE THOUSAND" #x217F)
+    ("ROMAN NUMERAL ONE THOUSAND C D" #x2180)
+    ("ROMAN NUMERAL FIVE THOUSAND" #x2181)
+    ("ROMAN NUMERAL TEN THOUSAND" #x2182)
+    ("ROMAN NUMERAL REVERSED ONE HUNDRED" #x2183)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02190-021FF.el b/lisp/nxml/char-name/unicode/02190-021FF.el
new file mode 100644 (file)
index 0000000..88989ed
--- /dev/null
@@ -0,0 +1,114 @@
+(nxml-define-char-name-set 'arrows
+  '(("LEFTWARDS ARROW" #x2190)
+    ("UPWARDS ARROW" #x2191)
+    ("RIGHTWARDS ARROW" #x2192)
+    ("DOWNWARDS ARROW" #x2193)
+    ("LEFT RIGHT ARROW" #x2194)
+    ("UP DOWN ARROW" #x2195)
+    ("NORTH WEST ARROW" #x2196)
+    ("NORTH EAST ARROW" #x2197)
+    ("SOUTH EAST ARROW" #x2198)
+    ("SOUTH WEST ARROW" #x2199)
+    ("LEFTWARDS ARROW WITH STROKE" #x219A)
+    ("RIGHTWARDS ARROW WITH STROKE" #x219B)
+    ("LEFTWARDS WAVE ARROW" #x219C)
+    ("RIGHTWARDS WAVE ARROW" #x219D)
+    ("LEFTWARDS TWO HEADED ARROW" #x219E)
+    ("UPWARDS TWO HEADED ARROW" #x219F)
+    ("RIGHTWARDS TWO HEADED ARROW" #x21A0)
+    ("DOWNWARDS TWO HEADED ARROW" #x21A1)
+    ("LEFTWARDS ARROW WITH TAIL" #x21A2)
+    ("RIGHTWARDS ARROW WITH TAIL" #x21A3)
+    ("LEFTWARDS ARROW FROM BAR" #x21A4)
+    ("UPWARDS ARROW FROM BAR" #x21A5)
+    ("RIGHTWARDS ARROW FROM BAR" #x21A6)
+    ("DOWNWARDS ARROW FROM BAR" #x21A7)
+    ("UP DOWN ARROW WITH BASE" #x21A8)
+    ("LEFTWARDS ARROW WITH HOOK" #x21A9)
+    ("RIGHTWARDS ARROW WITH HOOK" #x21AA)
+    ("LEFTWARDS ARROW WITH LOOP" #x21AB)
+    ("RIGHTWARDS ARROW WITH LOOP" #x21AC)
+    ("LEFT RIGHT WAVE ARROW" #x21AD)
+    ("LEFT RIGHT ARROW WITH STROKE" #x21AE)
+    ("DOWNWARDS ZIGZAG ARROW" #x21AF)
+    ("UPWARDS ARROW WITH TIP LEFTWARDS" #x21B0)
+    ("UPWARDS ARROW WITH TIP RIGHTWARDS" #x21B1)
+    ("DOWNWARDS ARROW WITH TIP LEFTWARDS" #x21B2)
+    ("DOWNWARDS ARROW WITH TIP RIGHTWARDS" #x21B3)
+    ("RIGHTWARDS ARROW WITH CORNER DOWNWARDS" #x21B4)
+    ("DOWNWARDS ARROW WITH CORNER LEFTWARDS" #x21B5)
+    ("ANTICLOCKWISE TOP SEMICIRCLE ARROW" #x21B6)
+    ("CLOCKWISE TOP SEMICIRCLE ARROW" #x21B7)
+    ("NORTH WEST ARROW TO LONG BAR" #x21B8)
+    ("LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR" #x21B9)
+    ("ANTICLOCKWISE OPEN CIRCLE ARROW" #x21BA)
+    ("CLOCKWISE OPEN CIRCLE ARROW" #x21BB)
+    ("LEFTWARDS HARPOON WITH BARB UPWARDS" #x21BC)
+    ("LEFTWARDS HARPOON WITH BARB DOWNWARDS" #x21BD)
+    ("UPWARDS HARPOON WITH BARB RIGHTWARDS" #x21BE)
+    ("UPWARDS HARPOON WITH BARB LEFTWARDS" #x21BF)
+    ("RIGHTWARDS HARPOON WITH BARB UPWARDS" #x21C0)
+    ("RIGHTWARDS HARPOON WITH BARB DOWNWARDS" #x21C1)
+    ("DOWNWARDS HARPOON WITH BARB RIGHTWARDS" #x21C2)
+    ("DOWNWARDS HARPOON WITH BARB LEFTWARDS" #x21C3)
+    ("RIGHTWARDS ARROW OVER LEFTWARDS ARROW" #x21C4)
+    ("UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW" #x21C5)
+    ("LEFTWARDS ARROW OVER RIGHTWARDS ARROW" #x21C6)
+    ("LEFTWARDS PAIRED ARROWS" #x21C7)
+    ("UPWARDS PAIRED ARROWS" #x21C8)
+    ("RIGHTWARDS PAIRED ARROWS" #x21C9)
+    ("DOWNWARDS PAIRED ARROWS" #x21CA)
+    ("LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON" #x21CB)
+    ("RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON" #x21CC)
+    ("LEFTWARDS DOUBLE ARROW WITH STROKE" #x21CD)
+    ("LEFT RIGHT DOUBLE ARROW WITH STROKE" #x21CE)
+    ("RIGHTWARDS DOUBLE ARROW WITH STROKE" #x21CF)
+    ("LEFTWARDS DOUBLE ARROW" #x21D0)
+    ("UPWARDS DOUBLE ARROW" #x21D1)
+    ("RIGHTWARDS DOUBLE ARROW" #x21D2)
+    ("DOWNWARDS DOUBLE ARROW" #x21D3)
+    ("LEFT RIGHT DOUBLE ARROW" #x21D4)
+    ("UP DOWN DOUBLE ARROW" #x21D5)
+    ("NORTH WEST DOUBLE ARROW" #x21D6)
+    ("NORTH EAST DOUBLE ARROW" #x21D7)
+    ("SOUTH EAST DOUBLE ARROW" #x21D8)
+    ("SOUTH WEST DOUBLE ARROW" #x21D9)
+    ("LEFTWARDS TRIPLE ARROW" #x21DA)
+    ("RIGHTWARDS TRIPLE ARROW" #x21DB)
+    ("LEFTWARDS SQUIGGLE ARROW" #x21DC)
+    ("RIGHTWARDS SQUIGGLE ARROW" #x21DD)
+    ("UPWARDS ARROW WITH DOUBLE STROKE" #x21DE)
+    ("DOWNWARDS ARROW WITH DOUBLE STROKE" #x21DF)
+    ("LEFTWARDS DASHED ARROW" #x21E0)
+    ("UPWARDS DASHED ARROW" #x21E1)
+    ("RIGHTWARDS DASHED ARROW" #x21E2)
+    ("DOWNWARDS DASHED ARROW" #x21E3)
+    ("LEFTWARDS ARROW TO BAR" #x21E4)
+    ("RIGHTWARDS ARROW TO BAR" #x21E5)
+    ("LEFTWARDS WHITE ARROW" #x21E6)
+    ("UPWARDS WHITE ARROW" #x21E7)
+    ("RIGHTWARDS WHITE ARROW" #x21E8)
+    ("DOWNWARDS WHITE ARROW" #x21E9)
+    ("UPWARDS WHITE ARROW FROM BAR" #x21EA)
+    ("UPWARDS WHITE ARROW ON PEDESTAL" #x21EB)
+    ("UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR" #x21EC)
+    ("UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR" #x21ED)
+    ("UPWARDS WHITE DOUBLE ARROW" #x21EE)
+    ("UPWARDS WHITE DOUBLE ARROW ON PEDESTAL" #x21EF)
+    ("RIGHTWARDS WHITE ARROW FROM WALL" #x21F0)
+    ("NORTH WEST ARROW TO CORNER" #x21F1)
+    ("SOUTH EAST ARROW TO CORNER" #x21F2)
+    ("UP DOWN WHITE ARROW" #x21F3)
+    ("RIGHT ARROW WITH SMALL CIRCLE" #x21F4)
+    ("DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW" #x21F5)
+    ("THREE RIGHTWARDS ARROWS" #x21F6)
+    ("LEFTWARDS ARROW WITH VERTICAL STROKE" #x21F7)
+    ("RIGHTWARDS ARROW WITH VERTICAL STROKE" #x21F8)
+    ("LEFT RIGHT ARROW WITH VERTICAL STROKE" #x21F9)
+    ("LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE" #x21FA)
+    ("RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE" #x21FB)
+    ("LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE" #x21FC)
+    ("LEFTWARDS OPEN-HEADED ARROW" #x21FD)
+    ("RIGHTWARDS OPEN-HEADED ARROW" #x21FE)
+    ("LEFT RIGHT OPEN-HEADED ARROW" #x21FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02200-022FF.el b/lisp/nxml/char-name/unicode/02200-022FF.el
new file mode 100644 (file)
index 0000000..a28f778
--- /dev/null
@@ -0,0 +1,258 @@
+(nxml-define-char-name-set 'mathematical-operators
+  '(("FOR ALL" #x2200)
+    ("COMPLEMENT" #x2201)
+    ("PARTIAL DIFFERENTIAL" #x2202)
+    ("THERE EXISTS" #x2203)
+    ("THERE DOES NOT EXIST" #x2204)
+    ("EMPTY SET" #x2205)
+    ("INCREMENT" #x2206)
+    ("NABLA" #x2207)
+    ("ELEMENT OF" #x2208)
+    ("NOT AN ELEMENT OF" #x2209)
+    ("SMALL ELEMENT OF" #x220A)
+    ("CONTAINS AS MEMBER" #x220B)
+    ("DOES NOT CONTAIN AS MEMBER" #x220C)
+    ("SMALL CONTAINS AS MEMBER" #x220D)
+    ("END OF PROOF" #x220E)
+    ("N-ARY PRODUCT" #x220F)
+    ("N-ARY COPRODUCT" #x2210)
+    ("N-ARY SUMMATION" #x2211)
+    ("MINUS SIGN" #x2212)
+    ("MINUS-OR-PLUS SIGN" #x2213)
+    ("DOT PLUS" #x2214)
+    ("DIVISION SLASH" #x2215)
+    ("SET MINUS" #x2216)
+    ("ASTERISK OPERATOR" #x2217)
+    ("RING OPERATOR" #x2218)
+    ("BULLET OPERATOR" #x2219)
+    ("SQUARE ROOT" #x221A)
+    ("CUBE ROOT" #x221B)
+    ("FOURTH ROOT" #x221C)
+    ("PROPORTIONAL TO" #x221D)
+    ("INFINITY" #x221E)
+    ("RIGHT ANGLE" #x221F)
+    ("ANGLE" #x2220)
+    ("MEASURED ANGLE" #x2221)
+    ("SPHERICAL ANGLE" #x2222)
+    ("DIVIDES" #x2223)
+    ("DOES NOT DIVIDE" #x2224)
+    ("PARALLEL TO" #x2225)
+    ("NOT PARALLEL TO" #x2226)
+    ("LOGICAL AND" #x2227)
+    ("LOGICAL OR" #x2228)
+    ("INTERSECTION" #x2229)
+    ("UNION" #x222A)
+    ("INTEGRAL" #x222B)
+    ("DOUBLE INTEGRAL" #x222C)
+    ("TRIPLE INTEGRAL" #x222D)
+    ("CONTOUR INTEGRAL" #x222E)
+    ("SURFACE INTEGRAL" #x222F)
+    ("VOLUME INTEGRAL" #x2230)
+    ("CLOCKWISE INTEGRAL" #x2231)
+    ("CLOCKWISE CONTOUR INTEGRAL" #x2232)
+    ("ANTICLOCKWISE CONTOUR INTEGRAL" #x2233)
+    ("THEREFORE" #x2234)
+    ("BECAUSE" #x2235)
+    ("RATIO" #x2236)
+    ("PROPORTION" #x2237)
+    ("DOT MINUS" #x2238)
+    ("EXCESS" #x2239)
+    ("GEOMETRIC PROPORTION" #x223A)
+    ("HOMOTHETIC" #x223B)
+    ("TILDE OPERATOR" #x223C)
+    ("REVERSED TILDE" #x223D)
+    ("INVERTED LAZY S" #x223E)
+    ("SINE WAVE" #x223F)
+    ("WREATH PRODUCT" #x2240)
+    ("NOT TILDE" #x2241)
+    ("MINUS TILDE" #x2242)
+    ("ASYMPTOTICALLY EQUAL TO" #x2243)
+    ("NOT ASYMPTOTICALLY EQUAL TO" #x2244)
+    ("APPROXIMATELY EQUAL TO" #x2245)
+    ("APPROXIMATELY BUT NOT ACTUALLY EQUAL TO" #x2246)
+    ("NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO" #x2247)
+    ("ALMOST EQUAL TO" #x2248)
+    ("NOT ALMOST EQUAL TO" #x2249)
+    ("ALMOST EQUAL OR EQUAL TO" #x224A)
+    ("TRIPLE TILDE" #x224B)
+    ("ALL EQUAL TO" #x224C)
+    ("EQUIVALENT TO" #x224D)
+    ("GEOMETRICALLY EQUIVALENT TO" #x224E)
+    ("DIFFERENCE BETWEEN" #x224F)
+    ("APPROACHES THE LIMIT" #x2250)
+    ("GEOMETRICALLY EQUAL TO" #x2251)
+    ("APPROXIMATELY EQUAL TO OR THE IMAGE OF" #x2252)
+    ("IMAGE OF OR APPROXIMATELY EQUAL TO" #x2253)
+    ("COLON EQUALS" #x2254)
+    ("EQUALS COLON" #x2255)
+    ("RING IN EQUAL TO" #x2256)
+    ("RING EQUAL TO" #x2257)
+    ("CORRESPONDS TO" #x2258)
+    ("ESTIMATES" #x2259)
+    ("EQUIANGULAR TO" #x225A)
+    ("STAR EQUALS" #x225B)
+    ("DELTA EQUAL TO" #x225C)
+    ("EQUAL TO BY DEFINITION" #x225D)
+    ("MEASURED BY" #x225E)
+    ("QUESTIONED EQUAL TO" #x225F)
+    ("NOT EQUAL TO" #x2260)
+    ("IDENTICAL TO" #x2261)
+    ("NOT IDENTICAL TO" #x2262)
+    ("STRICTLY EQUIVALENT TO" #x2263)
+    ("LESS-THAN OR EQUAL TO" #x2264)
+    ("GREATER-THAN OR EQUAL TO" #x2265)
+    ("LESS-THAN OVER EQUAL TO" #x2266)
+    ("GREATER-THAN OVER EQUAL TO" #x2267)
+    ("LESS-THAN BUT NOT EQUAL TO" #x2268)
+    ("GREATER-THAN BUT NOT EQUAL TO" #x2269)
+    ("MUCH LESS-THAN" #x226A)
+    ("MUCH GREATER-THAN" #x226B)
+    ("BETWEEN" #x226C)
+    ("NOT EQUIVALENT TO" #x226D)
+    ("NOT LESS-THAN" #x226E)
+    ("NOT GREATER-THAN" #x226F)
+    ("NEITHER LESS-THAN NOR EQUAL TO" #x2270)
+    ("NEITHER GREATER-THAN NOR EQUAL TO" #x2271)
+    ("LESS-THAN OR EQUIVALENT TO" #x2272)
+    ("GREATER-THAN OR EQUIVALENT TO" #x2273)
+    ("NEITHER LESS-THAN NOR EQUIVALENT TO" #x2274)
+    ("NEITHER GREATER-THAN NOR EQUIVALENT TO" #x2275)
+    ("LESS-THAN OR GREATER-THAN" #x2276)
+    ("GREATER-THAN OR LESS-THAN" #x2277)
+    ("NEITHER LESS-THAN NOR GREATER-THAN" #x2278)
+    ("NEITHER GREATER-THAN NOR LESS-THAN" #x2279)
+    ("PRECEDES" #x227A)
+    ("SUCCEEDS" #x227B)
+    ("PRECEDES OR EQUAL TO" #x227C)
+    ("SUCCEEDS OR EQUAL TO" #x227D)
+    ("PRECEDES OR EQUIVALENT TO" #x227E)
+    ("SUCCEEDS OR EQUIVALENT TO" #x227F)
+    ("DOES NOT PRECEDE" #x2280)
+    ("DOES NOT SUCCEED" #x2281)
+    ("SUBSET OF" #x2282)
+    ("SUPERSET OF" #x2283)
+    ("NOT A SUBSET OF" #x2284)
+    ("NOT A SUPERSET OF" #x2285)
+    ("SUBSET OF OR EQUAL TO" #x2286)
+    ("SUPERSET OF OR EQUAL TO" #x2287)
+    ("NEITHER A SUBSET OF NOR EQUAL TO" #x2288)
+    ("NEITHER A SUPERSET OF NOR EQUAL TO" #x2289)
+    ("SUBSET OF WITH NOT EQUAL TO" #x228A)
+    ("SUPERSET OF WITH NOT EQUAL TO" #x228B)
+    ("MULTISET" #x228C)
+    ("MULTISET MULTIPLICATION" #x228D)
+    ("MULTISET UNION" #x228E)
+    ("SQUARE IMAGE OF" #x228F)
+    ("SQUARE ORIGINAL OF" #x2290)
+    ("SQUARE IMAGE OF OR EQUAL TO" #x2291)
+    ("SQUARE ORIGINAL OF OR EQUAL TO" #x2292)
+    ("SQUARE CAP" #x2293)
+    ("SQUARE CUP" #x2294)
+    ("CIRCLED PLUS" #x2295)
+    ("CIRCLED MINUS" #x2296)
+    ("CIRCLED TIMES" #x2297)
+    ("CIRCLED DIVISION SLASH" #x2298)
+    ("CIRCLED DOT OPERATOR" #x2299)
+    ("CIRCLED RING OPERATOR" #x229A)
+    ("CIRCLED ASTERISK OPERATOR" #x229B)
+    ("CIRCLED EQUALS" #x229C)
+    ("CIRCLED DASH" #x229D)
+    ("SQUARED PLUS" #x229E)
+    ("SQUARED MINUS" #x229F)
+    ("SQUARED TIMES" #x22A0)
+    ("SQUARED DOT OPERATOR" #x22A1)
+    ("RIGHT TACK" #x22A2)
+    ("LEFT TACK" #x22A3)
+    ("DOWN TACK" #x22A4)
+    ("UP TACK" #x22A5)
+    ("ASSERTION" #x22A6)
+    ("MODELS" #x22A7)
+    ("TRUE" #x22A8)
+    ("FORCES" #x22A9)
+    ("TRIPLE VERTICAL BAR RIGHT TURNSTILE" #x22AA)
+    ("DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE" #x22AB)
+    ("DOES NOT PROVE" #x22AC)
+    ("NOT TRUE" #x22AD)
+    ("DOES NOT FORCE" #x22AE)
+    ("NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE" #x22AF)
+    ("PRECEDES UNDER RELATION" #x22B0)
+    ("SUCCEEDS UNDER RELATION" #x22B1)
+    ("NORMAL SUBGROUP OF" #x22B2)
+    ("CONTAINS AS NORMAL SUBGROUP" #x22B3)
+    ("NORMAL SUBGROUP OF OR EQUAL TO" #x22B4)
+    ("CONTAINS AS NORMAL SUBGROUP OR EQUAL TO" #x22B5)
+    ("ORIGINAL OF" #x22B6)
+    ("IMAGE OF" #x22B7)
+    ("MULTIMAP" #x22B8)
+    ("HERMITIAN CONJUGATE MATRIX" #x22B9)
+    ("INTERCALATE" #x22BA)
+    ("XOR" #x22BB)
+    ("NAND" #x22BC)
+    ("NOR" #x22BD)
+    ("RIGHT ANGLE WITH ARC" #x22BE)
+    ("RIGHT TRIANGLE" #x22BF)
+    ("N-ARY LOGICAL AND" #x22C0)
+    ("N-ARY LOGICAL OR" #x22C1)
+    ("N-ARY INTERSECTION" #x22C2)
+    ("N-ARY UNION" #x22C3)
+    ("DIAMOND OPERATOR" #x22C4)
+    ("DOT OPERATOR" #x22C5)
+    ("STAR OPERATOR" #x22C6)
+    ("DIVISION TIMES" #x22C7)
+    ("BOWTIE" #x22C8)
+    ("LEFT NORMAL FACTOR SEMIDIRECT PRODUCT" #x22C9)
+    ("RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT" #x22CA)
+    ("LEFT SEMIDIRECT PRODUCT" #x22CB)
+    ("RIGHT SEMIDIRECT PRODUCT" #x22CC)
+    ("REVERSED TILDE EQUALS" #x22CD)
+    ("CURLY LOGICAL OR" #x22CE)
+    ("CURLY LOGICAL AND" #x22CF)
+    ("DOUBLE SUBSET" #x22D0)
+    ("DOUBLE SUPERSET" #x22D1)
+    ("DOUBLE INTERSECTION" #x22D2)
+    ("DOUBLE UNION" #x22D3)
+    ("PITCHFORK" #x22D4)
+    ("EQUAL AND PARALLEL TO" #x22D5)
+    ("LESS-THAN WITH DOT" #x22D6)
+    ("GREATER-THAN WITH DOT" #x22D7)
+    ("VERY MUCH LESS-THAN" #x22D8)
+    ("VERY MUCH GREATER-THAN" #x22D9)
+    ("LESS-THAN EQUAL TO OR GREATER-THAN" #x22DA)
+    ("GREATER-THAN EQUAL TO OR LESS-THAN" #x22DB)
+    ("EQUAL TO OR LESS-THAN" #x22DC)
+    ("EQUAL TO OR GREATER-THAN" #x22DD)
+    ("EQUAL TO OR PRECEDES" #x22DE)
+    ("EQUAL TO OR SUCCEEDS" #x22DF)
+    ("DOES NOT PRECEDE OR EQUAL" #x22E0)
+    ("DOES NOT SUCCEED OR EQUAL" #x22E1)
+    ("NOT SQUARE IMAGE OF OR EQUAL TO" #x22E2)
+    ("NOT SQUARE ORIGINAL OF OR EQUAL TO" #x22E3)
+    ("SQUARE IMAGE OF OR NOT EQUAL TO" #x22E4)
+    ("SQUARE ORIGINAL OF OR NOT EQUAL TO" #x22E5)
+    ("LESS-THAN BUT NOT EQUIVALENT TO" #x22E6)
+    ("GREATER-THAN BUT NOT EQUIVALENT TO" #x22E7)
+    ("PRECEDES BUT NOT EQUIVALENT TO" #x22E8)
+    ("SUCCEEDS BUT NOT EQUIVALENT TO" #x22E9)
+    ("NOT NORMAL SUBGROUP OF" #x22EA)
+    ("DOES NOT CONTAIN AS NORMAL SUBGROUP" #x22EB)
+    ("NOT NORMAL SUBGROUP OF OR EQUAL TO" #x22EC)
+    ("DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL" #x22ED)
+    ("VERTICAL ELLIPSIS" #x22EE)
+    ("MIDLINE HORIZONTAL ELLIPSIS" #x22EF)
+    ("UP RIGHT DIAGONAL ELLIPSIS" #x22F0)
+    ("DOWN RIGHT DIAGONAL ELLIPSIS" #x22F1)
+    ("ELEMENT OF WITH LONG HORIZONTAL STROKE" #x22F2)
+    ("ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22F3)
+    ("SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22F4)
+    ("ELEMENT OF WITH DOT ABOVE" #x22F5)
+    ("ELEMENT OF WITH OVERBAR" #x22F6)
+    ("SMALL ELEMENT OF WITH OVERBAR" #x22F7)
+    ("ELEMENT OF WITH UNDERBAR" #x22F8)
+    ("ELEMENT OF WITH TWO HORIZONTAL STROKES" #x22F9)
+    ("CONTAINS WITH LONG HORIZONTAL STROKE" #x22FA)
+    ("CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22FB)
+    ("SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22FC)
+    ("CONTAINS WITH OVERBAR" #x22FD)
+    ("SMALL CONTAINS WITH OVERBAR" #x22FE)
+    ("Z NOTATION BAG MEMBERSHIP" #x22FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02300-023FF.el b/lisp/nxml/char-name/unicode/02300-023FF.el
new file mode 100644 (file)
index 0000000..a255894
--- /dev/null
@@ -0,0 +1,209 @@
+(nxml-define-char-name-set 'miscellaneous-technical
+  '(("DIAMETER SIGN" #x2300)
+    ("ELECTRIC ARROW" #x2301)
+    ("HOUSE" #x2302)
+    ("UP ARROWHEAD" #x2303)
+    ("DOWN ARROWHEAD" #x2304)
+    ("PROJECTIVE" #x2305)
+    ("PERSPECTIVE" #x2306)
+    ("WAVY LINE" #x2307)
+    ("LEFT CEILING" #x2308)
+    ("RIGHT CEILING" #x2309)
+    ("LEFT FLOOR" #x230A)
+    ("RIGHT FLOOR" #x230B)
+    ("BOTTOM RIGHT CROP" #x230C)
+    ("BOTTOM LEFT CROP" #x230D)
+    ("TOP RIGHT CROP" #x230E)
+    ("TOP LEFT CROP" #x230F)
+    ("REVERSED NOT SIGN" #x2310)
+    ("SQUARE LOZENGE" #x2311)
+    ("ARC" #x2312)
+    ("SEGMENT" #x2313)
+    ("SECTOR" #x2314)
+    ("TELEPHONE RECORDER" #x2315)
+    ("POSITION INDICATOR" #x2316)
+    ("VIEWDATA SQUARE" #x2317)
+    ("PLACE OF INTEREST SIGN" #x2318)
+    ("TURNED NOT SIGN" #x2319)
+    ("WATCH" #x231A)
+    ("HOURGLASS" #x231B)
+    ("TOP LEFT CORNER" #x231C)
+    ("TOP RIGHT CORNER" #x231D)
+    ("BOTTOM LEFT CORNER" #x231E)
+    ("BOTTOM RIGHT CORNER" #x231F)
+    ("TOP HALF INTEGRAL" #x2320)
+    ("BOTTOM HALF INTEGRAL" #x2321)
+    ("FROWN" #x2322)
+    ("SMILE" #x2323)
+    ("UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS" #x2324)
+    ("OPTION KEY" #x2325)
+    ("ERASE TO THE RIGHT" #x2326)
+    ("X IN A RECTANGLE BOX" #x2327)
+    ("KEYBOARD" #x2328)
+    ("LEFT-POINTING ANGLE BRACKET" #x2329)
+    ("RIGHT-POINTING ANGLE BRACKET" #x232A)
+    ("ERASE TO THE LEFT" #x232B)
+    ("BENZENE RING" #x232C)
+    ("CYLINDRICITY" #x232D)
+    ("ALL AROUND-PROFILE" #x232E)
+    ("SYMMETRY" #x232F)
+    ("TOTAL RUNOUT" #x2330)
+    ("DIMENSION ORIGIN" #x2331)
+    ("CONICAL TAPER" #x2332)
+    ("SLOPE" #x2333)
+    ("COUNTERBORE" #x2334)
+    ("COUNTERSINK" #x2335)
+    ("APL FUNCTIONAL SYMBOL I-BEAM" #x2336)
+    ("APL FUNCTIONAL SYMBOL SQUISH QUAD" #x2337)
+    ("APL FUNCTIONAL SYMBOL QUAD EQUAL" #x2338)
+    ("APL FUNCTIONAL SYMBOL QUAD DIVIDE" #x2339)
+    ("APL FUNCTIONAL SYMBOL QUAD DIAMOND" #x233A)
+    ("APL FUNCTIONAL SYMBOL QUAD JOT" #x233B)
+    ("APL FUNCTIONAL SYMBOL QUAD CIRCLE" #x233C)
+    ("APL FUNCTIONAL SYMBOL CIRCLE STILE" #x233D)
+    ("APL FUNCTIONAL SYMBOL CIRCLE JOT" #x233E)
+    ("APL FUNCTIONAL SYMBOL SLASH BAR" #x233F)
+    ("APL FUNCTIONAL SYMBOL BACKSLASH BAR" #x2340)
+    ("APL FUNCTIONAL SYMBOL QUAD SLASH" #x2341)
+    ("APL FUNCTIONAL SYMBOL QUAD BACKSLASH" #x2342)
+    ("APL FUNCTIONAL SYMBOL QUAD LESS-THAN" #x2343)
+    ("APL FUNCTIONAL SYMBOL QUAD GREATER-THAN" #x2344)
+    ("APL FUNCTIONAL SYMBOL LEFTWARDS VANE" #x2345)
+    ("APL FUNCTIONAL SYMBOL RIGHTWARDS VANE" #x2346)
+    ("APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW" #x2347)
+    ("APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW" #x2348)
+    ("APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH" #x2349)
+    ("APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR" #x234A)
+    ("APL FUNCTIONAL SYMBOL DELTA STILE" #x234B)
+    ("APL FUNCTIONAL SYMBOL QUAD DOWN CARET" #x234C)
+    ("APL FUNCTIONAL SYMBOL QUAD DELTA" #x234D)
+    ("APL FUNCTIONAL SYMBOL DOWN TACK JOT" #x234E)
+    ("APL FUNCTIONAL SYMBOL UPWARDS VANE" #x234F)
+    ("APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW" #x2350)
+    ("APL FUNCTIONAL SYMBOL UP TACK OVERBAR" #x2351)
+    ("APL FUNCTIONAL SYMBOL DEL STILE" #x2352)
+    ("APL FUNCTIONAL SYMBOL QUAD UP CARET" #x2353)
+    ("APL FUNCTIONAL SYMBOL QUAD DEL" #x2354)
+    ("APL FUNCTIONAL SYMBOL UP TACK JOT" #x2355)
+    ("APL FUNCTIONAL SYMBOL DOWNWARDS VANE" #x2356)
+    ("APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW" #x2357)
+    ("APL FUNCTIONAL SYMBOL QUOTE UNDERBAR" #x2358)
+    ("APL FUNCTIONAL SYMBOL DELTA UNDERBAR" #x2359)
+    ("APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR" #x235A)
+    ("APL FUNCTIONAL SYMBOL JOT UNDERBAR" #x235B)
+    ("APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR" #x235C)
+    ("APL FUNCTIONAL SYMBOL UP SHOE JOT" #x235D)
+    ("APL FUNCTIONAL SYMBOL QUOTE QUAD" #x235E)
+    ("APL FUNCTIONAL SYMBOL CIRCLE STAR" #x235F)
+    ("APL FUNCTIONAL SYMBOL QUAD COLON" #x2360)
+    ("APL FUNCTIONAL SYMBOL UP TACK DIAERESIS" #x2361)
+    ("APL FUNCTIONAL SYMBOL DEL DIAERESIS" #x2362)
+    ("APL FUNCTIONAL SYMBOL STAR DIAERESIS" #x2363)
+    ("APL FUNCTIONAL SYMBOL JOT DIAERESIS" #x2364)
+    ("APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS" #x2365)
+    ("APL FUNCTIONAL SYMBOL DOWN SHOE STILE" #x2366)
+    ("APL FUNCTIONAL SYMBOL LEFT SHOE STILE" #x2367)
+    ("APL FUNCTIONAL SYMBOL TILDE DIAERESIS" #x2368)
+    ("APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS" #x2369)
+    ("APL FUNCTIONAL SYMBOL COMMA BAR" #x236A)
+    ("APL FUNCTIONAL SYMBOL DEL TILDE" #x236B)
+    ("APL FUNCTIONAL SYMBOL ZILDE" #x236C)
+    ("APL FUNCTIONAL SYMBOL STILE TILDE" #x236D)
+    ("APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR" #x236E)
+    ("APL FUNCTIONAL SYMBOL QUAD NOT EQUAL" #x236F)
+    ("APL FUNCTIONAL SYMBOL QUAD QUESTION" #x2370)
+    ("APL FUNCTIONAL SYMBOL DOWN CARET TILDE" #x2371)
+    ("APL FUNCTIONAL SYMBOL UP CARET TILDE" #x2372)
+    ("APL FUNCTIONAL SYMBOL IOTA" #x2373)
+    ("APL FUNCTIONAL SYMBOL RHO" #x2374)
+    ("APL FUNCTIONAL SYMBOL OMEGA" #x2375)
+    ("APL FUNCTIONAL SYMBOL ALPHA UNDERBAR" #x2376)
+    ("APL FUNCTIONAL SYMBOL EPSILON UNDERBAR" #x2377)
+    ("APL FUNCTIONAL SYMBOL IOTA UNDERBAR" #x2378)
+    ("APL FUNCTIONAL SYMBOL OMEGA UNDERBAR" #x2379)
+    ("APL FUNCTIONAL SYMBOL ALPHA" #x237A)
+    ("NOT CHECK MARK" #x237B)
+    ("RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW" #x237C)
+    ("SHOULDERED OPEN BOX" #x237D)
+    ("BELL SYMBOL" #x237E)
+    ("VERTICAL LINE WITH MIDDLE DOT" #x237F)
+    ("INSERTION SYMBOL" #x2380)
+    ("CONTINUOUS UNDERLINE SYMBOL" #x2381)
+    ("DISCONTINUOUS UNDERLINE SYMBOL" #x2382)
+    ("EMPHASIS SYMBOL" #x2383)
+    ("COMPOSITION SYMBOL" #x2384)
+    ("WHITE SQUARE WITH CENTRE VERTICAL LINE" #x2385)
+    ("ENTER SYMBOL" #x2386)
+    ("ALTERNATIVE KEY SYMBOL" #x2387)
+    ("HELM SYMBOL" #x2388)
+    ("CIRCLED HORIZONTAL BAR WITH NOTCH" #x2389)
+    ("CIRCLED TRIANGLE DOWN" #x238A)
+    ("BROKEN CIRCLE WITH NORTHWEST ARROW" #x238B)
+    ("UNDO SYMBOL" #x238C)
+    ("MONOSTABLE SYMBOL" #x238D)
+    ("HYSTERESIS SYMBOL" #x238E)
+    ("OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL" #x238F)
+    ("OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL" #x2390)
+    ("PASSIVE-PULL-DOWN-OUTPUT SYMBOL" #x2391)
+    ("PASSIVE-PULL-UP-OUTPUT SYMBOL" #x2392)
+    ("DIRECT CURRENT SYMBOL FORM TWO" #x2393)
+    ("SOFTWARE-FUNCTION SYMBOL" #x2394)
+    ("APL FUNCTIONAL SYMBOL QUAD" #x2395)
+    ("DECIMAL SEPARATOR KEY SYMBOL" #x2396)
+    ("PREVIOUS PAGE" #x2397)
+    ("NEXT PAGE" #x2398)
+    ("PRINT SCREEN SYMBOL" #x2399)
+    ("CLEAR SCREEN SYMBOL" #x239A)
+    ("LEFT PARENTHESIS UPPER HOOK" #x239B)
+    ("LEFT PARENTHESIS EXTENSION" #x239C)
+    ("LEFT PARENTHESIS LOWER HOOK" #x239D)
+    ("RIGHT PARENTHESIS UPPER HOOK" #x239E)
+    ("RIGHT PARENTHESIS EXTENSION" #x239F)
+    ("RIGHT PARENTHESIS LOWER HOOK" #x23A0)
+    ("LEFT SQUARE BRACKET UPPER CORNER" #x23A1)
+    ("LEFT SQUARE BRACKET EXTENSION" #x23A2)
+    ("LEFT SQUARE BRACKET LOWER CORNER" #x23A3)
+    ("RIGHT SQUARE BRACKET UPPER CORNER" #x23A4)
+    ("RIGHT SQUARE BRACKET EXTENSION" #x23A5)
+    ("RIGHT SQUARE BRACKET LOWER CORNER" #x23A6)
+    ("LEFT CURLY BRACKET UPPER HOOK" #x23A7)
+    ("LEFT CURLY BRACKET MIDDLE PIECE" #x23A8)
+    ("LEFT CURLY BRACKET LOWER HOOK" #x23A9)
+    ("CURLY BRACKET EXTENSION" #x23AA)
+    ("RIGHT CURLY BRACKET UPPER HOOK" #x23AB)
+    ("RIGHT CURLY BRACKET MIDDLE PIECE" #x23AC)
+    ("RIGHT CURLY BRACKET LOWER HOOK" #x23AD)
+    ("INTEGRAL EXTENSION" #x23AE)
+    ("HORIZONTAL LINE EXTENSION" #x23AF)
+    ("UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION" #x23B0)
+    ("UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION" #x23B1)
+    ("SUMMATION TOP" #x23B2)
+    ("SUMMATION BOTTOM" #x23B3)
+    ("TOP SQUARE BRACKET" #x23B4)
+    ("BOTTOM SQUARE BRACKET" #x23B5)
+    ("BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET" #x23B6)
+    ("RADICAL SYMBOL BOTTOM" #x23B7)
+    ("LEFT VERTICAL BOX LINE" #x23B8)
+    ("RIGHT VERTICAL BOX LINE" #x23B9)
+    ("HORIZONTAL SCAN LINE-1" #x23BA)
+    ("HORIZONTAL SCAN LINE-3" #x23BB)
+    ("HORIZONTAL SCAN LINE-7" #x23BC)
+    ("HORIZONTAL SCAN LINE-9" #x23BD)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT" #x23BE)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT" #x23BF)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE" #x23C0)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE" #x23C1)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE" #x23C2)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE" #x23C3)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE" #x23C4)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE" #x23C5)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE" #x23C6)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE" #x23C7)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE" #x23C8)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL" #x23C9)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL" #x23CA)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT" #x23CB)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT" #x23CC)
+    ("SQUARE FOOT" #x23CD)
+    ("RETURN SYMBOL" #x23CE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02400-0243F.el b/lisp/nxml/char-name/unicode/02400-0243F.el
new file mode 100644 (file)
index 0000000..b4cc426
--- /dev/null
@@ -0,0 +1,41 @@
+(nxml-define-char-name-set 'control-pictures
+  '(("SYMBOL FOR NULL" #x2400)
+    ("SYMBOL FOR START OF HEADING" #x2401)
+    ("SYMBOL FOR START OF TEXT" #x2402)
+    ("SYMBOL FOR END OF TEXT" #x2403)
+    ("SYMBOL FOR END OF TRANSMISSION" #x2404)
+    ("SYMBOL FOR ENQUIRY" #x2405)
+    ("SYMBOL FOR ACKNOWLEDGE" #x2406)
+    ("SYMBOL FOR BELL" #x2407)
+    ("SYMBOL FOR BACKSPACE" #x2408)
+    ("SYMBOL FOR HORIZONTAL TABULATION" #x2409)
+    ("SYMBOL FOR LINE FEED" #x240A)
+    ("SYMBOL FOR VERTICAL TABULATION" #x240B)
+    ("SYMBOL FOR FORM FEED" #x240C)
+    ("SYMBOL FOR CARRIAGE RETURN" #x240D)
+    ("SYMBOL FOR SHIFT OUT" #x240E)
+    ("SYMBOL FOR SHIFT IN" #x240F)
+    ("SYMBOL FOR DATA LINK ESCAPE" #x2410)
+    ("SYMBOL FOR DEVICE CONTROL ONE" #x2411)
+    ("SYMBOL FOR DEVICE CONTROL TWO" #x2412)
+    ("SYMBOL FOR DEVICE CONTROL THREE" #x2413)
+    ("SYMBOL FOR DEVICE CONTROL FOUR" #x2414)
+    ("SYMBOL FOR NEGATIVE ACKNOWLEDGE" #x2415)
+    ("SYMBOL FOR SYNCHRONOUS IDLE" #x2416)
+    ("SYMBOL FOR END OF TRANSMISSION BLOCK" #x2417)
+    ("SYMBOL FOR CANCEL" #x2418)
+    ("SYMBOL FOR END OF MEDIUM" #x2419)
+    ("SYMBOL FOR SUBSTITUTE" #x241A)
+    ("SYMBOL FOR ESCAPE" #x241B)
+    ("SYMBOL FOR FILE SEPARATOR" #x241C)
+    ("SYMBOL FOR GROUP SEPARATOR" #x241D)
+    ("SYMBOL FOR RECORD SEPARATOR" #x241E)
+    ("SYMBOL FOR UNIT SEPARATOR" #x241F)
+    ("SYMBOL FOR SPACE" #x2420)
+    ("SYMBOL FOR DELETE" #x2421)
+    ("BLANK SYMBOL" #x2422)
+    ("OPEN BOX" #x2423)
+    ("SYMBOL FOR NEWLINE" #x2424)
+    ("SYMBOL FOR DELETE FORM TWO" #x2425)
+    ("SYMBOL FOR SUBSTITUTE FORM TWO" #x2426)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02440-0245F.el b/lisp/nxml/char-name/unicode/02440-0245F.el
new file mode 100644 (file)
index 0000000..332720d
--- /dev/null
@@ -0,0 +1,13 @@
+(nxml-define-char-name-set 'optical-character-recognition
+  '(("OCR HOOK" #x2440)
+    ("OCR CHAIR" #x2441)
+    ("OCR FORK" #x2442)
+    ("OCR INVERTED FORK" #x2443)
+    ("OCR BELT BUCKLE" #x2444)
+    ("OCR BOW TIE" #x2445)
+    ("OCR BRANCH BANK IDENTIFICATION" #x2446)
+    ("OCR AMOUNT OF CHECK" #x2447)
+    ("OCR DASH" #x2448)
+    ("OCR CUSTOMER ACCOUNT NUMBER" #x2449)
+    ("OCR DOUBLE BACKSLASH" #x244A)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02460-024FF.el b/lisp/nxml/char-name/unicode/02460-024FF.el
new file mode 100644 (file)
index 0000000..41152bf
--- /dev/null
@@ -0,0 +1,161 @@
+(nxml-define-char-name-set 'enclosed-alphanumerics
+  '(("CIRCLED DIGIT ONE" #x2460)
+    ("CIRCLED DIGIT TWO" #x2461)
+    ("CIRCLED DIGIT THREE" #x2462)
+    ("CIRCLED DIGIT FOUR" #x2463)
+    ("CIRCLED DIGIT FIVE" #x2464)
+    ("CIRCLED DIGIT SIX" #x2465)
+    ("CIRCLED DIGIT SEVEN" #x2466)
+    ("CIRCLED DIGIT EIGHT" #x2467)
+    ("CIRCLED DIGIT NINE" #x2468)
+    ("CIRCLED NUMBER TEN" #x2469)
+    ("CIRCLED NUMBER ELEVEN" #x246A)
+    ("CIRCLED NUMBER TWELVE" #x246B)
+    ("CIRCLED NUMBER THIRTEEN" #x246C)
+    ("CIRCLED NUMBER FOURTEEN" #x246D)
+    ("CIRCLED NUMBER FIFTEEN" #x246E)
+    ("CIRCLED NUMBER SIXTEEN" #x246F)
+    ("CIRCLED NUMBER SEVENTEEN" #x2470)
+    ("CIRCLED NUMBER EIGHTEEN" #x2471)
+    ("CIRCLED NUMBER NINETEEN" #x2472)
+    ("CIRCLED NUMBER TWENTY" #x2473)
+    ("PARENTHESIZED DIGIT ONE" #x2474)
+    ("PARENTHESIZED DIGIT TWO" #x2475)
+    ("PARENTHESIZED DIGIT THREE" #x2476)
+    ("PARENTHESIZED DIGIT FOUR" #x2477)
+    ("PARENTHESIZED DIGIT FIVE" #x2478)
+    ("PARENTHESIZED DIGIT SIX" #x2479)
+    ("PARENTHESIZED DIGIT SEVEN" #x247A)
+    ("PARENTHESIZED DIGIT EIGHT" #x247B)
+    ("PARENTHESIZED DIGIT NINE" #x247C)
+    ("PARENTHESIZED NUMBER TEN" #x247D)
+    ("PARENTHESIZED NUMBER ELEVEN" #x247E)
+    ("PARENTHESIZED NUMBER TWELVE" #x247F)
+    ("PARENTHESIZED NUMBER THIRTEEN" #x2480)
+    ("PARENTHESIZED NUMBER FOURTEEN" #x2481)
+    ("PARENTHESIZED NUMBER FIFTEEN" #x2482)
+    ("PARENTHESIZED NUMBER SIXTEEN" #x2483)
+    ("PARENTHESIZED NUMBER SEVENTEEN" #x2484)
+    ("PARENTHESIZED NUMBER EIGHTEEN" #x2485)
+    ("PARENTHESIZED NUMBER NINETEEN" #x2486)
+    ("PARENTHESIZED NUMBER TWENTY" #x2487)
+    ("DIGIT ONE FULL STOP" #x2488)
+    ("DIGIT TWO FULL STOP" #x2489)
+    ("DIGIT THREE FULL STOP" #x248A)
+    ("DIGIT FOUR FULL STOP" #x248B)
+    ("DIGIT FIVE FULL STOP" #x248C)
+    ("DIGIT SIX FULL STOP" #x248D)
+    ("DIGIT SEVEN FULL STOP" #x248E)
+    ("DIGIT EIGHT FULL STOP" #x248F)
+    ("DIGIT NINE FULL STOP" #x2490)
+    ("NUMBER TEN FULL STOP" #x2491)
+    ("NUMBER ELEVEN FULL STOP" #x2492)
+    ("NUMBER TWELVE FULL STOP" #x2493)
+    ("NUMBER THIRTEEN FULL STOP" #x2494)
+    ("NUMBER FOURTEEN FULL STOP" #x2495)
+    ("NUMBER FIFTEEN FULL STOP" #x2496)
+    ("NUMBER SIXTEEN FULL STOP" #x2497)
+    ("NUMBER SEVENTEEN FULL STOP" #x2498)
+    ("NUMBER EIGHTEEN FULL STOP" #x2499)
+    ("NUMBER NINETEEN FULL STOP" #x249A)
+    ("NUMBER TWENTY FULL STOP" #x249B)
+    ("PARENTHESIZED LATIN SMALL LETTER A" #x249C)
+    ("PARENTHESIZED LATIN SMALL LETTER B" #x249D)
+    ("PARENTHESIZED LATIN SMALL LETTER C" #x249E)
+    ("PARENTHESIZED LATIN SMALL LETTER D" #x249F)
+    ("PARENTHESIZED LATIN SMALL LETTER E" #x24A0)
+    ("PARENTHESIZED LATIN SMALL LETTER F" #x24A1)
+    ("PARENTHESIZED LATIN SMALL LETTER G" #x24A2)
+    ("PARENTHESIZED LATIN SMALL LETTER H" #x24A3)
+    ("PARENTHESIZED LATIN SMALL LETTER I" #x24A4)
+    ("PARENTHESIZED LATIN SMALL LETTER J" #x24A5)
+    ("PARENTHESIZED LATIN SMALL LETTER K" #x24A6)
+    ("PARENTHESIZED LATIN SMALL LETTER L" #x24A7)
+    ("PARENTHESIZED LATIN SMALL LETTER M" #x24A8)
+    ("PARENTHESIZED LATIN SMALL LETTER N" #x24A9)
+    ("PARENTHESIZED LATIN SMALL LETTER O" #x24AA)
+    ("PARENTHESIZED LATIN SMALL LETTER P" #x24AB)
+    ("PARENTHESIZED LATIN SMALL LETTER Q" #x24AC)
+    ("PARENTHESIZED LATIN SMALL LETTER R" #x24AD)
+    ("PARENTHESIZED LATIN SMALL LETTER S" #x24AE)
+    ("PARENTHESIZED LATIN SMALL LETTER T" #x24AF)
+    ("PARENTHESIZED LATIN SMALL LETTER U" #x24B0)
+    ("PARENTHESIZED LATIN SMALL LETTER V" #x24B1)
+    ("PARENTHESIZED LATIN SMALL LETTER W" #x24B2)
+    ("PARENTHESIZED LATIN SMALL LETTER X" #x24B3)
+    ("PARENTHESIZED LATIN SMALL LETTER Y" #x24B4)
+    ("PARENTHESIZED LATIN SMALL LETTER Z" #x24B5)
+    ("CIRCLED LATIN CAPITAL LETTER A" #x24B6)
+    ("CIRCLED LATIN CAPITAL LETTER B" #x24B7)
+    ("CIRCLED LATIN CAPITAL LETTER C" #x24B8)
+    ("CIRCLED LATIN CAPITAL LETTER D" #x24B9)
+    ("CIRCLED LATIN CAPITAL LETTER E" #x24BA)
+    ("CIRCLED LATIN CAPITAL LETTER F" #x24BB)
+    ("CIRCLED LATIN CAPITAL LETTER G" #x24BC)
+    ("CIRCLED LATIN CAPITAL LETTER H" #x24BD)
+    ("CIRCLED LATIN CAPITAL LETTER I" #x24BE)
+    ("CIRCLED LATIN CAPITAL LETTER J" #x24BF)
+    ("CIRCLED LATIN CAPITAL LETTER K" #x24C0)
+    ("CIRCLED LATIN CAPITAL LETTER L" #x24C1)
+    ("CIRCLED LATIN CAPITAL LETTER M" #x24C2)
+    ("CIRCLED LATIN CAPITAL LETTER N" #x24C3)
+    ("CIRCLED LATIN CAPITAL LETTER O" #x24C4)
+    ("CIRCLED LATIN CAPITAL LETTER P" #x24C5)
+    ("CIRCLED LATIN CAPITAL LETTER Q" #x24C6)
+    ("CIRCLED LATIN CAPITAL LETTER R" #x24C7)
+    ("CIRCLED LATIN CAPITAL LETTER S" #x24C8)
+    ("CIRCLED LATIN CAPITAL LETTER T" #x24C9)
+    ("CIRCLED LATIN CAPITAL LETTER U" #x24CA)
+    ("CIRCLED LATIN CAPITAL LETTER V" #x24CB)
+    ("CIRCLED LATIN CAPITAL LETTER W" #x24CC)
+    ("CIRCLED LATIN CAPITAL LETTER X" #x24CD)
+    ("CIRCLED LATIN CAPITAL LETTER Y" #x24CE)
+    ("CIRCLED LATIN CAPITAL LETTER Z" #x24CF)
+    ("CIRCLED LATIN SMALL LETTER A" #x24D0)
+    ("CIRCLED LATIN SMALL LETTER B" #x24D1)
+    ("CIRCLED LATIN SMALL LETTER C" #x24D2)
+    ("CIRCLED LATIN SMALL LETTER D" #x24D3)
+    ("CIRCLED LATIN SMALL LETTER E" #x24D4)
+    ("CIRCLED LATIN SMALL LETTER F" #x24D5)
+    ("CIRCLED LATIN SMALL LETTER G" #x24D6)
+    ("CIRCLED LATIN SMALL LETTER H" #x24D7)
+    ("CIRCLED LATIN SMALL LETTER I" #x24D8)
+    ("CIRCLED LATIN SMALL LETTER J" #x24D9)
+    ("CIRCLED LATIN SMALL LETTER K" #x24DA)
+    ("CIRCLED LATIN SMALL LETTER L" #x24DB)
+    ("CIRCLED LATIN SMALL LETTER M" #x24DC)
+    ("CIRCLED LATIN SMALL LETTER N" #x24DD)
+    ("CIRCLED LATIN SMALL LETTER O" #x24DE)
+    ("CIRCLED LATIN SMALL LETTER P" #x24DF)
+    ("CIRCLED LATIN SMALL LETTER Q" #x24E0)
+    ("CIRCLED LATIN SMALL LETTER R" #x24E1)
+    ("CIRCLED LATIN SMALL LETTER S" #x24E2)
+    ("CIRCLED LATIN SMALL LETTER T" #x24E3)
+    ("CIRCLED LATIN SMALL LETTER U" #x24E4)
+    ("CIRCLED LATIN SMALL LETTER V" #x24E5)
+    ("CIRCLED LATIN SMALL LETTER W" #x24E6)
+    ("CIRCLED LATIN SMALL LETTER X" #x24E7)
+    ("CIRCLED LATIN SMALL LETTER Y" #x24E8)
+    ("CIRCLED LATIN SMALL LETTER Z" #x24E9)
+    ("CIRCLED DIGIT ZERO" #x24EA)
+    ("NEGATIVE CIRCLED NUMBER ELEVEN" #x24EB)
+    ("NEGATIVE CIRCLED NUMBER TWELVE" #x24EC)
+    ("NEGATIVE CIRCLED NUMBER THIRTEEN" #x24ED)
+    ("NEGATIVE CIRCLED NUMBER FOURTEEN" #x24EE)
+    ("NEGATIVE CIRCLED NUMBER FIFTEEN" #x24EF)
+    ("NEGATIVE CIRCLED NUMBER SIXTEEN" #x24F0)
+    ("NEGATIVE CIRCLED NUMBER SEVENTEEN" #x24F1)
+    ("NEGATIVE CIRCLED NUMBER EIGHTEEN" #x24F2)
+    ("NEGATIVE CIRCLED NUMBER NINETEEN" #x24F3)
+    ("NEGATIVE CIRCLED NUMBER TWENTY" #x24F4)
+    ("DOUBLE CIRCLED DIGIT ONE" #x24F5)
+    ("DOUBLE CIRCLED DIGIT TWO" #x24F6)
+    ("DOUBLE CIRCLED DIGIT THREE" #x24F7)
+    ("DOUBLE CIRCLED DIGIT FOUR" #x24F8)
+    ("DOUBLE CIRCLED DIGIT FIVE" #x24F9)
+    ("DOUBLE CIRCLED DIGIT SIX" #x24FA)
+    ("DOUBLE CIRCLED DIGIT SEVEN" #x24FB)
+    ("DOUBLE CIRCLED DIGIT EIGHT" #x24FC)
+    ("DOUBLE CIRCLED DIGIT NINE" #x24FD)
+    ("DOUBLE CIRCLED NUMBER TEN" #x24FE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02500-0257F.el b/lisp/nxml/char-name/unicode/02500-0257F.el
new file mode 100644 (file)
index 0000000..bf17039
--- /dev/null
@@ -0,0 +1,130 @@
+(nxml-define-char-name-set 'box-drawing
+  '(("BOX DRAWINGS LIGHT HORIZONTAL" #x2500)
+    ("BOX DRAWINGS HEAVY HORIZONTAL" #x2501)
+    ("BOX DRAWINGS LIGHT VERTICAL" #x2502)
+    ("BOX DRAWINGS HEAVY VERTICAL" #x2503)
+    ("BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL" #x2504)
+    ("BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL" #x2505)
+    ("BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL" #x2506)
+    ("BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL" #x2507)
+    ("BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL" #x2508)
+    ("BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL" #x2509)
+    ("BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL" #x250A)
+    ("BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL" #x250B)
+    ("BOX DRAWINGS LIGHT DOWN AND RIGHT" #x250C)
+    ("BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY" #x250D)
+    ("BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT" #x250E)
+    ("BOX DRAWINGS HEAVY DOWN AND RIGHT" #x250F)
+    ("BOX DRAWINGS LIGHT DOWN AND LEFT" #x2510)
+    ("BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY" #x2511)
+    ("BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT" #x2512)
+    ("BOX DRAWINGS HEAVY DOWN AND LEFT" #x2513)
+    ("BOX DRAWINGS LIGHT UP AND RIGHT" #x2514)
+    ("BOX DRAWINGS UP LIGHT AND RIGHT HEAVY" #x2515)
+    ("BOX DRAWINGS UP HEAVY AND RIGHT LIGHT" #x2516)
+    ("BOX DRAWINGS HEAVY UP AND RIGHT" #x2517)
+    ("BOX DRAWINGS LIGHT UP AND LEFT" #x2518)
+    ("BOX DRAWINGS UP LIGHT AND LEFT HEAVY" #x2519)
+    ("BOX DRAWINGS UP HEAVY AND LEFT LIGHT" #x251A)
+    ("BOX DRAWINGS HEAVY UP AND LEFT" #x251B)
+    ("BOX DRAWINGS LIGHT VERTICAL AND RIGHT" #x251C)
+    ("BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY" #x251D)
+    ("BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT" #x251E)
+    ("BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT" #x251F)
+    ("BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT" #x2520)
+    ("BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY" #x2521)
+    ("BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY" #x2522)
+    ("BOX DRAWINGS HEAVY VERTICAL AND RIGHT" #x2523)
+    ("BOX DRAWINGS LIGHT VERTICAL AND LEFT" #x2524)
+    ("BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY" #x2525)
+    ("BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT" #x2526)
+    ("BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT" #x2527)
+    ("BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT" #x2528)
+    ("BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY" #x2529)
+    ("BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY" #x252A)
+    ("BOX DRAWINGS HEAVY VERTICAL AND LEFT" #x252B)
+    ("BOX DRAWINGS LIGHT DOWN AND HORIZONTAL" #x252C)
+    ("BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT" #x252D)
+    ("BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT" #x252E)
+    ("BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY" #x252F)
+    ("BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT" #x2530)
+    ("BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY" #x2531)
+    ("BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY" #x2532)
+    ("BOX DRAWINGS HEAVY DOWN AND HORIZONTAL" #x2533)
+    ("BOX DRAWINGS LIGHT UP AND HORIZONTAL" #x2534)
+    ("BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT" #x2535)
+    ("BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT" #x2536)
+    ("BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY" #x2537)
+    ("BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT" #x2538)
+    ("BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY" #x2539)
+    ("BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY" #x253A)
+    ("BOX DRAWINGS HEAVY UP AND HORIZONTAL" #x253B)
+    ("BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL" #x253C)
+    ("BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT" #x253D)
+    ("BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT" #x253E)
+    ("BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY" #x253F)
+    ("BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT" #x2540)
+    ("BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT" #x2541)
+    ("BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT" #x2542)
+    ("BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT" #x2543)
+    ("BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT" #x2544)
+    ("BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT" #x2545)
+    ("BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT" #x2546)
+    ("BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY" #x2547)
+    ("BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY" #x2548)
+    ("BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY" #x2549)
+    ("BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY" #x254A)
+    ("BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL" #x254B)
+    ("BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL" #x254C)
+    ("BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL" #x254D)
+    ("BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL" #x254E)
+    ("BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL" #x254F)
+    ("BOX DRAWINGS DOUBLE HORIZONTAL" #x2550)
+    ("BOX DRAWINGS DOUBLE VERTICAL" #x2551)
+    ("BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE" #x2552)
+    ("BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE" #x2553)
+    ("BOX DRAWINGS DOUBLE DOWN AND RIGHT" #x2554)
+    ("BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE" #x2555)
+    ("BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE" #x2556)
+    ("BOX DRAWINGS DOUBLE DOWN AND LEFT" #x2557)
+    ("BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE" #x2558)
+    ("BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE" #x2559)
+    ("BOX DRAWINGS DOUBLE UP AND RIGHT" #x255A)
+    ("BOX DRAWINGS UP SINGLE AND LEFT DOUBLE" #x255B)
+    ("BOX DRAWINGS UP DOUBLE AND LEFT SINGLE" #x255C)
+    ("BOX DRAWINGS DOUBLE UP AND LEFT" #x255D)
+    ("BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE" #x255E)
+    ("BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE" #x255F)
+    ("BOX DRAWINGS DOUBLE VERTICAL AND RIGHT" #x2560)
+    ("BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE" #x2561)
+    ("BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE" #x2562)
+    ("BOX DRAWINGS DOUBLE VERTICAL AND LEFT" #x2563)
+    ("BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE" #x2564)
+    ("BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE" #x2565)
+    ("BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL" #x2566)
+    ("BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE" #x2567)
+    ("BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE" #x2568)
+    ("BOX DRAWINGS DOUBLE UP AND HORIZONTAL" #x2569)
+    ("BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE" #x256A)
+    ("BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE" #x256B)
+    ("BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL" #x256C)
+    ("BOX DRAWINGS LIGHT ARC DOWN AND RIGHT" #x256D)
+    ("BOX DRAWINGS LIGHT ARC DOWN AND LEFT" #x256E)
+    ("BOX DRAWINGS LIGHT ARC UP AND LEFT" #x256F)
+    ("BOX DRAWINGS LIGHT ARC UP AND RIGHT" #x2570)
+    ("BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT" #x2571)
+    ("BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT" #x2572)
+    ("BOX DRAWINGS LIGHT DIAGONAL CROSS" #x2573)
+    ("BOX DRAWINGS LIGHT LEFT" #x2574)
+    ("BOX DRAWINGS LIGHT UP" #x2575)
+    ("BOX DRAWINGS LIGHT RIGHT" #x2576)
+    ("BOX DRAWINGS LIGHT DOWN" #x2577)
+    ("BOX DRAWINGS HEAVY LEFT" #x2578)
+    ("BOX DRAWINGS HEAVY UP" #x2579)
+    ("BOX DRAWINGS HEAVY RIGHT" #x257A)
+    ("BOX DRAWINGS HEAVY DOWN" #x257B)
+    ("BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT" #x257C)
+    ("BOX DRAWINGS LIGHT UP AND HEAVY DOWN" #x257D)
+    ("BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT" #x257E)
+    ("BOX DRAWINGS HEAVY UP AND LIGHT DOWN" #x257F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02580-0259F.el b/lisp/nxml/char-name/unicode/02580-0259F.el
new file mode 100644 (file)
index 0000000..89413a2
--- /dev/null
@@ -0,0 +1,34 @@
+(nxml-define-char-name-set 'block-elements
+  '(("UPPER HALF BLOCK" #x2580)
+    ("LOWER ONE EIGHTH BLOCK" #x2581)
+    ("LOWER ONE QUARTER BLOCK" #x2582)
+    ("LOWER THREE EIGHTHS BLOCK" #x2583)
+    ("LOWER HALF BLOCK" #x2584)
+    ("LOWER FIVE EIGHTHS BLOCK" #x2585)
+    ("LOWER THREE QUARTERS BLOCK" #x2586)
+    ("LOWER SEVEN EIGHTHS BLOCK" #x2587)
+    ("FULL BLOCK" #x2588)
+    ("LEFT SEVEN EIGHTHS BLOCK" #x2589)
+    ("LEFT THREE QUARTERS BLOCK" #x258A)
+    ("LEFT FIVE EIGHTHS BLOCK" #x258B)
+    ("LEFT HALF BLOCK" #x258C)
+    ("LEFT THREE EIGHTHS BLOCK" #x258D)
+    ("LEFT ONE QUARTER BLOCK" #x258E)
+    ("LEFT ONE EIGHTH BLOCK" #x258F)
+    ("RIGHT HALF BLOCK" #x2590)
+    ("LIGHT SHADE" #x2591)
+    ("MEDIUM SHADE" #x2592)
+    ("DARK SHADE" #x2593)
+    ("UPPER ONE EIGHTH BLOCK" #x2594)
+    ("RIGHT ONE EIGHTH BLOCK" #x2595)
+    ("QUADRANT LOWER LEFT" #x2596)
+    ("QUADRANT LOWER RIGHT" #x2597)
+    ("QUADRANT UPPER LEFT" #x2598)
+    ("QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT" #x2599)
+    ("QUADRANT UPPER LEFT AND LOWER RIGHT" #x259A)
+    ("QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT" #x259B)
+    ("QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT" #x259C)
+    ("QUADRANT UPPER RIGHT" #x259D)
+    ("QUADRANT UPPER RIGHT AND LOWER LEFT" #x259E)
+    ("QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT" #x259F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/025A0-025FF.el b/lisp/nxml/char-name/unicode/025A0-025FF.el
new file mode 100644 (file)
index 0000000..2313c78
--- /dev/null
@@ -0,0 +1,98 @@
+(nxml-define-char-name-set 'geometric-shapes
+  '(("BLACK SQUARE" #x25A0)
+    ("WHITE SQUARE" #x25A1)
+    ("WHITE SQUARE WITH ROUNDED CORNERS" #x25A2)
+    ("WHITE SQUARE CONTAINING BLACK SMALL SQUARE" #x25A3)
+    ("SQUARE WITH HORIZONTAL FILL" #x25A4)
+    ("SQUARE WITH VERTICAL FILL" #x25A5)
+    ("SQUARE WITH ORTHOGONAL CROSSHATCH FILL" #x25A6)
+    ("SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL" #x25A7)
+    ("SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL" #x25A8)
+    ("SQUARE WITH DIAGONAL CROSSHATCH FILL" #x25A9)
+    ("BLACK SMALL SQUARE" #x25AA)
+    ("WHITE SMALL SQUARE" #x25AB)
+    ("BLACK RECTANGLE" #x25AC)
+    ("WHITE RECTANGLE" #x25AD)
+    ("BLACK VERTICAL RECTANGLE" #x25AE)
+    ("WHITE VERTICAL RECTANGLE" #x25AF)
+    ("BLACK PARALLELOGRAM" #x25B0)
+    ("WHITE PARALLELOGRAM" #x25B1)
+    ("BLACK UP-POINTING TRIANGLE" #x25B2)
+    ("WHITE UP-POINTING TRIANGLE" #x25B3)
+    ("BLACK UP-POINTING SMALL TRIANGLE" #x25B4)
+    ("WHITE UP-POINTING SMALL TRIANGLE" #x25B5)
+    ("BLACK RIGHT-POINTING TRIANGLE" #x25B6)
+    ("WHITE RIGHT-POINTING TRIANGLE" #x25B7)
+    ("BLACK RIGHT-POINTING SMALL TRIANGLE" #x25B8)
+    ("WHITE RIGHT-POINTING SMALL TRIANGLE" #x25B9)
+    ("BLACK RIGHT-POINTING POINTER" #x25BA)
+    ("WHITE RIGHT-POINTING POINTER" #x25BB)
+    ("BLACK DOWN-POINTING TRIANGLE" #x25BC)
+    ("WHITE DOWN-POINTING TRIANGLE" #x25BD)
+    ("BLACK DOWN-POINTING SMALL TRIANGLE" #x25BE)
+    ("WHITE DOWN-POINTING SMALL TRIANGLE" #x25BF)
+    ("BLACK LEFT-POINTING TRIANGLE" #x25C0)
+    ("WHITE LEFT-POINTING TRIANGLE" #x25C1)
+    ("BLACK LEFT-POINTING SMALL TRIANGLE" #x25C2)
+    ("WHITE LEFT-POINTING SMALL TRIANGLE" #x25C3)
+    ("BLACK LEFT-POINTING POINTER" #x25C4)
+    ("WHITE LEFT-POINTING POINTER" #x25C5)
+    ("BLACK DIAMOND" #x25C6)
+    ("WHITE DIAMOND" #x25C7)
+    ("WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND" #x25C8)
+    ("FISHEYE" #x25C9)
+    ("LOZENGE" #x25CA)
+    ("WHITE CIRCLE" #x25CB)
+    ("DOTTED CIRCLE" #x25CC)
+    ("CIRCLE WITH VERTICAL FILL" #x25CD)
+    ("BULLSEYE" #x25CE)
+    ("BLACK CIRCLE" #x25CF)
+    ("CIRCLE WITH LEFT HALF BLACK" #x25D0)
+    ("CIRCLE WITH RIGHT HALF BLACK" #x25D1)
+    ("CIRCLE WITH LOWER HALF BLACK" #x25D2)
+    ("CIRCLE WITH UPPER HALF BLACK" #x25D3)
+    ("CIRCLE WITH UPPER RIGHT QUADRANT BLACK" #x25D4)
+    ("CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK" #x25D5)
+    ("LEFT HALF BLACK CIRCLE" #x25D6)
+    ("RIGHT HALF BLACK CIRCLE" #x25D7)
+    ("INVERSE BULLET" #x25D8)
+    ("INVERSE WHITE CIRCLE" #x25D9)
+    ("UPPER HALF INVERSE WHITE CIRCLE" #x25DA)
+    ("LOWER HALF INVERSE WHITE CIRCLE" #x25DB)
+    ("UPPER LEFT QUADRANT CIRCULAR ARC" #x25DC)
+    ("UPPER RIGHT QUADRANT CIRCULAR ARC" #x25DD)
+    ("LOWER RIGHT QUADRANT CIRCULAR ARC" #x25DE)
+    ("LOWER LEFT QUADRANT CIRCULAR ARC" #x25DF)
+    ("UPPER HALF CIRCLE" #x25E0)
+    ("LOWER HALF CIRCLE" #x25E1)
+    ("BLACK LOWER RIGHT TRIANGLE" #x25E2)
+    ("BLACK LOWER LEFT TRIANGLE" #x25E3)
+    ("BLACK UPPER LEFT TRIANGLE" #x25E4)
+    ("BLACK UPPER RIGHT TRIANGLE" #x25E5)
+    ("WHITE BULLET" #x25E6)
+    ("SQUARE WITH LEFT HALF BLACK" #x25E7)
+    ("SQUARE WITH RIGHT HALF BLACK" #x25E8)
+    ("SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK" #x25E9)
+    ("SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK" #x25EA)
+    ("WHITE SQUARE WITH VERTICAL BISECTING LINE" #x25EB)
+    ("WHITE UP-POINTING TRIANGLE WITH DOT" #x25EC)
+    ("UP-POINTING TRIANGLE WITH LEFT HALF BLACK" #x25ED)
+    ("UP-POINTING TRIANGLE WITH RIGHT HALF BLACK" #x25EE)
+    ("LARGE CIRCLE" #x25EF)
+    ("WHITE SQUARE WITH UPPER LEFT QUADRANT" #x25F0)
+    ("WHITE SQUARE WITH LOWER LEFT QUADRANT" #x25F1)
+    ("WHITE SQUARE WITH LOWER RIGHT QUADRANT" #x25F2)
+    ("WHITE SQUARE WITH UPPER RIGHT QUADRANT" #x25F3)
+    ("WHITE CIRCLE WITH UPPER LEFT QUADRANT" #x25F4)
+    ("WHITE CIRCLE WITH LOWER LEFT QUADRANT" #x25F5)
+    ("WHITE CIRCLE WITH LOWER RIGHT QUADRANT" #x25F6)
+    ("WHITE CIRCLE WITH UPPER RIGHT QUADRANT" #x25F7)
+    ("UPPER LEFT TRIANGLE" #x25F8)
+    ("UPPER RIGHT TRIANGLE" #x25F9)
+    ("LOWER LEFT TRIANGLE" #x25FA)
+    ("WHITE MEDIUM SQUARE" #x25FB)
+    ("BLACK MEDIUM SQUARE" #x25FC)
+    ("WHITE MEDIUM SMALL SQUARE" #x25FD)
+    ("BLACK MEDIUM SMALL SQUARE" #x25FE)
+    ("LOWER RIGHT TRIANGLE" #x25FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02600-026FF.el b/lisp/nxml/char-name/unicode/02600-026FF.el
new file mode 100644 (file)
index 0000000..eaae9be
--- /dev/null
@@ -0,0 +1,135 @@
+(nxml-define-char-name-set 'miscellaneous-symbols
+  '(("BLACK SUN WITH RAYS" #x2600)
+    ("CLOUD" #x2601)
+    ("UMBRELLA" #x2602)
+    ("SNOWMAN" #x2603)
+    ("COMET" #x2604)
+    ("BLACK STAR" #x2605)
+    ("WHITE STAR" #x2606)
+    ("LIGHTNING" #x2607)
+    ("THUNDERSTORM" #x2608)
+    ("SUN" #x2609)
+    ("ASCENDING NODE" #x260A)
+    ("DESCENDING NODE" #x260B)
+    ("CONJUNCTION" #x260C)
+    ("OPPOSITION" #x260D)
+    ("BLACK TELEPHONE" #x260E)
+    ("WHITE TELEPHONE" #x260F)
+    ("BALLOT BOX" #x2610)
+    ("BALLOT BOX WITH CHECK" #x2611)
+    ("BALLOT BOX WITH X" #x2612)
+    ("SALTIRE" #x2613)
+    ("WHITE SHOGI PIECE" #x2616)
+    ("BLACK SHOGI PIECE" #x2617)
+    ("REVERSED ROTATED FLORAL HEART BULLET" #x2619)
+    ("BLACK LEFT POINTING INDEX" #x261A)
+    ("BLACK RIGHT POINTING INDEX" #x261B)
+    ("WHITE LEFT POINTING INDEX" #x261C)
+    ("WHITE UP POINTING INDEX" #x261D)
+    ("WHITE RIGHT POINTING INDEX" #x261E)
+    ("WHITE DOWN POINTING INDEX" #x261F)
+    ("SKULL AND CROSSBONES" #x2620)
+    ("CAUTION SIGN" #x2621)
+    ("RADIOACTIVE SIGN" #x2622)
+    ("BIOHAZARD SIGN" #x2623)
+    ("CADUCEUS" #x2624)
+    ("ANKH" #x2625)
+    ("ORTHODOX CROSS" #x2626)
+    ("CHI RHO" #x2627)
+    ("CROSS OF LORRAINE" #x2628)
+    ("CROSS OF JERUSALEM" #x2629)
+    ("STAR AND CRESCENT" #x262A)
+    ("FARSI SYMBOL" #x262B)
+    ("ADI SHAKTI" #x262C)
+    ("HAMMER AND SICKLE" #x262D)
+    ("PEACE SYMBOL" #x262E)
+    ("YIN YANG" #x262F)
+    ("TRIGRAM FOR HEAVEN" #x2630)
+    ("TRIGRAM FOR LAKE" #x2631)
+    ("TRIGRAM FOR FIRE" #x2632)
+    ("TRIGRAM FOR THUNDER" #x2633)
+    ("TRIGRAM FOR WIND" #x2634)
+    ("TRIGRAM FOR WATER" #x2635)
+    ("TRIGRAM FOR MOUNTAIN" #x2636)
+    ("TRIGRAM FOR EARTH" #x2637)
+    ("WHEEL OF DHARMA" #x2638)
+    ("WHITE FROWNING FACE" #x2639)
+    ("WHITE SMILING FACE" #x263A)
+    ("BLACK SMILING FACE" #x263B)
+    ("WHITE SUN WITH RAYS" #x263C)
+    ("FIRST QUARTER MOON" #x263D)
+    ("LAST QUARTER MOON" #x263E)
+    ("MERCURY" #x263F)
+    ("FEMALE SIGN" #x2640)
+    ("EARTH" #x2641)
+    ("MALE SIGN" #x2642)
+    ("JUPITER" #x2643)
+    ("SATURN" #x2644)
+    ("URANUS" #x2645)
+    ("NEPTUNE" #x2646)
+    ("PLUTO" #x2647)
+    ("ARIES" #x2648)
+    ("TAURUS" #x2649)
+    ("GEMINI" #x264A)
+    ("CANCER" #x264B)
+    ("LEO" #x264C)
+    ("VIRGO" #x264D)
+    ("LIBRA" #x264E)
+    ("SCORPIUS" #x264F)
+    ("SAGITTARIUS" #x2650)
+    ("CAPRICORN" #x2651)
+    ("AQUARIUS" #x2652)
+    ("PISCES" #x2653)
+    ("WHITE CHESS KING" #x2654)
+    ("WHITE CHESS QUEEN" #x2655)
+    ("WHITE CHESS ROOK" #x2656)
+    ("WHITE CHESS BISHOP" #x2657)
+    ("WHITE CHESS KNIGHT" #x2658)
+    ("WHITE CHESS PAWN" #x2659)
+    ("BLACK CHESS KING" #x265A)
+    ("BLACK CHESS QUEEN" #x265B)
+    ("BLACK CHESS ROOK" #x265C)
+    ("BLACK CHESS BISHOP" #x265D)
+    ("BLACK CHESS KNIGHT" #x265E)
+    ("BLACK CHESS PAWN" #x265F)
+    ("BLACK SPADE SUIT" #x2660)
+    ("WHITE HEART SUIT" #x2661)
+    ("WHITE DIAMOND SUIT" #x2662)
+    ("BLACK CLUB SUIT" #x2663)
+    ("WHITE SPADE SUIT" #x2664)
+    ("BLACK HEART SUIT" #x2665)
+    ("BLACK DIAMOND SUIT" #x2666)
+    ("WHITE CLUB SUIT" #x2667)
+    ("HOT SPRINGS" #x2668)
+    ("QUARTER NOTE" #x2669)
+    ("EIGHTH NOTE" #x266A)
+    ("BEAMED EIGHTH NOTES" #x266B)
+    ("BEAMED SIXTEENTH NOTES" #x266C)
+    ("MUSIC FLAT SIGN" #x266D)
+    ("MUSIC NATURAL SIGN" #x266E)
+    ("MUSIC SHARP SIGN" #x266F)
+    ("WEST SYRIAC CROSS" #x2670)
+    ("EAST SYRIAC CROSS" #x2671)
+    ("UNIVERSAL RECYCLING SYMBOL" #x2672)
+    ("RECYCLING SYMBOL FOR TYPE-1 PLASTICS" #x2673)
+    ("RECYCLING SYMBOL FOR TYPE-2 PLASTICS" #x2674)
+    ("RECYCLING SYMBOL FOR TYPE-3 PLASTICS" #x2675)
+    ("RECYCLING SYMBOL FOR TYPE-4 PLASTICS" #x2676)
+    ("RECYCLING SYMBOL FOR TYPE-5 PLASTICS" #x2677)
+    ("RECYCLING SYMBOL FOR TYPE-6 PLASTICS" #x2678)
+    ("RECYCLING SYMBOL FOR TYPE-7 PLASTICS" #x2679)
+    ("RECYCLING SYMBOL FOR GENERIC MATERIALS" #x267A)
+    ("BLACK UNIVERSAL RECYCLING SYMBOL" #x267B)
+    ("RECYCLED PAPER SYMBOL" #x267C)
+    ("PARTIALLY-RECYCLED PAPER SYMBOL" #x267D)
+    ("DIE FACE-1" #x2680)
+    ("DIE FACE-2" #x2681)
+    ("DIE FACE-3" #x2682)
+    ("DIE FACE-4" #x2683)
+    ("DIE FACE-5" #x2684)
+    ("DIE FACE-6" #x2685)
+    ("WHITE CIRCLE WITH DOT RIGHT" #x2686)
+    ("WHITE CIRCLE WITH TWO DOTS" #x2687)
+    ("BLACK CIRCLE WITH WHITE DOT RIGHT" #x2688)
+    ("BLACK CIRCLE WITH TWO WHITE DOTS" #x2689)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02700-027BF.el b/lisp/nxml/char-name/unicode/02700-027BF.el
new file mode 100644 (file)
index 0000000..e4361a3
--- /dev/null
@@ -0,0 +1,176 @@
+(nxml-define-char-name-set 'dingbats
+  '(("UPPER BLADE SCISSORS" #x2701)
+    ("BLACK SCISSORS" #x2702)
+    ("LOWER BLADE SCISSORS" #x2703)
+    ("WHITE SCISSORS" #x2704)
+    ("TELEPHONE LOCATION SIGN" #x2706)
+    ("TAPE DRIVE" #x2707)
+    ("AIRPLANE" #x2708)
+    ("ENVELOPE" #x2709)
+    ("VICTORY HAND" #x270C)
+    ("WRITING HAND" #x270D)
+    ("LOWER RIGHT PENCIL" #x270E)
+    ("PENCIL" #x270F)
+    ("UPPER RIGHT PENCIL" #x2710)
+    ("WHITE NIB" #x2711)
+    ("BLACK NIB" #x2712)
+    ("CHECK MARK" #x2713)
+    ("HEAVY CHECK MARK" #x2714)
+    ("MULTIPLICATION X" #x2715)
+    ("HEAVY MULTIPLICATION X" #x2716)
+    ("BALLOT X" #x2717)
+    ("HEAVY BALLOT X" #x2718)
+    ("OUTLINED GREEK CROSS" #x2719)
+    ("HEAVY GREEK CROSS" #x271A)
+    ("OPEN CENTRE CROSS" #x271B)
+    ("HEAVY OPEN CENTRE CROSS" #x271C)
+    ("LATIN CROSS" #x271D)
+    ("SHADOWED WHITE LATIN CROSS" #x271E)
+    ("OUTLINED LATIN CROSS" #x271F)
+    ("MALTESE CROSS" #x2720)
+    ("STAR OF DAVID" #x2721)
+    ("FOUR TEARDROP-SPOKED ASTERISK" #x2722)
+    ("FOUR BALLOON-SPOKED ASTERISK" #x2723)
+    ("HEAVY FOUR BALLOON-SPOKED ASTERISK" #x2724)
+    ("FOUR CLUB-SPOKED ASTERISK" #x2725)
+    ("BLACK FOUR POINTED STAR" #x2726)
+    ("WHITE FOUR POINTED STAR" #x2727)
+    ("STRESS OUTLINED WHITE STAR" #x2729)
+    ("CIRCLED WHITE STAR" #x272A)
+    ("OPEN CENTRE BLACK STAR" #x272B)
+    ("BLACK CENTRE WHITE STAR" #x272C)
+    ("OUTLINED BLACK STAR" #x272D)
+    ("HEAVY OUTLINED BLACK STAR" #x272E)
+    ("PINWHEEL STAR" #x272F)
+    ("SHADOWED WHITE STAR" #x2730)
+    ("HEAVY ASTERISK" #x2731)
+    ("OPEN CENTRE ASTERISK" #x2732)
+    ("EIGHT SPOKED ASTERISK" #x2733)
+    ("EIGHT POINTED BLACK STAR" #x2734)
+    ("EIGHT POINTED PINWHEEL STAR" #x2735)
+    ("SIX POINTED BLACK STAR" #x2736)
+    ("EIGHT POINTED RECTILINEAR BLACK STAR" #x2737)
+    ("HEAVY EIGHT POINTED RECTILINEAR BLACK STAR" #x2738)
+    ("TWELVE POINTED BLACK STAR" #x2739)
+    ("SIXTEEN POINTED ASTERISK" #x273A)
+    ("TEARDROP-SPOKED ASTERISK" #x273B)
+    ("OPEN CENTRE TEARDROP-SPOKED ASTERISK" #x273C)
+    ("HEAVY TEARDROP-SPOKED ASTERISK" #x273D)
+    ("SIX PETALLED BLACK AND WHITE FLORETTE" #x273E)
+    ("BLACK FLORETTE" #x273F)
+    ("WHITE FLORETTE" #x2740)
+    ("EIGHT PETALLED OUTLINED BLACK FLORETTE" #x2741)
+    ("CIRCLED OPEN CENTRE EIGHT POINTED STAR" #x2742)
+    ("HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK" #x2743)
+    ("SNOWFLAKE" #x2744)
+    ("TIGHT TRIFOLIATE SNOWFLAKE" #x2745)
+    ("HEAVY CHEVRON SNOWFLAKE" #x2746)
+    ("SPARKLE" #x2747)
+    ("HEAVY SPARKLE" #x2748)
+    ("BALLOON-SPOKED ASTERISK" #x2749)
+    ("EIGHT TEARDROP-SPOKED PROPELLER ASTERISK" #x274A)
+    ("HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK" #x274B)
+    ("SHADOWED WHITE CIRCLE" #x274D)
+    ("LOWER RIGHT DROP-SHADOWED WHITE SQUARE" #x274F)
+    ("UPPER RIGHT DROP-SHADOWED WHITE SQUARE" #x2750)
+    ("LOWER RIGHT SHADOWED WHITE SQUARE" #x2751)
+    ("UPPER RIGHT SHADOWED WHITE SQUARE" #x2752)
+    ("BLACK DIAMOND MINUS WHITE X" #x2756)
+    ("LIGHT VERTICAL BAR" #x2758)
+    ("MEDIUM VERTICAL BAR" #x2759)
+    ("HEAVY VERTICAL BAR" #x275A)
+    ("HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT" #x275B)
+    ("HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT" #x275C)
+    ("HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT" #x275D)
+    ("HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT" #x275E)
+    ("CURVED STEM PARAGRAPH SIGN ORNAMENT" #x2761)
+    ("HEAVY EXCLAMATION MARK ORNAMENT" #x2762)
+    ("HEAVY HEART EXCLAMATION MARK ORNAMENT" #x2763)
+    ("HEAVY BLACK HEART" #x2764)
+    ("ROTATED HEAVY BLACK HEART BULLET" #x2765)
+    ("FLORAL HEART" #x2766)
+    ("ROTATED FLORAL HEART BULLET" #x2767)
+    ("MEDIUM LEFT PARENTHESIS ORNAMENT" #x2768)
+    ("MEDIUM RIGHT PARENTHESIS ORNAMENT" #x2769)
+    ("MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT" #x276A)
+    ("MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT" #x276B)
+    ("MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT" #x276C)
+    ("MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT" #x276D)
+    ("HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT" #x276E)
+    ("HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT" #x276F)
+    ("HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT" #x2770)
+    ("HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT" #x2771)
+    ("LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT" #x2772)
+    ("LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT" #x2773)
+    ("MEDIUM LEFT CURLY BRACKET ORNAMENT" #x2774)
+    ("MEDIUM RIGHT CURLY BRACKET ORNAMENT" #x2775)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT ONE" #x2776)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT TWO" #x2777)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT THREE" #x2778)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT FOUR" #x2779)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT FIVE" #x277A)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT SIX" #x277B)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT SEVEN" #x277C)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT EIGHT" #x277D)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT NINE" #x277E)
+    ("DINGBAT NEGATIVE CIRCLED NUMBER TEN" #x277F)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT ONE" #x2780)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT TWO" #x2781)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT THREE" #x2782)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT FOUR" #x2783)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT FIVE" #x2784)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT SIX" #x2785)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN" #x2786)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT" #x2787)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT NINE" #x2788)
+    ("DINGBAT CIRCLED SANS-SERIF NUMBER TEN" #x2789)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE" #x278A)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO" #x278B)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE" #x278C)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR" #x278D)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE" #x278E)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX" #x278F)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN" #x2790)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT" #x2791)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE" #x2792)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN" #x2793)
+    ("HEAVY WIDE-HEADED RIGHTWARDS ARROW" #x2794)
+    ("HEAVY SOUTH EAST ARROW" #x2798)
+    ("HEAVY RIGHTWARDS ARROW" #x2799)
+    ("HEAVY NORTH EAST ARROW" #x279A)
+    ("DRAFTING POINT RIGHTWARDS ARROW" #x279B)
+    ("HEAVY ROUND-TIPPED RIGHTWARDS ARROW" #x279C)
+    ("TRIANGLE-HEADED RIGHTWARDS ARROW" #x279D)
+    ("HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW" #x279E)
+    ("DASHED TRIANGLE-HEADED RIGHTWARDS ARROW" #x279F)
+    ("HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW" #x27A0)
+    ("BLACK RIGHTWARDS ARROW" #x27A1)
+    ("THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD" #x27A2)
+    ("THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD" #x27A3)
+    ("BLACK RIGHTWARDS ARROWHEAD" #x27A4)
+    ("HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW" #x27A5)
+    ("HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW" #x27A6)
+    ("SQUAT BLACK RIGHTWARDS ARROW" #x27A7)
+    ("HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW" #x27A8)
+    ("RIGHT-SHADED WHITE RIGHTWARDS ARROW" #x27A9)
+    ("LEFT-SHADED WHITE RIGHTWARDS ARROW" #x27AA)
+    ("BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW" #x27AB)
+    ("FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW" #x27AC)
+    ("HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27AD)
+    ("HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27AE)
+    ("NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27AF)
+    ("NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27B1)
+    ("CIRCLED HEAVY WHITE RIGHTWARDS ARROW" #x27B2)
+    ("WHITE-FEATHERED RIGHTWARDS ARROW" #x27B3)
+    ("BLACK-FEATHERED SOUTH EAST ARROW" #x27B4)
+    ("BLACK-FEATHERED RIGHTWARDS ARROW" #x27B5)
+    ("BLACK-FEATHERED NORTH EAST ARROW" #x27B6)
+    ("HEAVY BLACK-FEATHERED SOUTH EAST ARROW" #x27B7)
+    ("HEAVY BLACK-FEATHERED RIGHTWARDS ARROW" #x27B8)
+    ("HEAVY BLACK-FEATHERED NORTH EAST ARROW" #x27B9)
+    ("TEARDROP-BARBED RIGHTWARDS ARROW" #x27BA)
+    ("HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW" #x27BB)
+    ("WEDGE-TAILED RIGHTWARDS ARROW" #x27BC)
+    ("HEAVY WEDGE-TAILED RIGHTWARDS ARROW" #x27BD)
+    ("OPEN-OUTLINED RIGHTWARDS ARROW" #x27BE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/027C0-027EF.el b/lisp/nxml/char-name/unicode/027C0-027EF.el
new file mode 100644 (file)
index 0000000..c68207c
--- /dev/null
@@ -0,0 +1,30 @@
+(nxml-define-char-name-set 'miscellaneous-mathematical-symbols-a
+  '(("WHITE DIAMOND WITH CENTRED DOT" #x27D0)
+    ("AND WITH DOT" #x27D1)
+    ("ELEMENT OF OPENING UPWARDS" #x27D2)
+    ("LOWER RIGHT CORNER WITH DOT" #x27D3)
+    ("UPPER LEFT CORNER WITH DOT" #x27D4)
+    ("LEFT OUTER JOIN" #x27D5)
+    ("RIGHT OUTER JOIN" #x27D6)
+    ("FULL OUTER JOIN" #x27D7)
+    ("LARGE UP TACK" #x27D8)
+    ("LARGE DOWN TACK" #x27D9)
+    ("LEFT AND RIGHT DOUBLE TURNSTILE" #x27DA)
+    ("LEFT AND RIGHT TACK" #x27DB)
+    ("LEFT MULTIMAP" #x27DC)
+    ("LONG RIGHT TACK" #x27DD)
+    ("LONG LEFT TACK" #x27DE)
+    ("UP TACK WITH CIRCLE ABOVE" #x27DF)
+    ("LOZENGE DIVIDED BY HORIZONTAL RULE" #x27E0)
+    ("WHITE CONCAVE-SIDED DIAMOND" #x27E1)
+    ("WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK" #x27E2)
+    ("WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK" #x27E3)
+    ("WHITE SQUARE WITH LEFTWARDS TICK" #x27E4)
+    ("WHITE SQUARE WITH RIGHTWARDS TICK" #x27E5)
+    ("MATHEMATICAL LEFT WHITE SQUARE BRACKET" #x27E6)
+    ("MATHEMATICAL RIGHT WHITE SQUARE BRACKET" #x27E7)
+    ("MATHEMATICAL LEFT ANGLE BRACKET" #x27E8)
+    ("MATHEMATICAL RIGHT ANGLE BRACKET" #x27E9)
+    ("MATHEMATICAL LEFT DOUBLE ANGLE BRACKET" #x27EA)
+    ("MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET" #x27EB)
+    ))
diff --git a/lisp/nxml/char-name/unicode/027F0-027FF.el b/lisp/nxml/char-name/unicode/027F0-027FF.el
new file mode 100644 (file)
index 0000000..3403ce4
--- /dev/null
@@ -0,0 +1,18 @@
+(nxml-define-char-name-set 'supplemental-arrows-a
+  '(("UPWARDS QUADRUPLE ARROW" #x27F0)
+    ("DOWNWARDS QUADRUPLE ARROW" #x27F1)
+    ("ANTICLOCKWISE GAPPED CIRCLE ARROW" #x27F2)
+    ("CLOCKWISE GAPPED CIRCLE ARROW" #x27F3)
+    ("RIGHT ARROW WITH CIRCLED PLUS" #x27F4)
+    ("LONG LEFTWARDS ARROW" #x27F5)
+    ("LONG RIGHTWARDS ARROW" #x27F6)
+    ("LONG LEFT RIGHT ARROW" #x27F7)
+    ("LONG LEFTWARDS DOUBLE ARROW" #x27F8)
+    ("LONG RIGHTWARDS DOUBLE ARROW" #x27F9)
+    ("LONG LEFT RIGHT DOUBLE ARROW" #x27FA)
+    ("LONG LEFTWARDS ARROW FROM BAR" #x27FB)
+    ("LONG RIGHTWARDS ARROW FROM BAR" #x27FC)
+    ("LONG LEFTWARDS DOUBLE ARROW FROM BAR" #x27FD)
+    ("LONG RIGHTWARDS DOUBLE ARROW FROM BAR" #x27FE)
+    ("LONG RIGHTWARDS SQUIGGLE ARROW" #x27FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02800-028FF.el b/lisp/nxml/char-name/unicode/02800-028FF.el
new file mode 100644 (file)
index 0000000..91876d8
--- /dev/null
@@ -0,0 +1,258 @@
+(nxml-define-char-name-set 'braille-patterns
+  '(("BRAILLE PATTERN BLANK" #x2800)
+    ("BRAILLE PATTERN DOTS-1" #x2801)
+    ("BRAILLE PATTERN DOTS-2" #x2802)
+    ("BRAILLE PATTERN DOTS-12" #x2803)
+    ("BRAILLE PATTERN DOTS-3" #x2804)
+    ("BRAILLE PATTERN DOTS-13" #x2805)
+    ("BRAILLE PATTERN DOTS-23" #x2806)
+    ("BRAILLE PATTERN DOTS-123" #x2807)
+    ("BRAILLE PATTERN DOTS-4" #x2808)
+    ("BRAILLE PATTERN DOTS-14" #x2809)
+    ("BRAILLE PATTERN DOTS-24" #x280A)
+    ("BRAILLE PATTERN DOTS-124" #x280B)
+    ("BRAILLE PATTERN DOTS-34" #x280C)
+    ("BRAILLE PATTERN DOTS-134" #x280D)
+    ("BRAILLE PATTERN DOTS-234" #x280E)
+    ("BRAILLE PATTERN DOTS-1234" #x280F)
+    ("BRAILLE PATTERN DOTS-5" #x2810)
+    ("BRAILLE PATTERN DOTS-15" #x2811)
+    ("BRAILLE PATTERN DOTS-25" #x2812)
+    ("BRAILLE PATTERN DOTS-125" #x2813)
+    ("BRAILLE PATTERN DOTS-35" #x2814)
+    ("BRAILLE PATTERN DOTS-135" #x2815)
+    ("BRAILLE PATTERN DOTS-235" #x2816)
+    ("BRAILLE PATTERN DOTS-1235" #x2817)
+    ("BRAILLE PATTERN DOTS-45" #x2818)
+    ("BRAILLE PATTERN DOTS-145" #x2819)
+    ("BRAILLE PATTERN DOTS-245" #x281A)
+    ("BRAILLE PATTERN DOTS-1245" #x281B)
+    ("BRAILLE PATTERN DOTS-345" #x281C)
+    ("BRAILLE PATTERN DOTS-1345" #x281D)
+    ("BRAILLE PATTERN DOTS-2345" #x281E)
+    ("BRAILLE PATTERN DOTS-12345" #x281F)
+    ("BRAILLE PATTERN DOTS-6" #x2820)
+    ("BRAILLE PATTERN DOTS-16" #x2821)
+    ("BRAILLE PATTERN DOTS-26" #x2822)
+    ("BRAILLE PATTERN DOTS-126" #x2823)
+    ("BRAILLE PATTERN DOTS-36" #x2824)
+    ("BRAILLE PATTERN DOTS-136" #x2825)
+    ("BRAILLE PATTERN DOTS-236" #x2826)
+    ("BRAILLE PATTERN DOTS-1236" #x2827)
+    ("BRAILLE PATTERN DOTS-46" #x2828)
+    ("BRAILLE PATTERN DOTS-146" #x2829)
+    ("BRAILLE PATTERN DOTS-246" #x282A)
+    ("BRAILLE PATTERN DOTS-1246" #x282B)
+    ("BRAILLE PATTERN DOTS-346" #x282C)
+    ("BRAILLE PATTERN DOTS-1346" #x282D)
+    ("BRAILLE PATTERN DOTS-2346" #x282E)
+    ("BRAILLE PATTERN DOTS-12346" #x282F)
+    ("BRAILLE PATTERN DOTS-56" #x2830)
+    ("BRAILLE PATTERN DOTS-156" #x2831)
+    ("BRAILLE PATTERN DOTS-256" #x2832)
+    ("BRAILLE PATTERN DOTS-1256" #x2833)
+    ("BRAILLE PATTERN DOTS-356" #x2834)
+    ("BRAILLE PATTERN DOTS-1356" #x2835)
+    ("BRAILLE PATTERN DOTS-2356" #x2836)
+    ("BRAILLE PATTERN DOTS-12356" #x2837)
+    ("BRAILLE PATTERN DOTS-456" #x2838)
+    ("BRAILLE PATTERN DOTS-1456" #x2839)
+    ("BRAILLE PATTERN DOTS-2456" #x283A)
+    ("BRAILLE PATTERN DOTS-12456" #x283B)
+    ("BRAILLE PATTERN DOTS-3456" #x283C)
+    ("BRAILLE PATTERN DOTS-13456" #x283D)
+    ("BRAILLE PATTERN DOTS-23456" #x283E)
+    ("BRAILLE PATTERN DOTS-123456" #x283F)
+    ("BRAILLE PATTERN DOTS-7" #x2840)
+    ("BRAILLE PATTERN DOTS-17" #x2841)
+    ("BRAILLE PATTERN DOTS-27" #x2842)
+    ("BRAILLE PATTERN DOTS-127" #x2843)
+    ("BRAILLE PATTERN DOTS-37" #x2844)
+    ("BRAILLE PATTERN DOTS-137" #x2845)
+    ("BRAILLE PATTERN DOTS-237" #x2846)
+    ("BRAILLE PATTERN DOTS-1237" #x2847)
+    ("BRAILLE PATTERN DOTS-47" #x2848)
+    ("BRAILLE PATTERN DOTS-147" #x2849)
+    ("BRAILLE PATTERN DOTS-247" #x284A)
+    ("BRAILLE PATTERN DOTS-1247" #x284B)
+    ("BRAILLE PATTERN DOTS-347" #x284C)
+    ("BRAILLE PATTERN DOTS-1347" #x284D)
+    ("BRAILLE PATTERN DOTS-2347" #x284E)
+    ("BRAILLE PATTERN DOTS-12347" #x284F)
+    ("BRAILLE PATTERN DOTS-57" #x2850)
+    ("BRAILLE PATTERN DOTS-157" #x2851)
+    ("BRAILLE PATTERN DOTS-257" #x2852)
+    ("BRAILLE PATTERN DOTS-1257" #x2853)
+    ("BRAILLE PATTERN DOTS-357" #x2854)
+    ("BRAILLE PATTERN DOTS-1357" #x2855)
+    ("BRAILLE PATTERN DOTS-2357" #x2856)
+    ("BRAILLE PATTERN DOTS-12357" #x2857)
+    ("BRAILLE PATTERN DOTS-457" #x2858)
+    ("BRAILLE PATTERN DOTS-1457" #x2859)
+    ("BRAILLE PATTERN DOTS-2457" #x285A)
+    ("BRAILLE PATTERN DOTS-12457" #x285B)
+    ("BRAILLE PATTERN DOTS-3457" #x285C)
+    ("BRAILLE PATTERN DOTS-13457" #x285D)
+    ("BRAILLE PATTERN DOTS-23457" #x285E)
+    ("BRAILLE PATTERN DOTS-123457" #x285F)
+    ("BRAILLE PATTERN DOTS-67" #x2860)
+    ("BRAILLE PATTERN DOTS-167" #x2861)
+    ("BRAILLE PATTERN DOTS-267" #x2862)
+    ("BRAILLE PATTERN DOTS-1267" #x2863)
+    ("BRAILLE PATTERN DOTS-367" #x2864)
+    ("BRAILLE PATTERN DOTS-1367" #x2865)
+    ("BRAILLE PATTERN DOTS-2367" #x2866)
+    ("BRAILLE PATTERN DOTS-12367" #x2867)
+    ("BRAILLE PATTERN DOTS-467" #x2868)
+    ("BRAILLE PATTERN DOTS-1467" #x2869)
+    ("BRAILLE PATTERN DOTS-2467" #x286A)
+    ("BRAILLE PATTERN DOTS-12467" #x286B)
+    ("BRAILLE PATTERN DOTS-3467" #x286C)
+    ("BRAILLE PATTERN DOTS-13467" #x286D)
+    ("BRAILLE PATTERN DOTS-23467" #x286E)
+    ("BRAILLE PATTERN DOTS-123467" #x286F)
+    ("BRAILLE PATTERN DOTS-567" #x2870)
+    ("BRAILLE PATTERN DOTS-1567" #x2871)
+    ("BRAILLE PATTERN DOTS-2567" #x2872)
+    ("BRAILLE PATTERN DOTS-12567" #x2873)
+    ("BRAILLE PATTERN DOTS-3567" #x2874)
+    ("BRAILLE PATTERN DOTS-13567" #x2875)
+    ("BRAILLE PATTERN DOTS-23567" #x2876)
+    ("BRAILLE PATTERN DOTS-123567" #x2877)
+    ("BRAILLE PATTERN DOTS-4567" #x2878)
+    ("BRAILLE PATTERN DOTS-14567" #x2879)
+    ("BRAILLE PATTERN DOTS-24567" #x287A)
+    ("BRAILLE PATTERN DOTS-124567" #x287B)
+    ("BRAILLE PATTERN DOTS-34567" #x287C)
+    ("BRAILLE PATTERN DOTS-134567" #x287D)
+    ("BRAILLE PATTERN DOTS-234567" #x287E)
+    ("BRAILLE PATTERN DOTS-1234567" #x287F)
+    ("BRAILLE PATTERN DOTS-8" #x2880)
+    ("BRAILLE PATTERN DOTS-18" #x2881)
+    ("BRAILLE PATTERN DOTS-28" #x2882)
+    ("BRAILLE PATTERN DOTS-128" #x2883)
+    ("BRAILLE PATTERN DOTS-38" #x2884)
+    ("BRAILLE PATTERN DOTS-138" #x2885)
+    ("BRAILLE PATTERN DOTS-238" #x2886)
+    ("BRAILLE PATTERN DOTS-1238" #x2887)
+    ("BRAILLE PATTERN DOTS-48" #x2888)
+    ("BRAILLE PATTERN DOTS-148" #x2889)
+    ("BRAILLE PATTERN DOTS-248" #x288A)
+    ("BRAILLE PATTERN DOTS-1248" #x288B)
+    ("BRAILLE PATTERN DOTS-348" #x288C)
+    ("BRAILLE PATTERN DOTS-1348" #x288D)
+    ("BRAILLE PATTERN DOTS-2348" #x288E)
+    ("BRAILLE PATTERN DOTS-12348" #x288F)
+    ("BRAILLE PATTERN DOTS-58" #x2890)
+    ("BRAILLE PATTERN DOTS-158" #x2891)
+    ("BRAILLE PATTERN DOTS-258" #x2892)
+    ("BRAILLE PATTERN DOTS-1258" #x2893)
+    ("BRAILLE PATTERN DOTS-358" #x2894)
+    ("BRAILLE PATTERN DOTS-1358" #x2895)
+    ("BRAILLE PATTERN DOTS-2358" #x2896)
+    ("BRAILLE PATTERN DOTS-12358" #x2897)
+    ("BRAILLE PATTERN DOTS-458" #x2898)
+    ("BRAILLE PATTERN DOTS-1458" #x2899)
+    ("BRAILLE PATTERN DOTS-2458" #x289A)
+    ("BRAILLE PATTERN DOTS-12458" #x289B)
+    ("BRAILLE PATTERN DOTS-3458" #x289C)
+    ("BRAILLE PATTERN DOTS-13458" #x289D)
+    ("BRAILLE PATTERN DOTS-23458" #x289E)
+    ("BRAILLE PATTERN DOTS-123458" #x289F)
+    ("BRAILLE PATTERN DOTS-68" #x28A0)
+    ("BRAILLE PATTERN DOTS-168" #x28A1)
+    ("BRAILLE PATTERN DOTS-268" #x28A2)
+    ("BRAILLE PATTERN DOTS-1268" #x28A3)
+    ("BRAILLE PATTERN DOTS-368" #x28A4)
+    ("BRAILLE PATTERN DOTS-1368" #x28A5)
+    ("BRAILLE PATTERN DOTS-2368" #x28A6)
+    ("BRAILLE PATTERN DOTS-12368" #x28A7)
+    ("BRAILLE PATTERN DOTS-468" #x28A8)
+    ("BRAILLE PATTERN DOTS-1468" #x28A9)
+    ("BRAILLE PATTERN DOTS-2468" #x28AA)
+    ("BRAILLE PATTERN DOTS-12468" #x28AB)
+    ("BRAILLE PATTERN DOTS-3468" #x28AC)
+    ("BRAILLE PATTERN DOTS-13468" #x28AD)
+    ("BRAILLE PATTERN DOTS-23468" #x28AE)
+    ("BRAILLE PATTERN DOTS-123468" #x28AF)
+    ("BRAILLE PATTERN DOTS-568" #x28B0)
+    ("BRAILLE PATTERN DOTS-1568" #x28B1)
+    ("BRAILLE PATTERN DOTS-2568" #x28B2)
+    ("BRAILLE PATTERN DOTS-12568" #x28B3)
+    ("BRAILLE PATTERN DOTS-3568" #x28B4)
+    ("BRAILLE PATTERN DOTS-13568" #x28B5)
+    ("BRAILLE PATTERN DOTS-23568" #x28B6)
+    ("BRAILLE PATTERN DOTS-123568" #x28B7)
+    ("BRAILLE PATTERN DOTS-4568" #x28B8)
+    ("BRAILLE PATTERN DOTS-14568" #x28B9)
+    ("BRAILLE PATTERN DOTS-24568" #x28BA)
+    ("BRAILLE PATTERN DOTS-124568" #x28BB)
+    ("BRAILLE PATTERN DOTS-34568" #x28BC)
+    ("BRAILLE PATTERN DOTS-134568" #x28BD)
+    ("BRAILLE PATTERN DOTS-234568" #x28BE)
+    ("BRAILLE PATTERN DOTS-1234568" #x28BF)
+    ("BRAILLE PATTERN DOTS-78" #x28C0)
+    ("BRAILLE PATTERN DOTS-178" #x28C1)
+    ("BRAILLE PATTERN DOTS-278" #x28C2)
+    ("BRAILLE PATTERN DOTS-1278" #x28C3)
+    ("BRAILLE PATTERN DOTS-378" #x28C4)
+    ("BRAILLE PATTERN DOTS-1378" #x28C5)
+    ("BRAILLE PATTERN DOTS-2378" #x28C6)
+    ("BRAILLE PATTERN DOTS-12378" #x28C7)
+    ("BRAILLE PATTERN DOTS-478" #x28C8)
+    ("BRAILLE PATTERN DOTS-1478" #x28C9)
+    ("BRAILLE PATTERN DOTS-2478" #x28CA)
+    ("BRAILLE PATTERN DOTS-12478" #x28CB)
+    ("BRAILLE PATTERN DOTS-3478" #x28CC)
+    ("BRAILLE PATTERN DOTS-13478" #x28CD)
+    ("BRAILLE PATTERN DOTS-23478" #x28CE)
+    ("BRAILLE PATTERN DOTS-123478" #x28CF)
+    ("BRAILLE PATTERN DOTS-578" #x28D0)
+    ("BRAILLE PATTERN DOTS-1578" #x28D1)
+    ("BRAILLE PATTERN DOTS-2578" #x28D2)
+    ("BRAILLE PATTERN DOTS-12578" #x28D3)
+    ("BRAILLE PATTERN DOTS-3578" #x28D4)
+    ("BRAILLE PATTERN DOTS-13578" #x28D5)
+    ("BRAILLE PATTERN DOTS-23578" #x28D6)
+    ("BRAILLE PATTERN DOTS-123578" #x28D7)
+    ("BRAILLE PATTERN DOTS-4578" #x28D8)
+    ("BRAILLE PATTERN DOTS-14578" #x28D9)
+    ("BRAILLE PATTERN DOTS-24578" #x28DA)
+    ("BRAILLE PATTERN DOTS-124578" #x28DB)
+    ("BRAILLE PATTERN DOTS-34578" #x28DC)
+    ("BRAILLE PATTERN DOTS-134578" #x28DD)
+    ("BRAILLE PATTERN DOTS-234578" #x28DE)
+    ("BRAILLE PATTERN DOTS-1234578" #x28DF)
+    ("BRAILLE PATTERN DOTS-678" #x28E0)
+    ("BRAILLE PATTERN DOTS-1678" #x28E1)
+    ("BRAILLE PATTERN DOTS-2678" #x28E2)
+    ("BRAILLE PATTERN DOTS-12678" #x28E3)
+    ("BRAILLE PATTERN DOTS-3678" #x28E4)
+    ("BRAILLE PATTERN DOTS-13678" #x28E5)
+    ("BRAILLE PATTERN DOTS-23678" #x28E6)
+    ("BRAILLE PATTERN DOTS-123678" #x28E7)
+    ("BRAILLE PATTERN DOTS-4678" #x28E8)
+    ("BRAILLE PATTERN DOTS-14678" #x28E9)
+    ("BRAILLE PATTERN DOTS-24678" #x28EA)
+    ("BRAILLE PATTERN DOTS-124678" #x28EB)
+    ("BRAILLE PATTERN DOTS-34678" #x28EC)
+    ("BRAILLE PATTERN DOTS-134678" #x28ED)
+    ("BRAILLE PATTERN DOTS-234678" #x28EE)
+    ("BRAILLE PATTERN DOTS-1234678" #x28EF)
+    ("BRAILLE PATTERN DOTS-5678" #x28F0)
+    ("BRAILLE PATTERN DOTS-15678" #x28F1)
+    ("BRAILLE PATTERN DOTS-25678" #x28F2)
+    ("BRAILLE PATTERN DOTS-125678" #x28F3)
+    ("BRAILLE PATTERN DOTS-35678" #x28F4)
+    ("BRAILLE PATTERN DOTS-135678" #x28F5)
+    ("BRAILLE PATTERN DOTS-235678" #x28F6)
+    ("BRAILLE PATTERN DOTS-1235678" #x28F7)
+    ("BRAILLE PATTERN DOTS-45678" #x28F8)
+    ("BRAILLE PATTERN DOTS-145678" #x28F9)
+    ("BRAILLE PATTERN DOTS-245678" #x28FA)
+    ("BRAILLE PATTERN DOTS-1245678" #x28FB)
+    ("BRAILLE PATTERN DOTS-345678" #x28FC)
+    ("BRAILLE PATTERN DOTS-1345678" #x28FD)
+    ("BRAILLE PATTERN DOTS-2345678" #x28FE)
+    ("BRAILLE PATTERN DOTS-12345678" #x28FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02900-0297F.el b/lisp/nxml/char-name/unicode/02900-0297F.el
new file mode 100644 (file)
index 0000000..a70eb7f
--- /dev/null
@@ -0,0 +1,130 @@
+(nxml-define-char-name-set 'supplemental-arrows-b
+  '(("RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE" #x2900)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE" #x2901)
+    ("LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE" #x2902)
+    ("RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE" #x2903)
+    ("LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE" #x2904)
+    ("RIGHTWARDS TWO-HEADED ARROW FROM BAR" #x2905)
+    ("LEFTWARDS DOUBLE ARROW FROM BAR" #x2906)
+    ("RIGHTWARDS DOUBLE ARROW FROM BAR" #x2907)
+    ("DOWNWARDS ARROW WITH HORIZONTAL STROKE" #x2908)
+    ("UPWARDS ARROW WITH HORIZONTAL STROKE" #x2909)
+    ("UPWARDS TRIPLE ARROW" #x290A)
+    ("DOWNWARDS TRIPLE ARROW" #x290B)
+    ("LEFTWARDS DOUBLE DASH ARROW" #x290C)
+    ("RIGHTWARDS DOUBLE DASH ARROW" #x290D)
+    ("LEFTWARDS TRIPLE DASH ARROW" #x290E)
+    ("RIGHTWARDS TRIPLE DASH ARROW" #x290F)
+    ("RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW" #x2910)
+    ("RIGHTWARDS ARROW WITH DOTTED STEM" #x2911)
+    ("UPWARDS ARROW TO BAR" #x2912)
+    ("DOWNWARDS ARROW TO BAR" #x2913)
+    ("RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE" #x2914)
+    ("RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE" #x2915)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH TAIL" #x2916)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE" #x2917)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE" #x2918)
+    ("LEFTWARDS ARROW-TAIL" #x2919)
+    ("RIGHTWARDS ARROW-TAIL" #x291A)
+    ("LEFTWARDS DOUBLE ARROW-TAIL" #x291B)
+    ("RIGHTWARDS DOUBLE ARROW-TAIL" #x291C)
+    ("LEFTWARDS ARROW TO BLACK DIAMOND" #x291D)
+    ("RIGHTWARDS ARROW TO BLACK DIAMOND" #x291E)
+    ("LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND" #x291F)
+    ("RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND" #x2920)
+    ("NORTH WEST AND SOUTH EAST ARROW" #x2921)
+    ("NORTH EAST AND SOUTH WEST ARROW" #x2922)
+    ("NORTH WEST ARROW WITH HOOK" #x2923)
+    ("NORTH EAST ARROW WITH HOOK" #x2924)
+    ("SOUTH EAST ARROW WITH HOOK" #x2925)
+    ("SOUTH WEST ARROW WITH HOOK" #x2926)
+    ("NORTH WEST ARROW AND NORTH EAST ARROW" #x2927)
+    ("NORTH EAST ARROW AND SOUTH EAST ARROW" #x2928)
+    ("SOUTH EAST ARROW AND SOUTH WEST ARROW" #x2929)
+    ("SOUTH WEST ARROW AND NORTH WEST ARROW" #x292A)
+    ("RISING DIAGONAL CROSSING FALLING DIAGONAL" #x292B)
+    ("FALLING DIAGONAL CROSSING RISING DIAGONAL" #x292C)
+    ("SOUTH EAST ARROW CROSSING NORTH EAST ARROW" #x292D)
+    ("NORTH EAST ARROW CROSSING SOUTH EAST ARROW" #x292E)
+    ("FALLING DIAGONAL CROSSING NORTH EAST ARROW" #x292F)
+    ("RISING DIAGONAL CROSSING SOUTH EAST ARROW" #x2930)
+    ("NORTH EAST ARROW CROSSING NORTH WEST ARROW" #x2931)
+    ("NORTH WEST ARROW CROSSING NORTH EAST ARROW" #x2932)
+    ("WAVE ARROW POINTING DIRECTLY RIGHT" #x2933)
+    ("ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS" #x2934)
+    ("ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS" #x2935)
+    ("ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS" #x2936)
+    ("ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS" #x2937)
+    ("RIGHT-SIDE ARC CLOCKWISE ARROW" #x2938)
+    ("LEFT-SIDE ARC ANTICLOCKWISE ARROW" #x2939)
+    ("TOP ARC ANTICLOCKWISE ARROW" #x293A)
+    ("BOTTOM ARC ANTICLOCKWISE ARROW" #x293B)
+    ("TOP ARC CLOCKWISE ARROW WITH MINUS" #x293C)
+    ("TOP ARC ANTICLOCKWISE ARROW WITH PLUS" #x293D)
+    ("LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW" #x293E)
+    ("LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW" #x293F)
+    ("ANTICLOCKWISE CLOSED CIRCLE ARROW" #x2940)
+    ("CLOCKWISE CLOSED CIRCLE ARROW" #x2941)
+    ("RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW" #x2942)
+    ("LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW" #x2943)
+    ("SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW" #x2944)
+    ("RIGHTWARDS ARROW WITH PLUS BELOW" #x2945)
+    ("LEFTWARDS ARROW WITH PLUS BELOW" #x2946)
+    ("RIGHTWARDS ARROW THROUGH X" #x2947)
+    ("LEFT RIGHT ARROW THROUGH SMALL CIRCLE" #x2948)
+    ("UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE" #x2949)
+    ("LEFT BARB UP RIGHT BARB DOWN HARPOON" #x294A)
+    ("LEFT BARB DOWN RIGHT BARB UP HARPOON" #x294B)
+    ("UP BARB RIGHT DOWN BARB LEFT HARPOON" #x294C)
+    ("UP BARB LEFT DOWN BARB RIGHT HARPOON" #x294D)
+    ("LEFT BARB UP RIGHT BARB UP HARPOON" #x294E)
+    ("UP BARB RIGHT DOWN BARB RIGHT HARPOON" #x294F)
+    ("LEFT BARB DOWN RIGHT BARB DOWN HARPOON" #x2950)
+    ("UP BARB LEFT DOWN BARB LEFT HARPOON" #x2951)
+    ("LEFTWARDS HARPOON WITH BARB UP TO BAR" #x2952)
+    ("RIGHTWARDS HARPOON WITH BARB UP TO BAR" #x2953)
+    ("UPWARDS HARPOON WITH BARB RIGHT TO BAR" #x2954)
+    ("DOWNWARDS HARPOON WITH BARB RIGHT TO BAR" #x2955)
+    ("LEFTWARDS HARPOON WITH BARB DOWN TO BAR" #x2956)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN TO BAR" #x2957)
+    ("UPWARDS HARPOON WITH BARB LEFT TO BAR" #x2958)
+    ("DOWNWARDS HARPOON WITH BARB LEFT TO BAR" #x2959)
+    ("LEFTWARDS HARPOON WITH BARB UP FROM BAR" #x295A)
+    ("RIGHTWARDS HARPOON WITH BARB UP FROM BAR" #x295B)
+    ("UPWARDS HARPOON WITH BARB RIGHT FROM BAR" #x295C)
+    ("DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR" #x295D)
+    ("LEFTWARDS HARPOON WITH BARB DOWN FROM BAR" #x295E)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR" #x295F)
+    ("UPWARDS HARPOON WITH BARB LEFT FROM BAR" #x2960)
+    ("DOWNWARDS HARPOON WITH BARB LEFT FROM BAR" #x2961)
+    ("LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN" #x2962)
+    ("UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT" #x2963)
+    ("RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN" #x2964)
+    ("DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT" #x2965)
+    ("LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP" #x2966)
+    ("LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN" #x2967)
+    ("RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP" #x2968)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN" #x2969)
+    ("LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH" #x296A)
+    ("LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH" #x296B)
+    ("RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH" #x296C)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH" #x296D)
+    ("UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT" #x296E)
+    ("DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT" #x296F)
+    ("RIGHT DOUBLE ARROW WITH ROUNDED HEAD" #x2970)
+    ("EQUALS SIGN ABOVE RIGHTWARDS ARROW" #x2971)
+    ("TILDE OPERATOR ABOVE RIGHTWARDS ARROW" #x2972)
+    ("LEFTWARDS ARROW ABOVE TILDE OPERATOR" #x2973)
+    ("RIGHTWARDS ARROW ABOVE TILDE OPERATOR" #x2974)
+    ("RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO" #x2975)
+    ("LESS-THAN ABOVE LEFTWARDS ARROW" #x2976)
+    ("LEFTWARDS ARROW THROUGH LESS-THAN" #x2977)
+    ("GREATER-THAN ABOVE RIGHTWARDS ARROW" #x2978)
+    ("SUBSET ABOVE RIGHTWARDS ARROW" #x2979)
+    ("LEFTWARDS ARROW THROUGH SUBSET" #x297A)
+    ("SUPERSET ABOVE LEFTWARDS ARROW" #x297B)
+    ("LEFT FISH TAIL" #x297C)
+    ("RIGHT FISH TAIL" #x297D)
+    ("UP FISH TAIL" #x297E)
+    ("DOWN FISH TAIL" #x297F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02980-029FF.el b/lisp/nxml/char-name/unicode/02980-029FF.el
new file mode 100644 (file)
index 0000000..f1e3687
--- /dev/null
@@ -0,0 +1,130 @@
+(nxml-define-char-name-set 'miscellaneous-mathematical-symbols-b
+  '(("TRIPLE VERTICAL BAR DELIMITER" #x2980)
+    ("Z NOTATION SPOT" #x2981)
+    ("Z NOTATION TYPE COLON" #x2982)
+    ("LEFT WHITE CURLY BRACKET" #x2983)
+    ("RIGHT WHITE CURLY BRACKET" #x2984)
+    ("LEFT WHITE PARENTHESIS" #x2985)
+    ("RIGHT WHITE PARENTHESIS" #x2986)
+    ("Z NOTATION LEFT IMAGE BRACKET" #x2987)
+    ("Z NOTATION RIGHT IMAGE BRACKET" #x2988)
+    ("Z NOTATION LEFT BINDING BRACKET" #x2989)
+    ("Z NOTATION RIGHT BINDING BRACKET" #x298A)
+    ("LEFT SQUARE BRACKET WITH UNDERBAR" #x298B)
+    ("RIGHT SQUARE BRACKET WITH UNDERBAR" #x298C)
+    ("LEFT SQUARE BRACKET WITH TICK IN TOP CORNER" #x298D)
+    ("RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER" #x298E)
+    ("LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER" #x298F)
+    ("RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER" #x2990)
+    ("LEFT ANGLE BRACKET WITH DOT" #x2991)
+    ("RIGHT ANGLE BRACKET WITH DOT" #x2992)
+    ("LEFT ARC LESS-THAN BRACKET" #x2993)
+    ("RIGHT ARC GREATER-THAN BRACKET" #x2994)
+    ("DOUBLE LEFT ARC GREATER-THAN BRACKET" #x2995)
+    ("DOUBLE RIGHT ARC LESS-THAN BRACKET" #x2996)
+    ("LEFT BLACK TORTOISE SHELL BRACKET" #x2997)
+    ("RIGHT BLACK TORTOISE SHELL BRACKET" #x2998)
+    ("DOTTED FENCE" #x2999)
+    ("VERTICAL ZIGZAG LINE" #x299A)
+    ("MEASURED ANGLE OPENING LEFT" #x299B)
+    ("RIGHT ANGLE VARIANT WITH SQUARE" #x299C)
+    ("MEASURED RIGHT ANGLE WITH DOT" #x299D)
+    ("ANGLE WITH S INSIDE" #x299E)
+    ("ACUTE ANGLE" #x299F)
+    ("SPHERICAL ANGLE OPENING LEFT" #x29A0)
+    ("SPHERICAL ANGLE OPENING UP" #x29A1)
+    ("TURNED ANGLE" #x29A2)
+    ("REVERSED ANGLE" #x29A3)
+    ("ANGLE WITH UNDERBAR" #x29A4)
+    ("REVERSED ANGLE WITH UNDERBAR" #x29A5)
+    ("OBLIQUE ANGLE OPENING UP" #x29A6)
+    ("OBLIQUE ANGLE OPENING DOWN" #x29A7)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT" #x29A8)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT" #x29A9)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT" #x29AA)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT" #x29AB)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP" #x29AC)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP" #x29AD)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN" #x29AE)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN" #x29AF)
+    ("REVERSED EMPTY SET" #x29B0)
+    ("EMPTY SET WITH OVERBAR" #x29B1)
+    ("EMPTY SET WITH SMALL CIRCLE ABOVE" #x29B2)
+    ("EMPTY SET WITH RIGHT ARROW ABOVE" #x29B3)
+    ("EMPTY SET WITH LEFT ARROW ABOVE" #x29B4)
+    ("CIRCLE WITH HORIZONTAL BAR" #x29B5)
+    ("CIRCLED VERTICAL BAR" #x29B6)
+    ("CIRCLED PARALLEL" #x29B7)
+    ("CIRCLED REVERSE SOLIDUS" #x29B8)
+    ("CIRCLED PERPENDICULAR" #x29B9)
+    ("CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR" #x29BA)
+    ("CIRCLE WITH SUPERIMPOSED X" #x29BB)
+    ("CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN" #x29BC)
+    ("UP ARROW THROUGH CIRCLE" #x29BD)
+    ("CIRCLED WHITE BULLET" #x29BE)
+    ("CIRCLED BULLET" #x29BF)
+    ("CIRCLED LESS-THAN" #x29C0)
+    ("CIRCLED GREATER-THAN" #x29C1)
+    ("CIRCLE WITH SMALL CIRCLE TO THE RIGHT" #x29C2)
+    ("CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT" #x29C3)
+    ("SQUARED RISING DIAGONAL SLASH" #x29C4)
+    ("SQUARED FALLING DIAGONAL SLASH" #x29C5)
+    ("SQUARED ASTERISK" #x29C6)
+    ("SQUARED SMALL CIRCLE" #x29C7)
+    ("SQUARED SQUARE" #x29C8)
+    ("TWO JOINED SQUARES" #x29C9)
+    ("TRIANGLE WITH DOT ABOVE" #x29CA)
+    ("TRIANGLE WITH UNDERBAR" #x29CB)
+    ("S IN TRIANGLE" #x29CC)
+    ("TRIANGLE WITH SERIFS AT BOTTOM" #x29CD)
+    ("RIGHT TRIANGLE ABOVE LEFT TRIANGLE" #x29CE)
+    ("LEFT TRIANGLE BESIDE VERTICAL BAR" #x29CF)
+    ("VERTICAL BAR BESIDE RIGHT TRIANGLE" #x29D0)
+    ("BOWTIE WITH LEFT HALF BLACK" #x29D1)
+    ("BOWTIE WITH RIGHT HALF BLACK" #x29D2)
+    ("BLACK BOWTIE" #x29D3)
+    ("TIMES WITH LEFT HALF BLACK" #x29D4)
+    ("TIMES WITH RIGHT HALF BLACK" #x29D5)
+    ("WHITE HOURGLASS" #x29D6)
+    ("BLACK HOURGLASS" #x29D7)
+    ("LEFT WIGGLY FENCE" #x29D8)
+    ("RIGHT WIGGLY FENCE" #x29D9)
+    ("LEFT DOUBLE WIGGLY FENCE" #x29DA)
+    ("RIGHT DOUBLE WIGGLY FENCE" #x29DB)
+    ("INCOMPLETE INFINITY" #x29DC)
+    ("TIE OVER INFINITY" #x29DD)
+    ("INFINITY NEGATED WITH VERTICAL BAR" #x29DE)
+    ("DOUBLE-ENDED MULTIMAP" #x29DF)
+    ("SQUARE WITH CONTOURED OUTLINE" #x29E0)
+    ("INCREASES AS" #x29E1)
+    ("SHUFFLE PRODUCT" #x29E2)
+    ("EQUALS SIGN AND SLANTED PARALLEL" #x29E3)
+    ("EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE" #x29E4)
+    ("IDENTICAL TO AND SLANTED PARALLEL" #x29E5)
+    ("GLEICH STARK" #x29E6)
+    ("THERMODYNAMIC" #x29E7)
+    ("DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK" #x29E8)
+    ("DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK" #x29E9)
+    ("BLACK DIAMOND WITH DOWN ARROW" #x29EA)
+    ("BLACK LOZENGE" #x29EB)
+    ("WHITE CIRCLE WITH DOWN ARROW" #x29EC)
+    ("BLACK CIRCLE WITH DOWN ARROW" #x29ED)
+    ("ERROR-BARRED WHITE SQUARE" #x29EE)
+    ("ERROR-BARRED BLACK SQUARE" #x29EF)
+    ("ERROR-BARRED WHITE DIAMOND" #x29F0)
+    ("ERROR-BARRED BLACK DIAMOND" #x29F1)
+    ("ERROR-BARRED WHITE CIRCLE" #x29F2)
+    ("ERROR-BARRED BLACK CIRCLE" #x29F3)
+    ("RULE-DELAYED" #x29F4)
+    ("REVERSE SOLIDUS OPERATOR" #x29F5)
+    ("SOLIDUS WITH OVERBAR" #x29F6)
+    ("REVERSE SOLIDUS WITH HORIZONTAL STROKE" #x29F7)
+    ("BIG SOLIDUS" #x29F8)
+    ("BIG REVERSE SOLIDUS" #x29F9)
+    ("DOUBLE PLUS" #x29FA)
+    ("TRIPLE PLUS" #x29FB)
+    ("LEFT-POINTING CURVED ANGLE BRACKET" #x29FC)
+    ("RIGHT-POINTING CURVED ANGLE BRACKET" #x29FD)
+    ("TINY" #x29FE)
+    ("MINY" #x29FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02A00-02AFF.el b/lisp/nxml/char-name/unicode/02A00-02AFF.el
new file mode 100644 (file)
index 0000000..e6f9ca4
--- /dev/null
@@ -0,0 +1,258 @@
+(nxml-define-char-name-set 'supplemental-mathematical-operators
+  '(("N-ARY CIRCLED DOT OPERATOR" #x2A00)
+    ("N-ARY CIRCLED PLUS OPERATOR" #x2A01)
+    ("N-ARY CIRCLED TIMES OPERATOR" #x2A02)
+    ("N-ARY UNION OPERATOR WITH DOT" #x2A03)
+    ("N-ARY UNION OPERATOR WITH PLUS" #x2A04)
+    ("N-ARY SQUARE INTERSECTION OPERATOR" #x2A05)
+    ("N-ARY SQUARE UNION OPERATOR" #x2A06)
+    ("TWO LOGICAL AND OPERATOR" #x2A07)
+    ("TWO LOGICAL OR OPERATOR" #x2A08)
+    ("N-ARY TIMES OPERATOR" #x2A09)
+    ("MODULO TWO SUM" #x2A0A)
+    ("SUMMATION WITH INTEGRAL" #x2A0B)
+    ("QUADRUPLE INTEGRAL OPERATOR" #x2A0C)
+    ("FINITE PART INTEGRAL" #x2A0D)
+    ("INTEGRAL WITH DOUBLE STROKE" #x2A0E)
+    ("INTEGRAL AVERAGE WITH SLASH" #x2A0F)
+    ("CIRCULATION FUNCTION" #x2A10)
+    ("ANTICLOCKWISE INTEGRATION" #x2A11)
+    ("LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE" #x2A12)
+    ("LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE" #x2A13)
+    ("LINE INTEGRATION NOT INCLUDING THE POLE" #x2A14)
+    ("INTEGRAL AROUND A POINT OPERATOR" #x2A15)
+    ("QUATERNION INTEGRAL OPERATOR" #x2A16)
+    ("INTEGRAL WITH LEFTWARDS ARROW WITH HOOK" #x2A17)
+    ("INTEGRAL WITH TIMES SIGN" #x2A18)
+    ("INTEGRAL WITH INTERSECTION" #x2A19)
+    ("INTEGRAL WITH UNION" #x2A1A)
+    ("INTEGRAL WITH OVERBAR" #x2A1B)
+    ("INTEGRAL WITH UNDERBAR" #x2A1C)
+    ("JOIN" #x2A1D)
+    ("LARGE LEFT TRIANGLE OPERATOR" #x2A1E)
+    ("Z NOTATION SCHEMA COMPOSITION" #x2A1F)
+    ("Z NOTATION SCHEMA PIPING" #x2A20)
+    ("Z NOTATION SCHEMA PROJECTION" #x2A21)
+    ("PLUS SIGN WITH SMALL CIRCLE ABOVE" #x2A22)
+    ("PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE" #x2A23)
+    ("PLUS SIGN WITH TILDE ABOVE" #x2A24)
+    ("PLUS SIGN WITH DOT BELOW" #x2A25)
+    ("PLUS SIGN WITH TILDE BELOW" #x2A26)
+    ("PLUS SIGN WITH SUBSCRIPT TWO" #x2A27)
+    ("PLUS SIGN WITH BLACK TRIANGLE" #x2A28)
+    ("MINUS SIGN WITH COMMA ABOVE" #x2A29)
+    ("MINUS SIGN WITH DOT BELOW" #x2A2A)
+    ("MINUS SIGN WITH FALLING DOTS" #x2A2B)
+    ("MINUS SIGN WITH RISING DOTS" #x2A2C)
+    ("PLUS SIGN IN LEFT HALF CIRCLE" #x2A2D)
+    ("PLUS SIGN IN RIGHT HALF CIRCLE" #x2A2E)
+    ("VECTOR OR CROSS PRODUCT" #x2A2F)
+    ("MULTIPLICATION SIGN WITH DOT ABOVE" #x2A30)
+    ("MULTIPLICATION SIGN WITH UNDERBAR" #x2A31)
+    ("SEMIDIRECT PRODUCT WITH BOTTOM CLOSED" #x2A32)
+    ("SMASH PRODUCT" #x2A33)
+    ("MULTIPLICATION SIGN IN LEFT HALF CIRCLE" #x2A34)
+    ("MULTIPLICATION SIGN IN RIGHT HALF CIRCLE" #x2A35)
+    ("CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT" #x2A36)
+    ("MULTIPLICATION SIGN IN DOUBLE CIRCLE" #x2A37)
+    ("CIRCLED DIVISION SIGN" #x2A38)
+    ("PLUS SIGN IN TRIANGLE" #x2A39)
+    ("MINUS SIGN IN TRIANGLE" #x2A3A)
+    ("MULTIPLICATION SIGN IN TRIANGLE" #x2A3B)
+    ("INTERIOR PRODUCT" #x2A3C)
+    ("RIGHTHAND INTERIOR PRODUCT" #x2A3D)
+    ("Z NOTATION RELATIONAL COMPOSITION" #x2A3E)
+    ("AMALGAMATION OR COPRODUCT" #x2A3F)
+    ("INTERSECTION WITH DOT" #x2A40)
+    ("UNION WITH MINUS SIGN" #x2A41)
+    ("UNION WITH OVERBAR" #x2A42)
+    ("INTERSECTION WITH OVERBAR" #x2A43)
+    ("INTERSECTION WITH LOGICAL AND" #x2A44)
+    ("UNION WITH LOGICAL OR" #x2A45)
+    ("UNION ABOVE INTERSECTION" #x2A46)
+    ("INTERSECTION ABOVE UNION" #x2A47)
+    ("UNION ABOVE BAR ABOVE INTERSECTION" #x2A48)
+    ("INTERSECTION ABOVE BAR ABOVE UNION" #x2A49)
+    ("UNION BESIDE AND JOINED WITH UNION" #x2A4A)
+    ("INTERSECTION BESIDE AND JOINED WITH INTERSECTION" #x2A4B)
+    ("CLOSED UNION WITH SERIFS" #x2A4C)
+    ("CLOSED INTERSECTION WITH SERIFS" #x2A4D)
+    ("DOUBLE SQUARE INTERSECTION" #x2A4E)
+    ("DOUBLE SQUARE UNION" #x2A4F)
+    ("CLOSED UNION WITH SERIFS AND SMASH PRODUCT" #x2A50)
+    ("LOGICAL AND WITH DOT ABOVE" #x2A51)
+    ("LOGICAL OR WITH DOT ABOVE" #x2A52)
+    ("DOUBLE LOGICAL AND" #x2A53)
+    ("DOUBLE LOGICAL OR" #x2A54)
+    ("TWO INTERSECTING LOGICAL AND" #x2A55)
+    ("TWO INTERSECTING LOGICAL OR" #x2A56)
+    ("SLOPING LARGE OR" #x2A57)
+    ("SLOPING LARGE AND" #x2A58)
+    ("LOGICAL OR OVERLAPPING LOGICAL AND" #x2A59)
+    ("LOGICAL AND WITH MIDDLE STEM" #x2A5A)
+    ("LOGICAL OR WITH MIDDLE STEM" #x2A5B)
+    ("LOGICAL AND WITH HORIZONTAL DASH" #x2A5C)
+    ("LOGICAL OR WITH HORIZONTAL DASH" #x2A5D)
+    ("LOGICAL AND WITH DOUBLE OVERBAR" #x2A5E)
+    ("LOGICAL AND WITH UNDERBAR" #x2A5F)
+    ("LOGICAL AND WITH DOUBLE UNDERBAR" #x2A60)
+    ("SMALL VEE WITH UNDERBAR" #x2A61)
+    ("LOGICAL OR WITH DOUBLE OVERBAR" #x2A62)
+    ("LOGICAL OR WITH DOUBLE UNDERBAR" #x2A63)
+    ("Z NOTATION DOMAIN ANTIRESTRICTION" #x2A64)
+    ("Z NOTATION RANGE ANTIRESTRICTION" #x2A65)
+    ("EQUALS SIGN WITH DOT BELOW" #x2A66)
+    ("IDENTICAL WITH DOT ABOVE" #x2A67)
+    ("TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE" #x2A68)
+    ("TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE" #x2A69)
+    ("TILDE OPERATOR WITH DOT ABOVE" #x2A6A)
+    ("TILDE OPERATOR WITH RISING DOTS" #x2A6B)
+    ("SIMILAR MINUS SIMILAR" #x2A6C)
+    ("CONGRUENT WITH DOT ABOVE" #x2A6D)
+    ("EQUALS WITH ASTERISK" #x2A6E)
+    ("ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT" #x2A6F)
+    ("APPROXIMATELY EQUAL OR EQUAL TO" #x2A70)
+    ("EQUALS SIGN ABOVE PLUS SIGN" #x2A71)
+    ("PLUS SIGN ABOVE EQUALS SIGN" #x2A72)
+    ("EQUALS SIGN ABOVE TILDE OPERATOR" #x2A73)
+    ("DOUBLE COLON EQUAL" #x2A74)
+    ("TWO CONSECUTIVE EQUALS SIGNS" #x2A75)
+    ("THREE CONSECUTIVE EQUALS SIGNS" #x2A76)
+    ("EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW" #x2A77)
+    ("EQUIVALENT WITH FOUR DOTS ABOVE" #x2A78)
+    ("LESS-THAN WITH CIRCLE INSIDE" #x2A79)
+    ("GREATER-THAN WITH CIRCLE INSIDE" #x2A7A)
+    ("LESS-THAN WITH QUESTION MARK ABOVE" #x2A7B)
+    ("GREATER-THAN WITH QUESTION MARK ABOVE" #x2A7C)
+    ("LESS-THAN OR SLANTED EQUAL TO" #x2A7D)
+    ("GREATER-THAN OR SLANTED EQUAL TO" #x2A7E)
+    ("LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE" #x2A7F)
+    ("GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE" #x2A80)
+    ("LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE" #x2A81)
+    ("GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE" #x2A82)
+    ("LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT" #x2A83)
+    ("GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT" #x2A84)
+    ("LESS-THAN OR APPROXIMATE" #x2A85)
+    ("GREATER-THAN OR APPROXIMATE" #x2A86)
+    ("LESS-THAN AND SINGLE-LINE NOT EQUAL TO" #x2A87)
+    ("GREATER-THAN AND SINGLE-LINE NOT EQUAL TO" #x2A88)
+    ("LESS-THAN AND NOT APPROXIMATE" #x2A89)
+    ("GREATER-THAN AND NOT APPROXIMATE" #x2A8A)
+    ("LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN" #x2A8B)
+    ("GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN" #x2A8C)
+    ("LESS-THAN ABOVE SIMILAR OR EQUAL" #x2A8D)
+    ("GREATER-THAN ABOVE SIMILAR OR EQUAL" #x2A8E)
+    ("LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN" #x2A8F)
+    ("GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN" #x2A90)
+    ("LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL" #x2A91)
+    ("GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL" #x2A92)
+    ("LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL" #x2A93)
+    ("GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL" #x2A94)
+    ("SLANTED EQUAL TO OR LESS-THAN" #x2A95)
+    ("SLANTED EQUAL TO OR GREATER-THAN" #x2A96)
+    ("SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE" #x2A97)
+    ("SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE" #x2A98)
+    ("DOUBLE-LINE EQUAL TO OR LESS-THAN" #x2A99)
+    ("DOUBLE-LINE EQUAL TO OR GREATER-THAN" #x2A9A)
+    ("DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN" #x2A9B)
+    ("DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN" #x2A9C)
+    ("SIMILAR OR LESS-THAN" #x2A9D)
+    ("SIMILAR OR GREATER-THAN" #x2A9E)
+    ("SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN" #x2A9F)
+    ("SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN" #x2AA0)
+    ("DOUBLE NESTED LESS-THAN" #x2AA1)
+    ("DOUBLE NESTED GREATER-THAN" #x2AA2)
+    ("DOUBLE NESTED LESS-THAN WITH UNDERBAR" #x2AA3)
+    ("GREATER-THAN OVERLAPPING LESS-THAN" #x2AA4)
+    ("GREATER-THAN BESIDE LESS-THAN" #x2AA5)
+    ("LESS-THAN CLOSED BY CURVE" #x2AA6)
+    ("GREATER-THAN CLOSED BY CURVE" #x2AA7)
+    ("LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL" #x2AA8)
+    ("GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL" #x2AA9)
+    ("SMALLER THAN" #x2AAA)
+    ("LARGER THAN" #x2AAB)
+    ("SMALLER THAN OR EQUAL TO" #x2AAC)
+    ("LARGER THAN OR EQUAL TO" #x2AAD)
+    ("EQUALS SIGN WITH BUMPY ABOVE" #x2AAE)
+    ("PRECEDES ABOVE SINGLE-LINE EQUALS SIGN" #x2AAF)
+    ("SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN" #x2AB0)
+    ("PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO" #x2AB1)
+    ("SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO" #x2AB2)
+    ("PRECEDES ABOVE EQUALS SIGN" #x2AB3)
+    ("SUCCEEDS ABOVE EQUALS SIGN" #x2AB4)
+    ("PRECEDES ABOVE NOT EQUAL TO" #x2AB5)
+    ("SUCCEEDS ABOVE NOT EQUAL TO" #x2AB6)
+    ("PRECEDES ABOVE ALMOST EQUAL TO" #x2AB7)
+    ("SUCCEEDS ABOVE ALMOST EQUAL TO" #x2AB8)
+    ("PRECEDES ABOVE NOT ALMOST EQUAL TO" #x2AB9)
+    ("SUCCEEDS ABOVE NOT ALMOST EQUAL TO" #x2ABA)
+    ("DOUBLE PRECEDES" #x2ABB)
+    ("DOUBLE SUCCEEDS" #x2ABC)
+    ("SUBSET WITH DOT" #x2ABD)
+    ("SUPERSET WITH DOT" #x2ABE)
+    ("SUBSET WITH PLUS SIGN BELOW" #x2ABF)
+    ("SUPERSET WITH PLUS SIGN BELOW" #x2AC0)
+    ("SUBSET WITH MULTIPLICATION SIGN BELOW" #x2AC1)
+    ("SUPERSET WITH MULTIPLICATION SIGN BELOW" #x2AC2)
+    ("SUBSET OF OR EQUAL TO WITH DOT ABOVE" #x2AC3)
+    ("SUPERSET OF OR EQUAL TO WITH DOT ABOVE" #x2AC4)
+    ("SUBSET OF ABOVE EQUALS SIGN" #x2AC5)
+    ("SUPERSET OF ABOVE EQUALS SIGN" #x2AC6)
+    ("SUBSET OF ABOVE TILDE OPERATOR" #x2AC7)
+    ("SUPERSET OF ABOVE TILDE OPERATOR" #x2AC8)
+    ("SUBSET OF ABOVE ALMOST EQUAL TO" #x2AC9)
+    ("SUPERSET OF ABOVE ALMOST EQUAL TO" #x2ACA)
+    ("SUBSET OF ABOVE NOT EQUAL TO" #x2ACB)
+    ("SUPERSET OF ABOVE NOT EQUAL TO" #x2ACC)
+    ("SQUARE LEFT OPEN BOX OPERATOR" #x2ACD)
+    ("SQUARE RIGHT OPEN BOX OPERATOR" #x2ACE)
+    ("CLOSED SUBSET" #x2ACF)
+    ("CLOSED SUPERSET" #x2AD0)
+    ("CLOSED SUBSET OR EQUAL TO" #x2AD1)
+    ("CLOSED SUPERSET OR EQUAL TO" #x2AD2)
+    ("SUBSET ABOVE SUPERSET" #x2AD3)
+    ("SUPERSET ABOVE SUBSET" #x2AD4)
+    ("SUBSET ABOVE SUBSET" #x2AD5)
+    ("SUPERSET ABOVE SUPERSET" #x2AD6)
+    ("SUPERSET BESIDE SUBSET" #x2AD7)
+    ("SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET" #x2AD8)
+    ("ELEMENT OF OPENING DOWNWARDS" #x2AD9)
+    ("PITCHFORK WITH TEE TOP" #x2ADA)
+    ("TRANSVERSAL INTERSECTION" #x2ADB)
+    ("FORKING" #x2ADC)
+    ("NONFORKING" #x2ADD)
+    ("SHORT LEFT TACK" #x2ADE)
+    ("SHORT DOWN TACK" #x2ADF)
+    ("SHORT UP TACK" #x2AE0)
+    ("PERPENDICULAR WITH S" #x2AE1)
+    ("VERTICAL BAR TRIPLE RIGHT TURNSTILE" #x2AE2)
+    ("DOUBLE VERTICAL BAR LEFT TURNSTILE" #x2AE3)
+    ("VERTICAL BAR DOUBLE LEFT TURNSTILE" #x2AE4)
+    ("DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE" #x2AE5)
+    ("LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL" #x2AE6)
+    ("SHORT DOWN TACK WITH OVERBAR" #x2AE7)
+    ("SHORT UP TACK WITH UNDERBAR" #x2AE8)
+    ("SHORT UP TACK ABOVE SHORT DOWN TACK" #x2AE9)
+    ("DOUBLE DOWN TACK" #x2AEA)
+    ("DOUBLE UP TACK" #x2AEB)
+    ("DOUBLE STROKE NOT SIGN" #x2AEC)
+    ("REVERSED DOUBLE STROKE NOT SIGN" #x2AED)
+    ("DOES NOT DIVIDE WITH REVERSED NEGATION SLASH" #x2AEE)
+    ("VERTICAL LINE WITH CIRCLE ABOVE" #x2AEF)
+    ("VERTICAL LINE WITH CIRCLE BELOW" #x2AF0)
+    ("DOWN TACK WITH CIRCLE BELOW" #x2AF1)
+    ("PARALLEL WITH HORIZONTAL STROKE" #x2AF2)
+    ("PARALLEL WITH TILDE OPERATOR" #x2AF3)
+    ("TRIPLE VERTICAL BAR BINARY RELATION" #x2AF4)
+    ("TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE" #x2AF5)
+    ("TRIPLE COLON OPERATOR" #x2AF6)
+    ("TRIPLE NESTED LESS-THAN" #x2AF7)
+    ("TRIPLE NESTED GREATER-THAN" #x2AF8)
+    ("DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO" #x2AF9)
+    ("DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO" #x2AFA)
+    ("TRIPLE SOLIDUS BINARY RELATION" #x2AFB)
+    ("LARGE TRIPLE VERTICAL BAR OPERATOR" #x2AFC)
+    ("DOUBLE SOLIDUS OPERATOR" #x2AFD)
+    ("WHITE VERTICAL BAR" #x2AFE)
+    ("N-ARY WHITE VERTICAL BAR" #x2AFF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02E80-02EFF.el b/lisp/nxml/char-name/unicode/02E80-02EFF.el
new file mode 100644 (file)
index 0000000..3cb9018
--- /dev/null
@@ -0,0 +1,117 @@
+(nxml-define-char-name-set 'cjk-radicals-supplement
+  '(("CJK RADICAL REPEAT" #x2E80)
+    ("CJK RADICAL CLIFF" #x2E81)
+    ("CJK RADICAL SECOND ONE" #x2E82)
+    ("CJK RADICAL SECOND TWO" #x2E83)
+    ("CJK RADICAL SECOND THREE" #x2E84)
+    ("CJK RADICAL PERSON" #x2E85)
+    ("CJK RADICAL BOX" #x2E86)
+    ("CJK RADICAL TABLE" #x2E87)
+    ("CJK RADICAL KNIFE ONE" #x2E88)
+    ("CJK RADICAL KNIFE TWO" #x2E89)
+    ("CJK RADICAL DIVINATION" #x2E8A)
+    ("CJK RADICAL SEAL" #x2E8B)
+    ("CJK RADICAL SMALL ONE" #x2E8C)
+    ("CJK RADICAL SMALL TWO" #x2E8D)
+    ("CJK RADICAL LAME ONE" #x2E8E)
+    ("CJK RADICAL LAME TWO" #x2E8F)
+    ("CJK RADICAL LAME THREE" #x2E90)
+    ("CJK RADICAL LAME FOUR" #x2E91)
+    ("CJK RADICAL SNAKE" #x2E92)
+    ("CJK RADICAL THREAD" #x2E93)
+    ("CJK RADICAL SNOUT ONE" #x2E94)
+    ("CJK RADICAL SNOUT TWO" #x2E95)
+    ("CJK RADICAL HEART ONE" #x2E96)
+    ("CJK RADICAL HEART TWO" #x2E97)
+    ("CJK RADICAL HAND" #x2E98)
+    ("CJK RADICAL RAP" #x2E99)
+    ("CJK RADICAL CHOKE" #x2E9B)
+    ("CJK RADICAL SUN" #x2E9C)
+    ("CJK RADICAL MOON" #x2E9D)
+    ("CJK RADICAL DEATH" #x2E9E)
+    ("CJK RADICAL MOTHER" #x2E9F)
+    ("CJK RADICAL CIVILIAN" #x2EA0)
+    ("CJK RADICAL WATER ONE" #x2EA1)
+    ("CJK RADICAL WATER TWO" #x2EA2)
+    ("CJK RADICAL FIRE" #x2EA3)
+    ("CJK RADICAL PAW ONE" #x2EA4)
+    ("CJK RADICAL PAW TWO" #x2EA5)
+    ("CJK RADICAL SIMPLIFIED HALF TREE TRUNK" #x2EA6)
+    ("CJK RADICAL COW" #x2EA7)
+    ("CJK RADICAL DOG" #x2EA8)
+    ("CJK RADICAL JADE" #x2EA9)
+    ("CJK RADICAL BOLT OF CLOTH" #x2EAA)
+    ("CJK RADICAL EYE" #x2EAB)
+    ("CJK RADICAL SPIRIT ONE" #x2EAC)
+    ("CJK RADICAL SPIRIT TWO" #x2EAD)
+    ("CJK RADICAL BAMBOO" #x2EAE)
+    ("CJK RADICAL SILK" #x2EAF)
+    ("CJK RADICAL C-SIMPLIFIED SILK" #x2EB0)
+    ("CJK RADICAL NET ONE" #x2EB1)
+    ("CJK RADICAL NET TWO" #x2EB2)
+    ("CJK RADICAL NET THREE" #x2EB3)
+    ("CJK RADICAL NET FOUR" #x2EB4)
+    ("CJK RADICAL MESH" #x2EB5)
+    ("CJK RADICAL SHEEP" #x2EB6)
+    ("CJK RADICAL RAM" #x2EB7)
+    ("CJK RADICAL EWE" #x2EB8)
+    ("CJK RADICAL OLD" #x2EB9)
+    ("CJK RADICAL BRUSH ONE" #x2EBA)
+    ("CJK RADICAL BRUSH TWO" #x2EBB)
+    ("CJK RADICAL MEAT" #x2EBC)
+    ("CJK RADICAL MORTAR" #x2EBD)
+    ("CJK RADICAL GRASS ONE" #x2EBE)
+    ("CJK RADICAL GRASS TWO" #x2EBF)
+    ("CJK RADICAL GRASS THREE" #x2EC0)
+    ("CJK RADICAL TIGER" #x2EC1)
+    ("CJK RADICAL CLOTHES" #x2EC2)
+    ("CJK RADICAL WEST ONE" #x2EC3)
+    ("CJK RADICAL WEST TWO" #x2EC4)
+    ("CJK RADICAL C-SIMPLIFIED SEE" #x2EC5)
+    ("CJK RADICAL SIMPLIFIED HORN" #x2EC6)
+    ("CJK RADICAL HORN" #x2EC7)
+    ("CJK RADICAL C-SIMPLIFIED SPEECH" #x2EC8)
+    ("CJK RADICAL C-SIMPLIFIED SHELL" #x2EC9)
+    ("CJK RADICAL FOOT" #x2ECA)
+    ("CJK RADICAL C-SIMPLIFIED CART" #x2ECB)
+    ("CJK RADICAL SIMPLIFIED WALK" #x2ECC)
+    ("CJK RADICAL WALK ONE" #x2ECD)
+    ("CJK RADICAL WALK TWO" #x2ECE)
+    ("CJK RADICAL CITY" #x2ECF)
+    ("CJK RADICAL C-SIMPLIFIED GOLD" #x2ED0)
+    ("CJK RADICAL LONG ONE" #x2ED1)
+    ("CJK RADICAL LONG TWO" #x2ED2)
+    ("CJK RADICAL C-SIMPLIFIED LONG" #x2ED3)
+    ("CJK RADICAL C-SIMPLIFIED GATE" #x2ED4)
+    ("CJK RADICAL MOUND ONE" #x2ED5)
+    ("CJK RADICAL MOUND TWO" #x2ED6)
+    ("CJK RADICAL RAIN" #x2ED7)
+    ("CJK RADICAL BLUE" #x2ED8)
+    ("CJK RADICAL C-SIMPLIFIED TANNED LEATHER" #x2ED9)
+    ("CJK RADICAL C-SIMPLIFIED LEAF" #x2EDA)
+    ("CJK RADICAL C-SIMPLIFIED WIND" #x2EDB)
+    ("CJK RADICAL C-SIMPLIFIED FLY" #x2EDC)
+    ("CJK RADICAL EAT ONE" #x2EDD)
+    ("CJK RADICAL EAT TWO" #x2EDE)
+    ("CJK RADICAL EAT THREE" #x2EDF)
+    ("CJK RADICAL C-SIMPLIFIED EAT" #x2EE0)
+    ("CJK RADICAL HEAD" #x2EE1)
+    ("CJK RADICAL C-SIMPLIFIED HORSE" #x2EE2)
+    ("CJK RADICAL BONE" #x2EE3)
+    ("CJK RADICAL GHOST" #x2EE4)
+    ("CJK RADICAL C-SIMPLIFIED FISH" #x2EE5)
+    ("CJK RADICAL C-SIMPLIFIED BIRD" #x2EE6)
+    ("CJK RADICAL C-SIMPLIFIED SALT" #x2EE7)
+    ("CJK RADICAL SIMPLIFIED WHEAT" #x2EE8)
+    ("CJK RADICAL SIMPLIFIED YELLOW" #x2EE9)
+    ("CJK RADICAL C-SIMPLIFIED FROG" #x2EEA)
+    ("CJK RADICAL J-SIMPLIFIED EVEN" #x2EEB)
+    ("CJK RADICAL C-SIMPLIFIED EVEN" #x2EEC)
+    ("CJK RADICAL J-SIMPLIFIED TOOTH" #x2EED)
+    ("CJK RADICAL C-SIMPLIFIED TOOTH" #x2EEE)
+    ("CJK RADICAL J-SIMPLIFIED DRAGON" #x2EEF)
+    ("CJK RADICAL C-SIMPLIFIED DRAGON" #x2EF0)
+    ("CJK RADICAL TURTLE" #x2EF1)
+    ("CJK RADICAL J-SIMPLIFIED TURTLE" #x2EF2)
+    ("CJK RADICAL C-SIMPLIFIED TURTLE" #x2EF3)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02F00-02FDF.el b/lisp/nxml/char-name/unicode/02F00-02FDF.el
new file mode 100644 (file)
index 0000000..89c2027
--- /dev/null
@@ -0,0 +1,216 @@
+(nxml-define-char-name-set 'kangxi-radicals
+  '(("KANGXI RADICAL ONE" #x2F00)
+    ("KANGXI RADICAL LINE" #x2F01)
+    ("KANGXI RADICAL DOT" #x2F02)
+    ("KANGXI RADICAL SLASH" #x2F03)
+    ("KANGXI RADICAL SECOND" #x2F04)
+    ("KANGXI RADICAL HOOK" #x2F05)
+    ("KANGXI RADICAL TWO" #x2F06)
+    ("KANGXI RADICAL LID" #x2F07)
+    ("KANGXI RADICAL MAN" #x2F08)
+    ("KANGXI RADICAL LEGS" #x2F09)
+    ("KANGXI RADICAL ENTER" #x2F0A)
+    ("KANGXI RADICAL EIGHT" #x2F0B)
+    ("KANGXI RADICAL DOWN BOX" #x2F0C)
+    ("KANGXI RADICAL COVER" #x2F0D)
+    ("KANGXI RADICAL ICE" #x2F0E)
+    ("KANGXI RADICAL TABLE" #x2F0F)
+    ("KANGXI RADICAL OPEN BOX" #x2F10)
+    ("KANGXI RADICAL KNIFE" #x2F11)
+    ("KANGXI RADICAL POWER" #x2F12)
+    ("KANGXI RADICAL WRAP" #x2F13)
+    ("KANGXI RADICAL SPOON" #x2F14)
+    ("KANGXI RADICAL RIGHT OPEN BOX" #x2F15)
+    ("KANGXI RADICAL HIDING ENCLOSURE" #x2F16)
+    ("KANGXI RADICAL TEN" #x2F17)
+    ("KANGXI RADICAL DIVINATION" #x2F18)
+    ("KANGXI RADICAL SEAL" #x2F19)
+    ("KANGXI RADICAL CLIFF" #x2F1A)
+    ("KANGXI RADICAL PRIVATE" #x2F1B)
+    ("KANGXI RADICAL AGAIN" #x2F1C)
+    ("KANGXI RADICAL MOUTH" #x2F1D)
+    ("KANGXI RADICAL ENCLOSURE" #x2F1E)
+    ("KANGXI RADICAL EARTH" #x2F1F)
+    ("KANGXI RADICAL SCHOLAR" #x2F20)
+    ("KANGXI RADICAL GO" #x2F21)
+    ("KANGXI RADICAL GO SLOWLY" #x2F22)
+    ("KANGXI RADICAL EVENING" #x2F23)
+    ("KANGXI RADICAL BIG" #x2F24)
+    ("KANGXI RADICAL WOMAN" #x2F25)
+    ("KANGXI RADICAL CHILD" #x2F26)
+    ("KANGXI RADICAL ROOF" #x2F27)
+    ("KANGXI RADICAL INCH" #x2F28)
+    ("KANGXI RADICAL SMALL" #x2F29)
+    ("KANGXI RADICAL LAME" #x2F2A)
+    ("KANGXI RADICAL CORPSE" #x2F2B)
+    ("KANGXI RADICAL SPROUT" #x2F2C)
+    ("KANGXI RADICAL MOUNTAIN" #x2F2D)
+    ("KANGXI RADICAL RIVER" #x2F2E)
+    ("KANGXI RADICAL WORK" #x2F2F)
+    ("KANGXI RADICAL ONESELF" #x2F30)
+    ("KANGXI RADICAL TURBAN" #x2F31)
+    ("KANGXI RADICAL DRY" #x2F32)
+    ("KANGXI RADICAL SHORT THREAD" #x2F33)
+    ("KANGXI RADICAL DOTTED CLIFF" #x2F34)
+    ("KANGXI RADICAL LONG STRIDE" #x2F35)
+    ("KANGXI RADICAL TWO HANDS" #x2F36)
+    ("KANGXI RADICAL SHOOT" #x2F37)
+    ("KANGXI RADICAL BOW" #x2F38)
+    ("KANGXI RADICAL SNOUT" #x2F39)
+    ("KANGXI RADICAL BRISTLE" #x2F3A)
+    ("KANGXI RADICAL STEP" #x2F3B)
+    ("KANGXI RADICAL HEART" #x2F3C)
+    ("KANGXI RADICAL HALBERD" #x2F3D)
+    ("KANGXI RADICAL DOOR" #x2F3E)
+    ("KANGXI RADICAL HAND" #x2F3F)
+    ("KANGXI RADICAL BRANCH" #x2F40)
+    ("KANGXI RADICAL RAP" #x2F41)
+    ("KANGXI RADICAL SCRIPT" #x2F42)
+    ("KANGXI RADICAL DIPPER" #x2F43)
+    ("KANGXI RADICAL AXE" #x2F44)
+    ("KANGXI RADICAL SQUARE" #x2F45)
+    ("KANGXI RADICAL NOT" #x2F46)
+    ("KANGXI RADICAL SUN" #x2F47)
+    ("KANGXI RADICAL SAY" #x2F48)
+    ("KANGXI RADICAL MOON" #x2F49)
+    ("KANGXI RADICAL TREE" #x2F4A)
+    ("KANGXI RADICAL LACK" #x2F4B)
+    ("KANGXI RADICAL STOP" #x2F4C)
+    ("KANGXI RADICAL DEATH" #x2F4D)
+    ("KANGXI RADICAL WEAPON" #x2F4E)
+    ("KANGXI RADICAL DO NOT" #x2F4F)
+    ("KANGXI RADICAL COMPARE" #x2F50)
+    ("KANGXI RADICAL FUR" #x2F51)
+    ("KANGXI RADICAL CLAN" #x2F52)
+    ("KANGXI RADICAL STEAM" #x2F53)
+    ("KANGXI RADICAL WATER" #x2F54)
+    ("KANGXI RADICAL FIRE" #x2F55)
+    ("KANGXI RADICAL CLAW" #x2F56)
+    ("KANGXI RADICAL FATHER" #x2F57)
+    ("KANGXI RADICAL DOUBLE X" #x2F58)
+    ("KANGXI RADICAL HALF TREE TRUNK" #x2F59)
+    ("KANGXI RADICAL SLICE" #x2F5A)
+    ("KANGXI RADICAL FANG" #x2F5B)
+    ("KANGXI RADICAL COW" #x2F5C)
+    ("KANGXI RADICAL DOG" #x2F5D)
+    ("KANGXI RADICAL PROFOUND" #x2F5E)
+    ("KANGXI RADICAL JADE" #x2F5F)
+    ("KANGXI RADICAL MELON" #x2F60)
+    ("KANGXI RADICAL TILE" #x2F61)
+    ("KANGXI RADICAL SWEET" #x2F62)
+    ("KANGXI RADICAL LIFE" #x2F63)
+    ("KANGXI RADICAL USE" #x2F64)
+    ("KANGXI RADICAL FIELD" #x2F65)
+    ("KANGXI RADICAL BOLT OF CLOTH" #x2F66)
+    ("KANGXI RADICAL SICKNESS" #x2F67)
+    ("KANGXI RADICAL DOTTED TENT" #x2F68)
+    ("KANGXI RADICAL WHITE" #x2F69)
+    ("KANGXI RADICAL SKIN" #x2F6A)
+    ("KANGXI RADICAL DISH" #x2F6B)
+    ("KANGXI RADICAL EYE" #x2F6C)
+    ("KANGXI RADICAL SPEAR" #x2F6D)
+    ("KANGXI RADICAL ARROW" #x2F6E)
+    ("KANGXI RADICAL STONE" #x2F6F)
+    ("KANGXI RADICAL SPIRIT" #x2F70)
+    ("KANGXI RADICAL TRACK" #x2F71)
+    ("KANGXI RADICAL GRAIN" #x2F72)
+    ("KANGXI RADICAL CAVE" #x2F73)
+    ("KANGXI RADICAL STAND" #x2F74)
+    ("KANGXI RADICAL BAMBOO" #x2F75)
+    ("KANGXI RADICAL RICE" #x2F76)
+    ("KANGXI RADICAL SILK" #x2F77)
+    ("KANGXI RADICAL JAR" #x2F78)
+    ("KANGXI RADICAL NET" #x2F79)
+    ("KANGXI RADICAL SHEEP" #x2F7A)
+    ("KANGXI RADICAL FEATHER" #x2F7B)
+    ("KANGXI RADICAL OLD" #x2F7C)
+    ("KANGXI RADICAL AND" #x2F7D)
+    ("KANGXI RADICAL PLOW" #x2F7E)
+    ("KANGXI RADICAL EAR" #x2F7F)
+    ("KANGXI RADICAL BRUSH" #x2F80)
+    ("KANGXI RADICAL MEAT" #x2F81)
+    ("KANGXI RADICAL MINISTER" #x2F82)
+    ("KANGXI RADICAL SELF" #x2F83)
+    ("KANGXI RADICAL ARRIVE" #x2F84)
+    ("KANGXI RADICAL MORTAR" #x2F85)
+    ("KANGXI RADICAL TONGUE" #x2F86)
+    ("KANGXI RADICAL OPPOSE" #x2F87)
+    ("KANGXI RADICAL BOAT" #x2F88)
+    ("KANGXI RADICAL STOPPING" #x2F89)
+    ("KANGXI RADICAL COLOR" #x2F8A)
+    ("KANGXI RADICAL GRASS" #x2F8B)
+    ("KANGXI RADICAL TIGER" #x2F8C)
+    ("KANGXI RADICAL INSECT" #x2F8D)
+    ("KANGXI RADICAL BLOOD" #x2F8E)
+    ("KANGXI RADICAL WALK ENCLOSURE" #x2F8F)
+    ("KANGXI RADICAL CLOTHES" #x2F90)
+    ("KANGXI RADICAL WEST" #x2F91)
+    ("KANGXI RADICAL SEE" #x2F92)
+    ("KANGXI RADICAL HORN" #x2F93)
+    ("KANGXI RADICAL SPEECH" #x2F94)
+    ("KANGXI RADICAL VALLEY" #x2F95)
+    ("KANGXI RADICAL BEAN" #x2F96)
+    ("KANGXI RADICAL PIG" #x2F97)
+    ("KANGXI RADICAL BADGER" #x2F98)
+    ("KANGXI RADICAL SHELL" #x2F99)
+    ("KANGXI RADICAL RED" #x2F9A)
+    ("KANGXI RADICAL RUN" #x2F9B)
+    ("KANGXI RADICAL FOOT" #x2F9C)
+    ("KANGXI RADICAL BODY" #x2F9D)
+    ("KANGXI RADICAL CART" #x2F9E)
+    ("KANGXI RADICAL BITTER" #x2F9F)
+    ("KANGXI RADICAL MORNING" #x2FA0)
+    ("KANGXI RADICAL WALK" #x2FA1)
+    ("KANGXI RADICAL CITY" #x2FA2)
+    ("KANGXI RADICAL WINE" #x2FA3)
+    ("KANGXI RADICAL DISTINGUISH" #x2FA4)
+    ("KANGXI RADICAL VILLAGE" #x2FA5)
+    ("KANGXI RADICAL GOLD" #x2FA6)
+    ("KANGXI RADICAL LONG" #x2FA7)
+    ("KANGXI RADICAL GATE" #x2FA8)
+    ("KANGXI RADICAL MOUND" #x2FA9)
+    ("KANGXI RADICAL SLAVE" #x2FAA)
+    ("KANGXI RADICAL SHORT TAILED BIRD" #x2FAB)
+    ("KANGXI RADICAL RAIN" #x2FAC)
+    ("KANGXI RADICAL BLUE" #x2FAD)
+    ("KANGXI RADICAL WRONG" #x2FAE)
+    ("KANGXI RADICAL FACE" #x2FAF)
+    ("KANGXI RADICAL LEATHER" #x2FB0)
+    ("KANGXI RADICAL TANNED LEATHER" #x2FB1)
+    ("KANGXI RADICAL LEEK" #x2FB2)
+    ("KANGXI RADICAL SOUND" #x2FB3)
+    ("KANGXI RADICAL LEAF" #x2FB4)
+    ("KANGXI RADICAL WIND" #x2FB5)
+    ("KANGXI RADICAL FLY" #x2FB6)
+    ("KANGXI RADICAL EAT" #x2FB7)
+    ("KANGXI RADICAL HEAD" #x2FB8)
+    ("KANGXI RADICAL FRAGRANT" #x2FB9)
+    ("KANGXI RADICAL HORSE" #x2FBA)
+    ("KANGXI RADICAL BONE" #x2FBB)
+    ("KANGXI RADICAL TALL" #x2FBC)
+    ("KANGXI RADICAL HAIR" #x2FBD)
+    ("KANGXI RADICAL FIGHT" #x2FBE)
+    ("KANGXI RADICAL SACRIFICIAL WINE" #x2FBF)
+    ("KANGXI RADICAL CAULDRON" #x2FC0)
+    ("KANGXI RADICAL GHOST" #x2FC1)
+    ("KANGXI RADICAL FISH" #x2FC2)
+    ("KANGXI RADICAL BIRD" #x2FC3)
+    ("KANGXI RADICAL SALT" #x2FC4)
+    ("KANGXI RADICAL DEER" #x2FC5)
+    ("KANGXI RADICAL WHEAT" #x2FC6)
+    ("KANGXI RADICAL HEMP" #x2FC7)
+    ("KANGXI RADICAL YELLOW" #x2FC8)
+    ("KANGXI RADICAL MILLET" #x2FC9)
+    ("KANGXI RADICAL BLACK" #x2FCA)
+    ("KANGXI RADICAL EMBROIDERY" #x2FCB)
+    ("KANGXI RADICAL FROG" #x2FCC)
+    ("KANGXI RADICAL TRIPOD" #x2FCD)
+    ("KANGXI RADICAL DRUM" #x2FCE)
+    ("KANGXI RADICAL RAT" #x2FCF)
+    ("KANGXI RADICAL NOSE" #x2FD0)
+    ("KANGXI RADICAL EVEN" #x2FD1)
+    ("KANGXI RADICAL TOOTH" #x2FD2)
+    ("KANGXI RADICAL DRAGON" #x2FD3)
+    ("KANGXI RADICAL TURTLE" #x2FD4)
+    ("KANGXI RADICAL FLUTE" #x2FD5)
+    ))
diff --git a/lisp/nxml/char-name/unicode/02FF0-02FFF.el b/lisp/nxml/char-name/unicode/02FF0-02FFF.el
new file mode 100644 (file)
index 0000000..9232af9
--- /dev/null
@@ -0,0 +1,14 @@
+(nxml-define-char-name-set 'ideographic-description-characters
+  '(("IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT" #x2FF0)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW" #x2FF1)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT" #x2FF2)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW" #x2FF3)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND" #x2FF4)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE" #x2FF5)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW" #x2FF6)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT" #x2FF7)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT" #x2FF8)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT" #x2FF9)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT" #x2FFA)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID" #x2FFB)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03000-0303F.el b/lisp/nxml/char-name/unicode/03000-0303F.el
new file mode 100644 (file)
index 0000000..0b481ad
--- /dev/null
@@ -0,0 +1,66 @@
+(nxml-define-char-name-set 'cjk-symbols-and-punctuation
+  '(("IDEOGRAPHIC SPACE" #x3000)
+    ("IDEOGRAPHIC COMMA" #x3001)
+    ("IDEOGRAPHIC FULL STOP" #x3002)
+    ("DITTO MARK" #x3003)
+    ("JAPANESE INDUSTRIAL STANDARD SYMBOL" #x3004)
+    ("IDEOGRAPHIC ITERATION MARK" #x3005)
+    ("IDEOGRAPHIC CLOSING MARK" #x3006)
+    ("IDEOGRAPHIC NUMBER ZERO" #x3007)
+    ("LEFT ANGLE BRACKET" #x3008)
+    ("RIGHT ANGLE BRACKET" #x3009)
+    ("LEFT DOUBLE ANGLE BRACKET" #x300A)
+    ("RIGHT DOUBLE ANGLE BRACKET" #x300B)
+    ("LEFT CORNER BRACKET" #x300C)
+    ("RIGHT CORNER BRACKET" #x300D)
+    ("LEFT WHITE CORNER BRACKET" #x300E)
+    ("RIGHT WHITE CORNER BRACKET" #x300F)
+    ("LEFT BLACK LENTICULAR BRACKET" #x3010)
+    ("RIGHT BLACK LENTICULAR BRACKET" #x3011)
+    ("POSTAL MARK" #x3012)
+    ("GETA MARK" #x3013)
+    ("LEFT TORTOISE SHELL BRACKET" #x3014)
+    ("RIGHT TORTOISE SHELL BRACKET" #x3015)
+    ("LEFT WHITE LENTICULAR BRACKET" #x3016)
+    ("RIGHT WHITE LENTICULAR BRACKET" #x3017)
+    ("LEFT WHITE TORTOISE SHELL BRACKET" #x3018)
+    ("RIGHT WHITE TORTOISE SHELL BRACKET" #x3019)
+    ("LEFT WHITE SQUARE BRACKET" #x301A)
+    ("RIGHT WHITE SQUARE BRACKET" #x301B)
+    ("WAVE DASH" #x301C)
+    ("REVERSED DOUBLE PRIME QUOTATION MARK" #x301D)
+    ("DOUBLE PRIME QUOTATION MARK" #x301E)
+    ("LOW DOUBLE PRIME QUOTATION MARK" #x301F)
+    ("POSTAL MARK FACE" #x3020)
+    ("HANGZHOU NUMERAL ONE" #x3021)
+    ("HANGZHOU NUMERAL TWO" #x3022)
+    ("HANGZHOU NUMERAL THREE" #x3023)
+    ("HANGZHOU NUMERAL FOUR" #x3024)
+    ("HANGZHOU NUMERAL FIVE" #x3025)
+    ("HANGZHOU NUMERAL SIX" #x3026)
+    ("HANGZHOU NUMERAL SEVEN" #x3027)
+    ("HANGZHOU NUMERAL EIGHT" #x3028)
+    ("HANGZHOU NUMERAL NINE" #x3029)
+    ("IDEOGRAPHIC LEVEL TONE MARK" #x302A)
+    ("IDEOGRAPHIC RISING TONE MARK" #x302B)
+    ("IDEOGRAPHIC DEPARTING TONE MARK" #x302C)
+    ("IDEOGRAPHIC ENTERING TONE MARK" #x302D)
+    ("HANGUL SINGLE DOT TONE MARK" #x302E)
+    ("HANGUL DOUBLE DOT TONE MARK" #x302F)
+    ("WAVY DASH" #x3030)
+    ("VERTICAL KANA REPEAT MARK" #x3031)
+    ("VERTICAL KANA REPEAT WITH VOICED SOUND MARK" #x3032)
+    ("VERTICAL KANA REPEAT MARK UPPER HALF" #x3033)
+    ("VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF" #x3034)
+    ("VERTICAL KANA REPEAT MARK LOWER HALF" #x3035)
+    ("CIRCLED POSTAL MARK" #x3036)
+    ("IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL" #x3037)
+    ("HANGZHOU NUMERAL TEN" #x3038)
+    ("HANGZHOU NUMERAL TWENTY" #x3039)
+    ("HANGZHOU NUMERAL THIRTY" #x303A)
+    ("VERTICAL IDEOGRAPHIC ITERATION MARK" #x303B)
+    ("MASU MARK" #x303C)
+    ("PART ALTERNATION MARK" #x303D)
+    ("IDEOGRAPHIC VARIATION INDICATOR" #x303E)
+    ("IDEOGRAPHIC HALF FILL SPACE" #x303F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03040-0309F.el b/lisp/nxml/char-name/unicode/03040-0309F.el
new file mode 100644 (file)
index 0000000..c19e541
--- /dev/null
@@ -0,0 +1,95 @@
+(nxml-define-char-name-set 'hiragana
+  '(("HIRAGANA LETTER SMALL A" #x3041)
+    ("HIRAGANA LETTER A" #x3042)
+    ("HIRAGANA LETTER SMALL I" #x3043)
+    ("HIRAGANA LETTER I" #x3044)
+    ("HIRAGANA LETTER SMALL U" #x3045)
+    ("HIRAGANA LETTER U" #x3046)
+    ("HIRAGANA LETTER SMALL E" #x3047)
+    ("HIRAGANA LETTER E" #x3048)
+    ("HIRAGANA LETTER SMALL O" #x3049)
+    ("HIRAGANA LETTER O" #x304A)
+    ("HIRAGANA LETTER KA" #x304B)
+    ("HIRAGANA LETTER GA" #x304C)
+    ("HIRAGANA LETTER KI" #x304D)
+    ("HIRAGANA LETTER GI" #x304E)
+    ("HIRAGANA LETTER KU" #x304F)
+    ("HIRAGANA LETTER GU" #x3050)
+    ("HIRAGANA LETTER KE" #x3051)
+    ("HIRAGANA LETTER GE" #x3052)
+    ("HIRAGANA LETTER KO" #x3053)
+    ("HIRAGANA LETTER GO" #x3054)
+    ("HIRAGANA LETTER SA" #x3055)
+    ("HIRAGANA LETTER ZA" #x3056)
+    ("HIRAGANA LETTER SI" #x3057)
+    ("HIRAGANA LETTER ZI" #x3058)
+    ("HIRAGANA LETTER SU" #x3059)
+    ("HIRAGANA LETTER ZU" #x305A)
+    ("HIRAGANA LETTER SE" #x305B)
+    ("HIRAGANA LETTER ZE" #x305C)
+    ("HIRAGANA LETTER SO" #x305D)
+    ("HIRAGANA LETTER ZO" #x305E)
+    ("HIRAGANA LETTER TA" #x305F)
+    ("HIRAGANA LETTER DA" #x3060)
+    ("HIRAGANA LETTER TI" #x3061)
+    ("HIRAGANA LETTER DI" #x3062)
+    ("HIRAGANA LETTER SMALL TU" #x3063)
+    ("HIRAGANA LETTER TU" #x3064)
+    ("HIRAGANA LETTER DU" #x3065)
+    ("HIRAGANA LETTER TE" #x3066)
+    ("HIRAGANA LETTER DE" #x3067)
+    ("HIRAGANA LETTER TO" #x3068)
+    ("HIRAGANA LETTER DO" #x3069)
+    ("HIRAGANA LETTER NA" #x306A)
+    ("HIRAGANA LETTER NI" #x306B)
+    ("HIRAGANA LETTER NU" #x306C)
+    ("HIRAGANA LETTER NE" #x306D)
+    ("HIRAGANA LETTER NO" #x306E)
+    ("HIRAGANA LETTER HA" #x306F)
+    ("HIRAGANA LETTER BA" #x3070)
+    ("HIRAGANA LETTER PA" #x3071)
+    ("HIRAGANA LETTER HI" #x3072)
+    ("HIRAGANA LETTER BI" #x3073)
+    ("HIRAGANA LETTER PI" #x3074)
+    ("HIRAGANA LETTER HU" #x3075)
+    ("HIRAGANA LETTER BU" #x3076)
+    ("HIRAGANA LETTER PU" #x3077)
+    ("HIRAGANA LETTER HE" #x3078)
+    ("HIRAGANA LETTER BE" #x3079)
+    ("HIRAGANA LETTER PE" #x307A)
+    ("HIRAGANA LETTER HO" #x307B)
+    ("HIRAGANA LETTER BO" #x307C)
+    ("HIRAGANA LETTER PO" #x307D)
+    ("HIRAGANA LETTER MA" #x307E)
+    ("HIRAGANA LETTER MI" #x307F)
+    ("HIRAGANA LETTER MU" #x3080)
+    ("HIRAGANA LETTER ME" #x3081)
+    ("HIRAGANA LETTER MO" #x3082)
+    ("HIRAGANA LETTER SMALL YA" #x3083)
+    ("HIRAGANA LETTER YA" #x3084)
+    ("HIRAGANA LETTER SMALL YU" #x3085)
+    ("HIRAGANA LETTER YU" #x3086)
+    ("HIRAGANA LETTER SMALL YO" #x3087)
+    ("HIRAGANA LETTER YO" #x3088)
+    ("HIRAGANA LETTER RA" #x3089)
+    ("HIRAGANA LETTER RI" #x308A)
+    ("HIRAGANA LETTER RU" #x308B)
+    ("HIRAGANA LETTER RE" #x308C)
+    ("HIRAGANA LETTER RO" #x308D)
+    ("HIRAGANA LETTER SMALL WA" #x308E)
+    ("HIRAGANA LETTER WA" #x308F)
+    ("HIRAGANA LETTER WI" #x3090)
+    ("HIRAGANA LETTER WE" #x3091)
+    ("HIRAGANA LETTER WO" #x3092)
+    ("HIRAGANA LETTER N" #x3093)
+    ("HIRAGANA LETTER VU" #x3094)
+    ("HIRAGANA LETTER SMALL KA" #x3095)
+    ("HIRAGANA LETTER SMALL KE" #x3096)
+    ("COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK" #x3099)
+    ("COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK" #x309A)
+    ("KATAKANA-HIRAGANA VOICED SOUND MARK" #x309B)
+    ("KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK" #x309C)
+    ("HIRAGANA ITERATION MARK" #x309D)
+    ("HIRAGANA VOICED ITERATION MARK" #x309E)
+    ("HIRAGANA DIGRAPH YORI" #x309F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/030A0-030FF.el b/lisp/nxml/char-name/unicode/030A0-030FF.el
new file mode 100644 (file)
index 0000000..52168c7
--- /dev/null
@@ -0,0 +1,98 @@
+(nxml-define-char-name-set 'katakana
+  '(("KATAKANA-HIRAGANA DOUBLE HYPHEN" #x30A0)
+    ("KATAKANA LETTER SMALL A" #x30A1)
+    ("KATAKANA LETTER A" #x30A2)
+    ("KATAKANA LETTER SMALL I" #x30A3)
+    ("KATAKANA LETTER I" #x30A4)
+    ("KATAKANA LETTER SMALL U" #x30A5)
+    ("KATAKANA LETTER U" #x30A6)
+    ("KATAKANA LETTER SMALL E" #x30A7)
+    ("KATAKANA LETTER E" #x30A8)
+    ("KATAKANA LETTER SMALL O" #x30A9)
+    ("KATAKANA LETTER O" #x30AA)
+    ("KATAKANA LETTER KA" #x30AB)
+    ("KATAKANA LETTER GA" #x30AC)
+    ("KATAKANA LETTER KI" #x30AD)
+    ("KATAKANA LETTER GI" #x30AE)
+    ("KATAKANA LETTER KU" #x30AF)
+    ("KATAKANA LETTER GU" #x30B0)
+    ("KATAKANA LETTER KE" #x30B1)
+    ("KATAKANA LETTER GE" #x30B2)
+    ("KATAKANA LETTER KO" #x30B3)
+    ("KATAKANA LETTER GO" #x30B4)
+    ("KATAKANA LETTER SA" #x30B5)
+    ("KATAKANA LETTER ZA" #x30B6)
+    ("KATAKANA LETTER SI" #x30B7)
+    ("KATAKANA LETTER ZI" #x30B8)
+    ("KATAKANA LETTER SU" #x30B9)
+    ("KATAKANA LETTER ZU" #x30BA)
+    ("KATAKANA LETTER SE" #x30BB)
+    ("KATAKANA LETTER ZE" #x30BC)
+    ("KATAKANA LETTER SO" #x30BD)
+    ("KATAKANA LETTER ZO" #x30BE)
+    ("KATAKANA LETTER TA" #x30BF)
+    ("KATAKANA LETTER DA" #x30C0)
+    ("KATAKANA LETTER TI" #x30C1)
+    ("KATAKANA LETTER DI" #x30C2)
+    ("KATAKANA LETTER SMALL TU" #x30C3)
+    ("KATAKANA LETTER TU" #x30C4)
+    ("KATAKANA LETTER DU" #x30C5)
+    ("KATAKANA LETTER TE" #x30C6)
+    ("KATAKANA LETTER DE" #x30C7)
+    ("KATAKANA LETTER TO" #x30C8)
+    ("KATAKANA LETTER DO" #x30C9)
+    ("KATAKANA LETTER NA" #x30CA)
+    ("KATAKANA LETTER NI" #x30CB)
+    ("KATAKANA LETTER NU" #x30CC)
+    ("KATAKANA LETTER NE" #x30CD)
+    ("KATAKANA LETTER NO" #x30CE)
+    ("KATAKANA LETTER HA" #x30CF)
+    ("KATAKANA LETTER BA" #x30D0)
+    ("KATAKANA LETTER PA" #x30D1)
+    ("KATAKANA LETTER HI" #x30D2)
+    ("KATAKANA LETTER BI" #x30D3)
+    ("KATAKANA LETTER PI" #x30D4)
+    ("KATAKANA LETTER HU" #x30D5)
+    ("KATAKANA LETTER BU" #x30D6)
+    ("KATAKANA LETTER PU" #x30D7)
+    ("KATAKANA LETTER HE" #x30D8)
+    ("KATAKANA LETTER BE" #x30D9)
+    ("KATAKANA LETTER PE" #x30DA)
+    ("KATAKANA LETTER HO" #x30DB)
+    ("KATAKANA LETTER BO" #x30DC)
+    ("KATAKANA LETTER PO" #x30DD)
+    ("KATAKANA LETTER MA" #x30DE)
+    ("KATAKANA LETTER MI" #x30DF)
+    ("KATAKANA LETTER MU" #x30E0)
+    ("KATAKANA LETTER ME" #x30E1)
+    ("KATAKANA LETTER MO" #x30E2)
+    ("KATAKANA LETTER SMALL YA" #x30E3)
+    ("KATAKANA LETTER YA" #x30E4)
+    ("KATAKANA LETTER SMALL YU" #x30E5)
+    ("KATAKANA LETTER YU" #x30E6)
+    ("KATAKANA LETTER SMALL YO" #x30E7)
+    ("KATAKANA LETTER YO" #x30E8)
+    ("KATAKANA LETTER RA" #x30E9)
+    ("KATAKANA LETTER RI" #x30EA)
+    ("KATAKANA LETTER RU" #x30EB)
+    ("KATAKANA LETTER RE" #x30EC)
+    ("KATAKANA LETTER RO" #x30ED)
+    ("KATAKANA LETTER SMALL WA" #x30EE)
+    ("KATAKANA LETTER WA" #x30EF)
+    ("KATAKANA LETTER WI" #x30F0)
+    ("KATAKANA LETTER WE" #x30F1)
+    ("KATAKANA LETTER WO" #x30F2)
+    ("KATAKANA LETTER N" #x30F3)
+    ("KATAKANA LETTER VU" #x30F4)
+    ("KATAKANA LETTER SMALL KA" #x30F5)
+    ("KATAKANA LETTER SMALL KE" #x30F6)
+    ("KATAKANA LETTER VA" #x30F7)
+    ("KATAKANA LETTER VI" #x30F8)
+    ("KATAKANA LETTER VE" #x30F9)
+    ("KATAKANA LETTER VO" #x30FA)
+    ("KATAKANA MIDDLE DOT" #x30FB)
+    ("KATAKANA-HIRAGANA PROLONGED SOUND MARK" #x30FC)
+    ("KATAKANA ITERATION MARK" #x30FD)
+    ("KATAKANA VOICED ITERATION MARK" #x30FE)
+    ("KATAKANA DIGRAPH KOTO" #x30FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03100-0312F.el b/lisp/nxml/char-name/unicode/03100-0312F.el
new file mode 100644 (file)
index 0000000..ea0cc9e
--- /dev/null
@@ -0,0 +1,42 @@
+(nxml-define-char-name-set 'bopomofo
+  '(("BOPOMOFO LETTER B" #x3105)
+    ("BOPOMOFO LETTER P" #x3106)
+    ("BOPOMOFO LETTER M" #x3107)
+    ("BOPOMOFO LETTER F" #x3108)
+    ("BOPOMOFO LETTER D" #x3109)
+    ("BOPOMOFO LETTER T" #x310A)
+    ("BOPOMOFO LETTER N" #x310B)
+    ("BOPOMOFO LETTER L" #x310C)
+    ("BOPOMOFO LETTER G" #x310D)
+    ("BOPOMOFO LETTER K" #x310E)
+    ("BOPOMOFO LETTER H" #x310F)
+    ("BOPOMOFO LETTER J" #x3110)
+    ("BOPOMOFO LETTER Q" #x3111)
+    ("BOPOMOFO LETTER X" #x3112)
+    ("BOPOMOFO LETTER ZH" #x3113)
+    ("BOPOMOFO LETTER CH" #x3114)
+    ("BOPOMOFO LETTER SH" #x3115)
+    ("BOPOMOFO LETTER R" #x3116)
+    ("BOPOMOFO LETTER Z" #x3117)
+    ("BOPOMOFO LETTER C" #x3118)
+    ("BOPOMOFO LETTER S" #x3119)
+    ("BOPOMOFO LETTER A" #x311A)
+    ("BOPOMOFO LETTER O" #x311B)
+    ("BOPOMOFO LETTER E" #x311C)
+    ("BOPOMOFO LETTER EH" #x311D)
+    ("BOPOMOFO LETTER AI" #x311E)
+    ("BOPOMOFO LETTER EI" #x311F)
+    ("BOPOMOFO LETTER AU" #x3120)
+    ("BOPOMOFO LETTER OU" #x3121)
+    ("BOPOMOFO LETTER AN" #x3122)
+    ("BOPOMOFO LETTER EN" #x3123)
+    ("BOPOMOFO LETTER ANG" #x3124)
+    ("BOPOMOFO LETTER ENG" #x3125)
+    ("BOPOMOFO LETTER ER" #x3126)
+    ("BOPOMOFO LETTER I" #x3127)
+    ("BOPOMOFO LETTER U" #x3128)
+    ("BOPOMOFO LETTER IU" #x3129)
+    ("BOPOMOFO LETTER V" #x312A)
+    ("BOPOMOFO LETTER NG" #x312B)
+    ("BOPOMOFO LETTER GN" #x312C)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03130-0318F.el b/lisp/nxml/char-name/unicode/03130-0318F.el
new file mode 100644 (file)
index 0000000..5e7746f
--- /dev/null
@@ -0,0 +1,96 @@
+(nxml-define-char-name-set 'hangul-compatibility-jamo
+  '(("HANGUL LETTER KIYEOK" #x3131)
+    ("HANGUL LETTER SSANGKIYEOK" #x3132)
+    ("HANGUL LETTER KIYEOK-SIOS" #x3133)
+    ("HANGUL LETTER NIEUN" #x3134)
+    ("HANGUL LETTER NIEUN-CIEUC" #x3135)
+    ("HANGUL LETTER NIEUN-HIEUH" #x3136)
+    ("HANGUL LETTER TIKEUT" #x3137)
+    ("HANGUL LETTER SSANGTIKEUT" #x3138)
+    ("HANGUL LETTER RIEUL" #x3139)
+    ("HANGUL LETTER RIEUL-KIYEOK" #x313A)
+    ("HANGUL LETTER RIEUL-MIEUM" #x313B)
+    ("HANGUL LETTER RIEUL-PIEUP" #x313C)
+    ("HANGUL LETTER RIEUL-SIOS" #x313D)
+    ("HANGUL LETTER RIEUL-THIEUTH" #x313E)
+    ("HANGUL LETTER RIEUL-PHIEUPH" #x313F)
+    ("HANGUL LETTER RIEUL-HIEUH" #x3140)
+    ("HANGUL LETTER MIEUM" #x3141)
+    ("HANGUL LETTER PIEUP" #x3142)
+    ("HANGUL LETTER SSANGPIEUP" #x3143)
+    ("HANGUL LETTER PIEUP-SIOS" #x3144)
+    ("HANGUL LETTER SIOS" #x3145)
+    ("HANGUL LETTER SSANGSIOS" #x3146)
+    ("HANGUL LETTER IEUNG" #x3147)
+    ("HANGUL LETTER CIEUC" #x3148)
+    ("HANGUL LETTER SSANGCIEUC" #x3149)
+    ("HANGUL LETTER CHIEUCH" #x314A)
+    ("HANGUL LETTER KHIEUKH" #x314B)
+    ("HANGUL LETTER THIEUTH" #x314C)
+    ("HANGUL LETTER PHIEUPH" #x314D)
+    ("HANGUL LETTER HIEUH" #x314E)
+    ("HANGUL LETTER A" #x314F)
+    ("HANGUL LETTER AE" #x3150)
+    ("HANGUL LETTER YA" #x3151)
+    ("HANGUL LETTER YAE" #x3152)
+    ("HANGUL LETTER EO" #x3153)
+    ("HANGUL LETTER E" #x3154)
+    ("HANGUL LETTER YEO" #x3155)
+    ("HANGUL LETTER YE" #x3156)
+    ("HANGUL LETTER O" #x3157)
+    ("HANGUL LETTER WA" #x3158)
+    ("HANGUL LETTER WAE" #x3159)
+    ("HANGUL LETTER OE" #x315A)
+    ("HANGUL LETTER YO" #x315B)
+    ("HANGUL LETTER U" #x315C)
+    ("HANGUL LETTER WEO" #x315D)
+    ("HANGUL LETTER WE" #x315E)
+    ("HANGUL LETTER WI" #x315F)
+    ("HANGUL LETTER YU" #x3160)
+    ("HANGUL LETTER EU" #x3161)
+    ("HANGUL LETTER YI" #x3162)
+    ("HANGUL LETTER I" #x3163)
+    ("HANGUL FILLER" #x3164)
+    ("HANGUL LETTER SSANGNIEUN" #x3165)
+    ("HANGUL LETTER NIEUN-TIKEUT" #x3166)
+    ("HANGUL LETTER NIEUN-SIOS" #x3167)
+    ("HANGUL LETTER NIEUN-PANSIOS" #x3168)
+    ("HANGUL LETTER RIEUL-KIYEOK-SIOS" #x3169)
+    ("HANGUL LETTER RIEUL-TIKEUT" #x316A)
+    ("HANGUL LETTER RIEUL-PIEUP-SIOS" #x316B)
+    ("HANGUL LETTER RIEUL-PANSIOS" #x316C)
+    ("HANGUL LETTER RIEUL-YEORINHIEUH" #x316D)
+    ("HANGUL LETTER MIEUM-PIEUP" #x316E)
+    ("HANGUL LETTER MIEUM-SIOS" #x316F)
+    ("HANGUL LETTER MIEUM-PANSIOS" #x3170)
+    ("HANGUL LETTER KAPYEOUNMIEUM" #x3171)
+    ("HANGUL LETTER PIEUP-KIYEOK" #x3172)
+    ("HANGUL LETTER PIEUP-TIKEUT" #x3173)
+    ("HANGUL LETTER PIEUP-SIOS-KIYEOK" #x3174)
+    ("HANGUL LETTER PIEUP-SIOS-TIKEUT" #x3175)
+    ("HANGUL LETTER PIEUP-CIEUC" #x3176)
+    ("HANGUL LETTER PIEUP-THIEUTH" #x3177)
+    ("HANGUL LETTER KAPYEOUNPIEUP" #x3178)
+    ("HANGUL LETTER KAPYEOUNSSANGPIEUP" #x3179)
+    ("HANGUL LETTER SIOS-KIYEOK" #x317A)
+    ("HANGUL LETTER SIOS-NIEUN" #x317B)
+    ("HANGUL LETTER SIOS-TIKEUT" #x317C)
+    ("HANGUL LETTER SIOS-PIEUP" #x317D)
+    ("HANGUL LETTER SIOS-CIEUC" #x317E)
+    ("HANGUL LETTER PANSIOS" #x317F)
+    ("HANGUL LETTER SSANGIEUNG" #x3180)
+    ("HANGUL LETTER YESIEUNG" #x3181)
+    ("HANGUL LETTER YESIEUNG-SIOS" #x3182)
+    ("HANGUL LETTER YESIEUNG-PANSIOS" #x3183)
+    ("HANGUL LETTER KAPYEOUNPHIEUPH" #x3184)
+    ("HANGUL LETTER SSANGHIEUH" #x3185)
+    ("HANGUL LETTER YEORINHIEUH" #x3186)
+    ("HANGUL LETTER YO-YA" #x3187)
+    ("HANGUL LETTER YO-YAE" #x3188)
+    ("HANGUL LETTER YO-I" #x3189)
+    ("HANGUL LETTER YU-YEO" #x318A)
+    ("HANGUL LETTER YU-YE" #x318B)
+    ("HANGUL LETTER YU-I" #x318C)
+    ("HANGUL LETTER ARAEA" #x318D)
+    ("HANGUL LETTER ARAEAE" #x318E)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03190-0319F.el b/lisp/nxml/char-name/unicode/03190-0319F.el
new file mode 100644 (file)
index 0000000..b8520da
--- /dev/null
@@ -0,0 +1,18 @@
+(nxml-define-char-name-set 'kanbun
+  '(("IDEOGRAPHIC ANNOTATION LINKING MARK" #x3190)
+    ("IDEOGRAPHIC ANNOTATION REVERSE MARK" #x3191)
+    ("IDEOGRAPHIC ANNOTATION ONE MARK" #x3192)
+    ("IDEOGRAPHIC ANNOTATION TWO MARK" #x3193)
+    ("IDEOGRAPHIC ANNOTATION THREE MARK" #x3194)
+    ("IDEOGRAPHIC ANNOTATION FOUR MARK" #x3195)
+    ("IDEOGRAPHIC ANNOTATION TOP MARK" #x3196)
+    ("IDEOGRAPHIC ANNOTATION MIDDLE MARK" #x3197)
+    ("IDEOGRAPHIC ANNOTATION BOTTOM MARK" #x3198)
+    ("IDEOGRAPHIC ANNOTATION FIRST MARK" #x3199)
+    ("IDEOGRAPHIC ANNOTATION SECOND MARK" #x319A)
+    ("IDEOGRAPHIC ANNOTATION THIRD MARK" #x319B)
+    ("IDEOGRAPHIC ANNOTATION FOURTH MARK" #x319C)
+    ("IDEOGRAPHIC ANNOTATION HEAVEN MARK" #x319D)
+    ("IDEOGRAPHIC ANNOTATION EARTH MARK" #x319E)
+    ("IDEOGRAPHIC ANNOTATION MAN MARK" #x319F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/031A0-031BF.el b/lisp/nxml/char-name/unicode/031A0-031BF.el
new file mode 100644 (file)
index 0000000..1839254
--- /dev/null
@@ -0,0 +1,26 @@
+(nxml-define-char-name-set 'bopomofo-extended
+  '(("BOPOMOFO LETTER BU" #x31A0)
+    ("BOPOMOFO LETTER ZI" #x31A1)
+    ("BOPOMOFO LETTER JI" #x31A2)
+    ("BOPOMOFO LETTER GU" #x31A3)
+    ("BOPOMOFO LETTER EE" #x31A4)
+    ("BOPOMOFO LETTER ENN" #x31A5)
+    ("BOPOMOFO LETTER OO" #x31A6)
+    ("BOPOMOFO LETTER ONN" #x31A7)
+    ("BOPOMOFO LETTER IR" #x31A8)
+    ("BOPOMOFO LETTER ANN" #x31A9)
+    ("BOPOMOFO LETTER INN" #x31AA)
+    ("BOPOMOFO LETTER UNN" #x31AB)
+    ("BOPOMOFO LETTER IM" #x31AC)
+    ("BOPOMOFO LETTER NGG" #x31AD)
+    ("BOPOMOFO LETTER AINN" #x31AE)
+    ("BOPOMOFO LETTER AUNN" #x31AF)
+    ("BOPOMOFO LETTER AM" #x31B0)
+    ("BOPOMOFO LETTER OM" #x31B1)
+    ("BOPOMOFO LETTER ONG" #x31B2)
+    ("BOPOMOFO LETTER INNN" #x31B3)
+    ("BOPOMOFO FINAL LETTER P" #x31B4)
+    ("BOPOMOFO FINAL LETTER T" #x31B5)
+    ("BOPOMOFO FINAL LETTER K" #x31B6)
+    ("BOPOMOFO FINAL LETTER H" #x31B7)
+    ))
diff --git a/lisp/nxml/char-name/unicode/031F0-031FF.el b/lisp/nxml/char-name/unicode/031F0-031FF.el
new file mode 100644 (file)
index 0000000..e637bf3
--- /dev/null
@@ -0,0 +1,18 @@
+(nxml-define-char-name-set 'katakana-phonetic-extensions
+  '(("KATAKANA LETTER SMALL KU" #x31F0)
+    ("KATAKANA LETTER SMALL SI" #x31F1)
+    ("KATAKANA LETTER SMALL SU" #x31F2)
+    ("KATAKANA LETTER SMALL TO" #x31F3)
+    ("KATAKANA LETTER SMALL NU" #x31F4)
+    ("KATAKANA LETTER SMALL HA" #x31F5)
+    ("KATAKANA LETTER SMALL HI" #x31F6)
+    ("KATAKANA LETTER SMALL HU" #x31F7)
+    ("KATAKANA LETTER SMALL HE" #x31F8)
+    ("KATAKANA LETTER SMALL HO" #x31F9)
+    ("KATAKANA LETTER SMALL MU" #x31FA)
+    ("KATAKANA LETTER SMALL RA" #x31FB)
+    ("KATAKANA LETTER SMALL RI" #x31FC)
+    ("KATAKANA LETTER SMALL RU" #x31FD)
+    ("KATAKANA LETTER SMALL RE" #x31FE)
+    ("KATAKANA LETTER SMALL RO" #x31FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03200-032FF.el b/lisp/nxml/char-name/unicode/03200-032FF.el
new file mode 100644 (file)
index 0000000..625ff5b
--- /dev/null
@@ -0,0 +1,234 @@
+(nxml-define-char-name-set 'enclosed-cjk-letters-and-months
+  '(("PARENTHESIZED HANGUL KIYEOK" #x3200)
+    ("PARENTHESIZED HANGUL NIEUN" #x3201)
+    ("PARENTHESIZED HANGUL TIKEUT" #x3202)
+    ("PARENTHESIZED HANGUL RIEUL" #x3203)
+    ("PARENTHESIZED HANGUL MIEUM" #x3204)
+    ("PARENTHESIZED HANGUL PIEUP" #x3205)
+    ("PARENTHESIZED HANGUL SIOS" #x3206)
+    ("PARENTHESIZED HANGUL IEUNG" #x3207)
+    ("PARENTHESIZED HANGUL CIEUC" #x3208)
+    ("PARENTHESIZED HANGUL CHIEUCH" #x3209)
+    ("PARENTHESIZED HANGUL KHIEUKH" #x320A)
+    ("PARENTHESIZED HANGUL THIEUTH" #x320B)
+    ("PARENTHESIZED HANGUL PHIEUPH" #x320C)
+    ("PARENTHESIZED HANGUL HIEUH" #x320D)
+    ("PARENTHESIZED HANGUL KIYEOK A" #x320E)
+    ("PARENTHESIZED HANGUL NIEUN A" #x320F)
+    ("PARENTHESIZED HANGUL TIKEUT A" #x3210)
+    ("PARENTHESIZED HANGUL RIEUL A" #x3211)
+    ("PARENTHESIZED HANGUL MIEUM A" #x3212)
+    ("PARENTHESIZED HANGUL PIEUP A" #x3213)
+    ("PARENTHESIZED HANGUL SIOS A" #x3214)
+    ("PARENTHESIZED HANGUL IEUNG A" #x3215)
+    ("PARENTHESIZED HANGUL CIEUC A" #x3216)
+    ("PARENTHESIZED HANGUL CHIEUCH A" #x3217)
+    ("PARENTHESIZED HANGUL KHIEUKH A" #x3218)
+    ("PARENTHESIZED HANGUL THIEUTH A" #x3219)
+    ("PARENTHESIZED HANGUL PHIEUPH A" #x321A)
+    ("PARENTHESIZED HANGUL HIEUH A" #x321B)
+    ("PARENTHESIZED HANGUL CIEUC U" #x321C)
+    ("PARENTHESIZED IDEOGRAPH ONE" #x3220)
+    ("PARENTHESIZED IDEOGRAPH TWO" #x3221)
+    ("PARENTHESIZED IDEOGRAPH THREE" #x3222)
+    ("PARENTHESIZED IDEOGRAPH FOUR" #x3223)
+    ("PARENTHESIZED IDEOGRAPH FIVE" #x3224)
+    ("PARENTHESIZED IDEOGRAPH SIX" #x3225)
+    ("PARENTHESIZED IDEOGRAPH SEVEN" #x3226)
+    ("PARENTHESIZED IDEOGRAPH EIGHT" #x3227)
+    ("PARENTHESIZED IDEOGRAPH NINE" #x3228)
+    ("PARENTHESIZED IDEOGRAPH TEN" #x3229)
+    ("PARENTHESIZED IDEOGRAPH MOON" #x322A)
+    ("PARENTHESIZED IDEOGRAPH FIRE" #x322B)
+    ("PARENTHESIZED IDEOGRAPH WATER" #x322C)
+    ("PARENTHESIZED IDEOGRAPH WOOD" #x322D)
+    ("PARENTHESIZED IDEOGRAPH METAL" #x322E)
+    ("PARENTHESIZED IDEOGRAPH EARTH" #x322F)
+    ("PARENTHESIZED IDEOGRAPH SUN" #x3230)
+    ("PARENTHESIZED IDEOGRAPH STOCK" #x3231)
+    ("PARENTHESIZED IDEOGRAPH HAVE" #x3232)
+    ("PARENTHESIZED IDEOGRAPH SOCIETY" #x3233)
+    ("PARENTHESIZED IDEOGRAPH NAME" #x3234)
+    ("PARENTHESIZED IDEOGRAPH SPECIAL" #x3235)
+    ("PARENTHESIZED IDEOGRAPH FINANCIAL" #x3236)
+    ("PARENTHESIZED IDEOGRAPH CONGRATULATION" #x3237)
+    ("PARENTHESIZED IDEOGRAPH LABOR" #x3238)
+    ("PARENTHESIZED IDEOGRAPH REPRESENT" #x3239)
+    ("PARENTHESIZED IDEOGRAPH CALL" #x323A)
+    ("PARENTHESIZED IDEOGRAPH STUDY" #x323B)
+    ("PARENTHESIZED IDEOGRAPH SUPERVISE" #x323C)
+    ("PARENTHESIZED IDEOGRAPH ENTERPRISE" #x323D)
+    ("PARENTHESIZED IDEOGRAPH RESOURCE" #x323E)
+    ("PARENTHESIZED IDEOGRAPH ALLIANCE" #x323F)
+    ("PARENTHESIZED IDEOGRAPH FESTIVAL" #x3240)
+    ("PARENTHESIZED IDEOGRAPH REST" #x3241)
+    ("PARENTHESIZED IDEOGRAPH SELF" #x3242)
+    ("PARENTHESIZED IDEOGRAPH REACH" #x3243)
+    ("CIRCLED NUMBER TWENTY ONE" #x3251)
+    ("CIRCLED NUMBER TWENTY TWO" #x3252)
+    ("CIRCLED NUMBER TWENTY THREE" #x3253)
+    ("CIRCLED NUMBER TWENTY FOUR" #x3254)
+    ("CIRCLED NUMBER TWENTY FIVE" #x3255)
+    ("CIRCLED NUMBER TWENTY SIX" #x3256)
+    ("CIRCLED NUMBER TWENTY SEVEN" #x3257)
+    ("CIRCLED NUMBER TWENTY EIGHT" #x3258)
+    ("CIRCLED NUMBER TWENTY NINE" #x3259)
+    ("CIRCLED NUMBER THIRTY" #x325A)
+    ("CIRCLED NUMBER THIRTY ONE" #x325B)
+    ("CIRCLED NUMBER THIRTY TWO" #x325C)
+    ("CIRCLED NUMBER THIRTY THREE" #x325D)
+    ("CIRCLED NUMBER THIRTY FOUR" #x325E)
+    ("CIRCLED NUMBER THIRTY FIVE" #x325F)
+    ("CIRCLED HANGUL KIYEOK" #x3260)
+    ("CIRCLED HANGUL NIEUN" #x3261)
+    ("CIRCLED HANGUL TIKEUT" #x3262)
+    ("CIRCLED HANGUL RIEUL" #x3263)
+    ("CIRCLED HANGUL MIEUM" #x3264)
+    ("CIRCLED HANGUL PIEUP" #x3265)
+    ("CIRCLED HANGUL SIOS" #x3266)
+    ("CIRCLED HANGUL IEUNG" #x3267)
+    ("CIRCLED HANGUL CIEUC" #x3268)
+    ("CIRCLED HANGUL CHIEUCH" #x3269)
+    ("CIRCLED HANGUL KHIEUKH" #x326A)
+    ("CIRCLED HANGUL THIEUTH" #x326B)
+    ("CIRCLED HANGUL PHIEUPH" #x326C)
+    ("CIRCLED HANGUL HIEUH" #x326D)
+    ("CIRCLED HANGUL KIYEOK A" #x326E)
+    ("CIRCLED HANGUL NIEUN A" #x326F)
+    ("CIRCLED HANGUL TIKEUT A" #x3270)
+    ("CIRCLED HANGUL RIEUL A" #x3271)
+    ("CIRCLED HANGUL MIEUM A" #x3272)
+    ("CIRCLED HANGUL PIEUP A" #x3273)
+    ("CIRCLED HANGUL SIOS A" #x3274)
+    ("CIRCLED HANGUL IEUNG A" #x3275)
+    ("CIRCLED HANGUL CIEUC A" #x3276)
+    ("CIRCLED HANGUL CHIEUCH A" #x3277)
+    ("CIRCLED HANGUL KHIEUKH A" #x3278)
+    ("CIRCLED HANGUL THIEUTH A" #x3279)
+    ("CIRCLED HANGUL PHIEUPH A" #x327A)
+    ("CIRCLED HANGUL HIEUH A" #x327B)
+    ("KOREAN STANDARD SYMBOL" #x327F)
+    ("CIRCLED IDEOGRAPH ONE" #x3280)
+    ("CIRCLED IDEOGRAPH TWO" #x3281)
+    ("CIRCLED IDEOGRAPH THREE" #x3282)
+    ("CIRCLED IDEOGRAPH FOUR" #x3283)
+    ("CIRCLED IDEOGRAPH FIVE" #x3284)
+    ("CIRCLED IDEOGRAPH SIX" #x3285)
+    ("CIRCLED IDEOGRAPH SEVEN" #x3286)
+    ("CIRCLED IDEOGRAPH EIGHT" #x3287)
+    ("CIRCLED IDEOGRAPH NINE" #x3288)
+    ("CIRCLED IDEOGRAPH TEN" #x3289)
+    ("CIRCLED IDEOGRAPH MOON" #x328A)
+    ("CIRCLED IDEOGRAPH FIRE" #x328B)
+    ("CIRCLED IDEOGRAPH WATER" #x328C)
+    ("CIRCLED IDEOGRAPH WOOD" #x328D)
+    ("CIRCLED IDEOGRAPH METAL" #x328E)
+    ("CIRCLED IDEOGRAPH EARTH" #x328F)
+    ("CIRCLED IDEOGRAPH SUN" #x3290)
+    ("CIRCLED IDEOGRAPH STOCK" #x3291)
+    ("CIRCLED IDEOGRAPH HAVE" #x3292)
+    ("CIRCLED IDEOGRAPH SOCIETY" #x3293)
+    ("CIRCLED IDEOGRAPH NAME" #x3294)
+    ("CIRCLED IDEOGRAPH SPECIAL" #x3295)
+    ("CIRCLED IDEOGRAPH FINANCIAL" #x3296)
+    ("CIRCLED IDEOGRAPH CONGRATULATION" #x3297)
+    ("CIRCLED IDEOGRAPH LABOR" #x3298)
+    ("CIRCLED IDEOGRAPH SECRET" #x3299)
+    ("CIRCLED IDEOGRAPH MALE" #x329A)
+    ("CIRCLED IDEOGRAPH FEMALE" #x329B)
+    ("CIRCLED IDEOGRAPH SUITABLE" #x329C)
+    ("CIRCLED IDEOGRAPH EXCELLENT" #x329D)
+    ("CIRCLED IDEOGRAPH PRINT" #x329E)
+    ("CIRCLED IDEOGRAPH ATTENTION" #x329F)
+    ("CIRCLED IDEOGRAPH ITEM" #x32A0)
+    ("CIRCLED IDEOGRAPH REST" #x32A1)
+    ("CIRCLED IDEOGRAPH COPY" #x32A2)
+    ("CIRCLED IDEOGRAPH CORRECT" #x32A3)
+    ("CIRCLED IDEOGRAPH HIGH" #x32A4)
+    ("CIRCLED IDEOGRAPH CENTRE" #x32A5)
+    ("CIRCLED IDEOGRAPH LOW" #x32A6)
+    ("CIRCLED IDEOGRAPH LEFT" #x32A7)
+    ("CIRCLED IDEOGRAPH RIGHT" #x32A8)
+    ("CIRCLED IDEOGRAPH MEDICINE" #x32A9)
+    ("CIRCLED IDEOGRAPH RELIGION" #x32AA)
+    ("CIRCLED IDEOGRAPH STUDY" #x32AB)
+    ("CIRCLED IDEOGRAPH SUPERVISE" #x32AC)
+    ("CIRCLED IDEOGRAPH ENTERPRISE" #x32AD)
+    ("CIRCLED IDEOGRAPH RESOURCE" #x32AE)
+    ("CIRCLED IDEOGRAPH ALLIANCE" #x32AF)
+    ("CIRCLED IDEOGRAPH NIGHT" #x32B0)
+    ("CIRCLED NUMBER THIRTY SIX" #x32B1)
+    ("CIRCLED NUMBER THIRTY SEVEN" #x32B2)
+    ("CIRCLED NUMBER THIRTY EIGHT" #x32B3)
+    ("CIRCLED NUMBER THIRTY NINE" #x32B4)
+    ("CIRCLED NUMBER FORTY" #x32B5)
+    ("CIRCLED NUMBER FORTY ONE" #x32B6)
+    ("CIRCLED NUMBER FORTY TWO" #x32B7)
+    ("CIRCLED NUMBER FORTY THREE" #x32B8)
+    ("CIRCLED NUMBER FORTY FOUR" #x32B9)
+    ("CIRCLED NUMBER FORTY FIVE" #x32BA)
+    ("CIRCLED NUMBER FORTY SIX" #x32BB)
+    ("CIRCLED NUMBER FORTY SEVEN" #x32BC)
+    ("CIRCLED NUMBER FORTY EIGHT" #x32BD)
+    ("CIRCLED NUMBER FORTY NINE" #x32BE)
+    ("CIRCLED NUMBER FIFTY" #x32BF)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY" #x32C0)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY" #x32C1)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH" #x32C2)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL" #x32C3)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY" #x32C4)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE" #x32C5)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY" #x32C6)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST" #x32C7)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER" #x32C8)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER" #x32C9)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER" #x32CA)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER" #x32CB)
+    ("CIRCLED KATAKANA A" #x32D0)
+    ("CIRCLED KATAKANA I" #x32D1)
+    ("CIRCLED KATAKANA U" #x32D2)
+    ("CIRCLED KATAKANA E" #x32D3)
+    ("CIRCLED KATAKANA O" #x32D4)
+    ("CIRCLED KATAKANA KA" #x32D5)
+    ("CIRCLED KATAKANA KI" #x32D6)
+    ("CIRCLED KATAKANA KU" #x32D7)
+    ("CIRCLED KATAKANA KE" #x32D8)
+    ("CIRCLED KATAKANA KO" #x32D9)
+    ("CIRCLED KATAKANA SA" #x32DA)
+    ("CIRCLED KATAKANA SI" #x32DB)
+    ("CIRCLED KATAKANA SU" #x32DC)
+    ("CIRCLED KATAKANA SE" #x32DD)
+    ("CIRCLED KATAKANA SO" #x32DE)
+    ("CIRCLED KATAKANA TA" #x32DF)
+    ("CIRCLED KATAKANA TI" #x32E0)
+    ("CIRCLED KATAKANA TU" #x32E1)
+    ("CIRCLED KATAKANA TE" #x32E2)
+    ("CIRCLED KATAKANA TO" #x32E3)
+    ("CIRCLED KATAKANA NA" #x32E4)
+    ("CIRCLED KATAKANA NI" #x32E5)
+    ("CIRCLED KATAKANA NU" #x32E6)
+    ("CIRCLED KATAKANA NE" #x32E7)
+    ("CIRCLED KATAKANA NO" #x32E8)
+    ("CIRCLED KATAKANA HA" #x32E9)
+    ("CIRCLED KATAKANA HI" #x32EA)
+    ("CIRCLED KATAKANA HU" #x32EB)
+    ("CIRCLED KATAKANA HE" #x32EC)
+    ("CIRCLED KATAKANA HO" #x32ED)
+    ("CIRCLED KATAKANA MA" #x32EE)
+    ("CIRCLED KATAKANA MI" #x32EF)
+    ("CIRCLED KATAKANA MU" #x32F0)
+    ("CIRCLED KATAKANA ME" #x32F1)
+    ("CIRCLED KATAKANA MO" #x32F2)
+    ("CIRCLED KATAKANA YA" #x32F3)
+    ("CIRCLED KATAKANA YU" #x32F4)
+    ("CIRCLED KATAKANA YO" #x32F5)
+    ("CIRCLED KATAKANA RA" #x32F6)
+    ("CIRCLED KATAKANA RI" #x32F7)
+    ("CIRCLED KATAKANA RU" #x32F8)
+    ("CIRCLED KATAKANA RE" #x32F9)
+    ("CIRCLED KATAKANA RO" #x32FA)
+    ("CIRCLED KATAKANA WA" #x32FB)
+    ("CIRCLED KATAKANA WI" #x32FC)
+    ("CIRCLED KATAKANA WE" #x32FD)
+    ("CIRCLED KATAKANA WO" #x32FE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03300-033FF.el b/lisp/nxml/char-name/unicode/03300-033FF.el
new file mode 100644 (file)
index 0000000..25a070f
--- /dev/null
@@ -0,0 +1,251 @@
+(nxml-define-char-name-set 'cjk-compatibility
+  '(("SQUARE APAATO" #x3300)
+    ("SQUARE ARUHUA" #x3301)
+    ("SQUARE ANPEA" #x3302)
+    ("SQUARE AARU" #x3303)
+    ("SQUARE ININGU" #x3304)
+    ("SQUARE INTI" #x3305)
+    ("SQUARE UON" #x3306)
+    ("SQUARE ESUKUUDO" #x3307)
+    ("SQUARE EEKAA" #x3308)
+    ("SQUARE ONSU" #x3309)
+    ("SQUARE OOMU" #x330A)
+    ("SQUARE KAIRI" #x330B)
+    ("SQUARE KARATTO" #x330C)
+    ("SQUARE KARORII" #x330D)
+    ("SQUARE GARON" #x330E)
+    ("SQUARE GANMA" #x330F)
+    ("SQUARE GIGA" #x3310)
+    ("SQUARE GINII" #x3311)
+    ("SQUARE KYURII" #x3312)
+    ("SQUARE GIRUDAA" #x3313)
+    ("SQUARE KIRO" #x3314)
+    ("SQUARE KIROGURAMU" #x3315)
+    ("SQUARE KIROMEETORU" #x3316)
+    ("SQUARE KIROWATTO" #x3317)
+    ("SQUARE GURAMU" #x3318)
+    ("SQUARE GURAMUTON" #x3319)
+    ("SQUARE KURUZEIRO" #x331A)
+    ("SQUARE KUROONE" #x331B)
+    ("SQUARE KEESU" #x331C)
+    ("SQUARE KORUNA" #x331D)
+    ("SQUARE KOOPO" #x331E)
+    ("SQUARE SAIKURU" #x331F)
+    ("SQUARE SANTIIMU" #x3320)
+    ("SQUARE SIRINGU" #x3321)
+    ("SQUARE SENTI" #x3322)
+    ("SQUARE SENTO" #x3323)
+    ("SQUARE DAASU" #x3324)
+    ("SQUARE DESI" #x3325)
+    ("SQUARE DORU" #x3326)
+    ("SQUARE TON" #x3327)
+    ("SQUARE NANO" #x3328)
+    ("SQUARE NOTTO" #x3329)
+    ("SQUARE HAITU" #x332A)
+    ("SQUARE PAASENTO" #x332B)
+    ("SQUARE PAATU" #x332C)
+    ("SQUARE BAARERU" #x332D)
+    ("SQUARE PIASUTORU" #x332E)
+    ("SQUARE PIKURU" #x332F)
+    ("SQUARE PIKO" #x3330)
+    ("SQUARE BIRU" #x3331)
+    ("SQUARE HUARADDO" #x3332)
+    ("SQUARE HUIITO" #x3333)
+    ("SQUARE BUSSYERU" #x3334)
+    ("SQUARE HURAN" #x3335)
+    ("SQUARE HEKUTAARU" #x3336)
+    ("SQUARE PESO" #x3337)
+    ("SQUARE PENIHI" #x3338)
+    ("SQUARE HERUTU" #x3339)
+    ("SQUARE PENSU" #x333A)
+    ("SQUARE PEEZI" #x333B)
+    ("SQUARE BEETA" #x333C)
+    ("SQUARE POINTO" #x333D)
+    ("SQUARE BORUTO" #x333E)
+    ("SQUARE HON" #x333F)
+    ("SQUARE PONDO" #x3340)
+    ("SQUARE HOORU" #x3341)
+    ("SQUARE HOON" #x3342)
+    ("SQUARE MAIKURO" #x3343)
+    ("SQUARE MAIRU" #x3344)
+    ("SQUARE MAHHA" #x3345)
+    ("SQUARE MARUKU" #x3346)
+    ("SQUARE MANSYON" #x3347)
+    ("SQUARE MIKURON" #x3348)
+    ("SQUARE MIRI" #x3349)
+    ("SQUARE MIRIBAARU" #x334A)
+    ("SQUARE MEGA" #x334B)
+    ("SQUARE MEGATON" #x334C)
+    ("SQUARE MEETORU" #x334D)
+    ("SQUARE YAADO" #x334E)
+    ("SQUARE YAARU" #x334F)
+    ("SQUARE YUAN" #x3350)
+    ("SQUARE RITTORU" #x3351)
+    ("SQUARE RIRA" #x3352)
+    ("SQUARE RUPII" #x3353)
+    ("SQUARE RUUBURU" #x3354)
+    ("SQUARE REMU" #x3355)
+    ("SQUARE RENTOGEN" #x3356)
+    ("SQUARE WATTO" #x3357)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO" #x3358)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE" #x3359)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO" #x335A)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE" #x335B)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR" #x335C)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE" #x335D)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX" #x335E)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN" #x335F)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT" #x3360)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE" #x3361)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN" #x3362)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN" #x3363)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE" #x3364)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN" #x3365)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN" #x3366)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN" #x3367)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN" #x3368)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN" #x3369)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN" #x336A)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN" #x336B)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY" #x336C)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE" #x336D)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO" #x336E)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE" #x336F)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR" #x3370)
+    ("SQUARE HPA" #x3371)
+    ("SQUARE DA" #x3372)
+    ("SQUARE AU" #x3373)
+    ("SQUARE BAR" #x3374)
+    ("SQUARE OV" #x3375)
+    ("SQUARE PC" #x3376)
+    ("SQUARE ERA NAME HEISEI" #x337B)
+    ("SQUARE ERA NAME SYOUWA" #x337C)
+    ("SQUARE ERA NAME TAISYOU" #x337D)
+    ("SQUARE ERA NAME MEIZI" #x337E)
+    ("SQUARE CORPORATION" #x337F)
+    ("SQUARE PA AMPS" #x3380)
+    ("SQUARE NA" #x3381)
+    ("SQUARE MU A" #x3382)
+    ("SQUARE MA" #x3383)
+    ("SQUARE KA" #x3384)
+    ("SQUARE KB" #x3385)
+    ("SQUARE MB" #x3386)
+    ("SQUARE GB" #x3387)
+    ("SQUARE CAL" #x3388)
+    ("SQUARE KCAL" #x3389)
+    ("SQUARE PF" #x338A)
+    ("SQUARE NF" #x338B)
+    ("SQUARE MU F" #x338C)
+    ("SQUARE MU G" #x338D)
+    ("SQUARE MG" #x338E)
+    ("SQUARE KG" #x338F)
+    ("SQUARE HZ" #x3390)
+    ("SQUARE KHZ" #x3391)
+    ("SQUARE MHZ" #x3392)
+    ("SQUARE GHZ" #x3393)
+    ("SQUARE THZ" #x3394)
+    ("SQUARE MU L" #x3395)
+    ("SQUARE ML" #x3396)
+    ("SQUARE DL" #x3397)
+    ("SQUARE KL" #x3398)
+    ("SQUARE FM" #x3399)
+    ("SQUARE NM" #x339A)
+    ("SQUARE MU M" #x339B)
+    ("SQUARE MM" #x339C)
+    ("SQUARE CM" #x339D)
+    ("SQUARE KM" #x339E)
+    ("SQUARE MM SQUARED" #x339F)
+    ("SQUARE CM SQUARED" #x33A0)
+    ("SQUARE M SQUARED" #x33A1)
+    ("SQUARE KM SQUARED" #x33A2)
+    ("SQUARE MM CUBED" #x33A3)
+    ("SQUARE CM CUBED" #x33A4)
+    ("SQUARE M CUBED" #x33A5)
+    ("SQUARE KM CUBED" #x33A6)
+    ("SQUARE M OVER S" #x33A7)
+    ("SQUARE M OVER S SQUARED" #x33A8)
+    ("SQUARE PA" #x33A9)
+    ("SQUARE KPA" #x33AA)
+    ("SQUARE MPA" #x33AB)
+    ("SQUARE GPA" #x33AC)
+    ("SQUARE RAD" #x33AD)
+    ("SQUARE RAD OVER S" #x33AE)
+    ("SQUARE RAD OVER S SQUARED" #x33AF)
+    ("SQUARE PS" #x33B0)
+    ("SQUARE NS" #x33B1)
+    ("SQUARE MU S" #x33B2)
+    ("SQUARE MS" #x33B3)
+    ("SQUARE PV" #x33B4)
+    ("SQUARE NV" #x33B5)
+    ("SQUARE MU V" #x33B6)
+    ("SQUARE MV" #x33B7)
+    ("SQUARE KV" #x33B8)
+    ("SQUARE MV MEGA" #x33B9)
+    ("SQUARE PW" #x33BA)
+    ("SQUARE NW" #x33BB)
+    ("SQUARE MU W" #x33BC)
+    ("SQUARE MW" #x33BD)
+    ("SQUARE KW" #x33BE)
+    ("SQUARE MW MEGA" #x33BF)
+    ("SQUARE K OHM" #x33C0)
+    ("SQUARE M OHM" #x33C1)
+    ("SQUARE AM" #x33C2)
+    ("SQUARE BQ" #x33C3)
+    ("SQUARE CC" #x33C4)
+    ("SQUARE CD" #x33C5)
+    ("SQUARE C OVER KG" #x33C6)
+    ("SQUARE CO" #x33C7)
+    ("SQUARE DB" #x33C8)
+    ("SQUARE GY" #x33C9)
+    ("SQUARE HA" #x33CA)
+    ("SQUARE HP" #x33CB)
+    ("SQUARE IN" #x33CC)
+    ("SQUARE KK" #x33CD)
+    ("SQUARE KM CAPITAL" #x33CE)
+    ("SQUARE KT" #x33CF)
+    ("SQUARE LM" #x33D0)
+    ("SQUARE LN" #x33D1)
+    ("SQUARE LOG" #x33D2)
+    ("SQUARE LX" #x33D3)
+    ("SQUARE MB SMALL" #x33D4)
+    ("SQUARE MIL" #x33D5)
+    ("SQUARE MOL" #x33D6)
+    ("SQUARE PH" #x33D7)
+    ("SQUARE PM" #x33D8)
+    ("SQUARE PPM" #x33D9)
+    ("SQUARE PR" #x33DA)
+    ("SQUARE SR" #x33DB)
+    ("SQUARE SV" #x33DC)
+    ("SQUARE WB" #x33DD)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE" #x33E0)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO" #x33E1)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE" #x33E2)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR" #x33E3)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE" #x33E4)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX" #x33E5)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN" #x33E6)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT" #x33E7)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE" #x33E8)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN" #x33E9)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN" #x33EA)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE" #x33EB)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN" #x33EC)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN" #x33ED)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN" #x33EE)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN" #x33EF)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN" #x33F0)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN" #x33F1)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN" #x33F2)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY" #x33F3)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE" #x33F4)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO" #x33F5)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE" #x33F6)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR" #x33F7)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE" #x33F8)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX" #x33F9)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN" #x33FA)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT" #x33FB)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE" #x33FC)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY" #x33FD)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE" #x33FE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/03400-04DBF.el b/lisp/nxml/char-name/unicode/03400-04DBF.el
new file mode 100644 (file)
index 0000000..14d5c4b
--- /dev/null
@@ -0,0 +1,2 @@
+(nxml-define-char-name-set 'cjk-unified-ideographs-extension-a
+  '())
diff --git a/lisp/nxml/char-name/unicode/0A000-0A48F.el b/lisp/nxml/char-name/unicode/0A000-0A48F.el
new file mode 100644 (file)
index 0000000..8d0727f
--- /dev/null
@@ -0,0 +1,1167 @@
+(nxml-define-char-name-set 'yi-syllables
+  '(("YI SYLLABLE IT" #xA000)
+    ("YI SYLLABLE IX" #xA001)
+    ("YI SYLLABLE I" #xA002)
+    ("YI SYLLABLE IP" #xA003)
+    ("YI SYLLABLE IET" #xA004)
+    ("YI SYLLABLE IEX" #xA005)
+    ("YI SYLLABLE IE" #xA006)
+    ("YI SYLLABLE IEP" #xA007)
+    ("YI SYLLABLE AT" #xA008)
+    ("YI SYLLABLE AX" #xA009)
+    ("YI SYLLABLE A" #xA00A)
+    ("YI SYLLABLE AP" #xA00B)
+    ("YI SYLLABLE UOX" #xA00C)
+    ("YI SYLLABLE UO" #xA00D)
+    ("YI SYLLABLE UOP" #xA00E)
+    ("YI SYLLABLE OT" #xA00F)
+    ("YI SYLLABLE OX" #xA010)
+    ("YI SYLLABLE O" #xA011)
+    ("YI SYLLABLE OP" #xA012)
+    ("YI SYLLABLE EX" #xA013)
+    ("YI SYLLABLE E" #xA014)
+    ("YI SYLLABLE WU" #xA015)
+    ("YI SYLLABLE BIT" #xA016)
+    ("YI SYLLABLE BIX" #xA017)
+    ("YI SYLLABLE BI" #xA018)
+    ("YI SYLLABLE BIP" #xA019)
+    ("YI SYLLABLE BIET" #xA01A)
+    ("YI SYLLABLE BIEX" #xA01B)
+    ("YI SYLLABLE BIE" #xA01C)
+    ("YI SYLLABLE BIEP" #xA01D)
+    ("YI SYLLABLE BAT" #xA01E)
+    ("YI SYLLABLE BAX" #xA01F)
+    ("YI SYLLABLE BA" #xA020)
+    ("YI SYLLABLE BAP" #xA021)
+    ("YI SYLLABLE BUOX" #xA022)
+    ("YI SYLLABLE BUO" #xA023)
+    ("YI SYLLABLE BUOP" #xA024)
+    ("YI SYLLABLE BOT" #xA025)
+    ("YI SYLLABLE BOX" #xA026)
+    ("YI SYLLABLE BO" #xA027)
+    ("YI SYLLABLE BOP" #xA028)
+    ("YI SYLLABLE BEX" #xA029)
+    ("YI SYLLABLE BE" #xA02A)
+    ("YI SYLLABLE BEP" #xA02B)
+    ("YI SYLLABLE BUT" #xA02C)
+    ("YI SYLLABLE BUX" #xA02D)
+    ("YI SYLLABLE BU" #xA02E)
+    ("YI SYLLABLE BUP" #xA02F)
+    ("YI SYLLABLE BURX" #xA030)
+    ("YI SYLLABLE BUR" #xA031)
+    ("YI SYLLABLE BYT" #xA032)
+    ("YI SYLLABLE BYX" #xA033)
+    ("YI SYLLABLE BY" #xA034)
+    ("YI SYLLABLE BYP" #xA035)
+    ("YI SYLLABLE BYRX" #xA036)
+    ("YI SYLLABLE BYR" #xA037)
+    ("YI SYLLABLE PIT" #xA038)
+    ("YI SYLLABLE PIX" #xA039)
+    ("YI SYLLABLE PI" #xA03A)
+    ("YI SYLLABLE PIP" #xA03B)
+    ("YI SYLLABLE PIEX" #xA03C)
+    ("YI SYLLABLE PIE" #xA03D)
+    ("YI SYLLABLE PIEP" #xA03E)
+    ("YI SYLLABLE PAT" #xA03F)
+    ("YI SYLLABLE PAX" #xA040)
+    ("YI SYLLABLE PA" #xA041)
+    ("YI SYLLABLE PAP" #xA042)
+    ("YI SYLLABLE PUOX" #xA043)
+    ("YI SYLLABLE PUO" #xA044)
+    ("YI SYLLABLE PUOP" #xA045)
+    ("YI SYLLABLE POT" #xA046)
+    ("YI SYLLABLE POX" #xA047)
+    ("YI SYLLABLE PO" #xA048)
+    ("YI SYLLABLE POP" #xA049)
+    ("YI SYLLABLE PUT" #xA04A)
+    ("YI SYLLABLE PUX" #xA04B)
+    ("YI SYLLABLE PU" #xA04C)
+    ("YI SYLLABLE PUP" #xA04D)
+    ("YI SYLLABLE PURX" #xA04E)
+    ("YI SYLLABLE PUR" #xA04F)
+    ("YI SYLLABLE PYT" #xA050)
+    ("YI SYLLABLE PYX" #xA051)
+    ("YI SYLLABLE PY" #xA052)
+    ("YI SYLLABLE PYP" #xA053)
+    ("YI SYLLABLE PYRX" #xA054)
+    ("YI SYLLABLE PYR" #xA055)
+    ("YI SYLLABLE BBIT" #xA056)
+    ("YI SYLLABLE BBIX" #xA057)
+    ("YI SYLLABLE BBI" #xA058)
+    ("YI SYLLABLE BBIP" #xA059)
+    ("YI SYLLABLE BBIET" #xA05A)
+    ("YI SYLLABLE BBIEX" #xA05B)
+    ("YI SYLLABLE BBIE" #xA05C)
+    ("YI SYLLABLE BBIEP" #xA05D)
+    ("YI SYLLABLE BBAT" #xA05E)
+    ("YI SYLLABLE BBAX" #xA05F)
+    ("YI SYLLABLE BBA" #xA060)
+    ("YI SYLLABLE BBAP" #xA061)
+    ("YI SYLLABLE BBUOX" #xA062)
+    ("YI SYLLABLE BBUO" #xA063)
+    ("YI SYLLABLE BBUOP" #xA064)
+    ("YI SYLLABLE BBOT" #xA065)
+    ("YI SYLLABLE BBOX" #xA066)
+    ("YI SYLLABLE BBO" #xA067)
+    ("YI SYLLABLE BBOP" #xA068)
+    ("YI SYLLABLE BBEX" #xA069)
+    ("YI SYLLABLE BBE" #xA06A)
+    ("YI SYLLABLE BBEP" #xA06B)
+    ("YI SYLLABLE BBUT" #xA06C)
+    ("YI SYLLABLE BBUX" #xA06D)
+    ("YI SYLLABLE BBU" #xA06E)
+    ("YI SYLLABLE BBUP" #xA06F)
+    ("YI SYLLABLE BBURX" #xA070)
+    ("YI SYLLABLE BBUR" #xA071)
+    ("YI SYLLABLE BBYT" #xA072)
+    ("YI SYLLABLE BBYX" #xA073)
+    ("YI SYLLABLE BBY" #xA074)
+    ("YI SYLLABLE BBYP" #xA075)
+    ("YI SYLLABLE NBIT" #xA076)
+    ("YI SYLLABLE NBIX" #xA077)
+    ("YI SYLLABLE NBI" #xA078)
+    ("YI SYLLABLE NBIP" #xA079)
+    ("YI SYLLABLE NBIEX" #xA07A)
+    ("YI SYLLABLE NBIE" #xA07B)
+    ("YI SYLLABLE NBIEP" #xA07C)
+    ("YI SYLLABLE NBAT" #xA07D)
+    ("YI SYLLABLE NBAX" #xA07E)
+    ("YI SYLLABLE NBA" #xA07F)
+    ("YI SYLLABLE NBAP" #xA080)
+    ("YI SYLLABLE NBOT" #xA081)
+    ("YI SYLLABLE NBOX" #xA082)
+    ("YI SYLLABLE NBO" #xA083)
+    ("YI SYLLABLE NBOP" #xA084)
+    ("YI SYLLABLE NBUT" #xA085)
+    ("YI SYLLABLE NBUX" #xA086)
+    ("YI SYLLABLE NBU" #xA087)
+    ("YI SYLLABLE NBUP" #xA088)
+    ("YI SYLLABLE NBURX" #xA089)
+    ("YI SYLLABLE NBUR" #xA08A)
+    ("YI SYLLABLE NBYT" #xA08B)
+    ("YI SYLLABLE NBYX" #xA08C)
+    ("YI SYLLABLE NBY" #xA08D)
+    ("YI SYLLABLE NBYP" #xA08E)
+    ("YI SYLLABLE NBYRX" #xA08F)
+    ("YI SYLLABLE NBYR" #xA090)
+    ("YI SYLLABLE HMIT" #xA091)
+    ("YI SYLLABLE HMIX" #xA092)
+    ("YI SYLLABLE HMI" #xA093)
+    ("YI SYLLABLE HMIP" #xA094)
+    ("YI SYLLABLE HMIEX" #xA095)
+    ("YI SYLLABLE HMIE" #xA096)
+    ("YI SYLLABLE HMIEP" #xA097)
+    ("YI SYLLABLE HMAT" #xA098)
+    ("YI SYLLABLE HMAX" #xA099)
+    ("YI SYLLABLE HMA" #xA09A)
+    ("YI SYLLABLE HMAP" #xA09B)
+    ("YI SYLLABLE HMUOX" #xA09C)
+    ("YI SYLLABLE HMUO" #xA09D)
+    ("YI SYLLABLE HMUOP" #xA09E)
+    ("YI SYLLABLE HMOT" #xA09F)
+    ("YI SYLLABLE HMOX" #xA0A0)
+    ("YI SYLLABLE HMO" #xA0A1)
+    ("YI SYLLABLE HMOP" #xA0A2)
+    ("YI SYLLABLE HMUT" #xA0A3)
+    ("YI SYLLABLE HMUX" #xA0A4)
+    ("YI SYLLABLE HMU" #xA0A5)
+    ("YI SYLLABLE HMUP" #xA0A6)
+    ("YI SYLLABLE HMURX" #xA0A7)
+    ("YI SYLLABLE HMUR" #xA0A8)
+    ("YI SYLLABLE HMYX" #xA0A9)
+    ("YI SYLLABLE HMY" #xA0AA)
+    ("YI SYLLABLE HMYP" #xA0AB)
+    ("YI SYLLABLE HMYRX" #xA0AC)
+    ("YI SYLLABLE HMYR" #xA0AD)
+    ("YI SYLLABLE MIT" #xA0AE)
+    ("YI SYLLABLE MIX" #xA0AF)
+    ("YI SYLLABLE MI" #xA0B0)
+    ("YI SYLLABLE MIP" #xA0B1)
+    ("YI SYLLABLE MIEX" #xA0B2)
+    ("YI SYLLABLE MIE" #xA0B3)
+    ("YI SYLLABLE MIEP" #xA0B4)
+    ("YI SYLLABLE MAT" #xA0B5)
+    ("YI SYLLABLE MAX" #xA0B6)
+    ("YI SYLLABLE MA" #xA0B7)
+    ("YI SYLLABLE MAP" #xA0B8)
+    ("YI SYLLABLE MUOT" #xA0B9)
+    ("YI SYLLABLE MUOX" #xA0BA)
+    ("YI SYLLABLE MUO" #xA0BB)
+    ("YI SYLLABLE MUOP" #xA0BC)
+    ("YI SYLLABLE MOT" #xA0BD)
+    ("YI SYLLABLE MOX" #xA0BE)
+    ("YI SYLLABLE MO" #xA0BF)
+    ("YI SYLLABLE MOP" #xA0C0)
+    ("YI SYLLABLE MEX" #xA0C1)
+    ("YI SYLLABLE ME" #xA0C2)
+    ("YI SYLLABLE MUT" #xA0C3)
+    ("YI SYLLABLE MUX" #xA0C4)
+    ("YI SYLLABLE MU" #xA0C5)
+    ("YI SYLLABLE MUP" #xA0C6)
+    ("YI SYLLABLE MURX" #xA0C7)
+    ("YI SYLLABLE MUR" #xA0C8)
+    ("YI SYLLABLE MYT" #xA0C9)
+    ("YI SYLLABLE MYX" #xA0CA)
+    ("YI SYLLABLE MY" #xA0CB)
+    ("YI SYLLABLE MYP" #xA0CC)
+    ("YI SYLLABLE FIT" #xA0CD)
+    ("YI SYLLABLE FIX" #xA0CE)
+    ("YI SYLLABLE FI" #xA0CF)
+    ("YI SYLLABLE FIP" #xA0D0)
+    ("YI SYLLABLE FAT" #xA0D1)
+    ("YI SYLLABLE FAX" #xA0D2)
+    ("YI SYLLABLE FA" #xA0D3)
+    ("YI SYLLABLE FAP" #xA0D4)
+    ("YI SYLLABLE FOX" #xA0D5)
+    ("YI SYLLABLE FO" #xA0D6)
+    ("YI SYLLABLE FOP" #xA0D7)
+    ("YI SYLLABLE FUT" #xA0D8)
+    ("YI SYLLABLE FUX" #xA0D9)
+    ("YI SYLLABLE FU" #xA0DA)
+    ("YI SYLLABLE FUP" #xA0DB)
+    ("YI SYLLABLE FURX" #xA0DC)
+    ("YI SYLLABLE FUR" #xA0DD)
+    ("YI SYLLABLE FYT" #xA0DE)
+    ("YI SYLLABLE FYX" #xA0DF)
+    ("YI SYLLABLE FY" #xA0E0)
+    ("YI SYLLABLE FYP" #xA0E1)
+    ("YI SYLLABLE VIT" #xA0E2)
+    ("YI SYLLABLE VIX" #xA0E3)
+    ("YI SYLLABLE VI" #xA0E4)
+    ("YI SYLLABLE VIP" #xA0E5)
+    ("YI SYLLABLE VIET" #xA0E6)
+    ("YI SYLLABLE VIEX" #xA0E7)
+    ("YI SYLLABLE VIE" #xA0E8)
+    ("YI SYLLABLE VIEP" #xA0E9)
+    ("YI SYLLABLE VAT" #xA0EA)
+    ("YI SYLLABLE VAX" #xA0EB)
+    ("YI SYLLABLE VA" #xA0EC)
+    ("YI SYLLABLE VAP" #xA0ED)
+    ("YI SYLLABLE VOT" #xA0EE)
+    ("YI SYLLABLE VOX" #xA0EF)
+    ("YI SYLLABLE VO" #xA0F0)
+    ("YI SYLLABLE VOP" #xA0F1)
+    ("YI SYLLABLE VEX" #xA0F2)
+    ("YI SYLLABLE VEP" #xA0F3)
+    ("YI SYLLABLE VUT" #xA0F4)
+    ("YI SYLLABLE VUX" #xA0F5)
+    ("YI SYLLABLE VU" #xA0F6)
+    ("YI SYLLABLE VUP" #xA0F7)
+    ("YI SYLLABLE VURX" #xA0F8)
+    ("YI SYLLABLE VUR" #xA0F9)
+    ("YI SYLLABLE VYT" #xA0FA)
+    ("YI SYLLABLE VYX" #xA0FB)
+    ("YI SYLLABLE VY" #xA0FC)
+    ("YI SYLLABLE VYP" #xA0FD)
+    ("YI SYLLABLE VYRX" #xA0FE)
+    ("YI SYLLABLE VYR" #xA0FF)
+    ("YI SYLLABLE DIT" #xA100)
+    ("YI SYLLABLE DIX" #xA101)
+    ("YI SYLLABLE DI" #xA102)
+    ("YI SYLLABLE DIP" #xA103)
+    ("YI SYLLABLE DIEX" #xA104)
+    ("YI SYLLABLE DIE" #xA105)
+    ("YI SYLLABLE DIEP" #xA106)
+    ("YI SYLLABLE DAT" #xA107)
+    ("YI SYLLABLE DAX" #xA108)
+    ("YI SYLLABLE DA" #xA109)
+    ("YI SYLLABLE DAP" #xA10A)
+    ("YI SYLLABLE DUOX" #xA10B)
+    ("YI SYLLABLE DUO" #xA10C)
+    ("YI SYLLABLE DOT" #xA10D)
+    ("YI SYLLABLE DOX" #xA10E)
+    ("YI SYLLABLE DO" #xA10F)
+    ("YI SYLLABLE DOP" #xA110)
+    ("YI SYLLABLE DEX" #xA111)
+    ("YI SYLLABLE DE" #xA112)
+    ("YI SYLLABLE DEP" #xA113)
+    ("YI SYLLABLE DUT" #xA114)
+    ("YI SYLLABLE DUX" #xA115)
+    ("YI SYLLABLE DU" #xA116)
+    ("YI SYLLABLE DUP" #xA117)
+    ("YI SYLLABLE DURX" #xA118)
+    ("YI SYLLABLE DUR" #xA119)
+    ("YI SYLLABLE TIT" #xA11A)
+    ("YI SYLLABLE TIX" #xA11B)
+    ("YI SYLLABLE TI" #xA11C)
+    ("YI SYLLABLE TIP" #xA11D)
+    ("YI SYLLABLE TIEX" #xA11E)
+    ("YI SYLLABLE TIE" #xA11F)
+    ("YI SYLLABLE TIEP" #xA120)
+    ("YI SYLLABLE TAT" #xA121)
+    ("YI SYLLABLE TAX" #xA122)
+    ("YI SYLLABLE TA" #xA123)
+    ("YI SYLLABLE TAP" #xA124)
+    ("YI SYLLABLE TUOT" #xA125)
+    ("YI SYLLABLE TUOX" #xA126)
+    ("YI SYLLABLE TUO" #xA127)
+    ("YI SYLLABLE TUOP" #xA128)
+    ("YI SYLLABLE TOT" #xA129)
+    ("YI SYLLABLE TOX" #xA12A)
+    ("YI SYLLABLE TO" #xA12B)
+    ("YI SYLLABLE TOP" #xA12C)
+    ("YI SYLLABLE TEX" #xA12D)
+    ("YI SYLLABLE TE" #xA12E)
+    ("YI SYLLABLE TEP" #xA12F)
+    ("YI SYLLABLE TUT" #xA130)
+    ("YI SYLLABLE TUX" #xA131)
+    ("YI SYLLABLE TU" #xA132)
+    ("YI SYLLABLE TUP" #xA133)
+    ("YI SYLLABLE TURX" #xA134)
+    ("YI SYLLABLE TUR" #xA135)
+    ("YI SYLLABLE DDIT" #xA136)
+    ("YI SYLLABLE DDIX" #xA137)
+    ("YI SYLLABLE DDI" #xA138)
+    ("YI SYLLABLE DDIP" #xA139)
+    ("YI SYLLABLE DDIEX" #xA13A)
+    ("YI SYLLABLE DDIE" #xA13B)
+    ("YI SYLLABLE DDIEP" #xA13C)
+    ("YI SYLLABLE DDAT" #xA13D)
+    ("YI SYLLABLE DDAX" #xA13E)
+    ("YI SYLLABLE DDA" #xA13F)
+    ("YI SYLLABLE DDAP" #xA140)
+    ("YI SYLLABLE DDUOX" #xA141)
+    ("YI SYLLABLE DDUO" #xA142)
+    ("YI SYLLABLE DDUOP" #xA143)
+    ("YI SYLLABLE DDOT" #xA144)
+    ("YI SYLLABLE DDOX" #xA145)
+    ("YI SYLLABLE DDO" #xA146)
+    ("YI SYLLABLE DDOP" #xA147)
+    ("YI SYLLABLE DDEX" #xA148)
+    ("YI SYLLABLE DDE" #xA149)
+    ("YI SYLLABLE DDEP" #xA14A)
+    ("YI SYLLABLE DDUT" #xA14B)
+    ("YI SYLLABLE DDUX" #xA14C)
+    ("YI SYLLABLE DDU" #xA14D)
+    ("YI SYLLABLE DDUP" #xA14E)
+    ("YI SYLLABLE DDURX" #xA14F)
+    ("YI SYLLABLE DDUR" #xA150)
+    ("YI SYLLABLE NDIT" #xA151)
+    ("YI SYLLABLE NDIX" #xA152)
+    ("YI SYLLABLE NDI" #xA153)
+    ("YI SYLLABLE NDIP" #xA154)
+    ("YI SYLLABLE NDIEX" #xA155)
+    ("YI SYLLABLE NDIE" #xA156)
+    ("YI SYLLABLE NDAT" #xA157)
+    ("YI SYLLABLE NDAX" #xA158)
+    ("YI SYLLABLE NDA" #xA159)
+    ("YI SYLLABLE NDAP" #xA15A)
+    ("YI SYLLABLE NDOT" #xA15B)
+    ("YI SYLLABLE NDOX" #xA15C)
+    ("YI SYLLABLE NDO" #xA15D)
+    ("YI SYLLABLE NDOP" #xA15E)
+    ("YI SYLLABLE NDEX" #xA15F)
+    ("YI SYLLABLE NDE" #xA160)
+    ("YI SYLLABLE NDEP" #xA161)
+    ("YI SYLLABLE NDUT" #xA162)
+    ("YI SYLLABLE NDUX" #xA163)
+    ("YI SYLLABLE NDU" #xA164)
+    ("YI SYLLABLE NDUP" #xA165)
+    ("YI SYLLABLE NDURX" #xA166)
+    ("YI SYLLABLE NDUR" #xA167)
+    ("YI SYLLABLE HNIT" #xA168)
+    ("YI SYLLABLE HNIX" #xA169)
+    ("YI SYLLABLE HNI" #xA16A)
+    ("YI SYLLABLE HNIP" #xA16B)
+    ("YI SYLLABLE HNIET" #xA16C)
+    ("YI SYLLABLE HNIEX" #xA16D)
+    ("YI SYLLABLE HNIE" #xA16E)
+    ("YI SYLLABLE HNIEP" #xA16F)
+    ("YI SYLLABLE HNAT" #xA170)
+    ("YI SYLLABLE HNAX" #xA171)
+    ("YI SYLLABLE HNA" #xA172)
+    ("YI SYLLABLE HNAP" #xA173)
+    ("YI SYLLABLE HNUOX" #xA174)
+    ("YI SYLLABLE HNUO" #xA175)
+    ("YI SYLLABLE HNOT" #xA176)
+    ("YI SYLLABLE HNOX" #xA177)
+    ("YI SYLLABLE HNOP" #xA178)
+    ("YI SYLLABLE HNEX" #xA179)
+    ("YI SYLLABLE HNE" #xA17A)
+    ("YI SYLLABLE HNEP" #xA17B)
+    ("YI SYLLABLE HNUT" #xA17C)
+    ("YI SYLLABLE NIT" #xA17D)
+    ("YI SYLLABLE NIX" #xA17E)
+    ("YI SYLLABLE NI" #xA17F)
+    ("YI SYLLABLE NIP" #xA180)
+    ("YI SYLLABLE NIEX" #xA181)
+    ("YI SYLLABLE NIE" #xA182)
+    ("YI SYLLABLE NIEP" #xA183)
+    ("YI SYLLABLE NAX" #xA184)
+    ("YI SYLLABLE NA" #xA185)
+    ("YI SYLLABLE NAP" #xA186)
+    ("YI SYLLABLE NUOX" #xA187)
+    ("YI SYLLABLE NUO" #xA188)
+    ("YI SYLLABLE NUOP" #xA189)
+    ("YI SYLLABLE NOT" #xA18A)
+    ("YI SYLLABLE NOX" #xA18B)
+    ("YI SYLLABLE NO" #xA18C)
+    ("YI SYLLABLE NOP" #xA18D)
+    ("YI SYLLABLE NEX" #xA18E)
+    ("YI SYLLABLE NE" #xA18F)
+    ("YI SYLLABLE NEP" #xA190)
+    ("YI SYLLABLE NUT" #xA191)
+    ("YI SYLLABLE NUX" #xA192)
+    ("YI SYLLABLE NU" #xA193)
+    ("YI SYLLABLE NUP" #xA194)
+    ("YI SYLLABLE NURX" #xA195)
+    ("YI SYLLABLE NUR" #xA196)
+    ("YI SYLLABLE HLIT" #xA197)
+    ("YI SYLLABLE HLIX" #xA198)
+    ("YI SYLLABLE HLI" #xA199)
+    ("YI SYLLABLE HLIP" #xA19A)
+    ("YI SYLLABLE HLIEX" #xA19B)
+    ("YI SYLLABLE HLIE" #xA19C)
+    ("YI SYLLABLE HLIEP" #xA19D)
+    ("YI SYLLABLE HLAT" #xA19E)
+    ("YI SYLLABLE HLAX" #xA19F)
+    ("YI SYLLABLE HLA" #xA1A0)
+    ("YI SYLLABLE HLAP" #xA1A1)
+    ("YI SYLLABLE HLUOX" #xA1A2)
+    ("YI SYLLABLE HLUO" #xA1A3)
+    ("YI SYLLABLE HLUOP" #xA1A4)
+    ("YI SYLLABLE HLOX" #xA1A5)
+    ("YI SYLLABLE HLO" #xA1A6)
+    ("YI SYLLABLE HLOP" #xA1A7)
+    ("YI SYLLABLE HLEX" #xA1A8)
+    ("YI SYLLABLE HLE" #xA1A9)
+    ("YI SYLLABLE HLEP" #xA1AA)
+    ("YI SYLLABLE HLUT" #xA1AB)
+    ("YI SYLLABLE HLUX" #xA1AC)
+    ("YI SYLLABLE HLU" #xA1AD)
+    ("YI SYLLABLE HLUP" #xA1AE)
+    ("YI SYLLABLE HLURX" #xA1AF)
+    ("YI SYLLABLE HLUR" #xA1B0)
+    ("YI SYLLABLE HLYT" #xA1B1)
+    ("YI SYLLABLE HLYX" #xA1B2)
+    ("YI SYLLABLE HLY" #xA1B3)
+    ("YI SYLLABLE HLYP" #xA1B4)
+    ("YI SYLLABLE HLYRX" #xA1B5)
+    ("YI SYLLABLE HLYR" #xA1B6)
+    ("YI SYLLABLE LIT" #xA1B7)
+    ("YI SYLLABLE LIX" #xA1B8)
+    ("YI SYLLABLE LI" #xA1B9)
+    ("YI SYLLABLE LIP" #xA1BA)
+    ("YI SYLLABLE LIET" #xA1BB)
+    ("YI SYLLABLE LIEX" #xA1BC)
+    ("YI SYLLABLE LIE" #xA1BD)
+    ("YI SYLLABLE LIEP" #xA1BE)
+    ("YI SYLLABLE LAT" #xA1BF)
+    ("YI SYLLABLE LAX" #xA1C0)
+    ("YI SYLLABLE LA" #xA1C1)
+    ("YI SYLLABLE LAP" #xA1C2)
+    ("YI SYLLABLE LUOT" #xA1C3)
+    ("YI SYLLABLE LUOX" #xA1C4)
+    ("YI SYLLABLE LUO" #xA1C5)
+    ("YI SYLLABLE LUOP" #xA1C6)
+    ("YI SYLLABLE LOT" #xA1C7)
+    ("YI SYLLABLE LOX" #xA1C8)
+    ("YI SYLLABLE LO" #xA1C9)
+    ("YI SYLLABLE LOP" #xA1CA)
+    ("YI SYLLABLE LEX" #xA1CB)
+    ("YI SYLLABLE LE" #xA1CC)
+    ("YI SYLLABLE LEP" #xA1CD)
+    ("YI SYLLABLE LUT" #xA1CE)
+    ("YI SYLLABLE LUX" #xA1CF)
+    ("YI SYLLABLE LU" #xA1D0)
+    ("YI SYLLABLE LUP" #xA1D1)
+    ("YI SYLLABLE LURX" #xA1D2)
+    ("YI SYLLABLE LUR" #xA1D3)
+    ("YI SYLLABLE LYT" #xA1D4)
+    ("YI SYLLABLE LYX" #xA1D5)
+    ("YI SYLLABLE LY" #xA1D6)
+    ("YI SYLLABLE LYP" #xA1D7)
+    ("YI SYLLABLE LYRX" #xA1D8)
+    ("YI SYLLABLE LYR" #xA1D9)
+    ("YI SYLLABLE GIT" #xA1DA)
+    ("YI SYLLABLE GIX" #xA1DB)
+    ("YI SYLLABLE GI" #xA1DC)
+    ("YI SYLLABLE GIP" #xA1DD)
+    ("YI SYLLABLE GIET" #xA1DE)
+    ("YI SYLLABLE GIEX" #xA1DF)
+    ("YI SYLLABLE GIE" #xA1E0)
+    ("YI SYLLABLE GIEP" #xA1E1)
+    ("YI SYLLABLE GAT" #xA1E2)
+    ("YI SYLLABLE GAX" #xA1E3)
+    ("YI SYLLABLE GA" #xA1E4)
+    ("YI SYLLABLE GAP" #xA1E5)
+    ("YI SYLLABLE GUOT" #xA1E6)
+    ("YI SYLLABLE GUOX" #xA1E7)
+    ("YI SYLLABLE GUO" #xA1E8)
+    ("YI SYLLABLE GUOP" #xA1E9)
+    ("YI SYLLABLE GOT" #xA1EA)
+    ("YI SYLLABLE GOX" #xA1EB)
+    ("YI SYLLABLE GO" #xA1EC)
+    ("YI SYLLABLE GOP" #xA1ED)
+    ("YI SYLLABLE GET" #xA1EE)
+    ("YI SYLLABLE GEX" #xA1EF)
+    ("YI SYLLABLE GE" #xA1F0)
+    ("YI SYLLABLE GEP" #xA1F1)
+    ("YI SYLLABLE GUT" #xA1F2)
+    ("YI SYLLABLE GUX" #xA1F3)
+    ("YI SYLLABLE GU" #xA1F4)
+    ("YI SYLLABLE GUP" #xA1F5)
+    ("YI SYLLABLE GURX" #xA1F6)
+    ("YI SYLLABLE GUR" #xA1F7)
+    ("YI SYLLABLE KIT" #xA1F8)
+    ("YI SYLLABLE KIX" #xA1F9)
+    ("YI SYLLABLE KI" #xA1FA)
+    ("YI SYLLABLE KIP" #xA1FB)
+    ("YI SYLLABLE KIEX" #xA1FC)
+    ("YI SYLLABLE KIE" #xA1FD)
+    ("YI SYLLABLE KIEP" #xA1FE)
+    ("YI SYLLABLE KAT" #xA1FF)
+    ("YI SYLLABLE KAX" #xA200)
+    ("YI SYLLABLE KA" #xA201)
+    ("YI SYLLABLE KAP" #xA202)
+    ("YI SYLLABLE KUOX" #xA203)
+    ("YI SYLLABLE KUO" #xA204)
+    ("YI SYLLABLE KUOP" #xA205)
+    ("YI SYLLABLE KOT" #xA206)
+    ("YI SYLLABLE KOX" #xA207)
+    ("YI SYLLABLE KO" #xA208)
+    ("YI SYLLABLE KOP" #xA209)
+    ("YI SYLLABLE KET" #xA20A)
+    ("YI SYLLABLE KEX" #xA20B)
+    ("YI SYLLABLE KE" #xA20C)
+    ("YI SYLLABLE KEP" #xA20D)
+    ("YI SYLLABLE KUT" #xA20E)
+    ("YI SYLLABLE KUX" #xA20F)
+    ("YI SYLLABLE KU" #xA210)
+    ("YI SYLLABLE KUP" #xA211)
+    ("YI SYLLABLE KURX" #xA212)
+    ("YI SYLLABLE KUR" #xA213)
+    ("YI SYLLABLE GGIT" #xA214)
+    ("YI SYLLABLE GGIX" #xA215)
+    ("YI SYLLABLE GGI" #xA216)
+    ("YI SYLLABLE GGIEX" #xA217)
+    ("YI SYLLABLE GGIE" #xA218)
+    ("YI SYLLABLE GGIEP" #xA219)
+    ("YI SYLLABLE GGAT" #xA21A)
+    ("YI SYLLABLE GGAX" #xA21B)
+    ("YI SYLLABLE GGA" #xA21C)
+    ("YI SYLLABLE GGAP" #xA21D)
+    ("YI SYLLABLE GGUOT" #xA21E)
+    ("YI SYLLABLE GGUOX" #xA21F)
+    ("YI SYLLABLE GGUO" #xA220)
+    ("YI SYLLABLE GGUOP" #xA221)
+    ("YI SYLLABLE GGOT" #xA222)
+    ("YI SYLLABLE GGOX" #xA223)
+    ("YI SYLLABLE GGO" #xA224)
+    ("YI SYLLABLE GGOP" #xA225)
+    ("YI SYLLABLE GGET" #xA226)
+    ("YI SYLLABLE GGEX" #xA227)
+    ("YI SYLLABLE GGE" #xA228)
+    ("YI SYLLABLE GGEP" #xA229)
+    ("YI SYLLABLE GGUT" #xA22A)
+    ("YI SYLLABLE GGUX" #xA22B)
+    ("YI SYLLABLE GGU" #xA22C)
+    ("YI SYLLABLE GGUP" #xA22D)
+    ("YI SYLLABLE GGURX" #xA22E)
+    ("YI SYLLABLE GGUR" #xA22F)
+    ("YI SYLLABLE MGIEX" #xA230)
+    ("YI SYLLABLE MGIE" #xA231)
+    ("YI SYLLABLE MGAT" #xA232)
+    ("YI SYLLABLE MGAX" #xA233)
+    ("YI SYLLABLE MGA" #xA234)
+    ("YI SYLLABLE MGAP" #xA235)
+    ("YI SYLLABLE MGUOX" #xA236)
+    ("YI SYLLABLE MGUO" #xA237)
+    ("YI SYLLABLE MGUOP" #xA238)
+    ("YI SYLLABLE MGOT" #xA239)
+    ("YI SYLLABLE MGOX" #xA23A)
+    ("YI SYLLABLE MGO" #xA23B)
+    ("YI SYLLABLE MGOP" #xA23C)
+    ("YI SYLLABLE MGEX" #xA23D)
+    ("YI SYLLABLE MGE" #xA23E)
+    ("YI SYLLABLE MGEP" #xA23F)
+    ("YI SYLLABLE MGUT" #xA240)
+    ("YI SYLLABLE MGUX" #xA241)
+    ("YI SYLLABLE MGU" #xA242)
+    ("YI SYLLABLE MGUP" #xA243)
+    ("YI SYLLABLE MGURX" #xA244)
+    ("YI SYLLABLE MGUR" #xA245)
+    ("YI SYLLABLE HXIT" #xA246)
+    ("YI SYLLABLE HXIX" #xA247)
+    ("YI SYLLABLE HXI" #xA248)
+    ("YI SYLLABLE HXIP" #xA249)
+    ("YI SYLLABLE HXIET" #xA24A)
+    ("YI SYLLABLE HXIEX" #xA24B)
+    ("YI SYLLABLE HXIE" #xA24C)
+    ("YI SYLLABLE HXIEP" #xA24D)
+    ("YI SYLLABLE HXAT" #xA24E)
+    ("YI SYLLABLE HXAX" #xA24F)
+    ("YI SYLLABLE HXA" #xA250)
+    ("YI SYLLABLE HXAP" #xA251)
+    ("YI SYLLABLE HXUOT" #xA252)
+    ("YI SYLLABLE HXUOX" #xA253)
+    ("YI SYLLABLE HXUO" #xA254)
+    ("YI SYLLABLE HXUOP" #xA255)
+    ("YI SYLLABLE HXOT" #xA256)
+    ("YI SYLLABLE HXOX" #xA257)
+    ("YI SYLLABLE HXO" #xA258)
+    ("YI SYLLABLE HXOP" #xA259)
+    ("YI SYLLABLE HXEX" #xA25A)
+    ("YI SYLLABLE HXE" #xA25B)
+    ("YI SYLLABLE HXEP" #xA25C)
+    ("YI SYLLABLE NGIEX" #xA25D)
+    ("YI SYLLABLE NGIE" #xA25E)
+    ("YI SYLLABLE NGIEP" #xA25F)
+    ("YI SYLLABLE NGAT" #xA260)
+    ("YI SYLLABLE NGAX" #xA261)
+    ("YI SYLLABLE NGA" #xA262)
+    ("YI SYLLABLE NGAP" #xA263)
+    ("YI SYLLABLE NGUOT" #xA264)
+    ("YI SYLLABLE NGUOX" #xA265)
+    ("YI SYLLABLE NGUO" #xA266)
+    ("YI SYLLABLE NGOT" #xA267)
+    ("YI SYLLABLE NGOX" #xA268)
+    ("YI SYLLABLE NGO" #xA269)
+    ("YI SYLLABLE NGOP" #xA26A)
+    ("YI SYLLABLE NGEX" #xA26B)
+    ("YI SYLLABLE NGE" #xA26C)
+    ("YI SYLLABLE NGEP" #xA26D)
+    ("YI SYLLABLE HIT" #xA26E)
+    ("YI SYLLABLE HIEX" #xA26F)
+    ("YI SYLLABLE HIE" #xA270)
+    ("YI SYLLABLE HAT" #xA271)
+    ("YI SYLLABLE HAX" #xA272)
+    ("YI SYLLABLE HA" #xA273)
+    ("YI SYLLABLE HAP" #xA274)
+    ("YI SYLLABLE HUOT" #xA275)
+    ("YI SYLLABLE HUOX" #xA276)
+    ("YI SYLLABLE HUO" #xA277)
+    ("YI SYLLABLE HUOP" #xA278)
+    ("YI SYLLABLE HOT" #xA279)
+    ("YI SYLLABLE HOX" #xA27A)
+    ("YI SYLLABLE HO" #xA27B)
+    ("YI SYLLABLE HOP" #xA27C)
+    ("YI SYLLABLE HEX" #xA27D)
+    ("YI SYLLABLE HE" #xA27E)
+    ("YI SYLLABLE HEP" #xA27F)
+    ("YI SYLLABLE WAT" #xA280)
+    ("YI SYLLABLE WAX" #xA281)
+    ("YI SYLLABLE WA" #xA282)
+    ("YI SYLLABLE WAP" #xA283)
+    ("YI SYLLABLE WUOX" #xA284)
+    ("YI SYLLABLE WUO" #xA285)
+    ("YI SYLLABLE WUOP" #xA286)
+    ("YI SYLLABLE WOX" #xA287)
+    ("YI SYLLABLE WO" #xA288)
+    ("YI SYLLABLE WOP" #xA289)
+    ("YI SYLLABLE WEX" #xA28A)
+    ("YI SYLLABLE WE" #xA28B)
+    ("YI SYLLABLE WEP" #xA28C)
+    ("YI SYLLABLE ZIT" #xA28D)
+    ("YI SYLLABLE ZIX" #xA28E)
+    ("YI SYLLABLE ZI" #xA28F)
+    ("YI SYLLABLE ZIP" #xA290)
+    ("YI SYLLABLE ZIEX" #xA291)
+    ("YI SYLLABLE ZIE" #xA292)
+    ("YI SYLLABLE ZIEP" #xA293)
+    ("YI SYLLABLE ZAT" #xA294)
+    ("YI SYLLABLE ZAX" #xA295)
+    ("YI SYLLABLE ZA" #xA296)
+    ("YI SYLLABLE ZAP" #xA297)
+    ("YI SYLLABLE ZUOX" #xA298)
+    ("YI SYLLABLE ZUO" #xA299)
+    ("YI SYLLABLE ZUOP" #xA29A)
+    ("YI SYLLABLE ZOT" #xA29B)
+    ("YI SYLLABLE ZOX" #xA29C)
+    ("YI SYLLABLE ZO" #xA29D)
+    ("YI SYLLABLE ZOP" #xA29E)
+    ("YI SYLLABLE ZEX" #xA29F)
+    ("YI SYLLABLE ZE" #xA2A0)
+    ("YI SYLLABLE ZEP" #xA2A1)
+    ("YI SYLLABLE ZUT" #xA2A2)
+    ("YI SYLLABLE ZUX" #xA2A3)
+    ("YI SYLLABLE ZU" #xA2A4)
+    ("YI SYLLABLE ZUP" #xA2A5)
+    ("YI SYLLABLE ZURX" #xA2A6)
+    ("YI SYLLABLE ZUR" #xA2A7)
+    ("YI SYLLABLE ZYT" #xA2A8)
+    ("YI SYLLABLE ZYX" #xA2A9)
+    ("YI SYLLABLE ZY" #xA2AA)
+    ("YI SYLLABLE ZYP" #xA2AB)
+    ("YI SYLLABLE ZYRX" #xA2AC)
+    ("YI SYLLABLE ZYR" #xA2AD)
+    ("YI SYLLABLE CIT" #xA2AE)
+    ("YI SYLLABLE CIX" #xA2AF)
+    ("YI SYLLABLE CI" #xA2B0)
+    ("YI SYLLABLE CIP" #xA2B1)
+    ("YI SYLLABLE CIET" #xA2B2)
+    ("YI SYLLABLE CIEX" #xA2B3)
+    ("YI SYLLABLE CIE" #xA2B4)
+    ("YI SYLLABLE CIEP" #xA2B5)
+    ("YI SYLLABLE CAT" #xA2B6)
+    ("YI SYLLABLE CAX" #xA2B7)
+    ("YI SYLLABLE CA" #xA2B8)
+    ("YI SYLLABLE CAP" #xA2B9)
+    ("YI SYLLABLE CUOX" #xA2BA)
+    ("YI SYLLABLE CUO" #xA2BB)
+    ("YI SYLLABLE CUOP" #xA2BC)
+    ("YI SYLLABLE COT" #xA2BD)
+    ("YI SYLLABLE COX" #xA2BE)
+    ("YI SYLLABLE CO" #xA2BF)
+    ("YI SYLLABLE COP" #xA2C0)
+    ("YI SYLLABLE CEX" #xA2C1)
+    ("YI SYLLABLE CE" #xA2C2)
+    ("YI SYLLABLE CEP" #xA2C3)
+    ("YI SYLLABLE CUT" #xA2C4)
+    ("YI SYLLABLE CUX" #xA2C5)
+    ("YI SYLLABLE CU" #xA2C6)
+    ("YI SYLLABLE CUP" #xA2C7)
+    ("YI SYLLABLE CURX" #xA2C8)
+    ("YI SYLLABLE CUR" #xA2C9)
+    ("YI SYLLABLE CYT" #xA2CA)
+    ("YI SYLLABLE CYX" #xA2CB)
+    ("YI SYLLABLE CY" #xA2CC)
+    ("YI SYLLABLE CYP" #xA2CD)
+    ("YI SYLLABLE CYRX" #xA2CE)
+    ("YI SYLLABLE CYR" #xA2CF)
+    ("YI SYLLABLE ZZIT" #xA2D0)
+    ("YI SYLLABLE ZZIX" #xA2D1)
+    ("YI SYLLABLE ZZI" #xA2D2)
+    ("YI SYLLABLE ZZIP" #xA2D3)
+    ("YI SYLLABLE ZZIET" #xA2D4)
+    ("YI SYLLABLE ZZIEX" #xA2D5)
+    ("YI SYLLABLE ZZIE" #xA2D6)
+    ("YI SYLLABLE ZZIEP" #xA2D7)
+    ("YI SYLLABLE ZZAT" #xA2D8)
+    ("YI SYLLABLE ZZAX" #xA2D9)
+    ("YI SYLLABLE ZZA" #xA2DA)
+    ("YI SYLLABLE ZZAP" #xA2DB)
+    ("YI SYLLABLE ZZOX" #xA2DC)
+    ("YI SYLLABLE ZZO" #xA2DD)
+    ("YI SYLLABLE ZZOP" #xA2DE)
+    ("YI SYLLABLE ZZEX" #xA2DF)
+    ("YI SYLLABLE ZZE" #xA2E0)
+    ("YI SYLLABLE ZZEP" #xA2E1)
+    ("YI SYLLABLE ZZUX" #xA2E2)
+    ("YI SYLLABLE ZZU" #xA2E3)
+    ("YI SYLLABLE ZZUP" #xA2E4)
+    ("YI SYLLABLE ZZURX" #xA2E5)
+    ("YI SYLLABLE ZZUR" #xA2E6)
+    ("YI SYLLABLE ZZYT" #xA2E7)
+    ("YI SYLLABLE ZZYX" #xA2E8)
+    ("YI SYLLABLE ZZY" #xA2E9)
+    ("YI SYLLABLE ZZYP" #xA2EA)
+    ("YI SYLLABLE ZZYRX" #xA2EB)
+    ("YI SYLLABLE ZZYR" #xA2EC)
+    ("YI SYLLABLE NZIT" #xA2ED)
+    ("YI SYLLABLE NZIX" #xA2EE)
+    ("YI SYLLABLE NZI" #xA2EF)
+    ("YI SYLLABLE NZIP" #xA2F0)
+    ("YI SYLLABLE NZIEX" #xA2F1)
+    ("YI SYLLABLE NZIE" #xA2F2)
+    ("YI SYLLABLE NZIEP" #xA2F3)
+    ("YI SYLLABLE NZAT" #xA2F4)
+    ("YI SYLLABLE NZAX" #xA2F5)
+    ("YI SYLLABLE NZA" #xA2F6)
+    ("YI SYLLABLE NZAP" #xA2F7)
+    ("YI SYLLABLE NZUOX" #xA2F8)
+    ("YI SYLLABLE NZUO" #xA2F9)
+    ("YI SYLLABLE NZOX" #xA2FA)
+    ("YI SYLLABLE NZOP" #xA2FB)
+    ("YI SYLLABLE NZEX" #xA2FC)
+    ("YI SYLLABLE NZE" #xA2FD)
+    ("YI SYLLABLE NZUX" #xA2FE)
+    ("YI SYLLABLE NZU" #xA2FF)
+    ("YI SYLLABLE NZUP" #xA300)
+    ("YI SYLLABLE NZURX" #xA301)
+    ("YI SYLLABLE NZUR" #xA302)
+    ("YI SYLLABLE NZYT" #xA303)
+    ("YI SYLLABLE NZYX" #xA304)
+    ("YI SYLLABLE NZY" #xA305)
+    ("YI SYLLABLE NZYP" #xA306)
+    ("YI SYLLABLE NZYRX" #xA307)
+    ("YI SYLLABLE NZYR" #xA308)
+    ("YI SYLLABLE SIT" #xA309)
+    ("YI SYLLABLE SIX" #xA30A)
+    ("YI SYLLABLE SI" #xA30B)
+    ("YI SYLLABLE SIP" #xA30C)
+    ("YI SYLLABLE SIEX" #xA30D)
+    ("YI SYLLABLE SIE" #xA30E)
+    ("YI SYLLABLE SIEP" #xA30F)
+    ("YI SYLLABLE SAT" #xA310)
+    ("YI SYLLABLE SAX" #xA311)
+    ("YI SYLLABLE SA" #xA312)
+    ("YI SYLLABLE SAP" #xA313)
+    ("YI SYLLABLE SUOX" #xA314)
+    ("YI SYLLABLE SUO" #xA315)
+    ("YI SYLLABLE SUOP" #xA316)
+    ("YI SYLLABLE SOT" #xA317)
+    ("YI SYLLABLE SOX" #xA318)
+    ("YI SYLLABLE SO" #xA319)
+    ("YI SYLLABLE SOP" #xA31A)
+    ("YI SYLLABLE SEX" #xA31B)
+    ("YI SYLLABLE SE" #xA31C)
+    ("YI SYLLABLE SEP" #xA31D)
+    ("YI SYLLABLE SUT" #xA31E)
+    ("YI SYLLABLE SUX" #xA31F)
+    ("YI SYLLABLE SU" #xA320)
+    ("YI SYLLABLE SUP" #xA321)
+    ("YI SYLLABLE SURX" #xA322)
+    ("YI SYLLABLE SUR" #xA323)
+    ("YI SYLLABLE SYT" #xA324)
+    ("YI SYLLABLE SYX" #xA325)
+    ("YI SYLLABLE SY" #xA326)
+    ("YI SYLLABLE SYP" #xA327)
+    ("YI SYLLABLE SYRX" #xA328)
+    ("YI SYLLABLE SYR" #xA329)
+    ("YI SYLLABLE SSIT" #xA32A)
+    ("YI SYLLABLE SSIX" #xA32B)
+    ("YI SYLLABLE SSI" #xA32C)
+    ("YI SYLLABLE SSIP" #xA32D)
+    ("YI SYLLABLE SSIEX" #xA32E)
+    ("YI SYLLABLE SSIE" #xA32F)
+    ("YI SYLLABLE SSIEP" #xA330)
+    ("YI SYLLABLE SSAT" #xA331)
+    ("YI SYLLABLE SSAX" #xA332)
+    ("YI SYLLABLE SSA" #xA333)
+    ("YI SYLLABLE SSAP" #xA334)
+    ("YI SYLLABLE SSOT" #xA335)
+    ("YI SYLLABLE SSOX" #xA336)
+    ("YI SYLLABLE SSO" #xA337)
+    ("YI SYLLABLE SSOP" #xA338)
+    ("YI SYLLABLE SSEX" #xA339)
+    ("YI SYLLABLE SSE" #xA33A)
+    ("YI SYLLABLE SSEP" #xA33B)
+    ("YI SYLLABLE SSUT" #xA33C)
+    ("YI SYLLABLE SSUX" #xA33D)
+    ("YI SYLLABLE SSU" #xA33E)
+    ("YI SYLLABLE SSUP" #xA33F)
+    ("YI SYLLABLE SSYT" #xA340)
+    ("YI SYLLABLE SSYX" #xA341)
+    ("YI SYLLABLE SSY" #xA342)
+    ("YI SYLLABLE SSYP" #xA343)
+    ("YI SYLLABLE SSYRX" #xA344)
+    ("YI SYLLABLE SSYR" #xA345)
+    ("YI SYLLABLE ZHAT" #xA346)
+    ("YI SYLLABLE ZHAX" #xA347)
+    ("YI SYLLABLE ZHA" #xA348)
+    ("YI SYLLABLE ZHAP" #xA349)
+    ("YI SYLLABLE ZHUOX" #xA34A)
+    ("YI SYLLABLE ZHUO" #xA34B)
+    ("YI SYLLABLE ZHUOP" #xA34C)
+    ("YI SYLLABLE ZHOT" #xA34D)
+    ("YI SYLLABLE ZHOX" #xA34E)
+    ("YI SYLLABLE ZHO" #xA34F)
+    ("YI SYLLABLE ZHOP" #xA350)
+    ("YI SYLLABLE ZHET" #xA351)
+    ("YI SYLLABLE ZHEX" #xA352)
+    ("YI SYLLABLE ZHE" #xA353)
+    ("YI SYLLABLE ZHEP" #xA354)
+    ("YI SYLLABLE ZHUT" #xA355)
+    ("YI SYLLABLE ZHUX" #xA356)
+    ("YI SYLLABLE ZHU" #xA357)
+    ("YI SYLLABLE ZHUP" #xA358)
+    ("YI SYLLABLE ZHURX" #xA359)
+    ("YI SYLLABLE ZHUR" #xA35A)
+    ("YI SYLLABLE ZHYT" #xA35B)
+    ("YI SYLLABLE ZHYX" #xA35C)
+    ("YI SYLLABLE ZHY" #xA35D)
+    ("YI SYLLABLE ZHYP" #xA35E)
+    ("YI SYLLABLE ZHYRX" #xA35F)
+    ("YI SYLLABLE ZHYR" #xA360)
+    ("YI SYLLABLE CHAT" #xA361)
+    ("YI SYLLABLE CHAX" #xA362)
+    ("YI SYLLABLE CHA" #xA363)
+    ("YI SYLLABLE CHAP" #xA364)
+    ("YI SYLLABLE CHUOT" #xA365)
+    ("YI SYLLABLE CHUOX" #xA366)
+    ("YI SYLLABLE CHUO" #xA367)
+    ("YI SYLLABLE CHUOP" #xA368)
+    ("YI SYLLABLE CHOT" #xA369)
+    ("YI SYLLABLE CHOX" #xA36A)
+    ("YI SYLLABLE CHO" #xA36B)
+    ("YI SYLLABLE CHOP" #xA36C)
+    ("YI SYLLABLE CHET" #xA36D)
+    ("YI SYLLABLE CHEX" #xA36E)
+    ("YI SYLLABLE CHE" #xA36F)
+    ("YI SYLLABLE CHEP" #xA370)
+    ("YI SYLLABLE CHUX" #xA371)
+    ("YI SYLLABLE CHU" #xA372)
+    ("YI SYLLABLE CHUP" #xA373)
+    ("YI SYLLABLE CHURX" #xA374)
+    ("YI SYLLABLE CHUR" #xA375)
+    ("YI SYLLABLE CHYT" #xA376)
+    ("YI SYLLABLE CHYX" #xA377)
+    ("YI SYLLABLE CHY" #xA378)
+    ("YI SYLLABLE CHYP" #xA379)
+    ("YI SYLLABLE CHYRX" #xA37A)
+    ("YI SYLLABLE CHYR" #xA37B)
+    ("YI SYLLABLE RRAX" #xA37C)
+    ("YI SYLLABLE RRA" #xA37D)
+    ("YI SYLLABLE RRUOX" #xA37E)
+    ("YI SYLLABLE RRUO" #xA37F)
+    ("YI SYLLABLE RROT" #xA380)
+    ("YI SYLLABLE RROX" #xA381)
+    ("YI SYLLABLE RRO" #xA382)
+    ("YI SYLLABLE RROP" #xA383)
+    ("YI SYLLABLE RRET" #xA384)
+    ("YI SYLLABLE RREX" #xA385)
+    ("YI SYLLABLE RRE" #xA386)
+    ("YI SYLLABLE RREP" #xA387)
+    ("YI SYLLABLE RRUT" #xA388)
+    ("YI SYLLABLE RRUX" #xA389)
+    ("YI SYLLABLE RRU" #xA38A)
+    ("YI SYLLABLE RRUP" #xA38B)
+    ("YI SYLLABLE RRURX" #xA38C)
+    ("YI SYLLABLE RRUR" #xA38D)
+    ("YI SYLLABLE RRYT" #xA38E)
+    ("YI SYLLABLE RRYX" #xA38F)
+    ("YI SYLLABLE RRY" #xA390)
+    ("YI SYLLABLE RRYP" #xA391)
+    ("YI SYLLABLE RRYRX" #xA392)
+    ("YI SYLLABLE RRYR" #xA393)
+    ("YI SYLLABLE NRAT" #xA394)
+    ("YI SYLLABLE NRAX" #xA395)
+    ("YI SYLLABLE NRA" #xA396)
+    ("YI SYLLABLE NRAP" #xA397)
+    ("YI SYLLABLE NROX" #xA398)
+    ("YI SYLLABLE NRO" #xA399)
+    ("YI SYLLABLE NROP" #xA39A)
+    ("YI SYLLABLE NRET" #xA39B)
+    ("YI SYLLABLE NREX" #xA39C)
+    ("YI SYLLABLE NRE" #xA39D)
+    ("YI SYLLABLE NREP" #xA39E)
+    ("YI SYLLABLE NRUT" #xA39F)
+    ("YI SYLLABLE NRUX" #xA3A0)
+    ("YI SYLLABLE NRU" #xA3A1)
+    ("YI SYLLABLE NRUP" #xA3A2)
+    ("YI SYLLABLE NRURX" #xA3A3)
+    ("YI SYLLABLE NRUR" #xA3A4)
+    ("YI SYLLABLE NRYT" #xA3A5)
+    ("YI SYLLABLE NRYX" #xA3A6)
+    ("YI SYLLABLE NRY" #xA3A7)
+    ("YI SYLLABLE NRYP" #xA3A8)
+    ("YI SYLLABLE NRYRX" #xA3A9)
+    ("YI SYLLABLE NRYR" #xA3AA)
+    ("YI SYLLABLE SHAT" #xA3AB)
+    ("YI SYLLABLE SHAX" #xA3AC)
+    ("YI SYLLABLE SHA" #xA3AD)
+    ("YI SYLLABLE SHAP" #xA3AE)
+    ("YI SYLLABLE SHUOX" #xA3AF)
+    ("YI SYLLABLE SHUO" #xA3B0)
+    ("YI SYLLABLE SHUOP" #xA3B1)
+    ("YI SYLLABLE SHOT" #xA3B2)
+    ("YI SYLLABLE SHOX" #xA3B3)
+    ("YI SYLLABLE SHO" #xA3B4)
+    ("YI SYLLABLE SHOP" #xA3B5)
+    ("YI SYLLABLE SHET" #xA3B6)
+    ("YI SYLLABLE SHEX" #xA3B7)
+    ("YI SYLLABLE SHE" #xA3B8)
+    ("YI SYLLABLE SHEP" #xA3B9)
+    ("YI SYLLABLE SHUT" #xA3BA)
+    ("YI SYLLABLE SHUX" #xA3BB)
+    ("YI SYLLABLE SHU" #xA3BC)
+    ("YI SYLLABLE SHUP" #xA3BD)
+    ("YI SYLLABLE SHURX" #xA3BE)
+    ("YI SYLLABLE SHUR" #xA3BF)
+    ("YI SYLLABLE SHYT" #xA3C0)
+    ("YI SYLLABLE SHYX" #xA3C1)
+    ("YI SYLLABLE SHY" #xA3C2)
+    ("YI SYLLABLE SHYP" #xA3C3)
+    ("YI SYLLABLE SHYRX" #xA3C4)
+    ("YI SYLLABLE SHYR" #xA3C5)
+    ("YI SYLLABLE RAT" #xA3C6)
+    ("YI SYLLABLE RAX" #xA3C7)
+    ("YI SYLLABLE RA" #xA3C8)
+    ("YI SYLLABLE RAP" #xA3C9)
+    ("YI SYLLABLE RUOX" #xA3CA)
+    ("YI SYLLABLE RUO" #xA3CB)
+    ("YI SYLLABLE RUOP" #xA3CC)
+    ("YI SYLLABLE ROT" #xA3CD)
+    ("YI SYLLABLE ROX" #xA3CE)
+    ("YI SYLLABLE RO" #xA3CF)
+    ("YI SYLLABLE ROP" #xA3D0)
+    ("YI SYLLABLE REX" #xA3D1)
+    ("YI SYLLABLE RE" #xA3D2)
+    ("YI SYLLABLE REP" #xA3D3)
+    ("YI SYLLABLE RUT" #xA3D4)
+    ("YI SYLLABLE RUX" #xA3D5)
+    ("YI SYLLABLE RU" #xA3D6)
+    ("YI SYLLABLE RUP" #xA3D7)
+    ("YI SYLLABLE RURX" #xA3D8)
+    ("YI SYLLABLE RUR" #xA3D9)
+    ("YI SYLLABLE RYT" #xA3DA)
+    ("YI SYLLABLE RYX" #xA3DB)
+    ("YI SYLLABLE RY" #xA3DC)
+    ("YI SYLLABLE RYP" #xA3DD)
+    ("YI SYLLABLE RYRX" #xA3DE)
+    ("YI SYLLABLE RYR" #xA3DF)
+    ("YI SYLLABLE JIT" #xA3E0)
+    ("YI SYLLABLE JIX" #xA3E1)
+    ("YI SYLLABLE JI" #xA3E2)
+    ("YI SYLLABLE JIP" #xA3E3)
+    ("YI SYLLABLE JIET" #xA3E4)
+    ("YI SYLLABLE JIEX" #xA3E5)
+    ("YI SYLLABLE JIE" #xA3E6)
+    ("YI SYLLABLE JIEP" #xA3E7)
+    ("YI SYLLABLE JUOT" #xA3E8)
+    ("YI SYLLABLE JUOX" #xA3E9)
+    ("YI SYLLABLE JUO" #xA3EA)
+    ("YI SYLLABLE JUOP" #xA3EB)
+    ("YI SYLLABLE JOT" #xA3EC)
+    ("YI SYLLABLE JOX" #xA3ED)
+    ("YI SYLLABLE JO" #xA3EE)
+    ("YI SYLLABLE JOP" #xA3EF)
+    ("YI SYLLABLE JUT" #xA3F0)
+    ("YI SYLLABLE JUX" #xA3F1)
+    ("YI SYLLABLE JU" #xA3F2)
+    ("YI SYLLABLE JUP" #xA3F3)
+    ("YI SYLLABLE JURX" #xA3F4)
+    ("YI SYLLABLE JUR" #xA3F5)
+    ("YI SYLLABLE JYT" #xA3F6)
+    ("YI SYLLABLE JYX" #xA3F7)
+    ("YI SYLLABLE JY" #xA3F8)
+    ("YI SYLLABLE JYP" #xA3F9)
+    ("YI SYLLABLE JYRX" #xA3FA)
+    ("YI SYLLABLE JYR" #xA3FB)
+    ("YI SYLLABLE QIT" #xA3FC)
+    ("YI SYLLABLE QIX" #xA3FD)
+    ("YI SYLLABLE QI" #xA3FE)
+    ("YI SYLLABLE QIP" #xA3FF)
+    ("YI SYLLABLE QIET" #xA400)
+    ("YI SYLLABLE QIEX" #xA401)
+    ("YI SYLLABLE QIE" #xA402)
+    ("YI SYLLABLE QIEP" #xA403)
+    ("YI SYLLABLE QUOT" #xA404)
+    ("YI SYLLABLE QUOX" #xA405)
+    ("YI SYLLABLE QUO" #xA406)
+    ("YI SYLLABLE QUOP" #xA407)
+    ("YI SYLLABLE QOT" #xA408)
+    ("YI SYLLABLE QOX" #xA409)
+    ("YI SYLLABLE QO" #xA40A)
+    ("YI SYLLABLE QOP" #xA40B)
+    ("YI SYLLABLE QUT" #xA40C)
+    ("YI SYLLABLE QUX" #xA40D)
+    ("YI SYLLABLE QU" #xA40E)
+    ("YI SYLLABLE QUP" #xA40F)
+    ("YI SYLLABLE QURX" #xA410)
+    ("YI SYLLABLE QUR" #xA411)
+    ("YI SYLLABLE QYT" #xA412)
+    ("YI SYLLABLE QYX" #xA413)
+    ("YI SYLLABLE QY" #xA414)
+    ("YI SYLLABLE QYP" #xA415)
+    ("YI SYLLABLE QYRX" #xA416)
+    ("YI SYLLABLE QYR" #xA417)
+    ("YI SYLLABLE JJIT" #xA418)
+    ("YI SYLLABLE JJIX" #xA419)
+    ("YI SYLLABLE JJI" #xA41A)
+    ("YI SYLLABLE JJIP" #xA41B)
+    ("YI SYLLABLE JJIET" #xA41C)
+    ("YI SYLLABLE JJIEX" #xA41D)
+    ("YI SYLLABLE JJIE" #xA41E)
+    ("YI SYLLABLE JJIEP" #xA41F)
+    ("YI SYLLABLE JJUOX" #xA420)
+    ("YI SYLLABLE JJUO" #xA421)
+    ("YI SYLLABLE JJUOP" #xA422)
+    ("YI SYLLABLE JJOT" #xA423)
+    ("YI SYLLABLE JJOX" #xA424)
+    ("YI SYLLABLE JJO" #xA425)
+    ("YI SYLLABLE JJOP" #xA426)
+    ("YI SYLLABLE JJUT" #xA427)
+    ("YI SYLLABLE JJUX" #xA428)
+    ("YI SYLLABLE JJU" #xA429)
+    ("YI SYLLABLE JJUP" #xA42A)
+    ("YI SYLLABLE JJURX" #xA42B)
+    ("YI SYLLABLE JJUR" #xA42C)
+    ("YI SYLLABLE JJYT" #xA42D)
+    ("YI SYLLABLE JJYX" #xA42E)
+    ("YI SYLLABLE JJY" #xA42F)
+    ("YI SYLLABLE JJYP" #xA430)
+    ("YI SYLLABLE NJIT" #xA431)
+    ("YI SYLLABLE NJIX" #xA432)
+    ("YI SYLLABLE NJI" #xA433)
+    ("YI SYLLABLE NJIP" #xA434)
+    ("YI SYLLABLE NJIET" #xA435)
+    ("YI SYLLABLE NJIEX" #xA436)
+    ("YI SYLLABLE NJIE" #xA437)
+    ("YI SYLLABLE NJIEP" #xA438)
+    ("YI SYLLABLE NJUOX" #xA439)
+    ("YI SYLLABLE NJUO" #xA43A)
+    ("YI SYLLABLE NJOT" #xA43B)
+    ("YI SYLLABLE NJOX" #xA43C)
+    ("YI SYLLABLE NJO" #xA43D)
+    ("YI SYLLABLE NJOP" #xA43E)
+    ("YI SYLLABLE NJUX" #xA43F)
+    ("YI SYLLABLE NJU" #xA440)
+    ("YI SYLLABLE NJUP" #xA441)
+    ("YI SYLLABLE NJURX" #xA442)
+    ("YI SYLLABLE NJUR" #xA443)
+    ("YI SYLLABLE NJYT" #xA444)
+    ("YI SYLLABLE NJYX" #xA445)
+    ("YI SYLLABLE NJY" #xA446)
+    ("YI SYLLABLE NJYP" #xA447)
+    ("YI SYLLABLE NJYRX" #xA448)
+    ("YI SYLLABLE NJYR" #xA449)
+    ("YI SYLLABLE NYIT" #xA44A)
+    ("YI SYLLABLE NYIX" #xA44B)
+    ("YI SYLLABLE NYI" #xA44C)
+    ("YI SYLLABLE NYIP" #xA44D)
+    ("YI SYLLABLE NYIET" #xA44E)
+    ("YI SYLLABLE NYIEX" #xA44F)
+    ("YI SYLLABLE NYIE" #xA450)
+    ("YI SYLLABLE NYIEP" #xA451)
+    ("YI SYLLABLE NYUOX" #xA452)
+    ("YI SYLLABLE NYUO" #xA453)
+    ("YI SYLLABLE NYUOP" #xA454)
+    ("YI SYLLABLE NYOT" #xA455)
+    ("YI SYLLABLE NYOX" #xA456)
+    ("YI SYLLABLE NYO" #xA457)
+    ("YI SYLLABLE NYOP" #xA458)
+    ("YI SYLLABLE NYUT" #xA459)
+    ("YI SYLLABLE NYUX" #xA45A)
+    ("YI SYLLABLE NYU" #xA45B)
+    ("YI SYLLABLE NYUP" #xA45C)
+    ("YI SYLLABLE XIT" #xA45D)
+    ("YI SYLLABLE XIX" #xA45E)
+    ("YI SYLLABLE XI" #xA45F)
+    ("YI SYLLABLE XIP" #xA460)
+    ("YI SYLLABLE XIET" #xA461)
+    ("YI SYLLABLE XIEX" #xA462)
+    ("YI SYLLABLE XIE" #xA463)
+    ("YI SYLLABLE XIEP" #xA464)
+    ("YI SYLLABLE XUOX" #xA465)
+    ("YI SYLLABLE XUO" #xA466)
+    ("YI SYLLABLE XOT" #xA467)
+    ("YI SYLLABLE XOX" #xA468)
+    ("YI SYLLABLE XO" #xA469)
+    ("YI SYLLABLE XOP" #xA46A)
+    ("YI SYLLABLE XYT" #xA46B)
+    ("YI SYLLABLE XYX" #xA46C)
+    ("YI SYLLABLE XY" #xA46D)
+    ("YI SYLLABLE XYP" #xA46E)
+    ("YI SYLLABLE XYRX" #xA46F)
+    ("YI SYLLABLE XYR" #xA470)
+    ("YI SYLLABLE YIT" #xA471)
+    ("YI SYLLABLE YIX" #xA472)
+    ("YI SYLLABLE YI" #xA473)
+    ("YI SYLLABLE YIP" #xA474)
+    ("YI SYLLABLE YIET" #xA475)
+    ("YI SYLLABLE YIEX" #xA476)
+    ("YI SYLLABLE YIE" #xA477)
+    ("YI SYLLABLE YIEP" #xA478)
+    ("YI SYLLABLE YUOT" #xA479)
+    ("YI SYLLABLE YUOX" #xA47A)
+    ("YI SYLLABLE YUO" #xA47B)
+    ("YI SYLLABLE YUOP" #xA47C)
+    ("YI SYLLABLE YOT" #xA47D)
+    ("YI SYLLABLE YOX" #xA47E)
+    ("YI SYLLABLE YO" #xA47F)
+    ("YI SYLLABLE YOP" #xA480)
+    ("YI SYLLABLE YUT" #xA481)
+    ("YI SYLLABLE YUX" #xA482)
+    ("YI SYLLABLE YU" #xA483)
+    ("YI SYLLABLE YUP" #xA484)
+    ("YI SYLLABLE YURX" #xA485)
+    ("YI SYLLABLE YUR" #xA486)
+    ("YI SYLLABLE YYT" #xA487)
+    ("YI SYLLABLE YYX" #xA488)
+    ("YI SYLLABLE YY" #xA489)
+    ("YI SYLLABLE YYP" #xA48A)
+    ("YI SYLLABLE YYRX" #xA48B)
+    ("YI SYLLABLE YYR" #xA48C)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0A490-0A4CF.el b/lisp/nxml/char-name/unicode/0A490-0A4CF.el
new file mode 100644 (file)
index 0000000..16c8656
--- /dev/null
@@ -0,0 +1,57 @@
+(nxml-define-char-name-set 'yi-radicals
+  '(("YI RADICAL QOT" #xA490)
+    ("YI RADICAL LI" #xA491)
+    ("YI RADICAL KIT" #xA492)
+    ("YI RADICAL NYIP" #xA493)
+    ("YI RADICAL CYP" #xA494)
+    ("YI RADICAL SSI" #xA495)
+    ("YI RADICAL GGOP" #xA496)
+    ("YI RADICAL GEP" #xA497)
+    ("YI RADICAL MI" #xA498)
+    ("YI RADICAL HXIT" #xA499)
+    ("YI RADICAL LYR" #xA49A)
+    ("YI RADICAL BBUT" #xA49B)
+    ("YI RADICAL MOP" #xA49C)
+    ("YI RADICAL YO" #xA49D)
+    ("YI RADICAL PUT" #xA49E)
+    ("YI RADICAL HXUO" #xA49F)
+    ("YI RADICAL TAT" #xA4A0)
+    ("YI RADICAL GA" #xA4A1)
+    ("YI RADICAL ZUP" #xA4A2)
+    ("YI RADICAL CYT" #xA4A3)
+    ("YI RADICAL DDUR" #xA4A4)
+    ("YI RADICAL BUR" #xA4A5)
+    ("YI RADICAL GGUO" #xA4A6)
+    ("YI RADICAL NYOP" #xA4A7)
+    ("YI RADICAL TU" #xA4A8)
+    ("YI RADICAL OP" #xA4A9)
+    ("YI RADICAL JJUT" #xA4AA)
+    ("YI RADICAL ZOT" #xA4AB)
+    ("YI RADICAL PYT" #xA4AC)
+    ("YI RADICAL HMO" #xA4AD)
+    ("YI RADICAL YIT" #xA4AE)
+    ("YI RADICAL VUR" #xA4AF)
+    ("YI RADICAL SHY" #xA4B0)
+    ("YI RADICAL VEP" #xA4B1)
+    ("YI RADICAL ZA" #xA4B2)
+    ("YI RADICAL JO" #xA4B3)
+    ("YI RADICAL NZUP" #xA4B4)
+    ("YI RADICAL JJY" #xA4B5)
+    ("YI RADICAL GOT" #xA4B6)
+    ("YI RADICAL JJIE" #xA4B7)
+    ("YI RADICAL WO" #xA4B8)
+    ("YI RADICAL DU" #xA4B9)
+    ("YI RADICAL SHUR" #xA4BA)
+    ("YI RADICAL LIE" #xA4BB)
+    ("YI RADICAL CY" #xA4BC)
+    ("YI RADICAL CUOP" #xA4BD)
+    ("YI RADICAL CIP" #xA4BE)
+    ("YI RADICAL HXOP" #xA4BF)
+    ("YI RADICAL SHAT" #xA4C0)
+    ("YI RADICAL ZUR" #xA4C1)
+    ("YI RADICAL SHOP" #xA4C2)
+    ("YI RADICAL CHE" #xA4C3)
+    ("YI RADICAL ZZIET" #xA4C4)
+    ("YI RADICAL NBIE" #xA4C5)
+    ("YI RADICAL KE" #xA4C6)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FB00-0FB4F.el b/lisp/nxml/char-name/unicode/0FB00-0FB4F.el
new file mode 100644 (file)
index 0000000..36818c1
--- /dev/null
@@ -0,0 +1,60 @@
+(nxml-define-char-name-set 'alphabetic-presentation-forms
+  '(("LATIN SMALL LIGATURE FF" #xFB00)
+    ("LATIN SMALL LIGATURE FI" #xFB01)
+    ("LATIN SMALL LIGATURE FL" #xFB02)
+    ("LATIN SMALL LIGATURE FFI" #xFB03)
+    ("LATIN SMALL LIGATURE FFL" #xFB04)
+    ("LATIN SMALL LIGATURE LONG S T" #xFB05)
+    ("LATIN SMALL LIGATURE ST" #xFB06)
+    ("ARMENIAN SMALL LIGATURE MEN NOW" #xFB13)
+    ("ARMENIAN SMALL LIGATURE MEN ECH" #xFB14)
+    ("ARMENIAN SMALL LIGATURE MEN INI" #xFB15)
+    ("ARMENIAN SMALL LIGATURE VEW NOW" #xFB16)
+    ("ARMENIAN SMALL LIGATURE MEN XEH" #xFB17)
+    ("HEBREW LETTER YOD WITH HIRIQ" #xFB1D)
+    ("HEBREW POINT JUDEO-SPANISH VARIKA" #xFB1E)
+    ("HEBREW LIGATURE YIDDISH YOD YOD PATAH" #xFB1F)
+    ("HEBREW LETTER ALTERNATIVE AYIN" #xFB20)
+    ("HEBREW LETTER WIDE ALEF" #xFB21)
+    ("HEBREW LETTER WIDE DALET" #xFB22)
+    ("HEBREW LETTER WIDE HE" #xFB23)
+    ("HEBREW LETTER WIDE KAF" #xFB24)
+    ("HEBREW LETTER WIDE LAMED" #xFB25)
+    ("HEBREW LETTER WIDE FINAL MEM" #xFB26)
+    ("HEBREW LETTER WIDE RESH" #xFB27)
+    ("HEBREW LETTER WIDE TAV" #xFB28)
+    ("HEBREW LETTER ALTERNATIVE PLUS SIGN" #xFB29)
+    ("HEBREW LETTER SHIN WITH SHIN DOT" #xFB2A)
+    ("HEBREW LETTER SHIN WITH SIN DOT" #xFB2B)
+    ("HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT" #xFB2C)
+    ("HEBREW LETTER SHIN WITH DAGESH AND SIN DOT" #xFB2D)
+    ("HEBREW LETTER ALEF WITH PATAH" #xFB2E)
+    ("HEBREW LETTER ALEF WITH QAMATS" #xFB2F)
+    ("HEBREW LETTER ALEF WITH MAPIQ" #xFB30)
+    ("HEBREW LETTER BET WITH DAGESH" #xFB31)
+    ("HEBREW LETTER GIMEL WITH DAGESH" #xFB32)
+    ("HEBREW LETTER DALET WITH DAGESH" #xFB33)
+    ("HEBREW LETTER HE WITH MAPIQ" #xFB34)
+    ("HEBREW LETTER VAV WITH DAGESH" #xFB35)
+    ("HEBREW LETTER ZAYIN WITH DAGESH" #xFB36)
+    ("HEBREW LETTER TET WITH DAGESH" #xFB38)
+    ("HEBREW LETTER YOD WITH DAGESH" #xFB39)
+    ("HEBREW LETTER FINAL KAF WITH DAGESH" #xFB3A)
+    ("HEBREW LETTER KAF WITH DAGESH" #xFB3B)
+    ("HEBREW LETTER LAMED WITH DAGESH" #xFB3C)
+    ("HEBREW LETTER MEM WITH DAGESH" #xFB3E)
+    ("HEBREW LETTER NUN WITH DAGESH" #xFB40)
+    ("HEBREW LETTER SAMEKH WITH DAGESH" #xFB41)
+    ("HEBREW LETTER FINAL PE WITH DAGESH" #xFB43)
+    ("HEBREW LETTER PE WITH DAGESH" #xFB44)
+    ("HEBREW LETTER TSADI WITH DAGESH" #xFB46)
+    ("HEBREW LETTER QOF WITH DAGESH" #xFB47)
+    ("HEBREW LETTER RESH WITH DAGESH" #xFB48)
+    ("HEBREW LETTER SHIN WITH DAGESH" #xFB49)
+    ("HEBREW LETTER TAV WITH DAGESH" #xFB4A)
+    ("HEBREW LETTER VAV WITH HOLAM" #xFB4B)
+    ("HEBREW LETTER BET WITH RAFE" #xFB4C)
+    ("HEBREW LETTER KAF WITH RAFE" #xFB4D)
+    ("HEBREW LETTER PE WITH RAFE" #xFB4E)
+    ("HEBREW LIGATURE ALEF LAMED" #xFB4F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FB50-0FDFF.el b/lisp/nxml/char-name/unicode/0FB50-0FDFF.el
new file mode 100644 (file)
index 0000000..a39ae47
--- /dev/null
@@ -0,0 +1,596 @@
+(nxml-define-char-name-set 'arabic-presentation-forms-a
+  '(("ARABIC LETTER ALEF WASLA ISOLATED FORM" #xFB50)
+    ("ARABIC LETTER ALEF WASLA FINAL FORM" #xFB51)
+    ("ARABIC LETTER BEEH ISOLATED FORM" #xFB52)
+    ("ARABIC LETTER BEEH FINAL FORM" #xFB53)
+    ("ARABIC LETTER BEEH INITIAL FORM" #xFB54)
+    ("ARABIC LETTER BEEH MEDIAL FORM" #xFB55)
+    ("ARABIC LETTER PEH ISOLATED FORM" #xFB56)
+    ("ARABIC LETTER PEH FINAL FORM" #xFB57)
+    ("ARABIC LETTER PEH INITIAL FORM" #xFB58)
+    ("ARABIC LETTER PEH MEDIAL FORM" #xFB59)
+    ("ARABIC LETTER BEHEH ISOLATED FORM" #xFB5A)
+    ("ARABIC LETTER BEHEH FINAL FORM" #xFB5B)
+    ("ARABIC LETTER BEHEH INITIAL FORM" #xFB5C)
+    ("ARABIC LETTER BEHEH MEDIAL FORM" #xFB5D)
+    ("ARABIC LETTER TTEHEH ISOLATED FORM" #xFB5E)
+    ("ARABIC LETTER TTEHEH FINAL FORM" #xFB5F)
+    ("ARABIC LETTER TTEHEH INITIAL FORM" #xFB60)
+    ("ARABIC LETTER TTEHEH MEDIAL FORM" #xFB61)
+    ("ARABIC LETTER TEHEH ISOLATED FORM" #xFB62)
+    ("ARABIC LETTER TEHEH FINAL FORM" #xFB63)
+    ("ARABIC LETTER TEHEH INITIAL FORM" #xFB64)
+    ("ARABIC LETTER TEHEH MEDIAL FORM" #xFB65)
+    ("ARABIC LETTER TTEH ISOLATED FORM" #xFB66)
+    ("ARABIC LETTER TTEH FINAL FORM" #xFB67)
+    ("ARABIC LETTER TTEH INITIAL FORM" #xFB68)
+    ("ARABIC LETTER TTEH MEDIAL FORM" #xFB69)
+    ("ARABIC LETTER VEH ISOLATED FORM" #xFB6A)
+    ("ARABIC LETTER VEH FINAL FORM" #xFB6B)
+    ("ARABIC LETTER VEH INITIAL FORM" #xFB6C)
+    ("ARABIC LETTER VEH MEDIAL FORM" #xFB6D)
+    ("ARABIC LETTER PEHEH ISOLATED FORM" #xFB6E)
+    ("ARABIC LETTER PEHEH FINAL FORM" #xFB6F)
+    ("ARABIC LETTER PEHEH INITIAL FORM" #xFB70)
+    ("ARABIC LETTER PEHEH MEDIAL FORM" #xFB71)
+    ("ARABIC LETTER DYEH ISOLATED FORM" #xFB72)
+    ("ARABIC LETTER DYEH FINAL FORM" #xFB73)
+    ("ARABIC LETTER DYEH INITIAL FORM" #xFB74)
+    ("ARABIC LETTER DYEH MEDIAL FORM" #xFB75)
+    ("ARABIC LETTER NYEH ISOLATED FORM" #xFB76)
+    ("ARABIC LETTER NYEH FINAL FORM" #xFB77)
+    ("ARABIC LETTER NYEH INITIAL FORM" #xFB78)
+    ("ARABIC LETTER NYEH MEDIAL FORM" #xFB79)
+    ("ARABIC LETTER TCHEH ISOLATED FORM" #xFB7A)
+    ("ARABIC LETTER TCHEH FINAL FORM" #xFB7B)
+    ("ARABIC LETTER TCHEH INITIAL FORM" #xFB7C)
+    ("ARABIC LETTER TCHEH MEDIAL FORM" #xFB7D)
+    ("ARABIC LETTER TCHEHEH ISOLATED FORM" #xFB7E)
+    ("ARABIC LETTER TCHEHEH FINAL FORM" #xFB7F)
+    ("ARABIC LETTER TCHEHEH INITIAL FORM" #xFB80)
+    ("ARABIC LETTER TCHEHEH MEDIAL FORM" #xFB81)
+    ("ARABIC LETTER DDAHAL ISOLATED FORM" #xFB82)
+    ("ARABIC LETTER DDAHAL FINAL FORM" #xFB83)
+    ("ARABIC LETTER DAHAL ISOLATED FORM" #xFB84)
+    ("ARABIC LETTER DAHAL FINAL FORM" #xFB85)
+    ("ARABIC LETTER DUL ISOLATED FORM" #xFB86)
+    ("ARABIC LETTER DUL FINAL FORM" #xFB87)
+    ("ARABIC LETTER DDAL ISOLATED FORM" #xFB88)
+    ("ARABIC LETTER DDAL FINAL FORM" #xFB89)
+    ("ARABIC LETTER JEH ISOLATED FORM" #xFB8A)
+    ("ARABIC LETTER JEH FINAL FORM" #xFB8B)
+    ("ARABIC LETTER RREH ISOLATED FORM" #xFB8C)
+    ("ARABIC LETTER RREH FINAL FORM" #xFB8D)
+    ("ARABIC LETTER KEHEH ISOLATED FORM" #xFB8E)
+    ("ARABIC LETTER KEHEH FINAL FORM" #xFB8F)
+    ("ARABIC LETTER KEHEH INITIAL FORM" #xFB90)
+    ("ARABIC LETTER KEHEH MEDIAL FORM" #xFB91)
+    ("ARABIC LETTER GAF ISOLATED FORM" #xFB92)
+    ("ARABIC LETTER GAF FINAL FORM" #xFB93)
+    ("ARABIC LETTER GAF INITIAL FORM" #xFB94)
+    ("ARABIC LETTER GAF MEDIAL FORM" #xFB95)
+    ("ARABIC LETTER GUEH ISOLATED FORM" #xFB96)
+    ("ARABIC LETTER GUEH FINAL FORM" #xFB97)
+    ("ARABIC LETTER GUEH INITIAL FORM" #xFB98)
+    ("ARABIC LETTER GUEH MEDIAL FORM" #xFB99)
+    ("ARABIC LETTER NGOEH ISOLATED FORM" #xFB9A)
+    ("ARABIC LETTER NGOEH FINAL FORM" #xFB9B)
+    ("ARABIC LETTER NGOEH INITIAL FORM" #xFB9C)
+    ("ARABIC LETTER NGOEH MEDIAL FORM" #xFB9D)
+    ("ARABIC LETTER NOON GHUNNA ISOLATED FORM" #xFB9E)
+    ("ARABIC LETTER NOON GHUNNA FINAL FORM" #xFB9F)
+    ("ARABIC LETTER RNOON ISOLATED FORM" #xFBA0)
+    ("ARABIC LETTER RNOON FINAL FORM" #xFBA1)
+    ("ARABIC LETTER RNOON INITIAL FORM" #xFBA2)
+    ("ARABIC LETTER RNOON MEDIAL FORM" #xFBA3)
+    ("ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM" #xFBA4)
+    ("ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM" #xFBA5)
+    ("ARABIC LETTER HEH GOAL ISOLATED FORM" #xFBA6)
+    ("ARABIC LETTER HEH GOAL FINAL FORM" #xFBA7)
+    ("ARABIC LETTER HEH GOAL INITIAL FORM" #xFBA8)
+    ("ARABIC LETTER HEH GOAL MEDIAL FORM" #xFBA9)
+    ("ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM" #xFBAA)
+    ("ARABIC LETTER HEH DOACHASHMEE FINAL FORM" #xFBAB)
+    ("ARABIC LETTER HEH DOACHASHMEE INITIAL FORM" #xFBAC)
+    ("ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM" #xFBAD)
+    ("ARABIC LETTER YEH BARREE ISOLATED FORM" #xFBAE)
+    ("ARABIC LETTER YEH BARREE FINAL FORM" #xFBAF)
+    ("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM" #xFBB0)
+    ("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM" #xFBB1)
+    ("ARABIC LETTER NG ISOLATED FORM" #xFBD3)
+    ("ARABIC LETTER NG FINAL FORM" #xFBD4)
+    ("ARABIC LETTER NG INITIAL FORM" #xFBD5)
+    ("ARABIC LETTER NG MEDIAL FORM" #xFBD6)
+    ("ARABIC LETTER U ISOLATED FORM" #xFBD7)
+    ("ARABIC LETTER U FINAL FORM" #xFBD8)
+    ("ARABIC LETTER OE ISOLATED FORM" #xFBD9)
+    ("ARABIC LETTER OE FINAL FORM" #xFBDA)
+    ("ARABIC LETTER YU ISOLATED FORM" #xFBDB)
+    ("ARABIC LETTER YU FINAL FORM" #xFBDC)
+    ("ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM" #xFBDD)
+    ("ARABIC LETTER VE ISOLATED FORM" #xFBDE)
+    ("ARABIC LETTER VE FINAL FORM" #xFBDF)
+    ("ARABIC LETTER KIRGHIZ OE ISOLATED FORM" #xFBE0)
+    ("ARABIC LETTER KIRGHIZ OE FINAL FORM" #xFBE1)
+    ("ARABIC LETTER KIRGHIZ YU ISOLATED FORM" #xFBE2)
+    ("ARABIC LETTER KIRGHIZ YU FINAL FORM" #xFBE3)
+    ("ARABIC LETTER E ISOLATED FORM" #xFBE4)
+    ("ARABIC LETTER E FINAL FORM" #xFBE5)
+    ("ARABIC LETTER E INITIAL FORM" #xFBE6)
+    ("ARABIC LETTER E MEDIAL FORM" #xFBE7)
+    ("ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM" #xFBE8)
+    ("ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM" #xFBE9)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM" #xFBEA)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM" #xFBEB)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM" #xFBEC)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM" #xFBED)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM" #xFBEE)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM" #xFBEF)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM" #xFBF0)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM" #xFBF1)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM" #xFBF2)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM" #xFBF3)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM" #xFBF4)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM" #xFBF5)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM" #xFBF6)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM" #xFBF7)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM" #xFBF8)
+    ("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM" #xFBF9)
+    ("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM" #xFBFA)
+    ("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM" #xFBFB)
+    ("ARABIC LETTER FARSI YEH ISOLATED FORM" #xFBFC)
+    ("ARABIC LETTER FARSI YEH FINAL FORM" #xFBFD)
+    ("ARABIC LETTER FARSI YEH INITIAL FORM" #xFBFE)
+    ("ARABIC LETTER FARSI YEH MEDIAL FORM" #xFBFF)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM" #xFC00)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM" #xFC01)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM" #xFC02)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM" #xFC03)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM" #xFC04)
+    ("ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM" #xFC05)
+    ("ARABIC LIGATURE BEH WITH HAH ISOLATED FORM" #xFC06)
+    ("ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM" #xFC07)
+    ("ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM" #xFC08)
+    ("ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM" #xFC09)
+    ("ARABIC LIGATURE BEH WITH YEH ISOLATED FORM" #xFC0A)
+    ("ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM" #xFC0B)
+    ("ARABIC LIGATURE TEH WITH HAH ISOLATED FORM" #xFC0C)
+    ("ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM" #xFC0D)
+    ("ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM" #xFC0E)
+    ("ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM" #xFC0F)
+    ("ARABIC LIGATURE TEH WITH YEH ISOLATED FORM" #xFC10)
+    ("ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM" #xFC11)
+    ("ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM" #xFC12)
+    ("ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM" #xFC13)
+    ("ARABIC LIGATURE THEH WITH YEH ISOLATED FORM" #xFC14)
+    ("ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM" #xFC15)
+    ("ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM" #xFC16)
+    ("ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM" #xFC17)
+    ("ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM" #xFC18)
+    ("ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM" #xFC19)
+    ("ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM" #xFC1A)
+    ("ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM" #xFC1B)
+    ("ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM" #xFC1C)
+    ("ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM" #xFC1D)
+    ("ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM" #xFC1E)
+    ("ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM" #xFC1F)
+    ("ARABIC LIGATURE SAD WITH HAH ISOLATED FORM" #xFC20)
+    ("ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM" #xFC21)
+    ("ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM" #xFC22)
+    ("ARABIC LIGATURE DAD WITH HAH ISOLATED FORM" #xFC23)
+    ("ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM" #xFC24)
+    ("ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM" #xFC25)
+    ("ARABIC LIGATURE TAH WITH HAH ISOLATED FORM" #xFC26)
+    ("ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM" #xFC27)
+    ("ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM" #xFC28)
+    ("ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM" #xFC29)
+    ("ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM" #xFC2A)
+    ("ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM" #xFC2B)
+    ("ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM" #xFC2C)
+    ("ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM" #xFC2D)
+    ("ARABIC LIGATURE FEH WITH HAH ISOLATED FORM" #xFC2E)
+    ("ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM" #xFC2F)
+    ("ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM" #xFC30)
+    ("ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM" #xFC31)
+    ("ARABIC LIGATURE FEH WITH YEH ISOLATED FORM" #xFC32)
+    ("ARABIC LIGATURE QAF WITH HAH ISOLATED FORM" #xFC33)
+    ("ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM" #xFC34)
+    ("ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM" #xFC35)
+    ("ARABIC LIGATURE QAF WITH YEH ISOLATED FORM" #xFC36)
+    ("ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM" #xFC37)
+    ("ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM" #xFC38)
+    ("ARABIC LIGATURE KAF WITH HAH ISOLATED FORM" #xFC39)
+    ("ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM" #xFC3A)
+    ("ARABIC LIGATURE KAF WITH LAM ISOLATED FORM" #xFC3B)
+    ("ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM" #xFC3C)
+    ("ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM" #xFC3D)
+    ("ARABIC LIGATURE KAF WITH YEH ISOLATED FORM" #xFC3E)
+    ("ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM" #xFC3F)
+    ("ARABIC LIGATURE LAM WITH HAH ISOLATED FORM" #xFC40)
+    ("ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM" #xFC41)
+    ("ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM" #xFC42)
+    ("ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM" #xFC43)
+    ("ARABIC LIGATURE LAM WITH YEH ISOLATED FORM" #xFC44)
+    ("ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM" #xFC45)
+    ("ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM" #xFC46)
+    ("ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM" #xFC47)
+    ("ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM" #xFC48)
+    ("ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM" #xFC49)
+    ("ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM" #xFC4A)
+    ("ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM" #xFC4B)
+    ("ARABIC LIGATURE NOON WITH HAH ISOLATED FORM" #xFC4C)
+    ("ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM" #xFC4D)
+    ("ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM" #xFC4E)
+    ("ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM" #xFC4F)
+    ("ARABIC LIGATURE NOON WITH YEH ISOLATED FORM" #xFC50)
+    ("ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM" #xFC51)
+    ("ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM" #xFC52)
+    ("ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM" #xFC53)
+    ("ARABIC LIGATURE HEH WITH YEH ISOLATED FORM" #xFC54)
+    ("ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM" #xFC55)
+    ("ARABIC LIGATURE YEH WITH HAH ISOLATED FORM" #xFC56)
+    ("ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM" #xFC57)
+    ("ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM" #xFC58)
+    ("ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM" #xFC59)
+    ("ARABIC LIGATURE YEH WITH YEH ISOLATED FORM" #xFC5A)
+    ("ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC5B)
+    ("ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC5C)
+    ("ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC5D)
+    ("ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM" #xFC5E)
+    ("ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM" #xFC5F)
+    ("ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM" #xFC60)
+    ("ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM" #xFC61)
+    ("ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM" #xFC62)
+    ("ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC63)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM" #xFC64)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM" #xFC65)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM" #xFC66)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM" #xFC67)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM" #xFC68)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM" #xFC69)
+    ("ARABIC LIGATURE BEH WITH REH FINAL FORM" #xFC6A)
+    ("ARABIC LIGATURE BEH WITH ZAIN FINAL FORM" #xFC6B)
+    ("ARABIC LIGATURE BEH WITH MEEM FINAL FORM" #xFC6C)
+    ("ARABIC LIGATURE BEH WITH NOON FINAL FORM" #xFC6D)
+    ("ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM" #xFC6E)
+    ("ARABIC LIGATURE BEH WITH YEH FINAL FORM" #xFC6F)
+    ("ARABIC LIGATURE TEH WITH REH FINAL FORM" #xFC70)
+    ("ARABIC LIGATURE TEH WITH ZAIN FINAL FORM" #xFC71)
+    ("ARABIC LIGATURE TEH WITH MEEM FINAL FORM" #xFC72)
+    ("ARABIC LIGATURE TEH WITH NOON FINAL FORM" #xFC73)
+    ("ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM" #xFC74)
+    ("ARABIC LIGATURE TEH WITH YEH FINAL FORM" #xFC75)
+    ("ARABIC LIGATURE THEH WITH REH FINAL FORM" #xFC76)
+    ("ARABIC LIGATURE THEH WITH ZAIN FINAL FORM" #xFC77)
+    ("ARABIC LIGATURE THEH WITH MEEM FINAL FORM" #xFC78)
+    ("ARABIC LIGATURE THEH WITH NOON FINAL FORM" #xFC79)
+    ("ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM" #xFC7A)
+    ("ARABIC LIGATURE THEH WITH YEH FINAL FORM" #xFC7B)
+    ("ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM" #xFC7C)
+    ("ARABIC LIGATURE FEH WITH YEH FINAL FORM" #xFC7D)
+    ("ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM" #xFC7E)
+    ("ARABIC LIGATURE QAF WITH YEH FINAL FORM" #xFC7F)
+    ("ARABIC LIGATURE KAF WITH ALEF FINAL FORM" #xFC80)
+    ("ARABIC LIGATURE KAF WITH LAM FINAL FORM" #xFC81)
+    ("ARABIC LIGATURE KAF WITH MEEM FINAL FORM" #xFC82)
+    ("ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM" #xFC83)
+    ("ARABIC LIGATURE KAF WITH YEH FINAL FORM" #xFC84)
+    ("ARABIC LIGATURE LAM WITH MEEM FINAL FORM" #xFC85)
+    ("ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM" #xFC86)
+    ("ARABIC LIGATURE LAM WITH YEH FINAL FORM" #xFC87)
+    ("ARABIC LIGATURE MEEM WITH ALEF FINAL FORM" #xFC88)
+    ("ARABIC LIGATURE MEEM WITH MEEM FINAL FORM" #xFC89)
+    ("ARABIC LIGATURE NOON WITH REH FINAL FORM" #xFC8A)
+    ("ARABIC LIGATURE NOON WITH ZAIN FINAL FORM" #xFC8B)
+    ("ARABIC LIGATURE NOON WITH MEEM FINAL FORM" #xFC8C)
+    ("ARABIC LIGATURE NOON WITH NOON FINAL FORM" #xFC8D)
+    ("ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM" #xFC8E)
+    ("ARABIC LIGATURE NOON WITH YEH FINAL FORM" #xFC8F)
+    ("ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM" #xFC90)
+    ("ARABIC LIGATURE YEH WITH REH FINAL FORM" #xFC91)
+    ("ARABIC LIGATURE YEH WITH ZAIN FINAL FORM" #xFC92)
+    ("ARABIC LIGATURE YEH WITH MEEM FINAL FORM" #xFC93)
+    ("ARABIC LIGATURE YEH WITH NOON FINAL FORM" #xFC94)
+    ("ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM" #xFC95)
+    ("ARABIC LIGATURE YEH WITH YEH FINAL FORM" #xFC96)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM" #xFC97)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM" #xFC98)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM" #xFC99)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM" #xFC9A)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM" #xFC9B)
+    ("ARABIC LIGATURE BEH WITH JEEM INITIAL FORM" #xFC9C)
+    ("ARABIC LIGATURE BEH WITH HAH INITIAL FORM" #xFC9D)
+    ("ARABIC LIGATURE BEH WITH KHAH INITIAL FORM" #xFC9E)
+    ("ARABIC LIGATURE BEH WITH MEEM INITIAL FORM" #xFC9F)
+    ("ARABIC LIGATURE BEH WITH HEH INITIAL FORM" #xFCA0)
+    ("ARABIC LIGATURE TEH WITH JEEM INITIAL FORM" #xFCA1)
+    ("ARABIC LIGATURE TEH WITH HAH INITIAL FORM" #xFCA2)
+    ("ARABIC LIGATURE TEH WITH KHAH INITIAL FORM" #xFCA3)
+    ("ARABIC LIGATURE TEH WITH MEEM INITIAL FORM" #xFCA4)
+    ("ARABIC LIGATURE TEH WITH HEH INITIAL FORM" #xFCA5)
+    ("ARABIC LIGATURE THEH WITH MEEM INITIAL FORM" #xFCA6)
+    ("ARABIC LIGATURE JEEM WITH HAH INITIAL FORM" #xFCA7)
+    ("ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM" #xFCA8)
+    ("ARABIC LIGATURE HAH WITH JEEM INITIAL FORM" #xFCA9)
+    ("ARABIC LIGATURE HAH WITH MEEM INITIAL FORM" #xFCAA)
+    ("ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM" #xFCAB)
+    ("ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM" #xFCAC)
+    ("ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM" #xFCAD)
+    ("ARABIC LIGATURE SEEN WITH HAH INITIAL FORM" #xFCAE)
+    ("ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM" #xFCAF)
+    ("ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM" #xFCB0)
+    ("ARABIC LIGATURE SAD WITH HAH INITIAL FORM" #xFCB1)
+    ("ARABIC LIGATURE SAD WITH KHAH INITIAL FORM" #xFCB2)
+    ("ARABIC LIGATURE SAD WITH MEEM INITIAL FORM" #xFCB3)
+    ("ARABIC LIGATURE DAD WITH JEEM INITIAL FORM" #xFCB4)
+    ("ARABIC LIGATURE DAD WITH HAH INITIAL FORM" #xFCB5)
+    ("ARABIC LIGATURE DAD WITH KHAH INITIAL FORM" #xFCB6)
+    ("ARABIC LIGATURE DAD WITH MEEM INITIAL FORM" #xFCB7)
+    ("ARABIC LIGATURE TAH WITH HAH INITIAL FORM" #xFCB8)
+    ("ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM" #xFCB9)
+    ("ARABIC LIGATURE AIN WITH JEEM INITIAL FORM" #xFCBA)
+    ("ARABIC LIGATURE AIN WITH MEEM INITIAL FORM" #xFCBB)
+    ("ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM" #xFCBC)
+    ("ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM" #xFCBD)
+    ("ARABIC LIGATURE FEH WITH JEEM INITIAL FORM" #xFCBE)
+    ("ARABIC LIGATURE FEH WITH HAH INITIAL FORM" #xFCBF)
+    ("ARABIC LIGATURE FEH WITH KHAH INITIAL FORM" #xFCC0)
+    ("ARABIC LIGATURE FEH WITH MEEM INITIAL FORM" #xFCC1)
+    ("ARABIC LIGATURE QAF WITH HAH INITIAL FORM" #xFCC2)
+    ("ARABIC LIGATURE QAF WITH MEEM INITIAL FORM" #xFCC3)
+    ("ARABIC LIGATURE KAF WITH JEEM INITIAL FORM" #xFCC4)
+    ("ARABIC LIGATURE KAF WITH HAH INITIAL FORM" #xFCC5)
+    ("ARABIC LIGATURE KAF WITH KHAH INITIAL FORM" #xFCC6)
+    ("ARABIC LIGATURE KAF WITH LAM INITIAL FORM" #xFCC7)
+    ("ARABIC LIGATURE KAF WITH MEEM INITIAL FORM" #xFCC8)
+    ("ARABIC LIGATURE LAM WITH JEEM INITIAL FORM" #xFCC9)
+    ("ARABIC LIGATURE LAM WITH HAH INITIAL FORM" #xFCCA)
+    ("ARABIC LIGATURE LAM WITH KHAH INITIAL FORM" #xFCCB)
+    ("ARABIC LIGATURE LAM WITH MEEM INITIAL FORM" #xFCCC)
+    ("ARABIC LIGATURE LAM WITH HEH INITIAL FORM" #xFCCD)
+    ("ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM" #xFCCE)
+    ("ARABIC LIGATURE MEEM WITH HAH INITIAL FORM" #xFCCF)
+    ("ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM" #xFCD0)
+    ("ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM" #xFCD1)
+    ("ARABIC LIGATURE NOON WITH JEEM INITIAL FORM" #xFCD2)
+    ("ARABIC LIGATURE NOON WITH HAH INITIAL FORM" #xFCD3)
+    ("ARABIC LIGATURE NOON WITH KHAH INITIAL FORM" #xFCD4)
+    ("ARABIC LIGATURE NOON WITH MEEM INITIAL FORM" #xFCD5)
+    ("ARABIC LIGATURE NOON WITH HEH INITIAL FORM" #xFCD6)
+    ("ARABIC LIGATURE HEH WITH JEEM INITIAL FORM" #xFCD7)
+    ("ARABIC LIGATURE HEH WITH MEEM INITIAL FORM" #xFCD8)
+    ("ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM" #xFCD9)
+    ("ARABIC LIGATURE YEH WITH JEEM INITIAL FORM" #xFCDA)
+    ("ARABIC LIGATURE YEH WITH HAH INITIAL FORM" #xFCDB)
+    ("ARABIC LIGATURE YEH WITH KHAH INITIAL FORM" #xFCDC)
+    ("ARABIC LIGATURE YEH WITH MEEM INITIAL FORM" #xFCDD)
+    ("ARABIC LIGATURE YEH WITH HEH INITIAL FORM" #xFCDE)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM" #xFCDF)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM" #xFCE0)
+    ("ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM" #xFCE1)
+    ("ARABIC LIGATURE BEH WITH HEH MEDIAL FORM" #xFCE2)
+    ("ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM" #xFCE3)
+    ("ARABIC LIGATURE TEH WITH HEH MEDIAL FORM" #xFCE4)
+    ("ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM" #xFCE5)
+    ("ARABIC LIGATURE THEH WITH HEH MEDIAL FORM" #xFCE6)
+    ("ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM" #xFCE7)
+    ("ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM" #xFCE8)
+    ("ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM" #xFCE9)
+    ("ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM" #xFCEA)
+    ("ARABIC LIGATURE KAF WITH LAM MEDIAL FORM" #xFCEB)
+    ("ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM" #xFCEC)
+    ("ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM" #xFCED)
+    ("ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM" #xFCEE)
+    ("ARABIC LIGATURE NOON WITH HEH MEDIAL FORM" #xFCEF)
+    ("ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM" #xFCF0)
+    ("ARABIC LIGATURE YEH WITH HEH MEDIAL FORM" #xFCF1)
+    ("ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM" #xFCF2)
+    ("ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM" #xFCF3)
+    ("ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM" #xFCF4)
+    ("ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM" #xFCF5)
+    ("ARABIC LIGATURE TAH WITH YEH ISOLATED FORM" #xFCF6)
+    ("ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM" #xFCF7)
+    ("ARABIC LIGATURE AIN WITH YEH ISOLATED FORM" #xFCF8)
+    ("ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM" #xFCF9)
+    ("ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM" #xFCFA)
+    ("ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM" #xFCFB)
+    ("ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM" #xFCFC)
+    ("ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM" #xFCFD)
+    ("ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM" #xFCFE)
+    ("ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM" #xFCFF)
+    ("ARABIC LIGATURE HAH WITH YEH ISOLATED FORM" #xFD00)
+    ("ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM" #xFD01)
+    ("ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM" #xFD02)
+    ("ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM" #xFD03)
+    ("ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM" #xFD04)
+    ("ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM" #xFD05)
+    ("ARABIC LIGATURE SAD WITH YEH ISOLATED FORM" #xFD06)
+    ("ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM" #xFD07)
+    ("ARABIC LIGATURE DAD WITH YEH ISOLATED FORM" #xFD08)
+    ("ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM" #xFD09)
+    ("ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM" #xFD0A)
+    ("ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM" #xFD0B)
+    ("ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM" #xFD0C)
+    ("ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM" #xFD0D)
+    ("ARABIC LIGATURE SEEN WITH REH ISOLATED FORM" #xFD0E)
+    ("ARABIC LIGATURE SAD WITH REH ISOLATED FORM" #xFD0F)
+    ("ARABIC LIGATURE DAD WITH REH ISOLATED FORM" #xFD10)
+    ("ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM" #xFD11)
+    ("ARABIC LIGATURE TAH WITH YEH FINAL FORM" #xFD12)
+    ("ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM" #xFD13)
+    ("ARABIC LIGATURE AIN WITH YEH FINAL FORM" #xFD14)
+    ("ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM" #xFD15)
+    ("ARABIC LIGATURE GHAIN WITH YEH FINAL FORM" #xFD16)
+    ("ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM" #xFD17)
+    ("ARABIC LIGATURE SEEN WITH YEH FINAL FORM" #xFD18)
+    ("ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM" #xFD19)
+    ("ARABIC LIGATURE SHEEN WITH YEH FINAL FORM" #xFD1A)
+    ("ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM" #xFD1B)
+    ("ARABIC LIGATURE HAH WITH YEH FINAL FORM" #xFD1C)
+    ("ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM" #xFD1D)
+    ("ARABIC LIGATURE JEEM WITH YEH FINAL FORM" #xFD1E)
+    ("ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM" #xFD1F)
+    ("ARABIC LIGATURE KHAH WITH YEH FINAL FORM" #xFD20)
+    ("ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM" #xFD21)
+    ("ARABIC LIGATURE SAD WITH YEH FINAL FORM" #xFD22)
+    ("ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM" #xFD23)
+    ("ARABIC LIGATURE DAD WITH YEH FINAL FORM" #xFD24)
+    ("ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM" #xFD25)
+    ("ARABIC LIGATURE SHEEN WITH HAH FINAL FORM" #xFD26)
+    ("ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM" #xFD27)
+    ("ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM" #xFD28)
+    ("ARABIC LIGATURE SHEEN WITH REH FINAL FORM" #xFD29)
+    ("ARABIC LIGATURE SEEN WITH REH FINAL FORM" #xFD2A)
+    ("ARABIC LIGATURE SAD WITH REH FINAL FORM" #xFD2B)
+    ("ARABIC LIGATURE DAD WITH REH FINAL FORM" #xFD2C)
+    ("ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM" #xFD2D)
+    ("ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM" #xFD2E)
+    ("ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM" #xFD2F)
+    ("ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM" #xFD30)
+    ("ARABIC LIGATURE SEEN WITH HEH INITIAL FORM" #xFD31)
+    ("ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM" #xFD32)
+    ("ARABIC LIGATURE TAH WITH MEEM INITIAL FORM" #xFD33)
+    ("ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM" #xFD34)
+    ("ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM" #xFD35)
+    ("ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM" #xFD36)
+    ("ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM" #xFD37)
+    ("ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM" #xFD38)
+    ("ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM" #xFD39)
+    ("ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM" #xFD3A)
+    ("ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM" #xFD3B)
+    ("ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM" #xFD3C)
+    ("ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM" #xFD3D)
+    ("ORNATE LEFT PARENTHESIS" #xFD3E)
+    ("ORNATE RIGHT PARENTHESIS" #xFD3F)
+    ("ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM" #xFD50)
+    ("ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM" #xFD51)
+    ("ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM" #xFD52)
+    ("ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM" #xFD53)
+    ("ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM" #xFD54)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM" #xFD55)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM" #xFD56)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM" #xFD57)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM" #xFD58)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM" #xFD59)
+    ("ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM" #xFD5A)
+    ("ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD5B)
+    ("ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM" #xFD5C)
+    ("ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM" #xFD5D)
+    ("ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM" #xFD5E)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM" #xFD5F)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM" #xFD60)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM" #xFD61)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM" #xFD62)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM" #xFD63)
+    ("ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM" #xFD64)
+    ("ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM" #xFD65)
+    ("ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM" #xFD66)
+    ("ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM" #xFD67)
+    ("ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM" #xFD68)
+    ("ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM" #xFD69)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM" #xFD6A)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM" #xFD6B)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM" #xFD6C)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM" #xFD6D)
+    ("ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFD6E)
+    ("ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM" #xFD6F)
+    ("ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM" #xFD70)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM" #xFD71)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM" #xFD72)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM" #xFD73)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM" #xFD74)
+    ("ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM" #xFD75)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM" #xFD76)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM" #xFD77)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD78)
+    ("ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM" #xFD79)
+    ("ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM" #xFD7A)
+    ("ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD7B)
+    ("ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM" #xFD7C)
+    ("ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM" #xFD7D)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM" #xFD7E)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM" #xFD7F)
+    ("ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM" #xFD80)
+    ("ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM" #xFD81)
+    ("ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFD82)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM" #xFD83)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM" #xFD84)
+    ("ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM" #xFD85)
+    ("ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM" #xFD86)
+    ("ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM" #xFD87)
+    ("ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM" #xFD88)
+    ("ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM" #xFD89)
+    ("ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM" #xFD8A)
+    ("ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM" #xFD8B)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM" #xFD8C)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM" #xFD8D)
+    ("ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM" #xFD8E)
+    ("ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM" #xFD8F)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM" #xFD92)
+    ("ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM" #xFD93)
+    ("ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM" #xFD94)
+    ("ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM" #xFD95)
+    ("ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFD96)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM" #xFD97)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM" #xFD98)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM" #xFD99)
+    ("ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM" #xFD9A)
+    ("ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD9B)
+    ("ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM" #xFD9C)
+    ("ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM" #xFD9D)
+    ("ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM" #xFD9E)
+    ("ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM" #xFD9F)
+    ("ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM" #xFDA0)
+    ("ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM" #xFDA1)
+    ("ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM" #xFDA2)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM" #xFDA3)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFDA4)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM" #xFDA5)
+    ("ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFDA6)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFDA7)
+    ("ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM" #xFDA8)
+    ("ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM" #xFDA9)
+    ("ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM" #xFDAA)
+    ("ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM" #xFDAB)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM" #xFDAC)
+    ("ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM" #xFDAD)
+    ("ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM" #xFDAE)
+    ("ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM" #xFDAF)
+    ("ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM" #xFDB0)
+    ("ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM" #xFDB1)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM" #xFDB2)
+    ("ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM" #xFDB3)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM" #xFDB4)
+    ("ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM" #xFDB5)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM" #xFDB6)
+    ("ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM" #xFDB7)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM" #xFDB8)
+    ("ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM" #xFDB9)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM" #xFDBA)
+    ("ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM" #xFDBB)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM" #xFDBC)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM" #xFDBD)
+    ("ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM" #xFDBE)
+    ("ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM" #xFDBF)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM" #xFDC0)
+    ("ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM" #xFDC1)
+    ("ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM" #xFDC2)
+    ("ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM" #xFDC3)
+    ("ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM" #xFDC4)
+    ("ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM" #xFDC5)
+    ("ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM" #xFDC6)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM" #xFDC7)
+    ("ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM" #xFDF0)
+    ("ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM" #xFDF1)
+    ("ARABIC LIGATURE ALLAH ISOLATED FORM" #xFDF2)
+    ("ARABIC LIGATURE AKBAR ISOLATED FORM" #xFDF3)
+    ("ARABIC LIGATURE MOHAMMAD ISOLATED FORM" #xFDF4)
+    ("ARABIC LIGATURE SALAM ISOLATED FORM" #xFDF5)
+    ("ARABIC LIGATURE RASOUL ISOLATED FORM" #xFDF6)
+    ("ARABIC LIGATURE ALAYHE ISOLATED FORM" #xFDF7)
+    ("ARABIC LIGATURE WASALLAM ISOLATED FORM" #xFDF8)
+    ("ARABIC LIGATURE SALLA ISOLATED FORM" #xFDF9)
+    ("ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM" #xFDFA)
+    ("ARABIC LIGATURE JALLAJALALOUHOU" #xFDFB)
+    ("RIAL SIGN" #xFDFC)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FE00-0FE0F.el b/lisp/nxml/char-name/unicode/0FE00-0FE0F.el
new file mode 100644 (file)
index 0000000..f1eb897
--- /dev/null
@@ -0,0 +1,18 @@
+(nxml-define-char-name-set 'variation-selectors
+  '(("VARIATION SELECTOR-1" #xFE00)
+    ("VARIATION SELECTOR-2" #xFE01)
+    ("VARIATION SELECTOR-3" #xFE02)
+    ("VARIATION SELECTOR-4" #xFE03)
+    ("VARIATION SELECTOR-5" #xFE04)
+    ("VARIATION SELECTOR-6" #xFE05)
+    ("VARIATION SELECTOR-7" #xFE06)
+    ("VARIATION SELECTOR-8" #xFE07)
+    ("VARIATION SELECTOR-9" #xFE08)
+    ("VARIATION SELECTOR-10" #xFE09)
+    ("VARIATION SELECTOR-11" #xFE0A)
+    ("VARIATION SELECTOR-12" #xFE0B)
+    ("VARIATION SELECTOR-13" #xFE0C)
+    ("VARIATION SELECTOR-14" #xFE0D)
+    ("VARIATION SELECTOR-15" #xFE0E)
+    ("VARIATION SELECTOR-16" #xFE0F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FE20-0FE2F.el b/lisp/nxml/char-name/unicode/0FE20-0FE2F.el
new file mode 100644 (file)
index 0000000..2cc5ef2
--- /dev/null
@@ -0,0 +1,6 @@
+(nxml-define-char-name-set 'combining-half-marks
+  '(("COMBINING LIGATURE LEFT HALF" #xFE20)
+    ("COMBINING LIGATURE RIGHT HALF" #xFE21)
+    ("COMBINING DOUBLE TILDE LEFT HALF" #xFE22)
+    ("COMBINING DOUBLE TILDE RIGHT HALF" #xFE23)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FE30-0FE4F.el b/lisp/nxml/char-name/unicode/0FE30-0FE4F.el
new file mode 100644 (file)
index 0000000..83893e4
--- /dev/null
@@ -0,0 +1,32 @@
+(nxml-define-char-name-set 'cjk-compatibility-forms
+  '(("PRESENTATION FORM FOR VERTICAL TWO DOT LEADER" #xFE30)
+    ("PRESENTATION FORM FOR VERTICAL EM DASH" #xFE31)
+    ("PRESENTATION FORM FOR VERTICAL EN DASH" #xFE32)
+    ("PRESENTATION FORM FOR VERTICAL LOW LINE" #xFE33)
+    ("PRESENTATION FORM FOR VERTICAL WAVY LOW LINE" #xFE34)
+    ("PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS" #xFE35)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS" #xFE36)
+    ("PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET" #xFE37)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET" #xFE38)
+    ("PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET" #xFE39)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET" #xFE3A)
+    ("PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET" #xFE3B)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET" #xFE3C)
+    ("PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET" #xFE3D)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET" #xFE3E)
+    ("PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET" #xFE3F)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET" #xFE40)
+    ("PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET" #xFE41)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET" #xFE42)
+    ("PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET" #xFE43)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET" #xFE44)
+    ("SESAME DOT" #xFE45)
+    ("WHITE SESAME DOT" #xFE46)
+    ("DASHED OVERLINE" #xFE49)
+    ("CENTRELINE OVERLINE" #xFE4A)
+    ("WAVY OVERLINE" #xFE4B)
+    ("DOUBLE WAVY OVERLINE" #xFE4C)
+    ("DASHED LOW LINE" #xFE4D)
+    ("CENTRELINE LOW LINE" #xFE4E)
+    ("WAVY LOW LINE" #xFE4F)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FE50-0FE6F.el b/lisp/nxml/char-name/unicode/0FE50-0FE6F.el
new file mode 100644 (file)
index 0000000..d94cc45
--- /dev/null
@@ -0,0 +1,28 @@
+(nxml-define-char-name-set 'small-form-variants
+  '(("SMALL COMMA" #xFE50)
+    ("SMALL IDEOGRAPHIC COMMA" #xFE51)
+    ("SMALL FULL STOP" #xFE52)
+    ("SMALL SEMICOLON" #xFE54)
+    ("SMALL COLON" #xFE55)
+    ("SMALL QUESTION MARK" #xFE56)
+    ("SMALL EXCLAMATION MARK" #xFE57)
+    ("SMALL EM DASH" #xFE58)
+    ("SMALL LEFT PARENTHESIS" #xFE59)
+    ("SMALL RIGHT PARENTHESIS" #xFE5A)
+    ("SMALL LEFT CURLY BRACKET" #xFE5B)
+    ("SMALL RIGHT CURLY BRACKET" #xFE5C)
+    ("SMALL LEFT TORTOISE SHELL BRACKET" #xFE5D)
+    ("SMALL RIGHT TORTOISE SHELL BRACKET" #xFE5E)
+    ("SMALL NUMBER SIGN" #xFE5F)
+    ("SMALL AMPERSAND" #xFE60)
+    ("SMALL ASTERISK" #xFE61)
+    ("SMALL PLUS SIGN" #xFE62)
+    ("SMALL HYPHEN-MINUS" #xFE63)
+    ("SMALL LESS-THAN SIGN" #xFE64)
+    ("SMALL GREATER-THAN SIGN" #xFE65)
+    ("SMALL EQUALS SIGN" #xFE66)
+    ("SMALL REVERSE SOLIDUS" #xFE68)
+    ("SMALL DOLLAR SIGN" #xFE69)
+    ("SMALL PERCENT SIGN" #xFE6A)
+    ("SMALL COMMERCIAL AT" #xFE6B)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FE70-0FEFF.el b/lisp/nxml/char-name/unicode/0FE70-0FEFF.el
new file mode 100644 (file)
index 0000000..d0e54b6
--- /dev/null
@@ -0,0 +1,143 @@
+(nxml-define-char-name-set 'arabic-presentation-forms-b
+  '(("ARABIC FATHATAN ISOLATED FORM" #xFE70)
+    ("ARABIC TATWEEL WITH FATHATAN ABOVE" #xFE71)
+    ("ARABIC DAMMATAN ISOLATED FORM" #xFE72)
+    ("ARABIC TAIL FRAGMENT" #xFE73)
+    ("ARABIC KASRATAN ISOLATED FORM" #xFE74)
+    ("ARABIC FATHA ISOLATED FORM" #xFE76)
+    ("ARABIC FATHA MEDIAL FORM" #xFE77)
+    ("ARABIC DAMMA ISOLATED FORM" #xFE78)
+    ("ARABIC DAMMA MEDIAL FORM" #xFE79)
+    ("ARABIC KASRA ISOLATED FORM" #xFE7A)
+    ("ARABIC KASRA MEDIAL FORM" #xFE7B)
+    ("ARABIC SHADDA ISOLATED FORM" #xFE7C)
+    ("ARABIC SHADDA MEDIAL FORM" #xFE7D)
+    ("ARABIC SUKUN ISOLATED FORM" #xFE7E)
+    ("ARABIC SUKUN MEDIAL FORM" #xFE7F)
+    ("ARABIC LETTER HAMZA ISOLATED FORM" #xFE80)
+    ("ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM" #xFE81)
+    ("ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM" #xFE82)
+    ("ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM" #xFE83)
+    ("ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM" #xFE84)
+    ("ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM" #xFE85)
+    ("ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM" #xFE86)
+    ("ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM" #xFE87)
+    ("ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM" #xFE88)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM" #xFE89)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM" #xFE8A)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM" #xFE8B)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM" #xFE8C)
+    ("ARABIC LETTER ALEF ISOLATED FORM" #xFE8D)
+    ("ARABIC LETTER ALEF FINAL FORM" #xFE8E)
+    ("ARABIC LETTER BEH ISOLATED FORM" #xFE8F)
+    ("ARABIC LETTER BEH FINAL FORM" #xFE90)
+    ("ARABIC LETTER BEH INITIAL FORM" #xFE91)
+    ("ARABIC LETTER BEH MEDIAL FORM" #xFE92)
+    ("ARABIC LETTER TEH MARBUTA ISOLATED FORM" #xFE93)
+    ("ARABIC LETTER TEH MARBUTA FINAL FORM" #xFE94)
+    ("ARABIC LETTER TEH ISOLATED FORM" #xFE95)
+    ("ARABIC LETTER TEH FINAL FORM" #xFE96)
+    ("ARABIC LETTER TEH INITIAL FORM" #xFE97)
+    ("ARABIC LETTER TEH MEDIAL FORM" #xFE98)
+    ("ARABIC LETTER THEH ISOLATED FORM" #xFE99)
+    ("ARABIC LETTER THEH FINAL FORM" #xFE9A)
+    ("ARABIC LETTER THEH INITIAL FORM" #xFE9B)
+    ("ARABIC LETTER THEH MEDIAL FORM" #xFE9C)
+    ("ARABIC LETTER JEEM ISOLATED FORM" #xFE9D)
+    ("ARABIC LETTER JEEM FINAL FORM" #xFE9E)
+    ("ARABIC LETTER JEEM INITIAL FORM" #xFE9F)
+    ("ARABIC LETTER JEEM MEDIAL FORM" #xFEA0)
+    ("ARABIC LETTER HAH ISOLATED FORM" #xFEA1)
+    ("ARABIC LETTER HAH FINAL FORM" #xFEA2)
+    ("ARABIC LETTER HAH INITIAL FORM" #xFEA3)
+    ("ARABIC LETTER HAH MEDIAL FORM" #xFEA4)
+    ("ARABIC LETTER KHAH ISOLATED FORM" #xFEA5)
+    ("ARABIC LETTER KHAH FINAL FORM" #xFEA6)
+    ("ARABIC LETTER KHAH INITIAL FORM" #xFEA7)
+    ("ARABIC LETTER KHAH MEDIAL FORM" #xFEA8)
+    ("ARABIC LETTER DAL ISOLATED FORM" #xFEA9)
+    ("ARABIC LETTER DAL FINAL FORM" #xFEAA)
+    ("ARABIC LETTER THAL ISOLATED FORM" #xFEAB)
+    ("ARABIC LETTER THAL FINAL FORM" #xFEAC)
+    ("ARABIC LETTER REH ISOLATED FORM" #xFEAD)
+    ("ARABIC LETTER REH FINAL FORM" #xFEAE)
+    ("ARABIC LETTER ZAIN ISOLATED FORM" #xFEAF)
+    ("ARABIC LETTER ZAIN FINAL FORM" #xFEB0)
+    ("ARABIC LETTER SEEN ISOLATED FORM" #xFEB1)
+    ("ARABIC LETTER SEEN FINAL FORM" #xFEB2)
+    ("ARABIC LETTER SEEN INITIAL FORM" #xFEB3)
+    ("ARABIC LETTER SEEN MEDIAL FORM" #xFEB4)
+    ("ARABIC LETTER SHEEN ISOLATED FORM" #xFEB5)
+    ("ARABIC LETTER SHEEN FINAL FORM" #xFEB6)
+    ("ARABIC LETTER SHEEN INITIAL FORM" #xFEB7)
+    ("ARABIC LETTER SHEEN MEDIAL FORM" #xFEB8)
+    ("ARABIC LETTER SAD ISOLATED FORM" #xFEB9)
+    ("ARABIC LETTER SAD FINAL FORM" #xFEBA)
+    ("ARABIC LETTER SAD INITIAL FORM" #xFEBB)
+    ("ARABIC LETTER SAD MEDIAL FORM" #xFEBC)
+    ("ARABIC LETTER DAD ISOLATED FORM" #xFEBD)
+    ("ARABIC LETTER DAD FINAL FORM" #xFEBE)
+    ("ARABIC LETTER DAD INITIAL FORM" #xFEBF)
+    ("ARABIC LETTER DAD MEDIAL FORM" #xFEC0)
+    ("ARABIC LETTER TAH ISOLATED FORM" #xFEC1)
+    ("ARABIC LETTER TAH FINAL FORM" #xFEC2)
+    ("ARABIC LETTER TAH INITIAL FORM" #xFEC3)
+    ("ARABIC LETTER TAH MEDIAL FORM" #xFEC4)
+    ("ARABIC LETTER ZAH ISOLATED FORM" #xFEC5)
+    ("ARABIC LETTER ZAH FINAL FORM" #xFEC6)
+    ("ARABIC LETTER ZAH INITIAL FORM" #xFEC7)
+    ("ARABIC LETTER ZAH MEDIAL FORM" #xFEC8)
+    ("ARABIC LETTER AIN ISOLATED FORM" #xFEC9)
+    ("ARABIC LETTER AIN FINAL FORM" #xFECA)
+    ("ARABIC LETTER AIN INITIAL FORM" #xFECB)
+    ("ARABIC LETTER AIN MEDIAL FORM" #xFECC)
+    ("ARABIC LETTER GHAIN ISOLATED FORM" #xFECD)
+    ("ARABIC LETTER GHAIN FINAL FORM" #xFECE)
+    ("ARABIC LETTER GHAIN INITIAL FORM" #xFECF)
+    ("ARABIC LETTER GHAIN MEDIAL FORM" #xFED0)
+    ("ARABIC LETTER FEH ISOLATED FORM" #xFED1)
+    ("ARABIC LETTER FEH FINAL FORM" #xFED2)
+    ("ARABIC LETTER FEH INITIAL FORM" #xFED3)
+    ("ARABIC LETTER FEH MEDIAL FORM" #xFED4)
+    ("ARABIC LETTER QAF ISOLATED FORM" #xFED5)
+    ("ARABIC LETTER QAF FINAL FORM" #xFED6)
+    ("ARABIC LETTER QAF INITIAL FORM" #xFED7)
+    ("ARABIC LETTER QAF MEDIAL FORM" #xFED8)
+    ("ARABIC LETTER KAF ISOLATED FORM" #xFED9)
+    ("ARABIC LETTER KAF FINAL FORM" #xFEDA)
+    ("ARABIC LETTER KAF INITIAL FORM" #xFEDB)
+    ("ARABIC LETTER KAF MEDIAL FORM" #xFEDC)
+    ("ARABIC LETTER LAM ISOLATED FORM" #xFEDD)
+    ("ARABIC LETTER LAM FINAL FORM" #xFEDE)
+    ("ARABIC LETTER LAM INITIAL FORM" #xFEDF)
+    ("ARABIC LETTER LAM MEDIAL FORM" #xFEE0)
+    ("ARABIC LETTER MEEM ISOLATED FORM" #xFEE1)
+    ("ARABIC LETTER MEEM FINAL FORM" #xFEE2)
+    ("ARABIC LETTER MEEM INITIAL FORM" #xFEE3)
+    ("ARABIC LETTER MEEM MEDIAL FORM" #xFEE4)
+    ("ARABIC LETTER NOON ISOLATED FORM" #xFEE5)
+    ("ARABIC LETTER NOON FINAL FORM" #xFEE6)
+    ("ARABIC LETTER NOON INITIAL FORM" #xFEE7)
+    ("ARABIC LETTER NOON MEDIAL FORM" #xFEE8)
+    ("ARABIC LETTER HEH ISOLATED FORM" #xFEE9)
+    ("ARABIC LETTER HEH FINAL FORM" #xFEEA)
+    ("ARABIC LETTER HEH INITIAL FORM" #xFEEB)
+    ("ARABIC LETTER HEH MEDIAL FORM" #xFEEC)
+    ("ARABIC LETTER WAW ISOLATED FORM" #xFEED)
+    ("ARABIC LETTER WAW FINAL FORM" #xFEEE)
+    ("ARABIC LETTER ALEF MAKSURA ISOLATED FORM" #xFEEF)
+    ("ARABIC LETTER ALEF MAKSURA FINAL FORM" #xFEF0)
+    ("ARABIC LETTER YEH ISOLATED FORM" #xFEF1)
+    ("ARABIC LETTER YEH FINAL FORM" #xFEF2)
+    ("ARABIC LETTER YEH INITIAL FORM" #xFEF3)
+    ("ARABIC LETTER YEH MEDIAL FORM" #xFEF4)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM" #xFEF5)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM" #xFEF6)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM" #xFEF7)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM" #xFEF8)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM" #xFEF9)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM" #xFEFA)
+    ("ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM" #xFEFB)
+    ("ARABIC LIGATURE LAM WITH ALEF FINAL FORM" #xFEFC)
+    ("ZERO WIDTH NO-BREAK SPACE" #xFEFF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FF00-0FFEF.el b/lisp/nxml/char-name/unicode/0FF00-0FFEF.el
new file mode 100644 (file)
index 0000000..004f043
--- /dev/null
@@ -0,0 +1,227 @@
+(nxml-define-char-name-set 'halfwidth-and-fullwidth-forms
+  '(("FULLWIDTH EXCLAMATION MARK" #xFF01)
+    ("FULLWIDTH QUOTATION MARK" #xFF02)
+    ("FULLWIDTH NUMBER SIGN" #xFF03)
+    ("FULLWIDTH DOLLAR SIGN" #xFF04)
+    ("FULLWIDTH PERCENT SIGN" #xFF05)
+    ("FULLWIDTH AMPERSAND" #xFF06)
+    ("FULLWIDTH APOSTROPHE" #xFF07)
+    ("FULLWIDTH LEFT PARENTHESIS" #xFF08)
+    ("FULLWIDTH RIGHT PARENTHESIS" #xFF09)
+    ("FULLWIDTH ASTERISK" #xFF0A)
+    ("FULLWIDTH PLUS SIGN" #xFF0B)
+    ("FULLWIDTH COMMA" #xFF0C)
+    ("FULLWIDTH HYPHEN-MINUS" #xFF0D)
+    ("FULLWIDTH FULL STOP" #xFF0E)
+    ("FULLWIDTH SOLIDUS" #xFF0F)
+    ("FULLWIDTH DIGIT ZERO" #xFF10)
+    ("FULLWIDTH DIGIT ONE" #xFF11)
+    ("FULLWIDTH DIGIT TWO" #xFF12)
+    ("FULLWIDTH DIGIT THREE" #xFF13)
+    ("FULLWIDTH DIGIT FOUR" #xFF14)
+    ("FULLWIDTH DIGIT FIVE" #xFF15)
+    ("FULLWIDTH DIGIT SIX" #xFF16)
+    ("FULLWIDTH DIGIT SEVEN" #xFF17)
+    ("FULLWIDTH DIGIT EIGHT" #xFF18)
+    ("FULLWIDTH DIGIT NINE" #xFF19)
+    ("FULLWIDTH COLON" #xFF1A)
+    ("FULLWIDTH SEMICOLON" #xFF1B)
+    ("FULLWIDTH LESS-THAN SIGN" #xFF1C)
+    ("FULLWIDTH EQUALS SIGN" #xFF1D)
+    ("FULLWIDTH GREATER-THAN SIGN" #xFF1E)
+    ("FULLWIDTH QUESTION MARK" #xFF1F)
+    ("FULLWIDTH COMMERCIAL AT" #xFF20)
+    ("FULLWIDTH LATIN CAPITAL LETTER A" #xFF21)
+    ("FULLWIDTH LATIN CAPITAL LETTER B" #xFF22)
+    ("FULLWIDTH LATIN CAPITAL LETTER C" #xFF23)
+    ("FULLWIDTH LATIN CAPITAL LETTER D" #xFF24)
+    ("FULLWIDTH LATIN CAPITAL LETTER E" #xFF25)
+    ("FULLWIDTH LATIN CAPITAL LETTER F" #xFF26)
+    ("FULLWIDTH LATIN CAPITAL LETTER G" #xFF27)
+    ("FULLWIDTH LATIN CAPITAL LETTER H" #xFF28)
+    ("FULLWIDTH LATIN CAPITAL LETTER I" #xFF29)
+    ("FULLWIDTH LATIN CAPITAL LETTER J" #xFF2A)
+    ("FULLWIDTH LATIN CAPITAL LETTER K" #xFF2B)
+    ("FULLWIDTH LATIN CAPITAL LETTER L" #xFF2C)
+    ("FULLWIDTH LATIN CAPITAL LETTER M" #xFF2D)
+    ("FULLWIDTH LATIN CAPITAL LETTER N" #xFF2E)
+    ("FULLWIDTH LATIN CAPITAL LETTER O" #xFF2F)
+    ("FULLWIDTH LATIN CAPITAL LETTER P" #xFF30)
+    ("FULLWIDTH LATIN CAPITAL LETTER Q" #xFF31)
+    ("FULLWIDTH LATIN CAPITAL LETTER R" #xFF32)
+    ("FULLWIDTH LATIN CAPITAL LETTER S" #xFF33)
+    ("FULLWIDTH LATIN CAPITAL LETTER T" #xFF34)
+    ("FULLWIDTH LATIN CAPITAL LETTER U" #xFF35)
+    ("FULLWIDTH LATIN CAPITAL LETTER V" #xFF36)
+    ("FULLWIDTH LATIN CAPITAL LETTER W" #xFF37)
+    ("FULLWIDTH LATIN CAPITAL LETTER X" #xFF38)
+    ("FULLWIDTH LATIN CAPITAL LETTER Y" #xFF39)
+    ("FULLWIDTH LATIN CAPITAL LETTER Z" #xFF3A)
+    ("FULLWIDTH LEFT SQUARE BRACKET" #xFF3B)
+    ("FULLWIDTH REVERSE SOLIDUS" #xFF3C)
+    ("FULLWIDTH RIGHT SQUARE BRACKET" #xFF3D)
+    ("FULLWIDTH CIRCUMFLEX ACCENT" #xFF3E)
+    ("FULLWIDTH LOW LINE" #xFF3F)
+    ("FULLWIDTH GRAVE ACCENT" #xFF40)
+    ("FULLWIDTH LATIN SMALL LETTER A" #xFF41)
+    ("FULLWIDTH LATIN SMALL LETTER B" #xFF42)
+    ("FULLWIDTH LATIN SMALL LETTER C" #xFF43)
+    ("FULLWIDTH LATIN SMALL LETTER D" #xFF44)
+    ("FULLWIDTH LATIN SMALL LETTER E" #xFF45)
+    ("FULLWIDTH LATIN SMALL LETTER F" #xFF46)
+    ("FULLWIDTH LATIN SMALL LETTER G" #xFF47)
+    ("FULLWIDTH LATIN SMALL LETTER H" #xFF48)
+    ("FULLWIDTH LATIN SMALL LETTER I" #xFF49)
+    ("FULLWIDTH LATIN SMALL LETTER J" #xFF4A)
+    ("FULLWIDTH LATIN SMALL LETTER K" #xFF4B)
+    ("FULLWIDTH LATIN SMALL LETTER L" #xFF4C)
+    ("FULLWIDTH LATIN SMALL LETTER M" #xFF4D)
+    ("FULLWIDTH LATIN SMALL LETTER N" #xFF4E)
+    ("FULLWIDTH LATIN SMALL LETTER O" #xFF4F)
+    ("FULLWIDTH LATIN SMALL LETTER P" #xFF50)
+    ("FULLWIDTH LATIN SMALL LETTER Q" #xFF51)
+    ("FULLWIDTH LATIN SMALL LETTER R" #xFF52)
+    ("FULLWIDTH LATIN SMALL LETTER S" #xFF53)
+    ("FULLWIDTH LATIN SMALL LETTER T" #xFF54)
+    ("FULLWIDTH LATIN SMALL LETTER U" #xFF55)
+    ("FULLWIDTH LATIN SMALL LETTER V" #xFF56)
+    ("FULLWIDTH LATIN SMALL LETTER W" #xFF57)
+    ("FULLWIDTH LATIN SMALL LETTER X" #xFF58)
+    ("FULLWIDTH LATIN SMALL LETTER Y" #xFF59)
+    ("FULLWIDTH LATIN SMALL LETTER Z" #xFF5A)
+    ("FULLWIDTH LEFT CURLY BRACKET" #xFF5B)
+    ("FULLWIDTH VERTICAL LINE" #xFF5C)
+    ("FULLWIDTH RIGHT CURLY BRACKET" #xFF5D)
+    ("FULLWIDTH TILDE" #xFF5E)
+    ("FULLWIDTH LEFT WHITE PARENTHESIS" #xFF5F)
+    ("FULLWIDTH RIGHT WHITE PARENTHESIS" #xFF60)
+    ("HALFWIDTH IDEOGRAPHIC FULL STOP" #xFF61)
+    ("HALFWIDTH LEFT CORNER BRACKET" #xFF62)
+    ("HALFWIDTH RIGHT CORNER BRACKET" #xFF63)
+    ("HALFWIDTH IDEOGRAPHIC COMMA" #xFF64)
+    ("HALFWIDTH KATAKANA MIDDLE DOT" #xFF65)
+    ("HALFWIDTH KATAKANA LETTER WO" #xFF66)
+    ("HALFWIDTH KATAKANA LETTER SMALL A" #xFF67)
+    ("HALFWIDTH KATAKANA LETTER SMALL I" #xFF68)
+    ("HALFWIDTH KATAKANA LETTER SMALL U" #xFF69)
+    ("HALFWIDTH KATAKANA LETTER SMALL E" #xFF6A)
+    ("HALFWIDTH KATAKANA LETTER SMALL O" #xFF6B)
+    ("HALFWIDTH KATAKANA LETTER SMALL YA" #xFF6C)
+    ("HALFWIDTH KATAKANA LETTER SMALL YU" #xFF6D)
+    ("HALFWIDTH KATAKANA LETTER SMALL YO" #xFF6E)
+    ("HALFWIDTH KATAKANA LETTER SMALL TU" #xFF6F)
+    ("HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK" #xFF70)
+    ("HALFWIDTH KATAKANA LETTER A" #xFF71)
+    ("HALFWIDTH KATAKANA LETTER I" #xFF72)
+    ("HALFWIDTH KATAKANA LETTER U" #xFF73)
+    ("HALFWIDTH KATAKANA LETTER E" #xFF74)
+    ("HALFWIDTH KATAKANA LETTER O" #xFF75)
+    ("HALFWIDTH KATAKANA LETTER KA" #xFF76)
+    ("HALFWIDTH KATAKANA LETTER KI" #xFF77)
+    ("HALFWIDTH KATAKANA LETTER KU" #xFF78)
+    ("HALFWIDTH KATAKANA LETTER KE" #xFF79)
+    ("HALFWIDTH KATAKANA LETTER KO" #xFF7A)
+    ("HALFWIDTH KATAKANA LETTER SA" #xFF7B)
+    ("HALFWIDTH KATAKANA LETTER SI" #xFF7C)
+    ("HALFWIDTH KATAKANA LETTER SU" #xFF7D)
+    ("HALFWIDTH KATAKANA LETTER SE" #xFF7E)
+    ("HALFWIDTH KATAKANA LETTER SO" #xFF7F)
+    ("HALFWIDTH KATAKANA LETTER TA" #xFF80)
+    ("HALFWIDTH KATAKANA LETTER TI" #xFF81)
+    ("HALFWIDTH KATAKANA LETTER TU" #xFF82)
+    ("HALFWIDTH KATAKANA LETTER TE" #xFF83)
+    ("HALFWIDTH KATAKANA LETTER TO" #xFF84)
+    ("HALFWIDTH KATAKANA LETTER NA" #xFF85)
+    ("HALFWIDTH KATAKANA LETTER NI" #xFF86)
+    ("HALFWIDTH KATAKANA LETTER NU" #xFF87)
+    ("HALFWIDTH KATAKANA LETTER NE" #xFF88)
+    ("HALFWIDTH KATAKANA LETTER NO" #xFF89)
+    ("HALFWIDTH KATAKANA LETTER HA" #xFF8A)
+    ("HALFWIDTH KATAKANA LETTER HI" #xFF8B)
+    ("HALFWIDTH KATAKANA LETTER HU" #xFF8C)
+    ("HALFWIDTH KATAKANA LETTER HE" #xFF8D)
+    ("HALFWIDTH KATAKANA LETTER HO" #xFF8E)
+    ("HALFWIDTH KATAKANA LETTER MA" #xFF8F)
+    ("HALFWIDTH KATAKANA LETTER MI" #xFF90)
+    ("HALFWIDTH KATAKANA LETTER MU" #xFF91)
+    ("HALFWIDTH KATAKANA LETTER ME" #xFF92)
+    ("HALFWIDTH KATAKANA LETTER MO" #xFF93)
+    ("HALFWIDTH KATAKANA LETTER YA" #xFF94)
+    ("HALFWIDTH KATAKANA LETTER YU" #xFF95)
+    ("HALFWIDTH KATAKANA LETTER YO" #xFF96)
+    ("HALFWIDTH KATAKANA LETTER RA" #xFF97)
+    ("HALFWIDTH KATAKANA LETTER RI" #xFF98)
+    ("HALFWIDTH KATAKANA LETTER RU" #xFF99)
+    ("HALFWIDTH KATAKANA LETTER RE" #xFF9A)
+    ("HALFWIDTH KATAKANA LETTER RO" #xFF9B)
+    ("HALFWIDTH KATAKANA LETTER WA" #xFF9C)
+    ("HALFWIDTH KATAKANA LETTER N" #xFF9D)
+    ("HALFWIDTH KATAKANA VOICED SOUND MARK" #xFF9E)
+    ("HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK" #xFF9F)
+    ("HALFWIDTH HANGUL FILLER" #xFFA0)
+    ("HALFWIDTH HANGUL LETTER KIYEOK" #xFFA1)
+    ("HALFWIDTH HANGUL LETTER SSANGKIYEOK" #xFFA2)
+    ("HALFWIDTH HANGUL LETTER KIYEOK-SIOS" #xFFA3)
+    ("HALFWIDTH HANGUL LETTER NIEUN" #xFFA4)
+    ("HALFWIDTH HANGUL LETTER NIEUN-CIEUC" #xFFA5)
+    ("HALFWIDTH HANGUL LETTER NIEUN-HIEUH" #xFFA6)
+    ("HALFWIDTH HANGUL LETTER TIKEUT" #xFFA7)
+    ("HALFWIDTH HANGUL LETTER SSANGTIKEUT" #xFFA8)
+    ("HALFWIDTH HANGUL LETTER RIEUL" #xFFA9)
+    ("HALFWIDTH HANGUL LETTER RIEUL-KIYEOK" #xFFAA)
+    ("HALFWIDTH HANGUL LETTER RIEUL-MIEUM" #xFFAB)
+    ("HALFWIDTH HANGUL LETTER RIEUL-PIEUP" #xFFAC)
+    ("HALFWIDTH HANGUL LETTER RIEUL-SIOS" #xFFAD)
+    ("HALFWIDTH HANGUL LETTER RIEUL-THIEUTH" #xFFAE)
+    ("HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH" #xFFAF)
+    ("HALFWIDTH HANGUL LETTER RIEUL-HIEUH" #xFFB0)
+    ("HALFWIDTH HANGUL LETTER MIEUM" #xFFB1)
+    ("HALFWIDTH HANGUL LETTER PIEUP" #xFFB2)
+    ("HALFWIDTH HANGUL LETTER SSANGPIEUP" #xFFB3)
+    ("HALFWIDTH HANGUL LETTER PIEUP-SIOS" #xFFB4)
+    ("HALFWIDTH HANGUL LETTER SIOS" #xFFB5)
+    ("HALFWIDTH HANGUL LETTER SSANGSIOS" #xFFB6)
+    ("HALFWIDTH HANGUL LETTER IEUNG" #xFFB7)
+    ("HALFWIDTH HANGUL LETTER CIEUC" #xFFB8)
+    ("HALFWIDTH HANGUL LETTER SSANGCIEUC" #xFFB9)
+    ("HALFWIDTH HANGUL LETTER CHIEUCH" #xFFBA)
+    ("HALFWIDTH HANGUL LETTER KHIEUKH" #xFFBB)
+    ("HALFWIDTH HANGUL LETTER THIEUTH" #xFFBC)
+    ("HALFWIDTH HANGUL LETTER PHIEUPH" #xFFBD)
+    ("HALFWIDTH HANGUL LETTER HIEUH" #xFFBE)
+    ("HALFWIDTH HANGUL LETTER A" #xFFC2)
+    ("HALFWIDTH HANGUL LETTER AE" #xFFC3)
+    ("HALFWIDTH HANGUL LETTER YA" #xFFC4)
+    ("HALFWIDTH HANGUL LETTER YAE" #xFFC5)
+    ("HALFWIDTH HANGUL LETTER EO" #xFFC6)
+    ("HALFWIDTH HANGUL LETTER E" #xFFC7)
+    ("HALFWIDTH HANGUL LETTER YEO" #xFFCA)
+    ("HALFWIDTH HANGUL LETTER YE" #xFFCB)
+    ("HALFWIDTH HANGUL LETTER O" #xFFCC)
+    ("HALFWIDTH HANGUL LETTER WA" #xFFCD)
+    ("HALFWIDTH HANGUL LETTER WAE" #xFFCE)
+    ("HALFWIDTH HANGUL LETTER OE" #xFFCF)
+    ("HALFWIDTH HANGUL LETTER YO" #xFFD2)
+    ("HALFWIDTH HANGUL LETTER U" #xFFD3)
+    ("HALFWIDTH HANGUL LETTER WEO" #xFFD4)
+    ("HALFWIDTH HANGUL LETTER WE" #xFFD5)
+    ("HALFWIDTH HANGUL LETTER WI" #xFFD6)
+    ("HALFWIDTH HANGUL LETTER YU" #xFFD7)
+    ("HALFWIDTH HANGUL LETTER EU" #xFFDA)
+    ("HALFWIDTH HANGUL LETTER YI" #xFFDB)
+    ("HALFWIDTH HANGUL LETTER I" #xFFDC)
+    ("FULLWIDTH CENT SIGN" #xFFE0)
+    ("FULLWIDTH POUND SIGN" #xFFE1)
+    ("FULLWIDTH NOT SIGN" #xFFE2)
+    ("FULLWIDTH MACRON" #xFFE3)
+    ("FULLWIDTH BROKEN BAR" #xFFE4)
+    ("FULLWIDTH YEN SIGN" #xFFE5)
+    ("FULLWIDTH WON SIGN" #xFFE6)
+    ("HALFWIDTH FORMS LIGHT VERTICAL" #xFFE8)
+    ("HALFWIDTH LEFTWARDS ARROW" #xFFE9)
+    ("HALFWIDTH UPWARDS ARROW" #xFFEA)
+    ("HALFWIDTH RIGHTWARDS ARROW" #xFFEB)
+    ("HALFWIDTH DOWNWARDS ARROW" #xFFEC)
+    ("HALFWIDTH BLACK SQUARE" #xFFED)
+    ("HALFWIDTH WHITE CIRCLE" #xFFEE)
+    ))
diff --git a/lisp/nxml/char-name/unicode/0FFF0-0FFFF.el b/lisp/nxml/char-name/unicode/0FFF0-0FFFF.el
new file mode 100644 (file)
index 0000000..f381a28
--- /dev/null
@@ -0,0 +1,7 @@
+(nxml-define-char-name-set 'specials
+  '(("INTERLINEAR ANNOTATION ANCHOR" #xFFF9)
+    ("INTERLINEAR ANNOTATION SEPARATOR" #xFFFA)
+    ("INTERLINEAR ANNOTATION TERMINATOR" #xFFFB)
+    ("OBJECT REPLACEMENT CHARACTER" #xFFFC)
+    ("REPLACEMENT CHARACTER" #xFFFD)
+    ))
diff --git a/lisp/nxml/char-name/unicode/10300-1032F.el b/lisp/nxml/char-name/unicode/10300-1032F.el
new file mode 100644 (file)
index 0000000..fbb5cb8
--- /dev/null
@@ -0,0 +1,37 @@
+(nxml-define-char-name-set 'old-italic
+  '(("OLD ITALIC LETTER A" #x10300)
+    ("OLD ITALIC LETTER BE" #x10301)
+    ("OLD ITALIC LETTER KE" #x10302)
+    ("OLD ITALIC LETTER DE" #x10303)
+    ("OLD ITALIC LETTER E" #x10304)
+    ("OLD ITALIC LETTER VE" #x10305)
+    ("OLD ITALIC LETTER ZE" #x10306)
+    ("OLD ITALIC LETTER HE" #x10307)
+    ("OLD ITALIC LETTER THE" #x10308)
+    ("OLD ITALIC LETTER I" #x10309)
+    ("OLD ITALIC LETTER KA" #x1030A)
+    ("OLD ITALIC LETTER EL" #x1030B)
+    ("OLD ITALIC LETTER EM" #x1030C)
+    ("OLD ITALIC LETTER EN" #x1030D)
+    ("OLD ITALIC LETTER ESH" #x1030E)
+    ("OLD ITALIC LETTER O" #x1030F)
+    ("OLD ITALIC LETTER PE" #x10310)
+    ("OLD ITALIC LETTER SHE" #x10311)
+    ("OLD ITALIC LETTER KU" #x10312)
+    ("OLD ITALIC LETTER ER" #x10313)
+    ("OLD ITALIC LETTER ES" #x10314)
+    ("OLD ITALIC LETTER TE" #x10315)
+    ("OLD ITALIC LETTER U" #x10316)
+    ("OLD ITALIC LETTER EKS" #x10317)
+    ("OLD ITALIC LETTER PHE" #x10318)
+    ("OLD ITALIC LETTER KHE" #x10319)
+    ("OLD ITALIC LETTER EF" #x1031A)
+    ("OLD ITALIC LETTER ERS" #x1031B)
+    ("OLD ITALIC LETTER CHE" #x1031C)
+    ("OLD ITALIC LETTER II" #x1031D)
+    ("OLD ITALIC LETTER UU" #x1031E)
+    ("OLD ITALIC NUMERAL ONE" #x10320)
+    ("OLD ITALIC NUMERAL FIVE" #x10321)
+    ("OLD ITALIC NUMERAL TEN" #x10322)
+    ("OLD ITALIC NUMERAL FIFTY" #x10323)
+    ))
diff --git a/lisp/nxml/char-name/unicode/10330-1034F.el b/lisp/nxml/char-name/unicode/10330-1034F.el
new file mode 100644 (file)
index 0000000..38ba298
--- /dev/null
@@ -0,0 +1,29 @@
+(nxml-define-char-name-set 'gothic
+  '(("GOTHIC LETTER AHSA" #x10330)
+    ("GOTHIC LETTER BAIRKAN" #x10331)
+    ("GOTHIC LETTER GIBA" #x10332)
+    ("GOTHIC LETTER DAGS" #x10333)
+    ("GOTHIC LETTER AIHVUS" #x10334)
+    ("GOTHIC LETTER QAIRTHRA" #x10335)
+    ("GOTHIC LETTER IUJA" #x10336)
+    ("GOTHIC LETTER HAGL" #x10337)
+    ("GOTHIC LETTER THIUTH" #x10338)
+    ("GOTHIC LETTER EIS" #x10339)
+    ("GOTHIC LETTER KUSMA" #x1033A)
+    ("GOTHIC LETTER LAGUS" #x1033B)
+    ("GOTHIC LETTER MANNA" #x1033C)
+    ("GOTHIC LETTER NAUTHS" #x1033D)
+    ("GOTHIC LETTER JER" #x1033E)
+    ("GOTHIC LETTER URUS" #x1033F)
+    ("GOTHIC LETTER PAIRTHRA" #x10340)
+    ("GOTHIC LETTER NINETY" #x10341)
+    ("GOTHIC LETTER RAIDA" #x10342)
+    ("GOTHIC LETTER SAUIL" #x10343)
+    ("GOTHIC LETTER TEIWS" #x10344)
+    ("GOTHIC LETTER WINJA" #x10345)
+    ("GOTHIC LETTER FAIHU" #x10346)
+    ("GOTHIC LETTER IGGWS" #x10347)
+    ("GOTHIC LETTER HWAIR" #x10348)
+    ("GOTHIC LETTER OTHAL" #x10349)
+    ("GOTHIC LETTER NINE HUNDRED" #x1034A)
+    ))
diff --git a/lisp/nxml/char-name/unicode/10400-1044F.el b/lisp/nxml/char-name/unicode/10400-1044F.el
new file mode 100644 (file)
index 0000000..1637cf6
--- /dev/null
@@ -0,0 +1,78 @@
+(nxml-define-char-name-set 'deseret
+  '(("DESERET CAPITAL LETTER LONG I" #x10400)
+    ("DESERET CAPITAL LETTER LONG E" #x10401)
+    ("DESERET CAPITAL LETTER LONG A" #x10402)
+    ("DESERET CAPITAL LETTER LONG AH" #x10403)
+    ("DESERET CAPITAL LETTER LONG O" #x10404)
+    ("DESERET CAPITAL LETTER LONG OO" #x10405)
+    ("DESERET CAPITAL LETTER SHORT I" #x10406)
+    ("DESERET CAPITAL LETTER SHORT E" #x10407)
+    ("DESERET CAPITAL LETTER SHORT A" #x10408)
+    ("DESERET CAPITAL LETTER SHORT AH" #x10409)
+    ("DESERET CAPITAL LETTER SHORT O" #x1040A)
+    ("DESERET CAPITAL LETTER SHORT OO" #x1040B)
+    ("DESERET CAPITAL LETTER AY" #x1040C)
+    ("DESERET CAPITAL LETTER OW" #x1040D)
+    ("DESERET CAPITAL LETTER WU" #x1040E)
+    ("DESERET CAPITAL LETTER YEE" #x1040F)
+    ("DESERET CAPITAL LETTER H" #x10410)
+    ("DESERET CAPITAL LETTER PEE" #x10411)
+    ("DESERET CAPITAL LETTER BEE" #x10412)
+    ("DESERET CAPITAL LETTER TEE" #x10413)
+    ("DESERET CAPITAL LETTER DEE" #x10414)
+    ("DESERET CAPITAL LETTER CHEE" #x10415)
+    ("DESERET CAPITAL LETTER JEE" #x10416)
+    ("DESERET CAPITAL LETTER KAY" #x10417)
+    ("DESERET CAPITAL LETTER GAY" #x10418)
+    ("DESERET CAPITAL LETTER EF" #x10419)
+    ("DESERET CAPITAL LETTER VEE" #x1041A)
+    ("DESERET CAPITAL LETTER ETH" #x1041B)
+    ("DESERET CAPITAL LETTER THEE" #x1041C)
+    ("DESERET CAPITAL LETTER ES" #x1041D)
+    ("DESERET CAPITAL LETTER ZEE" #x1041E)
+    ("DESERET CAPITAL LETTER ESH" #x1041F)
+    ("DESERET CAPITAL LETTER ZHEE" #x10420)
+    ("DESERET CAPITAL LETTER ER" #x10421)
+    ("DESERET CAPITAL LETTER EL" #x10422)
+    ("DESERET CAPITAL LETTER EM" #x10423)
+    ("DESERET CAPITAL LETTER EN" #x10424)
+    ("DESERET CAPITAL LETTER ENG" #x10425)
+    ("DESERET SMALL LETTER LONG I" #x10428)
+    ("DESERET SMALL LETTER LONG E" #x10429)
+    ("DESERET SMALL LETTER LONG A" #x1042A)
+    ("DESERET SMALL LETTER LONG AH" #x1042B)
+    ("DESERET SMALL LETTER LONG O" #x1042C)
+    ("DESERET SMALL LETTER LONG OO" #x1042D)
+    ("DESERET SMALL LETTER SHORT I" #x1042E)
+    ("DESERET SMALL LETTER SHORT E" #x1042F)
+    ("DESERET SMALL LETTER SHORT A" #x10430)
+    ("DESERET SMALL LETTER SHORT AH" #x10431)
+    ("DESERET SMALL LETTER SHORT O" #x10432)
+    ("DESERET SMALL LETTER SHORT OO" #x10433)
+    ("DESERET SMALL LETTER AY" #x10434)
+    ("DESERET SMALL LETTER OW" #x10435)
+    ("DESERET SMALL LETTER WU" #x10436)
+    ("DESERET SMALL LETTER YEE" #x10437)
+    ("DESERET SMALL LETTER H" #x10438)
+    ("DESERET SMALL LETTER PEE" #x10439)
+    ("DESERET SMALL LETTER BEE" #x1043A)
+    ("DESERET SMALL LETTER TEE" #x1043B)
+    ("DESERET SMALL LETTER DEE" #x1043C)
+    ("DESERET SMALL LETTER CHEE" #x1043D)
+    ("DESERET SMALL LETTER JEE" #x1043E)
+    ("DESERET SMALL LETTER KAY" #x1043F)
+    ("DESERET SMALL LETTER GAY" #x10440)
+    ("DESERET SMALL LETTER EF" #x10441)
+    ("DESERET SMALL LETTER VEE" #x10442)
+    ("DESERET SMALL LETTER ETH" #x10443)
+    ("DESERET SMALL LETTER THEE" #x10444)
+    ("DESERET SMALL LETTER ES" #x10445)
+    ("DESERET SMALL LETTER ZEE" #x10446)
+    ("DESERET SMALL LETTER ESH" #x10447)
+    ("DESERET SMALL LETTER ZHEE" #x10448)
+    ("DESERET SMALL LETTER ER" #x10449)
+    ("DESERET SMALL LETTER EL" #x1044A)
+    ("DESERET SMALL LETTER EM" #x1044B)
+    ("DESERET SMALL LETTER EN" #x1044C)
+    ("DESERET SMALL LETTER ENG" #x1044D)
+    ))
diff --git a/lisp/nxml/char-name/unicode/1D000-1D0FF.el b/lisp/nxml/char-name/unicode/1D000-1D0FF.el
new file mode 100644 (file)
index 0000000..f1a6f36
--- /dev/null
@@ -0,0 +1,248 @@
+(nxml-define-char-name-set 'byzantine-musical-symbols
+  '(("BYZANTINE MUSICAL SYMBOL PSILI" #x1D000)
+    ("BYZANTINE MUSICAL SYMBOL DASEIA" #x1D001)
+    ("BYZANTINE MUSICAL SYMBOL PERISPOMENI" #x1D002)
+    ("BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON" #x1D003)
+    ("BYZANTINE MUSICAL SYMBOL OXEIA DIPLI" #x1D004)
+    ("BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON" #x1D005)
+    ("BYZANTINE MUSICAL SYMBOL VAREIA DIPLI" #x1D006)
+    ("BYZANTINE MUSICAL SYMBOL KATHISTI" #x1D007)
+    ("BYZANTINE MUSICAL SYMBOL SYRMATIKI" #x1D008)
+    ("BYZANTINE MUSICAL SYMBOL PARAKLITIKI" #x1D009)
+    ("BYZANTINE MUSICAL SYMBOL YPOKRISIS" #x1D00A)
+    ("BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI" #x1D00B)
+    ("BYZANTINE MUSICAL SYMBOL KREMASTI" #x1D00C)
+    ("BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON" #x1D00D)
+    ("BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON" #x1D00E)
+    ("BYZANTINE MUSICAL SYMBOL TELEIA" #x1D00F)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA" #x1D010)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOS" #x1D011)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI" #x1D012)
+    ("BYZANTINE MUSICAL SYMBOL SYNEVMA" #x1D013)
+    ("BYZANTINE MUSICAL SYMBOL THITA" #x1D014)
+    ("BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION" #x1D015)
+    ("BYZANTINE MUSICAL SYMBOL GORGON ARCHAION" #x1D016)
+    ("BYZANTINE MUSICAL SYMBOL PSILON" #x1D017)
+    ("BYZANTINE MUSICAL SYMBOL CHAMILON" #x1D018)
+    ("BYZANTINE MUSICAL SYMBOL VATHY" #x1D019)
+    ("BYZANTINE MUSICAL SYMBOL ISON ARCHAION" #x1D01A)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION" #x1D01B)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION" #x1D01C)
+    ("BYZANTINE MUSICAL SYMBOL SAXIMATA" #x1D01D)
+    ("BYZANTINE MUSICAL SYMBOL PARICHON" #x1D01E)
+    ("BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA" #x1D01F)
+    ("BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION" #x1D020)
+    ("BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION" #x1D021)
+    ("BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION" #x1D022)
+    ("BYZANTINE MUSICAL SYMBOL APOTHEMA" #x1D023)
+    ("BYZANTINE MUSICAL SYMBOL KLASMA" #x1D024)
+    ("BYZANTINE MUSICAL SYMBOL REVMA" #x1D025)
+    ("BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION" #x1D026)
+    ("BYZANTINE MUSICAL SYMBOL TINAGMA" #x1D027)
+    ("BYZANTINE MUSICAL SYMBOL ANATRICHISMA" #x1D028)
+    ("BYZANTINE MUSICAL SYMBOL SEISMA" #x1D029)
+    ("BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION" #x1D02A)
+    ("BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU" #x1D02B)
+    ("BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION" #x1D02C)
+    ("BYZANTINE MUSICAL SYMBOL THEMA" #x1D02D)
+    ("BYZANTINE MUSICAL SYMBOL LEMOI" #x1D02E)
+    ("BYZANTINE MUSICAL SYMBOL DYO" #x1D02F)
+    ("BYZANTINE MUSICAL SYMBOL TRIA" #x1D030)
+    ("BYZANTINE MUSICAL SYMBOL TESSERA" #x1D031)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMATA" #x1D032)
+    ("BYZANTINE MUSICAL SYMBOL APESO EXO NEO" #x1D033)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION" #x1D034)
+    ("BYZANTINE MUSICAL SYMBOL IMIFTHORA" #x1D035)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION" #x1D036)
+    ("BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON" #x1D037)
+    ("BYZANTINE MUSICAL SYMBOL PELASTON" #x1D038)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTON" #x1D039)
+    ("BYZANTINE MUSICAL SYMBOL KONTEVMA" #x1D03A)
+    ("BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION" #x1D03B)
+    ("BYZANTINE MUSICAL SYMBOL RAPISMA" #x1D03C)
+    ("BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION" #x1D03D)
+    ("BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION" #x1D03E)
+    ("BYZANTINE MUSICAL SYMBOL ICHADIN" #x1D03F)
+    ("BYZANTINE MUSICAL SYMBOL NANA" #x1D040)
+    ("BYZANTINE MUSICAL SYMBOL PETASMA" #x1D041)
+    ("BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO" #x1D042)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKON ALLO" #x1D043)
+    ("BYZANTINE MUSICAL SYMBOL STRAGGISMATA" #x1D044)
+    ("BYZANTINE MUSICAL SYMBOL GRONTHISMATA" #x1D045)
+    ("BYZANTINE MUSICAL SYMBOL ISON NEO" #x1D046)
+    ("BYZANTINE MUSICAL SYMBOL OLIGON NEO" #x1D047)
+    ("BYZANTINE MUSICAL SYMBOL OXEIA NEO" #x1D048)
+    ("BYZANTINE MUSICAL SYMBOL PETASTI" #x1D049)
+    ("BYZANTINE MUSICAL SYMBOL KOUFISMA" #x1D04A)
+    ("BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA" #x1D04B)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA" #x1D04C)
+    ("BYZANTINE MUSICAL SYMBOL PELASTON NEO" #x1D04D)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO" #x1D04E)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO" #x1D04F)
+    ("BYZANTINE MUSICAL SYMBOL YPSILI" #x1D050)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO" #x1D051)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO" #x1D052)
+    ("BYZANTINE MUSICAL SYMBOL YPORROI" #x1D053)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON" #x1D054)
+    ("BYZANTINE MUSICAL SYMBOL ELAFRON" #x1D055)
+    ("BYZANTINE MUSICAL SYMBOL CHAMILI" #x1D056)
+    ("BYZANTINE MUSICAL SYMBOL MIKRON ISON" #x1D057)
+    ("BYZANTINE MUSICAL SYMBOL VAREIA NEO" #x1D058)
+    ("BYZANTINE MUSICAL SYMBOL PIASMA NEO" #x1D059)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTON NEO" #x1D05A)
+    ("BYZANTINE MUSICAL SYMBOL OMALON" #x1D05B)
+    ("BYZANTINE MUSICAL SYMBOL ANTIKENOMA" #x1D05C)
+    ("BYZANTINE MUSICAL SYMBOL LYGISMA" #x1D05D)
+    ("BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO" #x1D05E)
+    ("BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO" #x1D05F)
+    ("BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA" #x1D060)
+    ("BYZANTINE MUSICAL SYMBOL KYLISMA" #x1D061)
+    ("BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA" #x1D062)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKON NEO" #x1D063)
+    ("BYZANTINE MUSICAL SYMBOL EKSTREPTON" #x1D064)
+    ("BYZANTINE MUSICAL SYMBOL SYNAGMA NEO" #x1D065)
+    ("BYZANTINE MUSICAL SYMBOL SYRMA" #x1D066)
+    ("BYZANTINE MUSICAL SYMBOL CHOREVMA NEO" #x1D067)
+    ("BYZANTINE MUSICAL SYMBOL EPEGERMA" #x1D068)
+    ("BYZANTINE MUSICAL SYMBOL SEISMA NEO" #x1D069)
+    ("BYZANTINE MUSICAL SYMBOL XIRON KLASMA" #x1D06A)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON" #x1D06B)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA" #x1D06C)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA" #x1D06D)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA" #x1D06E)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA" #x1D06F)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA" #x1D070)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA" #x1D071)
+    ("BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON" #x1D072)
+    ("BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON" #x1D073)
+    ("BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON" #x1D074)
+    ("BYZANTINE MUSICAL SYMBOL OYRANISMA NEO" #x1D075)
+    ("BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO" #x1D076)
+    ("BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO" #x1D077)
+    ("BYZANTINE MUSICAL SYMBOL THEMA APLOUN" #x1D078)
+    ("BYZANTINE MUSICAL SYMBOL THES KAI APOTHES" #x1D079)
+    ("BYZANTINE MUSICAL SYMBOL KATAVASMA" #x1D07A)
+    ("BYZANTINE MUSICAL SYMBOL ENDOFONON" #x1D07B)
+    ("BYZANTINE MUSICAL SYMBOL YFEN KATO" #x1D07C)
+    ("BYZANTINE MUSICAL SYMBOL YFEN ANO" #x1D07D)
+    ("BYZANTINE MUSICAL SYMBOL STAVROS" #x1D07E)
+    ("BYZANTINE MUSICAL SYMBOL KLASMA ANO" #x1D07F)
+    ("BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION" #x1D080)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION" #x1D081)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMA ALLO" #x1D082)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMA NEO" #x1D083)
+    ("BYZANTINE MUSICAL SYMBOL APODERMA NEO" #x1D084)
+    ("BYZANTINE MUSICAL SYMBOL APLI" #x1D085)
+    ("BYZANTINE MUSICAL SYMBOL DIPLI" #x1D086)
+    ("BYZANTINE MUSICAL SYMBOL TRIPLI" #x1D087)
+    ("BYZANTINE MUSICAL SYMBOL TETRAPLI" #x1D088)
+    ("BYZANTINE MUSICAL SYMBOL KORONIS" #x1D089)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU" #x1D08A)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON" #x1D08B)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON" #x1D08C)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON" #x1D08D)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU" #x1D08E)
+    ("BYZANTINE MUSICAL SYMBOL GORGON NEO ANO" #x1D08F)
+    ("BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA" #x1D090)
+    ("BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA" #x1D091)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON" #x1D092)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO" #x1D093)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO" #x1D094)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA" #x1D095)
+    ("BYZANTINE MUSICAL SYMBOL TRIGORGON" #x1D096)
+    ("BYZANTINE MUSICAL SYMBOL ARGON" #x1D097)
+    ("BYZANTINE MUSICAL SYMBOL IMIDIARGON" #x1D098)
+    ("BYZANTINE MUSICAL SYMBOL DIARGON" #x1D099)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI" #x1D09A)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI" #x1D09B)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI ARGI" #x1D09C)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI METRIA" #x1D09D)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI MESI" #x1D09E)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI GORGI" #x1D09F)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI" #x1D0A0)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI" #x1D0A1)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS" #x1D0A2)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS" #x1D0A3)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS" #x1D0A4)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS" #x1D0A5)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS" #x1D0A6)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS" #x1D0A7)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS" #x1D0A8)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS" #x1D0A9)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS" #x1D0AA)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS" #x1D0AB)
+    ("BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS" #x1D0AC)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS" #x1D0AD)
+    ("BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS" #x1D0AE)
+    ("BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS" #x1D0AF)
+    ("BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS" #x1D0B0)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS" #x1D0B1)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS" #x1D0B2)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS" #x1D0B3)
+    ("BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN" #x1D0B4)
+    ("BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN" #x1D0B5)
+    ("BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU" #x1D0B6)
+    ("BYZANTINE MUSICAL SYMBOL IMIFONON" #x1D0B7)
+    ("BYZANTINE MUSICAL SYMBOL IMIFTHORON" #x1D0B8)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU" #x1D0B9)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA" #x1D0BA)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA" #x1D0BB)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS" #x1D0BC)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI" #x1D0BD)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI" #x1D0BE)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE" #x1D0BF)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO" #x1D0C0)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO" #x1D0C1)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO" #x1D0C2)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS" #x1D0C3)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS" #x1D0C4)
+    ("BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS" #x1D0C5)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI" #x1D0C6)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA NENANO" #x1D0C7)
+    ("BYZANTINE MUSICAL SYMBOL CHROA ZYGOS" #x1D0C8)
+    ("BYZANTINE MUSICAL SYMBOL CHROA KLITON" #x1D0C9)
+    ("BYZANTINE MUSICAL SYMBOL CHROA SPATHI" #x1D0CA)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION" #x1D0CB)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA" #x1D0CC)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION" #x1D0CD)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION" #x1D0CE)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION" #x1D0CF)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA" #x1D0D0)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA" #x1D0D1)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA" #x1D0D2)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA" #x1D0D3)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA" #x1D0D4)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA" #x1D0D5)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA" #x1D0D6)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA" #x1D0D7)
+    ("BYZANTINE MUSICAL SYMBOL GENIKI DIESIS" #x1D0D8)
+    ("BYZANTINE MUSICAL SYMBOL GENIKI YFESIS" #x1D0D9)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI" #x1D0DA)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI" #x1D0DB)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI" #x1D0DC)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS" #x1D0DD)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS" #x1D0DE)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU" #x1D0DF)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU" #x1D0E0)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU" #x1D0E1)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS" #x1D0E2)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU" #x1D0E3)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU" #x1D0E4)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU" #x1D0E5)
+    ("BYZANTINE MUSICAL SYMBOL DIGRAMMA GG" #x1D0E6)
+    ("BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU" #x1D0E7)
+    ("BYZANTINE MUSICAL SYMBOL STIGMA" #x1D0E8)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO PA" #x1D0E9)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO VOU" #x1D0EA)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO GA" #x1D0EB)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO DI" #x1D0EC)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO KE" #x1D0ED)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO ZO" #x1D0EE)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO NI" #x1D0EF)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO" #x1D0F0)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO" #x1D0F1)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO" #x1D0F2)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO" #x1D0F3)
+    ("BYZANTINE MUSICAL SYMBOL KLASMA KATO" #x1D0F4)
+    ("BYZANTINE MUSICAL SYMBOL GORGON NEO KATO" #x1D0F5)
+    ))
diff --git a/lisp/nxml/char-name/unicode/1D100-1D1FF.el b/lisp/nxml/char-name/unicode/1D100-1D1FF.el
new file mode 100644 (file)
index 0000000..29803dd
--- /dev/null
@@ -0,0 +1,221 @@
+(nxml-define-char-name-set 'musical-symbols
+  '(("MUSICAL SYMBOL SINGLE BARLINE" #x1D100)
+    ("MUSICAL SYMBOL DOUBLE BARLINE" #x1D101)
+    ("MUSICAL SYMBOL FINAL BARLINE" #x1D102)
+    ("MUSICAL SYMBOL REVERSE FINAL BARLINE" #x1D103)
+    ("MUSICAL SYMBOL DASHED BARLINE" #x1D104)
+    ("MUSICAL SYMBOL SHORT BARLINE" #x1D105)
+    ("MUSICAL SYMBOL LEFT REPEAT SIGN" #x1D106)
+    ("MUSICAL SYMBOL RIGHT REPEAT SIGN" #x1D107)
+    ("MUSICAL SYMBOL REPEAT DOTS" #x1D108)
+    ("MUSICAL SYMBOL DAL SEGNO" #x1D109)
+    ("MUSICAL SYMBOL DA CAPO" #x1D10A)
+    ("MUSICAL SYMBOL SEGNO" #x1D10B)
+    ("MUSICAL SYMBOL CODA" #x1D10C)
+    ("MUSICAL SYMBOL REPEATED FIGURE-1" #x1D10D)
+    ("MUSICAL SYMBOL REPEATED FIGURE-2" #x1D10E)
+    ("MUSICAL SYMBOL REPEATED FIGURE-3" #x1D10F)
+    ("MUSICAL SYMBOL FERMATA" #x1D110)
+    ("MUSICAL SYMBOL FERMATA BELOW" #x1D111)
+    ("MUSICAL SYMBOL BREATH MARK" #x1D112)
+    ("MUSICAL SYMBOL CAESURA" #x1D113)
+    ("MUSICAL SYMBOL BRACE" #x1D114)
+    ("MUSICAL SYMBOL BRACKET" #x1D115)
+    ("MUSICAL SYMBOL ONE-LINE STAFF" #x1D116)
+    ("MUSICAL SYMBOL TWO-LINE STAFF" #x1D117)
+    ("MUSICAL SYMBOL THREE-LINE STAFF" #x1D118)
+    ("MUSICAL SYMBOL FOUR-LINE STAFF" #x1D119)
+    ("MUSICAL SYMBOL FIVE-LINE STAFF" #x1D11A)
+    ("MUSICAL SYMBOL SIX-LINE STAFF" #x1D11B)
+    ("MUSICAL SYMBOL SIX-STRING FRETBOARD" #x1D11C)
+    ("MUSICAL SYMBOL FOUR-STRING FRETBOARD" #x1D11D)
+    ("MUSICAL SYMBOL G CLEF" #x1D11E)
+    ("MUSICAL SYMBOL G CLEF OTTAVA ALTA" #x1D11F)
+    ("MUSICAL SYMBOL G CLEF OTTAVA BASSA" #x1D120)
+    ("MUSICAL SYMBOL C CLEF" #x1D121)
+    ("MUSICAL SYMBOL F CLEF" #x1D122)
+    ("MUSICAL SYMBOL F CLEF OTTAVA ALTA" #x1D123)
+    ("MUSICAL SYMBOL F CLEF OTTAVA BASSA" #x1D124)
+    ("MUSICAL SYMBOL DRUM CLEF-1" #x1D125)
+    ("MUSICAL SYMBOL DRUM CLEF-2" #x1D126)
+    ("MUSICAL SYMBOL DOUBLE SHARP" #x1D12A)
+    ("MUSICAL SYMBOL DOUBLE FLAT" #x1D12B)
+    ("MUSICAL SYMBOL FLAT UP" #x1D12C)
+    ("MUSICAL SYMBOL FLAT DOWN" #x1D12D)
+    ("MUSICAL SYMBOL NATURAL UP" #x1D12E)
+    ("MUSICAL SYMBOL NATURAL DOWN" #x1D12F)
+    ("MUSICAL SYMBOL SHARP UP" #x1D130)
+    ("MUSICAL SYMBOL SHARP DOWN" #x1D131)
+    ("MUSICAL SYMBOL QUARTER TONE SHARP" #x1D132)
+    ("MUSICAL SYMBOL QUARTER TONE FLAT" #x1D133)
+    ("MUSICAL SYMBOL COMMON TIME" #x1D134)
+    ("MUSICAL SYMBOL CUT TIME" #x1D135)
+    ("MUSICAL SYMBOL OTTAVA ALTA" #x1D136)
+    ("MUSICAL SYMBOL OTTAVA BASSA" #x1D137)
+    ("MUSICAL SYMBOL QUINDICESIMA ALTA" #x1D138)
+    ("MUSICAL SYMBOL QUINDICESIMA BASSA" #x1D139)
+    ("MUSICAL SYMBOL MULTI REST" #x1D13A)
+    ("MUSICAL SYMBOL WHOLE REST" #x1D13B)
+    ("MUSICAL SYMBOL HALF REST" #x1D13C)
+    ("MUSICAL SYMBOL QUARTER REST" #x1D13D)
+    ("MUSICAL SYMBOL EIGHTH REST" #x1D13E)
+    ("MUSICAL SYMBOL SIXTEENTH REST" #x1D13F)
+    ("MUSICAL SYMBOL THIRTY-SECOND REST" #x1D140)
+    ("MUSICAL SYMBOL SIXTY-FOURTH REST" #x1D141)
+    ("MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" #x1D142)
+    ("MUSICAL SYMBOL X NOTEHEAD" #x1D143)
+    ("MUSICAL SYMBOL PLUS NOTEHEAD" #x1D144)
+    ("MUSICAL SYMBOL CIRCLE X NOTEHEAD" #x1D145)
+    ("MUSICAL SYMBOL SQUARE NOTEHEAD WHITE" #x1D146)
+    ("MUSICAL SYMBOL SQUARE NOTEHEAD BLACK" #x1D147)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" #x1D148)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" #x1D149)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE" #x1D14A)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK" #x1D14B)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE" #x1D14C)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK" #x1D14D)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE" #x1D14E)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK" #x1D14F)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE" #x1D150)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK" #x1D151)
+    ("MUSICAL SYMBOL MOON NOTEHEAD WHITE" #x1D152)
+    ("MUSICAL SYMBOL MOON NOTEHEAD BLACK" #x1D153)
+    ("MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE" #x1D154)
+    ("MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK" #x1D155)
+    ("MUSICAL SYMBOL PARENTHESIS NOTEHEAD" #x1D156)
+    ("MUSICAL SYMBOL VOID NOTEHEAD" #x1D157)
+    ("MUSICAL SYMBOL NOTEHEAD BLACK" #x1D158)
+    ("MUSICAL SYMBOL NULL NOTEHEAD" #x1D159)
+    ("MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE" #x1D15A)
+    ("MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK" #x1D15B)
+    ("MUSICAL SYMBOL BREVE" #x1D15C)
+    ("MUSICAL SYMBOL WHOLE NOTE" #x1D15D)
+    ("MUSICAL SYMBOL HALF NOTE" #x1D15E)
+    ("MUSICAL SYMBOL QUARTER NOTE" #x1D15F)
+    ("MUSICAL SYMBOL EIGHTH NOTE" #x1D160)
+    ("MUSICAL SYMBOL SIXTEENTH NOTE" #x1D161)
+    ("MUSICAL SYMBOL THIRTY-SECOND NOTE" #x1D162)
+    ("MUSICAL SYMBOL SIXTY-FOURTH NOTE" #x1D163)
+    ("MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE" #x1D164)
+    ("MUSICAL SYMBOL COMBINING STEM" #x1D165)
+    ("MUSICAL SYMBOL COMBINING SPRECHGESANG STEM" #x1D166)
+    ("MUSICAL SYMBOL COMBINING TREMOLO-1" #x1D167)
+    ("MUSICAL SYMBOL COMBINING TREMOLO-2" #x1D168)
+    ("MUSICAL SYMBOL COMBINING TREMOLO-3" #x1D169)
+    ("MUSICAL SYMBOL FINGERED TREMOLO-1" #x1D16A)
+    ("MUSICAL SYMBOL FINGERED TREMOLO-2" #x1D16B)
+    ("MUSICAL SYMBOL FINGERED TREMOLO-3" #x1D16C)
+    ("MUSICAL SYMBOL COMBINING AUGMENTATION DOT" #x1D16D)
+    ("MUSICAL SYMBOL COMBINING FLAG-1" #x1D16E)
+    ("MUSICAL SYMBOL COMBINING FLAG-2" #x1D16F)
+    ("MUSICAL SYMBOL COMBINING FLAG-3" #x1D170)
+    ("MUSICAL SYMBOL COMBINING FLAG-4" #x1D171)
+    ("MUSICAL SYMBOL COMBINING FLAG-5" #x1D172)
+    ("MUSICAL SYMBOL BEGIN BEAM" #x1D173)
+    ("MUSICAL SYMBOL END BEAM" #x1D174)
+    ("MUSICAL SYMBOL BEGIN TIE" #x1D175)
+    ("MUSICAL SYMBOL END TIE" #x1D176)
+    ("MUSICAL SYMBOL BEGIN SLUR" #x1D177)
+    ("MUSICAL SYMBOL END SLUR" #x1D178)
+    ("MUSICAL SYMBOL BEGIN PHRASE" #x1D179)
+    ("MUSICAL SYMBOL END PHRASE" #x1D17A)
+    ("MUSICAL SYMBOL COMBINING ACCENT" #x1D17B)
+    ("MUSICAL SYMBOL COMBINING STACCATO" #x1D17C)
+    ("MUSICAL SYMBOL COMBINING TENUTO" #x1D17D)
+    ("MUSICAL SYMBOL COMBINING STACCATISSIMO" #x1D17E)
+    ("MUSICAL SYMBOL COMBINING MARCATO" #x1D17F)
+    ("MUSICAL SYMBOL COMBINING MARCATO-STACCATO" #x1D180)
+    ("MUSICAL SYMBOL COMBINING ACCENT-STACCATO" #x1D181)
+    ("MUSICAL SYMBOL COMBINING LOURE" #x1D182)
+    ("MUSICAL SYMBOL ARPEGGIATO UP" #x1D183)
+    ("MUSICAL SYMBOL ARPEGGIATO DOWN" #x1D184)
+    ("MUSICAL SYMBOL COMBINING DOIT" #x1D185)
+    ("MUSICAL SYMBOL COMBINING RIP" #x1D186)
+    ("MUSICAL SYMBOL COMBINING FLIP" #x1D187)
+    ("MUSICAL SYMBOL COMBINING SMEAR" #x1D188)
+    ("MUSICAL SYMBOL COMBINING BEND" #x1D189)
+    ("MUSICAL SYMBOL COMBINING DOUBLE TONGUE" #x1D18A)
+    ("MUSICAL SYMBOL COMBINING TRIPLE TONGUE" #x1D18B)
+    ("MUSICAL SYMBOL RINFORZANDO" #x1D18C)
+    ("MUSICAL SYMBOL SUBITO" #x1D18D)
+    ("MUSICAL SYMBOL Z" #x1D18E)
+    ("MUSICAL SYMBOL PIANO" #x1D18F)
+    ("MUSICAL SYMBOL MEZZO" #x1D190)
+    ("MUSICAL SYMBOL FORTE" #x1D191)
+    ("MUSICAL SYMBOL CRESCENDO" #x1D192)
+    ("MUSICAL SYMBOL DECRESCENDO" #x1D193)
+    ("MUSICAL SYMBOL GRACE NOTE SLASH" #x1D194)
+    ("MUSICAL SYMBOL GRACE NOTE NO SLASH" #x1D195)
+    ("MUSICAL SYMBOL TR" #x1D196)
+    ("MUSICAL SYMBOL TURN" #x1D197)
+    ("MUSICAL SYMBOL INVERTED TURN" #x1D198)
+    ("MUSICAL SYMBOL TURN SLASH" #x1D199)
+    ("MUSICAL SYMBOL TURN UP" #x1D19A)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-1" #x1D19B)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-2" #x1D19C)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-3" #x1D19D)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-4" #x1D19E)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-5" #x1D19F)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-6" #x1D1A0)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-7" #x1D1A1)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-8" #x1D1A2)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-9" #x1D1A3)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-10" #x1D1A4)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-11" #x1D1A5)
+    ("MUSICAL SYMBOL HAUPTSTIMME" #x1D1A6)
+    ("MUSICAL SYMBOL NEBENSTIMME" #x1D1A7)
+    ("MUSICAL SYMBOL END OF STIMME" #x1D1A8)
+    ("MUSICAL SYMBOL DEGREE SLASH" #x1D1A9)
+    ("MUSICAL SYMBOL COMBINING DOWN BOW" #x1D1AA)
+    ("MUSICAL SYMBOL COMBINING UP BOW" #x1D1AB)
+    ("MUSICAL SYMBOL COMBINING HARMONIC" #x1D1AC)
+    ("MUSICAL SYMBOL COMBINING SNAP PIZZICATO" #x1D1AD)
+    ("MUSICAL SYMBOL PEDAL MARK" #x1D1AE)
+    ("MUSICAL SYMBOL PEDAL UP MARK" #x1D1AF)
+    ("MUSICAL SYMBOL HALF PEDAL MARK" #x1D1B0)
+    ("MUSICAL SYMBOL GLISSANDO UP" #x1D1B1)
+    ("MUSICAL SYMBOL GLISSANDO DOWN" #x1D1B2)
+    ("MUSICAL SYMBOL WITH FINGERNAILS" #x1D1B3)
+    ("MUSICAL SYMBOL DAMP" #x1D1B4)
+    ("MUSICAL SYMBOL DAMP ALL" #x1D1B5)
+    ("MUSICAL SYMBOL MAXIMA" #x1D1B6)
+    ("MUSICAL SYMBOL LONGA" #x1D1B7)
+    ("MUSICAL SYMBOL BREVIS" #x1D1B8)
+    ("MUSICAL SYMBOL SEMIBREVIS WHITE" #x1D1B9)
+    ("MUSICAL SYMBOL SEMIBREVIS BLACK" #x1D1BA)
+    ("MUSICAL SYMBOL MINIMA" #x1D1BB)
+    ("MUSICAL SYMBOL MINIMA BLACK" #x1D1BC)
+    ("MUSICAL SYMBOL SEMIMINIMA WHITE" #x1D1BD)
+    ("MUSICAL SYMBOL SEMIMINIMA BLACK" #x1D1BE)
+    ("MUSICAL SYMBOL FUSA WHITE" #x1D1BF)
+    ("MUSICAL SYMBOL FUSA BLACK" #x1D1C0)
+    ("MUSICAL SYMBOL LONGA PERFECTA REST" #x1D1C1)
+    ("MUSICAL SYMBOL LONGA IMPERFECTA REST" #x1D1C2)
+    ("MUSICAL SYMBOL BREVIS REST" #x1D1C3)
+    ("MUSICAL SYMBOL SEMIBREVIS REST" #x1D1C4)
+    ("MUSICAL SYMBOL MINIMA REST" #x1D1C5)
+    ("MUSICAL SYMBOL SEMIMINIMA REST" #x1D1C6)
+    ("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA" #x1D1C7)
+    ("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA" #x1D1C8)
+    ("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1" #x1D1C9)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA" #x1D1CA)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA" #x1D1CB)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1" #x1D1CC)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2" #x1D1CD)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3" #x1D1CE)
+    ("MUSICAL SYMBOL CROIX" #x1D1CF)
+    ("MUSICAL SYMBOL GREGORIAN C CLEF" #x1D1D0)
+    ("MUSICAL SYMBOL GREGORIAN F CLEF" #x1D1D1)
+    ("MUSICAL SYMBOL SQUARE B" #x1D1D2)
+    ("MUSICAL SYMBOL VIRGA" #x1D1D3)
+    ("MUSICAL SYMBOL PODATUS" #x1D1D4)
+    ("MUSICAL SYMBOL CLIVIS" #x1D1D5)
+    ("MUSICAL SYMBOL SCANDICUS" #x1D1D6)
+    ("MUSICAL SYMBOL CLIMACUS" #x1D1D7)
+    ("MUSICAL SYMBOL TORCULUS" #x1D1D8)
+    ("MUSICAL SYMBOL PORRECTUS" #x1D1D9)
+    ("MUSICAL SYMBOL PORRECTUS FLEXUS" #x1D1DA)
+    ("MUSICAL SYMBOL SCANDICUS FLEXUS" #x1D1DB)
+    ("MUSICAL SYMBOL TORCULUS RESUPINUS" #x1D1DC)
+    ("MUSICAL SYMBOL PES SUBPUNCTIS" #x1D1DD)
+    ))
diff --git a/lisp/nxml/char-name/unicode/1D400-1D7FF.el b/lisp/nxml/char-name/unicode/1D400-1D7FF.el
new file mode 100644 (file)
index 0000000..98e8c23
--- /dev/null
@@ -0,0 +1,993 @@
+(nxml-define-char-name-set 'mathematical-alphanumeric-symbols
+  '(("MATHEMATICAL BOLD CAPITAL A" #x1D400)
+    ("MATHEMATICAL BOLD CAPITAL B" #x1D401)
+    ("MATHEMATICAL BOLD CAPITAL C" #x1D402)
+    ("MATHEMATICAL BOLD CAPITAL D" #x1D403)
+    ("MATHEMATICAL BOLD CAPITAL E" #x1D404)
+    ("MATHEMATICAL BOLD CAPITAL F" #x1D405)
+    ("MATHEMATICAL BOLD CAPITAL G" #x1D406)
+    ("MATHEMATICAL BOLD CAPITAL H" #x1D407)
+    ("MATHEMATICAL BOLD CAPITAL I" #x1D408)
+    ("MATHEMATICAL BOLD CAPITAL J" #x1D409)
+    ("MATHEMATICAL BOLD CAPITAL K" #x1D40A)
+    ("MATHEMATICAL BOLD CAPITAL L" #x1D40B)
+    ("MATHEMATICAL BOLD CAPITAL M" #x1D40C)
+    ("MATHEMATICAL BOLD CAPITAL N" #x1D40D)
+    ("MATHEMATICAL BOLD CAPITAL O" #x1D40E)
+    ("MATHEMATICAL BOLD CAPITAL P" #x1D40F)
+    ("MATHEMATICAL BOLD CAPITAL Q" #x1D410)
+    ("MATHEMATICAL BOLD CAPITAL R" #x1D411)
+    ("MATHEMATICAL BOLD CAPITAL S" #x1D412)
+    ("MATHEMATICAL BOLD CAPITAL T" #x1D413)
+    ("MATHEMATICAL BOLD CAPITAL U" #x1D414)
+    ("MATHEMATICAL BOLD CAPITAL V" #x1D415)
+    ("MATHEMATICAL BOLD CAPITAL W" #x1D416)
+    ("MATHEMATICAL BOLD CAPITAL X" #x1D417)
+    ("MATHEMATICAL BOLD CAPITAL Y" #x1D418)
+    ("MATHEMATICAL BOLD CAPITAL Z" #x1D419)
+    ("MATHEMATICAL BOLD SMALL A" #x1D41A)
+    ("MATHEMATICAL BOLD SMALL B" #x1D41B)
+    ("MATHEMATICAL BOLD SMALL C" #x1D41C)
+    ("MATHEMATICAL BOLD SMALL D" #x1D41D)
+    ("MATHEMATICAL BOLD SMALL E" #x1D41E)
+    ("MATHEMATICAL BOLD SMALL F" #x1D41F)
+    ("MATHEMATICAL BOLD SMALL G" #x1D420)
+    ("MATHEMATICAL BOLD SMALL H" #x1D421)
+    ("MATHEMATICAL BOLD SMALL I" #x1D422)
+    ("MATHEMATICAL BOLD SMALL J" #x1D423)
+    ("MATHEMATICAL BOLD SMALL K" #x1D424)
+    ("MATHEMATICAL BOLD SMALL L" #x1D425)
+    ("MATHEMATICAL BOLD SMALL M" #x1D426)
+    ("MATHEMATICAL BOLD SMALL N" #x1D427)
+    ("MATHEMATICAL BOLD SMALL O" #x1D428)
+    ("MATHEMATICAL BOLD SMALL P" #x1D429)
+    ("MATHEMATICAL BOLD SMALL Q" #x1D42A)
+    ("MATHEMATICAL BOLD SMALL R" #x1D42B)
+    ("MATHEMATICAL BOLD SMALL S" #x1D42C)
+    ("MATHEMATICAL BOLD SMALL T" #x1D42D)
+    ("MATHEMATICAL BOLD SMALL U" #x1D42E)
+    ("MATHEMATICAL BOLD SMALL V" #x1D42F)
+    ("MATHEMATICAL BOLD SMALL W" #x1D430)
+    ("MATHEMATICAL BOLD SMALL X" #x1D431)
+    ("MATHEMATICAL BOLD SMALL Y" #x1D432)
+    ("MATHEMATICAL BOLD SMALL Z" #x1D433)
+    ("MATHEMATICAL ITALIC CAPITAL A" #x1D434)
+    ("MATHEMATICAL ITALIC CAPITAL B" #x1D435)
+    ("MATHEMATICAL ITALIC CAPITAL C" #x1D436)
+    ("MATHEMATICAL ITALIC CAPITAL D" #x1D437)
+    ("MATHEMATICAL ITALIC CAPITAL E" #x1D438)
+    ("MATHEMATICAL ITALIC CAPITAL F" #x1D439)
+    ("MATHEMATICAL ITALIC CAPITAL G" #x1D43A)
+    ("MATHEMATICAL ITALIC CAPITAL H" #x1D43B)
+    ("MATHEMATICAL ITALIC CAPITAL I" #x1D43C)
+    ("MATHEMATICAL ITALIC CAPITAL J" #x1D43D)
+    ("MATHEMATICAL ITALIC CAPITAL K" #x1D43E)
+    ("MATHEMATICAL ITALIC CAPITAL L" #x1D43F)
+    ("MATHEMATICAL ITALIC CAPITAL M" #x1D440)
+    ("MATHEMATICAL ITALIC CAPITAL N" #x1D441)
+    ("MATHEMATICAL ITALIC CAPITAL O" #x1D442)
+    ("MATHEMATICAL ITALIC CAPITAL P" #x1D443)
+    ("MATHEMATICAL ITALIC CAPITAL Q" #x1D444)
+    ("MATHEMATICAL ITALIC CAPITAL R" #x1D445)
+    ("MATHEMATICAL ITALIC CAPITAL S" #x1D446)
+    ("MATHEMATICAL ITALIC CAPITAL T" #x1D447)
+    ("MATHEMATICAL ITALIC CAPITAL U" #x1D448)
+    ("MATHEMATICAL ITALIC CAPITAL V" #x1D449)
+    ("MATHEMATICAL ITALIC CAPITAL W" #x1D44A)
+    ("MATHEMATICAL ITALIC CAPITAL X" #x1D44B)
+    ("MATHEMATICAL ITALIC CAPITAL Y" #x1D44C)
+    ("MATHEMATICAL ITALIC CAPITAL Z" #x1D44D)
+    ("MATHEMATICAL ITALIC SMALL A" #x1D44E)
+    ("MATHEMATICAL ITALIC SMALL B" #x1D44F)
+    ("MATHEMATICAL ITALIC SMALL C" #x1D450)
+    ("MATHEMATICAL ITALIC SMALL D" #x1D451)
+    ("MATHEMATICAL ITALIC SMALL E" #x1D452)
+    ("MATHEMATICAL ITALIC SMALL F" #x1D453)
+    ("MATHEMATICAL ITALIC SMALL G" #x1D454)
+    ("MATHEMATICAL ITALIC SMALL I" #x1D456)
+    ("MATHEMATICAL ITALIC SMALL J" #x1D457)
+    ("MATHEMATICAL ITALIC SMALL K" #x1D458)
+    ("MATHEMATICAL ITALIC SMALL L" #x1D459)
+    ("MATHEMATICAL ITALIC SMALL M" #x1D45A)
+    ("MATHEMATICAL ITALIC SMALL N" #x1D45B)
+    ("MATHEMATICAL ITALIC SMALL O" #x1D45C)
+    ("MATHEMATICAL ITALIC SMALL P" #x1D45D)
+    ("MATHEMATICAL ITALIC SMALL Q" #x1D45E)
+    ("MATHEMATICAL ITALIC SMALL R" #x1D45F)
+    ("MATHEMATICAL ITALIC SMALL S" #x1D460)
+    ("MATHEMATICAL ITALIC SMALL T" #x1D461)
+    ("MATHEMATICAL ITALIC SMALL U" #x1D462)
+    ("MATHEMATICAL ITALIC SMALL V" #x1D463)
+    ("MATHEMATICAL ITALIC SMALL W" #x1D464)
+    ("MATHEMATICAL ITALIC SMALL X" #x1D465)
+    ("MATHEMATICAL ITALIC SMALL Y" #x1D466)
+    ("MATHEMATICAL ITALIC SMALL Z" #x1D467)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL A" #x1D468)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL B" #x1D469)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL C" #x1D46A)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL D" #x1D46B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL E" #x1D46C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL F" #x1D46D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL G" #x1D46E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL H" #x1D46F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL I" #x1D470)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL J" #x1D471)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL K" #x1D472)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL L" #x1D473)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL M" #x1D474)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL N" #x1D475)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL O" #x1D476)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL P" #x1D477)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL Q" #x1D478)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL R" #x1D479)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL S" #x1D47A)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL T" #x1D47B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL U" #x1D47C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL V" #x1D47D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL W" #x1D47E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL X" #x1D47F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL Y" #x1D480)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL Z" #x1D481)
+    ("MATHEMATICAL BOLD ITALIC SMALL A" #x1D482)
+    ("MATHEMATICAL BOLD ITALIC SMALL B" #x1D483)
+    ("MATHEMATICAL BOLD ITALIC SMALL C" #x1D484)
+    ("MATHEMATICAL BOLD ITALIC SMALL D" #x1D485)
+    ("MATHEMATICAL BOLD ITALIC SMALL E" #x1D486)
+    ("MATHEMATICAL BOLD ITALIC SMALL F" #x1D487)
+    ("MATHEMATICAL BOLD ITALIC SMALL G" #x1D488)
+    ("MATHEMATICAL BOLD ITALIC SMALL H" #x1D489)
+    ("MATHEMATICAL BOLD ITALIC SMALL I" #x1D48A)
+    ("MATHEMATICAL BOLD ITALIC SMALL J" #x1D48B)
+    ("MATHEMATICAL BOLD ITALIC SMALL K" #x1D48C)
+    ("MATHEMATICAL BOLD ITALIC SMALL L" #x1D48D)
+    ("MATHEMATICAL BOLD ITALIC SMALL M" #x1D48E)
+    ("MATHEMATICAL BOLD ITALIC SMALL N" #x1D48F)
+    ("MATHEMATICAL BOLD ITALIC SMALL O" #x1D490)
+    ("MATHEMATICAL BOLD ITALIC SMALL P" #x1D491)
+    ("MATHEMATICAL BOLD ITALIC SMALL Q" #x1D492)
+    ("MATHEMATICAL BOLD ITALIC SMALL R" #x1D493)
+    ("MATHEMATICAL BOLD ITALIC SMALL S" #x1D494)
+    ("MATHEMATICAL BOLD ITALIC SMALL T" #x1D495)
+    ("MATHEMATICAL BOLD ITALIC SMALL U" #x1D496)
+    ("MATHEMATICAL BOLD ITALIC SMALL V" #x1D497)
+    ("MATHEMATICAL BOLD ITALIC SMALL W" #x1D498)
+    ("MATHEMATICAL BOLD ITALIC SMALL X" #x1D499)
+    ("MATHEMATICAL BOLD ITALIC SMALL Y" #x1D49A)
+    ("MATHEMATICAL BOLD ITALIC SMALL Z" #x1D49B)
+    ("MATHEMATICAL SCRIPT CAPITAL A" #x1D49C)
+    ("MATHEMATICAL SCRIPT CAPITAL C" #x1D49E)
+    ("MATHEMATICAL SCRIPT CAPITAL D" #x1D49F)
+    ("MATHEMATICAL SCRIPT CAPITAL G" #x1D4A2)
+    ("MATHEMATICAL SCRIPT CAPITAL J" #x1D4A5)
+    ("MATHEMATICAL SCRIPT CAPITAL K" #x1D4A6)
+    ("MATHEMATICAL SCRIPT CAPITAL N" #x1D4A9)
+    ("MATHEMATICAL SCRIPT CAPITAL O" #x1D4AA)
+    ("MATHEMATICAL SCRIPT CAPITAL P" #x1D4AB)
+    ("MATHEMATICAL SCRIPT CAPITAL Q" #x1D4AC)
+    ("MATHEMATICAL SCRIPT CAPITAL S" #x1D4AE)
+    ("MATHEMATICAL SCRIPT CAPITAL T" #x1D4AF)
+    ("MATHEMATICAL SCRIPT CAPITAL U" #x1D4B0)
+    ("MATHEMATICAL SCRIPT CAPITAL V" #x1D4B1)
+    ("MATHEMATICAL SCRIPT CAPITAL W" #x1D4B2)
+    ("MATHEMATICAL SCRIPT CAPITAL X" #x1D4B3)
+    ("MATHEMATICAL SCRIPT CAPITAL Y" #x1D4B4)
+    ("MATHEMATICAL SCRIPT CAPITAL Z" #x1D4B5)
+    ("MATHEMATICAL SCRIPT SMALL A" #x1D4B6)
+    ("MATHEMATICAL SCRIPT SMALL B" #x1D4B7)
+    ("MATHEMATICAL SCRIPT SMALL C" #x1D4B8)
+    ("MATHEMATICAL SCRIPT SMALL D" #x1D4B9)
+    ("MATHEMATICAL SCRIPT SMALL F" #x1D4BB)
+    ("MATHEMATICAL SCRIPT SMALL H" #x1D4BD)
+    ("MATHEMATICAL SCRIPT SMALL I" #x1D4BE)
+    ("MATHEMATICAL SCRIPT SMALL J" #x1D4BF)
+    ("MATHEMATICAL SCRIPT SMALL K" #x1D4C0)
+    ("MATHEMATICAL SCRIPT SMALL M" #x1D4C2)
+    ("MATHEMATICAL SCRIPT SMALL N" #x1D4C3)
+    ("MATHEMATICAL SCRIPT SMALL P" #x1D4C5)
+    ("MATHEMATICAL SCRIPT SMALL Q" #x1D4C6)
+    ("MATHEMATICAL SCRIPT SMALL R" #x1D4C7)
+    ("MATHEMATICAL SCRIPT SMALL S" #x1D4C8)
+    ("MATHEMATICAL SCRIPT SMALL T" #x1D4C9)
+    ("MATHEMATICAL SCRIPT SMALL U" #x1D4CA)
+    ("MATHEMATICAL SCRIPT SMALL V" #x1D4CB)
+    ("MATHEMATICAL SCRIPT SMALL W" #x1D4CC)
+    ("MATHEMATICAL SCRIPT SMALL X" #x1D4CD)
+    ("MATHEMATICAL SCRIPT SMALL Y" #x1D4CE)
+    ("MATHEMATICAL SCRIPT SMALL Z" #x1D4CF)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL A" #x1D4D0)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL B" #x1D4D1)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL C" #x1D4D2)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL D" #x1D4D3)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL E" #x1D4D4)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL F" #x1D4D5)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL G" #x1D4D6)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL H" #x1D4D7)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL I" #x1D4D8)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL J" #x1D4D9)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL K" #x1D4DA)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL L" #x1D4DB)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL M" #x1D4DC)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL N" #x1D4DD)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL O" #x1D4DE)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL P" #x1D4DF)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL Q" #x1D4E0)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL R" #x1D4E1)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL S" #x1D4E2)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL T" #x1D4E3)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL U" #x1D4E4)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL V" #x1D4E5)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL W" #x1D4E6)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL X" #x1D4E7)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL Y" #x1D4E8)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL Z" #x1D4E9)
+    ("MATHEMATICAL BOLD SCRIPT SMALL A" #x1D4EA)
+    ("MATHEMATICAL BOLD SCRIPT SMALL B" #x1D4EB)
+    ("MATHEMATICAL BOLD SCRIPT SMALL C" #x1D4EC)
+    ("MATHEMATICAL BOLD SCRIPT SMALL D" #x1D4ED)
+    ("MATHEMATICAL BOLD SCRIPT SMALL E" #x1D4EE)
+    ("MATHEMATICAL BOLD SCRIPT SMALL F" #x1D4EF)
+    ("MATHEMATICAL BOLD SCRIPT SMALL G" #x1D4F0)
+    ("MATHEMATICAL BOLD SCRIPT SMALL H" #x1D4F1)
+    ("MATHEMATICAL BOLD SCRIPT SMALL I" #x1D4F2)
+    ("MATHEMATICAL BOLD SCRIPT SMALL J" #x1D4F3)
+    ("MATHEMATICAL BOLD SCRIPT SMALL K" #x1D4F4)
+    ("MATHEMATICAL BOLD SCRIPT SMALL L" #x1D4F5)
+    ("MATHEMATICAL BOLD SCRIPT SMALL M" #x1D4F6)
+    ("MATHEMATICAL BOLD SCRIPT SMALL N" #x1D4F7)
+    ("MATHEMATICAL BOLD SCRIPT SMALL O" #x1D4F8)
+    ("MATHEMATICAL BOLD SCRIPT SMALL P" #x1D4F9)
+    ("MATHEMATICAL BOLD SCRIPT SMALL Q" #x1D4FA)
+    ("MATHEMATICAL BOLD SCRIPT SMALL R" #x1D4FB)
+    ("MATHEMATICAL BOLD SCRIPT SMALL S" #x1D4FC)
+    ("MATHEMATICAL BOLD SCRIPT SMALL T" #x1D4FD)
+    ("MATHEMATICAL BOLD SCRIPT SMALL U" #x1D4FE)
+    ("MATHEMATICAL BOLD SCRIPT SMALL V" #x1D4FF)
+    ("MATHEMATICAL BOLD SCRIPT SMALL W" #x1D500)
+    ("MATHEMATICAL BOLD SCRIPT SMALL X" #x1D501)
+    ("MATHEMATICAL BOLD SCRIPT SMALL Y" #x1D502)
+    ("MATHEMATICAL BOLD SCRIPT SMALL Z" #x1D503)
+    ("MATHEMATICAL FRAKTUR CAPITAL A" #x1D504)
+    ("MATHEMATICAL FRAKTUR CAPITAL B" #x1D505)
+    ("MATHEMATICAL FRAKTUR CAPITAL D" #x1D507)
+    ("MATHEMATICAL FRAKTUR CAPITAL E" #x1D508)
+    ("MATHEMATICAL FRAKTUR CAPITAL F" #x1D509)
+    ("MATHEMATICAL FRAKTUR CAPITAL G" #x1D50A)
+    ("MATHEMATICAL FRAKTUR CAPITAL J" #x1D50D)
+    ("MATHEMATICAL FRAKTUR CAPITAL K" #x1D50E)
+    ("MATHEMATICAL FRAKTUR CAPITAL L" #x1D50F)
+    ("MATHEMATICAL FRAKTUR CAPITAL M" #x1D510)
+    ("MATHEMATICAL FRAKTUR CAPITAL N" #x1D511)
+    ("MATHEMATICAL FRAKTUR CAPITAL O" #x1D512)
+    ("MATHEMATICAL FRAKTUR CAPITAL P" #x1D513)
+    ("MATHEMATICAL FRAKTUR CAPITAL Q" #x1D514)
+    ("MATHEMATICAL FRAKTUR CAPITAL S" #x1D516)
+    ("MATHEMATICAL FRAKTUR CAPITAL T" #x1D517)
+    ("MATHEMATICAL FRAKTUR CAPITAL U" #x1D518)
+    ("MATHEMATICAL FRAKTUR CAPITAL V" #x1D519)
+    ("MATHEMATICAL FRAKTUR CAPITAL W" #x1D51A)
+    ("MATHEMATICAL FRAKTUR CAPITAL X" #x1D51B)
+    ("MATHEMATICAL FRAKTUR CAPITAL Y" #x1D51C)
+    ("MATHEMATICAL FRAKTUR SMALL A" #x1D51E)
+    ("MATHEMATICAL FRAKTUR SMALL B" #x1D51F)
+    ("MATHEMATICAL FRAKTUR SMALL C" #x1D520)
+    ("MATHEMATICAL FRAKTUR SMALL D" #x1D521)
+    ("MATHEMATICAL FRAKTUR SMALL E" #x1D522)
+    ("MATHEMATICAL FRAKTUR SMALL F" #x1D523)
+    ("MATHEMATICAL FRAKTUR SMALL G" #x1D524)
+    ("MATHEMATICAL FRAKTUR SMALL H" #x1D525)
+    ("MATHEMATICAL FRAKTUR SMALL I" #x1D526)
+    ("MATHEMATICAL FRAKTUR SMALL J" #x1D527)
+    ("MATHEMATICAL FRAKTUR SMALL K" #x1D528)
+    ("MATHEMATICAL FRAKTUR SMALL L" #x1D529)
+    ("MATHEMATICAL FRAKTUR SMALL M" #x1D52A)
+    ("MATHEMATICAL FRAKTUR SMALL N" #x1D52B)
+    ("MATHEMATICAL FRAKTUR SMALL O" #x1D52C)
+    ("MATHEMATICAL FRAKTUR SMALL P" #x1D52D)
+    ("MATHEMATICAL FRAKTUR SMALL Q" #x1D52E)
+    ("MATHEMATICAL FRAKTUR SMALL R" #x1D52F)
+    ("MATHEMATICAL FRAKTUR SMALL S" #x1D530)
+    ("MATHEMATICAL FRAKTUR SMALL T" #x1D531)
+    ("MATHEMATICAL FRAKTUR SMALL U" #x1D532)
+    ("MATHEMATICAL FRAKTUR SMALL V" #x1D533)
+    ("MATHEMATICAL FRAKTUR SMALL W" #x1D534)
+    ("MATHEMATICAL FRAKTUR SMALL X" #x1D535)
+    ("MATHEMATICAL FRAKTUR SMALL Y" #x1D536)
+    ("MATHEMATICAL FRAKTUR SMALL Z" #x1D537)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL A" #x1D538)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL B" #x1D539)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL D" #x1D53B)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL E" #x1D53C)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL F" #x1D53D)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL G" #x1D53E)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL I" #x1D540)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL J" #x1D541)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL K" #x1D542)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL L" #x1D543)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL M" #x1D544)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL O" #x1D546)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL S" #x1D54A)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL T" #x1D54B)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL U" #x1D54C)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL V" #x1D54D)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL W" #x1D54E)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL X" #x1D54F)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL Y" #x1D550)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL A" #x1D552)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL B" #x1D553)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL C" #x1D554)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL D" #x1D555)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL E" #x1D556)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL F" #x1D557)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL G" #x1D558)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL H" #x1D559)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL I" #x1D55A)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL J" #x1D55B)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL K" #x1D55C)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL L" #x1D55D)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL M" #x1D55E)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL N" #x1D55F)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL O" #x1D560)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL P" #x1D561)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL Q" #x1D562)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL R" #x1D563)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL S" #x1D564)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL T" #x1D565)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL U" #x1D566)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL V" #x1D567)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL W" #x1D568)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL X" #x1D569)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL Y" #x1D56A)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL Z" #x1D56B)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL A" #x1D56C)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL B" #x1D56D)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL C" #x1D56E)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL D" #x1D56F)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL E" #x1D570)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL F" #x1D571)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL G" #x1D572)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL H" #x1D573)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL I" #x1D574)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL J" #x1D575)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL K" #x1D576)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL L" #x1D577)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL M" #x1D578)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL N" #x1D579)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL O" #x1D57A)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL P" #x1D57B)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL Q" #x1D57C)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL R" #x1D57D)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL S" #x1D57E)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL T" #x1D57F)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL U" #x1D580)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL V" #x1D581)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL W" #x1D582)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL X" #x1D583)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL Y" #x1D584)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL Z" #x1D585)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL A" #x1D586)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL B" #x1D587)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL C" #x1D588)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL D" #x1D589)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL E" #x1D58A)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL F" #x1D58B)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL G" #x1D58C)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL H" #x1D58D)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL I" #x1D58E)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL J" #x1D58F)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL K" #x1D590)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL L" #x1D591)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL M" #x1D592)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL N" #x1D593)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL O" #x1D594)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL P" #x1D595)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL Q" #x1D596)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL R" #x1D597)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL S" #x1D598)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL T" #x1D599)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL U" #x1D59A)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL V" #x1D59B)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL W" #x1D59C)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL X" #x1D59D)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL Y" #x1D59E)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL Z" #x1D59F)
+    ("MATHEMATICAL SANS-SERIF CAPITAL A" #x1D5A0)
+    ("MATHEMATICAL SANS-SERIF CAPITAL B" #x1D5A1)
+    ("MATHEMATICAL SANS-SERIF CAPITAL C" #x1D5A2)
+    ("MATHEMATICAL SANS-SERIF CAPITAL D" #x1D5A3)
+    ("MATHEMATICAL SANS-SERIF CAPITAL E" #x1D5A4)
+    ("MATHEMATICAL SANS-SERIF CAPITAL F" #x1D5A5)
+    ("MATHEMATICAL SANS-SERIF CAPITAL G" #x1D5A6)
+    ("MATHEMATICAL SANS-SERIF CAPITAL H" #x1D5A7)
+    ("MATHEMATICAL SANS-SERIF CAPITAL I" #x1D5A8)
+    ("MATHEMATICAL SANS-SERIF CAPITAL J" #x1D5A9)
+    ("MATHEMATICAL SANS-SERIF CAPITAL K" #x1D5AA)
+    ("MATHEMATICAL SANS-SERIF CAPITAL L" #x1D5AB)
+    ("MATHEMATICAL SANS-SERIF CAPITAL M" #x1D5AC)
+    ("MATHEMATICAL SANS-SERIF CAPITAL N" #x1D5AD)
+    ("MATHEMATICAL SANS-SERIF CAPITAL O" #x1D5AE)
+    ("MATHEMATICAL SANS-SERIF CAPITAL P" #x1D5AF)
+    ("MATHEMATICAL SANS-SERIF CAPITAL Q" #x1D5B0)
+    ("MATHEMATICAL SANS-SERIF CAPITAL R" #x1D5B1)
+    ("MATHEMATICAL SANS-SERIF CAPITAL S" #x1D5B2)
+    ("MATHEMATICAL SANS-SERIF CAPITAL T" #x1D5B3)
+    ("MATHEMATICAL SANS-SERIF CAPITAL U" #x1D5B4)
+    ("MATHEMATICAL SANS-SERIF CAPITAL V" #x1D5B5)
+    ("MATHEMATICAL SANS-SERIF CAPITAL W" #x1D5B6)
+    ("MATHEMATICAL SANS-SERIF CAPITAL X" #x1D5B7)
+    ("MATHEMATICAL SANS-SERIF CAPITAL Y" #x1D5B8)
+    ("MATHEMATICAL SANS-SERIF CAPITAL Z" #x1D5B9)
+    ("MATHEMATICAL SANS-SERIF SMALL A" #x1D5BA)
+    ("MATHEMATICAL SANS-SERIF SMALL B" #x1D5BB)
+    ("MATHEMATICAL SANS-SERIF SMALL C" #x1D5BC)
+    ("MATHEMATICAL SANS-SERIF SMALL D" #x1D5BD)
+    ("MATHEMATICAL SANS-SERIF SMALL E" #x1D5BE)
+    ("MATHEMATICAL SANS-SERIF SMALL F" #x1D5BF)
+    ("MATHEMATICAL SANS-SERIF SMALL G" #x1D5C0)
+    ("MATHEMATICAL SANS-SERIF SMALL H" #x1D5C1)
+    ("MATHEMATICAL SANS-SERIF SMALL I" #x1D5C2)
+    ("MATHEMATICAL SANS-SERIF SMALL J" #x1D5C3)
+    ("MATHEMATICAL SANS-SERIF SMALL K" #x1D5C4)
+    ("MATHEMATICAL SANS-SERIF SMALL L" #x1D5C5)
+    ("MATHEMATICAL SANS-SERIF SMALL M" #x1D5C6)
+    ("MATHEMATICAL SANS-SERIF SMALL N" #x1D5C7)
+    ("MATHEMATICAL SANS-SERIF SMALL O" #x1D5C8)
+    ("MATHEMATICAL SANS-SERIF SMALL P" #x1D5C9)
+    ("MATHEMATICAL SANS-SERIF SMALL Q" #x1D5CA)
+    ("MATHEMATICAL SANS-SERIF SMALL R" #x1D5CB)
+    ("MATHEMATICAL SANS-SERIF SMALL S" #x1D5CC)
+    ("MATHEMATICAL SANS-SERIF SMALL T" #x1D5CD)
+    ("MATHEMATICAL SANS-SERIF SMALL U" #x1D5CE)
+    ("MATHEMATICAL SANS-SERIF SMALL V" #x1D5CF)
+    ("MATHEMATICAL SANS-SERIF SMALL W" #x1D5D0)
+    ("MATHEMATICAL SANS-SERIF SMALL X" #x1D5D1)
+    ("MATHEMATICAL SANS-SERIF SMALL Y" #x1D5D2)
+    ("MATHEMATICAL SANS-SERIF SMALL Z" #x1D5D3)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL A" #x1D5D4)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL B" #x1D5D5)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL C" #x1D5D6)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL D" #x1D5D7)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL E" #x1D5D8)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL F" #x1D5D9)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL G" #x1D5DA)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL H" #x1D5DB)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL I" #x1D5DC)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL J" #x1D5DD)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL K" #x1D5DE)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL L" #x1D5DF)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL M" #x1D5E0)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL N" #x1D5E1)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL O" #x1D5E2)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL P" #x1D5E3)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL Q" #x1D5E4)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL R" #x1D5E5)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL S" #x1D5E6)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL T" #x1D5E7)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL U" #x1D5E8)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL V" #x1D5E9)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL W" #x1D5EA)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL X" #x1D5EB)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL Y" #x1D5EC)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL Z" #x1D5ED)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL A" #x1D5EE)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL B" #x1D5EF)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL C" #x1D5F0)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL D" #x1D5F1)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL E" #x1D5F2)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL F" #x1D5F3)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL G" #x1D5F4)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL H" #x1D5F5)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL I" #x1D5F6)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL J" #x1D5F7)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL K" #x1D5F8)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL L" #x1D5F9)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL M" #x1D5FA)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL N" #x1D5FB)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL O" #x1D5FC)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL P" #x1D5FD)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL Q" #x1D5FE)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL R" #x1D5FF)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL S" #x1D600)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL T" #x1D601)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL U" #x1D602)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL V" #x1D603)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL W" #x1D604)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL X" #x1D605)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL Y" #x1D606)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL Z" #x1D607)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL A" #x1D608)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL B" #x1D609)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL C" #x1D60A)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL D" #x1D60B)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL E" #x1D60C)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL F" #x1D60D)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL G" #x1D60E)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL H" #x1D60F)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL I" #x1D610)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL J" #x1D611)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL K" #x1D612)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL L" #x1D613)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL M" #x1D614)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL N" #x1D615)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL O" #x1D616)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL P" #x1D617)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q" #x1D618)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL R" #x1D619)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL S" #x1D61A)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL T" #x1D61B)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL U" #x1D61C)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL V" #x1D61D)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL W" #x1D61E)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL X" #x1D61F)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y" #x1D620)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z" #x1D621)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL A" #x1D622)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL B" #x1D623)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL C" #x1D624)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL D" #x1D625)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL E" #x1D626)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL F" #x1D627)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL G" #x1D628)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL H" #x1D629)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL I" #x1D62A)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL J" #x1D62B)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL K" #x1D62C)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL L" #x1D62D)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL M" #x1D62E)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL N" #x1D62F)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL O" #x1D630)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL P" #x1D631)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL Q" #x1D632)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL R" #x1D633)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL S" #x1D634)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL T" #x1D635)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL U" #x1D636)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL V" #x1D637)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL W" #x1D638)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL X" #x1D639)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL Y" #x1D63A)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL Z" #x1D63B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A" #x1D63C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B" #x1D63D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C" #x1D63E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D" #x1D63F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E" #x1D640)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F" #x1D641)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G" #x1D642)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H" #x1D643)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I" #x1D644)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J" #x1D645)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K" #x1D646)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L" #x1D647)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M" #x1D648)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N" #x1D649)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O" #x1D64A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P" #x1D64B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q" #x1D64C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R" #x1D64D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S" #x1D64E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T" #x1D64F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U" #x1D650)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V" #x1D651)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W" #x1D652)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X" #x1D653)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y" #x1D654)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z" #x1D655)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A" #x1D656)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B" #x1D657)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C" #x1D658)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D" #x1D659)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E" #x1D65A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F" #x1D65B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G" #x1D65C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H" #x1D65D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I" #x1D65E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J" #x1D65F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K" #x1D660)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L" #x1D661)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M" #x1D662)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N" #x1D663)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O" #x1D664)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P" #x1D665)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q" #x1D666)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R" #x1D667)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S" #x1D668)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T" #x1D669)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U" #x1D66A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V" #x1D66B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W" #x1D66C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X" #x1D66D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y" #x1D66E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z" #x1D66F)
+    ("MATHEMATICAL MONOSPACE CAPITAL A" #x1D670)
+    ("MATHEMATICAL MONOSPACE CAPITAL B" #x1D671)
+    ("MATHEMATICAL MONOSPACE CAPITAL C" #x1D672)
+    ("MATHEMATICAL MONOSPACE CAPITAL D" #x1D673)
+    ("MATHEMATICAL MONOSPACE CAPITAL E" #x1D674)
+    ("MATHEMATICAL MONOSPACE CAPITAL F" #x1D675)
+    ("MATHEMATICAL MONOSPACE CAPITAL G" #x1D676)
+    ("MATHEMATICAL MONOSPACE CAPITAL H" #x1D677)
+    ("MATHEMATICAL MONOSPACE CAPITAL I" #x1D678)
+    ("MATHEMATICAL MONOSPACE CAPITAL J" #x1D679)
+    ("MATHEMATICAL MONOSPACE CAPITAL K" #x1D67A)
+    ("MATHEMATICAL MONOSPACE CAPITAL L" #x1D67B)
+    ("MATHEMATICAL MONOSPACE CAPITAL M" #x1D67C)
+    ("MATHEMATICAL MONOSPACE CAPITAL N" #x1D67D)
+    ("MATHEMATICAL MONOSPACE CAPITAL O" #x1D67E)
+    ("MATHEMATICAL MONOSPACE CAPITAL P" #x1D67F)
+    ("MATHEMATICAL MONOSPACE CAPITAL Q" #x1D680)
+    ("MATHEMATICAL MONOSPACE CAPITAL R" #x1D681)
+    ("MATHEMATICAL MONOSPACE CAPITAL S" #x1D682)
+    ("MATHEMATICAL MONOSPACE CAPITAL T" #x1D683)
+    ("MATHEMATICAL MONOSPACE CAPITAL U" #x1D684)
+    ("MATHEMATICAL MONOSPACE CAPITAL V" #x1D685)
+    ("MATHEMATICAL MONOSPACE CAPITAL W" #x1D686)
+    ("MATHEMATICAL MONOSPACE CAPITAL X" #x1D687)
+    ("MATHEMATICAL MONOSPACE CAPITAL Y" #x1D688)
+    ("MATHEMATICAL MONOSPACE CAPITAL Z" #x1D689)
+    ("MATHEMATICAL MONOSPACE SMALL A" #x1D68A)
+    ("MATHEMATICAL MONOSPACE SMALL B" #x1D68B)
+    ("MATHEMATICAL MONOSPACE SMALL C" #x1D68C)
+    ("MATHEMATICAL MONOSPACE SMALL D" #x1D68D)
+    ("MATHEMATICAL MONOSPACE SMALL E" #x1D68E)
+    ("MATHEMATICAL MONOSPACE SMALL F" #x1D68F)
+    ("MATHEMATICAL MONOSPACE SMALL G" #x1D690)
+    ("MATHEMATICAL MONOSPACE SMALL H" #x1D691)
+    ("MATHEMATICAL MONOSPACE SMALL I" #x1D692)
+    ("MATHEMATICAL MONOSPACE SMALL J" #x1D693)
+    ("MATHEMATICAL MONOSPACE SMALL K" #x1D694)
+    ("MATHEMATICAL MONOSPACE SMALL L" #x1D695)
+    ("MATHEMATICAL MONOSPACE SMALL M" #x1D696)
+    ("MATHEMATICAL MONOSPACE SMALL N" #x1D697)
+    ("MATHEMATICAL MONOSPACE SMALL O" #x1D698)
+    ("MATHEMATICAL MONOSPACE SMALL P" #x1D699)
+    ("MATHEMATICAL MONOSPACE SMALL Q" #x1D69A)
+    ("MATHEMATICAL MONOSPACE SMALL R" #x1D69B)
+    ("MATHEMATICAL MONOSPACE SMALL S" #x1D69C)
+    ("MATHEMATICAL MONOSPACE SMALL T" #x1D69D)
+    ("MATHEMATICAL MONOSPACE SMALL U" #x1D69E)
+    ("MATHEMATICAL MONOSPACE SMALL V" #x1D69F)
+    ("MATHEMATICAL MONOSPACE SMALL W" #x1D6A0)
+    ("MATHEMATICAL MONOSPACE SMALL X" #x1D6A1)
+    ("MATHEMATICAL MONOSPACE SMALL Y" #x1D6A2)
+    ("MATHEMATICAL MONOSPACE SMALL Z" #x1D6A3)
+    ("MATHEMATICAL BOLD CAPITAL ALPHA" #x1D6A8)
+    ("MATHEMATICAL BOLD CAPITAL BETA" #x1D6A9)
+    ("MATHEMATICAL BOLD CAPITAL GAMMA" #x1D6AA)
+    ("MATHEMATICAL BOLD CAPITAL DELTA" #x1D6AB)
+    ("MATHEMATICAL BOLD CAPITAL EPSILON" #x1D6AC)
+    ("MATHEMATICAL BOLD CAPITAL ZETA" #x1D6AD)
+    ("MATHEMATICAL BOLD CAPITAL ETA" #x1D6AE)
+    ("MATHEMATICAL BOLD CAPITAL THETA" #x1D6AF)
+    ("MATHEMATICAL BOLD CAPITAL IOTA" #x1D6B0)
+    ("MATHEMATICAL BOLD CAPITAL KAPPA" #x1D6B1)
+    ("MATHEMATICAL BOLD CAPITAL LAMDA" #x1D6B2)
+    ("MATHEMATICAL BOLD CAPITAL MU" #x1D6B3)
+    ("MATHEMATICAL BOLD CAPITAL NU" #x1D6B4)
+    ("MATHEMATICAL BOLD CAPITAL XI" #x1D6B5)
+    ("MATHEMATICAL BOLD CAPITAL OMICRON" #x1D6B6)
+    ("MATHEMATICAL BOLD CAPITAL PI" #x1D6B7)
+    ("MATHEMATICAL BOLD CAPITAL RHO" #x1D6B8)
+    ("MATHEMATICAL BOLD CAPITAL THETA SYMBOL" #x1D6B9)
+    ("MATHEMATICAL BOLD CAPITAL SIGMA" #x1D6BA)
+    ("MATHEMATICAL BOLD CAPITAL TAU" #x1D6BB)
+    ("MATHEMATICAL BOLD CAPITAL UPSILON" #x1D6BC)
+    ("MATHEMATICAL BOLD CAPITAL PHI" #x1D6BD)
+    ("MATHEMATICAL BOLD CAPITAL CHI" #x1D6BE)
+    ("MATHEMATICAL BOLD CAPITAL PSI" #x1D6BF)
+    ("MATHEMATICAL BOLD CAPITAL OMEGA" #x1D6C0)
+    ("MATHEMATICAL BOLD NABLA" #x1D6C1)
+    ("MATHEMATICAL BOLD SMALL ALPHA" #x1D6C2)
+    ("MATHEMATICAL BOLD SMALL BETA" #x1D6C3)
+    ("MATHEMATICAL BOLD SMALL GAMMA" #x1D6C4)
+    ("MATHEMATICAL BOLD SMALL DELTA" #x1D6C5)
+    ("MATHEMATICAL BOLD SMALL EPSILON" #x1D6C6)
+    ("MATHEMATICAL BOLD SMALL ZETA" #x1D6C7)
+    ("MATHEMATICAL BOLD SMALL ETA" #x1D6C8)
+    ("MATHEMATICAL BOLD SMALL THETA" #x1D6C9)
+    ("MATHEMATICAL BOLD SMALL IOTA" #x1D6CA)
+    ("MATHEMATICAL BOLD SMALL KAPPA" #x1D6CB)
+    ("MATHEMATICAL BOLD SMALL LAMDA" #x1D6CC)
+    ("MATHEMATICAL BOLD SMALL MU" #x1D6CD)
+    ("MATHEMATICAL BOLD SMALL NU" #x1D6CE)
+    ("MATHEMATICAL BOLD SMALL XI" #x1D6CF)
+    ("MATHEMATICAL BOLD SMALL OMICRON" #x1D6D0)
+    ("MATHEMATICAL BOLD SMALL PI" #x1D6D1)
+    ("MATHEMATICAL BOLD SMALL RHO" #x1D6D2)
+    ("MATHEMATICAL BOLD SMALL FINAL SIGMA" #x1D6D3)
+    ("MATHEMATICAL BOLD SMALL SIGMA" #x1D6D4)
+    ("MATHEMATICAL BOLD SMALL TAU" #x1D6D5)
+    ("MATHEMATICAL BOLD SMALL UPSILON" #x1D6D6)
+    ("MATHEMATICAL BOLD SMALL PHI" #x1D6D7)
+    ("MATHEMATICAL BOLD SMALL CHI" #x1D6D8)
+    ("MATHEMATICAL BOLD SMALL PSI" #x1D6D9)
+    ("MATHEMATICAL BOLD SMALL OMEGA" #x1D6DA)
+    ("MATHEMATICAL BOLD PARTIAL DIFFERENTIAL" #x1D6DB)
+    ("MATHEMATICAL BOLD EPSILON SYMBOL" #x1D6DC)
+    ("MATHEMATICAL BOLD THETA SYMBOL" #x1D6DD)
+    ("MATHEMATICAL BOLD KAPPA SYMBOL" #x1D6DE)
+    ("MATHEMATICAL BOLD PHI SYMBOL" #x1D6DF)
+    ("MATHEMATICAL BOLD RHO SYMBOL" #x1D6E0)
+    ("MATHEMATICAL BOLD PI SYMBOL" #x1D6E1)
+    ("MATHEMATICAL ITALIC CAPITAL ALPHA" #x1D6E2)
+    ("MATHEMATICAL ITALIC CAPITAL BETA" #x1D6E3)
+    ("MATHEMATICAL ITALIC CAPITAL GAMMA" #x1D6E4)
+    ("MATHEMATICAL ITALIC CAPITAL DELTA" #x1D6E5)
+    ("MATHEMATICAL ITALIC CAPITAL EPSILON" #x1D6E6)
+    ("MATHEMATICAL ITALIC CAPITAL ZETA" #x1D6E7)
+    ("MATHEMATICAL ITALIC CAPITAL ETA" #x1D6E8)
+    ("MATHEMATICAL ITALIC CAPITAL THETA" #x1D6E9)
+    ("MATHEMATICAL ITALIC CAPITAL IOTA" #x1D6EA)
+    ("MATHEMATICAL ITALIC CAPITAL KAPPA" #x1D6EB)
+    ("MATHEMATICAL ITALIC CAPITAL LAMDA" #x1D6EC)
+    ("MATHEMATICAL ITALIC CAPITAL MU" #x1D6ED)
+    ("MATHEMATICAL ITALIC CAPITAL NU" #x1D6EE)
+    ("MATHEMATICAL ITALIC CAPITAL XI" #x1D6EF)
+    ("MATHEMATICAL ITALIC CAPITAL OMICRON" #x1D6F0)
+    ("MATHEMATICAL ITALIC CAPITAL PI" #x1D6F1)
+    ("MATHEMATICAL ITALIC CAPITAL RHO" #x1D6F2)
+    ("MATHEMATICAL ITALIC CAPITAL THETA SYMBOL" #x1D6F3)
+    ("MATHEMATICAL ITALIC CAPITAL SIGMA" #x1D6F4)
+    ("MATHEMATICAL ITALIC CAPITAL TAU" #x1D6F5)
+    ("MATHEMATICAL ITALIC CAPITAL UPSILON" #x1D6F6)
+    ("MATHEMATICAL ITALIC CAPITAL PHI" #x1D6F7)
+    ("MATHEMATICAL ITALIC CAPITAL CHI" #x1D6F8)
+    ("MATHEMATICAL ITALIC CAPITAL PSI" #x1D6F9)
+    ("MATHEMATICAL ITALIC CAPITAL OMEGA" #x1D6FA)
+    ("MATHEMATICAL ITALIC NABLA" #x1D6FB)
+    ("MATHEMATICAL ITALIC SMALL ALPHA" #x1D6FC)
+    ("MATHEMATICAL ITALIC SMALL BETA" #x1D6FD)
+    ("MATHEMATICAL ITALIC SMALL GAMMA" #x1D6FE)
+    ("MATHEMATICAL ITALIC SMALL DELTA" #x1D6FF)
+    ("MATHEMATICAL ITALIC SMALL EPSILON" #x1D700)
+    ("MATHEMATICAL ITALIC SMALL ZETA" #x1D701)
+    ("MATHEMATICAL ITALIC SMALL ETA" #x1D702)
+    ("MATHEMATICAL ITALIC SMALL THETA" #x1D703)
+    ("MATHEMATICAL ITALIC SMALL IOTA" #x1D704)
+    ("MATHEMATICAL ITALIC SMALL KAPPA" #x1D705)
+    ("MATHEMATICAL ITALIC SMALL LAMDA" #x1D706)
+    ("MATHEMATICAL ITALIC SMALL MU" #x1D707)
+    ("MATHEMATICAL ITALIC SMALL NU" #x1D708)
+    ("MATHEMATICAL ITALIC SMALL XI" #x1D709)
+    ("MATHEMATICAL ITALIC SMALL OMICRON" #x1D70A)
+    ("MATHEMATICAL ITALIC SMALL PI" #x1D70B)
+    ("MATHEMATICAL ITALIC SMALL RHO" #x1D70C)
+    ("MATHEMATICAL ITALIC SMALL FINAL SIGMA" #x1D70D)
+    ("MATHEMATICAL ITALIC SMALL SIGMA" #x1D70E)
+    ("MATHEMATICAL ITALIC SMALL TAU" #x1D70F)
+    ("MATHEMATICAL ITALIC SMALL UPSILON" #x1D710)
+    ("MATHEMATICAL ITALIC SMALL PHI" #x1D711)
+    ("MATHEMATICAL ITALIC SMALL CHI" #x1D712)
+    ("MATHEMATICAL ITALIC SMALL PSI" #x1D713)
+    ("MATHEMATICAL ITALIC SMALL OMEGA" #x1D714)
+    ("MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL" #x1D715)
+    ("MATHEMATICAL ITALIC EPSILON SYMBOL" #x1D716)
+    ("MATHEMATICAL ITALIC THETA SYMBOL" #x1D717)
+    ("MATHEMATICAL ITALIC KAPPA SYMBOL" #x1D718)
+    ("MATHEMATICAL ITALIC PHI SYMBOL" #x1D719)
+    ("MATHEMATICAL ITALIC RHO SYMBOL" #x1D71A)
+    ("MATHEMATICAL ITALIC PI SYMBOL" #x1D71B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL ALPHA" #x1D71C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL BETA" #x1D71D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL GAMMA" #x1D71E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL DELTA" #x1D71F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL EPSILON" #x1D720)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL ZETA" #x1D721)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL ETA" #x1D722)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL THETA" #x1D723)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL IOTA" #x1D724)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL KAPPA" #x1D725)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL LAMDA" #x1D726)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL MU" #x1D727)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL NU" #x1D728)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL XI" #x1D729)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL OMICRON" #x1D72A)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL PI" #x1D72B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL RHO" #x1D72C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL" #x1D72D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL SIGMA" #x1D72E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL TAU" #x1D72F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL UPSILON" #x1D730)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL PHI" #x1D731)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL CHI" #x1D732)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL PSI" #x1D733)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL OMEGA" #x1D734)
+    ("MATHEMATICAL BOLD ITALIC NABLA" #x1D735)
+    ("MATHEMATICAL BOLD ITALIC SMALL ALPHA" #x1D736)
+    ("MATHEMATICAL BOLD ITALIC SMALL BETA" #x1D737)
+    ("MATHEMATICAL BOLD ITALIC SMALL GAMMA" #x1D738)
+    ("MATHEMATICAL BOLD ITALIC SMALL DELTA" #x1D739)
+    ("MATHEMATICAL BOLD ITALIC SMALL EPSILON" #x1D73A)
+    ("MATHEMATICAL BOLD ITALIC SMALL ZETA" #x1D73B)
+    ("MATHEMATICAL BOLD ITALIC SMALL ETA" #x1D73C)
+    ("MATHEMATICAL BOLD ITALIC SMALL THETA" #x1D73D)
+    ("MATHEMATICAL BOLD ITALIC SMALL IOTA" #x1D73E)
+    ("MATHEMATICAL BOLD ITALIC SMALL KAPPA" #x1D73F)
+    ("MATHEMATICAL BOLD ITALIC SMALL LAMDA" #x1D740)
+    ("MATHEMATICAL BOLD ITALIC SMALL MU" #x1D741)
+    ("MATHEMATICAL BOLD ITALIC SMALL NU" #x1D742)
+    ("MATHEMATICAL BOLD ITALIC SMALL XI" #x1D743)
+    ("MATHEMATICAL BOLD ITALIC SMALL OMICRON" #x1D744)
+    ("MATHEMATICAL BOLD ITALIC SMALL PI" #x1D745)
+    ("MATHEMATICAL BOLD ITALIC SMALL RHO" #x1D746)
+    ("MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA" #x1D747)
+    ("MATHEMATICAL BOLD ITALIC SMALL SIGMA" #x1D748)
+    ("MATHEMATICAL BOLD ITALIC SMALL TAU" #x1D749)
+    ("MATHEMATICAL BOLD ITALIC SMALL UPSILON" #x1D74A)
+    ("MATHEMATICAL BOLD ITALIC SMALL PHI" #x1D74B)
+    ("MATHEMATICAL BOLD ITALIC SMALL CHI" #x1D74C)
+    ("MATHEMATICAL BOLD ITALIC SMALL PSI" #x1D74D)
+    ("MATHEMATICAL BOLD ITALIC SMALL OMEGA" #x1D74E)
+    ("MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL" #x1D74F)
+    ("MATHEMATICAL BOLD ITALIC EPSILON SYMBOL" #x1D750)
+    ("MATHEMATICAL BOLD ITALIC THETA SYMBOL" #x1D751)
+    ("MATHEMATICAL BOLD ITALIC KAPPA SYMBOL" #x1D752)
+    ("MATHEMATICAL BOLD ITALIC PHI SYMBOL" #x1D753)
+    ("MATHEMATICAL BOLD ITALIC RHO SYMBOL" #x1D754)
+    ("MATHEMATICAL BOLD ITALIC PI SYMBOL" #x1D755)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA" #x1D756)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA" #x1D757)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA" #x1D758)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA" #x1D759)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON" #x1D75A)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA" #x1D75B)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA" #x1D75C)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA" #x1D75D)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA" #x1D75E)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA" #x1D75F)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA" #x1D760)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL MU" #x1D761)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL NU" #x1D762)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL XI" #x1D763)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON" #x1D764)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL PI" #x1D765)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO" #x1D766)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL" #x1D767)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA" #x1D768)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU" #x1D769)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON" #x1D76A)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI" #x1D76B)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI" #x1D76C)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI" #x1D76D)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA" #x1D76E)
+    ("MATHEMATICAL SANS-SERIF BOLD NABLA" #x1D76F)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA" #x1D770)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL BETA" #x1D771)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA" #x1D772)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL DELTA" #x1D773)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON" #x1D774)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL ZETA" #x1D775)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL ETA" #x1D776)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL THETA" #x1D777)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL IOTA" #x1D778)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA" #x1D779)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA" #x1D77A)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL MU" #x1D77B)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL NU" #x1D77C)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL XI" #x1D77D)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON" #x1D77E)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL PI" #x1D77F)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL RHO" #x1D780)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA" #x1D781)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA" #x1D782)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL TAU" #x1D783)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON" #x1D784)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL PHI" #x1D785)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL CHI" #x1D786)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL PSI" #x1D787)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA" #x1D788)
+    ("MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL" #x1D789)
+    ("MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL" #x1D78A)
+    ("MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL" #x1D78B)
+    ("MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL" #x1D78C)
+    ("MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL" #x1D78D)
+    ("MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL" #x1D78E)
+    ("MATHEMATICAL SANS-SERIF BOLD PI SYMBOL" #x1D78F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA" #x1D790)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA" #x1D791)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA" #x1D792)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA" #x1D793)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON" #x1D794)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA" #x1D795)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA" #x1D796)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA" #x1D797)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA" #x1D798)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA" #x1D799)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA" #x1D79A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU" #x1D79B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU" #x1D79C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI" #x1D79D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON" #x1D79E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI" #x1D79F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO" #x1D7A0)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL" #x1D7A1)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA" #x1D7A2)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU" #x1D7A3)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON" #x1D7A4)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI" #x1D7A5)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI" #x1D7A6)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI" #x1D7A7)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA" #x1D7A8)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA" #x1D7A9)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA" #x1D7AA)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA" #x1D7AB)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA" #x1D7AC)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA" #x1D7AD)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON" #x1D7AE)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA" #x1D7AF)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA" #x1D7B0)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA" #x1D7B1)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA" #x1D7B2)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA" #x1D7B3)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA" #x1D7B4)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU" #x1D7B5)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU" #x1D7B6)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI" #x1D7B7)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON" #x1D7B8)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI" #x1D7B9)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO" #x1D7BA)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA" #x1D7BB)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA" #x1D7BC)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU" #x1D7BD)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON" #x1D7BE)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI" #x1D7BF)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI" #x1D7C0)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI" #x1D7C1)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA" #x1D7C2)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL" #x1D7C3)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL" #x1D7C4)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL" #x1D7C5)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL" #x1D7C6)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL" #x1D7C7)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL" #x1D7C8)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL" #x1D7C9)
+    ("MATHEMATICAL BOLD DIGIT ZERO" #x1D7CE)
+    ("MATHEMATICAL BOLD DIGIT ONE" #x1D7CF)
+    ("MATHEMATICAL BOLD DIGIT TWO" #x1D7D0)
+    ("MATHEMATICAL BOLD DIGIT THREE" #x1D7D1)
+    ("MATHEMATICAL BOLD DIGIT FOUR" #x1D7D2)
+    ("MATHEMATICAL BOLD DIGIT FIVE" #x1D7D3)
+    ("MATHEMATICAL BOLD DIGIT SIX" #x1D7D4)
+    ("MATHEMATICAL BOLD DIGIT SEVEN" #x1D7D5)
+    ("MATHEMATICAL BOLD DIGIT EIGHT" #x1D7D6)
+    ("MATHEMATICAL BOLD DIGIT NINE" #x1D7D7)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO" #x1D7D8)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT ONE" #x1D7D9)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT TWO" #x1D7DA)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT THREE" #x1D7DB)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR" #x1D7DC)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE" #x1D7DD)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT SIX" #x1D7DE)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN" #x1D7DF)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT" #x1D7E0)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT NINE" #x1D7E1)
+    ("MATHEMATICAL SANS-SERIF DIGIT ZERO" #x1D7E2)
+    ("MATHEMATICAL SANS-SERIF DIGIT ONE" #x1D7E3)
+    ("MATHEMATICAL SANS-SERIF DIGIT TWO" #x1D7E4)
+    ("MATHEMATICAL SANS-SERIF DIGIT THREE" #x1D7E5)
+    ("MATHEMATICAL SANS-SERIF DIGIT FOUR" #x1D7E6)
+    ("MATHEMATICAL SANS-SERIF DIGIT FIVE" #x1D7E7)
+    ("MATHEMATICAL SANS-SERIF DIGIT SIX" #x1D7E8)
+    ("MATHEMATICAL SANS-SERIF DIGIT SEVEN" #x1D7E9)
+    ("MATHEMATICAL SANS-SERIF DIGIT EIGHT" #x1D7EA)
+    ("MATHEMATICAL SANS-SERIF DIGIT NINE" #x1D7EB)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO" #x1D7EC)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT ONE" #x1D7ED)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT TWO" #x1D7EE)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT THREE" #x1D7EF)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR" #x1D7F0)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE" #x1D7F1)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT SIX" #x1D7F2)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN" #x1D7F3)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT" #x1D7F4)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT NINE" #x1D7F5)
+    ("MATHEMATICAL MONOSPACE DIGIT ZERO" #x1D7F6)
+    ("MATHEMATICAL MONOSPACE DIGIT ONE" #x1D7F7)
+    ("MATHEMATICAL MONOSPACE DIGIT TWO" #x1D7F8)
+    ("MATHEMATICAL MONOSPACE DIGIT THREE" #x1D7F9)
+    ("MATHEMATICAL MONOSPACE DIGIT FOUR" #x1D7FA)
+    ("MATHEMATICAL MONOSPACE DIGIT FIVE" #x1D7FB)
+    ("MATHEMATICAL MONOSPACE DIGIT SIX" #x1D7FC)
+    ("MATHEMATICAL MONOSPACE DIGIT SEVEN" #x1D7FD)
+    ("MATHEMATICAL MONOSPACE DIGIT EIGHT" #x1D7FE)
+    ("MATHEMATICAL MONOSPACE DIGIT NINE" #x1D7FF)
+    ))
diff --git a/lisp/nxml/char-name/unicode/E0000-E007F.el b/lisp/nxml/char-name/unicode/E0000-E007F.el
new file mode 100644 (file)
index 0000000..b4aeb1f
--- /dev/null
@@ -0,0 +1,99 @@
+(nxml-define-char-name-set 'tags
+  '(("LANGUAGE TAG" #xE0001)
+    ("TAG SPACE" #xE0020)
+    ("TAG EXCLAMATION MARK" #xE0021)
+    ("TAG QUOTATION MARK" #xE0022)
+    ("TAG NUMBER SIGN" #xE0023)
+    ("TAG DOLLAR SIGN" #xE0024)
+    ("TAG PERCENT SIGN" #xE0025)
+    ("TAG AMPERSAND" #xE0026)
+    ("TAG APOSTROPHE" #xE0027)
+    ("TAG LEFT PARENTHESIS" #xE0028)
+    ("TAG RIGHT PARENTHESIS" #xE0029)
+    ("TAG ASTERISK" #xE002A)
+    ("TAG PLUS SIGN" #xE002B)
+    ("TAG COMMA" #xE002C)
+    ("TAG HYPHEN-MINUS" #xE002D)
+    ("TAG FULL STOP" #xE002E)
+    ("TAG SOLIDUS" #xE002F)
+    ("TAG DIGIT ZERO" #xE0030)
+    ("TAG DIGIT ONE" #xE0031)
+    ("TAG DIGIT TWO" #xE0032)
+    ("TAG DIGIT THREE" #xE0033)
+    ("TAG DIGIT FOUR" #xE0034)
+    ("TAG DIGIT FIVE" #xE0035)
+    ("TAG DIGIT SIX" #xE0036)
+    ("TAG DIGIT SEVEN" #xE0037)
+    ("TAG DIGIT EIGHT" #xE0038)
+    ("TAG DIGIT NINE" #xE0039)
+    ("TAG COLON" #xE003A)
+    ("TAG SEMICOLON" #xE003B)
+    ("TAG LESS-THAN SIGN" #xE003C)
+    ("TAG EQUALS SIGN" #xE003D)
+    ("TAG GREATER-THAN SIGN" #xE003E)
+    ("TAG QUESTION MARK" #xE003F)
+    ("TAG COMMERCIAL AT" #xE0040)
+    ("TAG LATIN CAPITAL LETTER A" #xE0041)
+    ("TAG LATIN CAPITAL LETTER B" #xE0042)
+    ("TAG LATIN CAPITAL LETTER C" #xE0043)
+    ("TAG LATIN CAPITAL LETTER D" #xE0044)
+    ("TAG LATIN CAPITAL LETTER E" #xE0045)
+    ("TAG LATIN CAPITAL LETTER F" #xE0046)
+    ("TAG LATIN CAPITAL LETTER G" #xE0047)
+    ("TAG LATIN CAPITAL LETTER H" #xE0048)
+    ("TAG LATIN CAPITAL LETTER I" #xE0049)
+    ("TAG LATIN CAPITAL LETTER J" #xE004A)
+    ("TAG LATIN CAPITAL LETTER K" #xE004B)
+    ("TAG LATIN CAPITAL LETTER L" #xE004C)
+    ("TAG LATIN CAPITAL LETTER M" #xE004D)
+    ("TAG LATIN CAPITAL LETTER N" #xE004E)
+    ("TAG LATIN CAPITAL LETTER O" #xE004F)
+    ("TAG LATIN CAPITAL LETTER P" #xE0050)
+    ("TAG LATIN CAPITAL LETTER Q" #xE0051)
+    ("TAG LATIN CAPITAL LETTER R" #xE0052)
+    ("TAG LATIN CAPITAL LETTER S" #xE0053)
+    ("TAG LATIN CAPITAL LETTER T" #xE0054)
+    ("TAG LATIN CAPITAL LETTER U" #xE0055)
+    ("TAG LATIN CAPITAL LETTER V" #xE0056)
+    ("TAG LATIN CAPITAL LETTER W" #xE0057)
+    ("TAG LATIN CAPITAL LETTER X" #xE0058)
+    ("TAG LATIN CAPITAL LETTER Y" #xE0059)
+    ("TAG LATIN CAPITAL LETTER Z" #xE005A)
+    ("TAG LEFT SQUARE BRACKET" #xE005B)
+    ("TAG REVERSE SOLIDUS" #xE005C)
+    ("TAG RIGHT SQUARE BRACKET" #xE005D)
+    ("TAG CIRCUMFLEX ACCENT" #xE005E)
+    ("TAG LOW LINE" #xE005F)
+    ("TAG GRAVE ACCENT" #xE0060)
+    ("TAG LATIN SMALL LETTER A" #xE0061)
+    ("TAG LATIN SMALL LETTER B" #xE0062)
+    ("TAG LATIN SMALL LETTER C" #xE0063)
+    ("TAG LATIN SMALL LETTER D" #xE0064)
+    ("TAG LATIN SMALL LETTER E" #xE0065)
+    ("TAG LATIN SMALL LETTER F" #xE0066)
+    ("TAG LATIN SMALL LETTER G" #xE0067)
+    ("TAG LATIN SMALL LETTER H" #xE0068)
+    ("TAG LATIN SMALL LETTER I" #xE0069)
+    ("TAG LATIN SMALL LETTER J" #xE006A)
+    ("TAG LATIN SMALL LETTER K" #xE006B)
+    ("TAG LATIN SMALL LETTER L" #xE006C)
+    ("TAG LATIN SMALL LETTER M" #xE006D)
+    ("TAG LATIN SMALL LETTER N" #xE006E)
+    ("TAG LATIN SMALL LETTER O" #xE006F)
+    ("TAG LATIN SMALL LETTER P" #xE0070)
+    ("TAG LATIN SMALL LETTER Q" #xE0071)
+    ("TAG LATIN SMALL LETTER R" #xE0072)
+    ("TAG LATIN SMALL LETTER S" #xE0073)
+    ("TAG LATIN SMALL LETTER T" #xE0074)
+    ("TAG LATIN SMALL LETTER U" #xE0075)
+    ("TAG LATIN SMALL LETTER V" #xE0076)
+    ("TAG LATIN SMALL LETTER W" #xE0077)
+    ("TAG LATIN SMALL LETTER X" #xE0078)
+    ("TAG LATIN SMALL LETTER Y" #xE0079)
+    ("TAG LATIN SMALL LETTER Z" #xE007A)
+    ("TAG LEFT CURLY BRACKET" #xE007B)
+    ("TAG VERTICAL LINE" #xE007C)
+    ("TAG RIGHT CURLY BRACKET" #xE007D)
+    ("TAG TILDE" #xE007E)
+    ("CANCEL TAG" #xE007F)
+    ))
diff --git a/lisp/nxml/nxml-enc.el b/lisp/nxml/nxml-enc.el
new file mode 100644 (file)
index 0000000..ba75580
--- /dev/null
@@ -0,0 +1,167 @@
+;;; nxml-enc.el --- XML encoding auto-detection
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; User entry points are nxml-start-auto-coding and
+;; nxml-stop-auto-coding.  This is separate from nxml-mode, because
+;; this cannot be autoloaded.  It may use
+;; `xmltok-get-declared-encoding-position' which can be autoloaded.
+;; It's separate from rng-auto.el so it can be byte-compiled, and
+;; because it provides independent, useful functionality.
+
+;;; Code:
+
+(defvar nxml-file-name-ignore-case
+  (memq system-type '(vax-vms windows-nt)))
+
+(defvar nxml-cached-file-name-auto-coding-regexp nil)
+(defvar nxml-cached-auto-mode-alist nil)
+
+(defun nxml-file-name-auto-coding-regexp ()
+  "Return regexp for filenames for which XML auto-coding should be done."
+  (if (eq auto-mode-alist nxml-cached-auto-mode-alist)
+      nxml-cached-file-name-auto-coding-regexp
+    (let ((alist auto-mode-alist)
+         (case-fold-search nxml-file-name-ignore-case)
+         regexps)
+      (setq nxml-cached-auto-mode-alist alist)
+      (while alist
+       (when (eq (cdar alist) 'nxml-mode)
+         (setq regexps (cons (caar alist) regexps)))
+       (setq alist (cdr alist)))
+      (setq nxml-cached-file-name-auto-coding-regexp
+           (if (null (cdr regexps))
+               (car regexps)
+             (mapconcat (lambda (r)
+                          (concat "\\(?:" r "\\)"))
+                        regexps
+                        "\\|"))))))
+
+(defvar nxml-non-xml-set-auto-coding-function nil
+  "The function that `set-auto-coding-function' should call for non-XML files.")
+(defun nxml-set-auto-coding (file-name size)
+  (if (let ((case-fold-search nxml-file-name-ignore-case)
+           (regexp (nxml-file-name-auto-coding-regexp)))
+       (and regexp
+            (string-match regexp file-name)))
+      (nxml-set-xml-coding file-name size)
+    (and nxml-non-xml-set-auto-coding-function
+        (funcall nxml-non-xml-set-auto-coding-function file-name size))))
+
+(defun nxml-set-xml-coding (file-name size)
+  "Function to use as `set-auto-coding-function' when file is known to be XML."
+  (nxml-detect-coding-system (+ (point) (min size 1024))))
+
+(defun nxml-detect-coding-system (limit)
+  (if (< limit (+ (point) 2))
+      (if (eq (char-after) 0) 'no-conversion 'utf-8)
+    (let ((first-two-chars (list (char-after)
+                                (char-after (1+ (point))))))
+      (cond ((equal first-two-chars '(#xFE #xFF))
+            (and (coding-system-p 'utf-16-be) 'utf-16-be))
+           ((equal first-two-chars '(#xFF #xFE))
+            (and (coding-system-p 'utf-16-le) 'utf-16-le))
+           ((memq 0 first-two-chars)
+            ;; Certainly not well-formed XML;
+            ;; perhaps UTF-16 without BOM.
+            ;; In any case, we can't handle it.
+            ;; no-conversion gives the user a chance to fix it.
+            'no-conversion)
+           ;; There are other things we might try here in the future
+           ;; eg UTF-8 BOM, UTF-16 with no BOM 
+           ;; translate to EBCDIC
+           (t
+            (let ((enc-pos (xmltok-get-declared-encoding-position limit)))
+              (cond ((consp enc-pos)
+                     (or (nxml-mime-charset-coding-system
+                          (buffer-substring-no-properties (car enc-pos)
+                                                          (cdr enc-pos)))
+                         ;; We have an encoding whose name we don't recognize.
+                         ;; What to do?
+                         ;; raw-text seems the best bet: since we got
+                         ;; the XML decl it must be a superset of ASCII,
+                         ;; so we don't need to go to no-conversion
+                         'raw-text))
+                    (enc-pos 'utf-8)
+                    ;; invalid XML declaration
+                    (t nil))))))))
+
+(defun nxml-mime-charset-coding-system (charset)
+  (let ((charset-sym (intern (downcase charset)))
+       (coding-systems (coding-system-list t))
+       coding-system ret)
+    (while (and coding-systems (not ret))
+      (setq coding-system (car coding-systems))
+      (if (eq (coding-system-get coding-system 'mime-charset)
+             charset-sym)
+         (setq ret coding-system)
+       (setq coding-systems (cdr coding-systems))))
+    ret))
+
+(defun nxml-start-auto-coding ()
+  "Do encoding auto-detection as specified in the XML standard.
+Applied to any files that `auto-mode-alist' says should be handled by
+`nxml-mode'."
+  (interactive)
+  (unless (eq set-auto-coding-function 'nxml-set-auto-coding)
+    (let ((inhibit-quit t))
+      (setq nxml-non-xml-set-auto-coding-function set-auto-coding-function)
+      (setq set-auto-coding-function 'nxml-set-auto-coding))))
+
+(defun nxml-stop-auto-coding ()
+  "Stop doing encoding auto-detection as specified in the XML standard."
+  (interactive)
+  (when (eq set-auto-coding-function 'nxml-set-auto-coding)
+    (let ((inhibit-quit t))
+      (setq set-auto-coding-function nxml-non-xml-set-auto-coding-function)
+      (setq nxml-non-xml-set-auto-coding-function nil))))
+
+(unless (coding-system-p 'us-ascii)
+  (make-coding-system
+   ;; Unicode Emacs uses ?- last time I looked
+   'us-ascii 2 ?-
+   "ISO 2022 based 7-bit encoding for ASCII (MIME:US-ASCII)"
+   '(ascii)
+   '((safe-charsets ascii)
+     (mime-charset . us-ascii))))
+
+;; Emacs 21.3.50 makes us-ascii an alias for iso-safe without
+;; giving it a mime-charset property.
+(unless (coding-system-get 'us-ascii 'mime-charset)
+  (coding-system-put 'us-ascii 'mime-charset 'us-ascii))
+
+;; Work around bug in Emacs 21.3
+
+(when (and (coding-system-p 'utf-16-le)
+          (eq (coding-system-get 'utf-16-le 'pre-write-conversion)
+              'utf-16-le-pre-write-conversion))
+  (coding-system-put 'utf-16-le 'pre-write-conversion nil))
+
+(when (and (coding-system-p 'utf-16-le)
+          (eq (coding-system-get 'utf-16-be 'pre-write-conversion)
+              'utf-16-be-pre-write-conversion))
+  (coding-system-put 'utf-16-be 'pre-write-conversion nil))
+
+(provide 'nxml-enc)
+
+;;; nxml-enc.el ends here
diff --git a/lisp/nxml/nxml-glyph.el b/lisp/nxml/nxml-glyph.el
new file mode 100644 (file)
index 0000000..b5a70b2
--- /dev/null
@@ -0,0 +1,418 @@
+;;; nxml-glyph.el --- glyph-handling for nxml-mode
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; The entry point to this file is `nxml-glyph-display-string'.
+;; The current implementation is heuristic due to a lack of
+;; Emacs primitives necessary to implement it properly.  The user
+;; can tweak the heuristics using `nxml-glyph-set-hook'.
+
+;;; Code:
+
+(defconst nxml-ascii-glyph-set
+  [(#x0020 . #x007E)])
+
+(defconst nxml-latin1-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)])
+
+;; These were generated by using nxml-insert-target-repertoire-glyph-set
+;; on the TARGET[123] files in
+;; http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz
+
+(defconst nxml-misc-fixed-1-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)
+   (#x0100 . #x017F)
+   #x018F #x0192
+   (#x0218 . #x021B)
+   #x0259
+   (#x02C6 . #x02C7)
+   (#x02D8 . #x02DD)
+   (#x0374 . #x0375)
+   #x037A #x037E
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   (#x0401 . #x040C)
+   (#x040E . #x044F)
+   (#x0451 . #x045C)
+   (#x045E . #x045F)
+   (#x0490 . #x0491)
+   (#x05D0 . #x05EA)
+   (#x1E02 . #x1E03)
+   (#x1E0A . #x1E0B)
+   (#x1E1E . #x1E1F)
+   (#x1E40 . #x1E41)
+   (#x1E56 . #x1E57)
+   (#x1E60 . #x1E61)
+   (#x1E6A . #x1E6B)
+   (#x1E80 . #x1E85)
+   (#x1EF2 . #x1EF3)
+   (#x2010 . #x2022)
+   #x2026 #x2030
+   (#x2039 . #x203A)
+   #x20AC #x2116 #x2122 #x2126
+   (#x215B . #x215E)
+   (#x2190 . #x2193)
+   #x2260
+   (#x2264 . #x2265)
+   (#x23BA . #x23BD)
+   (#x2409 . #x240D)
+   #x2424 #x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 #x252C #x2534 #x253C #x2592 #x25C6 #x266A #xFFFD]
+  "Glyph set for TARGET1 glyph repertoire of misc-fixed-* font.
+This repertoire is supported for the bold and oblique fonts.")
+
+(defconst nxml-misc-fixed-2-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)
+   (#x0100 . #x017F)
+   #x018F #x0192
+   (#x01FA . #x01FF)
+   (#x0218 . #x021B)
+   #x0259
+   (#x02C6 . #x02C7)
+   #x02C9
+   (#x02D8 . #x02DD)
+   (#x0300 . #x0311)
+   (#x0374 . #x0375)
+   #x037A #x037E
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   #x03D1
+   (#x03D5 . #x03D6)
+   #x03F1
+   (#x0401 . #x040C)
+   (#x040E . #x044F)
+   (#x0451 . #x045C)
+   (#x045E . #x045F)
+   (#x0490 . #x0491)
+   (#x05D0 . #x05EA)
+   (#x1E02 . #x1E03)
+   (#x1E0A . #x1E0B)
+   (#x1E1E . #x1E1F)
+   (#x1E40 . #x1E41)
+   (#x1E56 . #x1E57)
+   (#x1E60 . #x1E61)
+   (#x1E6A . #x1E6B)
+   (#x1E80 . #x1E85)
+   (#x1EF2 . #x1EF3)
+   (#x2010 . #x2022)
+   #x2026 #x2030
+   (#x2032 . #x2034)
+   (#x2039 . #x203A)
+   #x203C #x203E #x2044
+   (#x2070 . #x2071)
+   (#x2074 . #x208E)
+   (#x20A3 . #x20A4)
+   #x20A7 #x20AC
+   (#x20D0 . #x20D7)
+   #x2102 #x2105 #x2113
+   (#x2115 . #x2116)
+   #x211A #x211D #x2122 #x2124 #x2126 #x212E
+   (#x215B . #x215E)
+   (#x2190 . #x2195)
+   (#x21A4 . #x21A8)
+   (#x21D0 . #x21D5)
+   (#x2200 . #x2209)
+   (#x220B . #x220C)
+   #x220F
+   (#x2211 . #x2213)
+   #x2215
+   (#x2218 . #x221A)
+   (#x221D . #x221F)
+   #x2221
+   (#x2224 . #x222B)
+   #x222E #x223C #x2243 #x2245
+   (#x2248 . #x2249)
+   #x2259
+   (#x225F . #x2262)
+   (#x2264 . #x2265)
+   (#x226A . #x226B)
+   (#x2282 . #x228B)
+   #x2295 #x2297
+   (#x22A4 . #x22A7)
+   (#x22C2 . #x22C3)
+   #x22C5 #x2300 #x2302
+   (#x2308 . #x230B)
+   #x2310
+   (#x2320 . #x2321)
+   (#x2329 . #x232A)
+   (#x23BA . #x23BD)
+   (#x2409 . #x240D)
+   #x2424 #x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 #x252C #x2534 #x253C
+   (#x254C . #x2573)
+   (#x2580 . #x25A1)
+   (#x25AA . #x25AC)
+   (#x25B2 . #x25B3)
+   #x25BA #x25BC #x25C4 #x25C6
+   (#x25CA . #x25CB)
+   #x25CF
+   (#x25D8 . #x25D9)
+   #x25E6
+   (#x263A . #x263C)
+   #x2640 #x2642 #x2660 #x2663
+   (#x2665 . #x2666)
+   (#x266A . #x266B)
+   (#xFB01 . #xFB02)
+   #xFFFD]
+  "Glyph set for TARGET2 glyph repertoire of the misc-fixed-* fonts.
+This repertoire is supported for the following fonts:
+5x7.bdf 5x8.bdf 6x9.bdf 6x10.bdf 6x12.bdf 7x13.bdf 7x14.bdf clR6x12.bdf")
+
+(defconst nxml-misc-fixed-3-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)
+   (#x0100 . #x01FF)
+   (#x0200 . #x0220)
+   (#x0222 . #x0233)
+   (#x0250 . #x02AD)
+   (#x02B0 . #x02EE)
+   (#x0300 . #x034F)
+   (#x0360 . #x036F)
+   (#x0374 . #x0375)
+   #x037A #x037E
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   (#x03D0 . #x03F6)
+   (#x0400 . #x0486)
+   (#x0488 . #x04CE)
+   (#x04D0 . #x04F5)
+   (#x04F8 . #x04F9)
+   (#x0500 . #x050F)
+   (#x0531 . #x0556)
+   (#x0559 . #x055F)
+   (#x0561 . #x0587)
+   (#x0589 . #x058A)
+   (#x05B0 . #x05B9)
+   (#x05BB . #x05C4)
+   (#x05D0 . #x05EA)
+   (#x05F0 . #x05F4)
+   (#x10D0 . #x10F8)
+   #x10FB
+   (#x1E00 . #x1E9B)
+   (#x1EA0 . #x1EF9)
+   (#x1F00 . #x1F15)
+   (#x1F18 . #x1F1D)
+   (#x1F20 . #x1F45)
+   (#x1F48 . #x1F4D)
+   (#x1F50 . #x1F57)
+   #x1F59 #x1F5B #x1F5D
+   (#x1F5F . #x1F7D)
+   (#x1F80 . #x1FB4)
+   (#x1FB6 . #x1FC4)
+   (#x1FC6 . #x1FD3)
+   (#x1FD6 . #x1FDB)
+   (#x1FDD . #x1FEF)
+   (#x1FF2 . #x1FF4)
+   (#x1FF6 . #x1FFE)
+   (#x2000 . #x200A)
+   (#x2010 . #x2027)
+   (#x202F . #x2052)
+   #x2057
+   (#x205F . #x2063)
+   (#x2070 . #x2071)
+   (#x2074 . #x208E)
+   (#x20A0 . #x20B1)
+   (#x20D0 . #x20EA)
+   (#x2100 . #x213A)
+   (#x213D . #x214B)
+   (#x2153 . #x2183)
+   (#x2190 . #x21FF)
+   (#x2200 . #x22FF)
+   (#x2300 . #x23CE)
+   (#x2400 . #x2426)
+   (#x2440 . #x244A)
+   (#x2500 . #x25FF)
+   (#x2600 . #x2613)
+   (#x2616 . #x2617)
+   (#x2619 . #x267D)
+   (#x2680 . #x2689)
+   (#x27E6 . #x27EB)
+   (#x27F5 . #x27FF)
+   (#x2A00 . #x2A06)
+   #x2A1D #x2A3F #x303F
+   (#xFB00 . #xFB06)
+   (#xFB13 . #xFB17)
+   (#xFB1D . #xFB36)
+   (#xFB38 . #xFB3C)
+   #xFB3E
+   (#xFB40 . #xFB41)
+   (#xFB43 . #xFB44)
+   (#xFB46 . #xFB4F)
+   (#xFE20 . #xFE23)
+   (#xFF61 . #xFF9F)
+   #xFFFD]
+  "Glyph set for TARGET3 glyph repertoire of the misc-fixed-* fonts.
+This repertoire is supported for the following fonts:
+6x13.bdf 8x13.bdf 9x15.bdf 9x18.bdf 10x20.bdf")
+  
+(defconst nxml-wgl4-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x017F)
+   #x0192
+   (#x01FA . #x01FF)
+   (#x02C6 . #x02C7)
+   #x02C9
+   (#x02D8 . #x02DB)
+   #x02DD
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   (#x0401 . #x040C)
+   (#x040E . #x044F)
+   (#x0451 . #x045C)
+   (#x045E . #x045F)
+   (#x0490 . #x0491)
+   (#x1E80 . #x1E85)
+   (#x1EF2 . #x1EF3)
+   (#x2013 . #x2015)
+   (#x2017 . #x201E)
+   (#x2020 . #x2022)
+   #x2026 #x2030
+   (#x2032 . #x2033)
+   (#x2039 . #x203A)
+   #x203C #x203E #x2044 #x207F
+   (#x20A3 . #x20A4)
+   #x20A7 #x20AC #x2105 #x2113 #x2116 #x2122 #x2126 #x212E
+   (#x215B . #x215E)
+   (#x2190 . #x2195)
+   #x21A8 #x2202 #x2206 #x220F
+   (#x2211 . #x2212)
+   #x2215
+   (#x2219 . #x221A)
+   (#x221E . #x221F)
+   #x2229 #x222B #x2248
+   (#x2260 . #x2261)
+   (#x2264 . #x2265)
+   #x2302 #x2310
+   (#x2320 . #x2321)
+   #x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524
+   #x252C #x2534 #x253C
+   (#x2550 . #x256C)
+   #x2580 #x2584 #x2588 #x258C
+   (#x2590 . #x2593)
+   (#x25A0 . #x25A1)
+   (#x25AA . #x25AC)
+   #x25B2 #x25BA #x25BC #x25C4
+   (#x25CA . #x25CB)
+   #x25CF
+   (#x25D8 . #x25D9)
+   #x25E6
+   (#x263A . #x263C)
+   #x2640 #x2642 #x2660 #x2663
+   (#x2665 . #x2666)
+   (#x266A . #x266B)
+   (#xFB01 . #xFB02)]
+  "Glyph set corresponding to Windows Glyph List 4.")
+
+(defvar nxml-glyph-set-hook nil
+  "*Hook for determining the set of glyphs in a face.
+The hook will receive a single argument FACE.  If it can determine the
+set of glyphs representable by FACE, it must set the variable
+`nxml-glyph-set' and return non-nil.  Otherwise, it must return
+nil. The hook will be run until success.  The constants
+`nxml-ascii-glyph-set', `nxml-latin1-glyph-set',
+`nxml-misc-fixed-1-glyph-set', `nxml-misc-fixed-2-glyph-set',
+`nxml-misc-fixed-3-glyph-set' and `nxml-wgl4-glyph-set' are predefined
+for use by `nxml-glyph-set-hook'.")
+
+(defvar nxml-glyph-set nil
+  "Used by `nxml-glyph-set-hook' to return set of glyphs in a FACE.
+This should dynamically bound by any function that runs
+`nxml-glyph-set-hook'.  The value must be either nil representing an
+empty set or a vector. Each member of the vector is either a single
+integer or a cons (FIRST . LAST) representing the range of integers
+from FIRST to LAST.  An integer represents a glyph with that Unicode
+code-point.  The vector must be ordered.")
+
+(defun nxml-x-set-glyph-set (face)
+  (setq nxml-glyph-set
+       (if (equal (face-attribute face :family) "misc-fixed")
+           nxml-misc-fixed-3-glyph-set
+         nxml-wgl4-glyph-set)))
+
+(defun nxml-w32-set-glyph-set (face)
+  (setq nxml-glyph-set nxml-wgl4-glyph-set))
+
+(defun nxml-window-system-set-glyph-set (face)
+  (setq nxml-glyph-set nxml-latin1-glyph-set))
+
+(defun nxml-terminal-set-glyph-set (face)
+  (setq nxml-glyph-set nxml-ascii-glyph-set))
+
+(add-hook 'nxml-glyph-set-hook
+         (or (cdr (assq window-system
+                        '((x . nxml-x-set-glyph-set)
+                          (w32 . nxml-w32-set-glyph-set)
+                          (nil . nxml-terminal-set-glyph-set))))
+             'nxml-window-system-set-glyph-set)
+         t)
+
+;;;###autoload
+(defun nxml-glyph-display-string (n face)
+  "Return a string that can display a glyph for Unicode code-point N.
+FACE gives the face that will be used for displaying the string.
+Return nil if the face cannot display a glyph for N."
+  (let ((nxml-glyph-set nil))
+    (run-hook-with-args-until-success 'nxml-glyph-set-hook face)
+    (and nxml-glyph-set
+        (nxml-glyph-set-contains-p n nxml-glyph-set)
+        (let ((ch (decode-char 'ucs n)))
+          (and ch (string ch))))))
+      
+(defun nxml-glyph-set-contains-p (n v)
+  (let ((start 0)
+       (end (length v))
+       found mid mid-val mid-start-val mid-end-val)
+    (while (> end start)
+      (setq mid (+ start
+                  (/ (- end start) 2)))
+      (setq mid-val (aref v mid))
+      (if (consp mid-val)
+         (setq mid-start-val (car mid-val)
+               mid-end-val (cdr mid-val))
+       (setq mid-start-val mid-val
+             mid-end-val mid-val))
+      (cond ((and (<= mid-start-val n)
+                 (<= n mid-end-val))
+            (setq found t)
+            (setq start end))
+           ((< n mid-start-val)
+            (setq end mid))
+           (t
+            (setq start
+                  (if (eq start mid)
+                      end
+                    mid)))))
+    found))
+
+(provide 'nxml-glyph)
+
+;;; nxml-glyph.el ends here
diff --git a/lisp/nxml/nxml-maint.el b/lisp/nxml/nxml-maint.el
new file mode 100644 (file)
index 0000000..015c0c7
--- /dev/null
@@ -0,0 +1,106 @@
+;;; nxml-maint.el --- commands for maintainers of nxml-*.el
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+;;; Generating files with Unicode char names.
+
+(require 'nxml-uchnm)
+
+(defun nxml-create-unicode-char-name-sets (file)
+  "Generate files containing char names from Unicode standard."
+  (interactive "fUnicodeData file: ")
+  (mapcar (lambda (block)
+           (let ((nameset (nxml-unicode-block-char-name-set (nth 0 block))))
+             (save-excursion
+               (find-file (concat (get nameset 'nxml-char-name-set-file)
+                                  ".el"))
+               (erase-buffer)
+               (insert "(nxml-define-char-name-set '")
+               (prin1 nameset (current-buffer))
+               (insert "\n  '())\n")
+               (goto-char (- (point) 3)))))
+         nxml-unicode-blocks)
+  (save-excursion
+    (find-file file)
+    (goto-char (point-min))
+    (let ((blocks nxml-unicode-blocks)
+         code name)
+      (while (re-search-forward "^\\([0-9A-F]+\\);\\([^<;][^;]*\\);"
+                               nil
+                               t)
+       (setq code (string-to-number (match-string 1) 16))
+       (setq name (match-string 2))
+       (while (and blocks
+                   (> code (nth 2 (car blocks))))
+         (setq blocks (cdr blocks)))
+       (when (and (<= (nth 1 (car blocks)) code)
+                  (<= code (nth 2 (car blocks))))
+         (save-excursion
+           (find-file (concat (get (nxml-unicode-block-char-name-set
+                                    (nth 0 (car blocks)))
+                                   'nxml-char-name-set-file)
+                              ".el"))
+           (insert "(")
+           (prin1 name (current-buffer))
+           (insert (format " #x%04X)\n    " code))))))))
+
+;;; Parsing target repertoire files from ucs-fonts.
+;; This is for converting the TARGET? files in
+;; http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz
+;; into a glyph set.
+
+(defun nxml-insert-target-repertoire-glyph-set (file var)
+  (interactive "fTarget file: \nSVariable name: ")
+  (let (lst head)
+    (save-excursion
+      (set-buffer (find-file-noselect file))
+      (goto-char (point-min))
+      (while (re-search-forward "^ *\\([a-FA-F0-9]\\{2\\}\\)[ \t]+" nil t)
+       (let ((row (match-string 1))
+             (eol (save-excursion (end-of-line) (point))))
+         (while (re-search-forward "\\([a-FA-F0-9]\\{2\\}\\)-\\([a-FA-F0-9]\\{2\\}\\)\\|\\([a-FA-F0-9]\\{2\\}\\)" eol t)
+           (setq lst
+                 (cons (if (match-beginning 3)
+                           (concat "#x" row (match-string 3))
+                       (concat "(#x" row (match-string 1)
+                               " . #x" row (match-string 2) ")"))
+                       lst))))))
+    (setq lst (nreverse lst))
+    (insert (format "(defconst %s\n  [" var))
+    (while lst
+      (setq head (car lst))
+      (setq lst (cdr lst))
+      (insert head)
+      (when (= (length head) 6)
+       (while (and lst (= (length (car lst)) 6))
+         (insert " ")
+         (insert (car lst))
+         (setq lst (cdr lst))))
+      (when lst (insert "\n   ")))
+    (insert "])\n")))
+
+(provide 'nxml-maint)
+
+;;; nxml-maint.el ends here
diff --git a/lisp/nxml/nxml-mode.el b/lisp/nxml/nxml-mode.el
new file mode 100644 (file)
index 0000000..821b406
--- /dev/null
@@ -0,0 +1,2665 @@
+;;; nxml-mode.el --- a new XML mode
+
+;; Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; To use this include rng-auto.el in your .emacs.
+
+;; See nxml-rap.el for description of parsing strategy.
+
+;; The font locking here is independent of font-lock.el.  We want to
+;; do more sophisticated handling of changes and we want to use the
+;; same xmltok rather than regexps for parsing so that we parse
+;; consistently and correctly.
+
+;;; Code:
+
+(when (featurep 'mucs)
+  (error "nxml-mode is not compatible with Mule-UCS"))
+
+(require 'xmltok)
+(require 'nxml-enc)
+(require 'nxml-glyph)
+(require 'nxml-util)
+(require 'nxml-rap)
+(require 'nxml-outln)
+
+;;; Customization
+
+(defgroup nxml nil
+  "New XML editing mode"
+  :group 'languages
+  :group 'wp)
+
+(defgroup nxml-highlighting-faces nil
+  "Faces for XML syntax highlighting."
+  :group 'nxml
+  :group 'font-lock-highlighting-faces)
+
+(defcustom nxml-syntax-highlight-flag t
+  "*Non-nil means nxml-mode should perform syntax highlighting."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-char-ref-display-glyph-flag t
+  "*Non-nil means display glyph following character reference.
+The glyph is displayed in `nxml-glyph-face'.  The hook
+`nxml-glyph-set-hook' can be used to customize for which characters
+glyphs are displayed."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-mode-hook nil
+  "Hook run by command `nxml-mode'."
+  :group 'nxml
+  :type 'hook)
+
+(defcustom nxml-sexp-element-flag nil
+  "*Non-nil means sexp commands treat an element as a single expression."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-slash-auto-complete-flag nil
+  "*Non-nil means typing a slash automatically completes the end-tag.
+This is used by `nxml-electric-slash'."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-child-indent 2
+  "*Indentation for the children of an element relative to the start-tag.
+This only applies when the line or lines containing the start-tag contains
+nothing else other than that start-tag."
+  :group 'nxml
+  :type 'integer)
+
+(defcustom nxml-attribute-indent 4
+  "*Indentation for the attributes of an element relative to the start-tag.
+This only applies when the first attribute of a tag starts a line. In other
+cases, the first attribute on one line is indented the same as the first
+attribute on the previous line."
+  :group 'nxml
+  :type 'integer)
+
+(defvar nxml-fontify-chunk-size 500)
+
+(defcustom nxml-bind-meta-tab-to-complete-flag (not window-system)
+  "*Non-nil means bind M-TAB in `nxml-mode-map' to `nxml-complete'.
+C-return will be bound to `nxml-complete' in any case.
+M-TAB gets swallowed by many window systems/managers, and
+`documentation' will show M-TAB rather than C-return as the
+binding `rng-complete' when both are bound.  So it's better
+to bind M-TAB only when it will work."
+  :group 'nxml
+  :set (lambda (sym flag)
+        (set-default sym flag)
+        (when (and (boundp 'nxml-mode-map) nxml-mode-map)
+          (define-key nxml-mode-map "\M-\t" (and flag 'nxml-complete))))
+  :type 'boolean)
+
+(defcustom nxml-prefer-utf-16-to-utf-8-flag nil
+  "*Non-nil means prefer UTF-16 to UTF-8 when saving a buffer.
+This is used only when a buffer does not contain an encoding declaration
+and when its current `buffer-file-coding-system' specifies neither UTF-16
+nor UTF-8."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-prefer-utf-16-little-to-big-endian-flag (eq system-type
+                                                           'windows-nt)
+  "*Non-nil means prefer little-endian to big-endian byte-order for UTF-16.
+This is used only for saving a buffer; when reading the byte-order is
+auto-detected. It may be relevant both when there is no encoding declaration
+and when the encoding declaration specifies `UTF-16'."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-default-buffer-file-coding-system nil
+  "*Default value for `buffer-file-coding-system' for a buffer for a new file.
+Nil means use the default value of `buffer-file-coding-system' as normal.
+A buffer's `buffer-file-coding-system' affects what \\[nxml-insert-xml-declaration] inserts."
+  :group 'nxml
+  :type 'coding-system)
+
+(defcustom nxml-auto-insert-xml-declaration-flag nil
+  "*Non-nil means automatically insert an XML declaration in a new file.
+The XML declaration is inserted using `nxml-insert-xml-declaration'."
+  :group 'nxml
+  :type 'boolean)
+
+;; The following are the colors we use with a light background.
+;; The two blues have the same hue but contrasting saturation/value.
+;; The hue of the green is 120 degrees different from that of the
+;; blue.  The red used for highlighting errors is 120 degrees
+;; different again.  We use the light blue only for refs and
+;; delimiters, since these are short (long stretches in a light color
+;; would be too hard to read).  The dark blue is closest to black
+;; (which we use by default for text), so we use it for attribute
+;; values, which are similar to text.
+
+(defconst nxml-light-blue-color "#9292C9") ; hue 240
+(defconst nxml-dark-blue-color "#3A3A7B") ; hue 240
+(defconst nxml-green-color "#257A25") ; hue 120
+
+;; Similar principles apply with a dark background.  However,
+;; we switch green and blue, because darker blues are very hard to
+;; read (for me anyway) on a dark background.
+
+(defconst nxml-sky-blue-color "#ACACFC") ; hue 240
+(defconst nxml-dark-green-color "#00AD00") ; hue 120
+(defconst nxml-light-green-color "#70F170") ; hue 120
+
+(defface nxml-delimited-data-face
+  `((((class color) (background light)) (:foreground ,nxml-dark-blue-color))
+    (((class color) (background dark)) (:foreground ,nxml-light-green-color)))
+  "Face used to highlight data enclosed between delimiters.
+By default, this is inherited by `nxml-attribute-value-face'
+and `nxml-processing-instruction-content-face'."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-name-face
+  `((((class color) (background light)) (:foreground ,nxml-green-color))
+    (((class color) (background dark)) (:foreground ,nxml-sky-blue-color)))
+  "Face used to highlight various names.
+This includes element and attribute names, processing
+instruction targets and the CDATA keyword in a CDATA section.
+This is not used directly, but only via inheritance by other faces."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-ref-face
+  `((((class color) (background light)) (:foreground ,nxml-light-blue-color))
+    (((class color) (background dark)) (:foreground ,nxml-dark-green-color)))
+  "Face used to highlight character and entity references.
+This is not used directly, but only via inheritance by other faces."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-delimiter-face
+  `((((class color) (background light)) (:foreground ,nxml-light-blue-color))
+    (((class color) (background dark)) (:foreground ,nxml-dark-green-color))
+    (t (:bold t)))
+  "Face used to highlight delimiters.
+This is not used directly, but only via inheritance by other faces."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-text-face
+  nil
+  "Face used to highlight text."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-comment-content-face
+  '((t (:italic t)))
+  "Face used to highlight the content of comments."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-comment-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of comments, i.e <!-- and -->."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-processing-instruction-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of processing instructions, i.e <? and ?>."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-processing-instruction-target-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the target of processing instructions."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-processing-instruction-content-face
+  '((t (:inherit nxml-delimited-data-face)))
+  "Face used for the content of processing instructions."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-cdata-section-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of CDATA sections, i.e <![, [, and ]]>."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-cdata-section-CDATA-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the CDATA keyword in CDATA sections."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-cdata-section-content-face
+  '((t (:inherit nxml-text-face)))
+  "Face used for the content of CDATA sections."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-char-ref-number-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the number in character references.
+This includes ths `x' in hex references."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-char-ref-delimiter-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the delimiters of character references, i.e &# and ;."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-entity-ref-name-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the entity name in general entity references."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-entity-ref-delimiter-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the delimiters of entity references, i.e & and ;."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-tag-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the angle brackets delimiting tags.
+`nxml-tag-slash-face' is used for slashes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-tag-slash-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for slashes in tags, both in end-tags and empty-elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-element-prefix-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the prefix of elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-element-colon-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the colon in element names."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-element-local-name-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the local name of elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-prefix-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the prefix of attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-colon-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the colon in attribute names."
+  :group 'nxml-highlighting-faces)
+  
+(defface nxml-attribute-local-name-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the local name of attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-xmlns-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for `xmlns' in namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-colon-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the colon in namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-prefix-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the prefix declared in namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-value-face
+  '((t (:inherit nxml-delimited-data-face)))
+  "Face used for the value of attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-value-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of attribute values."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-value-face
+  '((t (:inherit nxml-attribute-value-face)))
+  "Face used for the value of namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-value-delimiter-face
+  '((t (:inherit nxml-attribute-value-delimiter-face)))
+  "Face used for the delimiters of namespace attribute values."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-prolog-literal-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of literals in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-prolog-literal-content-face
+  '((t (:inherit nxml-delimited-data-face)))
+  "Face used for the content of literals in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-prolog-keyword-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for keywords in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-markup-declaration-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of markup declarations in the prolog.
+The delimiters are <! and >."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-hash-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for # before a name in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-glyph-face
+  '((((type x))
+     (:family
+      "misc-fixed"
+      :background
+      "light grey"
+      :foreground
+      "black"
+      :weight
+      normal 
+      :slant
+      normal))
+    (t
+     (:background
+      "light grey"
+      :foreground
+      "black"
+      :weight
+      normal 
+      :slant
+      normal)))
+  "Face used for glyph for char references."
+  :group 'nxml-highlighting-faces)
+
+;;; Global variables
+
+;; This is initialized in rng-auto.el.
+(defvar nxml-version nil
+  "*The version of nxml-mode that is being used.")
+
+(defvar nxml-prolog-regions nil
+  "List of regions in the prolog to be fontified.
+See the function `xmltok-forward-prolog' for more information.")
+(make-variable-buffer-local 'nxml-prolog-regions)
+
+(defvar nxml-last-fontify-end nil
+  "Position where fontification last ended.
+Nil if the buffer changed since the last fontification.")
+(make-variable-buffer-local 'nxml-last-fontify-end)
+
+(defvar nxml-degraded nil
+  "Non-nil if currently operating in degraded mode.
+Degraded mode is enabled when an internal error is encountered in the
+fontification or after-change functions.")
+(make-variable-buffer-local 'nxml-degraded)
+
+(defvar nxml-completion-hook nil
+  "Hook run by `nxml-complete'.
+This hook is run until success.")
+
+(defvar nxml-in-mixed-content-hook nil
+  "Hook to determine whether point is in mixed content.
+The hook is called without arguments.  It should return nil if it is
+definitely not mixed; non-nil otherwise.  The hook will be run until
+one of the functions returns nil.")
+
+(defvar nxml-mixed-scan-distance 4000
+  "Maximum distance from point to scan when checking for mixed content.")
+
+(defvar nxml-end-tag-indent-scan-distance 4000
+  "Maximum distance from point to scan backwards when indenting end-tag.")
+
+(defvar nxml-char-ref-extra-display t
+  "Non-nil means display extra information for character references.
+The extra information consists of a tooltip with the character name
+and, if `nxml-char-ref-display-glyph-flag' is non-nil, a glyph
+corresponding to the referenced character following the character
+reference.")
+(make-variable-buffer-local 'nxml-char-ref-extra-display)
+
+(defvar nxml-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\M-\C-u" 'nxml-backward-up-element)
+    (define-key map "\M-\C-d" 'nxml-down-element)
+    (define-key map "\M-\C-n" 'nxml-forward-element)
+    (define-key map "\M-\C-p" 'nxml-backward-element)
+    (define-key map "\M-{" 'nxml-backward-paragraph)
+    (define-key map "\M-}" 'nxml-forward-paragraph)
+    (define-key map "\M-h" 'nxml-mark-paragraph)
+    (define-key map "\C-c\C-f" 'nxml-finish-element)
+    (define-key map "\C-c\C-m" 'nxml-split-element)
+    (define-key map "\C-c\C-b" 'nxml-balanced-close-start-tag-block)
+    (define-key map "\C-c\C-i" 'nxml-balanced-close-start-tag-inline)
+    (define-key map "\C-c\C-x" 'nxml-insert-xml-declaration)
+    (define-key map "\C-c\C-d" 'nxml-dynamic-markup-word)
+    ;; u is for Unicode
+    (define-key map "\C-c\C-u" 'nxml-insert-named-char)
+    (define-key map "\C-c\C-o" nxml-outline-prefix-map)
+    (define-key map [S-mouse-2] 'nxml-mouse-hide-direct-text-content)
+    (define-key map "/" 'nxml-electric-slash)
+    (define-key map [C-return] 'nxml-complete) 
+    (when nxml-bind-meta-tab-to-complete-flag
+      (define-key map "\M-\t" 'nxml-complete))
+    map)
+  "Keymap for nxml-mode.")
+
+(defsubst nxml-set-face (start end face)
+  (when (and face (< start end))
+    (put-text-property start end 'face face)))
+
+(defun nxml-clear-face (start end)
+  (remove-text-properties start end '(face nil))
+  (nxml-clear-char-ref-extra-display start end))
+
+(defsubst nxml-set-fontified (start end)
+  (put-text-property start end 'fontified t))
+
+(defsubst nxml-clear-fontified (start end)
+  (remove-text-properties start end '(fontified nil)))
+
+;;;###autoload
+(defun nxml-mode ()
+  ;; We use C-c C-i instead of \\[nxml-balanced-close-start-tag-inline]
+  ;; because Emacs turns C-c C-i into C-c TAB which is hard to type and
+  ;; not mnemonic.
+  "Major mode for editing XML.
+
+Syntax highlighting is performed unless the variable
+`nxml-syntax-highlight-flag' is nil.
+
+\\[nxml-finish-element] finishes the current element by inserting an end-tag.
+C-c C-i closes a start-tag with `>' and then inserts a balancing end-tag
+leaving point between the start-tag and end-tag. 
+\\[nxml-balanced-close-start-tag-block] is similar but for block rather than inline elements:
+the start-tag, point, and end-tag are all left on separate lines.
+If `nxml-slash-auto-complete-flag' is non-nil, then inserting a `</'
+automatically inserts the rest of the end-tag.
+
+\\[nxml-complete] performs completion on the symbol preceding point.
+
+\\[nxml-dynamic-markup-word] uses the contents of the current buffer
+to choose a tag to put around the word preceding point.
+
+Sections of the document can be displayed in outline form.  The
+variable `nxml-section-element-name-regexp' controls when an element
+is recognized as a section.  The same key sequences that change
+visibility in outline mode are used except that they start with C-c C-o
+instead of C-c.
+
+Validation is provided by the related minor-mode `rng-validate-mode'.
+This also makes completion schema- and context- sensitive.  Element
+names, attribute names, attribute values and namespace URIs can all be
+completed. By default, `rng-validate-mode' is automatically enabled by
+`rng-nxml-mode-init' which is normally added to `nxml-mode-hook'. You
+can toggle it using \\[rng-validate-mode].
+
+\\[indent-for-tab-command] indents the current line appropriately.
+This can be customized using the variable `nxml-child-indent'
+and the variable `nxml-attribute-indent'.
+
+\\[nxml-insert-named-char] inserts a character reference using
+the character's name (by default, the Unicode name). \\[universal-argument] \\[nxml-insert-named-char]
+inserts the character directly.
+
+The Emacs commands that normally operate on balanced expressions will
+operate on XML markup items.  Thus \\[forward-sexp] will move forward
+across one markup item; \\[backward-sexp] will move backward across
+one markup item; \\[kill-sexp] will kill the following markup item;
+\\[mark-sexp] will mark the following markup item.  By default, each
+tag each treated as a single markup item; to make the complete element
+be treated as a single markup item, set the variable
+`nxml-sexp-element-flag' to t.  For more details, see the function
+`nxml-forward-balanced-item'.
+
+\\[nxml-backward-up-element] and \\[nxml-down-element] move up and down the element structure.
+
+Many aspects this mode can be customized using
+\\[customize-group] nxml RET."
+  (interactive)
+  (kill-all-local-variables)
+  (setq major-mode 'nxml-mode)
+  (setq mode-name "nXML")
+  ;; We'll determine the fill prefix ourselves
+  (make-local-variable 'adaptive-fill-mode)
+  (setq adaptive-fill-mode nil)
+  (make-local-variable 'forward-sexp-function)
+  (setq forward-sexp-function 'nxml-forward-balanced-item)
+  (make-local-variable 'indent-line-function)
+  (setq indent-line-function 'nxml-indent-line)
+  (make-local-variable 'fill-paragraph-function)
+  (setq fill-paragraph-function 'nxml-do-fill-paragraph)
+  ;; Comment support
+  ;; This doesn't seem to work too well;
+  ;; I think we should probably roll our own nxml-comment-dwim function.
+  (make-local-variable 'comment-indent-function)
+  (setq comment-indent-function 'nxml-indent-line)
+  (make-local-variable 'comment-start)
+  (setq comment-start "<!--")
+  (make-local-variable 'comment-start-skip)
+  (setq comment-start-skip "<!--[ \t\r\n]*")
+  (make-local-variable 'comment-end)
+  (setq comment-end "-->")
+  (make-local-variable 'comment-end-skip)
+  (setq comment-end-skip "[ \t\r\n]*-->")
+  (make-local-variable 'comment-line-break-function)
+  (setq comment-line-break-function 'nxml-newline-and-indent)
+  (use-local-map nxml-mode-map)
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-clear-dependent-regions (point-min) (point-max))
+      (setq nxml-scan-end (copy-marker (point-min) nil))
+      (nxml-with-unmodifying-text-property-changes
+       (when nxml-syntax-highlight-flag
+         (nxml-clear-fontified (point-min) (point-max)))
+       (nxml-clear-inside (point-min) (point-max))
+       (nxml-with-invisible-motion
+         (nxml-scan-prolog)))))
+  (when nxml-syntax-highlight-flag
+    (add-hook 'fontification-functions 'nxml-fontify nil t))
+  (add-hook 'after-change-functions 'nxml-after-change nil t)
+  (add-hook 'write-contents-hooks 'nxml-prepare-to-save)
+  (when (not (and (buffer-file-name) (file-exists-p (buffer-file-name))))
+    (when (and nxml-default-buffer-file-coding-system
+              (not (local-variable-p 'buffer-file-coding-system)))
+      (setq buffer-file-coding-system nxml-default-buffer-file-coding-system))
+    (when nxml-auto-insert-xml-declaration-flag
+      (nxml-insert-xml-declaration)))
+  (run-hooks 'nxml-mode-hook))
+
+(defun nxml-degrade (context err)
+  (message "Internal nXML mode error in %s (%s), degrading"
+          context
+          (error-message-string err))
+  (ding)
+  (setq nxml-degraded t)
+  (setq nxml-prolog-end 1)
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-unmodifying-text-property-changes
+       (nxml-clear-face (point-min) (point-max))
+       (nxml-set-fontified (point-min) (point-max))
+       (nxml-clear-inside (point-min) (point-max)))
+      (setq mode-name "nXML/degraded"))))
+
+;;; Change management
+
+(defun nxml-after-change (start end pre-change-length)
+  ;; Work around bug in insert-file-contents.
+  (when (> end (1+ (buffer-size)))
+    (setq start 1)
+    (setq end (1+ (buffer-size))))
+  (unless nxml-degraded
+    (condition-case err
+       (save-excursion
+         (save-restriction
+           (widen)
+           (save-match-data
+             (nxml-with-invisible-motion
+               (nxml-with-unmodifying-text-property-changes
+                 (nxml-after-change1 start end pre-change-length))))))
+      (error
+       (nxml-degrade 'nxml-after-change err)))))
+
+(defun nxml-after-change1 (start end pre-change-length)
+  (setq nxml-last-fontify-end nil)
+  (let ((pre-change-end (+ start pre-change-length)))
+    (setq start
+         (nxml-adjust-start-for-dependent-regions start
+                                                  end
+                                                  pre-change-length))
+    (when (<= start
+             ;; Add 2 so as to include the < and following char
+             ;; that start the instance, since changing these
+             ;; can change where the prolog ends.
+             (+ nxml-prolog-end 2))
+      ;; end must be extended to at least the end of the old prolog
+      (when (< pre-change-end nxml-prolog-end)
+       (setq end
+             ;; don't let end get out of range even if pre-change-length
+             ;; is bogus
+             (min (point-max)
+                  (+ end (- nxml-prolog-end pre-change-end)))))
+      (nxml-scan-prolog)))
+  (cond ((<= end nxml-prolog-end)
+        (setq end nxml-prolog-end)
+        (goto-char start)
+        ;; This is so that Emacs redisplay works
+        (setq start (line-beginning-position)))
+       ((and (<= start nxml-scan-end)
+             (> start (point-min))
+             (nxml-get-inside (1- start)))
+        ;; The closing delimiter might have been removed.
+        ;; So we may need to redisplay from the beginning
+        ;; of the token.
+        (goto-char (1- start))
+        (nxml-move-outside-backwards)
+        ;; This is so that Emacs redisplay works
+        (setq start (line-beginning-position))
+        (setq end (max (nxml-scan-after-change (point) end)
+                       end)))
+       (t
+        (goto-char start)
+        ;; This is both for redisplay and to move back
+        ;; past any incomplete opening delimiters
+        (setq start (line-beginning-position))
+        (setq end (max (nxml-scan-after-change start end)
+                       end))))
+  (when nxml-syntax-highlight-flag
+    (when (>= start end)
+      ;; Must clear at least one char so as to trigger redisplay.
+      (cond ((< start (point-max))
+            (setq end (1+ start)))
+           (t
+            (setq end (point-max))
+            (goto-char end)
+            (setq start (line-beginning-position)))))
+    (nxml-clear-fontified start end)))
+  
+;;; Encodings
+
+(defun nxml-insert-xml-declaration ()
+  "Insert an XML declaration at the beginning of buffer.
+The XML declaration will declare an encoding depending on the buffer's
+`buffer-file-coding-system'."
+  (interactive "*")
+  (let ((coding-system
+        (if (and buffer-file-coding-system
+                 (coding-system-p buffer-file-coding-system)
+                 (coding-system-get buffer-file-coding-system
+                                    'mime-charset))
+            buffer-file-coding-system
+          (nxml-choose-utf-coding-system))))
+    (goto-char (point-min))
+    (insert (format "<?xml version=\"1.0\" encoding=\"%s\"?>\n"
+                   (nxml-coding-system-name coding-system)))))
+
+(defun nxml-prepare-to-save ()
+  (unless (and (not enable-multibyte-characters)
+              (local-variable-p 'buffer-file-coding-system)
+              buffer-file-coding-system
+              (or (eq (coding-system-type buffer-file-coding-system) 5)
+                  (eq buffer-file-coding-system 'no-conversion)))
+    (save-excursion
+      (setq buffer-file-coding-system (nxml-select-coding-system))))
+  ;; nil from a function in `write-contents-hooks' means
+  ;; to continue and write the file as normal
+  nil)
+
+(defun nxml-select-coding-system ()
+  (let* ((suitable-coding-systems
+         (find-coding-systems-region (point-min) (point-max)))
+        (enc-pos (progn
+                   (goto-char (point-min))
+                   (xmltok-get-declared-encoding-position)))
+        (enc-name
+         (and (consp enc-pos)
+              (buffer-substring-no-properties (car enc-pos)
+                                              (cdr enc-pos))))
+        (coding-system
+         (cond (enc-name
+                (if (string= (downcase enc-name) "utf-16")
+                    (nxml-choose-utf-16-coding-system)
+                  (nxml-mime-charset-coding-system enc-name)))
+               (enc-pos (nxml-choose-utf-coding-system)))))
+    ;; Make sure we have a coding-system
+    (unless coding-system
+      (setq coding-system
+           (and (not buffer-read-only)
+                (nxml-choose-suitable-coding-system
+                 suitable-coding-systems)))
+      (let ((message
+            (if enc-name
+                (format "Unknown encoding %s" enc-name)
+              "XML declaration is not well-formed")))
+       (cond ((not coding-system)
+              (error "%s" message))
+             ((y-or-n-p
+               (concat message
+                       ". "
+                       (format (if enc-name
+                                   "Save with %s"
+                                 "Modify and save with encoding %s")
+                               (nxml-coding-system-name coding-system))
+                       " "))
+              (nxml-fix-encoding-declaration enc-pos coding-system))
+             (t (signal 'quit nil)))))
+    ;; Make sure it can encode all the characters in the buffer
+    (unless (or (memq (coding-system-base coding-system)
+                     suitable-coding-systems)
+               (equal suitable-coding-systems '(undecided)))
+      (let ((message
+            (nxml-unsuitable-coding-system-message coding-system
+                                                   enc-name)))
+       (setq coding-system
+             (and (not buffer-read-only)
+                  (nxml-choose-suitable-coding-system
+                   suitable-coding-systems)))
+       (cond ((not coding-system) (error "%s" message))
+             ((y-or-n-p (concat message
+                                (format ". Save with %s "
+                                        (nxml-coding-system-name
+                                         coding-system))))
+              (nxml-fix-encoding-declaration enc-pos coding-system))
+             (t (signal 'quit nil)))))
+    ;; Merge the newline type of our existing encoding
+    (let ((current-eol-type
+          (coding-system-eol-type buffer-file-coding-system)))
+      (when (and current-eol-type (integerp current-eol-type))
+       (setq coding-system
+             (coding-system-change-eol-conversion coding-system
+                                                  current-eol-type))))
+    coding-system))
+
+(defun nxml-unsuitable-coding-system-message (coding-system &optional enc-name)
+  (if (nxml-coding-system-unicode-p coding-system)
+      "Cannot translate some characters to Unicode"
+    (format "Cannot encode some characters with %s"
+           (or enc-name
+               (nxml-coding-system-name coding-system)))))
+
+(defconst nxml-utf-16-coding-systems (and (coding-system-p 'utf-16-be)
+                                         (coding-system-p 'utf-16-le)
+                                         '(utf-16-be utf-16-le)))
+
+(defconst nxml-utf-coding-systems (cons 'utf-8 nxml-utf-16-coding-systems))
+
+(defun nxml-coding-system-unicode-p (coding-system)
+  (nxml-coding-system-member (coding-system-base coding-system)
+                            nxml-utf-coding-systems))
+
+(defun nxml-coding-system-name (coding-system)
+  (setq coding-system (coding-system-base coding-system))
+  (symbol-name
+   (if (nxml-coding-system-member coding-system nxml-utf-16-coding-systems)
+       'utf-16
+     (or (coding-system-get coding-system 'mime-charset)
+        coding-system))))
+
+(defun nxml-fix-encoding-declaration (enc-pos coding-system)
+  (let ((charset (nxml-coding-system-name coding-system)))
+    (cond ((consp enc-pos)
+          (delete-region (car enc-pos) (cdr enc-pos))
+          (goto-char (car enc-pos))
+          (insert charset))
+         ((integerp enc-pos)
+          (goto-char enc-pos)
+          (insert " encoding=\"" charset ?\"))
+         (t
+          (goto-char (point-min))
+          (insert "<?xml version=\"1.0\" encoding=\""
+                  charset
+                  "\"?>\n")
+          (when (and (not enc-pos)
+                     (let ((case-fold-search t))
+                       (looking-at xmltok-bad-xml-decl-regexp)))
+            (delete-region (point) (match-end 0)))))))
+
+(defun nxml-choose-suitable-coding-system (suitable-coding-systems)
+  (let (ret coding-system)
+    (if (and buffer-file-coding-system
+            (memq (coding-system-base buffer-file-coding-system)
+                  suitable-coding-systems))
+       buffer-file-coding-system
+      (while (and suitable-coding-systems (not ret))
+       (setq coding-system (car suitable-coding-systems))
+       (if (coding-system-get coding-system 'mime-charset)
+           (setq ret coding-system)
+         (setq suitable-coding-systems (cdr suitable-coding-systems))))
+      ret)))
+
+(defun nxml-choose-utf-coding-system ()             
+  (let ((cur (and (local-variable-p 'buffer-file-coding-system)
+                 buffer-file-coding-system
+                 (coding-system-base buffer-file-coding-system))))
+    (cond ((car (nxml-coding-system-member cur nxml-utf-coding-systems)))
+         ((and nxml-prefer-utf-16-to-utf-8-flag
+               (coding-system-p 'utf-16-le)
+               (coding-system-p 'utf-16-be))
+          (if nxml-prefer-utf-16-little-to-big-endian-flag
+              'utf-16-le
+            'utf-16-be))
+         (t 'utf-8))))
+
+(defun nxml-choose-utf-16-coding-system ()
+  (let ((cur (and (local-variable-p 'buffer-file-coding-system)
+                 buffer-file-coding-system
+                 (coding-system-base buffer-file-coding-system))))
+    (cond ((car (nxml-coding-system-member cur nxml-utf-16-coding-systems)))
+         (nxml-prefer-utf-16-little-to-big-endian-flag
+          (and (coding-system-p 'utf-16-le) 'utf-16-le))
+         (t (and (coding-system-p 'utf-16-be) 'utf-16-be)))))
+
+(defun nxml-coding-system-member (coding-system coding-systems)
+  (let (ret)
+    (while (and coding-systems (not ret))
+      (if (coding-system-equal coding-system
+                              (car coding-systems))
+         (setq ret coding-systems)
+       (setq coding-systems (cdr coding-systems))))
+    ret))
+
+;;; Fontification
+
+(defun nxml-fontify (start)
+  (condition-case err
+      (save-excursion
+       (save-restriction
+         (widen)
+         (save-match-data
+           (nxml-with-invisible-motion
+             (nxml-with-unmodifying-text-property-changes
+               (if (or nxml-degraded
+                       ;; just in case we get called in the wrong buffer
+                       (not nxml-prolog-end))
+                   (nxml-set-fontified start (point-max))
+                 (nxml-fontify1 start)))))))
+    (error
+     (nxml-degrade 'nxml-fontify err))))
+
+(defun nxml-fontify1 (start)
+  (cond ((< start nxml-prolog-end)
+        (nxml-fontify-prolog)
+        (nxml-set-fontified (point-min)
+                            nxml-prolog-end))
+       (t
+        (goto-char start)
+        (when (not (eq nxml-last-fontify-end start))
+          (when (not (equal (char-after) ?\<))
+            (search-backward "<" nxml-prolog-end t))
+          (nxml-ensure-scan-up-to-date)
+          (nxml-move-outside-backwards))
+        (let ((start (point)))
+          (nxml-do-fontify (min (point-max)
+                                (+ start nxml-fontify-chunk-size)))
+          (setq nxml-last-fontify-end (point))
+          (nxml-set-fontified start nxml-last-fontify-end)))))
+
+(defun nxml-fontify-buffer ()
+  (interactive)
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-invisible-motion
+       (goto-char (point-min))
+       (nxml-with-unmodifying-text-property-changes
+         (nxml-fontify-prolog)
+         (goto-char nxml-prolog-end)
+         (nxml-do-fontify))))))
+
+(defun nxml-fontify-prolog ()
+  "Fontify the prolog.
+The buffer is assumed to be prepared for fontification.
+This does not set the fontified property, but it does clear
+faces appropriately."
+  (let ((regions nxml-prolog-regions))
+    (nxml-clear-face (point-min) nxml-prolog-end)
+    (while regions
+      (let ((region (car regions)))
+       (nxml-apply-fontify-rule (aref region 0)
+                                (aref region 1)
+                                (aref region 2)))
+      (setq regions (cdr regions)))))
+
+(defun nxml-do-fontify (&optional bound)
+  "Fontify at least as far as bound.
+Leave point after last fontified position."
+  (unless bound (setq bound (point-max)))
+  (let (xmltok-dependent-regions
+       xmltok-errors)
+    (while (and (< (point) bound)
+               (nxml-tokenize-forward))
+      (nxml-clear-face xmltok-start (point))
+      (nxml-apply-fontify-rule))))
+
+;; Vectors identify a substring of the token to be highlighted in some face.
+
+;; Token types returned by xmltok-forward.
+
+(put 'start-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [-1 nil nxml-tag-delimiter-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'partial-start-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'end-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [1 2 nxml-tag-slash-face]
+       [-1 nil nxml-tag-delimiter-face]
+       (element-qname . 2)))
+
+(put 'partial-end-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [1 2 nxml-tag-slash-face]
+       (element-qname . 2)))
+
+(put 'empty-element
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [-2 -1 nxml-tag-slash-face]
+       [-1 nil nxml-tag-delimiter-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'partial-empty-element
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [-1 nil nxml-tag-slash-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'char-ref
+     'nxml-fontify-rule
+     '([nil 2 nxml-char-ref-delimiter-face]
+       [2 -1 nxml-char-ref-number-face]
+       [-1 nil nxml-char-ref-delimiter-face]
+       char-ref))
+
+(put 'entity-ref
+     'nxml-fontify-rule
+     '([nil 1 nxml-entity-ref-delimiter-face]
+       [1 -1 nxml-entity-ref-name-face]
+       [-1 nil nxml-entity-ref-delimiter-face]))
+
+(put 'comment
+     'nxml-fontify-rule
+     '([nil 4 nxml-comment-delimiter-face]
+       [4 -3 nxml-comment-content-face]
+       [-3 nil nxml-comment-delimiter-face]))
+
+(put 'processing-instruction
+     'nxml-fontify-rule
+     '([nil 2 nxml-processing-instruction-delimiter-face]
+       [-2 nil nxml-processing-instruction-delimiter-face]
+       processing-instruction-content))
+
+(put 'cdata-section
+     'nxml-fontify-rule
+     '([nil 3 nxml-cdata-section-delimiter-face] ; <![
+       [3 8 nxml-cdata-section-CDATA-face] ; CDATA
+       [8 9 nxml-cdata-section-delimiter-face] ; [
+       [9 -3 nxml-cdata-section-content-face] ; ]]>
+       [-3 nil nxml-cdata-section-delimiter-face]))
+
+(put 'data
+     'nxml-fontify-rule
+     '([nil nil nxml-text-face]))
+
+;; Prolog region types in list returned by xmltok-forward-prolog.
+
+(put 'xml-declaration
+     'nxml-fontify-rule
+     '([nil 2 nxml-processing-instruction-delimiter-face]
+       [2 5 nxml-processing-instruction-target-face]
+       [-2 nil nxml-processing-instruction-delimiter-face]))
+
+(put 'xml-declaration-attribute-name
+     'nxml-fontify-rule
+     '([nil nil nxml-attribute-local-name-face]))
+
+(put 'xml-declaration-attribute-value
+     'nxml-fontify-rule
+     '([nil 1 nxml-attribute-value-delimiter-face]
+       [1 -1 nxml-attribute-value-face]
+       [-1 nil nxml-attribute-value-delimiter-face]))
+
+(put 'processing-instruction-left
+     'nxml-fontify-rule
+     '([nil 2 nxml-processing-instruction-delimiter-face]
+       [2 nil nxml-processing-instruction-target-face]))
+
+(put 'processing-instruction-right
+     'nxml-fontify-rule
+     '([nil -2 nxml-processing-instruction-content-face]
+       [-2 nil nxml-processing-instruction-delimiter-face]))
+
+(put 'literal
+     'nxml-fontify-rule
+     '([nil 1 nxml-prolog-literal-delimiter-face]
+       [1 -1 nxml-prolog-literal-content-face]
+       [-1 nil nxml-prolog-literal-delimiter-face]))
+
+(put 'keyword
+     'nxml-fontify-rule
+     '([nil nil nxml-prolog-keyword-face]))
+
+(put 'markup-declaration-open
+     'nxml-fontify-rule
+     '([0 2 nxml-markup-declaration-delimiter-face]
+       [2 nil nxml-prolog-keyword-face]))
+
+(put 'markup-declaration-close
+     'nxml-fontify-rule
+     '([nil nil nxml-markup-declaration-delimiter-face]))
+
+(put 'internal-subset-open
+     'nxml-fontify-rule
+     '([nil nil nxml-markup-declaration-delimiter-face]))
+
+(put 'internal-subset-close
+     'nxml-fontify-rule
+     '([nil 1 nxml-markup-declaration-delimiter-face]
+       [-1 nil nxml-markup-declaration-delimiter-face]))
+
+(put 'hash-name
+     'nxml-fontify-rule
+     '([nil 1 nxml-hash-face]
+       [1 nil nxml-prolog-keyword-face]))
+
+(defun nxml-apply-fontify-rule (&optional type start end)
+  (let ((rule (get (or type xmltok-type) 'nxml-fontify-rule)))
+    (unless start (setq start xmltok-start))
+    (unless end (setq end (point)))
+    (while rule
+      (let* ((action (car rule)))
+       (setq rule (cdr rule))
+       (cond ((vectorp action)
+              (nxml-set-face (let ((offset (aref action 0)))
+                               (cond ((not offset) start)
+                                     ((< offset 0) (+ end offset))
+                                     (t (+ start offset))))
+                             (let ((offset (aref action 1)))
+                               (cond ((not offset) end)
+                                     ((< offset 0) (+ end offset))
+                                     (t (+ start offset))))
+                             (aref action 2)))
+             ((and (consp action)
+                   (eq (car action) 'element-qname))
+              (when xmltok-name-end ; maybe nil in partial-end-tag case
+                (nxml-fontify-qname (+ start (cdr action))
+                                    xmltok-name-colon
+                                    xmltok-name-end
+                                    'nxml-element-prefix-face
+                                    'nxml-element-colon-face
+                                    'nxml-element-local-name-face)))
+             ((eq action 'attributes)
+              (nxml-fontify-attributes))
+             ((eq action 'processing-instruction-content)
+              (nxml-set-face (+ start 2)
+                             xmltok-name-end
+                             'nxml-processing-instruction-target-face)
+              (nxml-set-face (save-excursion
+                               (goto-char xmltok-name-end)
+                               (skip-chars-forward " \t\r\n")
+                               (point))
+                             (- end 2)
+                             'nxml-processing-instruction-content-face))
+             ((eq action 'char-ref)
+              (nxml-char-ref-display-extra start
+                                           end
+                                           (xmltok-char-number start end)))
+             (t (error "Invalid nxml-fontify-rule action %s" action)))))))
+
+(defun nxml-fontify-attributes ()
+  (while xmltok-namespace-attributes
+    (nxml-fontify-attribute (car xmltok-namespace-attributes)
+                           'namespace)
+    (setq xmltok-namespace-attributes
+         (cdr xmltok-namespace-attributes)))
+  (while xmltok-attributes
+    (nxml-fontify-attribute (car xmltok-attributes))
+    (setq xmltok-attributes
+         (cdr xmltok-attributes))))
+
+(defun nxml-fontify-attribute (att &optional namespace-declaration)
+  (if namespace-declaration
+      (nxml-fontify-qname (xmltok-attribute-name-start att)
+                         (xmltok-attribute-name-colon att)
+                         (xmltok-attribute-name-end att)
+                         'nxml-namespace-attribute-xmlns-face
+                         'nxml-namespace-attribute-colon-face
+                         'nxml-namespace-attribute-prefix-face
+                         'nxml-namespace-attribute-xmlns-face)
+    (nxml-fontify-qname (xmltok-attribute-name-start att)
+                       (xmltok-attribute-name-colon att)
+                       (xmltok-attribute-name-end att)
+                       'nxml-attribute-prefix-face
+                       'nxml-attribute-colon-face
+                       'nxml-attribute-local-name-face))
+  (let ((start (xmltok-attribute-value-start att))
+       (end (xmltok-attribute-value-end att))
+       (refs (xmltok-attribute-refs att))
+       (delimiter-face (if namespace-declaration
+                           'nxml-namespace-attribute-value-delimiter-face
+                         'nxml-attribute-value-delimiter-face))
+       (value-face (if namespace-declaration
+                       'nxml-namespace-attribute-value-face
+                     'nxml-attribute-value-face)))
+    (when start
+      (nxml-set-face (1- start) start delimiter-face)
+      (nxml-set-face end (1+ end) delimiter-face)
+      (while refs
+       (let* ((ref (car refs))
+              (ref-type (aref ref 0))
+              (ref-start (aref ref 1))
+              (ref-end (aref ref 2)))
+         (nxml-set-face start ref-start value-face)
+         (nxml-apply-fontify-rule ref-type ref-start ref-end)
+         (setq start ref-end))
+       (setq refs (cdr refs)))
+      (nxml-set-face start end value-face))))
+
+(defun nxml-fontify-qname (start
+                          colon
+                          end
+                          prefix-face
+                          colon-face
+                          local-name-face
+                          &optional
+                          unprefixed-face)
+  (cond (colon (nxml-set-face start colon prefix-face)
+              (nxml-set-face colon (1+ colon) colon-face)
+              (nxml-set-face (1+ colon) end local-name-face))
+       (t (nxml-set-face start end (or unprefixed-face
+                                       local-name-face)))))
+
+;;; Editing
+
+(defun nxml-electric-slash (arg)
+  "Insert a slash.
+
+With a prefix ARG, do nothing other than insert the slash.
+
+Otherwise, if `nxml-slash-auto-complete-flag' is non-nil, insert the
+rest of the end-tag or empty-element if the slash is potentially part
+of an end-tag or the close of an empty-element.
+
+If the slash is part of an end-tag that is the first non-whitespace
+on the line, reindent the line."
+  (interactive "*P")
+  (nxml-ensure-scan-up-to-date)
+  (let* ((slash-pos (point))
+        (end-tag-p (and (eq (char-before slash-pos) ?<)
+                        (not (nxml-get-inside slash-pos))))
+        (at-indentation (save-excursion
+                          (back-to-indentation)
+                          (eq (point) (1- slash-pos)))))
+    (self-insert-command (prefix-numeric-value arg))
+    (unless arg
+      (if nxml-slash-auto-complete-flag
+         (if end-tag-p
+             (condition-case err
+                 (let ((start-tag-end
+                        (nxml-scan-element-backward (1- slash-pos) t)))
+                   (when start-tag-end
+                     (insert (xmltok-start-tag-qname) ">")
+                     ;; copy the indentation of the start-tag
+                     (when (and at-indentation
+                                (save-excursion
+                                  (goto-char xmltok-start)
+                                  (back-to-indentation)
+                                  (eq (point) xmltok-start)))
+                       (save-excursion
+                         (indent-line-to (save-excursion
+                                           (goto-char xmltok-start)
+                                           (current-column)))))))
+               (nxml-scan-error nil))
+           (when (and (eq (nxml-token-before) (point))
+                      (eq xmltok-type 'partial-empty-element))
+             (insert ">")))
+       (when (and end-tag-p at-indentation)
+         (nxml-indent-line))))))
+
+(defun nxml-balanced-close-start-tag-block ()
+  "Close the start-tag before point with `>' and insert a balancing end-tag.
+Point is left between the start-tag and the end-tag.
+If there is nothing but whitespace before the `<' that opens the
+start-tag, then put point on a blank line, and put the end-tag on
+another line aligned with the start-tag."
+  (interactive "*")
+  (nxml-balanced-close-start-tag 'block))
+
+(defun nxml-balanced-close-start-tag-inline ()
+  "Close the start-tag before point with `>' and insert a balancing end-tag.
+Point is left between the start-tag and the end-tag.
+No extra whitespace is inserted."
+  (interactive "*")
+  (nxml-balanced-close-start-tag 'inline))
+
+(defun nxml-balanced-close-start-tag (block-or-inline)
+  (let ((token-end (nxml-token-before))
+       (pos (1+ (point))))
+    (unless (or (eq xmltok-type 'partial-start-tag)
+               (and (memq xmltok-type '(start-tag
+                                        empty-element
+                                        partial-empty-element))
+                    (>= token-end pos)))
+      (error "Not in a start-tag"))
+    (insert "></"
+           (buffer-substring-no-properties (+ xmltok-start 1)
+                                           (min xmltok-name-end (point)))
+           ">")
+    (if (eq block-or-inline 'inline)
+       (goto-char pos)
+      (goto-char xmltok-start)
+      (back-to-indentation)
+      (if (= (point) xmltok-start)
+         (let ((indent (current-column)))
+         (goto-char pos)
+         (insert "\n")
+         (indent-line-to indent)
+         (goto-char pos)
+         (insert "\n")
+         (indent-line-to (+ nxml-child-indent indent)))
+       (goto-char pos)))))
+       
+(defun nxml-finish-element ()
+  "Finish the current element by inserting an end-tag."
+  (interactive "*")
+  (nxml-finish-element-1 nil))
+
+(defvar nxml-last-split-position nil
+  "Position where `nxml-split-element' split the current element.")
+
+(defun nxml-split-element ()
+  "Split the current element by inserting an end-tag and a start-tag.
+Point is left after the newly inserted start-tag.  When repeated,
+split immediately before the previously inserted start-tag and leave
+point unchanged."
+  (interactive "*")
+  (setq nxml-last-split-position
+       (if (and (eq last-command this-command)
+                nxml-last-split-position)
+           (save-excursion
+             (goto-char nxml-last-split-position)
+             (nxml-finish-element-1 t))
+         (nxml-finish-element-1 t))))
+
+(defun nxml-finish-element-1 (startp)
+  "Insert an end-tag for the current element and optionally a start-tag.
+The start-tag is inserted if STARTP is non-nil.  Return the position
+of the inserted start-tag or nil if none was inserted."
+  (interactive "*")
+  (let* ((token-end (nxml-token-before))
+        (start-tag-end
+         (save-excursion
+           (when (and (< (point) token-end)
+                      (memq xmltok-type
+                            '(cdata-section
+                              processing-instruction
+                              comment
+                              start-tag
+                              end-tag
+                              empty-element)))
+             (error "Point is inside a %s"
+                    (nxml-token-type-friendly-name xmltok-type)))
+           (nxml-scan-element-backward token-end t)))
+        (starts-line
+         (save-excursion
+           (unless (eq xmltok-type 'start-tag)
+             (error "No matching start-tag"))
+           (goto-char xmltok-start)
+           (back-to-indentation)
+           (eq (point) xmltok-start)))
+        (ends-line
+         (save-excursion
+           (goto-char start-tag-end)
+           (looking-at "[ \t\r\n]*$")))
+        (start-tag-indent (save-excursion
+                            (goto-char xmltok-start)
+                            (current-column)))
+        (qname (xmltok-start-tag-qname))
+        inserted-start-tag-pos)
+    (when (and starts-line ends-line)
+      ;; start-tag is on a line by itself
+      ;; => put the end-tag on a line by itself
+      (unless (<= (point)
+                 (save-excursion
+                   (back-to-indentation)
+                   (point)))
+       (insert "\n"))
+      (indent-line-to start-tag-indent))
+    (insert "</" qname ">")
+    (when startp
+      (when starts-line
+       (insert "\n")
+       (indent-line-to start-tag-indent))
+      (setq inserted-start-tag-pos (point))
+      (insert "<" qname ">")
+      (when (and starts-line ends-line)
+       (insert "\n")
+       (indent-line-to (save-excursion
+                         (goto-char xmltok-start)
+                         (forward-line 1)
+                         (back-to-indentation)
+                         (if (= (current-column)
+                                (+ start-tag-indent nxml-child-indent))
+                             (+ start-tag-indent nxml-child-indent)
+                           start-tag-indent)))))
+    inserted-start-tag-pos))
+
+;;; Indentation
+
+(defun nxml-indent-line ()
+  "Indent current line as XML."
+  (let ((indent (nxml-compute-indent))
+       (from-end (- (point-max) (point))))
+    (when indent
+      (beginning-of-line)
+      (let ((bol (point)))
+       (skip-chars-forward " \t")
+       (delete-region bol (point)))
+      (indent-to indent)
+      (when (> (- (point-max) from-end) (point))
+       (goto-char (- (point-max) from-end))))))
+
+(defun nxml-compute-indent ()
+  "Return the indent for the line containing point."
+  (or (nxml-compute-indent-from-matching-start-tag)
+      (nxml-compute-indent-from-previous-line)))
+
+(defun nxml-compute-indent-from-matching-start-tag ()
+  "Compute the indent for a line with an end-tag using the matching start-tag.
+When the line containing point ends with an end-tag and does not start
+in the middle of a token, return the indent of the line containing the
+matching start-tag, if there is one and it occurs at the beginning of
+its line.  Otherwise return nil."
+  (save-excursion
+    (back-to-indentation)
+    (let ((bol (point)))
+      (let ((inhibit-field-text-motion t))
+       (end-of-line))
+      (skip-chars-backward " \t")
+      (and (= (nxml-token-before) (point))
+          (memq xmltok-type '(end-tag partial-end-tag))
+          ;; start of line must not be inside a token
+          (or (= xmltok-start bol)
+              (save-excursion
+                (goto-char bol)
+                (nxml-token-after)
+                (= xmltok-start bol))
+              (eq xmltok-type 'data))
+          (condition-case err
+              (nxml-scan-element-backward
+               (point)
+               nil
+               (- (point)
+                  nxml-end-tag-indent-scan-distance))
+            (nxml-scan-error nil))
+          (< xmltok-start bol)
+          (progn
+            (goto-char xmltok-start)
+            (skip-chars-backward " \t")
+            (bolp))
+          (current-indentation)))))
+
+(defun nxml-compute-indent-from-previous-line ()
+  "Compute the indent for a line using the indentation of a previous line."
+  (save-excursion
+    (end-of-line)
+    (let ((eol (point))
+         bol prev-bol ref
+         before-context after-context)
+      (back-to-indentation)
+      (setq bol (point))
+      (catch 'indent
+       ;; Move backwards until the start of a non-blank line that is
+       ;; not inside a token.
+       (while (progn
+                (when (= (forward-line -1) -1)
+                  (throw 'indent 0))
+                (back-to-indentation)
+                (if (looking-at "[ \t]*$")
+                    t
+                  (or prev-bol
+                      (setq prev-bol (point)))
+                  (nxml-token-after)
+                  (not (or (= xmltok-start (point))
+                           (eq xmltok-type 'data))))))
+       (setq ref (point))
+       ;; Now scan over tokens until the end of the line to be indented.
+       ;; Determine the context before and after the beginning of the
+       ;; line.
+       (while (< (point) eol)
+         (nxml-tokenize-forward)
+         (cond ((<= bol xmltok-start)
+                (setq after-context
+                      (nxml-merge-indent-context-type after-context)))
+               ((and (<= (point) bol)
+                     (not (and (eq xmltok-type 'partial-start-tag)
+                               (= (point) bol))))
+                (setq before-context
+                      (nxml-merge-indent-context-type before-context)))
+               ((eq xmltok-type 'data)
+                (setq before-context
+                      (nxml-merge-indent-context-type before-context))
+                (setq after-context
+                      (nxml-merge-indent-context-type after-context)))
+               ;; If in the middle of a token that looks inline,
+               ;; then indent relative to the previous non-blank line
+               ((eq (nxml-merge-indent-context-type before-context)
+                    'mixed)
+                (goto-char prev-bol)
+                (throw 'indent (current-column)))
+               (t
+                (throw 'indent
+                       (nxml-compute-indent-in-token bol))))
+         (skip-chars-forward " \t\r\n"))
+       (goto-char ref)
+       (+ (current-column)
+          (* nxml-child-indent
+             (+ (if (eq before-context 'start-tag) 1 0)
+                (if (eq after-context 'end-tag) -1 0))))))))
+
+(defun nxml-merge-indent-context-type (context)
+  "Merge the indent context type CONTEXT with the token in `xmltok-type'.
+Return the merged indent context type.  An indent context type is
+either nil or one of the symbols start-tag, end-tag, markup, comment,
+mixed."
+  (cond ((memq xmltok-type '(start-tag partial-start-tag))
+        (if (memq context '(nil start-tag comment))
+            'start-tag
+          'mixed))
+       ((memq xmltok-type '(end-tag partial-end-tag))
+        (if (memq context '(nil end-tag comment))
+            'end-tag
+          'mixed))
+       ((eq xmltok-type 'comment)
+        (cond ((memq context '(start-tag end-tag comment))
+               context)
+              (context 'mixed)
+              (t 'comment)))
+       (context 'mixed)
+       (t 'markup)))
+
+(defun nxml-compute-indent-in-token (pos)
+  "Return the indent for a line that starts inside a token.
+POS is the position of the first non-whitespace character of the line.
+This expects the xmltok-* variables to be set up as by `xmltok-forward'."
+  (cond ((memq xmltok-type '(start-tag
+                            partial-start-tag
+                            empty-element
+                            partial-empty-element))
+        (nxml-compute-indent-in-start-tag pos))
+       ((eq xmltok-type 'comment)
+        (nxml-compute-indent-in-delimited-token pos "<!--" "-->"))
+       ((eq xmltok-type 'cdata-section)
+        (nxml-compute-indent-in-delimited-token pos "<![CDATA[" "]]>"))
+       ((eq xmltok-type 'processing-instruction)
+        (nxml-compute-indent-in-delimited-token pos "<?" "?>"))
+       (t
+        (goto-char pos)
+        (if (and (= (forward-line -1) 0)
+                 (< xmltok-start (point)))
+            (back-to-indentation)
+          (goto-char xmltok-start))
+        (current-column))))
+
+(defun nxml-compute-indent-in-start-tag (pos)
+  "Return the indent for a line that starts inside a start-tag.
+Also for a line that starts inside an empty element.
+POS is the position of the first non-whitespace character of the line.
+This expects the xmltok-* variables to be set up as by `xmltok-forward'."
+  (let ((value-boundary (nxml-attribute-value-boundary pos))
+       (off 0))
+    (if value-boundary
+       ;; inside an attribute value
+       (let ((value-start (car value-boundary))
+             (value-end (cdr value-boundary)))
+         (goto-char pos)
+         (forward-line -1)
+         (if (< (point) value-start)
+             (goto-char value-start)
+           (back-to-indentation)))
+      ;; outside an attribute value
+      (goto-char pos)
+      (while (and (= (forward-line -1) 0)
+                 (nxml-attribute-value-boundary (point))))
+      (cond ((<= (point) xmltok-start)
+            (goto-char xmltok-start)
+            (setq off nxml-attribute-indent)
+            (let ((atts (xmltok-merge-attributes)))
+              (when atts
+                (let* ((att (car atts))
+                       (start (xmltok-attribute-name-start att)))
+                  (when (< start pos)
+                    (goto-char start)
+                    (setq off 0))))))
+           (t
+            (back-to-indentation))))
+    (+ (current-column) off)))
+
+(defun nxml-attribute-value-boundary (pos)
+  "Return a pair (START . END) if POS is inside an attribute value.
+Otherwise return nil.  START and END are the positions of the start
+and end of the attribute value containing POS.  This expects the
+xmltok-* variables to be set up as by `xmltok-forward'."
+  (let ((atts (xmltok-merge-attributes))
+       att value-start value-end value-boundary)
+    (while atts
+      (setq att (car atts))
+      (setq value-start (xmltok-attribute-value-start att))
+      (setq value-end (xmltok-attribute-value-end att))
+      (cond ((and value-start (< pos value-start))
+            (setq atts nil))
+           ((and value-start value-end (<= pos value-end))
+            (setq value-boundary (cons value-start value-end))
+            (setq atts nil))
+           (t (setq atts (cdr atts)))))
+    value-boundary))
+            
+(defun nxml-compute-indent-in-delimited-token (pos open-delim close-delim)
+  "Return the indent for a line that starts inside a token with delimiters.
+OPEN-DELIM and CLOSE-DELIM are strings giving the opening and closing
+delimiters.  POS is the position of the first non-whitespace character
+of the line.  This expects the xmltok-* variables to be set up as by
+`xmltok-forward'."
+  (cond ((let ((end (+ pos (length close-delim))))
+          (and (<= end (point-max))
+               (string= (buffer-substring-no-properties pos end)
+                        close-delim)))
+        (goto-char xmltok-start))
+       ((progn
+          (goto-char pos)
+          (forward-line -1)
+          (<= (point) xmltok-start))
+        (goto-char (+ xmltok-start (length open-delim)))
+        (when (and (string= open-delim "<!--")
+                   (looking-at " "))
+          (goto-char (1+ (point)))))
+       (t (back-to-indentation)))
+  (current-column))
+
+;;; Completion
+
+(defun nxml-complete ()
+  "Perform completion on the symbol preceding point.
+
+Inserts as many characters as can be completed.  However, if not even
+one character can be completed, then a buffer with the possibilities
+is popped up and the symbol is read from the minibuffer with
+completion. If the symbol is complete, then any characters that must
+follow the symbol are also inserted.
+
+The name space used for completion and what is treated as a symbol
+depends on the context.  The contexts in which completion is performed
+depend on `nxml-completion-hook'."
+  (interactive)
+  (unless (run-hook-with-args-until-success 'nxml-completion-hook)
+    ;; Eventually we will complete on entity names here.
+    (ding)
+    (message "Cannot complete in this context")))
+
+;;; Movement
+
+(defun nxml-forward-balanced-item (&optional arg)
+  "Move forward across one balanced item.
+With ARG, do it that many times.  Negative arg -N means
+move backward across N balanced expressions.
+This is the equivalent of `forward-sexp' for XML.
+
+An element contains as items strings with no markup, tags, processing
+instructions, comments, CDATA sections, entity references and
+characters references. However, if the variable
+`nxml-sexp-element-flag' is non-nil, then an element is treated as a
+single markup item.  A start-tag contains an element name followed by
+one or more attributes.  An end-tag contains just an element name.  An
+attribute value literals contains strings with no markup, entity
+references and character references.  A processing instruction
+consists of a target and a content string.  A comment or a CDATA
+section contains a single string.  An entity reference contains a
+single name.  A character reference contains a character number."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (cond ((> arg 0)
+        (while (progn
+                 (nxml-forward-single-balanced-item)
+                 (> (setq arg (1- arg)) 0))))
+       ((< arg 0)
+        (while (progn
+                 (nxml-backward-single-balanced-item)
+                 (< (setq arg (1+ arg)) 0))))))
+
+(defun nxml-forward-single-balanced-item ()
+  (condition-case err
+      (goto-char (let ((end (nxml-token-after)))
+                  (save-excursion
+                    (while (eq xmltok-type 'space)
+                      (goto-char end)
+                      (setq end (nxml-token-after)))
+                    (cond ((/= (point) xmltok-start)
+                           (nxml-scan-forward-within end))
+                          ((and nxml-sexp-element-flag
+                                (eq xmltok-type 'start-tag))
+                           ;; can't ever return nil here
+                           (nxml-scan-element-forward xmltok-start))
+                          ((and nxml-sexp-element-flag
+                                (memq xmltok-type
+                                      '(end-tag partial-end-tag)))
+                           (error "Already at end of element"))
+                          (t end)))))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err)))))
+
+(defun nxml-backward-single-balanced-item ()
+  (condition-case err
+      (goto-char (let ((end (nxml-token-before)))
+                  (save-excursion
+                    (while (eq xmltok-type 'space)
+                      (goto-char xmltok-start)
+                      (setq end (nxml-token-before)))
+                    (cond ((/= (point) end)
+                           (nxml-scan-backward-within end))
+                          ((and nxml-sexp-element-flag
+                                (eq xmltok-type 'end-tag))
+                           ;; can't ever return nil here
+                           (nxml-scan-element-backward end)
+                           xmltok-start)
+                          ((and nxml-sexp-element-flag
+                                (eq xmltok-type 'start-tag))
+                           (error "Already at start of element"))
+                          (t xmltok-start)))))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err)))))
+
+(defun nxml-scan-forward-within (end)
+  (setq end (- end (nxml-end-delimiter-length xmltok-type)))
+  (when (<= end (point))
+    (error "Already at end of %s"
+          (nxml-token-type-friendly-name xmltok-type)))
+  (cond ((memq xmltok-type '(start-tag
+                            empty-element
+                            partial-start-tag
+                            partial-empty-element))
+        (if (< (point) xmltok-name-end)
+            xmltok-name-end
+          (let ((att (nxml-find-following-attribute)))
+            (cond ((not att) end)
+                  ((and (xmltok-attribute-value-start att)
+                        (<= (xmltok-attribute-value-start att)
+                            (point)))
+                   (nxml-scan-forward-in-attribute-value att))
+                  ((xmltok-attribute-value-end att)
+                   (1+ (xmltok-attribute-value-end att)))
+                  ((save-excursion
+                     (goto-char (xmltok-attribute-name-end att))
+                     (looking-at "[ \t\r\n]*="))
+                   (match-end 0))
+                  (t (xmltok-attribute-name-end att))))))
+       ((and (eq xmltok-type 'processing-instruction)
+             (< (point) xmltok-name-end))
+        xmltok-name-end)
+       (t end)))
+
+(defun nxml-scan-backward-within (end)
+  (setq xmltok-start
+       (+ xmltok-start
+          (nxml-start-delimiter-length xmltok-type)))
+  (when (<= (point) xmltok-start)
+    (error "Already at start of %s"
+          (nxml-token-type-friendly-name xmltok-type)))
+  (cond ((memq xmltok-type '(start-tag
+                            empty-element
+                            partial-start-tag
+                            partial-empty-element))
+        (let ((att (nxml-find-preceding-attribute)))
+          (cond ((not att) xmltok-start)
+                ((and (xmltok-attribute-value-start att)
+                      (<= (xmltok-attribute-value-start att)
+                          (point))
+                      (<= (point)
+                          (xmltok-attribute-value-end att)))
+                 (nxml-scan-backward-in-attribute-value att))
+                (t (xmltok-attribute-name-start att)))))
+       ((and (eq xmltok-type 'processing-instruction)
+             (let ((content-start (save-excursion
+                                    (goto-char xmltok-name-end)
+                                    (skip-chars-forward " \r\t\n")
+                                    (point))))
+               (and (< content-start (point))
+                    content-start))))
+       (t xmltok-start)))
+
+(defun nxml-scan-forward-in-attribute-value (att)
+  (when (= (point) (xmltok-attribute-value-end att))
+    (error "Already at end of attribute value"))
+  (let ((refs (xmltok-attribute-refs att))
+       ref)
+    (while refs
+      (setq ref (car refs))
+      (if (< (point) (aref ref 2))
+         (setq refs nil)
+       (setq ref nil)
+       (setq refs (cdr refs))))
+    (cond ((not ref)
+          (xmltok-attribute-value-end att))
+         ((< (point) (aref ref 1))
+          (aref ref 1))
+         ((= (point) (aref ref 1))
+          (aref ref 2))
+         (t
+          (let ((end (- (aref ref 2)
+                        (nxml-end-delimiter-length (aref ref 0)))))
+            (if (< (point) end)
+                end
+              (error "Already at end of %s"
+                     (nxml-token-type-friendly-name (aref ref 0)))))))))
+
+(defun nxml-scan-backward-in-attribute-value (att)
+  (when (= (point) (xmltok-attribute-value-start att))
+    (error "Already at start of attribute value"))
+  (let ((refs (reverse (xmltok-attribute-refs att)))
+       ref)
+    (while refs
+      (setq ref (car refs))
+      (if (< (aref ref 1) (point))
+         (setq refs nil)
+       (setq ref nil)
+       (setq refs (cdr refs))))
+    (cond ((not ref)
+          (xmltok-attribute-value-start att))
+         ((< (aref ref 2) (point))
+          (aref ref 2))
+         ((= (point) (aref ref 2))
+          (aref ref 1))
+         (t
+          (let ((start (+ (aref ref 1)
+                          (nxml-start-delimiter-length (aref ref 0)))))
+            (if (< start (point))
+                start
+              (error "Already at start of %s"
+                     (nxml-token-type-friendly-name (aref ref 0)))))))))
+
+(defun nxml-find-following-attribute ()
+  (let ((ret nil)
+       (atts (or xmltok-attributes xmltok-namespace-attributes))
+       (more-atts (and xmltok-attributes xmltok-namespace-attributes)))
+    (while atts
+      (let* ((att (car atts))
+            (name-start (xmltok-attribute-name-start att)))
+       (cond ((and (<= name-start (point))
+                   (xmltok-attribute-value-end att)
+                   ;; <= because end is before quote
+                   (<= (point) (xmltok-attribute-value-end att)))
+              (setq atts nil)
+              (setq ret att))
+             ((and (< (point) name-start)
+                   (or (not ret)
+                       (< name-start
+                          (xmltok-attribute-name-start ret))))
+              (setq ret att))))
+      (setq atts (cdr atts))
+      (unless atts
+       (setq atts more-atts)
+       (setq more-atts nil)))
+    ret))
+
+(defun nxml-find-preceding-attribute ()
+  (let ((ret nil)
+       (atts (or xmltok-attributes xmltok-namespace-attributes))
+       (more-atts (and xmltok-attributes xmltok-namespace-attributes)))
+    (while atts
+      (let* ((att (car atts))
+            (name-start (xmltok-attribute-name-start att)))
+       (cond ((and (< name-start (point))
+                   (xmltok-attribute-value-end att)
+                   ;; <= because end is before quote
+                   (<= (point) (xmltok-attribute-value-end att)))
+              (setq atts nil)
+              (setq ret att))
+             ((and (< name-start (point))
+                   (or (not ret)
+                       (< (xmltok-attribute-name-start ret)
+                          name-start)))
+              (setq ret att))))
+      (setq atts (cdr atts))
+      (unless atts
+       (setq atts more-atts)
+       (setq more-atts nil)))
+    ret))
+
+(defun nxml-up-element (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-backward-up-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point) (point-max)))
+         (let ((token-end (nxml-token-after)))
+           (goto-char (cond ((or (memq xmltok-type '(end-tag
+                                                     partial-end-tag))
+                                 (and (memq xmltok-type
+                                            '(empty-element
+                                              partial-empty-element))
+                                      (< xmltok-start (point))))
+                             token-end)
+                            ((nxml-scan-element-forward
+                              (if (and (eq xmltok-type 'start-tag)
+                                       (= (point) xmltok-start))
+                                  xmltok-start
+                                token-end)
+                              t))
+                            (t (error "No parent element")))))
+         (setq arg (1- arg)))
+      (nxml-scan-error
+       (goto-char (cadr err))
+       (apply 'error (cddr err))))))
+
+(defun nxml-backward-up-element (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-up-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point-min) (point)))
+         (let ((token-end (nxml-token-before)))
+           (goto-char (cond ((or (memq xmltok-type '(start-tag
+                                                     partial-start-tag))
+                                 (and (memq xmltok-type
+                                            '(empty-element
+                                              partial-empty-element))
+                                      (< (point) token-end)))
+                             xmltok-start)
+                            ((nxml-scan-element-backward
+                              (if (and (eq xmltok-type 'end-tag)
+                                       (= (point) token-end))
+                                  token-end
+                                xmltok-start)
+                              t)
+                             xmltok-start)
+                            (t (error "No parent element")))))
+         (setq arg (1- arg)))
+      (nxml-scan-error
+       (goto-char (cadr err))
+       (apply 'error (cddr err))))))
+
+(defun nxml-down-element (&optional arg)
+  "Move forward down into the content of an element.
+With ARG, do this that many times.
+Negative ARG means move backward but still down."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-backward-down-element (- arg))
+    (while (> arg 0)
+      (goto-char
+       (let ((token-end (nxml-token-after)))
+        (save-excursion
+          (goto-char token-end)
+          (while (progn
+                   (when (memq xmltok-type '(nil end-tag partial-end-tag))
+                     (error "No following start-tags in this element"))
+                   (not (memq xmltok-type '(start-tag partial-start-tag))))
+            (nxml-tokenize-forward))
+          (point))))
+      (setq arg (1- arg)))))
+
+(defun nxml-backward-down-element (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-down-element (- arg))
+    (while (> arg 0)
+      (goto-char
+        (save-excursion
+          (nxml-token-before)
+          (goto-char xmltok-start)
+          (while (progn
+                   (when (memq xmltok-type '(start-tag
+                                             partial-start-tag
+                                             prolog
+                                             nil))
+                     (error "No preceding end-tags in this element"))
+                   (not (memq xmltok-type '(end-tag partial-end-tag))))
+            (if (or (<= (point) nxml-prolog-end)
+                    (not (search-backward "<" nxml-prolog-end t)))
+                (setq xmltok-type nil)
+              (nxml-move-outside-backwards)
+              (xmltok-forward)))
+          xmltok-start))
+      (setq arg (1- arg)))))
+
+(defun nxml-forward-element (&optional arg)
+  "Move forward over one element.
+With ARG, do it that many times.
+Negative ARG means move backward."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-backward-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point) (point-max)))
+         (goto-char
+          (or (nxml-scan-element-forward (nxml-token-before))
+              (error "No more elements")))
+         (setq arg (1- arg)))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err))))))
+
+(defun nxml-backward-element (&optional arg)
+  "Move backward over one element.
+With ARG, do it that many times.
+Negative ARG means move forward."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-forward-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point-min) (point)))
+         (goto-char
+          (or (and (nxml-scan-element-backward (progn
+                                                 (nxml-token-after)
+                                                 xmltok-start))
+                   xmltok-start)
+              (error "No preceding elements")))
+         (setq arg (1- arg)))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err))))))
+
+(defun nxml-mark-token-after ()
+  (interactive)
+  (push-mark (nxml-token-after) nil t)
+  (goto-char xmltok-start)
+  (message "Marked %s" xmltok-type))
+
+;;; Paragraphs
+
+(defun nxml-mark-paragraph ()
+  "Put point at beginning of this paragraph, mark at end.
+The paragraph marked is the one that contains point or follows point."
+  (interactive)
+  (nxml-forward-paragraph)
+  (push-mark nil t t)
+  (nxml-backward-paragraph))
+
+(defun nxml-forward-paragraph (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (cond ((< arg 0)
+        (nxml-backward-paragraph (- arg)))
+       ((> arg 0)
+        (forward-line 0)
+        (while (and (nxml-forward-single-paragraph)
+                    (> (setq arg (1- arg)) 0))))))
+
+(defun nxml-backward-paragraph (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (cond ((< arg 0)
+        (nxml-forward-paragraph (- arg)))
+       ((> arg 0)
+        (unless (bolp)
+          (let ((inhibit-field-text-motion t))
+            (end-of-line)))
+        (while (and (nxml-backward-single-paragraph)
+                    (> (setq arg (1- arg)) 0))))))
+
+(defun nxml-forward-single-paragraph ()
+  "Move forward over a single paragraph.
+Return nil at end of buffer, t otherwise."
+  (let* ((token-end (nxml-token-after))
+        (offset (- (point) xmltok-start))
+        pos had-data)
+    (goto-char token-end)
+    (while (and (< (point) (point-max))
+               (not (setq pos
+                          (nxml-paragraph-end-pos had-data offset))))
+      (when (nxml-token-contains-data-p offset)
+       (setq had-data t))
+      (nxml-tokenize-forward)
+      (setq offset 0))
+    (when pos (goto-char pos))))
+
+(defun nxml-backward-single-paragraph ()
+  "Move backward over a single paragraph.
+Return nil at start of buffer, t otherwise."
+  (let* ((token-end (nxml-token-before))
+        (offset (- token-end (point)))
+        (last-tag-pos xmltok-start)
+        pos had-data last-data-pos)
+    (goto-char token-end)
+    (unless (setq pos (nxml-paragraph-start-pos nil offset))
+      (setq had-data (nxml-token-contains-data-p nil offset))
+      (goto-char xmltok-start)
+      (while (and (not pos) (< (point-min) (point)))
+       (cond ((search-backward "<" nxml-prolog-end t)
+              (nxml-move-outside-backwards)
+              (save-excursion
+                (while (< (point) last-tag-pos)
+                  (xmltok-forward)
+                  (when (and (not had-data) (nxml-token-contains-data-p))
+                    (setq pos nil)
+                    (setq last-data-pos xmltok-start))
+                  (let ((tem (nxml-paragraph-start-pos had-data 0)))
+                    (when tem (setq pos tem)))))
+              (when (and (not had-data) last-data-pos (not pos))
+                (setq had-data t)
+                (save-excursion
+                  (while (< (point) last-data-pos)
+                    (xmltok-forward))
+                  (let ((tem (nxml-paragraph-start-pos had-data 0)))
+                    (when tem (setq pos tem)))))
+              (setq last-tag-pos (point)))
+             (t (goto-char (point-min))))))
+    (when pos (goto-char pos))))
+
+(defun nxml-token-contains-data-p (&optional start end)
+  (setq start (+ xmltok-start (or start 0)))
+  (setq end (- (point) (or end 0)))
+  (when (eq xmltok-type 'cdata-section)
+    (setq start (max start (+ xmltok-start 9)))
+    (setq end (min end (- (point) 3))))
+  (or (and (eq xmltok-type 'data)
+          (eq start xmltok-start)
+          (eq end (point)))
+      (eq xmltok-type 'char-ref)
+      (and (memq xmltok-type '(data cdata-section))
+          (< start end)
+          (save-excursion
+            (goto-char start)
+            (re-search-forward "[^ \t\r\n]" end t)))))
+
+(defun nxml-paragraph-end-pos (had-data offset)
+  "Return the position of the paragraph end if contained in the current token.
+Return nil if the current token does not contain the paragraph end.
+Only characters after OFFSET from the start of the token are eligible.
+HAD-DATA says whether there have been non-whitespace data characters yet."
+  (cond ((not had-data)
+        (cond ((memq xmltok-type '(data cdata-section))
+               (save-excursion
+                 (let ((end (point)))
+                   (goto-char (+ xmltok-start
+                                 (max (if (eq xmltok-type 'cdata-section)
+                                          9
+                                        0)
+                                      offset)))
+                   (and (re-search-forward "[^ \t\r\n]" end t)
+                        (re-search-forward "^[ \t]*$" end t)
+                        (match-beginning 0)))))
+              ((and (eq xmltok-type 'comment)
+                    (nxml-token-begins-line-p)
+                    (nxml-token-ends-line-p))
+               (save-excursion
+                 (let ((end (point)))
+                   (goto-char (+ xmltok-start (max 4 offset)))
+                   (when (re-search-forward "[^ \t\r\n]" (- end 3) t)
+                     (if (re-search-forward "^[ \t]*$" end t)
+                         (match-beginning 0)
+                       (goto-char (- end 3))
+                       (skip-chars-backward " \t")
+                       (unless (bolp)
+                         (beginning-of-line 2))
+                       (point))))))))
+       ((memq xmltok-type '(data space cdata-section))
+        (save-excursion
+          (let ((end (point)))
+            (goto-char (+ xmltok-start offset))
+            (and (re-search-forward "^[ \t]*$" end t)
+                 (match-beginning 0)))))
+       ((and (memq xmltok-type '(start-tag 
+                                 end-tag
+                                 empty-element
+                                 comment
+                                 processing-instruction
+                                 entity-ref))
+             (nxml-token-begins-line-p)
+             (nxml-token-ends-line-p))
+        (save-excursion
+          (goto-char xmltok-start)
+          (skip-chars-backward " \t")
+          (point)))
+       ((and (eq xmltok-type 'end-tag)
+             (looking-at "[ \t]*$")
+             (not (nxml-in-mixed-content-p t)))
+        (save-excursion
+          (or (search-forward "\n" nil t) 
+              (point-max))))))
+
+(defun nxml-paragraph-start-pos (had-data offset)
+  "Return the position of the paragraph start if contained in the current token.
+Return nil if the current token does not contain the paragraph start.
+Only characters before OFFSET from the end of the token are eligible.
+HAD-DATA says whether there have been non-whitespace data characters yet."
+  (cond ((not had-data)
+        (cond ((memq xmltok-type '(data cdata-section))
+               (save-excursion
+                 (goto-char (- (point)
+                               (max (if (eq xmltok-type 'cdata-section)
+                                        3
+                                      0)
+                                    offset)))
+                 (and (re-search-backward "[^ \t\r\n]" xmltok-start t)
+                      (re-search-backward "^[ \t]*$" xmltok-start t)
+                      (match-beginning 0))))
+              ((and (eq xmltok-type 'comment)
+                    (nxml-token-ends-line-p)
+                    (nxml-token-begins-line-p))
+               (save-excursion
+                 (goto-char (- (point) (max 3 offset)))
+                 (when (and (< (+ xmltok-start 4) (point))
+                            (re-search-backward "[^ \t\r\n]"
+                                                (+ xmltok-start 4)
+                                                t))
+                   (if (re-search-backward "^[ \t]*$" xmltok-start t)
+                       (match-beginning 0)
+                     (goto-char xmltok-start)
+                     (if (looking-at "<!--[ \t]*\n")
+                         (match-end 0)
+                       (skip-chars-backward " \t")
+                       (point))))))))
+       ((memq xmltok-type '(data space cdata-section))
+        (save-excursion
+          (goto-char (- (point) offset))
+          (and (re-search-backward "^[ \t]*$" xmltok-start t)
+               (match-beginning 0))))
+       ((and (memq xmltok-type '(start-tag 
+                                 end-tag
+                                 empty-element
+                                 comment
+                                 processing-instruction
+                                 entity-ref))
+             (nxml-token-ends-line-p)
+             (nxml-token-begins-line-p))
+        (or (search-forward "\n" nil t) 
+            (point-max)))
+       ((and (eq xmltok-type 'start-tag)
+             (nxml-token-begins-line-p)
+             (not (save-excursion
+                    (goto-char xmltok-start)
+                    (nxml-in-mixed-content-p nil))))
+        (save-excursion
+          (goto-char xmltok-start)
+          (skip-chars-backward " \t")
+          ;; include any blank line before
+          (or (and (eq (char-before) ?\n)
+                   (save-excursion
+                     (goto-char (1- (point)))
+                     (skip-chars-backward " \t")
+                     (and (bolp) (point))))
+              (point))))))
+
+(defun nxml-token-ends-line-p () (looking-at "[ \t]*$"))
+
+(defun nxml-token-begins-line-p ()
+  (save-excursion
+    (goto-char xmltok-start)
+    (skip-chars-backward " \t")
+    (bolp)))
+
+(defun nxml-in-mixed-content-p (endp)
+  "Return non-nil if point is in mixed content.
+Point must be after an end-tag or before a start-tag.
+ENDP is t in the former case, nil in the latter."
+  (let (matching-tag-pos)
+    (cond ((not (run-hook-with-args-until-failure
+                'nxml-in-mixed-content-hook))
+          nil)
+         ;; See if the matching tag does not start or end a line.
+         ((condition-case err
+              (progn
+                (setq matching-tag-pos
+                      (xmltok-save
+                        (if endp
+                            (and (nxml-scan-element-backward (point))
+                                 xmltok-start)
+                          (nxml-scan-element-forward (point)))))
+                (and matching-tag-pos
+                     (save-excursion
+                       (goto-char matching-tag-pos)
+                       (not (if endp
+                                (progn
+                                  (skip-chars-backward " \t")
+                                  (bolp))
+                              (looking-at "[ \t]*$"))))))
+            (nxml-scan-error nil))
+          t)
+         ;; See if there's data at the same level.
+         ((let (start end)
+            (if endp
+                (setq start matching-tag-pos
+                      end (point))
+              (setq start (point)
+                    end matching-tag-pos))
+            (save-excursion
+              (or (when start
+                    (goto-char start)
+                    (nxml-preceding-sibling-data-p))
+                  (when end
+                    (goto-char end)
+                    (nxml-following-sibling-data-p)))))
+          t)
+         ;; Otherwise, treat as not mixed
+         (t nil))))
+
+(defun nxml-preceding-sibling-data-p ()
+  "Return non-nil if there is a previous sibling that is data."
+  (let ((lim (max (- (point) nxml-mixed-scan-distance)
+                 nxml-prolog-end))
+       (level 0)
+       found end)
+    (xmltok-save
+      (save-excursion
+       (while (and (< lim (point))
+                   (>= level 0)
+                   (not found)
+                   (progn
+                     (setq end (point))
+                     (search-backward "<" lim t)))
+         (nxml-move-outside-backwards)
+         (save-excursion
+           (xmltok-forward)
+           (let ((prev-level level))
+             (cond ((eq xmltok-type 'end-tag)
+                    (setq level (1+ level)))
+                   ((eq xmltok-type 'start-tag)
+                    (setq level (1- level))))
+             (when (eq prev-level 0)
+               (while (and (< (point) end) (not found))
+                 (xmltok-forward)
+                 (when (memq xmltok-type '(data cdata-section char-ref))
+                   (setq found t)))))))))
+    found))
+
+(defun nxml-following-sibling-data-p ()
+  (let ((lim (min (+ (point) nxml-mixed-scan-distance)
+                 (point-max)))
+       (level 0)
+       found)
+    (xmltok-save
+      (save-excursion
+       (while (and (< (point) lim)
+                   (>= level 0)
+                   (nxml-tokenize-forward)
+                   (not found))
+         (cond ((eq xmltok-type 'start-tag)
+                (setq level (1+ level)))
+               ((eq xmltok-type 'end-tag)
+                (setq level (1- level)))
+               ((and (eq level 0)
+                     (memq xmltok-type '(data cdata-section char-ref)))
+                (setq found t))))))
+    found))
+
+;;; Filling
+
+(defun nxml-do-fill-paragraph (arg)
+  (let (fill-paragraph-function
+       fill-prefix
+       start end)
+    (save-excursion
+      (nxml-forward-paragraph)
+      (setq end (point))
+      (nxml-backward-paragraph)
+      (skip-chars-forward " \t\r\n")
+      (setq start (point))
+      (beginning-of-line)
+      (setq fill-prefix (buffer-substring-no-properties (point) start))
+      (when (and (not (nxml-get-inside (point)))
+                (looking-at "[ \t]*<!--"))
+       (setq fill-prefix (concat fill-prefix "     ")))
+      (fill-region-as-paragraph start end arg))
+    (skip-line-prefix fill-prefix)
+    fill-prefix))
+    
+(defun nxml-newline-and-indent (soft)
+  (delete-horizontal-space)
+  (if soft (insert-and-inherit ?\n) (newline 1))
+  (nxml-indent-line))
+
+
+;;; Dynamic markup
+
+(defvar nxml-dynamic-markup-prev-pos nil)
+(defvar nxml-dynamic-markup-prev-lengths nil)
+(defvar nxml-dynamic-markup-prev-found-marker nil)
+(defvar nxml-dynamic-markup-prev-start-tags (make-hash-table :test 'equal))
+
+(defun nxml-dynamic-markup-word ()
+  "Dynamically markup the word before point.
+This attempts to find a tag to put around the word before point based
+on the contents of the current buffer. The end-tag will be inserted at
+point.  The start-tag will be inserted at or before the beginning of
+the word before point; the contents of the current buffer is used to
+decide where.
+
+It works in a similar way to \\[dabbrev-expand]. It searches first
+backwards from point, then forwards from point for an element whose
+content is a string which matches the contents of the buffer before
+point and which includes at least the word before point. It then
+copies the start- and end-tags from that element and uses them to
+surround the matching string before point.
+
+Repeating \\[nxml-dynamic-markup-word] immediately after successful
+\\[nxml-dynamic-markup-word] removes the previously inserted markup
+and attempts to find another possible way to do the markup."
+  (interactive "*")
+  (let (search-start-pos done)
+    (if (and (integerp nxml-dynamic-markup-prev-pos)
+            (= nxml-dynamic-markup-prev-pos (point))
+            (eq last-command this-command)
+            nxml-dynamic-markup-prev-lengths)
+       (let* ((end-tag-open-pos
+               (- nxml-dynamic-markup-prev-pos
+                  (nth 2 nxml-dynamic-markup-prev-lengths)))
+              (start-tag-close-pos
+               (- end-tag-open-pos
+                  (nth 1 nxml-dynamic-markup-prev-lengths)))
+              (start-tag-open-pos
+               (- start-tag-close-pos
+                  (nth 0 nxml-dynamic-markup-prev-lengths))))
+         (delete-region end-tag-open-pos nxml-dynamic-markup-prev-pos)
+         (delete-region start-tag-open-pos start-tag-close-pos)
+         (setq search-start-pos
+               (marker-position nxml-dynamic-markup-prev-found-marker)))
+      (clrhash nxml-dynamic-markup-prev-start-tags))
+    (setq nxml-dynamic-markup-prev-pos nil)
+    (setq nxml-dynamic-markup-prev-lengths nil)
+    (setq nxml-dynamic-markup-prev-found-marker nil)
+    (goto-char
+     (save-excursion
+       (let* ((pos (point))
+             (word (progn
+                     (backward-word 1)
+                     (unless (< (point) pos)
+                       (error "No word to markup"))
+                     (buffer-substring-no-properties (point) pos)))
+             (search (concat word "</"))
+             done)
+        (when search-start-pos
+          (goto-char search-start-pos))
+        (while (and (not done)
+                    (or (and (< (point) pos)
+                             (or (search-backward search nil t)
+                                 (progn (goto-char pos) nil)))
+                        (search-forward search nil t)))
+          (goto-char (- (match-end 0) 2))
+          (setq done (nxml-try-copy-markup pos)))
+        (or done
+            (error (if (zerop (hash-table-count
+                               nxml-dynamic-markup-prev-start-tags))
+                       "No possible markup found for `%s'"
+                     "No more markup possibilities found for `%s'")
+                   word)))))))
+
+(defun nxml-try-copy-markup (word-end-pos)
+  (save-excursion
+    (let ((end-tag-pos (point)))
+      (when (and (not (nxml-get-inside end-tag-pos))
+                (search-backward "<" nil t)
+                (not (nxml-get-inside (point))))
+       (xmltok-forward)
+       (when (and (eq xmltok-type 'start-tag)
+                  (< (point) end-tag-pos))
+         (let* ((start-tag-close-pos (point))
+                (start-tag
+                 (buffer-substring-no-properties xmltok-start
+                                                 start-tag-close-pos))
+                (words
+                 (nreverse
+                  (split-string
+                   (buffer-substring-no-properties start-tag-close-pos
+                                                   end-tag-pos)
+                   "[ \t\r\n]+"))))
+           (goto-char word-end-pos)
+           (while (and words
+                       (re-search-backward (concat
+                                            (regexp-quote (car words))
+                                            "\\=")
+                                           nil
+                                           t))
+             (setq words (cdr words))
+             (skip-chars-backward " \t\r\n"))
+           (when (and (not words)
+                      (progn
+                        (skip-chars-forward " \t\r\n")
+                        (not (gethash (cons (point) start-tag)
+                                      nxml-dynamic-markup-prev-start-tags)))
+                      (or (< end-tag-pos (point))
+                          (< word-end-pos xmltok-start)))
+             (setq nxml-dynamic-markup-prev-found-marker
+                   (copy-marker end-tag-pos t))
+             (puthash (cons (point) start-tag)
+                      t
+                      nxml-dynamic-markup-prev-start-tags)
+             (setq nxml-dynamic-markup-prev-lengths
+                   (list (- start-tag-close-pos xmltok-start)
+                         (-  word-end-pos (point))
+                         (+ (- xmltok-name-end xmltok-start) 2)))
+             (let ((name (xmltok-start-tag-qname)))
+               (insert start-tag)
+               (goto-char (+ word-end-pos
+                             (- start-tag-close-pos xmltok-start)))
+               (insert "</" name ">")
+               (setq nxml-dynamic-markup-prev-pos (point))))))))))
+                                                          
+
+;;; Character names
+
+(defvar nxml-char-name-ignore-case nil)
+
+(defvar nxml-char-name-alist nil
+  "Alist of character names.
+Each member of the list has the form (NAME CODE . NAMESET),
+where NAME is a string naming a character, NAMESET is a symbol
+identifying a set of names and CODE is an integer specifying the
+Unicode scalar value of the named character.
+The NAME will only be used for completion if NAMESET has
+a non-nil `nxml-char-name-set-enabled' property.
+If NAMESET does does not have `nxml-char-name-set-defined' property,
+then it must have a `nxml-char-name-set-file' property and `load'
+will be applied to the value of this property if the nameset
+is enabled.")
+
+(defvar nxml-char-name-table (make-hash-table :test 'eq)
+  "Hash table for mapping char codes to names.
+Each key is a Unicode scalar value.
+Each value is a list of pairs of the form (NAMESET . NAME),
+where NAMESET is a symbol identifying a set of names,
+and NAME is a string naming a character.")
+
+(defvar nxml-autoload-char-name-set-list nil
+  "List of char namesets that can be autoloaded.")
+
+(defun nxml-enable-char-name-set (nameset)    
+  (put nameset 'nxml-char-name-set-enabled t))
+
+(defun nxml-disable-char-name-set (nameset)    
+  (put nameset 'nxml-char-name-set-enabled nil))
+
+(defun nxml-char-name-set-enabled-p (nameset)
+  (get nameset 'nxml-char-name-set-enabled))
+
+(defun nxml-autoload-char-name-set (nameset file)
+  (unless (memq nameset nxml-autoload-char-name-set-list)
+    (setq nxml-autoload-char-name-set-list
+         (cons nameset nxml-autoload-char-name-set-list)))
+  (put nameset 'nxml-char-name-set-file file))
+
+(defun nxml-define-char-name-set (nameset alist)
+  "Define a set of character names.
+NAMESET is a symbol identifying the set.
+Alist is a list where each member has the form (NAME CODE),
+where NAME is a string naming a character and code
+is an integer giving the Unicode scalar value of the character."
+  (when (get nameset 'nxml-char-name-set-defined)
+    (error "Nameset `%s' already defined" nameset))
+  (let ((iter alist))
+    (while iter
+      (let* ((name-code (car iter))
+            (name (car name-code))
+            (code (cadr name-code)))
+       (puthash code
+                (cons (cons nameset name)
+                      (gethash code nxml-char-name-table))
+                nxml-char-name-table))
+      (setcdr (cdr (car iter)) nameset)
+      (setq iter (cdr iter))))
+  (setq nxml-char-name-alist
+       (nconc alist nxml-char-name-alist))
+  (put nameset 'nxml-char-name-set-defined t))
+
+(defun nxml-get-char-name (code)
+  (mapcar 'nxml-maybe-load-char-name-set nxml-autoload-char-name-set-list)
+  (let ((names (gethash code nxml-char-name-table))
+       name)
+    (while (and names (not name))
+      (if (nxml-char-name-set-enabled-p (caar names))
+         (setq name (cdar names))
+       (setq names (cdr names))))
+    name))
+
+(defvar nxml-named-char-history nil)
+
+(defun nxml-insert-named-char (arg)
+  "Insert a character using its name.
+The name is read from the minibuffer.
+Normally, inserts the character as a numeric character reference.
+With a prefix argument, inserts the character directly."
+  (interactive "*P")
+  (mapcar 'nxml-maybe-load-char-name-set nxml-autoload-char-name-set-list)
+  (let ((name
+        (let ((completion-ignore-case nxml-char-name-ignore-case))
+          (completing-read "Character name: "
+                           nxml-char-name-alist
+                           (lambda (member)
+                             (get (cddr member) 'nxml-char-name-set-enabled))
+                           t
+                           nil
+                           'nxml-named-char-history)))
+       (alist nxml-char-name-alist)
+       elt code)
+    (while (and alist (not code))
+      (setq elt (assoc name alist))
+      (if (get (cddr elt) 'nxml-char-name-set-enabled)
+         (setq code (cadr elt))
+       (setq alist (cdr (member elt alist)))))
+    (when code
+      (insert (if arg
+                 (or (decode-char 'ucs code)
+                     (error "Character %x is not supported by Emacs"
+                            code))
+               (format "&#x%X;" code))))))
+  
+(defun nxml-maybe-load-char-name-set (sym)
+  (when (and (get sym 'nxml-char-name-set-enabled)
+            (not (get sym 'nxml-char-name-set-defined))
+            (stringp (get sym 'nxml-char-name-set-file)))
+    (load (get sym 'nxml-char-name-set-file))))
+
+(defun nxml-toggle-char-ref-extra-display (arg)
+  "*Toggle the display of extra information for character references."
+  (interactive "P")
+  (let ((new (if (null arg)
+                (not nxml-char-ref-extra-display)
+              (> (prefix-numeric-value arg) 0))))
+    (when (not (eq new nxml-char-ref-extra-display))
+      (setq nxml-char-ref-extra-display new)
+      (save-excursion
+       (save-restriction
+         (widen)
+         (if nxml-char-ref-extra-display
+             (nxml-with-unmodifying-text-property-changes
+               (nxml-clear-fontified (point-min) (point-max)))
+           (nxml-clear-char-ref-extra-display (point-min) (point-max))))))))
+
+(put 'nxml-char-ref 'evaporate t)
+
+(defun nxml-char-ref-display-extra (start end n)
+  (when nxml-char-ref-extra-display
+    (let ((name (nxml-get-char-name n))
+         (glyph-string (and nxml-char-ref-display-glyph-flag
+                            (nxml-glyph-display-string n 'nxml-glyph-face)))
+         ov)
+    (when (or name glyph-string)
+      (setq ov (make-overlay start end nil t))
+      (overlay-put ov 'category 'nxml-char-ref)
+      (when name
+       (overlay-put ov 'help-echo name))
+      (when glyph-string
+       (overlay-put ov
+                    'after-string
+                    (propertize glyph-string 'face 'nxml-glyph-face)))))))
+
+(defun nxml-clear-char-ref-extra-display (start end)
+  (let ((ov (overlays-in start end)))
+    (while ov
+      (when (eq (overlay-get (car ov) 'category) 'nxml-char-ref)
+       (delete-overlay (car ov)))
+      (setq ov (cdr ov)))))
+
+;;; Versioning
+
+(defun nxml-version ()
+  "Show the version of nXML mode that is being used."
+  (interactive)
+  (if nxml-version
+      (message "nXML mode version %s" nxml-version)
+    (message "nXML mode version unknown")))
+
+
+(defun nxml-start-delimiter-length (type)
+  (or (get type 'nxml-start-delimiter-length)
+      0))
+                       
+(put 'cdata-section 'nxml-start-delimiter-length 9)
+(put 'comment 'nxml-start-delimiter-length 4)
+(put 'processing-instruction 'nxml-start-delimiter-length 2)
+(put 'start-tag 'nxml-start-delimiter-length 1)
+(put 'empty-element 'nxml-start-delimiter-length 1)
+(put 'partial-empty-element 'nxml-start-delimiter-length 1)
+(put 'entity-ref 'nxml-start-delimiter-length 1)
+(put 'char-ref 'nxml-start-delimiter-length 2)
+
+(defun nxml-end-delimiter-length (type)
+  (or (get type 'nxml-end-delimiter-length)
+      0))
+                       
+(put 'cdata-section 'nxml-end-delimiter-length 3)
+(put 'comment 'nxml-end-delimiter-length 3)
+(put 'processing-instruction 'nxml-end-delimiter-length 2)
+(put 'start-tag 'nxml-end-delimiter-length 1)
+(put 'empty-element 'nxml-end-delimiter-length 2)
+(put 'partial-empty-element 'nxml-end-delimiter-length 1)
+(put 'entity-ref 'nxml-end-delimiter-length 1)
+(put 'char-ref 'nxml-end-delimiter-length 1)
+
+(defun nxml-token-type-friendly-name (type)
+  (or (get type 'nxml-friendly-name)
+      (symbol-name type)))
+
+(put 'cdata-section 'nxml-friendly-name "CDATA section")
+(put 'processing-instruction 'nxml-friendly-name "processing instruction")
+(put 'entity-ref 'nxml-friendly-name "entity reference")
+(put 'char-ref 'nxml-friendly-name "character reference")
+
+(provide 'nxml-mode)
+
+;;; nxml-mode.el ends here
diff --git a/lisp/nxml/nxml-ns.el b/lisp/nxml/nxml-ns.el
new file mode 100644 (file)
index 0000000..6306d93
--- /dev/null
@@ -0,0 +1,148 @@
+;;; nxml-ns.el --- XML namespace processing
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This file uses a prefix of `nxml-ns'.
+
+;;; Code:
+
+(require 'nxml-util)
+
+(defvar nxml-ns-state nil
+  "Contains the state of namespace processing.  The state
+is never modified destructively and so can be saved and restored
+without copying.
+
+The value is a stack represented by a list. The list has length N + 1
+where N is the number of open elements.  Each member of the list
+represents the bindings in effect for a particular element.  Each
+member is itself a list whose car is the default namespace
+\(a symbol or nil) and whose cdr is an alist of (PREFIX . NS) pairs
+where PREFIX is a string (never nil) and NS is the namespace URI
+symbol.")
+
+(defconst nxml-ns-initial-state
+  (list (list nil (cons "xml" nxml-xml-namespace-uri)))
+  "A list to be used as the initial value of nxml-ns-state.  This
+represents the state with no open elements and with the default
+namespace bindings (no default namespace and only the xml prefix bound).")
+
+(defsubst nxml-ns-state () nxml-ns-state)
+
+(defsubst nxml-ns-set-state (state)
+  (setq nxml-ns-state state))
+
+(defsubst nxml-ns-state-equal (state)
+  (equal nxml-ns-state state))
+
+(defmacro nxml-ns-save (&rest body)
+  `(let ((nxml-ns-state nxml-ns-initial-state))
+     ,@body))
+
+(put 'nxml-ns-save 'lisp-indent-function 0)
+(def-edebug-spec nxml-ns-save t)
+
+(defun nxml-ns-init ()
+  (setq nxml-ns-state nxml-ns-initial-state))
+
+(defun nxml-ns-push-state ()
+  "Change the state by starting a new element. Namespace declarations
+are inherited from the parent state."
+  (setq nxml-ns-state (cons (car nxml-ns-state) nxml-ns-state)))
+
+(defun nxml-ns-pop-state ()
+  "Change the state by ending an element.  The behaviour is undefined
+if there is no open element."
+  (setq nxml-ns-state (cdr nxml-ns-state)))
+
+(defun nxml-ns-get-prefix (prefix)
+  "Return the symbol for namespace bound to PREFIX, or nil if PREFIX
+is unbound. PREFIX is a string, never nil."
+  (let ((binding (assoc prefix (cdar nxml-ns-state))))
+    (and binding (cdr binding))))
+
+(defun nxml-ns-set-prefix (prefix ns)
+  "Change the binding of PREFIX. PREFIX is a string (never nil).  NS
+is a symbol (never nil). The change will be in effect until the end of
+the current element."
+  (setq nxml-ns-state
+       (let ((bindings (car nxml-ns-state)))
+         (cons (cons (car bindings)
+                     (cons (cons prefix ns) (cdr bindings)))
+               (cdr nxml-ns-state)))))
+
+(defun nxml-ns-get-default ()
+  "Return the current default namespace as a symbol, or nil
+if there is no default namespace."
+  (caar nxml-ns-state))
+
+(defun nxml-ns-set-default (ns)
+  "Changes the current default namespace.  The change
+will be in effect until the end of the current element.
+NS is a symbol or nil."
+  (setq nxml-ns-state
+       (cons (cons ns (cdar nxml-ns-state))
+             (cdr nxml-ns-state))))
+
+(defun nxml-ns-get-context ()
+  (car nxml-ns-state))
+
+(defun nxml-ns-prefixes-for (ns &optional attributep)
+  (let ((current (car nxml-ns-state))
+       prefixes)
+    (when (if attributep
+             (not ns)
+           (eq (car current) ns))
+      (setq prefixes '(nil)))
+    (setq current (cdr current))
+    (while (let ((binding (rassq ns current)))
+            (when binding
+              (when (eq (nxml-ns-get-prefix (car binding)) ns)
+                (add-to-list 'prefixes
+                             (car binding)))
+              (setq current
+                    (cdr (member binding current))))))
+    prefixes))
+
+(defun nxml-ns-prefix-for (ns)
+  (car (rassq ns (cdar nxml-ns-state))))
+
+(defun nxml-ns-changed-prefixes ()
+  (let ((old (cadr nxml-ns-state))
+       (new (car nxml-ns-state))
+       changed)
+    (if (eq old new)
+       nil
+      (unless (eq (car new) (car old))
+       (setq changed '(nil)))
+      (setq new (cdr new))
+      (setq old (cdr old))
+      (while (not (eq new old))
+       (setq changed
+             (cons (caar new) changed))
+       (setq new (cdr new))))
+    changed))
+    
+(provide 'nxml-ns)
+
+;;; nxml-ns.el ends here
diff --git a/lisp/nxml/nxml-outln.el b/lisp/nxml/nxml-outln.el
new file mode 100644 (file)
index 0000000..5bc39c8
--- /dev/null
@@ -0,0 +1,1040 @@
+;;; nxml-outln.el --- outline support for nXML mode
+
+;; Copyright (C) 2004 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; A section can be in one of three states
+;; 1. display normally; this displays each child section
+;; according to its state; anything not part of child sections is also
+;; displayed normally
+;; 2. display just the title specially; child sections are not displayed
+;; regardless of their state; anything not part of child sections is
+;; not displayed
+;; 3. display the title specially and display child sections
+;; according to their state; anything not part of the child section is
+;; not displayed
+;; The state of a section is determined by the value of the
+;; nxml-outline-state text property of the < character that starts
+;; the section.
+;; For state 1 the value is nil or absent.
+;; For state 2 it is the symbol hide-children.
+;; For state 3 it is t.
+;; The special display is achieved by using overlays.  The overlays
+;; are computed from the nxml-outline-state property by
+;; `nxml-refresh-outline'. There overlays all have a category property
+;; with an nxml-outline-display property with value t.
+;;
+;; For a section to be recognized as such, the following conditions must
+;; be satisfied:
+;; - its start-tag must occur at the start of a line (possibly indented)
+;; - its local name must match `nxml-section-element-name-regexp'
+;; - it must have a heading element; a heading element is an
+;; element whose name matches `nxml-heading-element-name-regexp',
+;; and that occurs as, or as a descendant of, the first child element
+;; of the section
+;;
+;; XXX What happens if an nxml-outline-state property is attached to a
+;; character that doesn't start a section element?
+;;
+;; An outlined section (an section with a non-nil nxml-outline-state
+;; property) can be displayed in either single-line or multi-line
+;; form.  Single-line form is used when the outline state is hide-children
+;; or there are no child sections; multi-line form is used otherwise.
+;; There are two flavors of single-line form: with children and without.
+;; The with-childen flavor is used when there are child sections.
+;; Single line with children looks like
+;;    <+section>A section title...</>
+;; Single line without children looks like
+;;    <-section>A section title...</>
+;; Multi line looks likes
+;;    <-section>A section title...
+;;    [child sections displayed here]
+;;    </-section>
+;; The indent of an outlined section is computed relative to the
+;; outermost containing outlined element.  The indent of the
+;; outermost containing element comes from the non-outlined
+;; indent of the section start-tag.
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-util)
+(require 'nxml-rap)
+
+(defcustom nxml-section-element-name-regexp
+  "article\\|\\(sub\\)*section\\|chapter\\|div\\|appendix\\|part\\|preface\\|reference\\|simplesect\\|bibliography\\|bibliodiv\\|glossary\\|glossdiv"
+  "*Regular expression matching the name of elements used as sections.
+An XML element is treated as a section if:
+
+- its local name (that is, the name without the prefix) matches
+this regexp;
+
+- either its first child element or a descendant of that first child
+element has a local name matching the variable
+`nxml-heading-element-name-regexp'; and
+
+- its start-tag occurs at the beginning of a line (possibly indented)."
+  :group 'nxml
+  :type 'regexp)
+
+(defcustom nxml-heading-element-name-regexp "title\\|head"
+  "*Regular expression matching the name of elements used as headings.
+An XML element is only recognized as a heading if it occurs as or
+within the first child of an element that is recognized as a section.
+See the variable `nxml-section-element-name-regexp' for more details."
+  :group 'nxml
+  :type 'regexp)
+
+(defcustom nxml-outline-child-indent 2
+  "*Indentation in an outline for child element relative to parent element."
+  :group 'nxml
+  :type 'integer)
+
+(defface nxml-heading-face
+  '((t (:weight bold)))
+  "Face used for the contents of abbreviated heading elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-outline-indicator-face
+  '((t (:inherit default)))
+  "Face used for `+' or `-' before element names in outlines."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-outline-active-indicator-face
+  '((t (:box t :inherit nxml-outline-indicator-face)))
+  "Face used for clickable `+' or `-' before element names in outlines."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-outline-ellipsis-face
+  '((t (:bold t :inherit default)))
+  "Face used for `...' in outlines."
+  :group 'nxml-highlighting-faces)
+
+(defvar nxml-heading-scan-distance 1000
+  "Maximum distance from section to scan for heading.")
+
+(defvar nxml-outline-prefix-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-a" 'nxml-show-all)
+    (define-key map "\C-t" 'nxml-hide-all-text-content)
+    (define-key map "\C-r" 'nxml-refresh-outline)
+    (define-key map "\C-c" 'nxml-hide-direct-text-content)
+    (define-key map "\C-e" 'nxml-show-direct-text-content)
+    (define-key map "\C-d" 'nxml-hide-subheadings)
+    (define-key map "\C-s" 'nxml-show)
+    (define-key map "\C-k" 'nxml-show-subheadings)
+    (define-key map "\C-l" 'nxml-hide-text-content)
+    (define-key map "\C-i" 'nxml-show-direct-subheadings)
+    (define-key map "\C-o" 'nxml-hide-other)
+    map))
+
+;;; Commands for changing visibility
+
+(defun nxml-show-all ()
+  "Show all elements in the buffer normally."
+  (interactive)
+  (nxml-with-unmodifying-text-property-changes
+    (remove-text-properties (point-min)
+                           (point-max)
+                           '(nxml-outline-state nil)))
+  (nxml-outline-set-overlay nil (point-min) (point-max)))
+
+(defun nxml-hide-all-text-content ()
+  "Hide all text content in the buffer.
+Anything that is in a section but is not a heading will be hidden.
+The visibility of headings at any level will not be changed. See the
+variable `nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-transform-buffer-outline '((nil . t))))
+
+(defun nxml-show-direct-text-content ()
+  "Show the text content that is directly part of the section containing point.
+Each subsection will be shown according to its individual state, which
+will not be changed. The section containing point is the innermost
+section that contains the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-outline-pre-adjust-point)
+  (nxml-set-outline-state (nxml-section-start-position) nil)
+  (nxml-refresh-outline)
+  (nxml-outline-adjust-point))
+
+(defun nxml-show-direct-subheadings ()
+  "Show the immediate subheadings of the section containing point.
+The section containing point is the innermost section that contains
+the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (let ((pos (nxml-section-start-position)))
+    (when (eq (nxml-get-outline-state pos) 'hide-children)
+      (nxml-set-outline-state pos t)))
+  (nxml-refresh-outline)
+  (nxml-outline-adjust-point))
+
+(defun nxml-hide-direct-text-content ()
+  "Hide the text content that is directly part of the section containing point.
+The heading of the section will remain visible.  The state of
+subsections will not be changed.  The section containing point is the
+innermost section that contains the character following point. See the
+variable `nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (let ((pos (nxml-section-start-position)))
+    (when (null (nxml-get-outline-state pos))
+      (nxml-set-outline-state pos t)))
+  (nxml-refresh-outline)
+  (nxml-outline-adjust-point))
+
+(defun nxml-hide-subheadings ()
+  "Hide the subheadings that are part of the section containing point.
+The text content will also be hidden, leaving only the heading of the
+section itself visible.  The state of the subsections will also be
+changed to hide their headings, so that \\[nxml-show-direct-text-content]
+would show only the heading of the subsections. The section containing
+point is the innermost section that contains the character following
+point.  See the variable `nxml-section-element-name-regexp' for more
+details on how to customize which elements are recognized as sections
+and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((nil . hide-children)
+                                   (t . hide-children))))
+
+(defun nxml-show ()
+  "Show the section containing point normally, without hiding anything.
+This includes everything in the section at any level.  The section
+containing point is the innermost section that contains the character
+following point.  See the variable `nxml-section-element-name-regexp'
+for more details on how to customize which elements are recognized as
+sections and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((hide-children . nil)
+                                   (t . nil))))
+
+(defun nxml-hide-text-content ()
+  "Hide text content at all levels in the section containing point.
+The section containing point is the innermost section that contains
+the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((nil . t))))
+
+(defun nxml-show-subheadings ()
+  "Show the subheadings at all levels of the section containing point.
+The visibility of the text content at all levels in the section is not
+changed.  The section containing point is the innermost section that
+contains the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((hide-children . t))))
+
+(defun nxml-hide-other ()
+  "Hide text content other than that directly in the section containing point.
+Hide headings other than those of ancestors of that section and their
+immediate subheadings.  The section containing point is the innermost
+section that contains the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (let ((nxml-outline-state-transform-exceptions nil))
+    (save-excursion
+      (while (and (condition-case err
+                     (nxml-back-to-section-start)
+                   (nxml-outline-error (nxml-report-outline-error
+                                        "Couldn't find containing section: %s"
+                                        err)))
+                 (progn
+                   (when (and nxml-outline-state-transform-exceptions
+                              (null (nxml-get-outline-state (point))))
+                     (nxml-set-outline-state (point) t))
+                   (setq nxml-outline-state-transform-exceptions
+                         (cons (point)
+                               nxml-outline-state-transform-exceptions))
+                   (< nxml-prolog-end (point))))
+       (goto-char (1- (point)))))
+    (nxml-transform-buffer-outline '((nil . hide-children)
+                                    (t . hide-children)))))
+
+;; These variables are dynamically bound.  They are use to pass information to
+;; nxml-section-tag-transform-outline-state.
+
+(defvar nxml-outline-state-transform-exceptions nil)
+(defvar nxml-target-section-pos nil)
+(defvar nxml-depth-in-target-section nil)
+(defvar nxml-outline-state-transform-alist nil)
+
+(defun nxml-transform-buffer-outline (alist)
+  (let ((nxml-target-section-pos nil)
+       (nxml-depth-in-target-section 0)
+       (nxml-outline-state-transform-alist alist)
+       (nxml-outline-display-section-tag-function
+        'nxml-section-tag-transform-outline-state))
+    (nxml-refresh-outline))
+  (nxml-outline-adjust-point))
+
+(defun nxml-transform-subtree-outline (alist)
+  (let ((nxml-target-section-pos (nxml-section-start-position))
+       (nxml-depth-in-target-section nil)
+       (nxml-outline-state-transform-alist alist)
+       (nxml-outline-display-section-tag-function
+        'nxml-section-tag-transform-outline-state))
+    (nxml-refresh-outline))
+  (nxml-outline-adjust-point))
+
+(defun nxml-outline-pre-adjust-point ()
+  (cond ((and (< (point-min) (point))
+             (get-char-property (1- (point)) 'invisible)
+             (not (get-char-property (point) 'invisible))
+             (let ((str (or (get-char-property (point) 'before-string)
+                            (get-char-property (point) 'display))))
+               (and (stringp str)
+                    (>= (length str) 3)
+                    (string= (substring str 0 3) "..."))))
+        ;; The ellipsis is a display property on a visible character
+        ;; following an invisible region. The position of the event
+        ;; will be the position before that character. We want to
+        ;; move point to the other side of the invisible region, i.e.
+        ;; following the last visible character before that invisible
+        ;; region.
+        (goto-char (previous-single-char-property-change (1- (point))
+                                                         'invisible)))
+       ((and (< (point) (point-max))
+             (get-char-property (point) 'display)
+             (get-char-property (1+ (point)) 'invisible))
+        (goto-char (next-single-char-property-change (1+ (point))
+                                                     'invisible)))
+       ((and (< (point) (point-max))
+             (get-char-property (point) 'invisible))
+        (goto-char (next-single-char-property-change (point)
+                                                     'invisible)))))
+
+(defun nxml-outline-adjust-point ()
+  "Adjust point after showing or hiding elements."
+  (when (and (get-char-property (point) 'invisible)
+            (< (point-min) (point))
+            (get-char-property (1- (point)) 'invisible))
+    (goto-char (previous-single-char-property-change (point)
+                                                    'invisible
+                                                    nil
+                                                    nxml-prolog-end))))
+
+(defun nxml-transform-outline-state (section-start-pos)
+  (let* ((old-state
+         (nxml-get-outline-state section-start-pos))
+        (change (assq old-state
+                      nxml-outline-state-transform-alist)))
+    (when change
+      (nxml-set-outline-state section-start-pos
+                             (cdr change)))))
+  
+(defun nxml-section-tag-transform-outline-state (startp
+                                                section-start-pos
+                                                &optional
+                                                heading-start-pos)
+  (if (not startp)
+      (setq nxml-depth-in-target-section
+           (and nxml-depth-in-target-section
+                (> nxml-depth-in-target-section 0)
+                (1- nxml-depth-in-target-section)))
+    (cond (nxml-depth-in-target-section
+          (setq nxml-depth-in-target-section
+                (1+ nxml-depth-in-target-section)))
+         ((= section-start-pos nxml-target-section-pos)
+          (setq nxml-depth-in-target-section 0)))
+    (when (and nxml-depth-in-target-section
+              (not (member section-start-pos
+                           nxml-outline-state-transform-exceptions)))
+      (nxml-transform-outline-state section-start-pos))))
+
+(defun nxml-get-outline-state (pos)
+  (get-text-property pos 'nxml-outline-state))
+
+(defun nxml-set-outline-state (pos state)
+  (nxml-with-unmodifying-text-property-changes
+    (if state
+       (put-text-property pos (1+ pos) 'nxml-outline-state state)
+      (remove-text-properties pos (1+ pos) '(nxml-outline-state nil)))))
+
+;;; Mouse interface
+
+(defun nxml-mouse-show-direct-text-content (event)
+  "Do the same as \\[nxml-show-direct-text-content] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-show-direct-text-content)))
+
+(defun nxml-mouse-hide-direct-text-content (event)
+  "Do the same as \\[nxml-hide-direct-text-content] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-hide-direct-text-content)))
+
+(defun nxml-mouse-hide-subheadings (event)
+  "Do the same as \\[nxml-hide-subheadings] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-hide-subheadings)))
+
+(defun nxml-mouse-show-direct-subheadings (event)
+  "Do the same as \\[nxml-show-direct-subheadings] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-show-direct-subheadings)))
+
+(defun nxml-mouse-set-point (event)
+  (mouse-set-point event)
+  (and nxml-prolog-end t))
+
+;; Display
+
+(defun nxml-refresh-outline () 
+  "Refresh the outline to correspond to the current XML element structure."
+  (interactive)
+  (save-excursion
+    (goto-char (point-min))
+    (kill-local-variable 'line-move-ignore-invisible)
+    (make-local-variable 'line-move-ignore-invisible)
+    (condition-case err
+       (nxml-outline-display-rest nil nil nil)
+      (nxml-outline-error
+       (nxml-report-outline-error "Cannot display outline: %s" err)))))
+
+(defvar nxml-outline-display-section-tag-function nil)
+
+(defun nxml-outline-display-rest (outline-state start-tag-indent tag-qnames)
+  "Display up to and including the end of the current element.
+OUTLINE-STATE can be nil, t, hide-children.  START-TAG-INDENT is the
+indent of the start-tag of the current element, or nil if no
+containing element has a non-nil OUTLINE-STATE.  TAG-QNAMES is a list
+of the qnames of the open elements.  Point is after the title content.
+Leave point after the closing end-tag Return t if we had a
+non-transparent child section."
+  (let ((last-pos (point))
+       (transparent-depth 0)
+       ;; don't want ellipsis before root element
+       (had-children (not tag-qnames)))
+    (while
+       (cond ((not (nxml-section-tag-forward))
+              (if (null tag-qnames)
+                  nil
+                (nxml-outline-error "missing end-tag %s"
+                                    (car tag-qnames))))
+             ;; section end-tag
+             ((nxml-token-end-tag-p)
+              (when nxml-outline-display-section-tag-function
+                (funcall nxml-outline-display-section-tag-function
+                         nil
+                         xmltok-start))
+              (let ((qname (xmltok-end-tag-qname)))
+                (unless tag-qnames
+                  (nxml-outline-error "extra end-tag %s" qname))
+                (unless (string= (car tag-qnames) qname)
+                  (nxml-outline-error "mismatched end-tag; expected %s, got %s"
+                                      (car tag-qnames)
+                                      qname)))
+              (cond ((> transparent-depth 0)
+                     (setq transparent-depth (1- transparent-depth))
+                     (setq tag-qnames (cdr tag-qnames))
+                     t)
+                    ((not outline-state)
+                     (nxml-outline-set-overlay nil last-pos (point))
+                     nil)
+                    ((or (not had-children)
+                         (eq outline-state 'hide-children))
+                     (nxml-outline-display-single-line-end-tag last-pos)
+                     nil)
+                    (t
+                     (nxml-outline-display-multi-line-end-tag last-pos
+                                                              start-tag-indent)
+                     nil)))
+             ;; section start-tag
+             (t
+              (let* ((qname (xmltok-start-tag-qname))
+                     (section-start-pos xmltok-start)
+                     (heading-start-pos
+                      (and (or nxml-outline-display-section-tag-function
+                               (not (eq outline-state 'had-children))
+                               (not had-children))
+                           (nxml-token-starts-line-p)
+                           (nxml-heading-start-position))))
+                (when nxml-outline-display-section-tag-function
+                  (funcall nxml-outline-display-section-tag-function
+                           t
+                           section-start-pos
+                           heading-start-pos))
+                (setq tag-qnames (cons qname tag-qnames))
+                (if (or (not heading-start-pos)
+                        (and (eq outline-state 'hide-children)
+                             (setq had-children t)))
+                    (setq transparent-depth (1+ transparent-depth))
+                  (nxml-display-section last-pos
+                                        section-start-pos
+                                        heading-start-pos
+                                        start-tag-indent
+                                        outline-state
+                                        had-children
+                                        tag-qnames)
+                  (setq had-children t)
+                  (setq tag-qnames (cdr tag-qnames))
+                  (setq last-pos (point))))
+              t)))
+    had-children))
+
+(defconst nxml-highlighted-less-than
+  (propertize "<" 'face 'nxml-tag-delimiter-face))
+
+(defconst nxml-highlighted-greater-than
+  (propertize ">" 'face 'nxml-tag-delimiter-face))
+
+(defconst nxml-highlighted-colon
+  (propertize ":" 'face 'nxml-element-colon-face))
+
+(defconst nxml-highlighted-slash
+  (propertize "/" 'face 'nxml-tag-slash-face))
+
+(defconst nxml-highlighted-ellipsis
+  (propertize "..." 'face 'nxml-outline-ellipsis-face))
+
+(defconst nxml-highlighted-empty-end-tag
+  (concat nxml-highlighted-ellipsis
+         nxml-highlighted-less-than
+         nxml-highlighted-slash
+         nxml-highlighted-greater-than))
+
+(defconst nxml-highlighted-inactive-minus
+  (propertize "-" 'face 'nxml-outline-indicator-face))
+
+(defconst nxml-highlighted-active-minus
+  (propertize "-" 'face 'nxml-outline-active-indicator-face))
+
+(defconst nxml-highlighted-active-plus
+  (propertize "+" 'face 'nxml-outline-active-indicator-face))
+
+(defun nxml-display-section (last-pos
+                            section-start-pos
+                            heading-start-pos
+                            parent-indent
+                            parent-outline-state
+                            had-children
+                            tag-qnames)
+  (let* ((section-start-pos-bol
+         (save-excursion
+           (goto-char section-start-pos)
+           (skip-chars-backward " \t")
+           (point)))
+        (outline-state (nxml-get-outline-state section-start-pos))
+        (newline-before-section-start-category
+         (cond ((and (not had-children) parent-outline-state)
+                'nxml-outline-display-ellipsis)
+                (outline-state 'nxml-outline-display-show)
+                (t nil))))
+    (nxml-outline-set-overlay (and parent-outline-state
+                                  'nxml-outline-display-hide)
+                             last-pos
+                             (1- section-start-pos-bol)
+                             nil
+                             t)
+    (if outline-state
+      (let* ((indent (if parent-indent
+                        (+ parent-indent nxml-outline-child-indent)
+                      (save-excursion
+                        (goto-char section-start-pos)
+                        (current-column))))
+            start-tag-overlay)
+       (nxml-outline-set-overlay newline-before-section-start-category
+                                 (1- section-start-pos-bol)
+                                 section-start-pos-bol
+                                 t)
+       (nxml-outline-set-overlay 'nxml-outline-display-hide
+                                 section-start-pos-bol
+                                 section-start-pos)
+       (setq start-tag-overlay
+           (nxml-outline-set-overlay 'nxml-outline-display-show
+                                     section-start-pos
+                                     (1+ section-start-pos)
+                                     t))
+       ;; line motion commands don't work right if start-tag-overlay
+       ;; covers multiple lines
+       (nxml-outline-set-overlay 'nxml-outline-display-hide
+                                 (1+ section-start-pos)
+                                 heading-start-pos)
+       (goto-char heading-start-pos)
+       (nxml-end-of-heading)
+       (nxml-outline-set-overlay 'nxml-outline-display-heading
+                                 heading-start-pos
+                                 (point))
+       (let* ((had-children
+               (nxml-outline-display-rest outline-state
+                                          indent
+                                          tag-qnames)))
+         (overlay-put start-tag-overlay
+                      'display
+                      (concat
+                       ;; indent
+                       (make-string indent ?\ )
+                       ;; <
+                       nxml-highlighted-less-than
+                       ;; + or - indicator
+                       (cond ((not had-children)
+                              nxml-highlighted-inactive-minus)
+                             ((eq outline-state 'hide-children)
+                              (overlay-put start-tag-overlay
+                                           'category
+                                           'nxml-outline-display-hiding-tag)
+                              nxml-highlighted-active-plus)
+                             (t
+                              (overlay-put start-tag-overlay
+                                           'category
+                                           'nxml-outline-display-showing-tag)
+                              nxml-highlighted-active-minus))
+                       ;; qname
+                       (nxml-highlighted-qname (car tag-qnames))
+                       ;; >
+                       nxml-highlighted-greater-than))))
+      ;; outline-state nil
+      (goto-char heading-start-pos)
+      (nxml-end-of-heading)
+      (nxml-outline-set-overlay newline-before-section-start-category
+                               (1- section-start-pos-bol)
+                               (point)
+                               t)
+      (nxml-outline-display-rest outline-state
+                                (and parent-indent
+                                     (+ parent-indent
+                                        nxml-outline-child-indent))
+                                tag-qnames))))
+
+(defun nxml-highlighted-qname (qname)
+  (let ((colon (string-match ":" qname)))
+    (if colon
+       (concat (propertize (substring qname 0 colon)
+                           'face
+                           'nxml-element-prefix-face)
+               nxml-highlighted-colon
+               (propertize (substring qname (1+ colon))
+                           'face
+                           'nxml-element-local-name-face))
+      (propertize qname
+                 'face
+                 'nxml-element-local-name-face))))
+
+(defun nxml-outline-display-single-line-end-tag (last-pos)
+  (nxml-outline-set-overlay 'nxml-outline-display-hide
+                           last-pos
+                           xmltok-start
+                           nil
+                           t)
+  (overlay-put (nxml-outline-set-overlay 'nxml-outline-display-show
+                                        xmltok-start
+                                        (point)
+                                        t)
+              'display
+              nxml-highlighted-empty-end-tag))
+    
+(defun nxml-outline-display-multi-line-end-tag (last-pos start-tag-indent)
+  (let ((indentp (save-excursion
+                  (goto-char last-pos)
+                  (skip-chars-forward " \t")
+                  (and (eq (char-after) ?\n)
+                       (progn
+                         (goto-char (1+ (point)))
+                         (nxml-outline-set-overlay nil last-pos (point))
+                         (setq last-pos (point))
+                         (goto-char xmltok-start)
+                         (beginning-of-line)
+                         t))))
+       end-tag-overlay)
+    (nxml-outline-set-overlay 'nxml-outline-display-hide
+                             last-pos
+                             xmltok-start
+                             nil
+                             t)
+    (setq end-tag-overlay
+         (nxml-outline-set-overlay 'nxml-outline-display-showing-tag
+                                   xmltok-start
+                                   (point)
+                                   t))
+    (overlay-put end-tag-overlay
+                'display
+                (concat (if indentp
+                            (make-string start-tag-indent ?\ )
+                          "")
+                        nxml-highlighted-less-than
+                        nxml-highlighted-slash
+                        nxml-highlighted-active-minus
+                        (nxml-highlighted-qname (xmltok-end-tag-qname))
+                        nxml-highlighted-greater-than))))
+
+(defvar nxml-outline-show-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-m" 'nxml-show-direct-text-content)
+    (define-key map [mouse-2] 'nxml-mouse-show-direct-text-content)
+    map))
+
+(defvar nxml-outline-show-help "mouse-2: show")
+
+(put 'nxml-outline-display-show 'nxml-outline-display t)
+(put 'nxml-outline-display-show 'evaporate t)
+(put 'nxml-outline-display-show 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-show 'help-echo nxml-outline-show-help)
+
+(put 'nxml-outline-display-hide 'nxml-outline-display t)
+(put 'nxml-outline-display-hide 'evaporate t)
+(put 'nxml-outline-display-hide 'invisible t)
+(put 'nxml-outline-display-hide 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-hide 'help-echo nxml-outline-show-help)
+
+(put 'nxml-outline-display-ellipsis 'nxml-outline-display t)
+(put 'nxml-outline-display-ellipsis 'evaporate t)
+(put 'nxml-outline-display-ellipsis 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-ellipsis 'help-echo nxml-outline-show-help)
+(put 'nxml-outline-display-ellipsis 'before-string nxml-highlighted-ellipsis)
+
+(put 'nxml-outline-display-heading 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-heading 'help-echo nxml-outline-show-help)
+(put 'nxml-outline-display-heading 'nxml-outline-display t)
+(put 'nxml-outline-display-heading 'evaporate t)
+(put 'nxml-outline-display-heading 'face 'nxml-heading-face)
+
+(defvar nxml-outline-hiding-tag-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [mouse-1] 'nxml-mouse-show-direct-subheadings)
+    (define-key map [mouse-2] 'nxml-mouse-show-direct-text-content)
+    (define-key map "\C-m" 'nxml-show-direct-text-content)
+    map))
+
+(defvar nxml-outline-hiding-tag-help
+  "mouse-1: show subheadings, mouse-2: show text content")
+
+(put 'nxml-outline-display-hiding-tag 'nxml-outline-display t)
+(put 'nxml-outline-display-hiding-tag 'evaporate t)
+(put 'nxml-outline-display-hiding-tag 'keymap nxml-outline-hiding-tag-map)
+(put 'nxml-outline-display-hiding-tag 'help-echo nxml-outline-hiding-tag-help)
+
+(defvar nxml-outline-showing-tag-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [mouse-1] 'nxml-mouse-hide-subheadings)
+    (define-key map [mouse-2] 'nxml-mouse-show-direct-text-content)
+    (define-key map "\C-m" 'nxml-show-direct-text-content)
+    map))
+
+(defvar nxml-outline-showing-tag-help
+  "mouse-1: hide subheadings, mouse-2: show text content")
+
+(put 'nxml-outline-display-showing-tag 'nxml-outline-display t)
+(put 'nxml-outline-display-showing-tag 'evaporate t)
+(put 'nxml-outline-display-showing-tag 'keymap nxml-outline-showing-tag-map)
+(put 'nxml-outline-display-showing-tag
+     'help-echo
+     nxml-outline-showing-tag-help)
+
+(defun nxml-outline-set-overlay (category
+                                start
+                                end
+                                &optional
+                                front-advance
+                                rear-advance)
+  "Replace any nxml-outline-display overlays between START and END.
+Overlays are removed if they overlay the region between START and END,
+and have a non-nil nxml-outline-display property (typically via their
+category). If CATEGORY is non-nil, they will be replaced with a new overlay
+with that category from START to END. If CATEGORY is nil, no new
+overlay will be created."
+  (when (< start end)
+    (let ((overlays (overlays-in start end))
+         overlay)
+      (while overlays
+       (setq overlay (car overlays))
+       (setq overlays (cdr overlays))
+       (when (overlay-get overlay 'nxml-outline-display)
+         (delete-overlay overlay))))
+    (and category
+        (let ((overlay (make-overlay start
+                                     end
+                                     nil
+                                     front-advance
+                                     rear-advance)))
+          (overlay-put overlay 'category category)
+          (setq line-move-ignore-invisible t)
+          overlay))))
+
+(defun nxml-end-of-heading ()
+  "Move from the start of the content of the heading to the end.
+Do not move past the end of the line."
+  (let ((pos (condition-case err
+                (and (nxml-scan-element-forward (point) t)
+                     xmltok-start)
+              nil)))
+    (end-of-line)
+    (skip-chars-backward " \t")
+    (cond ((not pos)
+          (setq pos (nxml-token-before))
+          (when (eq xmltok-type 'end-tag)
+            (goto-char pos)))
+         ((< pos (point))
+          (goto-char pos)))
+    (skip-chars-backward " \t")
+    (point)))
+
+;;; Navigating section structure
+
+(defsubst nxml-token-start-tag-p ()
+  (or (eq xmltok-type 'start-tag)
+      (eq xmltok-type 'partial-start-tag)))
+
+(defsubst nxml-token-end-tag-p ()
+  (or (eq xmltok-type 'end-tag)
+      (eq xmltok-type 'partial-end-tag)))
+
+(defun nxml-token-starts-line-p ()
+  (save-excursion
+    (goto-char xmltok-start)
+    (skip-chars-backward " \t")
+    (bolp)))
+
+(defvar nxml-cached-section-tag-regexp nil)
+(defvar nxml-cached-section-element-name-regexp nil)
+
+(defsubst nxml-make-section-tag-regexp ()
+  (if (eq nxml-cached-section-element-name-regexp
+         nxml-section-element-name-regexp)
+      nxml-cached-section-tag-regexp
+    (nxml-make-section-tag-regexp-1)))
+
+(defun nxml-make-section-tag-regexp-1 ()
+  (setq nxml-cached-section-element-name-regexp nil)
+  (setq nxml-cached-section-tag-regexp
+       (concat "</?\\("
+               "\\(" xmltok-ncname-regexp ":\\)?"
+               nxml-section-element-name-regexp
+               "\\)[ \t\r\n>]"))
+  (setq nxml-cached-section-element-name-regexp
+       nxml-section-element-name-regexp)
+  nxml-cached-section-tag-regexp)
+
+(defun nxml-section-tag-forward ()
+  "Move forward past the first tag that is a section start- or end-tag.
+Return xmltok-type for tag.
+If no tag found, return nil and move to the end of the buffer."
+  (let ((case-fold-search nil)
+       (tag-regexp (nxml-make-section-tag-regexp))
+       match-end)
+    (when (< (point) nxml-prolog-end)
+      (goto-char nxml-prolog-end))
+    (while (cond ((not (re-search-forward tag-regexp nil 'move))
+                 (setq xmltok-type nil)
+                 nil)
+                ((progn
+                   (goto-char (match-beginning 0))
+                   (setq match-end (match-end 0))
+                   (nxml-ensure-scan-up-to-date)
+                   (let ((end (nxml-inside-end (point))))
+                     (when end
+                       (goto-char end)
+                       t))))
+                ((progn
+                   (xmltok-forward)
+                   (and (memq xmltok-type '(start-tag
+                                            partial-start-tag
+                                            end-tag
+                                            partial-end-tag))
+                        ;; just in case wildcard matched non-name chars
+                        (= xmltok-name-end (1- match-end))))
+                 nil)
+                (t))))
+    xmltok-type)
+        
+(defun nxml-section-tag-backward ()
+  "Move backward to the end of a tag that is a section start- or end-tag.
+The position of the end of the tag must be <= point
+Point is at the end of the tag.  `xmltok-start' is the start."
+  (let ((case-fold-search nil)
+       (start (point))
+       (tag-regexp (nxml-make-section-tag-regexp))
+       match-end)
+    (if (< (point) nxml-prolog-end)
+       (progn
+         (goto-char (point-min))
+         nil)
+      (while (cond ((not (re-search-backward tag-regexp
+                                            nxml-prolog-end
+                                            'move))
+                   (setq xmltok-type nil)
+                   (goto-char (point-min))
+                   nil)
+                  ((progn
+                     (goto-char (match-beginning 0))
+                     (setq match-end (match-end 0))
+                     (nxml-ensure-scan-up-to-date)
+                     (let ((pos (nxml-inside-start (point))))
+                       (when pos
+                         (goto-char (1- pos))
+                         t))))
+                  ((progn
+                     (xmltok-forward)
+                     (and (<= (point) start)
+                          (memq xmltok-type '(start-tag
+                                              partial-start-tag
+                                              end-tag
+                                              partial-end-tag))
+                          ;; just in case wildcard matched non-name chars
+                          (= xmltok-name-end (1- match-end))))
+                   nil)
+                  (t (goto-char xmltok-start)
+                     t)))
+      xmltok-type)))
+
+(defun nxml-section-start-position ()
+  "Return the position of the start of the section containing point.
+Signal an error on failure."
+  (condition-case err
+      (save-excursion (if (nxml-back-to-section-start)
+                         (point)
+                       (error "Not in section")))
+    (nxml-outline-error
+     (nxml-report-outline-error "Couldn't determine containing section: %s"
+                               err))))
+
+(defun nxml-back-to-section-start (&optional invisible-ok)
+  "Try to move back to the start of the section containing point.
+The start of the section must be <= point.
+Only visible sections are included unless INVISIBLE-OK is non-nil.
+If found, return t.  Otherwise move to point-min and return nil.
+If unbalanced section tags are found, signal an `nxml-outline-error'."
+  (when (or (nxml-after-section-start-tag)
+           (nxml-section-tag-backward))
+    (let (open-tags found)
+      (while (let (section-start-pos)
+              (setq section-start-pos xmltok-start)
+              (if (nxml-token-end-tag-p)
+                  (setq open-tags (cons (xmltok-end-tag-qname)
+                                        open-tags))
+                (if (not open-tags)
+                    (when (and (nxml-token-starts-line-p)
+                               (or invisible-ok
+                                   (not (get-char-property section-start-pos
+                                                           'invisible)))
+                               (nxml-heading-start-position))
+                      (setq found t))
+                  (let ((qname (xmltok-start-tag-qname)))
+                    (unless (string= (car open-tags) qname)
+                      (nxml-outline-error "mismatched end-tag"))
+                    (setq open-tags (cdr open-tags)))))
+              (goto-char section-start-pos)
+              (and (not found)
+                   (nxml-section-tag-backward))))
+      found)))
+
+(defun nxml-after-section-start-tag ()
+  "If the character after point is in a section start-tag, move after it.
+Return the token type.  Otherwise return nil.
+Set up variables like `xmltok-forward'."
+  (let ((pos (nxml-token-after))
+       (case-fold-search nil))
+   (when (and (memq xmltok-type '(start-tag partial-start-tag))
+             (save-excursion
+               (goto-char xmltok-start)
+               (looking-at (nxml-make-section-tag-regexp))))
+     (goto-char pos)
+     xmltok-type)))
+
+(defun nxml-heading-start-position ()
+  "Return the position of the start of the content of a heading element.
+Adjust the position to be after initial leading whitespace.
+Return nil if no heading element is found.  Requires point to be
+immediately after the section's start-tag."
+  (let ((depth 0)
+       (heading-regexp (concat "\\`\\("
+                               nxml-heading-element-name-regexp
+                               "\\)\\'"))
+       
+       (section-regexp (concat "\\`\\("
+                               nxml-section-element-name-regexp
+                               "\\)\\'"))
+       (start (point))
+       found)
+    (save-excursion
+      (while (and (xmltok-forward)
+                 (cond ((memq xmltok-type '(end-tag partial-end-tag))
+                        (and (not (string-match section-regexp
+                                                (xmltok-end-tag-local-name)))
+                             (> depth 0)
+                             (setq depth (1- depth))))
+                       ;; XXX Not sure whether this is a good idea
+                       ;;((eq xmltok-type 'empty-element)
+                       ;; nil)
+                       ((not (memq xmltok-type
+                                   '(start-tag partial-start-tag)))
+                        t)
+                       ((string-match section-regexp
+                                      (xmltok-start-tag-local-name))
+                        nil)
+                       ((string-match heading-regexp
+                                      (xmltok-start-tag-local-name))
+                        (skip-chars-forward " \t\r\n")
+                        (setq found (point))
+                        nil)
+                       (t
+                        (setq depth (1+ depth))
+                        t))
+                 (<= (- (point) start) nxml-heading-scan-distance))))
+    found))
+
+;;; Error handling
+
+(defun nxml-report-outline-error (msg err)
+  (error msg (apply 'format (cdr err))))
+
+(defun nxml-outline-error (&rest args)
+  (signal 'nxml-outline-error args))
+
+(put 'nxml-outline-error
+     'error-conditions
+     '(error nxml-error nxml-outline-error))
+
+(put 'nxml-outline-error
+     'error-message
+     "Cannot create outline of buffer that is not well-formed")
+
+;;; Debugging
+
+(defun nxml-debug-overlays ()
+  (interactive)
+  (let ((overlays (nreverse (overlays-in (point-min) (point-max))))
+       overlay)
+    (while overlays
+      (setq overlay (car overlays))
+      (setq overlays (cdr overlays))
+      (when (overlay-get overlay 'nxml-outline-display)
+       (message "overlay %s: %s...%s (%s)"
+                (overlay-get overlay 'category)
+                (overlay-start overlay)
+                (overlay-end overlay)
+                (overlay-get overlay 'display))))))
+
+(provide 'nxml-outln)
+
+;;; nxml-outln.el ends here
diff --git a/lisp/nxml/nxml-parse.el b/lisp/nxml/nxml-parse.el
new file mode 100644 (file)
index 0000000..0e93f10
--- /dev/null
@@ -0,0 +1,320 @@
+;;; nxml-parse.el --- XML parser, sharing infrastructure with nxml-mode
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; Entry point is `nxml-parse-file'.
+
+;;; Code:
+
+(require 'nxml-util)
+(require 'xmltok)
+(require 'nxml-enc)
+(require 'nxml-ns)
+
+(defvar nxml-parse-file-name nil)
+
+(defvar nxml-validate-function nil
+  "Nil or a function to be called by `nxml-parse-file' to perform validation.
+The function will be called once for each start-tag or end-tag.  The
+function is passed two arguments TEXT and START-TAG.  For a start-tag,
+START-TAG is a list (NAME ATTRIBUTES) where NAME and ATTRIBUTES are in
+the same form as returned by `nxml-parse-file.  For an end-tag,
+START-TAG is nil.  TEXT is a string containing the text immediately
+preceding the tag, or nil if there was no such text.  An empty element
+is treated as a start-tag followed by an end-tag.
+
+For a start-tag, the namespace state will be the state after
+processing the namespace declarations in the start-tag. For an
+end-tag, the namespace state will be the state before popping the
+namespace declarations for the corresponding start-tag.
+
+The function must return nil if no error is detected or a
+cons (MESSAGE . LOCATION) where MESSAGE is a string containing
+an error message and LOCATION indicates what caused the error
+as follows:
+
+- nil indicates the tag as whole caused it; this is always allowed;
+
+- text indicates the text caused it; this is allowed only if
+TEXT is non-nil;
+
+- tag-close indicates the close of the tag caused it; this is
+allowed only if START-TAG is non-nil;
+
+- (attribute-name . N) indicates that the name of the Nth attribute
+caused it; N counts from 0; this is allowed only if START-TAG is non-nil
+and N must be less than the number of attributes;
+
+- (attribute-value . N) indicates that the value of the Nth attribute
+caused it; N counts from 0; this is allowed only if START-TAG is non-nil
+and N must be less than the number of attributes.")
+
+(defun nxml-parse-file (file)
+  "Parse the XML document in FILE and return it as a list.
+An XML element is represented as a list (NAME ATTRIBUTES . CHILDREN).
+NAME is either a string, in the case where the name does not have a
+namespace, or a cons (NAMESPACE . LOCAL-NAME), where NAMESPACE is a
+symbol and LOCAL-NAME is a string, in the case where the name does
+have a namespace. NAMESPACE is a keyword whose name is `:URI', where
+URI is the namespace name.  ATTRIBUTES is an alist of attributes where
+each attribute has the form (NAME . VALUE), where NAME has the same
+form as an element name, and VALUE is a string.  A namespace
+declaration is represented as an attribute whose name is
+\(:http://www.w3.org/2000/xmlns/ . LOCAL-NAME).  CHILDREN is a list
+containing strings and child elements; CHILDREN never contains two
+consecutive strings and never contains an empty string.  Processing
+instructions and comments are not represented.  The return value is a
+list representing the document element.
+
+If the XML document is not well-formed, an error having the condition
+`nxml-file-parse-error' will be signaled; the error data will be a
+list of the \(FILE POSITION MESSAGE), where POSITION is an integer
+specifying the position where the error was detected, and MESSAGE is a
+string describing the error.
+
+The current contents of FILE will be parsed even if there is a
+modified buffer currently visiting FILE.
+
+If the variable `nxml-validation-function' is non-nil, it will be
+called twice for each element, and any reported error will be signaled
+in the same way as well-formedness error."
+  (save-excursion
+    (set-buffer (nxml-parse-find-file file))
+    (unwind-protect
+       (let ((nxml-parse-file-name file))
+         (nxml-parse-instance))
+      (kill-buffer nil))))
+
+(defun nxml-parse-find-file (file)
+  (save-excursion
+    (set-buffer (get-buffer-create " *nXML Parse*"))
+    (erase-buffer)
+    (let ((set-auto-coding-function 'nxml-set-xml-coding))
+      (insert-file-contents file))
+    (current-buffer)))
+      
+(defun nxml-parse-instance ()
+  (let (xmltok-dtd)
+    (xmltok-save
+      (xmltok-forward-prolog)
+      (nxml-check-xmltok-errors)
+      (nxml-ns-save
+       (nxml-parse-instance-1)))))
+
+(defun nxml-parse-instance-1 ()
+  (let* ((top (cons nil nil))
+        ;; tail is a cons cell, whose cdr is nil
+        ;; additional elements will destructively appended to tail
+        (tail top)
+        ;; stack of tails one for each open element
+        tail-stack
+        ;; list of QNames of open elements
+        open-element-tags
+        ;; list of strings buffering a text node, in reverse order
+        text
+        ;; position of beginning of first (in buffer) string in text
+        text-pos)
+    (while (xmltok-forward)
+      (nxml-check-xmltok-errors)
+      (cond ((memq xmltok-type '(start-tag end-tag empty-element))
+            (when text
+              (setq text (apply 'concat (nreverse text)))
+              (setcdr tail (cons text nil))
+              (setq tail (cdr tail)))
+            (when (not (eq xmltok-type 'end-tag))
+              (when (and (not open-element-tags)
+                         (not (eq tail top)))
+                (nxml-parse-error nil "Multiple top-level elements"))
+              (setq open-element-tags
+                    (cons (xmltok-start-tag-qname)
+                          open-element-tags))
+              (nxml-ns-push-state)
+              (let ((tag (nxml-parse-start-tag)))
+                (nxml-validate-tag text text-pos tag)
+                (setq text nil)
+                (setcdr tail (cons tag nil))
+                (setq tail (cdr tail))
+                (setq tail-stack (cons tail tail-stack))
+                (setq tail (last tag))))
+            (when (not (eq xmltok-type 'start-tag))
+              (or (eq xmltok-type 'empty-element)
+                  (equal (car open-element-tags)
+                         (xmltok-end-tag-qname))
+                  (if open-element-tags
+                      (nxml-parse-error nil
+                                        "Unbalanced end-tag; expected </%s>"
+                                        (car open-element-tags))
+                    (nxml-parse-error nil "Extra end-tag")))
+              (nxml-validate-tag text text-pos nil)
+              (setq text nil)
+              (nxml-ns-pop-state)
+              (setq open-element-tags (cdr open-element-tags))
+              (setq tail (car tail-stack))
+              (setq tail-stack (cdr tail-stack)))
+            (setq text-pos nil))
+           ((memq xmltok-type '(space data entity-ref char-ref cdata-section))
+            (cond (open-element-tags
+                   (unless text-pos
+                     (setq text-pos xmltok-start))
+                   (setq text
+                         (cons (nxml-current-text-string) text)))
+                  ((not (eq xmltok-type 'space))
+                   (nxml-parse-error
+                    nil
+                    "%s at top-level"
+                    (cdr (assq xmltok-type
+                               '((data . "Text characters")
+                                 (entity-ref . "Entity reference")
+                                 (char-ref . "Character reference")
+                                 (cdata-section . "CDATA section"))))))))))
+    (unless (cdr top)
+      (nxml-parse-error (point-max) "Missing document element"))
+    (cadr top)))
+
+(defun nxml-parse-start-tag ()
+  (let (parsed-attributes
+       parsed-namespace-attributes
+       atts att prefixes prefix ns value name)
+    (setq atts xmltok-namespace-attributes)
+    (while atts
+      (setq att (car atts))
+      (setq value (or (xmltok-attribute-value att)
+                     (nxml-parse-error nil "Invalid attribute value")))
+      (setq ns (nxml-make-namespace value))
+      (setq prefix (and (xmltok-attribute-prefix att)
+                       (xmltok-attribute-local-name att)))
+      (cond ((member prefix prefixes)
+            (nxml-parse-error nil "Duplicate namespace declaration"))
+           ((not prefix)
+            (nxml-ns-set-default ns))
+           (ns
+            (nxml-ns-set-prefix prefix ns))
+           (t (nxml-parse-error nil "Cannot undeclare namespace prefix")))
+      (setq prefixes (cons prefix prefixes))
+      (setq parsed-namespace-attributes
+           (cons (cons (nxml-make-name nxml-xmlns-namespace-uri
+                                       (xmltok-attribute-local-name att))
+                       value)
+                 parsed-namespace-attributes))
+      (setq atts (cdr atts)))
+    (setq name
+         (nxml-make-name
+          (let ((prefix (xmltok-start-tag-prefix)))
+            (if prefix
+                (or (nxml-ns-get-prefix prefix)
+                    (nxml-parse-error (1+ xmltok-start)
+                                      "Prefix `%s' undeclared"
+                                      prefix))
+              (nxml-ns-get-default)))
+          (xmltok-start-tag-local-name)))
+    (setq atts xmltok-attributes)
+    (while atts
+      (setq att (car atts))
+      (setq ns
+           (let ((prefix (xmltok-attribute-prefix att)))
+             (and prefix
+                  (or (nxml-ns-get-prefix prefix)
+                      (nxml-parse-error (xmltok-attribute-name-start att)
+                                        "Prefix `%s' undeclared"
+                                        prefix)))))
+      (setq parsed-attributes
+           (let ((nm (nxml-make-name ns
+                                     (xmltok-attribute-local-name att))))
+             (when (assoc nm parsed-attributes)
+               (nxml-parse-error (xmltok-attribute-name-start att)
+                                 "Duplicate attribute"))
+             (cons (cons nm (or (xmltok-attribute-value att)
+                                (nxml-parse-error nil "Invalid attribute value")))
+                   parsed-attributes)))
+      (setq atts (cdr atts)))
+    ;; We want to end up with the attributes followed by the
+    ;; the namespace attributes in the same order as
+    ;; xmltok-attributes and xmltok-namespace-attributes respectively.
+    (when parsed-namespace-attributes
+      (setq parsed-attributes
+           (nconc parsed-namespace-attributes parsed-attributes)))
+    (list name (nreverse parsed-attributes))))
+
+(defun nxml-validate-tag (text text-pos tag)
+  (when nxml-validate-function
+    (let ((err (funcall nxml-validate-function text tag))
+         pos)
+      (when err
+       (setq pos (nxml-validate-error-position (cdr err)
+                                               (and text text-pos)
+                                               tag))
+       (or pos (error "Incorrect return value from %s"
+                      nxml-validate-function))
+       (nxml-parse-error pos (car err))))))
+
+(defun nxml-validate-error-position (location text-pos tag)
+  (cond ((null location) xmltok-start)
+       ((eq location 'text)  text-pos)
+       ((eq location 'tag-close)
+        (and tag (- (point) (if (eq xmltok-type 'empty-element ) 2 1))))
+       ((consp location)
+        (let ((att (nth (cdr location) xmltok-attributes)))
+          (when (not att)
+            (setq att (nth (- (cdr location) (length xmltok-attributes))
+                           xmltok-namespace-attributes)))
+          (cond ((not att))
+                ((eq (car location) 'attribute-name)
+                 (xmltok-attribute-name-start att))
+                ((eq (car location) 'attribute-value)
+                 (xmltok-attribute-value-start att)))))))
+
+(defun nxml-make-name (ns local-name)
+  (if ns
+      (cons ns local-name)
+    local-name))
+
+(defun nxml-current-text-string ()
+  (cond ((memq xmltok-type '(space data))
+        (buffer-substring-no-properties xmltok-start
+                                        (point)))
+       ((eq xmltok-type 'cdata-section)
+        (buffer-substring-no-properties (+ xmltok-start 9)
+                                        (- (point) 3)))
+       ((memq xmltok-type '(char-ref entity-ref))
+        (unless xmltok-replacement
+          (nxml-parse-error nil
+                            (if (eq xmltok-type 'char-ref)
+                                "Reference to unsupported Unicode character"
+                              "Unresolvable entity reference")))
+        xmltok-replacement)))
+
+(defun nxml-parse-error (position &rest args)
+  (nxml-signal-file-parse-error nxml-parse-file-name
+                               (or position xmltok-start)
+                               (apply 'format args)))
+
+(defun nxml-check-xmltok-errors ()
+  (when xmltok-errors
+    (let ((err (car (last xmltok-errors))))
+      (nxml-signal-file-parse-error nxml-parse-file-name
+                                   (xmltok-error-start err)
+                                   (xmltok-error-message err)))))
+
+(provide 'nxml-parse)
+
+;;; nxml-parse.el ends here
diff --git a/lisp/nxml/nxml-rap.el b/lisp/nxml/nxml-rap.el
new file mode 100644 (file)
index 0000000..8b0c55e
--- /dev/null
@@ -0,0 +1,467 @@
+;;; nxml-rap.el --- low-level support for random access parsing for nXML mode
+
+;; Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This uses xmltok.el to do XML parsing. The fundamental problem is
+;; how to handle changes. We don't want to maintain a complete parse
+;; tree.  We also don't want to reparse from the start of the document
+;; on every keystroke.  However, it is not possible in general to
+;; parse an XML document correctly starting at a random point in the
+;; middle.  The main problems are comments, CDATA sections and
+;; processing instructions: these can all contain things that are
+;; indistinguishable from elements. Literals in the prolog are also a
+;; problem.  Attribute value literals are not a problem because
+;; attribute value literals cannot contain less-than signs.
+;;
+;; Our strategy is to keep track of just the problematic things.
+;; Specifically, we keep track of all comments, CDATA sections and
+;; processing instructions in the instance.  We do this by marking all
+;; except the first character of these with a non-nil nxml-inside text
+;; property. The value of the nxml-inside property is comment,
+;; cdata-section or processing-instruction.  The first character does
+;; not have the nxml-inside property so we can find the beginning of
+;; the construct by looking for a change in a text property value
+;; (Emacs provides primitives for this).  We use text properties
+;; rather than overlays, since the implementation of overlays doesn't
+;; look like it scales to large numbers of overlays in a buffer.
+;;
+;; We don't in fact track all these constructs, but only track them in
+;; some initial part of the instance. The variable `nxml-scan-end'
+;; contains the limit of where we have scanned up to for them.
+;;
+;; Thus to parse some random point in the file we first ensure that we
+;; have scanned up to that point.  Then we search backwards for a
+;; <. Then we check whether the < has an nxml-inside property. If it
+;; does we go backwards to first character that does not have an
+;; nxml-inside property (this character must be a <).  Then we start
+;; parsing forward from the < we have found.
+;;
+;; The prolog has to be parsed specially, so we also keep track of the
+;; end of the prolog in `nxml-prolog-end'. The prolog is reparsed on
+;; every change to the prolog.  This won't work well if people try to
+;; edit huge internal subsets. Hopefully that will be rare.
+;;
+;; We keep track of the changes by adding to the buffer's
+;; after-change-functions hook.  Scanning is also done as a
+;; prerequisite to fontification by adding to fontification-functions
+;; (in the same way as jit-lock).  This means that scanning for these
+;; constructs had better be quick.  Fortunately it is. Firstly, the
+;; typical proportion of comments, CDATA sections and processing
+;; instructions is small relative to other things.  Secondly, to scan
+;; we just search for the regexp <[!?].
+;;
+;; One problem is unclosed comments, processing instructions and CDATA
+;; sections.  Suppose, for example, we encounter a <!-- but there's no
+;; matching -->.  This is not an unexpected situation if the user is
+;; creating a comment. It is not helpful to treat the whole of the
+;; file starting from the <!-- onwards as a single unclosed comment
+;; token. Instead we treat just the <!-- as a piece of not well-formed
+;; markup and continue.  The problem is that if at some later stage a
+;; --> gets added to the buffer after the unclosed <!--, we will need
+;; to reparse the buffer starting from the <!--.  We need to keep
+;; track of these reparse dependencies; they are called dependent
+;; regions in the code.
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-util)
+
+(defvar nxml-prolog-end nil
+  "Integer giving position following end of the prolog.")
+(make-variable-buffer-local 'nxml-prolog-end)
+
+(defvar nxml-scan-end nil
+  "Marker giving position up to which we have scanned.
+nxml-scan-end must be >= nxml-prolog-end.  Furthermore, nxml-scan-end
+must not an inside position in the following sense. A position is
+inside if the following character is a part of, but not the first
+character of, a CDATA section, comment or processing instruction.
+Furthermore all positions >= nxml-prolog-end and < nxml-scan-end that
+are inside positions must have a non-nil nxml-inside property whose
+value is a symbol specifying what it is inside. Any characters with a
+non-nil fontified property must have position < nxml-scan-end and the
+correct face. Dependent regions must also be established for any
+unclosed constructs starting before nxml-scan-end.
+There must be no nxml-inside properties after nxml-scan-end.")
+(make-variable-buffer-local 'nxml-scan-end)
+
+(defsubst nxml-get-inside (pos)
+  (get-text-property pos 'nxml-inside))
+
+(defsubst nxml-clear-inside (start end)
+  (remove-text-properties start end '(nxml-inside nil)))
+
+(defsubst nxml-set-inside (start end type)
+  (put-text-property start end 'nxml-inside type))
+
+(defun nxml-inside-end (pos)
+  "Return the end of the inside region containing POS.
+Return nil if the character at POS is not inside."
+  (if (nxml-get-inside pos)
+      (or (next-single-property-change pos 'nxml-inside)
+         (point-max))
+    nil))
+
+(defun nxml-inside-start (pos)
+  "Return the start of the inside region containing POS.
+Return nil if the character at POS is not inside."
+  (if (nxml-get-inside pos)
+      (or (previous-single-property-change (1+ pos) 'nxml-inside)
+         (point-min))
+    nil))
+
+;;; Change management
+
+(defun nxml-scan-after-change (start end)
+  "Restore `nxml-scan-end' invariants after a change.
+The change happened between START and END.
+Return position after which lexical state is unchanged.
+END must be > nxml-prolog-end."
+  (if (>= start nxml-scan-end)
+      nxml-scan-end
+    (goto-char start)
+    (nxml-move-outside-backwards)
+    (setq start (point))
+    (let ((inside-remove-start start)
+         xmltok-errors
+         xmltok-dependent-regions)
+      (while (or (when (xmltok-forward-special (min end nxml-scan-end))
+                  (when (memq xmltok-type
+                              '(comment
+                                cdata-section
+                                processing-instruction))
+                    (nxml-clear-inside inside-remove-start
+                                       (1+ xmltok-start))
+                    (nxml-set-inside (1+ xmltok-start)
+                                     (point)
+                                     xmltok-type)
+                    (setq inside-remove-start (point)))
+                  (if (< (point) (min end nxml-scan-end))
+                      t
+                    (setq end (point))
+                    nil))
+                ;; The end of the change was inside but is now outside.
+                ;; Imagine something really weird like
+                ;; <![CDATA[foo <!-- bar ]]> <![CDATA[ stuff --> <!-- ]]> -->
+                ;; and suppose we deleted "<![CDATA[f"
+                (let ((inside-end (nxml-inside-end end)))
+                  (when inside-end
+                    (setq end inside-end)
+                    t))))
+      (nxml-clear-inside inside-remove-start end)
+      (nxml-clear-dependent-regions start end)
+      (nxml-mark-parse-dependent-regions))
+    (when (> end nxml-scan-end)
+      (set-marker nxml-scan-end end))
+    end))
+
+(defun nxml-scan-prolog ()
+  (goto-char (point-min))
+  (let (xmltok-dtd
+       xmltok-errors
+       xmltok-dependent-regions)
+    (setq nxml-prolog-regions (xmltok-forward-prolog))
+    (setq nxml-prolog-end (point))
+    (nxml-clear-inside (point-min) nxml-prolog-end)
+    (nxml-clear-dependent-regions (point-min) nxml-prolog-end)
+    (nxml-mark-parse-dependent-regions))
+  (when (< nxml-scan-end nxml-prolog-end)
+    (set-marker nxml-scan-end nxml-prolog-end)))
+
+
+;;; Dependent regions
+
+(defun nxml-adjust-start-for-dependent-regions (start end pre-change-length)
+  (let ((overlays (overlays-in (1- start) start))
+       (adjusted-start start))
+    (while overlays
+      (let* ((overlay (car overlays))
+            (ostart (overlay-start overlay)))
+       (when (and (eq (overlay-get overlay 'category) 'nxml-dependent)
+                  (< ostart adjusted-start))
+         (let ((funargs (overlay-get overlay 'nxml-funargs)))
+           (when (apply (car funargs)
+                        (append (list start
+                                      end
+                                      pre-change-length
+                                      ostart
+                                      (overlay-end overlay))
+                                (cdr funargs)))
+             (setq adjusted-start ostart)))))
+      (setq overlays (cdr overlays)))
+    adjusted-start))
+                 
+(defun nxml-mark-parse-dependent-regions ()
+  (while xmltok-dependent-regions
+    (apply 'nxml-mark-parse-dependent-region
+          (car xmltok-dependent-regions))
+    (setq xmltok-dependent-regions
+         (cdr xmltok-dependent-regions))))
+
+(defun nxml-mark-parse-dependent-region (fun start end &rest args)
+  (let ((overlay (make-overlay start end nil t t)))
+    (overlay-put overlay 'category 'nxml-dependent)
+    (overlay-put overlay 'nxml-funargs (cons fun args))))
+
+(put 'nxml-dependent 'evaporate t)
+
+(defun nxml-clear-dependent-regions (start end)
+  (let ((overlays (overlays-in start end)))
+    (while overlays
+      (let* ((overlay (car overlays))
+            (category (overlay-get overlay 'category)))
+       (when (and (eq category 'nxml-dependent)
+                  (<= start (overlay-start overlay)))
+         (delete-overlay overlay)))
+      (setq overlays (cdr overlays)))))
+
+;;; Random access parsing
+
+(defun nxml-token-after ()
+  "Return the position after the token containing the char after point.
+Sets up the variables `xmltok-type', `xmltok-start',
+`xmltok-name-end', `xmltok-name-colon', `xmltok-attributes',
+`xmltok-namespace-attributes' in the same was as does
+`xmltok-forward'.  The prolog will be treated as a single token with
+type `prolog'."
+  (let ((pos (point)))
+    (if (< pos nxml-prolog-end)
+       (progn
+         (setq xmltok-type 'prolog
+               xmltok-start (point-min))
+         (min nxml-prolog-end (point-max)))
+      (nxml-ensure-scan-up-to-date)
+      (if (nxml-get-inside pos)
+         (save-excursion
+           (nxml-move-outside-backwards)
+           (xmltok-forward)
+           (point))
+       (save-excursion
+         (if (or (eq (char-after) ?<)
+                     (search-backward "<"
+                                      (max (point-min) nxml-prolog-end)
+                                      t))
+             (nxml-move-outside-backwards)
+           (goto-char (if (<= (point-min) nxml-prolog-end)
+                          nxml-prolog-end
+                        (or (nxml-inside-end (point-min))
+                            (point-min)))))
+         (while (and (nxml-tokenize-forward)
+                     (<= (point) pos)))
+         (point))))))
+
+(defun nxml-token-before ()
+  "Return the position after the token containing the char before point.
+Sets variables like `nxml-token-after'."
+  (if (/= (point-min) (point))
+      (save-excursion
+       (goto-char (1- (point)))
+       (nxml-token-after))
+    (setq xmltok-start (point))
+    (setq xmltok-type nil)
+    (point)))
+
+(defun nxml-tokenize-forward ()
+  (let (xmltok-dependent-regions
+       xmltok-errors)
+    (when (and (xmltok-forward)
+              (> (point) nxml-scan-end))
+      (cond ((memq xmltok-type '(comment
+                                cdata-section
+                                processing-instruction))
+            (nxml-with-unmodifying-text-property-changes
+              (nxml-set-inside (1+ xmltok-start) (point) xmltok-type)))
+           (xmltok-dependent-regions
+            (nxml-mark-parse-dependent-regions)))
+      (set-marker nxml-scan-end (point)))
+    xmltok-type))
+
+(defun nxml-move-outside-backwards ()
+  "Move point to first character of the containing special thing.
+Leave point unmoved if it is not inside anything special."
+  (let ((start (nxml-inside-start (point))))
+    (when start
+      (goto-char (1- start))
+      (when (nxml-get-inside (point))
+       (error "Char before inside-start at %s had nxml-inside property %s"
+              (point)
+              (nxml-get-inside (point)))))))
+
+(defun nxml-ensure-scan-up-to-date ()
+  (let ((pos (point)))
+    (when (< nxml-scan-end pos)
+      (save-excursion
+       (goto-char nxml-scan-end)
+       (let (xmltok-errors
+             xmltok-dependent-regions)
+         (while (when (xmltok-forward-special pos)
+                  (when (memq xmltok-type
+                              '(comment
+                                processing-instruction
+                                cdata-section))
+                    (nxml-with-unmodifying-text-property-changes
+                      (nxml-set-inside (1+ xmltok-start)
+                                       (point)
+                                       xmltok-type)))
+                  (if (< (point) pos)
+                      t
+                    (setq pos (point))
+                    nil)))
+         (nxml-clear-dependent-regions nxml-scan-end pos)
+         (nxml-mark-parse-dependent-regions)
+         (set-marker nxml-scan-end pos))))))
+
+;;; Element scanning
+
+(defun nxml-scan-element-forward (from &optional up)
+  "Scan forward from FROM over a single balanced element.
+Point must between tokens.  Return the position of the end of the tag
+that ends the element. `xmltok-start' will contain the position of the
+start of the tag. If UP is non-nil, then scan past end-tag of element
+containing point.  If no element is found, return nil.  If a
+well-formedness error prevents scanning, signal an nxml-scan-error.
+Point is not moved."
+  (let ((open-tags (and up t))
+       found)
+    (save-excursion
+      (goto-char from)
+      (while (cond ((not (nxml-tokenize-forward))
+                   (when (consp open-tags)
+                     (nxml-scan-error (cadr open-tags)
+                                      "Start-tag has no end-tag"))
+                   nil)
+                  ((eq xmltok-type 'start-tag)
+                   (setq open-tags
+                         (cons (xmltok-start-tag-qname)
+                               (cons xmltok-start
+                                     open-tags)))
+                   t)
+                  ((eq xmltok-type 'end-tag)
+                   (cond ((not open-tags) nil)
+                         ((not (consp open-tags)) (setq found (point)) nil)
+                         ((not (string= (car open-tags)
+                                        (xmltok-end-tag-qname)))
+                          (nxml-scan-error (+ 2 xmltok-start)
+                                           "Mismatched end-tag; \
+expected `%s'"
+                                           (car open-tags)))
+                         ((setq open-tags (cddr open-tags)) t)
+                         (t (setq found (point)) nil)))
+                  ((memq xmltok-type '(empty-element
+                                       partial-empty-element))
+                   (if open-tags
+                       t
+                     (setq found (point))
+                     nil))
+                  ((eq xmltok-type 'partial-end-tag)
+                   (cond ((not open-tags) nil)
+                         ((not (consp open-tags)) (setq found (point)) nil)
+                         ((setq open-tags (cddr open-tags)) t)
+                         (t (setq found (point)) nil)))
+                  ((eq xmltok-type 'partial-start-tag)
+                   (nxml-scan-error xmltok-start
+                                    "Missing `>'"))
+                  (t t))))
+    found))
+
+(defun nxml-scan-element-backward (from &optional up bound)
+  "Scan backward from FROM over a single balanced element.
+Point must between tokens.  Return the position of the end of the tag
+that starts the element. `xmltok-start' will contain the position of
+the start of the tag.  If UP is non-nil, then scan past start-tag of
+element containing point.  If BOUND is non-nil, then don't scan back
+past BOUND.  If no element is found, return nil.  If a well-formedness
+error prevents scanning, signal an nxml-scan-error.  Point is not
+moved."
+  (let ((open-tags (and up t))
+       token-end found)
+    (save-excursion
+      (goto-char from)
+      (while (cond ((or (< (point) nxml-prolog-end)
+                       (not (search-backward "<"
+                                             (max (or bound 0)
+                                                  nxml-prolog-end)
+                                             t)))
+                   (when (and (consp open-tags) (not bound))
+                     (nxml-scan-error (cadr open-tags)
+                                      "End-tag has no start-tag"))
+                   nil)
+                  ((progn
+                     (nxml-move-outside-backwards)
+                     (save-excursion
+                       (nxml-tokenize-forward)
+                       (setq token-end (point)))
+                     (eq xmltok-type 'end-tag))
+                   (setq open-tags
+                         (cons (xmltok-end-tag-qname)
+                               (cons xmltok-start open-tags)))
+                   t)
+                  ((eq xmltok-type 'start-tag)
+                   (cond ((not open-tags) nil)
+                         ((not (consp open-tags))
+                          (setq found token-end)
+                          nil)
+                         ((and (car open-tags)
+                               (not (string= (car open-tags)
+                                             (xmltok-start-tag-qname))))
+                          (nxml-scan-error (1+ xmltok-start)
+                                           "Mismatched start-tag; \
+expected `%s'"
+                                           (car open-tags)))
+                         ((setq open-tags (cddr open-tags)) t)
+                         (t (setq found token-end) nil)))
+                  ((memq xmltok-type '(empty-element
+                                       partial-empty-element))
+                   (if open-tags
+                       t
+                     (setq found token-end)
+                     nil))
+                  ((eq xmltok-type 'partial-end-tag)
+                   (setq open-tags
+                         (cons nil (cons xmltok-start open-tags)))
+                   t)
+                  ((eq xmltok-type 'partial-start-tag)
+                   ;; if we have only a partial-start-tag
+                   ;; then it's unlikely that there's a matching
+                   ;; end-tag, so it's probably not helpful
+                   ;; to treat it as a complete start-tag
+                   (nxml-scan-error xmltok-start
+                                    "Missing `>'"))
+                  (t t))))
+    found))
+
+(defun nxml-scan-error (&rest args)
+  (signal 'nxml-scan-error args))
+
+(put 'nxml-scan-error
+     'error-conditions
+     '(error nxml-error nxml-scan-error))
+
+(put 'nxml-scan-error
+     'error-message
+     "Scan over element that is not well-formed")
+
+(provide 'nxml-rap)
+
+;;; nxml-rap.el ends here
diff --git a/lisp/nxml/nxml-uchnm.el b/lisp/nxml/nxml-uchnm.el
new file mode 100644 (file)
index 0000000..fbb6074
--- /dev/null
@@ -0,0 +1,257 @@
+;;; nxml-uchnm.el --- support for Unicode standard cha names in nxml-mode
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This enables the use of the character names defined in the Unicode
+;; Standard.  The use of the names can be controlled on a per-block
+;; basis, so as both to reduce memory usage and loading time,
+;; and to make completion work better.
+;; The main entry point is `nxml-enable-unicode-char-name-sets'.  Typically,
+;; this is added to `nxml-mode-hook' (rng-auto.el does this already).
+;; To customize the blocks for which names are used
+
+;;; Code:
+
+(require 'nxml-mode)
+
+(defconst nxml-unicode-blocks
+  '(("Basic Latin" #x0000 #x007F)
+    ("Latin-1 Supplement" #x0080 #x00FF)
+    ("Latin Extended-A" #x0100 #x017F)
+    ("Latin Extended-B" #x0180 #x024F)
+    ("IPA Extensions" #x0250 #x02AF)
+    ("Spacing Modifier Letters" #x02B0 #x02FF)
+    ("Combining Diacritical Marks" #x0300 #x036F)
+    ("Greek and Coptic" #x0370 #x03FF)
+    ("Cyrillic" #x0400 #x04FF)
+    ("Cyrillic Supplementary" #x0500 #x052F)
+    ("Armenian" #x0530 #x058F)
+    ("Hebrew" #x0590 #x05FF)
+    ("Arabic" #x0600 #x06FF)
+    ("Syriac" #x0700 #x074F)
+    ("Thaana" #x0780 #x07BF)
+    ("Devanagari" #x0900 #x097F)
+    ("Bengali" #x0980 #x09FF)
+    ("Gurmukhi" #x0A00 #x0A7F)
+    ("Gujarati" #x0A80 #x0AFF)
+    ("Oriya" #x0B00 #x0B7F)
+    ("Tamil" #x0B80 #x0BFF)
+    ("Telugu" #x0C00 #x0C7F)
+    ("Kannada" #x0C80 #x0CFF)
+    ("Malayalam" #x0D00 #x0D7F)
+    ("Sinhala" #x0D80 #x0DFF)
+    ("Thai" #x0E00 #x0E7F)
+    ("Lao" #x0E80 #x0EFF)
+    ("Tibetan" #x0F00 #x0FFF)
+    ("Myanmar" #x1000 #x109F)
+    ("Georgian" #x10A0 #x10FF)
+    ("Hangul Jamo" #x1100 #x11FF)
+    ("Ethiopic" #x1200 #x137F)
+    ("Cherokee" #x13A0 #x13FF)
+    ("Unified Canadian Aboriginal Syllabics" #x1400 #x167F)
+    ("Ogham" #x1680 #x169F)
+    ("Runic" #x16A0 #x16FF)
+    ("Tagalog" #x1700 #x171F)
+    ("Hanunoo" #x1720 #x173F)
+    ("Buhid" #x1740 #x175F)
+    ("Tagbanwa" #x1760 #x177F)
+    ("Khmer" #x1780 #x17FF)
+    ("Mongolian" #x1800 #x18AF)
+    ("Latin Extended Additional" #x1E00 #x1EFF)
+    ("Greek Extended" #x1F00 #x1FFF)
+    ("General Punctuation" #x2000 #x206F)
+    ("Superscripts and Subscripts" #x2070 #x209F)
+    ("Currency Symbols" #x20A0 #x20CF)
+    ("Combining Diacritical Marks for Symbols" #x20D0 #x20FF)
+    ("Letterlike Symbols" #x2100 #x214F)
+    ("Number Forms" #x2150 #x218F)
+    ("Arrows" #x2190 #x21FF)
+    ("Mathematical Operators" #x2200 #x22FF)
+    ("Miscellaneous Technical" #x2300 #x23FF)
+    ("Control Pictures" #x2400 #x243F)
+    ("Optical Character Recognition" #x2440 #x245F)
+    ("Enclosed Alphanumerics" #x2460 #x24FF)
+    ("Box Drawing" #x2500 #x257F)
+    ("Block Elements" #x2580 #x259F)
+    ("Geometric Shapes" #x25A0 #x25FF)
+    ("Miscellaneous Symbols" #x2600 #x26FF)
+    ("Dingbats" #x2700 #x27BF)
+    ("Miscellaneous Mathematical Symbols-A" #x27C0 #x27EF)
+    ("Supplemental Arrows-A" #x27F0 #x27FF)
+    ("Braille Patterns" #x2800 #x28FF)
+    ("Supplemental Arrows-B" #x2900 #x297F)
+    ("Miscellaneous Mathematical Symbols-B" #x2980 #x29FF)
+    ("Supplemental Mathematical Operators" #x2A00 #x2AFF)
+    ("CJK Radicals Supplement" #x2E80 #x2EFF)
+    ("Kangxi Radicals" #x2F00 #x2FDF)
+    ("Ideographic Description Characters" #x2FF0 #x2FFF)
+    ("CJK Symbols and Punctuation" #x3000 #x303F)
+    ("Hiragana" #x3040 #x309F)
+    ("Katakana" #x30A0 #x30FF)
+    ("Bopomofo" #x3100 #x312F)
+    ("Hangul Compatibility Jamo" #x3130 #x318F)
+    ("Kanbun" #x3190 #x319F)
+    ("Bopomofo Extended" #x31A0 #x31BF)
+    ("Katakana Phonetic Extensions" #x31F0 #x31FF)
+    ("Enclosed CJK Letters and Months" #x3200 #x32FF)
+    ("CJK Compatibility" #x3300 #x33FF)
+    ("CJK Unified Ideographs Extension A" #x3400 #x4DBF)
+    ;;("CJK Unified Ideographs" #x4E00 #x9FFF)
+    ("Yi Syllables" #xA000 #xA48F)
+    ("Yi Radicals" #xA490 #xA4CF)
+    ;;("Hangul Syllables" #xAC00 #xD7AF)
+    ;;("High Surrogates" #xD800 #xDB7F)
+    ;;("High Private Use Surrogates" #xDB80 #xDBFF)
+    ;;("Low Surrogates" #xDC00 #xDFFF)
+    ;;("Private Use Area" #xE000 #xF8FF)
+    ;;("CJK Compatibility Ideographs" #xF900 #xFAFF)
+    ("Alphabetic Presentation Forms" #xFB00 #xFB4F)
+    ("Arabic Presentation Forms-A" #xFB50 #xFDFF)
+    ("Variation Selectors" #xFE00 #xFE0F)
+    ("Combining Half Marks" #xFE20 #xFE2F)
+    ("CJK Compatibility Forms" #xFE30 #xFE4F)
+    ("Small Form Variants" #xFE50 #xFE6F)
+    ("Arabic Presentation Forms-B" #xFE70 #xFEFF)
+    ("Halfwidth and Fullwidth Forms" #xFF00 #xFFEF)
+    ("Specials" #xFFF0 #xFFFF)
+    ("Old Italic" #x10300 #x1032F)
+    ("Gothic" #x10330 #x1034F)
+    ("Deseret" #x10400 #x1044F)
+    ("Byzantine Musical Symbols" #x1D000 #x1D0FF)
+    ("Musical Symbols" #x1D100 #x1D1FF)
+    ("Mathematical Alphanumeric Symbols" #x1D400 #x1D7FF)
+    ;;("CJK Unified Ideographs Extension B" #x20000 #x2A6DF)
+    ;;("CJK Compatibility Ideographs Supplement" #x2F800 #x2FA1F)
+    ("Tags" #xE0000 #xE007F)
+    ;;("Supplementary Private Use Area-A" #xF0000 #xFFFFF)
+    ;;("Supplementary Private Use Area-B" #x100000 #x10FFFF)
+    )
+  "List of Unicode blocks.
+For each block there is a list (NAME FIRST LAST), where
+NAME is a string giving the offical name of the block,
+FIRST is the first code-point and LAST is the last code-point.
+Blocks containing only characters with algorithmic names or no names
+are omitted.")
+
+(defun nxml-unicode-block-char-name-set (name)
+  "Return a symbol for a block whose offical Unicode name is NAME.
+The symbol is generated by downcasing and replacing each space
+by a hyphen."
+  (intern (replace-regexp-in-string " " "-" (downcase name))))
+
+;; This is intended to be a superset of the coverage
+;; of existing standard entity sets.
+(defvar nxml-enabled-unicode-blocks-default
+  '(basic-latin
+    latin-1-supplement
+    latin-extended-a
+    latin-extended-b
+    ipa-extensions
+    spacing-modifier-letters
+    combining-diacritical-marks
+    greek-and-coptic
+    cyrillic
+    general-punctuation
+    superscripts-and-subscripts
+    currency-symbols
+    combining-diacritical-marks-for-symbols
+    letterlike-symbols
+    number-forms
+    arrows
+    mathematical-operators
+    miscellaneous-technical
+    control-pictures
+    optical-character-recognition
+    enclosed-alphanumerics
+    box-drawing
+    block-elements
+    geometric-shapes
+    miscellaneous-symbols
+    dingbats
+    miscellaneous-mathematical-symbols-a
+    supplemental-arrows-a
+    supplemental-arrows-b
+    miscellaneous-mathematical-symbols-b
+    supplemental-mathematical-operators
+    cjk-symbols-and-punctuation
+    alphabetic-presentation-forms
+    variation-selectors
+    small-form-variants
+    specials
+    mathematical-alphanumeric-symbols)
+  "Default value for `nxml-enabled-unicode-blocks'.")
+
+(let ((dir (file-name-directory load-file-name)))
+  (mapcar (lambda (block)
+           (let ((sym (nxml-unicode-block-char-name-set (car block))))
+             (nxml-autoload-char-name-set
+              sym
+              (expand-file-name
+               (format "char-name/unicode/%05X-%05X"
+                       (nth 1 block)
+                       (nth 2 block))
+               dir))))
+         nxml-unicode-blocks))
+
+(defvar nxml-enable-unicode-char-name-sets-flag nil)
+
+(defcustom nxml-enabled-unicode-blocks nxml-enabled-unicode-blocks-default
+  "List of Unicode blocks for which Unicode character names are enabled.
+Each block is identified by a symbol derived from the name
+of the block by downcasing and replacing each space by a hyphen."
+  :set (lambda (sym value)
+        (set-default 'nxml-enabled-unicode-blocks value)
+        (when nxml-enable-unicode-char-name-sets-flag
+          (nxml-enable-unicode-char-name-sets-1)))
+  :type (cons 'set
+             (mapcar (lambda (block)
+                       `(const :tag ,(format "%s (%04X-%04X)"
+                                             (nth 0 block)
+                                             (nth 1 block)
+                                             (nth 2 block))
+                               ,(nxml-unicode-block-char-name-set
+                                 (nth 0 block))))
+                     nxml-unicode-blocks)))
+
+;;;###autoload
+(defun nxml-enable-unicode-char-name-sets ()
+  "Enable the use of Unicode standard names for characters.
+The Unicode blocks for which names are enabled is controlled by
+the variable `nxml-enabled-unicode-blocks'."
+  (interactive)
+  (setq nxml-char-name-ignore-case t)
+  (setq nxml-enable-unicode-char-name-sets-flag t)
+  (nxml-enable-unicode-char-name-sets-1))
+
+(defun nxml-enable-unicode-char-name-sets-1 ()
+  (mapcar (lambda (block)
+           (nxml-disable-char-name-set
+            (nxml-unicode-block-char-name-set (car block))))
+         nxml-unicode-blocks)
+  (mapcar (lambda (nameset)
+           (nxml-enable-char-name-set nameset))
+         nxml-enabled-unicode-blocks))
+
+(provide 'nxml-uchnm)
+
+;;; nxml-uchnm.el ends here
diff --git a/lisp/nxml/nxml-util.el b/lisp/nxml/nxml-util.el
new file mode 100644 (file)
index 0000000..070bdf8
--- /dev/null
@@ -0,0 +1,100 @@
+;;; nxml-util.el --- utility functions for nxml-*.el
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+(defun nxml-make-namespace (str)
+  "Return a symbol for the namespace URI STR.
+STR must be a string. If STR is the empty string, return nil.
+Otherwise, return the symbol whose name is STR prefixed with a colon."
+  (if (string-equal str "")
+      nil
+    (intern (concat ":" str))))
+
+(defun nxml-namespace-name (ns)
+  "Return the namespace URI corresponding to the symbol NS.
+This is the inverse of `nxml-make-namespace'."
+  (and ns (substring (symbol-name ns) 1)))
+
+(defconst nxml-xml-namespace-uri 
+  (nxml-make-namespace "http://www.w3.org/XML/1998/namespace"))
+
+(defconst nxml-xmlns-namespace-uri
+  (nxml-make-namespace "http://www.w3.org/2000/xmlns/"))
+
+(defmacro nxml-with-unmodifying-text-property-changes (&rest body)
+  "Evaluate BODY without any text property changes modifying the buffer.
+Any text properties changes happen as usual but the changes are not treated as
+modifications to the buffer."
+  (let ((modified (make-symbol "modified")))
+    `(let ((,modified (buffer-modified-p))
+          (inhibit-read-only t)
+          (inhibit-modification-hooks t)
+          (buffer-undo-list t)
+          (deactivate-mark nil)
+          ;; Apparently these avoid file locking problems.
+          (buffer-file-name nil)
+          (buffer-file-truename nil))
+       (unwind-protect
+          (progn ,@body)
+        (unless ,modified
+          (restore-buffer-modified-p nil))))))
+
+(put 'nxml-with-unmodifying-text-property-changes 'lisp-indent-function 0)
+(def-edebug-spec nxml-with-unmodifying-text-property-changes t)
+
+(defmacro nxml-with-invisible-motion (&rest body)
+  "Evaluate body without calling any point motion hooks."
+  `(let ((inhibit-point-motion-hooks t))
+     ,@body))
+
+(put 'nxml-with-invisible-motion 'lisp-indent-function 0)
+(def-edebug-spec nxml-with-invisible-motion t)
+
+(defun nxml-display-file-parse-error (err)
+  (let* ((filename (nth 1 err))
+        (buffer (find-file-noselect filename))
+        (pos (nth 2 err))
+        (message (nth 3 err)))
+    (pop-to-buffer buffer)
+    ;; What's the right thing to do if the buffer's modified?
+    ;; The position in the saved file could be completely different.
+    (goto-char (if (buffer-modified-p) 1 pos))
+    (error "%s" message)))
+
+(defun nxml-signal-file-parse-error (file pos message &optional error-symbol)
+  (signal (or error-symbol 'nxml-file-parse-error)
+         (list file pos message)))
+
+(put 'nxml-file-parse-error
+     'error-conditions
+     '(error nxml-file-parse-error))
+
+(put 'nxml-parse-file-error
+     'error-message
+     "Error parsing file")
+
+(provide 'nxml-util)
+
+;;; nxml-util.el ends here
diff --git a/lisp/nxml/rng-auto.el b/lisp/nxml/rng-auto.el
new file mode 100644 (file)
index 0000000..a0f95fc
--- /dev/null
@@ -0,0 +1,244 @@
+;;; rng-auto.el --- automatically extracted autoloads for RELAX NG
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+(setq nxml-version "20041004")
+
+(when (featurep 'mucs)
+  (error "nxml-mode is not compatible with Mule-UCS"))
+
+(let* ((dir (file-name-directory load-file-name))
+       (schema-dir (file-name-as-directory
+                    (expand-file-name "schemas" data-directory))))
+  (unless (member dir load-path)
+    (setq load-path (cons dir load-path)))
+  (setq rng-schema-locating-files-default
+       (list "schemas.xml"
+             (abbreviate-file-name
+              (expand-file-name "schemas.xml" schema-dir))))
+  (setq rng-schema-locating-file-schema-file
+       (expand-file-name "locate.rnc" schema-dir)))
+
+;; Users shouldn't edit this.
+;; Instead they should customize `rng-preferred-prefix-alist'.
+
+(setq rng-preferred-prefix-alist-default
+      ;; For XHTML and RELAX NG, prefer no prefix
+      '(("http://www.w3.org/1999/XSL/Transform" . "xsl")
+       ("http://www.w3.org/1999/02/22-rdf-syntax-ns#" . "rdf")))
+
+(add-hook 'nxml-mode-hook 'rng-nxml-mode-init)
+(add-hook 'nxml-mode-hook 'nxml-enable-unicode-char-name-sets)
+
+(setq rng-schema-loader-alist '(("rnc" . rng-c-load-schema)))
+
+(require 'nxml-enc)
+;; Install our own `set-auto-coding-function'.
+(nxml-start-auto-coding)
+
+\f
+;;;### (autoloads (nxml-glyph-display-string) "nxml-glyph" "nxml-glyph.el"
+;;;;;;  (16278 18099))
+;;; Generated autoloads from nxml-glyph.el
+
+(autoload (quote nxml-glyph-display-string) "nxml-glyph" "\
+Return a string that can display a glyph for Unicode code-point N.
+FACE gives the face that will be used for displaying the string.
+Return nil if the face cannot display a glyph for N." nil nil)
+
+;;;***
+\f
+;;;### (autoloads (nxml-mode) "nxml-mode" "nxml-mode.el" (16702 54517))
+;;; Generated autoloads from nxml-mode.el
+
+(autoload (quote nxml-mode) "nxml-mode" "\
+Major mode for editing XML.
+
+Syntax highlighting is performed unless the variable
+`nxml-syntax-highlight-flag' is nil.
+
+\\[nxml-finish-element] finishes the current element by inserting an end-tag.
+C-c C-i closes a start-tag with `>' and then inserts a balancing end-tag
+leaving point between the start-tag and end-tag. 
+\\[nxml-balanced-close-start-tag-block] is similar but for block rather than inline elements:
+the start-tag, point, and end-tag are all left on separate lines.
+If `nxml-slash-auto-complete-flag' is non-nil, then inserting a `</'
+automatically inserts the rest of the end-tag.
+
+\\[nxml-complete] performs completion on the symbol preceding point.
+
+\\[nxml-dynamic-markup-word] uses the contents of the current buffer
+to choose a tag to put around the word preceding point.
+
+Validation is provided by the related minor-mode `rng-validate-mode'.
+This also makes completion schema- and context- sensitive.  Element
+names, attribute names, attribute values and namespace URIs can all be
+completed. By default, `rng-validate-mode' is automatically enabled by
+`rng-nxml-mode-init' which is normally added to `nxml-mode-hook'. You
+can toggle it using \\[rng-validate-mode].
+
+\\[indent-for-tab-command] indents the current line appropriately.
+This can be customized using the variable `nxml-child-indent'
+and the variable `nxml-attribute-indent'.
+
+\\[nxml-insert-named-char] inserts a character reference using
+the character's name (by default, the Unicode name). \\[universal-argument] \\[nxml-insert-named-char]
+inserts the character directly.
+
+The Emacs commands that normally operate on balanced expressions will
+operate on XML markup items.  Thus \\[forward-sexp] will move forward
+across one markup item; \\[backward-sexp] will move backward across
+one markup item; \\[kill-sexp] will kill the following markup item;
+\\[mark-sexp] will mark the following markup item.  By default, each
+tag each treated as a single markup item; to make the complete element
+be treated as a single markup item, set the variable
+`nxml-sexp-element-flag' to t.  For more details, see the function
+`nxml-forward-balanced-item'.
+
+\\[nxml-backward-up-element] and \\[nxml-down-element] move up and
+down the element structure.
+
+Many aspects this mode can be customized using
+\\[customize-group] nxml RET." t nil)
+
+;;;***
+\f
+;;;### (autoloads (nxml-enable-unicode-char-name-sets) "nxml-uchnm"
+;;;;;;  "nxml-uchnm.el" (16270 38352))
+;;; Generated autoloads from nxml-uchnm.el
+
+(autoload (quote nxml-enable-unicode-char-name-sets) "nxml-uchnm" "\
+Enable the use of Unicode standard names for characters.
+The Unicode blocks for which names are enabled is controlled by
+the variable `nxml-enabled-unicode-blocks'." t nil)
+
+;;;***
+\f
+;;;### (autoloads (rng-c-load-schema) "rng-cmpct" "rng-cmpct.el"
+;;;;;;  (16280 36493))
+;;; Generated autoloads from rng-cmpct.el
+
+(autoload (quote rng-c-load-schema) "rng-cmpct" "\
+Load a schema in RELAX NG compact syntax from FILENAME.
+Return a pattern." nil nil)
+
+;;;***
+\f
+;;;### (autoloads (rng-write-version rng-format-manual rng-byte-compile-load
+;;;;;;  rng-update-autoloads) "rng-maint" "rng-maint.el" (16279 23645))
+;;; Generated autoloads from rng-maint.el
+
+(autoload (quote rng-update-autoloads) "rng-maint" "\
+Update the autoloads in rng-auto.el." t nil)
+
+(autoload (quote rng-byte-compile-load) "rng-maint" "\
+Byte-compile and load all of the RELAX NG library in an appropriate order." t nil)
+
+(autoload (quote rng-format-manual) "rng-maint" "\
+Create manual.texi from manual.xml." t nil)
+
+(autoload (quote rng-write-version) "rng-maint" nil nil nil)
+
+;;;***
+\f
+;;;### (autoloads (rng-nxml-mode-init) "rng-nxml" "rng-nxml.el" (16294
+;;;;;;  8571))
+;;; Generated autoloads from rng-nxml.el
+
+(autoload (quote rng-nxml-mode-init) "rng-nxml" "\
+Initialize `nxml-mode' to take advantage of `rng-validate-mode'.
+This is typically called from `nxml-mode-hook'.
+Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil." t nil)
+
+;;;***
+\f
+;;;### (autoloads (rng-validate-mode) "rng-valid" "rng-valid.el"
+;;;;;;  (16664 9855))
+;;; Generated autoloads from rng-valid.el
+
+(autoload (quote rng-validate-mode) "rng-valid" "\
+Minor mode performing continual validation against a RELAX NG schema.
+
+Checks whether the buffer is a well-formed XML 1.0 document,
+conforming to the XML Namespaces Recommendation and valid against a
+RELAX NG schema. The mode-line indicates whether it is or not.  Any
+parts of the buffer that cause it not to be are considered errors and
+are highlighted with `rng-error-face'. A description of each error is
+available as a tooltip.  \\[rng-next-error] goes to the next error
+after point. Clicking mouse-1 on the word `Invalid' in the mode-line
+goes to the first error in the buffer. If the buffer changes, then it
+will be automatically rechecked when Emacs becomes idle; the
+rechecking will be paused whenever there is input pending..
+
+By default, uses a vacuous schema that allows any well-formed XML
+document. A schema can be specified explictly using
+\\[rng-set-schema-file-and-validate], or implicitly based on the buffer's
+file name or on the root element name.  In each case the schema must
+be a RELAX NG schema using the compact schema (such schemas
+conventionally have a suffix of `.rnc').  The variable
+`rng-schema-locating-files' specifies files containing rules
+to use for finding the schema." t nil)
+
+;;;***
+\f
+;;;### (autoloads (rng-xsd-compile) "rng-xsd" "rng-xsd.el" (16216
+;;;;;;  26672))
+;;; Generated autoloads from rng-xsd.el
+
+(put (quote http://www\.w3\.org/2001/XMLSchema-datatypes) (quote rng-dt-compile) (quote rng-xsd-compile))
+
+(autoload (quote rng-xsd-compile) "rng-xsd" "\
+Provides W3C XML Schema as a RELAX NG datatypes library. NAME is a
+symbol giving the local name of the datatype.  PARAMS is a list of
+pairs (PARAM-NAME . PARAM-VALUE) where PARAM-NAME is a symbol giving
+the name of the parameter and PARAM-VALUE is a string giving its
+value.  If NAME or PARAMS are invalid, it calls rng-dt-error passing
+it arguments in the same style as format; the value from rng-dt-error
+will be returned.  Otherwise, it returns a list.  The first member of
+the list is t if any string is a legal value for the datatype and nil
+otherwise.  The second argument is a symbol; this symbol will be
+called as a function passing it a string followed by the remaining
+members of the list.  The function must return an object representing
+the value of the datatype that was represented by the string, or nil
+if the string is not a representation of any value. The object
+returned can be any convenient non-nil value, provided that, if two
+strings represent the same value, the returned objects must be equal." nil nil)
+
+;;;***
+\f
+;;;### (autoloads (xmltok-get-declared-encoding-position) "xmltok"
+;;;;;;  "xmltok.el" (16664 8418))
+;;; Generated autoloads from xmltok.el
+
+(autoload (quote xmltok-get-declared-encoding-position) "xmltok" "\
+Return the position of the encoding in the XML declaration at point.
+If there is a well-formed XML declaration starting at point and it
+contains an encoding declaration, then return (START . END)
+where START and END are the positions of the start and the end
+of the encoding name; if there is no encoding declaration return
+the position where and encoding declaration could be inserted.
+If there is XML that is not well-formed that looks like an XML declaration,
+return nil.  Otherwise, return t.
+If LIMIT is non-nil, then do not consider characters beyond LIMIT." nil nil)
+
+;;;***
+\f
+;;; rng-auto.el ends here
diff --git a/lisp/nxml/rng-cmpct.el b/lisp/nxml/rng-cmpct.el
new file mode 100644 (file)
index 0000000..29699b6
--- /dev/null
@@ -0,0 +1,937 @@
+;;; rng-cmpct.el --- parsing of RELAX NG Compact Syntax schemas
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This parses a RELAX NG Compact Syntax schema into the form
+;; specified in rng-pttrn.el.
+;;
+;; RELAX NG Compact Syntax is specified by
+;;    http://relaxng.org/compact.html
+;;
+;; This file uses the prefix "rng-c-".
+
+;;; Code:
+
+(require 'nxml-util)
+(require 'rng-util)
+(require 'rng-uri)
+(require 'rng-pttrn)
+
+;;;###autoload
+(defun rng-c-load-schema (filename)
+  "Load a schema in RELAX NG compact syntax from FILENAME.
+Return a pattern."
+  (rng-c-parse-file filename))
+
+;;; Error handling
+
+(put 'rng-c-incorrect-schema
+     'error-conditions
+     '(error rng-error nxml-file-parse-error rng-c-incorrect-schema))
+
+(put 'rng-c-incorrect-schema
+     'error-message
+     "Incorrect schema")
+
+(defun rng-c-signal-incorrect-schema (filename pos message)
+  (nxml-signal-file-parse-error filename
+                               pos
+                               message
+                               'rng-c-incorrect-schema))
+
+;;; Lexing
+
+(defconst rng-c-keywords
+  '("attribute"
+    "default"
+    "datatypes"
+    "div"
+    "element"
+    "empty"
+    "external"
+    "grammar"
+    "include"
+    "inherit"
+    "list"
+    "mixed"
+    "namespace"
+    "notAllowed"
+    "parent"
+    "start"
+    "string"
+    "text"
+    "token")
+  "List of strings that are keywords in the compact syntax.")
+
+(defconst rng-c-anchored-keyword-re
+  (concat "\\`\\(" (regexp-opt rng-c-keywords) "\\)\\'")
+  "Regular expression to match a keyword in the compact syntax.")
+
+(defvar rng-c-syntax-table nil
+  "Syntax table for parsing the compact syntax.")
+
+(if rng-c-syntax-table
+    ()
+  (setq rng-c-syntax-table (make-syntax-table))
+  (modify-syntax-entry ?# "<" rng-c-syntax-table)
+  (modify-syntax-entry ?\n ">" rng-c-syntax-table)
+  (modify-syntax-entry ?- "w" rng-c-syntax-table)
+  (modify-syntax-entry ?. "w" rng-c-syntax-table)
+  (modify-syntax-entry ?_ "w" rng-c-syntax-table)
+  (modify-syntax-entry ?: "_" rng-c-syntax-table))
+
+(defconst rng-c-literal-1-re
+  "'\\(''\\([^']\\|'[^']\\|''[^']\\)*''\\|[^'\n]*\\)'"
+  "Regular expression to match a single-quoted literal.")
+
+(defconst rng-c-literal-2-re
+  (replace-regexp-in-string "'" "\"" rng-c-literal-1-re)
+  "Regular expression to match a double-quoted literal.")
+
+(defconst rng-c-ncname-re "\\w+")
+
+(defconst rng-c-anchored-ncname-re
+  (concat "\\`" rng-c-ncname-re "\\'"))
+
+(defconst rng-c-token-re
+  (concat "[&|]=" "\\|"
+         "[][()|&,*+?{}~=-]" "\\|"
+         rng-c-literal-1-re "\\|"
+         rng-c-literal-2-re "\\|"
+         rng-c-ncname-re "\\(:\\(\\*\\|" rng-c-ncname-re "\\)\\)?" "\\|"
+         "\\\\" rng-c-ncname-re "\\|"
+         ">>")
+  "Regular expression to match a token in the compact syntax.")
+
+(defun rng-c-init-buffer ()
+  (setq case-fold-search nil) ; automatically becomes buffer-local when set
+  (set-buffer-multibyte t)
+  (set-syntax-table rng-c-syntax-table))
+
+(defvar rng-c-current-token nil)
+(make-variable-buffer-local 'rng-c-current-token)
+
+(defun rng-c-advance ()
+  (cond ((looking-at rng-c-token-re)
+        (setq rng-c-current-token (match-string 0))
+        (goto-char (match-end 0))
+        (forward-comment (point-max)))
+       ((= (point) (point-max))
+        (setq rng-c-current-token ""))
+       (t (rng-c-error "Invalid token"))))
+
+(defconst rng-c-anchored-datatype-name-re
+  (concat "\\`" rng-c-ncname-re ":"  rng-c-ncname-re "\\'"))
+
+(defsubst rng-c-current-token-keyword-p ()
+  (string-match rng-c-anchored-keyword-re rng-c-current-token))
+
+(defsubst rng-c-current-token-prefixed-name-p ()
+  (string-match rng-c-anchored-datatype-name-re rng-c-current-token))
+
+(defsubst rng-c-current-token-literal-p ()
+  (string-match "\\`['\"]" rng-c-current-token))
+
+(defsubst rng-c-current-token-quoted-identifier-p ()
+  (string-match "\\`\\\\" rng-c-current-token))
+
+(defsubst rng-c-current-token-ncname-p ()
+  (string-match rng-c-anchored-ncname-re rng-c-current-token))
+
+(defsubst rng-c-current-token-ns-name-p ()
+  (let ((len (length rng-c-current-token)))
+    (and (> len 0)
+        (= (aref rng-c-current-token (- len 1)) ?*))))
+
+;;; Namespaces
+
+(defvar rng-c-inherit-namespace nil)
+
+(defvar rng-c-default-namespace nil)
+
+(defvar rng-c-default-namespace-declared nil)
+
+(defvar rng-c-namespace-decls nil
+  "Alist of namespace declarations.")
+
+(defconst rng-c-no-namespace nil)
+
+(defun rng-c-declare-standard-namespaces ()
+  (setq rng-c-namespace-decls
+       (cons (cons "xml" nxml-xml-namespace-uri)
+             rng-c-namespace-decls))
+  (when (and (not rng-c-default-namespace-declared)
+            rng-c-inherit-namespace)
+    (setq rng-c-default-namespace rng-c-inherit-namespace)))
+
+(defun rng-c-expand-name (prefixed-name)
+  (let ((i (string-match ":" prefixed-name)))
+    (rng-make-name (rng-c-lookup-prefix (substring prefixed-name
+                                                  0
+                                                  i))
+                  (substring prefixed-name (+ i 1)))))
+
+(defun rng-c-lookup-prefix (prefix)
+  (let ((binding (assoc prefix rng-c-namespace-decls)))
+    (or binding (rng-c-error "Undefined prefix %s" prefix))
+    (cdr binding)))
+
+(defun rng-c-unqualified-namespace (attribute)
+  (if attribute
+      rng-c-no-namespace
+    rng-c-default-namespace))
+
+(defun rng-c-make-context ()
+  (cons rng-c-default-namespace rng-c-namespace-decls))
+
+;;; Datatypes
+
+(defconst rng-string-datatype
+  (rng-make-datatype rng-builtin-datatypes-uri "string"))
+
+(defconst rng-token-datatype
+  (rng-make-datatype rng-builtin-datatypes-uri "token"))
+
+(defvar rng-c-datatype-decls nil
+  "Alist of datatype declarations.
+Contains a list of pairs (PREFIX . URI) where PREFIX is a string
+and URI is a symbol.")
+
+(defun rng-c-declare-standard-datatypes ()
+  (setq rng-c-datatype-decls
+       (cons (cons "xsd" rng-xsd-datatypes-uri)
+             rng-c-datatype-decls)))
+
+(defun rng-c-lookup-datatype-prefix (prefix)
+  (let ((binding (assoc prefix rng-c-datatype-decls)))
+    (or binding (rng-c-error "Undefined prefix %s" prefix))
+    (cdr binding)))
+
+(defun rng-c-expand-datatype (prefixed-name)
+  (let ((i (string-match ":" prefixed-name)))
+    (rng-make-datatype
+     (rng-c-lookup-datatype-prefix (substring prefixed-name 0 i))
+     (substring prefixed-name (+ i 1)))))
+
+;;; Grammars
+
+(defvar rng-c-current-grammar nil)
+(defvar rng-c-parent-grammar nil)
+
+(defun rng-c-make-grammar ()
+  (make-hash-table :test 'equal))
+
+(defconst rng-c-about-override-slot 0)
+(defconst rng-c-about-combine-slot 1)
+
+(defun rng-c-lookup-create (name grammar)
+  "Return a def object for NAME.  A def object is a pair
+\(ABOUT . REF) where REF is returned by `rng-make-ref'.  ABOUT is a
+two-element vector [OVERRIDE COMBINE].  COMBINE is either nil, choice
+or interleave.  OVERRIDE is either nil, require or t."
+  (let ((def (gethash name grammar)))
+    (if def
+       def
+      (progn 
+       (setq def (cons (vector nil nil) (rng-make-ref name)))
+       (puthash name def grammar)
+       def))))
+
+(defun rng-c-make-ref (name)
+  (or rng-c-current-grammar
+      (rng-c-error "Reference not in a grammar"))
+  (cdr (rng-c-lookup-create name rng-c-current-grammar)))
+
+(defun rng-c-make-parent-ref (name)
+  (or rng-c-parent-grammar
+      (rng-c-error "Reference to non-existent parent grammar"))
+  (cdr (rng-c-lookup-create name rng-c-parent-grammar)))
+
+(defvar rng-c-overrides nil
+  "Contains a list of (NAME . DEF) pairs.")
+
+(defun rng-c-merge-combine (def combine name)
+  (let* ((about (car def))
+        (current-combine (aref about rng-c-about-combine-slot)))
+    (if combine
+       (if current-combine
+           (or (eq combine current-combine)
+               (rng-c-error "Inconsistent combine for %s" name))
+         (aset about rng-c-about-combine-slot combine))
+      current-combine)))
+
+(defun rng-c-prepare-define (name combine in-include)
+  (let* ((def (rng-c-lookup-create name rng-c-current-grammar))
+        (about (car def))
+        (overridden (aref about rng-c-about-override-slot)))
+    (and in-include
+        (setq rng-c-overrides (cons (cons name def) rng-c-overrides)))
+    (cond (overridden (and (eq overridden 'require)
+                          (aset about rng-c-about-override-slot t))
+                     nil)
+         (t (setq combine (rng-c-merge-combine def combine name))
+            (and (rng-ref-get (cdr def))
+                 (not combine)
+                 (rng-c-error "Duplicate definition of %s" name))
+            def))))
+
+(defun rng-c-start-include (overrides)
+  (mapcar (lambda (name-def)
+           (let* ((def (cdr name-def))
+                  (about (car def))
+                  (save (aref about rng-c-about-override-slot)))
+             (aset about rng-c-about-override-slot 'require)
+             (cons save name-def)))
+         overrides))
+
+(defun rng-c-end-include (overrides)
+  (mapcar (lambda (o)
+           (let* ((saved (car o))
+                  (name-def (cdr o))
+                  (name (car name-def))
+                  (def (cdr name-def))
+                  (about (car def)))
+             (and (eq (aref about rng-c-about-override-slot) 'require)
+                  (rng-c-error "Definition of %s in include did not override definition in included file" name))
+             (aset about rng-c-about-override-slot saved)))
+         overrides))
+
+(defun rng-c-define (def value)
+  (and def
+       (let ((current-value (rng-ref-get (cdr def))))
+        (rng-ref-set (cdr def)
+                     (if current-value
+                         (if (eq (aref (car def) rng-c-about-combine-slot)
+                                 'choice)
+                             (rng-make-choice (list current-value value))
+                           (rng-make-interleave (list current-value value)))
+                       value)))))
+
+(defun rng-c-finish-grammar ()
+  (maphash (lambda (key def)
+            (or (rng-ref-get (cdr def))
+                (rng-c-error "Reference to undefined pattern %s" key)))
+          rng-c-current-grammar)
+  (rng-ref-get (cdr (or (gethash 'start rng-c-current-grammar)
+                       (rng-c-error "No definition of start")))))
+
+;;; Parsing
+
+(defvar rng-c-escape-positions nil)
+(make-variable-buffer-local 'rng-c-escape-positions)
+
+(defvar rng-c-file-name nil)
+(make-variable-buffer-local 'rng-c-file-name)
+
+(defvar rng-c-file-index nil)
+
+(defun rng-c-parse-file (filename &optional context)
+  (save-excursion
+    (set-buffer (get-buffer-create (rng-c-buffer-name context)))
+    (erase-buffer)
+    (rng-c-init-buffer)
+    (setq rng-c-file-name
+         (car (insert-file-contents filename)))
+    (setq rng-c-escape-positions nil)
+    (rng-c-process-escapes)
+    (rng-c-parse-top-level context)))
+
+(defun rng-c-buffer-name (context)
+  (concat " *RNC Input"
+         (if context
+             (concat "<"
+                     (number-to-string (setq rng-c-file-index
+                                             (1+ rng-c-file-index)))
+                     ">*")
+           (setq rng-c-file-index 1)
+           "*")))
+
+(defun rng-c-process-escapes ()
+  ;; Check for any nuls, since we will use nul chars
+  ;; for internal purposes.
+  (let ((pos (search-forward "\C-@" nil t)))
+    (and pos
+        (rng-c-error "Nul character found (binary file?)")))
+  (let ((offset 0))
+    (while (re-search-forward "\\\\x+{\\([0-9a-fA-F]+\\)}"
+                             (point-max)
+                             t)
+      (let* ((ch (decode-char 'ucs (string-to-number (match-string 1) 16))))
+       (if (and ch (> ch 0))
+           (let ((begin (match-beginning 0))
+                 (end (match-end 0)))
+             (delete-region begin end)
+             ;; Represent an escaped newline by nul, so
+             ;; that we can distinguish it from a literal newline.
+             ;; We will translate it back into a real newline later.
+             (insert (if (eq ch ?\n) 0 ch))
+             (setq offset (+ offset (- end begin 1)))
+             (setq rng-c-escape-positions
+                   (cons (cons (point) offset)
+                         rng-c-escape-positions)))
+         (rng-c-error "Invalid character escape")))))
+  (goto-char 1))
+
+(defun rng-c-translate-position (pos)
+  (let ((tem rng-c-escape-positions))
+    (while (and tem
+               (> (caar tem) pos))
+      (setq tem (cdr tem)))
+    (if tem
+       (+ pos (cdar tem))
+      pos)))
+
+(defun rng-c-error (&rest args)
+  (rng-c-signal-incorrect-schema rng-c-file-name
+                                (rng-c-translate-position (point))
+                                (apply 'format args)))
+
+(defun rng-c-parse-top-level (context)
+  (let ((rng-c-namespace-decls nil)
+       (rng-c-default-namespace nil)
+       (rng-c-datatype-decls nil))
+    (goto-char (point-min))
+    (forward-comment (point-max))
+    (rng-c-advance)
+    (rng-c-parse-decls)
+    (let ((p (if (eq context 'include)
+                (if (rng-c-implicit-grammar-p)
+                    (rng-c-parse-grammar-body "")
+                  (rng-c-parse-included-grammar))
+              (if (rng-c-implicit-grammar-p)
+                  (rng-c-parse-implicit-grammar)
+                (rng-c-parse-pattern)))))
+      (or (string-equal rng-c-current-token "")
+         (rng-c-error "Unexpected characters after pattern"))
+      p)))
+
+(defun rng-c-parse-included-grammar ()
+  (or (string-equal rng-c-current-token "grammar")
+      (rng-c-error "Included schema is not a grammar"))
+  (rng-c-advance)
+  (rng-c-expect "{")
+  (rng-c-parse-grammar-body "}"))
+
+(defun rng-c-implicit-grammar-p ()
+  (or (and (or (rng-c-current-token-prefixed-name-p)
+              (rng-c-current-token-quoted-identifier-p)
+              (and (rng-c-current-token-ncname-p)
+                   (not (rng-c-current-token-keyword-p))))
+          (looking-at "\\["))
+      (and (string-equal rng-c-current-token "[")
+          (rng-c-parse-lead-annotation)
+          nil)
+      (member rng-c-current-token '("div" "include" ""))
+      (looking-at "[|&]?=")))
+
+(defun rng-c-parse-decls ()
+  (setq rng-c-default-namespace-declared nil)
+  (while (progn
+          (let ((binding
+                 (assoc rng-c-current-token
+                        '(("namespace" . rng-c-parse-namespace)
+                          ("datatypes" . rng-c-parse-datatypes)
+                          ("default" . rng-c-parse-default)))))
+            (if binding
+                (progn
+                  (rng-c-advance)
+                  (funcall (cdr binding))
+                  t)
+              nil))))
+  (rng-c-declare-standard-datatypes)
+  (rng-c-declare-standard-namespaces))
+
+(defun rng-c-parse-datatypes ()
+  (let ((prefix (rng-c-parse-identifier-or-keyword)))
+    (or (not (assoc prefix rng-c-datatype-decls))
+       (rng-c-error "Duplicate datatypes declaration for prefix %s" prefix))
+    (rng-c-expect "=")
+    (setq rng-c-datatype-decls
+         (cons (cons prefix
+                     (rng-make-datatypes-uri (rng-c-parse-literal)))
+               rng-c-datatype-decls))))
+    
+(defun rng-c-parse-namespace ()
+  (rng-c-declare-namespace nil
+                          (rng-c-parse-identifier-or-keyword)))
+
+(defun rng-c-parse-default ()
+  (rng-c-expect "namespace")
+  (rng-c-declare-namespace t 
+                          (if (string-equal rng-c-current-token "=")
+                              nil
+                            (rng-c-parse-identifier-or-keyword))))
+
+(defun rng-c-declare-namespace (declare-default prefix)
+  (rng-c-expect "=")
+  (let ((ns (cond ((string-equal rng-c-current-token "inherit")
+                  (rng-c-advance)
+                  rng-c-inherit-namespace)
+                 (t
+                  (nxml-make-namespace (rng-c-parse-literal))))))
+    (and prefix
+        (or (not (assoc prefix rng-c-namespace-decls))
+            (rng-c-error "Duplicate namespace declaration for prefix %s"
+                         prefix))
+        (setq rng-c-namespace-decls
+              (cons (cons prefix ns) rng-c-namespace-decls)))
+    (and declare-default
+        (or (not rng-c-default-namespace-declared)
+            (rng-c-error "Duplicate default namespace declaration"))
+        (setq rng-c-default-namespace-declared t)
+        (setq rng-c-default-namespace ns))))
+
+(defun rng-c-parse-implicit-grammar ()
+  (let* ((rng-c-parent-grammar rng-c-current-grammar)
+        (rng-c-current-grammar (rng-c-make-grammar)))
+    (rng-c-parse-grammar-body "")
+    (rng-c-finish-grammar)))
+
+(defun rng-c-parse-grammar-body (close-token &optional in-include)
+  (while (not (string-equal rng-c-current-token close-token))
+    (cond ((rng-c-current-token-keyword-p)
+          (let ((kw (intern rng-c-current-token)))
+            (cond ((eq kw 'start)
+                   (rng-c-parse-define 'start in-include))
+                  ((eq kw 'div)
+                   (rng-c-advance)
+                   (rng-c-parse-div in-include))
+                  ((eq kw 'include)
+                   (and in-include
+                        (rng-c-error "Nested include"))
+                   (rng-c-advance)
+                   (rng-c-parse-include))
+                  (t (rng-c-error "Invalid grammar keyword")))))
+         ((rng-c-current-token-ncname-p)
+          (if (looking-at "\\[")
+              (rng-c-parse-annotation-element)
+            (rng-c-parse-define rng-c-current-token
+                                in-include)))
+         ((rng-c-current-token-quoted-identifier-p)
+          (if (looking-at "\\[")
+              (rng-c-parse-annotation-element)
+            (rng-c-parse-define (substring rng-c-current-token 1)
+                                in-include)))
+         ((rng-c-current-token-prefixed-name-p)
+          (rng-c-parse-annotation-element))
+         ((string-equal rng-c-current-token "[")
+          (rng-c-parse-lead-annotation)
+          (and (string-equal rng-c-current-token close-token)
+               (rng-c-error "Missing annotation subject"))
+          (and (looking-at "\\[")
+               (rng-c-error "Leading annotation applied to annotation")))
+         (t (rng-c-error "Invalid grammar content"))))
+  (or (string-equal rng-c-current-token "")
+      (rng-c-advance)))
+
+(defun rng-c-parse-div (in-include)
+  (rng-c-expect "{")
+  (rng-c-parse-grammar-body "}" in-include))
+
+(defun rng-c-parse-include ()
+  (let* ((filename (rng-c-expand-file (rng-c-parse-literal)))
+        (rng-c-inherit-namespace (rng-c-parse-opt-inherit))
+        overrides)
+    (cond ((string-equal rng-c-current-token "{")
+          (rng-c-advance)
+          (let ((rng-c-overrides nil))
+            (rng-c-parse-grammar-body "}" t)
+            (setq overrides rng-c-overrides))
+          (setq overrides (rng-c-start-include overrides))
+          (rng-c-parse-file filename 'include)
+          (rng-c-end-include overrides))
+         (t (rng-c-parse-file filename 'include)))))
+
+(defun rng-c-parse-define (name in-include)
+  (rng-c-advance)
+  (let ((assign (assoc rng-c-current-token
+                      '(("=" . nil)
+                        ("|=" . choice)
+                        ("&=" . interleave)))))
+    (or assign
+       (rng-c-error "Expected assignment operator"))
+    (rng-c-advance)
+    (let ((ref (rng-c-prepare-define name (cdr assign) in-include)))
+      (rng-c-define ref (rng-c-parse-pattern)))))
+
+(defvar rng-c-had-except nil)
+
+(defun rng-c-parse-pattern ()
+  (let* ((rng-c-had-except nil)
+        (p (rng-c-parse-repeated))
+        (op (assoc rng-c-current-token
+                   '(("|" . rng-make-choice)
+                     ("," . rng-make-group)
+                     ("&" . rng-make-interleave)))))
+    (if op
+       (if rng-c-had-except
+           (rng-c-error "Parentheses required around pattern using -")
+         (let* ((patterns (cons p nil))
+                (tail patterns)
+                (connector rng-c-current-token))
+           (while (progn
+                    (rng-c-advance)
+                    (let ((newcdr (cons (rng-c-parse-repeated) nil)))
+                      (setcdr tail newcdr)
+                      (setq tail newcdr))
+                    (string-equal rng-c-current-token connector)))
+           (funcall (cdr op) patterns)))
+      p)))
+
+(defun rng-c-parse-repeated ()
+  (let ((p (rng-c-parse-follow-annotations
+           (rng-c-parse-primary)))
+       (op (assoc rng-c-current-token
+                  '(("*" . rng-make-zero-or-more)
+                    ("+" . rng-make-one-or-more)
+                    ("?" . rng-make-optional)))))
+    (if op
+       (if rng-c-had-except
+           (rng-c-error "Parentheses required around pattern using -")
+         (rng-c-parse-follow-annotations
+          (progn
+            (rng-c-advance)
+            (funcall (cdr op) p))))
+      p)))
+
+(defun rng-c-parse-primary ()
+  "Parse a primary expression.  The current token must be the first
+token of the expression.  After parsing the current token should be
+token following the primary expression."
+  (cond ((rng-c-current-token-keyword-p)
+        (let ((parse-function (get (intern rng-c-current-token)
+                                   'rng-c-pattern)))
+          (or parse-function
+              (rng-c-error "Keyword %s does not introduce a pattern"
+                           rng-c-current-token))
+          (rng-c-advance)
+          (funcall parse-function)))
+       ((rng-c-current-token-ncname-p)
+        (rng-c-advance-with (rng-c-make-ref rng-c-current-token)))
+       ((string-equal rng-c-current-token "(")
+        (rng-c-advance)
+        (let ((p (rng-c-parse-pattern)))
+          (rng-c-expect ")")
+          p))
+       ((rng-c-current-token-prefixed-name-p)
+        (let ((name (rng-c-expand-datatype rng-c-current-token)))
+          (rng-c-advance)
+          (rng-c-parse-data name)))
+       ((rng-c-current-token-literal-p)
+        (rng-make-value rng-token-datatype (rng-c-parse-literal) nil))
+       ((rng-c-current-token-quoted-identifier-p)
+        (rng-c-advance-with
+         (rng-c-make-ref (substring rng-c-current-token 1))))
+       ((string-equal rng-c-current-token "[")
+        (rng-c-parse-lead-annotation)
+        (rng-c-parse-primary))
+       (t (rng-c-error "Invalid pattern"))))
+
+(defun rng-c-parse-parent ()
+  (and (rng-c-current-token-keyword-p)
+       (rng-c-error "Keyword following parent was not quoted"
+                   rng-c-current-token))
+  (rng-c-make-parent-ref (rng-c-parse-identifier-or-keyword)))
+
+(defun rng-c-parse-literal ()
+  (rng-c-fix-escaped-newlines
+   (apply 'concat (rng-c-parse-literal-segments))))
+
+(defun rng-c-parse-literal-segments ()
+  (let ((str (rng-c-parse-literal-segment)))
+    (cons str
+         (cond ((string-equal rng-c-current-token "~")
+                (rng-c-advance)
+                (rng-c-parse-literal-segments))
+               (t nil)))))
+
+(defun rng-c-parse-literal-segment ()
+  (or (rng-c-current-token-literal-p)
+      (rng-c-error "Expected a literal"))
+  (rng-c-advance-with
+   (let ((n (if (and (>= (length rng-c-current-token) 6)
+                    (eq (aref rng-c-current-token 0)
+                        (aref rng-c-current-token 1)))
+               3
+             1)))
+     (substring rng-c-current-token n (- n)))))
+
+(defun rng-c-fix-escaped-newlines (str)
+  (let ((pos 0))
+    (while (progn
+            (let ((n (string-match "\C-@" str pos)))
+              (and n
+                   (aset str n ?\n)
+                   (setq pos (1+ n)))))))
+  str)
+
+(defun rng-c-parse-identifier-or-keyword ()
+  (cond ((rng-c-current-token-ncname-p)
+        (rng-c-advance-with rng-c-current-token))
+       ((rng-c-current-token-quoted-identifier-p)
+        (rng-c-advance-with (substring rng-c-current-token 1)))
+       (t (rng-c-error "Expected identifier or keyword"))))
+   
+(put 'string 'rng-c-pattern 'rng-c-parse-string)
+(put 'token 'rng-c-pattern 'rng-c-parse-token)
+(put 'element 'rng-c-pattern 'rng-c-parse-element)
+(put 'attribute 'rng-c-pattern 'rng-c-parse-attribute)
+(put 'list 'rng-c-pattern 'rng-c-parse-list)
+(put 'mixed 'rng-c-pattern 'rng-c-parse-mixed)
+(put 'text 'rng-c-pattern 'rng-c-parse-text)
+(put 'empty 'rng-c-pattern 'rng-c-parse-empty)
+(put 'notAllowed 'rng-c-pattern 'rng-c-parse-not-allowed)
+(put 'grammar 'rng-c-pattern 'rng-c-parse-grammar)
+(put 'parent 'rng-c-pattern 'rng-c-parse-parent)
+(put 'external 'rng-c-pattern 'rng-c-parse-external)
+
+(defun rng-c-parse-element ()
+  (let ((name-class (rng-c-parse-name-class nil)))
+    (rng-c-expect "{")
+    (let ((pattern (rng-c-parse-pattern)))
+      (rng-c-expect "}")
+      (rng-make-element name-class pattern))))
+
+(defun rng-c-parse-attribute ()
+  (let ((name-class (rng-c-parse-name-class 'attribute)))
+    (rng-c-expect "{")
+    (let ((pattern (rng-c-parse-pattern)))
+      (rng-c-expect "}")
+      (rng-make-attribute name-class pattern))))
+
+(defun rng-c-parse-name-class (attribute)
+  (let* ((rng-c-had-except nil)
+        (name-class
+         (rng-c-parse-follow-annotations
+          (rng-c-parse-primary-name-class attribute))))
+    (if (string-equal rng-c-current-token "|")
+       (let* ((name-classes (cons name-class nil))
+              (tail name-classes))
+         (or (not rng-c-had-except)
+             (rng-c-error "Parentheses required around name-class using - operator"))
+         (while (progn
+                  (rng-c-advance)
+                  (let ((newcdr
+                         (cons (rng-c-parse-follow-annotations
+                                (rng-c-parse-primary-name-class attribute))
+                               nil)))
+                    (setcdr tail newcdr)
+                    (setq tail newcdr))
+                  (string-equal rng-c-current-token "|")))
+         (rng-make-choice-name-class name-classes))
+      name-class)))
+         
+(defun rng-c-parse-primary-name-class (attribute)
+  (cond ((rng-c-current-token-ncname-p)
+        (rng-c-advance-with
+         (rng-make-name-name-class
+          (rng-make-name (rng-c-unqualified-namespace attribute)
+                         rng-c-current-token))))
+       ((rng-c-current-token-prefixed-name-p)
+        (rng-c-advance-with
+         (rng-make-name-name-class
+          (rng-c-expand-name rng-c-current-token))))
+       ((string-equal rng-c-current-token "*")
+        (let ((except (rng-c-parse-opt-except-name-class attribute)))
+          (if except
+              (rng-make-any-name-except-name-class except)
+            (rng-make-any-name-name-class))))
+       ((rng-c-current-token-ns-name-p)
+        (let* ((ns
+                (rng-c-lookup-prefix (substring rng-c-current-token
+                                                0
+                                                -2)))
+               (except (rng-c-parse-opt-except-name-class attribute)))
+          (if except
+              (rng-make-ns-name-except-name-class ns except)
+            (rng-make-ns-name-name-class ns))))
+       ((string-equal rng-c-current-token "(")
+        (rng-c-advance)
+        (let ((name-class (rng-c-parse-name-class attribute)))
+          (rng-c-expect ")")
+          name-class))
+       ((rng-c-current-token-quoted-identifier-p)
+        (rng-c-advance-with
+         (rng-make-name-name-class
+          (rng-make-name (rng-c-unqualified-namespace attribute)
+                         (substring rng-c-current-token 1)))))
+       ((string-equal rng-c-current-token "[")
+        (rng-c-parse-lead-annotation)
+        (rng-c-parse-primary-name-class attribute))
+       (t (rng-c-error "Bad name class"))))
+
+(defun rng-c-parse-opt-except-name-class (attribute)
+  (rng-c-advance)
+  (and (string-equal rng-c-current-token "-")
+       (or (not rng-c-had-except)
+          (rng-c-error "Parentheses required around name-class using - operator"))
+       (setq rng-c-had-except t)
+       (progn
+        (rng-c-advance)
+        (rng-c-parse-primary-name-class attribute))))
+
+(defun rng-c-parse-mixed ()
+  (rng-c-expect "{")
+  (let ((pattern (rng-make-mixed (rng-c-parse-pattern))))
+    (rng-c-expect "}")
+    pattern))
+
+(defun rng-c-parse-list ()
+  (rng-c-expect "{")
+  (let ((pattern (rng-make-list (rng-c-parse-pattern))))
+    (rng-c-expect "}")
+    pattern))
+
+(defun rng-c-parse-text ()
+  (rng-make-text))
+
+(defun rng-c-parse-empty ()
+  (rng-make-empty))
+
+(defun rng-c-parse-not-allowed ()
+  (rng-make-not-allowed))
+
+(defun rng-c-parse-string ()
+  (rng-c-parse-data rng-string-datatype))
+
+(defun rng-c-parse-token ()
+  (rng-c-parse-data rng-token-datatype))
+
+(defun rng-c-parse-data (name)
+  (if (rng-c-current-token-literal-p)
+      (rng-make-value name
+                     (rng-c-parse-literal)
+                     (and (car name)
+                          (rng-c-make-context)))
+    (let ((params (rng-c-parse-optional-params)))
+      (if (string-equal rng-c-current-token "-")
+         (progn
+           (if rng-c-had-except
+               (rng-c-error "Parentheses required around pattern using -")
+             (setq rng-c-had-except t))
+           (rng-c-advance)
+           (rng-make-data-except name
+                                 params
+                                 (rng-c-parse-primary)))
+       (rng-make-data name params)))))
+
+(defun rng-c-parse-optional-params ()
+  (and (string-equal rng-c-current-token "{")
+       (let* ((head (cons nil nil))
+             (tail head))
+        (rng-c-advance)
+        (while (not (string-equal rng-c-current-token "}"))
+          (and (string-equal rng-c-current-token "[")
+               (rng-c-parse-lead-annotation))
+          (let ((name (rng-c-parse-identifier-or-keyword)))
+            (rng-c-expect "=")
+            (let ((newcdr (cons (cons (intern name)
+                                      (rng-c-parse-literal))
+                                nil)))
+              (setcdr tail newcdr)
+              (setq tail newcdr))))
+        (rng-c-advance)
+        (cdr head))))
+
+(defun rng-c-parse-external ()
+  (let* ((filename (rng-c-expand-file (rng-c-parse-literal)))
+        (rng-c-inherit-namespace (rng-c-parse-opt-inherit)))
+    (rng-c-parse-file filename 'external)))
+
+(defun rng-c-expand-file (uri)
+  (condition-case err
+      (rng-uri-file-name (rng-uri-resolve uri
+                                         (rng-file-name-uri rng-c-file-name)))
+    (rng-uri-error
+     (rng-c-error (cadr err)))))
+
+(defun rng-c-parse-opt-inherit ()
+  (cond ((string-equal rng-c-current-token "inherit")
+        (rng-c-advance)
+        (rng-c-expect "=")
+        (rng-c-lookup-prefix (rng-c-parse-identifier-or-keyword)))
+       (t rng-c-default-namespace)))
+
+(defun rng-c-parse-grammar ()
+  (rng-c-expect "{")
+  (let* ((rng-c-parent-grammar rng-c-current-grammar)
+        (rng-c-current-grammar (rng-c-make-grammar)))
+    (rng-c-parse-grammar-body "}")
+    (rng-c-finish-grammar)))
+
+(defun rng-c-parse-lead-annotation ()
+  (rng-c-parse-annotation-body)
+  (and (string-equal rng-c-current-token "[")
+       (rng-c-error "Multiple leading annotations")))
+
+(defun rng-c-parse-follow-annotations (obj)
+  (while (string-equal rng-c-current-token ">>")
+    (rng-c-advance)
+    (if (rng-c-current-token-prefixed-name-p)
+       (rng-c-advance)
+      (rng-c-parse-identifier-or-keyword))
+    (rng-c-parse-annotation-body t))
+  obj)
+
+(defun rng-c-parse-annotation-element ()
+  (rng-c-advance)
+  (rng-c-parse-annotation-body t))
+
+;; XXX need stricter checking of attribute names
+;; XXX don't allow attributes after text
+
+(defun rng-c-parse-annotation-body (&optional allow-text)
+  "Current token is [.  Parse up to matching ]. Current token after
+parse is token following ]."
+  (or (string-equal rng-c-current-token "[")
+      (rng-c-error "Expected ["))
+  (rng-c-advance)
+  (while (not (string-equal rng-c-current-token "]"))
+    (cond ((rng-c-current-token-literal-p)
+          (or allow-text
+              (rng-c-error "Out of place text within annotation"))
+          (rng-c-parse-literal))
+         (t
+          (if (rng-c-current-token-prefixed-name-p)
+              (rng-c-advance)
+            (rng-c-parse-identifier-or-keyword))
+          (cond ((string-equal rng-c-current-token "[")
+                 (rng-c-parse-annotation-body t))
+                ((string-equal rng-c-current-token "=")
+                 (rng-c-advance)
+                 (rng-c-parse-literal))
+                (t (rng-c-error "Expected = or ["))))))
+  (rng-c-advance))
+            
+(defun rng-c-advance-with (pattern)
+  (rng-c-advance)
+  pattern)
+
+(defun rng-c-expect (str)
+  (or (string-equal rng-c-current-token str)
+      (rng-c-error "Expected `%s' but got `%s'" str rng-c-current-token))
+  (rng-c-advance))
+
+(provide 'rng-cmpct)
+
+;;; rng-cmpct.el
diff --git a/lisp/nxml/rng-dt.el b/lisp/nxml/rng-dt.el
new file mode 100644 (file)
index 0000000..ba06891
--- /dev/null
@@ -0,0 +1,64 @@
+;;; rng-dt.el --- datatype library interface for RELAX NG
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'rng-util)
+
+(defvar rng-dt-error-reporter nil)
+
+(defun rng-dt-error (string &rest objs)
+  (if rng-dt-error-reporter
+      (apply rng-dt-error-reporter (cons string objs))
+    nil))
+
+(defvar rng-dt-namespace-context-getter nil
+  "A list used by datatype libraries to expand names.  The car of the
+list is a symbol which is the name of a function.  This function is
+applied to the cdr of the list.  The function must return a list whose
+car is the default namespace and whose cdr is an alist of (PREFIX
+. NAMESPACE) pairs, where PREFIX is a string and NAMESPACE is a
+symbol.  This must be dynamically bound before calling a datatype
+library.")
+
+(defsubst rng-dt-make-value (dt str)
+  (apply (car dt) (cons str (cdr dt))))
+
+(defun rng-dt-builtin-compile (name params)
+  (cond ((eq name 'string)
+        (if (null params)
+            '(t identity)
+          (rng-dt-error "The string datatype does not take any parameters")))
+       ((eq name 'token)
+        (if (null params)
+            '(t rng-collapse-space)
+          (rng-dt-error "The token datatype does not take any parameters")))
+       (t
+        (rng-dt-error "There is no built-in datatype %s" name))))
+
+(put (rng-make-datatypes-uri "") 'rng-dt-compile 'rng-dt-builtin-compile)
+
+(provide 'rng-dt)
+
+;;; rng-dt.el ends here
diff --git a/lisp/nxml/rng-loc.el b/lisp/nxml/rng-loc.el
new file mode 100644 (file)
index 0000000..b81bfe0
--- /dev/null
@@ -0,0 +1,548 @@
+;;; rng-loc.el --- locate the schema to use for validation
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'nxml-util)
+(require 'nxml-parse)
+(require 'rng-parse)
+(require 'rng-uri)
+(require 'rng-util)
+(require 'xmltok)
+
+(defvar rng-current-schema-file-name nil
+  "Filename of schema being used for current buffer.
+Nil if using a vacuous schema.")
+(make-variable-buffer-local 'rng-current-schema-file-name)
+
+(defvar rng-schema-locating-files-default nil
+  "Default value for variable `rng-schema-locating-files'.")
+
+(defvar rng-schema-locating-file-schema-file nil
+  "File containing schema for schema locating files.")
+
+(defvar rng-schema-locating-file-schema nil
+  "Schema for schema locating files or nil if not yet loaded.")
+
+(defcustom rng-schema-locating-files rng-schema-locating-files-default
+  "*List of schema locating files."
+  :type '(repeat file)
+  :group 'relax-ng)
+
+(defvar rng-schema-loader-alist nil
+  "Alist of schema extensions vs schema loader functions.")
+
+(defvar rng-cached-document-element nil)
+
+(defvar rng-document-type-history nil)
+
+(defun rng-set-document-type (type-id)
+  (interactive (list (rng-read-type-id)))
+  (condition-case err
+      (when (not (string= type-id ""))
+       (let ((schema-file (rng-locate-schema-file type-id)))
+         (unless schema-file
+           (error "Could not locate schema for type id `%s'" type-id))
+         (rng-set-schema-file-1 schema-file))
+       (rng-save-schema-location-1 t type-id)
+       (rng-what-schema))
+    (nxml-file-parse-error
+     (nxml-display-file-parse-error err))))
+
+(defun rng-read-type-id ()
+  (condition-case err
+      (let ((type-ids (rng-possible-type-ids))
+           (completion-ignore-case nil))
+       (completing-read "Document type id: "
+                        (mapcar (lambda (x) (cons x nil))
+                                type-ids)
+                        nil
+                        t
+                        nil
+                        'rng-document-type-history))
+    (nxml-file-parse-error
+     (nxml-display-file-parse-error err))))
+
+(defun rng-set-schema-file (filename)
+  "Set the schema for the current buffer to the schema in FILENAME.
+FILENAME must be the name of a file containing a schema.
+The extension of FILENAME is used to determine what kind of schema it
+is.  The variable `rng-schema-loader-alist' maps from schema
+extensions to schema loader functions. The function
+`rng-c-load-schema' is the loader for RELAX NG compact syntax.  The
+association is between the buffer and the schema: the association is
+lost when the buffer is killed."
+  (interactive "fSchema file: ")
+  (condition-case err
+      (progn
+       (rng-set-schema-file-1 filename)
+       (rng-save-schema-location-1 t))
+    (nxml-file-parse-error
+     (nxml-display-file-parse-error err))))
+
+(defun rng-set-vacuous-schema ()
+  "Set the schema for the current buffer to allow any well-formed XML."
+  (interactive)
+  (rng-set-schema-file-1 nil)
+  (rng-what-schema))
+
+(defun rng-set-schema-file-1 (filename)
+  (setq filename (and filename (expand-file-name filename)))
+  (setq rng-current-schema
+       (if filename
+           (rng-load-schema filename)
+         rng-any-element))
+  (setq rng-current-schema-file-name filename)
+  (run-hooks 'rng-schema-change-hook))
+  
+(defun rng-load-schema (filename)
+  (let* ((extension (file-name-extension filename))
+        (loader (cdr (assoc extension rng-schema-loader-alist))))
+    (or loader
+       (if extension
+           (error "No schema loader available for file extension `%s'"
+                  extension)
+         (error "No schema loader available for null file extension")))
+    (funcall loader filename)))
+
+(defun rng-what-schema ()
+  "Display a message saying what schema `rng-validate-mode' is using."
+  (interactive)
+  (if rng-current-schema-file-name
+      (message "Using schema %s" 
+              (abbreviate-file-name rng-current-schema-file-name))
+    (message "Using vacuous schema")))
+
+(defun rng-auto-set-schema (&optional no-display-error)
+  "Set the schema for this buffer based on the buffer's contents and file-name."
+  (interactive)
+  (condition-case err
+      (progn
+       (rng-set-schema-file-1 (rng-locate-schema-file))
+       (rng-what-schema))
+    (nxml-file-parse-error
+     (if no-display-error
+        (error "%s at position %s in %s"
+               (nth 3 err)
+               (nth 2 err)
+               (abbreviate-file-name (nth 1 err)))
+       (nxml-display-file-parse-error err)))))
+
+(defun rng-locate-schema-file (&optional type-id)
+  "Return the file-name of the schema to use for the current buffer.
+Return nil if no schema could be located.
+If TYPE-ID is non-nil, then locate the schema for this TYPE-ID."
+  (let* ((rng-cached-document-element nil)
+        (schema
+         (if type-id
+             (cons type-id nil)
+           (rng-locate-schema-file-using rng-schema-locating-files)))
+        files type-ids)
+    (while (consp schema)
+      (setq files rng-schema-locating-files)
+      (setq type-id (car schema))
+      (setq schema nil)
+      (when (member type-id type-ids)
+       (error "Type-id loop for type-id `%s'" type-id))
+      (setq type-ids (cons type-id type-ids))
+      (while (and files (not schema))
+       (setq schema
+             (rng-locate-schema-file-from-type-id type-id
+                                                  (car files)))
+       (setq files (cdr files))))
+    (and schema
+        (rng-uri-file-name schema))))
+
+(defun rng-possible-type-ids ()
+  "Return a list of the known type IDs."
+  (let ((files rng-schema-locating-files)
+       type-ids)
+    (while files
+      (setq type-ids (rng-possible-type-ids-using (car files) type-ids))
+      (setq files (cdr files)))
+    (rng-uniquify-equal (sort type-ids 'string<))))
+
+(defun rng-locate-schema-file-using (files)
+  "Locate a schema using the schema locating files FILES.
+FILES is a list of file-names.
+Return either a URI, a list (TYPE-ID) where TYPE-ID is a string
+or nil."
+  (let (rules
+       ;; List of types that override normal order-based
+       ;; priority, most important first
+       preferred-types
+       ;; Best result found so far; same form as return value.
+       best-so-far)
+    (while (and (progn
+                 (while (and (not rules) files)
+                   (setq rules (rng-get-parsed-schema-locating-file
+                                (car files)))
+                   (setq files (cdr files)))
+                 rules)
+               (or (not best-so-far) preferred-types))
+      (let* ((rule (car rules))
+            (rule-type (car rule))
+            (rule-matcher (get rule-type 'rng-rule-matcher)))
+       (setq rules (cdr rules))
+       (cond (rule-matcher
+              (when (and (or (not best-so-far)
+                             (memq rule-type preferred-types)))
+                         (setq best-so-far
+                               (funcall rule-matcher (cdr rule)))
+                         preferred-types)
+                (setq preferred-types
+                      (nbutlast preferred-types
+                                (length (memq rule-type preferred-types)))))
+             ((eq rule-type 'applyFollowingRules)
+              (when (not best-so-far)
+                (let ((prefer (cdr (assq 'ruleType (cdr rule)))))
+                  (when (and prefer
+                             (not (memq (setq prefer (intern prefer))
+                                        preferred-types)))
+                    (setq preferred-types
+                          (nconc preferred-types (list prefer)))))))
+             ((eq rule-type 'include)
+              (let ((uri (cdr (assq 'rules (cdr rule)))))
+                (when uri
+                  (setq rules
+                        (append (rng-get-parsed-schema-locating-file
+                                 (rng-uri-file-name uri))
+                                rules))))))))
+    best-so-far))
+
+(put 'documentElement 'rng-rule-matcher 'rng-match-document-element-rule)
+(put 'namespace 'rng-rule-matcher 'rng-match-namespace-rule)
+(put 'uri 'rng-rule-matcher 'rng-match-uri-rule)
+(put 'transformURI 'rng-rule-matcher 'rng-match-transform-uri-rule)
+(put 'default 'rng-rule-matcher 'rng-match-default-rule)
+
+(defun rng-match-document-element-rule (props)
+  (let ((document-element (rng-document-element))
+       (prefix (cdr (assq 'prefix props)))
+       (local-name (cdr (assq 'localName props))))
+    (and (or (not prefix)
+            (if (= (length prefix) 0)
+                (not (nth 1 document-element))
+              (string= prefix (nth 1 document-element))))
+        (or (not local-name)
+            (string= local-name
+                     (nth 2 document-element)))
+        (rng-match-default-rule props))))
+
+(defun rng-match-namespace-rule (props)
+  (let ((document-element (rng-document-element))
+       (ns (cdr (assq 'ns props))))
+    (and document-element
+        ns
+        (eq (nth 0 document-element)
+            (if (string= ns "")
+                nil
+              (nxml-make-namespace ns)))
+        (rng-match-default-rule props))))
+
+(defun rng-document-element ()
+  "Return a list (NS PREFIX LOCAL-NAME).
+NS is t if the document has a non-nil, but not otherwise known namespace."
+  (or rng-cached-document-element
+      (setq rng-cached-document-element
+           (save-excursion
+             (save-restriction
+               (widen)
+               (goto-char (point-min))
+               (let (xmltok-dtd)
+                 (xmltok-save
+                  (xmltok-forward-prolog)
+                  (xmltok-forward)
+                  (when (memq xmltok-type '(start-tag
+                                            partial-start-tag
+                                            empty-element
+                                            partial-empty-element))
+                    (list (rng-get-start-tag-namespace)
+                          (xmltok-start-tag-prefix)
+                          (xmltok-start-tag-local-name))))))))))
+
+(defun rng-get-start-tag-namespace ()
+  (let ((prefix (xmltok-start-tag-prefix))
+       namespace att value)
+    (while xmltok-namespace-attributes
+      (setq att (car xmltok-namespace-attributes))
+      (setq xmltok-namespace-attributes (cdr xmltok-namespace-attributes))
+      (when (if prefix
+               (and (xmltok-attribute-prefix att)
+                    (string= (xmltok-attribute-local-name att)
+                             prefix))
+             (not (xmltok-attribute-prefix att)))
+       (setq value (xmltok-attribute-value att))
+       (setq namespace (if value (nxml-make-namespace value) t))))
+    (if (and prefix (not namespace))
+       t
+      namespace)))
+
+(defun rng-match-transform-uri-rule (props)
+  (let ((from-pattern (cdr (assq 'fromPattern props)))
+       (to-pattern (cdr (assq 'toPattern props)))
+       (file-name (buffer-file-name)))
+    (and file-name
+        (setq file-name (expand-file-name file-name))
+        (rng-file-name-matches-uri-pattern-p file-name from-pattern)
+        (condition-case ()
+            (let ((new-file-name
+                   (replace-match
+                    (save-match-data
+                      (rng-uri-pattern-file-name-replace-match to-pattern))
+                    t
+                    nil
+                    file-name)))
+              (and (file-name-absolute-p new-file-name)
+                   (file-exists-p new-file-name)
+                   (rng-file-name-uri new-file-name)))
+            (rng-uri-error nil)))))
+
+(defun rng-match-uri-rule (props)
+  (let ((resource (cdr (assq 'resource props)))
+       (pattern (cdr (assq 'pattern props)))
+       (file-name (buffer-file-name)))
+    (and file-name
+        (setq file-name (expand-file-name file-name))
+        (cond (resource
+               (condition-case ()
+                   (eq (compare-strings (rng-uri-file-name resource)
+                                        0
+                                        nil
+                                        (expand-file-name file-name)
+                                        0
+                                        nil
+                                        nxml-file-name-ignore-case)
+                       t)
+                 (rng-uri-error nil)))
+              (pattern
+               (rng-file-name-matches-uri-pattern-p file-name
+                                                    pattern)))
+        (rng-match-default-rule props))))
+
+(defun rng-file-name-matches-uri-pattern-p (file-name pattern)
+  (condition-case ()
+      (and (let ((case-fold-search nxml-file-name-ignore-case))
+            (string-match (rng-uri-pattern-file-name-regexp pattern)
+                          file-name))
+          t)
+    (rng-uri-error nil)))
+
+(defun rng-match-default-rule (props)
+  (or (cdr (assq 'uri props))
+      (let ((type-id (cdr (assq 'typeId props))))
+       (and type-id
+            (cons (rng-collapse-space type-id) nil)))))
+
+(defun rng-possible-type-ids-using (file type-ids)
+  (let ((rules (rng-get-parsed-schema-locating-file file))
+       rule)
+    (while rules
+      (setq rule (car rules))
+      (setq rules (cdr rules))
+      (cond ((eq (car rule) 'typeId)
+            (let ((id (cdr (assq 'id (cdr rule)))))
+              (when id
+                (setq type-ids
+                      (cons (rng-collapse-space id)
+                            type-ids)))))
+           ((eq (car rule) 'include)
+            (let ((uri (cdr (assq 'rules (cdr rule)))))
+              (when uri
+                (setq type-ids
+                      (rng-possible-type-ids-using
+                       (rng-get-parsed-schema-locating-file
+                        (rng-uri-file-name uri))
+                       type-ids)))))))
+    type-ids))
+
+(defun rng-locate-schema-file-from-type-id (type-id file)
+  "Locate the schema for type id TYPE-ID using schema locating file FILE.
+Return either a URI, a list (TYPE-ID) where TYPE-ID is a string
+or nil."
+  (let ((rules (rng-get-parsed-schema-locating-file file))
+       schema rule)
+    (while (and rules (not schema))
+      (setq rule (car rules))
+      (setq rules (cdr rules))
+      (cond ((and (eq (car rule) 'typeId)
+                 (let ((id (assq 'id (cdr rule))))
+                   (and id
+                        (string= (rng-collapse-space (cdr id)) type-id))))
+            (setq schema (rng-match-default-rule (cdr rule))))
+           ((eq (car rule) 'include)
+            (let ((uri (cdr (assq 'rules (cdr rule)))))
+              (when uri
+                (setq schema
+                      (rng-locate-schema-file-from-type-id
+                       type-id
+                       (rng-uri-file-name uri))))))))
+    schema))
+
+(defvar rng-schema-locating-file-alist nil)
+
+(defun rng-get-parsed-schema-locating-file (file)
+  "Return a list of rules for the schema locating file FILE."
+  (setq file (expand-file-name file))
+  (let ((cached (assoc file rng-schema-locating-file-alist))
+       (mtime (nth 5 (file-attributes file)))
+       parsed)
+    (cond ((not mtime)
+          (when cached
+            (setq rng-schema-locating-file-alist
+                  (delq cached rng-schema-locating-file-alist)))
+          nil)
+         ((and cached (equal (nth 1 cached) mtime))
+          (nth 2 cached))
+         (t
+          (setq parsed (rng-parse-schema-locating-file file))
+          (if cached
+              (setcdr cached (list mtime parsed))
+            (setq rng-schema-locating-file-alist
+                  (cons (list file mtime parsed)
+                        rng-schema-locating-file-alist)))
+          parsed))))
+  
+(defconst rng-locate-namespace-uri
+  (nxml-make-namespace "http://thaiopensource.com/ns/locating-rules/1.0"))
+
+(defun rng-parse-schema-locating-file (file)
+  "Return list of rules.
+Each rule has the form (TYPE (ATTR . VAL) ...), where
+TYPE is a symbol for the element name, ATTR is a symbol for the attribute
+and VAL is a string for the value.
+Attribute values representing URIs are made absolute and xml:base
+attributes are removed."
+  (when (and (not rng-schema-locating-file-schema)
+            rng-schema-locating-file-schema-file)
+    (setq rng-schema-locating-file-schema
+         (rng-load-schema rng-schema-locating-file-schema-file)))
+  (let* ((element
+         (if rng-schema-locating-file-schema
+             (rng-parse-validate-file rng-schema-locating-file-schema
+                                      file)
+           (nxml-parse-file file)))
+        (children (cddr element))
+        (base-uri (rng-file-name-uri file))
+        child name rules atts att props prop-name prop-value)
+    (when (equal (car element)
+                (cons rng-locate-namespace-uri "locatingRules"))
+      (while children
+       (setq child (car children))
+       (setq children (cdr children))
+       (when (consp child)
+         (setq name (car child))
+         (when (eq (car name) rng-locate-namespace-uri)
+           (setq atts (cadr child))
+           (setq props nil)
+           (while atts
+             (setq att (car atts))
+             (when (stringp (car att))
+               (setq prop-name (intern (car att)))
+               (setq prop-value (cdr att))
+               (when (memq prop-name '(uri rules resource))
+                 (setq prop-value
+                       (rng-uri-resolve prop-value base-uri)))
+               (setq props (cons (cons prop-name prop-value)
+                                 props)))
+             (setq atts (cdr atts)))
+           (setq rules
+                 (cons (cons (intern (cdr name)) (nreverse props))
+                       rules))))))
+    (nreverse rules)))
+
+(defun rng-save-schema-location ()
+  "Save the association between the buffer's file and the current schema.
+This ensures that the schema that is currently being used will be used
+if the file is edited in a future session.  The association will be
+saved to the first writable file in `rng-schema-locating-files'."
+  (interactive)
+  (rng-save-schema-location-1 nil))
+
+(defun rng-save-schema-location-1 (prompt &optional type-id)
+  (unless (or rng-current-schema-file-name type-id)
+    (error "Buffer is using a vacuous schema"))
+  (let ((files rng-schema-locating-files)
+       (document-file-name (buffer-file-name))
+       (schema-file-name rng-current-schema-file-name)
+       file)
+    (while (and files (not file))
+      (if (file-writable-p (car files))
+         (setq file (expand-file-name (car files)))
+       (setq files (cdr files))))
+    (cond ((not file)
+          (if prompt
+              nil
+            (error "No writable schema locating file configured")))
+         ((not document-file-name)
+          (if prompt
+              nil
+            (error "Buffer does not have a filename")))
+         ((and prompt
+               (not (y-or-n-p (format "Save %s to %s "
+                                      (if type-id
+                                          "type identifier"
+                                        "schema location")
+                                      file)))))
+         (t
+          (save-excursion
+            (set-buffer (find-file-noselect file))
+            (let ((modified (buffer-modified-p)))
+              (if (> (buffer-size) 0)
+                  (let (xmltok-dtd)
+                    (goto-char (point-min))
+                    (xmltok-save
+                      (xmltok-forward-prolog)
+                      (xmltok-forward)
+                      (unless (eq xmltok-type 'start-tag)
+                        (error "Locating file `%s' invalid" file))))
+                (insert "<?xml version=\"1.0\"?>\n"
+                        "<locatingRules xmlns=\""
+                        (nxml-namespace-name rng-locate-namespace-uri)
+                        "\">")
+                (let ((pos (point)))
+                  (insert "\n</locatingRules>\n")
+                  (goto-char pos)))
+              (insert "\n")
+              (insert (let ((locating-file-uri (rng-file-name-uri file)))
+                        (format "<uri resource=\"%s\" %s=\"%s\"/>"
+                                (rng-escape-string
+                                 (rng-relative-uri
+                                  (rng-file-name-uri document-file-name)
+                                  locating-file-uri))
+                                (if type-id "typeId" "uri")
+                                (rng-escape-string
+                                 (or type-id
+                                     (rng-relative-uri
+                                      (rng-file-name-uri schema-file-name)
+                                      locating-file-uri))))))
+              (indent-according-to-mode)
+              (when (or (not modified)
+                        (y-or-n-p (format "Save file %s "
+                                          (buffer-file-name))))
+                (save-buffer))))))))
+
+(provide 'rng-loc)
+
+;;; rng-loc.el ends here
diff --git a/lisp/nxml/rng-maint.el b/lisp/nxml/rng-maint.el
new file mode 100644 (file)
index 0000000..ecf1ff1
--- /dev/null
@@ -0,0 +1,343 @@
+;;; rng-maint.el --- commands for RELAX NG maintainers
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-mode)
+(require 'texnfo-upd)
+
+(defvar rng-dir (file-name-directory load-file-name))
+
+(defconst rng-autoload-modules
+  '(xmltok
+    nxml-mode
+    nxml-uchnm
+    nxml-glyph
+    rng-cmpct
+    rng-maint
+    rng-valid
+    rng-xsd
+    rng-nxml))
+
+;;;###autoload
+(defun rng-update-autoloads ()
+  "Update the autoloads in rng-auto.el."
+  (interactive)
+  (let* ((generated-autoload-file (expand-file-name "rng-auto.el"
+                                                   rng-dir)))
+    (mapcar (lambda (x)
+             (update-file-autoloads
+              (expand-file-name (concat (symbol-name x) ".el") rng-dir)))
+           rng-autoload-modules)))
+
+
+(defconst rng-compile-modules
+  '(xmltok
+    nxml-util
+    nxml-enc
+    nxml-glyph
+    nxml-rap
+    nxml-outln
+    nxml-mode
+    nxml-uchnm
+    nxml-ns
+    nxml-parse
+    nxml-maint
+    xsd-regexp
+    rng-util
+    rng-dt
+    rng-xsd
+    rng-uri
+    rng-pttrn
+    rng-cmpct
+    rng-match
+    rng-parse
+    rng-loc
+    rng-valid
+    rng-nxml
+    rng-maint))
+
+;;;###autoload
+(defun rng-byte-compile-load ()
+  "Byte-compile and load all of the RELAX NG library in an appropriate order."
+  (interactive)
+  (mapcar (lambda (x)
+           (byte-compile-file (expand-file-name (concat (symbol-name x) ".el")
+                                                rng-dir)
+                              t))
+         rng-compile-modules))
+
+
+;;; Conversion from XML to texinfo.
+;; This is all a hack and is just enough to make the conversion work.
+;; It's not intended for public use.
+
+(defvar rng-manual-base "nxml-mode")
+(defvar rng-manual-xml (concat rng-manual-base ".xml"))
+(defvar rng-manual-texi (concat rng-manual-base ".texi"))
+(defvar rng-manual-info (concat rng-manual-base ".info"))
+
+;;;###autoload
+(defun rng-format-manual ()
+  "Create manual.texi from manual.xml."
+  (interactive)
+  (let ((xml-buf (find-file-noselect (expand-file-name rng-manual-xml
+                                                      rng-dir)))
+       (texi-buf (find-file-noselect (expand-file-name rng-manual-texi
+                                                       rng-dir))))
+    (save-excursion
+      (set-buffer texi-buf)
+      (erase-buffer)
+      (let ((standard-output texi-buf))
+       (princ (format "\\input texinfo @c -*- texinfo -*-\n\
+@c %%**start of header\n\
+@setfilename %s\n\
+@settitle \n\
+@c %%**end of header\n" rng-manual-info))
+       (set-buffer xml-buf)
+       (goto-char (point-min))
+       (xmltok-save
+         (xmltok-forward-prolog)
+         (rng-process-tokens))
+       (princ "\n@bye\n"))
+      (set-buffer texi-buf)
+      (rng-manual-fixup)
+      (texinfo-insert-node-lines (point-min) (point-max) t)
+      (texinfo-all-menus-update)
+      (save-buffer))))
+
+(defun rng-manual-fixup ()
+  (goto-char (point-min))
+  (search-forward "@top ")
+  (let ((pos (point)))
+    (search-forward "\n")
+    (let ((title (buffer-substring-no-properties pos (1- (point)))))
+      (goto-char (point-min))
+      (search-forward "@settitle ")
+      (insert title)
+      (search-forward "@node")
+      (goto-char (match-beginning 0))
+      (insert "@dircategory Emacs\n"
+             "@direntry\n* "
+             title
+             ": ("
+             rng-manual-info
+             ").\n@end direntry\n\n"))))
+
+(defvar rng-manual-inline-elements '(kbd key samp code var emph uref point))
+
+(defun rng-process-tokens ()
+  (let ((section-depth 0)
+       ;; stack of per-element space treatment
+       ;; t means keep, nil means discard, fill means no blank lines
+       (keep-space-stack (list nil))
+       (ignore-following-newline nil)
+       (want-blank-line nil)
+       name startp endp data keep-space-for-children)
+    (while (xmltok-forward)
+      (cond ((memq xmltok-type '(start-tag empty-element end-tag))
+            (setq startp (memq xmltok-type '(start-tag empty-element)))
+            (setq endp (memq xmltok-type '(end-tag empty-element)))
+            (setq name (intern (if startp
+                                   (xmltok-start-tag-qname)
+                                 (xmltok-end-tag-qname))))
+            (setq keep-space-for-children nil)
+            (setq ignore-following-newline nil)
+            (cond ((memq name rng-manual-inline-elements)
+                   (when startp
+                     (when want-blank-line
+                       (rng-manual-output-force-blank-line)
+                       (when (eq want-blank-line 'noindent)
+                         (princ "@noindent\n"))
+                       (setq want-blank-line nil))
+                     (setq keep-space-for-children t)
+                     (princ (format "@%s{" name)))
+                   (when endp (princ "}")))
+                  ((eq name 'ulist)
+                   (when startp
+                     (rng-manual-output-force-blank-line)
+                     (setq want-blank-line nil)
+                     (princ "@itemize @bullet\n"))
+                   (when endp
+                     (rng-manual-output-force-new-line)
+                     (setq want-blank-line 'noindent)
+                     (princ "@end itemize\n")))
+                  ((eq name 'item)
+                   (rng-manual-output-force-new-line)
+                   (setq want-blank-line endp)
+                   (when startp (princ "@item\n")))
+                  ((memq name '(example display))
+                   (when startp
+                     (setq ignore-following-newline t)
+                     (rng-manual-output-force-blank-line)
+                     (setq want-blank-line nil)
+                     (setq keep-space-for-children t)
+                     (princ (format "@%s\n" name)))
+                   (when endp
+                     (rng-manual-output-force-new-line)
+                     (setq want-blank-line 'noindent)
+                     (princ (format "@end %s\n" name))))
+                  ((eq name 'para)
+                   (rng-manual-output-force-new-line)
+                   (when startp
+                     (when want-blank-line
+                       (setq want-blank-line t))
+                     (setq keep-space-for-children 'fill))
+                   (when endp (setq want-blank-line t)))
+                  ((eq name 'section)
+                   (when startp
+                     (rng-manual-output-force-blank-line)
+                     (when (eq section-depth 0)
+                       (princ "@node Top\n"))
+                     (princ "@")
+                     (princ (nth section-depth '(top
+                                                 chapter
+                                                 section
+                                                 subsection
+                                                 subsubsection)))
+                     (princ " ")
+                     (setq want-blank-line nil)
+                     (setq section-depth (1+ section-depth)))
+                   (when endp
+                     (rng-manual-output-force-new-line)
+                     (setq want-blank-line nil)
+                     (setq section-depth (1- section-depth))))
+                  ((eq name 'title)
+                   (when startp
+                     (setq keep-space-for-children 'fill))
+                   (when endp
+                     (setq want-blank-line t)
+                     (princ "\n"))))
+            (when startp
+              (setq keep-space-stack (cons keep-space-for-children
+                                           keep-space-stack)))
+            (when endp
+              (setq keep-space-stack (cdr keep-space-stack))))
+           ((memq xmltok-type '(data
+                                space
+                                char-ref
+                                entity-ref
+                                cdata-section))
+            (setq data nil)
+            (cond ((memq xmltok-type '(data space))
+                   (setq data (buffer-substring-no-properties xmltok-start
+                                                              (point))))
+                  ((and (memq xmltok-type '(char-ref entity-ref))
+                        xmltok-replacement)
+                   (setq data xmltok-replacement))
+                  ((eq xmltok-type 'cdata-section)
+                   (setq data
+                         (buffer-substring-no-properties (+ xmltok-start 9)
+                                                         (- (point) 3)))))
+            (when (and data (car keep-space-stack))
+              (setq data (replace-regexp-in-string "[@{}]"
+                                                   "@\\&"
+                                                   data
+                                                   t))
+              (when ignore-following-newline
+                (setq data (replace-regexp-in-string "\\`\n" "" data t)))
+              (setq ignore-following-newline nil)
+;;            (when (eq (car keep-space-stack) 'fill)
+;;              (setq data (replace-regexp-in-string "\n" " " data t)))
+              (when (eq want-blank-line 'noindent)
+                (setq data (replace-regexp-in-string "\\`\n*" "" data t)))
+              (when (> (length data) 0)
+                (when want-blank-line
+                  (rng-manual-output-force-blank-line)
+                  (when (eq want-blank-line 'noindent)
+                    (princ "@noindent\n"))
+                  (setq want-blank-line nil))
+                (princ data))))
+            ))))
+
+(defun rng-manual-output-force-new-line ()
+  (save-excursion
+    (set-buffer standard-output)
+    (unless (eq (char-before) ?\n)
+      (insert ?\n))))
+
+(defun rng-manual-output-force-blank-line ()
+  (save-excursion
+    (set-buffer standard-output)
+    (if (eq (char-before) ?\n)
+       (unless (eq (char-before (1- (point))) ?\n)
+         (insert ?\n))
+      (insert "\n\n"))))
+
+;;; Versioning
+
+;;;###autoload
+(defun rng-write-version ()
+  (find-file "VERSION")
+  (erase-buffer)
+  (insert nxml-version "\n")
+  (save-buffer))
+
+;;; Timing
+
+(defun rng-time-to-float (time)
+  (+ (* (nth 0 time) 65536.0)
+     (nth 1 time)
+     (/ (nth 2 time) 1000000.0)))
+
+(defun rng-time-function (function &rest args)
+  (let* ((start (current-time))
+        (val (apply function args))
+        (end (current-time)))
+    (message "%s ran in %g seconds"
+            function
+            (- (rng-time-to-float end)
+               (rng-time-to-float start)))
+    val))
+
+(defun rng-time-tokenize-buffer ()
+  (interactive)
+  (rng-time-function 'rng-tokenize-buffer))
+
+(defun rng-tokenize-buffer ()
+  (save-excursion
+    (goto-char (point-min))
+    (xmltok-save
+      (xmltok-forward-prolog)
+      (while (xmltok-forward)))))
+
+(defun rng-time-validate-buffer ()
+  (interactive)
+  (rng-time-function 'rng-validate-buffer))
+
+(defun rng-validate-buffer ()
+  (save-restriction
+    (widen)
+    (nxml-with-unmodifying-text-property-changes
+      (rng-clear-cached-state (point-min) (point-max)))
+    ;; 1+ to clear empty overlays at (point-max)
+    (rng-clear-overlays (point-min) (1+ (point-max))))
+  (setq rng-validate-up-to-date-end 1)
+  (rng-clear-conditional-region)
+  (setq rng-error-count 0)
+  (while (rng-do-some-validation
+         (lambda () t))))
+
+;;; rng-maint.el ends here
diff --git a/lisp/nxml/rng-match.el b/lisp/nxml/rng-match.el
new file mode 100644 (file)
index 0000000..d369261
--- /dev/null
@@ -0,0 +1,1739 @@
+;;; rng-match.el --- matching of RELAX NG patterns against XML events
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This uses the algorithm described in
+;;   http://www.thaiopensource.com/relaxng/derivative.html
+;;
+;; The schema to be used is contained in the variable
+;; rng-current-schema.  It has the form described in the file
+;; rng-pttrn.el.
+;;
+;;; Code:
+
+(require 'rng-pttrn)
+(require 'rng-util)
+(require 'rng-dt)
+
+(defvar rng-not-allowed-ipattern nil)
+(defvar rng-empty-ipattern nil)
+(defvar rng-text-ipattern nil)
+
+(defvar rng-compile-table nil)
+
+(defvar rng-being-compiled nil
+  "Contains a list of ref patterns currently being compiled.
+Used to detect illegal recursive references.")
+
+(defvar rng-ipattern-table nil)
+
+(defvar rng-last-ipattern-index nil)
+
+(defvar rng-match-state nil
+  "An ipattern representing the current state of validation.")
+
+;;; Inline functions
+
+(defsubst rng-update-match-state (new-state)
+  (if (and (eq new-state rng-not-allowed-ipattern)
+          (not (eq rng-match-state rng-not-allowed-ipattern)))
+      nil
+    (setq rng-match-state new-state)
+    t))
+
+;;; Interned patterns
+
+(eval-when-compile
+  (defun rng-ipattern-slot-accessor-name (slot-name)
+    (intern (concat "rng-ipattern-get-"
+                   (symbol-name slot-name))))
+  
+  (defun rng-ipattern-slot-setter-name (slot-name)
+    (intern (concat "rng-ipattern-set-"
+                   (symbol-name slot-name)))))
+
+(defmacro rng-ipattern-defslot (slot-name index)
+  `(progn
+     (defsubst ,(rng-ipattern-slot-accessor-name slot-name) (ipattern)
+       (aref ipattern ,index))
+     (defsubst ,(rng-ipattern-slot-setter-name slot-name) (ipattern value)
+       (aset ipattern ,index value))))
+
+(rng-ipattern-defslot type 0)
+(rng-ipattern-defslot index 1)
+(rng-ipattern-defslot name-class 2)
+(rng-ipattern-defslot datatype 2)
+(rng-ipattern-defslot after 2)
+(rng-ipattern-defslot child 3)
+(rng-ipattern-defslot value-object 3)
+(rng-ipattern-defslot nullable 4)
+(rng-ipattern-defslot memo-text-typed 5)
+(rng-ipattern-defslot memo-map-start-tag-open-deriv 6)
+(rng-ipattern-defslot memo-map-start-attribute-deriv 7)
+(rng-ipattern-defslot memo-start-tag-close-deriv 8)
+(rng-ipattern-defslot memo-text-only-deriv 9)
+(rng-ipattern-defslot memo-mixed-text-deriv 10)
+(rng-ipattern-defslot memo-map-data-deriv 11)
+(rng-ipattern-defslot memo-end-tag-deriv 12)
+
+(defconst rng-memo-map-alist-max 10)
+
+(defsubst rng-memo-map-get (key mm)
+  "Return the value associated with KEY in memo-map MM."
+  (let ((found (assoc key mm)))
+    (if found
+       (cdr found)
+      (and mm
+          (let ((head (car mm)))
+            (and (hash-table-p head)
+                 (gethash key head)))))))
+
+(defun rng-memo-map-add (key value mm &optional weakness)
+  "Associate KEY with VALUE in memo-map MM and return the new memo-map.
+The new memo-map may or may not be a different object from MM.
+
+Alists are better for small maps. Hash tables are better for large
+maps.  A memo-map therefore starts off as an alist and switches to a
+hash table for large memo-maps. A memo-map is always a list.  An empty
+memo-map is represented by nil. A large memo-map is represented by a
+list containing just a hash-table.  A small memo map is represented by
+a list whose cdr is an alist and whose car is the number of entries in
+the alist. The complete memo-map can be passed to assoc without
+problems: assoc ignores any members that are not cons cells.  There is
+therefore minimal overhead in successful lookups on small lists
+\(which is the most common case)."
+  (if (null mm)
+      (list 1 (cons key value))
+    (let ((head (car mm)))
+      (cond ((hash-table-p head)
+            (puthash key value head)
+            mm)
+           ((>= head rng-memo-map-alist-max)
+            (let ((ht (make-hash-table :test 'equal
+                                       :weakness weakness
+                                       :size (* 2 rng-memo-map-alist-max))))
+              (setq mm (cdr mm))
+              (while mm
+                (setq head (car mm))
+                (puthash (car head) (cdr head) ht)
+                (setq mm (cdr mm)))
+              (cons ht nil)))
+           (t (cons (1+ head)
+                    (cons (cons key value)
+                          (cdr mm))))))))
+            
+(defsubst rng-make-ipattern (type index name-class child nullable)
+  (vector type index name-class child nullable
+         ;; 5 memo-text-typed
+         'unknown
+         ;; 6 memo-map-start-tag-open-deriv
+         nil
+         ;; 7 memo-map-start-attribute-deriv
+         nil
+         ;; 8 memo-start-tag-close-deriv
+         nil
+         ;; 9 memo-text-only-deriv
+         nil
+         ;; 10 memo-mixed-text-deriv
+         nil
+         ;; 11 memo-map-data-deriv
+         nil
+         ;; 12 memo-end-tag-deriv
+         nil))
+
+(defun rng-ipattern-maybe-init ()
+  (unless rng-ipattern-table
+    (setq rng-ipattern-table (make-hash-table :test 'equal))
+    (setq rng-last-ipattern-index -1)))
+
+(defun rng-ipattern-clear ()
+  (when rng-ipattern-table
+    (clrhash rng-ipattern-table))
+  (setq rng-last-ipattern-index -1))
+
+(defsubst rng-gen-ipattern-index ()
+  (setq rng-last-ipattern-index (1+ rng-last-ipattern-index)))
+
+(defun rng-put-ipattern (key type name-class child nullable)
+  (let ((ipattern
+        (rng-make-ipattern type
+                           (rng-gen-ipattern-index)
+                           name-class
+                           child
+                           nullable)))
+    (puthash key ipattern rng-ipattern-table)
+    ipattern))
+
+(defun rng-get-ipattern (key)
+  (gethash key rng-ipattern-table))
+
+(or rng-not-allowed-ipattern
+    (setq rng-not-allowed-ipattern
+         (rng-make-ipattern 'not-allowed -3 nil nil nil)))
+
+(or rng-empty-ipattern
+    (setq rng-empty-ipattern
+         (rng-make-ipattern 'empty -2 nil nil t)))
+
+(or rng-text-ipattern
+    (setq rng-text-ipattern
+         (rng-make-ipattern 'text -1 nil nil t)))
+
+(defconst rng-const-ipatterns
+  (list rng-not-allowed-ipattern
+       rng-empty-ipattern
+       rng-text-ipattern))
+
+(defun rng-intern-after (child after)
+  (if (eq child rng-not-allowed-ipattern)
+      rng-not-allowed-ipattern
+    (let ((key (list 'after
+                    (rng-ipattern-get-index child)
+                    (rng-ipattern-get-index after))))
+      (or (rng-get-ipattern key)
+         (rng-put-ipattern key
+                           'after
+                           after
+                           child
+                           nil)))))
+  
+(defun rng-intern-attribute (name-class ipattern)
+  (if (eq ipattern rng-not-allowed-ipattern)
+      rng-not-allowed-ipattern
+    (let ((key (list 'attribute
+                    name-class
+                    (rng-ipattern-get-index ipattern))))
+      (or (rng-get-ipattern key)
+         (rng-put-ipattern key
+                           'attribute
+                           name-class
+                           ipattern
+                           nil)))))
+
+(defun rng-intern-data (dt matches-anything)
+  (let ((key (list 'data dt)))
+    (or (rng-get-ipattern key)
+       (let ((ipattern (rng-put-ipattern key
+                                         'data
+                                         dt
+                                         nil
+                                         matches-anything)))
+         (rng-ipattern-set-memo-text-typed ipattern
+                                           (not matches-anything))
+         ipattern))))
+
+(defun rng-intern-data-except (dt ipattern)
+  (let ((key (list 'data-except dt ipattern)))
+    (or (rng-get-ipattern key)
+       (rng-put-ipattern key
+                         'data-except
+                         dt
+                         ipattern
+                         nil))))
+
+(defun rng-intern-value (dt obj)
+  (let ((key (list 'value dt obj)))
+    (or (rng-get-ipattern key)
+       (rng-put-ipattern key
+                         'value
+                         dt
+                         obj
+                         nil))))
+
+(defun rng-intern-one-or-more (ipattern)
+  (or (rng-intern-one-or-more-shortcut ipattern)
+      (let ((key (cons 'one-or-more
+                      (list (rng-ipattern-get-index ipattern)))))
+       (or (rng-get-ipattern key)
+           (rng-put-ipattern key
+                             'one-or-more
+                             nil
+                             ipattern
+                             (rng-ipattern-get-nullable ipattern))))))
+
+(defun rng-intern-one-or-more-shortcut (ipattern)
+  (cond ((eq ipattern rng-not-allowed-ipattern)
+        rng-not-allowed-ipattern)
+       ((eq ipattern rng-empty-ipattern)
+        rng-empty-ipattern)
+       ((eq (rng-ipattern-get-type ipattern) 'one-or-more)
+        ipattern)
+       (t nil)))
+
+(defun rng-intern-list (ipattern)
+  (if (eq ipattern rng-not-allowed-ipattern)
+      rng-not-allowed-ipattern
+    (let ((key (cons 'list
+                    (list (rng-ipattern-get-index ipattern)))))
+      (or (rng-get-ipattern key)
+         (rng-put-ipattern key
+                           'list
+                           nil
+                           ipattern
+                           nil)))))
+
+(defun rng-intern-group (ipatterns)
+  "Return a ipattern for the list of group members in IPATTERNS."
+  (or (rng-intern-group-shortcut ipatterns)
+      (let* ((tem (rng-normalize-group-list ipatterns))
+            (normalized (cdr tem)))
+       (or (rng-intern-group-shortcut normalized)
+           (let ((key (cons 'group
+                            (mapcar 'rng-ipattern-get-index normalized))))
+             (or (rng-get-ipattern key)
+                 (rng-put-ipattern key
+                                   'group
+                                   nil
+                                   normalized
+                                   (car tem))))))))
+
+(defun rng-intern-group-shortcut (ipatterns)
+  "Try to shortcut interning a group list.  If successful, return the
+interned pattern.  Otherwise return nil."
+  (while (and ipatterns
+             (eq (car ipatterns) rng-empty-ipattern))
+    (setq ipatterns (cdr ipatterns)))
+  (if ipatterns
+      (let ((ret (car ipatterns)))
+       (if (eq ret rng-not-allowed-ipattern)
+           rng-not-allowed-ipattern
+         (setq ipatterns (cdr ipatterns))
+         (while (and ipatterns ret)
+           (let ((tem (car ipatterns)))
+             (cond ((eq tem rng-not-allowed-ipattern)
+                    (setq ret tem)
+                    (setq ipatterns nil))
+                   ((eq tem rng-empty-ipattern)
+                    (setq ipatterns (cdr ipatterns)))
+                   (t
+                    ;; Stop here rather than continuing
+                    ;; looking for not-allowed patterns.
+                    ;; We do a complete scan elsewhere.
+                    (setq ret nil)))))
+         ret))
+    rng-empty-ipattern))
+
+(defun rng-normalize-group-list (ipatterns)
+  "Normalize a list containing members of a group.
+Expands nested groups, removes empty members, handles notAllowed.
+Returns a pair whose car says whether the list is nullable and whose
+cdr is the normalized list."
+  (let ((nullable t)
+       (result nil)
+       member)
+    (while ipatterns
+      (setq member (car ipatterns))
+      (setq ipatterns (cdr ipatterns))
+      (when nullable
+       (setq nullable (rng-ipattern-get-nullable member)))
+      (cond ((eq (rng-ipattern-get-type member) 'group)
+            (setq result
+                  (nconc (reverse (rng-ipattern-get-child member))
+                         result)))
+           ((eq member rng-not-allowed-ipattern)
+            (setq result (list rng-not-allowed-ipattern))
+            (setq ipatterns nil))
+           ((not (eq member rng-empty-ipattern))
+            (setq result (cons member result)))))
+    (cons nullable (nreverse result))))
+
+(defun rng-intern-interleave (ipatterns)
+  (or (rng-intern-group-shortcut ipatterns)
+      (let* ((tem (rng-normalize-interleave-list ipatterns))
+            (normalized (cdr tem)))
+       (or (rng-intern-group-shortcut normalized)
+           (let ((key (cons 'interleave
+                            (mapcar 'rng-ipattern-get-index normalized))))
+             (or (rng-get-ipattern key)
+                 (rng-put-ipattern key
+                                   'interleave
+                                   nil
+                                   normalized
+                                   (car tem))))))))
+
+(defun rng-normalize-interleave-list (ipatterns)
+  "Normalize a list containing members of an interleave.
+Expands nested groups, removes empty members, handles notAllowed.
+Returns a pair whose car says whether the list is nullable and whose
+cdr is the normalized list."
+  (let ((nullable t)
+       (result nil)
+       member)
+    (while ipatterns
+      (setq member (car ipatterns))
+      (setq ipatterns (cdr ipatterns))
+      (when nullable
+       (setq nullable (rng-ipattern-get-nullable member)))
+      (cond ((eq (rng-ipattern-get-type member) 'interleave)
+            (setq result
+                  (append (rng-ipattern-get-child member)
+                           result)))
+           ((eq member rng-not-allowed-ipattern)
+            (setq result (list rng-not-allowed-ipattern))
+            (setq ipatterns nil))
+           ((not (eq member rng-empty-ipattern))
+            (setq result (cons member result)))))
+    (cons nullable (sort result 'rng-compare-ipattern))))
+
+;; Would be cleaner if this didn't modify IPATTERNS.
+
+(defun rng-intern-choice (ipatterns)
+  "Return a choice ipattern for the list of choices in IPATTERNS.
+May alter IPATTERNS."
+  (or (rng-intern-choice-shortcut ipatterns)
+      (let* ((tem (rng-normalize-choice-list ipatterns))
+            (normalized (cdr tem)))
+       (or (rng-intern-choice-shortcut normalized)
+           (rng-intern-choice1 normalized (car tem))))))
+
+(defun rng-intern-optional (ipattern)
+  (cond ((rng-ipattern-get-nullable ipattern) ipattern)
+       ((eq ipattern rng-not-allowed-ipattern) rng-empty-ipattern)
+       (t (rng-intern-choice1
+           ;; This is sorted since the empty pattern
+           ;; is before everything except not allowed.
+           ;; It cannot have a duplicate empty pattern,
+           ;; since it is not nullable.
+           (cons rng-empty-ipattern
+                 (if (eq (rng-ipattern-get-type ipattern) 'choice)
+                     (rng-ipattern-get-child ipattern)
+                   (list ipattern)))
+           t))))
+
+
+(defun rng-intern-choice1 (normalized nullable)
+  (let ((key (cons 'choice
+                  (mapcar 'rng-ipattern-get-index normalized))))
+    (or (rng-get-ipattern key)
+       (rng-put-ipattern key
+                         'choice
+                         nil
+                         normalized
+                         nullable))))
+                                           
+(defun rng-intern-choice-shortcut (ipatterns)
+  "Try to shortcut interning a choice list.  If successful, return the
+interned pattern.  Otherwise return nil."
+  (while (and ipatterns
+             (eq (car ipatterns)
+                 rng-not-allowed-ipattern))
+    (setq ipatterns (cdr ipatterns)))
+  (if ipatterns
+      (let ((ret (car ipatterns)))
+       (setq ipatterns (cdr ipatterns))
+       (while (and ipatterns ret)
+         (or (eq (car ipatterns) rng-not-allowed-ipattern)
+             (eq (car ipatterns) ret)
+             (setq ret nil))
+         (setq ipatterns (cdr ipatterns)))
+       ret)
+    rng-not-allowed-ipattern))
+
+(defun rng-normalize-choice-list (ipatterns)
+  "Normalize a list of choices, expanding nested choices, removing
+not-allowed members, sorting by index and removing duplicates.  Return
+a pair whose car says whether the list is nullable and whose cdr is
+the normalized list."
+  (let ((sorted t)
+       (nullable nil)
+       (head (cons nil ipatterns)))
+    (let ((tail head)
+         (final-tail nil)
+         (prev-index -100)
+         (cur ipatterns)
+         member)
+      ;; the cdr of tail is always cur
+      (while cur
+       (setq member (car cur))
+       (or nullable
+           (setq nullable (rng-ipattern-get-nullable member)))
+       (cond ((eq (rng-ipattern-get-type member) 'choice)
+              (setq final-tail
+                    (append (rng-ipattern-get-child member)
+                            final-tail))
+              (setq cur (cdr cur))
+              (setq sorted nil)
+              (setcdr tail cur))
+             ((eq member rng-not-allowed-ipattern)
+              (setq cur (cdr cur))
+              (setcdr tail cur))
+             (t
+              (if (and sorted
+                       (let ((cur-index (rng-ipattern-get-index member)))
+                         (if (>= prev-index cur-index)
+                             (or (= prev-index cur-index) ; will remove it
+                                 (setq sorted nil)) ; won't remove it
+                           (setq prev-index cur-index)
+                           ;; won't remove it
+                           nil)))
+                  (progn
+                    ;; remove it
+                    (setq cur (cdr cur))
+                    (setcdr tail cur))
+                ;; don't remove it
+                (setq tail cur)
+                (setq cur (cdr cur))))))
+      (setcdr tail final-tail))
+    (setq head (cdr head))
+    (cons nullable
+         (if sorted
+             head
+           (rng-uniquify-eq (sort head 'rng-compare-ipattern))))))
+
+(defun rng-compare-ipattern (p1 p2)
+  (< (rng-ipattern-get-index p1)
+     (rng-ipattern-get-index p2)))
+
+;;; Name classes
+
+(defsubst rng-name-class-contains (nc nm)
+  (if (consp nc)
+      (equal nm nc)
+    (rng-name-class-contains1 nc nm)))
+
+(defun rng-name-class-contains1 (nc nm)
+  (let ((type (aref nc 0)))
+    (cond ((eq type 'any-name) t)
+         ((eq type 'any-name-except)
+          (not (rng-name-class-contains (aref nc 1) nm)))
+         ((eq type 'ns-name)
+          (eq (car nm) (aref nc 1)))
+         ((eq type 'ns-name-except)
+          (and (eq (car nm) (aref nc 1))
+               (not (rng-name-class-contains (aref nc 2) nm))))
+         ((eq type 'choice)
+          (let ((choices (aref nc 1))
+                (ret nil))
+            (while choices
+              (if (rng-name-class-contains (car choices) nm)
+                  (progn
+                    (setq choices nil)
+                    (setq ret t))
+                (setq choices (cdr choices))))
+            ret)))))
+
+(defun rng-name-class-possible-names (nc accum)
+  "Return a list of possible names that nameclass NC can match.
+
+Each possible name should be returned as a (NAMESPACE . LOCAL-NAME)
+pair, where NAMESPACE is a symbol or nil and LOCAL-NAME is a string.
+nil for NAMESPACE matches the absent namespace.  ACCUM is a list of
+names which should be appended to the returned list. The returned list
+may contain duplicates."
+  (if (consp nc)
+      (cons nc accum)
+    (when (eq (aref nc 0) 'choice)
+      (let ((members (aref nc 1)) member)
+       (while members
+         (setq member (car members))
+         (setq accum
+               (if (consp member)
+                   (cons member accum)
+                 (rng-name-class-possible-names member
+                                                accum)))
+         (setq members (cdr members)))))
+    accum))
+
+;;; Debugging utilities
+
+(defun rng-ipattern-to-string (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (concat (rng-ipattern-to-string
+                   (rng-ipattern-get-child ipattern))
+                  " </> "
+                  (rng-ipattern-to-string
+                   (rng-ipattern-get-after ipattern))))
+         ((eq type 'element)
+          (concat "element "
+                  (rng-name-class-to-string
+                   (rng-ipattern-get-name-class ipattern))
+                  ;; we can get cycles with elements so don't print it out
+                  " {...}"))
+         ((eq type 'attribute)
+          (concat "attribute "
+                  (rng-name-class-to-string
+                   (rng-ipattern-get-name-class ipattern))
+                  " { "
+                  (rng-ipattern-to-string
+                   (rng-ipattern-get-child ipattern))
+                  " } "))
+         ((eq type 'empty) "empty")
+         ((eq type 'text) "text")
+         ((eq type 'not-allowed) "notAllowed")
+         ((eq type 'one-or-more)
+          (concat (rng-ipattern-to-string
+                   (rng-ipattern-get-child ipattern))
+                  "+"))
+         ((eq type 'choice)
+          (concat "("
+                  (mapconcat 'rng-ipattern-to-string
+                             (rng-ipattern-get-child ipattern)
+                             " | ")
+                  ")"))
+         ((eq type 'group)
+          (concat "("
+                  (mapconcat 'rng-ipattern-to-string
+                             (rng-ipattern-get-child ipattern)
+                             ", ")
+                  ")"))
+         ((eq type 'interleave)
+          (concat "("
+                  (mapconcat 'rng-ipattern-to-string
+                             (rng-ipattern-get-child ipattern)
+                             " & ")
+                  ")"))
+         (t (symbol-name type)))))
+
+(defun rng-name-class-to-string (nc)
+  (if (consp nc)
+      (cdr nc)
+    (let ((type (aref nc 0)))
+      (cond ((eq type 'choice)
+            (mapconcat 'rng-name-class-to-string
+                       (aref nc 1)
+                       "|"))
+           (t (concat (symbol-name type) "*"))))))
+
+
+;;; Compiling
+
+(defun rng-compile-maybe-init ()
+  (unless rng-compile-table
+    (setq rng-compile-table (make-hash-table :test 'eq))))
+
+(defun rng-compile-clear ()
+  (when rng-compile-table
+    (clrhash rng-compile-table)))
+
+(defun rng-compile (pattern)
+  (or (gethash pattern rng-compile-table)
+      (let ((ipattern (apply (get (car pattern) 'rng-compile)
+                            (cdr pattern))))
+       (puthash pattern ipattern rng-compile-table)
+       ipattern)))
+
+(put 'empty 'rng-compile 'rng-compile-empty)
+(put 'text 'rng-compile 'rng-compile-text)
+(put 'not-allowed 'rng-compile 'rng-compile-not-allowed)
+(put 'element 'rng-compile 'rng-compile-element)
+(put 'attribute 'rng-compile 'rng-compile-attribute)
+(put 'choice 'rng-compile 'rng-compile-choice)
+(put 'optional 'rng-compile 'rng-compile-optional)
+(put 'group 'rng-compile 'rng-compile-group)
+(put 'interleave 'rng-compile 'rng-compile-interleave)
+(put 'ref 'rng-compile 'rng-compile-ref)
+(put 'one-or-more 'rng-compile 'rng-compile-one-or-more)
+(put 'zero-or-more 'rng-compile 'rng-compile-zero-or-more)
+(put 'mixed 'rng-compile 'rng-compile-mixed)
+(put 'data 'rng-compile 'rng-compile-data)
+(put 'data-except 'rng-compile 'rng-compile-data-except)
+(put 'value 'rng-compile 'rng-compile-value)
+(put 'list 'rng-compile 'rng-compile-list)
+
+(defun rng-compile-not-allowed () rng-not-allowed-ipattern)
+(defun rng-compile-empty () rng-empty-ipattern)
+(defun rng-compile-text () rng-text-ipattern)
+
+(defun rng-compile-element (name-class pattern)
+  ;; don't intern
+  (rng-make-ipattern 'element
+                    (rng-gen-ipattern-index)
+                    (rng-compile-name-class name-class)
+                    pattern            ; compile lazily
+                    nil))
+
+(defun rng-element-get-child (element)
+  (let ((tem (rng-ipattern-get-child element)))
+    (if (vectorp tem)
+       tem
+      (rng-ipattern-set-child element (rng-compile tem)))))
+
+(defun rng-compile-attribute (name-class pattern)
+  (rng-intern-attribute (rng-compile-name-class name-class)
+                       (rng-compile pattern)))
+
+(defun rng-compile-ref (pattern name)
+  (and (memq pattern rng-being-compiled)
+       (rng-compile-error "Reference loop on symbol %s" name))
+  (setq rng-being-compiled
+       (cons pattern rng-being-compiled))
+  (unwind-protect
+      (rng-compile pattern)
+    (setq rng-being-compiled
+         (cdr rng-being-compiled))))
+          
+(defun rng-compile-one-or-more (pattern)
+  (rng-intern-one-or-more (rng-compile pattern)))
+
+(defun rng-compile-zero-or-more (pattern)
+  (rng-intern-optional
+   (rng-intern-one-or-more (rng-compile pattern))))
+
+(defun rng-compile-optional (pattern)
+  (rng-intern-optional (rng-compile pattern)))
+
+(defun rng-compile-mixed (pattern)
+  (rng-intern-interleave (cons rng-text-ipattern
+                              (list (rng-compile pattern)))))
+
+(defun rng-compile-list (pattern)
+  (rng-intern-list (rng-compile pattern)))
+
+(defun rng-compile-choice (&rest patterns)
+  (rng-intern-choice (mapcar 'rng-compile patterns)))
+
+(defun rng-compile-group (&rest patterns)
+  (rng-intern-group (mapcar 'rng-compile patterns)))
+
+(defun rng-compile-interleave (&rest patterns)
+  (rng-intern-interleave (mapcar 'rng-compile patterns)))
+
+(defun rng-compile-dt (name params)
+  (let ((rng-dt-error-reporter 'rng-compile-error))
+    (funcall (let ((uri (car name)))
+              (or (get uri 'rng-dt-compile)
+                  (rng-compile-error "Unknown datatype library %s" uri)))
+            (cdr name)
+            params)))
+
+(defun rng-compile-data (name params)
+  (let ((dt (rng-compile-dt name params)))
+    (rng-intern-data (cdr dt) (car dt))))
+
+(defun rng-compile-data-except (name params pattern)
+  (rng-intern-data-except (cdr (rng-compile-dt name params))
+                         (rng-compile pattern)))
+
+(defun rng-compile-value (name str context)
+  (let* ((dt (cdr (rng-compile-dt name '())))
+        (rng-dt-namespace-context-getter (list 'identity context))
+        (obj (rng-dt-make-value dt str)))
+    (if obj
+       (rng-intern-value dt obj)
+      (rng-compile-error "Value %s is not a valid instance of the datatype %s"
+                        str
+                        name))))
+      
+(defun rng-compile-name-class (nc)
+  (let ((type (car nc)))
+    (cond ((eq type 'name) (nth 1 nc))
+         ((eq type 'any-name) [any-name])
+         ((eq type 'any-name-except)
+          (vector 'any-name-except
+                  (rng-compile-name-class (nth 1 nc))))
+         ((eq type 'ns-name)
+          (vector 'ns-name (nth 1 nc)))
+         ((eq type 'ns-name-except)
+          (vector 'ns-name-except
+                  (nth 1 nc)
+                  (rng-compile-name-class (nth 2 nc))))
+         ((eq type 'choice)
+          (vector 'choice
+                  (mapcar 'rng-compile-name-class (cdr nc))))
+         (t (error "Bad name-class type %s" type)))))
+
+;;; Searching patterns
+
+;; We write this non-recursively to avoid hitting max-lisp-eval-depth
+;; on large schemas.
+
+(defun rng-map-element-attribute (function pattern accum &rest args)
+  (let ((searched (make-hash-table :test 'eq))
+       type todo patterns)
+    (while (progn
+            (setq type (car pattern))
+            (cond ((memq type '(element attribute))
+                   (setq accum
+                         (apply function
+                                (cons pattern
+                                      (cons accum args))))
+                   (setq pattern (nth 2 pattern)))
+                  ((eq type 'ref)
+                   (setq pattern (nth 1 pattern))
+                   (if (gethash pattern searched)
+                       (setq pattern nil)
+                     (puthash pattern t searched)))
+                  ((memq type '(choice group interleave))
+                   (setq todo (cons (cdr pattern) todo))
+                   (setq pattern nil))
+                  ((memq type '(one-or-more
+                                zero-or-more
+                                optional
+                                mixed))
+                   (setq pattern (nth 1 pattern)))
+                  (t (setq pattern nil)))
+            (cond (pattern)
+                  (patterns
+                   (setq pattern (car patterns))
+                   (setq patterns (cdr patterns))
+                   t)
+                  (todo
+                   (setq patterns (car todo))
+                   (setq todo (cdr todo))
+                   (setq pattern (car patterns))
+                   (setq patterns (cdr patterns))
+                   t))))
+    accum))
+
+(defun rng-find-element-content-pattern (pattern accum name)
+  (if (and (eq (car pattern) 'element)
+          (rng-search-name name (nth 1 pattern)))
+      (cons (rng-compile (nth 2 pattern)) accum)
+    accum))
+
+(defun rng-search-name (name nc)
+  (let ((type (car nc)))
+    (cond ((eq type 'name)
+          (equal (cadr nc) name))
+         ((eq type 'choice)
+          (let ((choices (cdr nc))
+                (found nil))
+            (while (and choices (not found))
+              (if (rng-search-name name (car choices))
+                  (setq found t)
+                (setq choices (cdr choices))))
+            found))
+         (t nil))))
+
+(defun rng-find-name-class-uris (nc accum)
+  (let ((type (car nc)))
+    (cond ((eq type 'name)
+          (rng-accum-namespace-uri (car (nth 1 nc)) accum))
+         ((memq type '(ns-name ns-name-except))
+          (rng-accum-namespace-uri (nth 1 nc) accum))
+         ((eq type 'choice)
+          (let ((choices (cdr nc)))
+            (while choices
+              (setq accum
+                    (rng-find-name-class-uris (car choices) accum))
+              (setq choices (cdr choices))))
+          accum)
+         (t accum))))
+
+(defun rng-accum-namespace-uri (ns accum)
+  (if (and ns (not (memq ns accum)))
+      (cons ns accum)
+    accum))
+
+;;; Derivatives
+
+(defun rng-ipattern-text-typed-p (ipattern)
+  (let ((memo (rng-ipattern-get-memo-text-typed ipattern)))
+    (if (eq memo 'unknown)
+       (rng-ipattern-set-memo-text-typed
+        ipattern
+        (rng-ipattern-compute-text-typed-p ipattern))
+      memo)))
+
+(defun rng-ipattern-compute-text-typed-p (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (let ((cur (rng-ipattern-get-child ipattern))
+                (ret nil))
+            (while (and cur (not ret))
+              (if (rng-ipattern-text-typed-p (car cur))
+                  (setq ret t)
+                (setq cur (cdr cur))))
+            ret))
+         ((eq type 'group)
+          (let ((cur (rng-ipattern-get-child ipattern))
+                (ret nil)
+                member)
+            (while (and cur (not ret))
+              (setq member (car cur))
+              (if (rng-ipattern-text-typed-p member)
+                  (setq ret t))
+              (setq cur
+                    (and (rng-ipattern-get-nullable member)
+                         (cdr cur))))
+            ret))
+         ((eq type 'after)
+          (rng-ipattern-text-typed-p (rng-ipattern-get-child ipattern)))
+         (t (and (memq type '(value list data data-except)) t)))))
+                                                  
+(defun rng-start-tag-open-deriv (ipattern nm)
+  (or (rng-memo-map-get
+       nm
+       (rng-ipattern-get-memo-map-start-tag-open-deriv ipattern))
+      (rng-ipattern-memo-start-tag-open-deriv
+       ipattern
+       nm 
+       (rng-compute-start-tag-open-deriv ipattern nm))))
+                                                            
+(defun rng-ipattern-memo-start-tag-open-deriv (ipattern nm deriv)
+  (or (memq ipattern rng-const-ipatterns)
+      (rng-ipattern-set-memo-map-start-tag-open-deriv
+       ipattern
+       (rng-memo-map-add nm
+                        deriv
+                        (rng-ipattern-get-memo-map-start-tag-open-deriv
+                         ipattern))))
+  deriv)
+
+(defun rng-compute-start-tag-open-deriv (ipattern nm)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-transform-choice `(lambda (p)
+                                   (rng-start-tag-open-deriv p ',nm))
+                                ipattern))
+         ((eq type 'element)
+          (if (rng-name-class-contains
+               (rng-ipattern-get-name-class ipattern)
+               nm)
+              (rng-intern-after (rng-element-get-child ipattern)
+                                rng-empty-ipattern)
+            rng-not-allowed-ipattern))
+         ((eq type 'group)
+          (rng-transform-group-nullable
+           `(lambda (p) (rng-start-tag-open-deriv p ',nm))
+           'rng-cons-group-after 
+           ipattern))
+         ((eq type 'interleave)
+          (rng-transform-interleave-single
+           `(lambda (p) (rng-start-tag-open-deriv p ',nm))
+           'rng-subst-interleave-after
+           ipattern))
+         ((eq type 'one-or-more)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-group (list p ,(rng-intern-optional ipattern))))
+           (rng-start-tag-open-deriv (rng-ipattern-get-child ipattern)
+                                     nm)))
+         ((eq type 'after)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-after p
+                                ,(rng-ipattern-get-after ipattern)))
+           (rng-start-tag-open-deriv (rng-ipattern-get-child ipattern)
+                                     nm)))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-start-attribute-deriv (ipattern nm)
+  (or (rng-memo-map-get
+       nm
+       (rng-ipattern-get-memo-map-start-attribute-deriv ipattern))
+      (rng-ipattern-memo-start-attribute-deriv
+       ipattern
+       nm 
+       (rng-compute-start-attribute-deriv ipattern nm))))
+                                                            
+(defun rng-ipattern-memo-start-attribute-deriv (ipattern nm deriv)
+  (or (memq ipattern rng-const-ipatterns)
+      (rng-ipattern-set-memo-map-start-attribute-deriv
+       ipattern
+       (rng-memo-map-add
+       nm
+       deriv
+       (rng-ipattern-get-memo-map-start-attribute-deriv ipattern))))
+  deriv)
+
+(defun rng-compute-start-attribute-deriv (ipattern nm)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-transform-choice `(lambda (p)
+                                   (rng-start-attribute-deriv p ',nm))
+                                ipattern))
+         ((eq type 'attribute)
+          (if (rng-name-class-contains
+               (rng-ipattern-get-name-class ipattern)
+               nm)
+              (rng-intern-after (rng-ipattern-get-child ipattern)
+                                rng-empty-ipattern)
+            rng-not-allowed-ipattern))
+         ((eq type 'group)
+          (rng-transform-interleave-single
+           `(lambda (p) (rng-start-attribute-deriv p ',nm))
+           'rng-subst-group-after 
+           ipattern))
+         ((eq type 'interleave)
+          (rng-transform-interleave-single
+           `(lambda (p) (rng-start-attribute-deriv p ',nm))
+           'rng-subst-interleave-after
+           ipattern))
+         ((eq type 'one-or-more)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-group (list p ,(rng-intern-optional ipattern))))
+           (rng-start-attribute-deriv (rng-ipattern-get-child ipattern)
+                                      nm)))
+         ((eq type 'after)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-after p ,(rng-ipattern-get-after ipattern)))
+           (rng-start-attribute-deriv (rng-ipattern-get-child ipattern)
+                                      nm)))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-cons-group-after (x y)
+  (rng-apply-after `(lambda (p) (rng-intern-group (cons p ',y)))
+                  x))
+
+(defun rng-subst-group-after (new old list)
+  (rng-apply-after `(lambda (p)
+                     (rng-intern-group (rng-substq p ,old ',list)))
+                  new))
+
+(defun rng-subst-interleave-after (new old list)
+  (rng-apply-after `(lambda (p)
+                     (rng-intern-interleave (rng-substq p ,old ',list)))
+                  new))
+
+(defun rng-apply-after (f ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-intern-after
+           (rng-ipattern-get-child ipattern)
+           (funcall f
+                    (rng-ipattern-get-after ipattern))))
+         ((eq type 'choice)
+          (rng-transform-choice `(lambda (x) (rng-apply-after ,f x))
+                                ipattern))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-start-tag-close-deriv (ipattern)
+  (or (rng-ipattern-get-memo-start-tag-close-deriv ipattern)
+      (rng-ipattern-set-memo-start-tag-close-deriv
+       ipattern
+       (rng-compute-start-tag-close-deriv ipattern))))
+
+(defconst rng-transform-map
+  '((choice . rng-transform-choice)
+    (group . rng-transform-group)
+    (interleave . rng-transform-interleave)
+    (one-or-more . rng-transform-one-or-more)
+    (after . rng-transform-after-child)))
+
+(defun rng-compute-start-tag-close-deriv (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern)))
+    (if (eq type 'attribute)
+       rng-not-allowed-ipattern
+      (let ((transform (assq type rng-transform-map)))
+       (if transform
+           (funcall (cdr transform)
+                    'rng-start-tag-close-deriv
+                    ipattern)
+         ipattern)))))
+
+(defun rng-ignore-attributes-deriv (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern)))
+    (if (eq type 'attribute)
+       rng-empty-ipattern
+      (let ((transform (assq type rng-transform-map)))
+       (if transform
+           (funcall (cdr transform)
+                    'rng-ignore-attributes-deriv
+                    ipattern)
+         ipattern)))))
+  
+(defun rng-text-only-deriv (ipattern)
+  (or (rng-ipattern-get-memo-text-only-deriv ipattern)
+      (rng-ipattern-set-memo-text-only-deriv
+       ipattern
+       (rng-compute-text-only-deriv ipattern))))
+
+(defun rng-compute-text-only-deriv (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern)))
+    (if (eq type 'element)
+       rng-not-allowed-ipattern
+      (let ((transform (assq type
+                            '((choice . rng-transform-choice)
+                              (group . rng-transform-group)
+                              (interleave . rng-transform-interleave)
+                              (one-or-more . rng-transform-one-or-more)
+                              (after . rng-transform-after-child)))))
+       (if transform
+           (funcall (cdr transform)
+                    'rng-text-only-deriv
+                    ipattern)
+         ipattern)))))
+
+(defun rng-mixed-text-deriv (ipattern)
+  (or (rng-ipattern-get-memo-mixed-text-deriv ipattern)
+      (rng-ipattern-set-memo-mixed-text-deriv
+       ipattern
+       (rng-compute-mixed-text-deriv ipattern))))
+
+(defun rng-compute-mixed-text-deriv (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'text) ipattern)
+         ((eq type 'after)
+          (rng-transform-after-child 'rng-mixed-text-deriv
+                                     ipattern))
+         ((eq type 'choice)
+          (rng-transform-choice 'rng-mixed-text-deriv
+                                ipattern))
+         ((eq type 'one-or-more)
+          (rng-intern-group
+           (list (rng-mixed-text-deriv
+                  (rng-ipattern-get-child ipattern))
+                 (rng-intern-optional ipattern))))
+         ((eq type 'group)
+          (rng-transform-group-nullable
+           'rng-mixed-text-deriv
+           (lambda (x y) (rng-intern-group (cons x y)))
+           ipattern))
+         ((eq type 'interleave)
+          (rng-transform-interleave-single
+           'rng-mixed-text-deriv
+           (lambda (new old list) (rng-intern-interleave
+                                   (rng-substq new old list)))
+           ipattern))
+         ((and (eq type 'data)
+               (not (rng-ipattern-get-memo-text-typed ipattern)))
+          ipattern)
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-end-tag-deriv (ipattern)
+  (or (rng-ipattern-get-memo-end-tag-deriv ipattern)
+      (rng-ipattern-set-memo-end-tag-deriv
+       ipattern
+       (rng-compute-end-tag-deriv ipattern))))
+
+(defun rng-compute-end-tag-deriv (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-intern-choice
+           (mapcar 'rng-end-tag-deriv
+                   (rng-ipattern-get-child ipattern))))
+         ((eq type 'after)
+          (if (rng-ipattern-get-nullable
+               (rng-ipattern-get-child ipattern))
+              (rng-ipattern-get-after ipattern)
+            rng-not-allowed-ipattern))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-data-deriv (ipattern value)
+  (or (rng-memo-map-get value
+                       (rng-ipattern-get-memo-map-data-deriv ipattern))
+      (and (rng-memo-map-get
+           (cons value (rng-namespace-context-get-no-trace))
+           (rng-ipattern-get-memo-map-data-deriv ipattern))
+          (rng-memo-map-get
+           (cons value (apply (car rng-dt-namespace-context-getter)
+                              (cdr rng-dt-namespace-context-getter)))
+           (rng-ipattern-get-memo-map-data-deriv ipattern)))
+      (let* ((used-context (vector nil))
+            (rng-dt-namespace-context-getter
+             (cons 'rng-namespace-context-tracer
+                   (cons used-context
+                         rng-dt-namespace-context-getter)))
+            (deriv (rng-compute-data-deriv ipattern value)))
+       (rng-ipattern-memo-data-deriv ipattern
+                                     value
+                                     (aref used-context 0)
+                                     deriv))))
+
+(defun rng-namespace-context-tracer (used getter &rest args)
+  (let ((context (apply getter args)))
+    (aset used 0 context)
+    context))
+
+(defun rng-namespace-context-get-no-trace ()
+  (let ((tem rng-dt-namespace-context-getter))
+    (while (and tem (eq (car tem) 'rng-namespace-context-tracer))
+      (setq tem (cddr tem)))
+    (apply (car tem) (cdr tem))))
+
+(defconst rng-memo-data-deriv-max-length 80
+  "Don't memoize data-derivs for values longer than this.")
+
+(defun rng-ipattern-memo-data-deriv (ipattern value context deriv)
+  (or (memq ipattern rng-const-ipatterns)
+      (> (length value) rng-memo-data-deriv-max-length)
+      (rng-ipattern-set-memo-map-data-deriv
+       ipattern
+       (rng-memo-map-add (if context (cons value context) value)
+                        deriv
+                        (rng-ipattern-get-memo-map-data-deriv ipattern)
+                        t)))
+  deriv)
+
+(defun rng-compute-data-deriv (ipattern value)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'text) ipattern)
+         ((eq type 'choice)
+          (rng-transform-choice `(lambda (p) (rng-data-deriv p ,value))
+                                ipattern))
+         ((eq type 'group)
+          (rng-transform-group-nullable
+           `(lambda (p) (rng-data-deriv p ,value))
+           (lambda (x y) (rng-intern-group (cons x y)))
+           ipattern))
+         ((eq type 'one-or-more)
+          (rng-intern-group (list (rng-data-deriv
+                                   (rng-ipattern-get-child ipattern)
+                                   value)
+                                  (rng-intern-optional ipattern))))
+         ((eq type 'after)
+          (let ((child (rng-ipattern-get-child ipattern)))
+            (if (or (rng-ipattern-get-nullable
+                     (rng-data-deriv child value))
+                    (and (rng-ipattern-get-nullable child)
+                         (rng-blank-p value)))
+                (rng-ipattern-get-after ipattern)
+              rng-not-allowed-ipattern)))
+         ((eq type 'data)
+          (if (rng-dt-make-value (rng-ipattern-get-datatype ipattern)
+                                 value)
+              rng-empty-ipattern
+            rng-not-allowed-ipattern))
+         ((eq type 'data-except)
+          (if (and (rng-dt-make-value (rng-ipattern-get-datatype ipattern)
+                                      value)
+                   (not (rng-ipattern-get-nullable
+                         (rng-data-deriv
+                          (rng-ipattern-get-child ipattern)
+                          value))))
+              rng-empty-ipattern
+            rng-not-allowed-ipattern))
+         ((eq type 'value)
+          (if (equal (rng-dt-make-value (rng-ipattern-get-datatype ipattern)
+                                        value)
+                     (rng-ipattern-get-value-object ipattern))
+              rng-empty-ipattern
+            rng-not-allowed-ipattern))
+         ((eq type 'list)
+          (let ((tokens (split-string value))
+                (state (rng-ipattern-get-child ipattern)))
+            (while (and tokens
+                        (not (eq state rng-not-allowed-ipattern)))
+              (setq state (rng-data-deriv state (car tokens)))
+              (setq tokens (cdr tokens)))
+            (if (rng-ipattern-get-nullable state)
+                rng-empty-ipattern
+              rng-not-allowed-ipattern)))
+         ;; don't think interleave can occur
+         ;; since we do text-only-deriv first
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-transform-multi (f ipattern interner)
+  (let* ((members (rng-ipattern-get-child ipattern))
+        (transformed (mapcar f members)))
+    (if (rng-members-eq members transformed)
+       ipattern
+      (funcall interner transformed))))
+
+(defun rng-transform-choice (f ipattern)
+  (rng-transform-multi f ipattern 'rng-intern-choice))
+
+(defun rng-transform-group (f ipattern)
+  (rng-transform-multi f ipattern 'rng-intern-group))
+
+(defun rng-transform-interleave (f ipattern)
+  (rng-transform-multi f ipattern 'rng-intern-interleave))
+
+(defun rng-transform-one-or-more (f ipattern)
+  (let* ((child (rng-ipattern-get-child ipattern))
+        (transformed (funcall f child)))
+    (if (eq child transformed)
+       ipattern
+      (rng-intern-one-or-more transformed))))
+
+(defun rng-transform-after-child (f ipattern)
+  (let* ((child (rng-ipattern-get-child ipattern))
+        (transformed (funcall f child)))
+    (if (eq child transformed)
+       ipattern
+      (rng-intern-after transformed
+                       (rng-ipattern-get-after ipattern)))))
+
+(defun rng-transform-interleave-single (f subster ipattern)
+  (let ((children (rng-ipattern-get-child ipattern))
+       found)
+    (while (and children (not found))
+      (let* ((child (car children))
+            (transformed (funcall f child)))
+       (if (eq transformed rng-not-allowed-ipattern)
+           (setq children (cdr children))
+         (setq found
+               (funcall subster
+                        transformed
+                        child
+                        (rng-ipattern-get-child ipattern))))))
+    (or found
+       rng-not-allowed-ipattern)))
+
+(defun rng-transform-group-nullable (f conser ipattern)
+  "Given a group x1,...,xn,y1,...,yn where the xs are all
+nullable and y1 isn't, return a choice
+  (conser f(x1) x2,...,xm,y1,...,yn)
+  |(conser f(x2) x3,...,xm,y1,...,yn)
+  |...
+  |(conser f(xm) y1,...,yn)
+  |(conser f(y1) y2,...,yn)"
+  (rng-intern-choice
+   (rng-transform-group-nullable-gen-choices
+    f
+    conser
+    (rng-ipattern-get-child ipattern))))
+
+(defun rng-transform-group-nullable-gen-choices (f conser members)
+  (let ((head (car members))
+       (tail (cdr members)))
+    (if tail
+       (cons (funcall conser (funcall f head) tail)
+             (if (rng-ipattern-get-nullable head)
+                 (rng-transform-group-nullable-gen-choices f conser tail)
+               nil))
+      (list (funcall f head)))))
+
+(defun rng-members-eq (list1 list2)
+  (while (and list1
+             list2
+             (eq (car list1) (car list2)))
+    (setq list1 (cdr list1))
+    (setq list2 (cdr list2)))
+  (and (null list1) (null list2)))
+    
+
+(defun rng-ipattern-after (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-transform-choice 'rng-ipattern-after ipattern))
+         ((eq type 'after)
+          (rng-ipattern-get-after ipattern))
+         ((eq  type 'not-allowed)
+          ipattern)
+         (t (error "Internal error in rng-ipattern-after: unexpected type %s" type)))))
+
+(defun rng-unknown-start-tag-open-deriv (ipattern)
+  (rng-intern-after (rng-compile rng-any-content) ipattern))
+
+(defun rng-ipattern-optionalize-elements (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern))
+        (transform (assq type rng-transform-map)))
+    (cond (transform
+          (funcall (cdr transform)
+                   'rng-ipattern-optionalize-elements
+                   ipattern))
+         ((eq type 'element)
+          (rng-intern-optional ipattern))
+         (t ipattern))))
+
+(defun rng-ipattern-empty-before-p (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (eq (rng-ipattern-get-child ipattern) rng-empty-ipattern))
+         ((eq type 'choice)
+          (let ((members (rng-ipattern-get-child ipattern))
+                (ret t))
+            (while (and members ret)
+              (or (rng-ipattern-empty-before-p (car members))
+                  (setq ret nil))
+              (setq members (cdr members)))
+            ret))
+         (t nil))))
+
+(defun rng-ipattern-possible-start-tags (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-possible-start-tags
+           (rng-ipattern-get-child ipattern)
+           accum))
+         ((memq type '(choice interleave))
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-start-tags (car members)
+                                                      accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'group)
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-start-tags (car members)
+                                                      accum))
+              (setq members
+                    (and (rng-ipattern-get-nullable (car members))
+                         (cdr members)))))
+          accum)
+         ((eq type 'element)
+          (if (eq (rng-element-get-child ipattern) rng-not-allowed-ipattern)
+              accum
+            (rng-name-class-possible-names
+             (rng-ipattern-get-name-class ipattern)
+             accum)))
+         ((eq type 'one-or-more)
+          (rng-ipattern-possible-start-tags
+           (rng-ipattern-get-child ipattern)
+           accum))
+         (t accum))))
+
+(defun rng-ipattern-start-tag-possible-p (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((memq type '(after one-or-more))
+          (rng-ipattern-start-tag-possible-p
+           (rng-ipattern-get-child ipattern)))
+         ((memq type '(choice interleave))
+          (let ((members (rng-ipattern-get-child ipattern))
+                (possible nil))
+            (while (and members (not possible))
+              (setq possible
+                    (rng-ipattern-start-tag-possible-p (car members)))
+              (setq members (cdr members)))
+            possible))
+         ((eq type 'group)
+          (let ((members (rng-ipattern-get-child ipattern))
+                (possible nil))
+            (while (and members (not possible))
+              (setq possible
+                    (rng-ipattern-start-tag-possible-p (car members)))
+              (setq members
+                    (and (rng-ipattern-get-nullable (car members))
+                         (cdr members))))
+            possible))
+         ((eq type 'element)
+          (not (eq (rng-element-get-child ipattern)
+                   rng-not-allowed-ipattern)))
+         (t nil))))
+
+(defun rng-ipattern-possible-attributes (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-possible-attributes (rng-ipattern-get-child ipattern)
+                                            accum))
+         ((memq type '(choice interleave group))
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-attributes (car members)
+                                                      accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'attribute)
+          (rng-name-class-possible-names
+           (rng-ipattern-get-name-class ipattern)
+           accum))
+         ((eq type 'one-or-more)
+          (rng-ipattern-possible-attributes
+           (rng-ipattern-get-child ipattern)
+           accum))
+         (t accum))))
+
+(defun rng-ipattern-possible-values (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-possible-values (rng-ipattern-get-child ipattern)
+                                        accum))
+         ((eq type 'choice)
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-values (car members)
+                                                  accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'value)
+          (let ((value-object (rng-ipattern-get-value-object ipattern)))
+            (if (stringp value-object)
+                (cons value-object accum)
+              accum)))
+         (t accum))))
+
+(defun rng-ipattern-required-element (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((memq type '(after one-or-more))
+          (rng-ipattern-required-element (rng-ipattern-get-child ipattern)))
+         ((eq type 'choice)
+          (let* ((members (rng-ipattern-get-child ipattern))
+                 (required (rng-ipattern-required-element (car members))))
+            (while (and required
+                        (setq members (cdr members)))
+              (unless (equal required
+                             (rng-ipattern-required-element (car members)))
+                  (setq required nil)))
+            required))
+         ((eq type 'group)
+          (let ((members (rng-ipattern-get-child ipattern))
+                required)
+            (while (and (not (setq required
+                                   (rng-ipattern-required-element
+                                    (car members))))
+                        (rng-ipattern-get-nullable (car members))
+                        (setq members (cdr members))))
+            required))
+         ((eq type 'interleave)
+          (let ((members (rng-ipattern-get-child ipattern))
+                required)
+            (while members
+              (let ((tem (rng-ipattern-required-element (car members))))
+                (cond ((not tem)
+                       (setq members (cdr members)))
+                      ((not required)
+                       (setq required tem)
+                       (setq members (cdr members)))
+                      ((equal required tem)
+                       (setq members (cdr members)))
+                      (t
+                       (setq required nil)
+                       (setq members nil)))))
+            required))
+         ((eq type 'element)
+          (let ((nc (rng-ipattern-get-name-class ipattern)))
+            (and (consp nc)
+                 (not (eq (rng-element-get-child ipattern)
+                          rng-not-allowed-ipattern))
+                 nc))))))
+
+(defun rng-ipattern-required-attributes (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-required-attributes (rng-ipattern-get-child ipattern)
+                                            accum))
+         ((memq type '(interleave group))
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-required-attributes (car members)
+                                                      accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'choice)
+          (let ((members (rng-ipattern-get-child ipattern))
+                in-all in-this new-in-all)
+            (setq in-all
+                  (rng-ipattern-required-attributes (car members)
+                                                    nil))
+            (while (and in-all (setq members (cdr members)))
+              (setq in-this
+                    (rng-ipattern-required-attributes (car members) nil))
+              (setq new-in-all nil)
+              (while in-this
+                (when (member (car in-this) in-all)
+                  (setq new-in-all
+                        (cons (car in-this) new-in-all)))
+                (setq in-this (cdr in-this)))
+              (setq in-all new-in-all))
+            (append in-all accum)))
+         ((eq type 'attribute)
+          (let ((nc (rng-ipattern-get-name-class ipattern)))
+            (if (consp nc)
+                (cons nc accum)
+              accum)))
+         ((eq type 'one-or-more)
+          (rng-ipattern-required-attributes (rng-ipattern-get-child ipattern)
+                                            accum))
+         (t accum))))
+
+(defun rng-compile-error (&rest args)
+  (signal 'rng-compile-error
+         (list (apply 'format args))))
+
+(put 'rng-compile-error
+     'error-conditions
+     '(error rng-error rng-compile-error))
+
+(put 'rng-compile-error
+     'error-message
+     "Incorrect schema")
+
+
+;;; External API
+
+(defsubst rng-match-state () rng-match-state)
+
+(defsubst rng-set-match-state (state)
+  (setq rng-match-state state))
+      
+(defsubst rng-match-state-equal (state)
+  (eq state rng-match-state))
+
+(defun rng-schema-changed ()
+  (rng-ipattern-clear)
+  (rng-compile-clear))
+
+(defun rng-match-init-buffer ()
+  (make-local-variable 'rng-compile-table)
+  (make-local-variable 'rng-ipattern-table)
+  (make-local-variable 'rng-last-ipattern-index))
+
+(defun rng-match-start-document ()
+  (rng-ipattern-maybe-init)
+  (rng-compile-maybe-init)
+  (add-hook 'rng-schema-change-hook 'rng-schema-changed nil t)
+  (setq rng-match-state (rng-compile rng-current-schema)))
+
+(defun rng-match-start-tag-open (name)
+  (rng-update-match-state (rng-start-tag-open-deriv rng-match-state
+                                                   name)))
+
+(defun rng-match-attribute-name (name)
+  (rng-update-match-state (rng-start-attribute-deriv rng-match-state
+                                                    name)))
+
+(defun rng-match-attribute-value (value)
+  (rng-update-match-state (rng-data-deriv rng-match-state
+                                         value)))
+
+(defun rng-match-element-value (value)
+  (and (rng-update-match-state (rng-text-only-deriv rng-match-state))
+       (rng-update-match-state (rng-data-deriv rng-match-state
+                                              value))))
+
+(defun rng-match-start-tag-close ()
+  (rng-update-match-state (rng-start-tag-close-deriv rng-match-state)))
+
+(defun rng-match-mixed-text ()
+  (rng-update-match-state (rng-mixed-text-deriv rng-match-state)))
+
+(defun rng-match-end-tag ()
+  (rng-update-match-state (rng-end-tag-deriv rng-match-state)))
+
+(defun rng-match-after ()
+  (rng-update-match-state
+   (rng-ipattern-after rng-match-state)))
+
+(defun rng-match-out-of-context-start-tag-open (name)
+  (let* ((found (rng-map-element-attribute 'rng-find-element-content-pattern
+                                          rng-current-schema
+                                          nil
+                                          name))
+        (content-pattern (if found
+                             (rng-intern-choice found)
+                           rng-not-allowed-ipattern)))
+    (rng-update-match-state
+     (rng-intern-after content-pattern rng-match-state))))
+
+(defun rng-match-possible-namespace-uris ()
+  "Return a list of all the namespace URIs used in the current schema.
+The absent URI is not included, so the result is always list of symbols."
+  (rng-map-element-attribute (lambda (pattern accum)
+                              (rng-find-name-class-uris (nth 1 pattern)
+                                                        accum))
+                            rng-current-schema
+                            nil))
+
+(defun rng-match-unknown-start-tag-open ()
+  (rng-update-match-state
+   (rng-unknown-start-tag-open-deriv rng-match-state)))
+
+(defun rng-match-optionalize-elements ()
+  (rng-update-match-state
+   (rng-ipattern-optionalize-elements rng-match-state)))
+
+(defun rng-match-ignore-attributes ()
+  (rng-update-match-state
+   (rng-ignore-attributes-deriv rng-match-state)))
+
+(defun rng-match-text-typed-p ()
+  (rng-ipattern-text-typed-p rng-match-state))
+
+(defun rng-match-empty-content ()
+  (if (rng-match-text-typed-p)
+      (rng-match-element-value "")
+    (rng-match-end-tag)))
+
+(defun rng-match-empty-before-p ()
+  "Return non-nil if what can be matched before an end-tag is empty.
+In other words, return non-nil if the pattern for what can be matched
+for an end-tag is equivalent to empty."
+  (rng-ipattern-empty-before-p rng-match-state))
+
+(defun rng-match-infer-start-tag-namespace (local-name)
+  (let ((ncs (rng-ipattern-possible-start-tags rng-match-state nil))
+       (nc nil)
+       (ns nil))
+    (while ncs
+      (setq nc (car ncs))
+      (if (and (equal (cdr nc) local-name)
+              (symbolp (car nc)))
+         (cond ((not ns)
+                ;; first possible namespace
+                (setq ns (car nc))
+                (setq ncs (cdr ncs)))
+               ((equal ns (car nc))
+                ;; same as first namespace
+                (setq ncs (cdr ncs)))
+               (t
+                ;; more than one possible namespace
+                (setq ns nil)
+                (setq ncs nil)))
+       (setq ncs (cdr ncs))))
+    ns))
+
+(defun rng-match-nullable-p ()
+  (rng-ipattern-get-nullable rng-match-state))
+
+(defun rng-match-possible-start-tag-names ()
+  "Return a list of possible names that would be valid for start-tags.
+
+Each possible name is returned as a (NAMESPACE . LOCAL-NAME) pair,
+where NAMESPACE is a symbol or nil (meaning the absent namespace) and
+LOCAL-NAME is a string. The returned list may contain duplicates."
+  (rng-ipattern-possible-start-tags rng-match-state nil))
+
+;; This is no longer used.  It might be useful so leave it in for now.
+(defun rng-match-start-tag-possible-p ()
+  "Return non-nil if a start-tag is possible."
+  (rng-ipattern-start-tag-possible-p rng-match-state))
+
+(defun rng-match-possible-attribute-names ()
+  "Return a list of possible names that would be valid for attributes.
+
+See the function `rng-match-possible-start-tag-names' for
+more information."
+  (rng-ipattern-possible-attributes rng-match-state nil))
+
+(defun rng-match-possible-value-strings ()
+  "Return a list of strings that would be valid as content.
+The list may contain duplicates. Typically, the list will not
+be exhaustive."
+  (rng-ipattern-possible-values rng-match-state nil))
+
+(defun rng-match-required-element-name ()
+  "Return the name of an element which must occur, or nil if none."
+  (rng-ipattern-required-element rng-match-state))
+
+(defun rng-match-required-attribute-names ()
+  "Return a list of names of attributes which must all occur."
+  (rng-ipattern-required-attributes rng-match-state nil))
+
+(defmacro rng-match-save (&rest body)
+  (let ((state (make-symbol "state")))
+    `(let ((,state rng-match-state))
+       (unwind-protect
+          (progn ,@body)
+        (setq rng-match-state ,state)))))
+
+(put 'rng-match-save 'lisp-indent-function 0)
+(def-edebug-spec rng-match-save t)
+
+(defmacro rng-match-with-schema (schema &rest body)
+  `(let ((rng-current-schema ,schema)
+        rng-match-state
+        rng-compile-table
+        rng-ipattern-table
+        rng-last-ipattern-index)
+     (rng-ipattern-maybe-init)
+     (rng-compile-maybe-init)
+     (setq rng-match-state (rng-compile rng-current-schema))
+     ,@body))
+
+(put 'rng-match-with-schema 'lisp-indent-function 1)
+(def-edebug-spec rng-match-with-schema t)
+
+(provide 'rng-match)
+    
+;;; rng-match.el ends here
diff --git a/lisp/nxml/rng-nxml.el b/lisp/nxml/rng-nxml.el
new file mode 100644 (file)
index 0000000..46867a6
--- /dev/null
@@ -0,0 +1,591 @@
+;;; rng-nxml.el --- make nxml-mode take advantage of rng-validate-mode
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'easymenu)
+(require 'xmltok)
+(require 'nxml-util)
+(require 'nxml-ns)
+(require 'rng-match)
+(require 'rng-util)
+(require 'rng-valid)
+(require 'nxml-mode)
+(require 'rng-loc)
+
+(defcustom rng-nxml-auto-validate-flag t
+  "*Non-nil means automatically turn on validation with nxml-mode."
+  :type 'boolean
+  :group 'relax-ng)
+
+(defvar rng-preferred-prefix-alist-default nil
+  "Default value for variable `rng-preferred-prefix-alist'.")
+
+(defcustom rng-preferred-prefix-alist rng-preferred-prefix-alist-default
+  "*Alist of namespaces vs preferred prefixes."
+  :type '(repeat (cons :tag "With"
+                      (string :tag "this namespace URI")
+                      (string :tag "use this prefix")))
+  :group 'relax-ng)
+
+(defvar rng-complete-end-tags-after-< t
+  "*Non-nil means immediately after < complete on end-tag names.
+Complete on start-tag names regardless.")
+
+(defvar rng-nxml-easy-menu
+  '("XML"
+    ["Show Outline Only" nxml-hide-all-text-content]
+    ["Show Everything" nxml-show-all]
+    "---"
+    ["Validation" rng-validate-mode
+     :style toggle
+     :selected rng-validate-mode]
+    "---"
+    ("Set Schema"
+     ["Automatically" rng-auto-set-schema]
+     ("For Document Type"
+      :filter (lambda (menu)
+               (mapcar (lambda (type-id)
+                         (vector type-id
+                                 (list 'rng-set-document-type
+                                       type-id)))
+                       (rng-possible-type-ids))))
+     ["Any Well-Formed XML" rng-set-vacuous-schema]
+     ["File..." rng-set-schema-file])
+    ["Show Schema Location" rng-what-schema]
+    ["Save Schema Location" rng-save-schema-location :help
+     "Save the location of the schema currently being used for this buffer"]
+    "---"
+    ["First Error" rng-first-error :active rng-validate-mode]
+    ["Next Error" rng-next-error :active rng-validate-mode]
+    "---"
+    ["Customize nXML" (customize-group 'nxml)]
+    "---"
+    ["Show nXML Version" nxml-version]))
+
+;;;###autoload
+(defun rng-nxml-mode-init ()
+  "Initialize `nxml-mode' to take advantage of `rng-validate-mode'.
+This is typically called from `nxml-mode-hook'.
+Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil."
+  (interactive)
+  (define-key nxml-mode-map "\C-c\C-v" 'rng-validate-mode)
+  (define-key nxml-mode-map "\C-c\C-s\C-w" 'rng-what-schema)
+  (define-key nxml-mode-map "\C-c\C-s\C-a" 'rng-auto-set-schema-and-validate)
+  (define-key nxml-mode-map "\C-c\C-s\C-f" 'rng-set-schema-file-and-validate)
+  (define-key nxml-mode-map "\C-c\C-s\C-l" 'rng-save-schema-location)
+  (define-key nxml-mode-map "\C-c\C-s\C-t" 'rng-set-document-type-and-validate)
+  (define-key nxml-mode-map "\C-c\C-n" 'rng-next-error)
+  (easy-menu-define rng-nxml-menu nxml-mode-map
+    "Menu for nxml-mode used with rng-validate-mode."
+    rng-nxml-easy-menu)
+  (setq mode-line-process
+       '(rng-validate-mode (:eval (rng-compute-mode-line-string))))
+  (cond (rng-nxml-auto-validate-flag
+        (rng-validate-mode 1)
+        (add-hook 'nxml-completion-hook 'rng-complete nil t)
+        (add-hook 'nxml-in-mixed-content-hook 'rng-in-mixed-content-p nil t))
+       (t
+        (rng-validate-mode 0)
+        (remove-hook 'nxml-completion-hook 'rng-complete t)
+        (remove-hook 'nxml-in-mixed-content-hook 'rng-in-mixed-content-p t))))
+
+(defvar rng-tag-history nil)
+(defvar rng-attribute-name-history nil)
+(defvar rng-attribute-value-history nil)
+
+(defvar rng-complete-target-names nil)
+(defvar rng-complete-name-attribute-flag nil)
+(defvar rng-complete-extra-strings nil)
+
+(defun rng-complete ()
+  "Complete the string before point using the current schema.
+Return non-nil if in a context it understands."
+  (interactive)
+  (and rng-validate-mode
+       (let ((lt-pos (save-excursion (search-backward "<" nil t)))
+            xmltok-dtd)
+        (and lt-pos
+             (= (rng-set-state-after lt-pos) lt-pos)
+             (or (rng-complete-tag lt-pos)
+                 (rng-complete-end-tag lt-pos)
+                 (rng-complete-attribute-name lt-pos)
+                 (rng-complete-attribute-value lt-pos))))))
+
+(defconst rng-in-start-tag-name-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "<\\(?:w\\(?::w?\\)?\\)?\\="
+   t
+   t))
+
+(defun rng-complete-tag (lt-pos)
+  (let (rng-complete-extra-strings)
+    (when (and (= lt-pos (1- (point)))
+              rng-complete-end-tags-after-<
+              rng-open-elements
+              (not (eq (car rng-open-elements) t))
+              (or rng-collecting-text
+                  (rng-match-save
+                    (rng-match-end-tag))))
+      (setq rng-complete-extra-strings
+           (cons (concat "/"
+                         (if (caar rng-open-elements)
+                             (concat (caar rng-open-elements)
+                                     ":"
+                                     (cdar rng-open-elements))
+                           (cdar rng-open-elements)))
+                 rng-complete-extra-strings)))
+    (when (save-excursion
+           (re-search-backward rng-in-start-tag-name-regex
+                               lt-pos
+                               t))
+      (and rng-collecting-text (rng-flush-text))
+      (let ((completion
+            (let ((rng-complete-target-names
+                   (rng-match-possible-start-tag-names))
+                  (rng-complete-name-attribute-flag nil))
+              (rng-complete-before-point (1+ lt-pos)
+                                         'rng-complete-qname-function
+                                         "Tag: "
+                                         nil
+                                         'rng-tag-history)))
+           name)
+       (when completion
+         (cond ((rng-qname-p completion)
+                (setq name (rng-expand-qname completion
+                                             t
+                                             'rng-start-tag-expand-recover))
+                (when (and name
+                           (rng-match-start-tag-open name)
+                           (or (not (rng-match-start-tag-close))
+                               ;; need a namespace decl on the root element
+                               (and (car name)
+                                    (not rng-open-elements))))
+                  ;; attributes are required
+                  (insert " ")))
+               ((member completion rng-complete-extra-strings)
+                (insert ">")))))
+      t)))
+
+(defconst rng-in-end-tag-name-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "</\\(?:w\\(?::w?\\)?\\)?\\="
+   t
+   t))
+
+(defun rng-complete-end-tag (lt-pos)
+  (when (save-excursion
+         (re-search-backward rng-in-end-tag-name-regex
+                             lt-pos
+                             t))
+    (cond ((or (not rng-open-elements)
+              (eq (car rng-open-elements) t))
+          (message "No matching start-tag")
+          (ding))
+         (t
+          (let ((start-tag-name
+                 (if (caar rng-open-elements)
+                     (concat (caar rng-open-elements)
+                             ":"
+                             (cdar rng-open-elements))
+                   (cdar rng-open-elements)))
+                (end-tag-name
+                 (buffer-substring-no-properties (+ (match-beginning 0) 2)
+                                                 (point))))
+            (cond ((or (> (length end-tag-name)
+                          (length start-tag-name))
+                       (not (string= (substring start-tag-name
+                                                0
+                                                (length end-tag-name))
+                                     end-tag-name)))
+                   (message "Expected end-tag %s"
+                            (rng-quote-string
+                             (concat "</" start-tag-name ">")))
+                   (ding))
+                  (t
+                   (delete-region (- (point) (length end-tag-name))
+                                  (point))
+                   (insert start-tag-name ">")
+                   (when (not (or rng-collecting-text
+                                  (rng-match-end-tag)))
+                     (message "Element %s is incomplete"
+                              (rng-quote-string start-tag-name))))))))
+    t))
+
+(defconst rng-in-attribute-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "<w\\(?::w\\)?\
+\\(?:[ \t\r\n]+w\\(?::w\\)?[ \t\r\n]*=\
+[ \t\r\n]*\\(?:\"[^\"]*\"\\|'[^']*'\\)\\)*\
+[ \t\r\n]+\\(\\(?:w\\(?::w?\\)?\\)?\\)\\="
+   t
+   t))
+
+(defvar rng-undeclared-prefixes nil)
+
+(defun rng-complete-attribute-name (lt-pos)
+  (when (save-excursion
+         (re-search-backward rng-in-attribute-regex lt-pos t))
+    (let ((attribute-start (match-beginning 1))
+         rng-undeclared-prefixes)
+      (and (rng-adjust-state-for-attribute lt-pos
+                                          attribute-start)
+          (let ((rng-complete-target-names
+                 (rng-match-possible-attribute-names))
+                (rng-complete-extra-strings
+                 (mapcar (lambda (prefix)
+                           (if prefix
+                               (concat "xmlns:" prefix)
+                             "xmlns"))
+                         rng-undeclared-prefixes))
+                (rng-complete-name-attribute-flag t))
+            (rng-complete-before-point attribute-start
+                                       'rng-complete-qname-function
+                                       "Attribute: "
+                                       nil
+                                       'rng-attribute-name-history))
+          (insert "=\"")))
+    t))
+
+(defconst rng-in-attribute-value-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "<w\\(?::w\\)?\
+\\(?:[ \t\r\n]+w\\(?::w\\)?[ \t\r\n]*=\
+[ \t\r\n]*\\(?:\"[^\"]*\"\\|'[^']*'\\)\\)*\
+[ \t\r\n]+\\(w\\(:w\\)?\\)[ \t\r\n]*=[ \t\r\n]*\
+\\(\"[^\"]*\\|'[^']*\\)\\="
+   t
+   t))
+
+(defun rng-complete-attribute-value (lt-pos)
+  (when (save-excursion
+         (re-search-backward rng-in-attribute-value-regex lt-pos t))
+    (let ((name-start (match-beginning 1))
+         (name-end (match-end 1))
+         (colon (match-beginning 2))
+         (value-start (1+ (match-beginning 3))))
+      (and (rng-adjust-state-for-attribute lt-pos
+                                          name-start)
+          (if (string= (buffer-substring-no-properties name-start
+                                                       (or colon name-end))
+                       "xmlns")
+              (rng-complete-before-point
+               value-start
+               (rng-strings-to-completion-alist
+                (rng-possible-namespace-uris
+                 (and colon
+                      (buffer-substring-no-properties (1+ colon) name-end))))
+               "Namespace URI: "
+               nil
+               'rng-namespace-uri-history)
+            (rng-adjust-state-for-attribute-value name-start
+                                                  colon
+                                                  name-end)
+            (rng-complete-before-point
+             value-start
+             (rng-strings-to-completion-alist
+              (rng-match-possible-value-strings))
+             "Value: "
+             nil
+             'rng-attribute-value-history))
+          (insert (char-before value-start))))
+    t))
+
+(defun rng-possible-namespace-uris (prefix)
+  (let ((ns (if prefix (nxml-ns-get-prefix prefix)
+             (nxml-ns-get-default))))
+    (if (and ns (memq prefix (nxml-ns-changed-prefixes)))
+       (list (nxml-namespace-name ns))
+      (mapcar 'nxml-namespace-name
+             (delq nxml-xml-namespace-uri
+                   (rng-match-possible-namespace-uris))))))
+
+(defconst rng-qname-regexp
+  (concat "\\`"
+         xmltok-ncname-regexp
+         "\\(?:" ":" xmltok-ncname-regexp "\\)" "?" "\\'"))
+
+(defun rng-qname-p (string)
+  (and (string-match rng-qname-regexp string) t))
+
+(defun rng-expand-qname (qname &optional defaultp recover-fun)
+  (setq qname (rng-split-qname qname))
+  (let ((prefix (car qname)))
+    (if prefix
+       (let ((ns (nxml-ns-get-prefix qname)))
+         (cond (ns (cons ns (cdr qname)))
+               (recover-fun (funcall recover-fun prefix (cdr qname)))))
+      (cons (and defaultp (nxml-ns-get-default)) (cdr qname)))))
+
+(defun rng-start-tag-expand-recover (prefix local-name)
+  (let ((ns (rng-match-infer-start-tag-namespace local-name)))
+    (and ns
+        (cons ns local-name))))
+
+(defun rng-split-qname (qname)
+  (if (string-match ":" qname)
+      (cons (substring qname 0 (match-beginning 0))
+           (substring qname (match-end 0)))
+    (cons nil qname)))
+
+(defun rng-in-mixed-content-p ()
+  "Return non-nil if point is in mixed content.
+Return nil only if point is definitely not in mixed content.
+If unsure, return non-nil."
+  (if (eq rng-current-schema rng-any-element)
+      t
+    (rng-set-state-after)
+    (rng-match-mixed-text)))
+
+(defun rng-set-state-after (&optional pos)
+  "Set the state for after parsing the first token with endpoint >= POS.
+This does not change the xmltok state or point.  However, it does
+set `xmltok-dtd'. Returns the position of the end of the token."
+  (unless pos (setq pos (point)))
+  (when (< rng-validate-up-to-date-end pos)
+    (message "Parsing...")
+    (while (and (rng-do-some-validation)
+               (< rng-validate-up-to-date-end pos))
+      ;; Display percentage validated.
+      (force-mode-line-update)
+      ;; Force redisplay but don't allow idle timers to run.
+      (let ((timer-idle-list nil))
+       (sit-for 0)))
+    (message "Parsing...done"))
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-invisible-motion
+       (if (= pos 1)
+           (rng-set-initial-state)
+         (let ((state (get-text-property (1- pos) 'rng-state)))
+           (cond (state
+                  (rng-restore-state state)
+                  (goto-char pos))
+                 (t
+                  (let ((start (previous-single-property-change pos
+                                                                'rng-state)))
+                    (cond (start
+                           (rng-restore-state (get-text-property (1- start)
+                                                                 'rng-state))
+                           (goto-char start))
+                          (t (rng-set-initial-state))))))))
+       (xmltok-save
+         (if (= (point) 1)
+             (xmltok-forward-prolog)
+           (setq xmltok-dtd rng-dtd))
+         (cond ((and (< pos (point))
+                     ;; This handles the case where the prolog ends
+                     ;; with a < without any following name-start
+                     ;; character. This will be treated by the parser
+                     ;; as part of the prolog, but we want to treat
+                     ;; it as the start of the instance.
+                     (eq (char-after pos) ?<)
+                     (<= (point)
+                         (save-excursion
+                           (goto-char (1+ pos))
+                           (skip-chars-forward " \t\r\n")
+                           (point))))
+                pos)
+               ((< (point) pos)
+                (let ((rng-dt-namespace-context-getter
+                       '(nxml-ns-get-context))
+                      (rng-parsing-for-state t))
+                  (rng-forward pos))
+                (point))
+               (t pos)))))))
+
+(defun rng-adjust-state-for-attribute (lt-pos start)
+  (xmltok-save
+    (save-excursion
+      (goto-char lt-pos)
+      (when (memq (xmltok-forward)
+                 '(start-tag
+                   partial-start-tag
+                   empty-element
+                   partial-empty-element))
+       (when (< start (point))
+         (setq xmltok-namespace-attributes
+               (rng-prune-attribute-at start
+                                       xmltok-namespace-attributes))
+         (setq xmltok-attributes
+               (rng-prune-attribute-at start
+                                       xmltok-attributes)))
+       (let ((rng-parsing-for-state t)
+             (rng-dt-namespace-context-getter '(nxml-ns-get-context)))
+         (rng-process-start-tag 'stop)
+         (rng-find-undeclared-prefixes)
+         t)))))
+       
+(defun rng-find-undeclared-prefixes ()
+  ;; Start with the newly effective namespace declarations.
+  ;; (Includes declarations added during recovery.)
+  (setq rng-undeclared-prefixes (nxml-ns-changed-prefixes))
+  (let ((iter xmltok-attributes)
+       (ns-state (nxml-ns-state))
+       att)
+    ;; Add namespace prefixes used in this tag,
+    ;; but not declared in the parent.
+    (nxml-ns-pop-state)
+    (while iter
+      (setq att (car iter))
+      (let ((prefix (xmltok-attribute-prefix att)))
+       (when (and prefix
+                  (not (member prefix rng-undeclared-prefixes))
+                  (not (nxml-ns-get-prefix prefix)))
+         (setq rng-undeclared-prefixes
+               (cons prefix rng-undeclared-prefixes))))
+      (setq iter (cdr iter)))
+    (nxml-ns-set-state ns-state)
+    ;; Remove namespace prefixes explicitly declared.
+    (setq iter xmltok-namespace-attributes)
+    (while iter
+      (setq att (car iter))
+      (setq rng-undeclared-prefixes
+           (delete (and (xmltok-attribute-prefix att)
+                        (xmltok-attribute-local-name att))
+                 rng-undeclared-prefixes))
+      (setq iter (cdr iter)))))
+
+(defun rng-prune-attribute-at (start atts)
+  (when atts
+    (let ((cur atts))
+      (while (if (eq (xmltok-attribute-name-start (car cur)) start)
+                (progn
+                  (setq atts (delq (car cur) atts))
+                  nil)
+              (setq cur (cdr cur)))))
+    atts))
+
+(defun rng-adjust-state-for-attribute-value (name-start
+                                            colon
+                                            name-end)
+  (let* ((prefix (if colon
+                    (buffer-substring-no-properties name-start colon)
+                  nil))
+        (local-name (buffer-substring-no-properties (if colon
+                                                        (1+ colon)
+                                                      name-start)
+                                                    name-end))
+        (ns (and prefix (nxml-ns-get-prefix prefix))))
+    (and (or (not prefix) ns)
+        (rng-match-attribute-name (cons ns local-name)))))
+
+(defun rng-complete-qname-function (string predicate flag)
+  (let ((alist (mapcar (lambda (name) (cons name nil))
+                      (rng-generate-qname-list string))))
+    (cond ((not flag)
+          (try-completion string alist predicate))
+         ((eq flag t)
+          (all-completions string alist predicate))
+         ((eq flag 'lambda)
+          (and (assoc string alist) t)))))
+
+(defun rng-generate-qname-list (&optional string)
+  (let ((forced-prefix (and string
+                           (string-match ":" string)
+                           (> (match-beginning 0) 0)
+                           (substring string
+                                      0
+                                      (match-beginning 0))))
+       (namespaces (mapcar 'car rng-complete-target-names))
+       ns-prefixes-alist ns-prefixes iter ns prefer)
+    (while namespaces
+      (setq ns (car namespaces))
+      (when ns
+       (setq ns-prefixes-alist
+             (cons (cons ns (nxml-ns-prefixes-for
+                             ns
+                             rng-complete-name-attribute-flag))
+                   ns-prefixes-alist)))
+      (setq namespaces (delq ns (cdr namespaces))))
+    (setq iter ns-prefixes-alist)
+    (while iter
+      (setq ns-prefixes (car iter))
+      (setq ns (car ns-prefixes))
+      (when (null (cdr ns-prefixes))
+       ;; No declared prefix for the namespace
+       (if forced-prefix
+           ;; If namespace non-nil and prefix undeclared,
+           ;; use forced prefix.
+           (when (and ns
+                      (not (nxml-ns-get-prefix forced-prefix)))
+             (setcdr ns-prefixes (list forced-prefix)))
+         (setq prefer (rng-get-preferred-unused-prefix ns))
+         (when prefer
+           (setcdr ns-prefixes (list prefer)))
+         ;; Unless it's an attribute with a non-nil namespace,
+         ;; allow no prefix for this namespace.
+         (unless rng-complete-name-attribute-flag
+           (setcdr ns-prefixes (cons nil (cdr ns-prefixes))))))
+      (setq iter (cdr iter)))
+    (rng-uniquify-equal
+     (sort (apply 'append
+                 (cons rng-complete-extra-strings
+                       (mapcar (lambda (name)
+                                 (if (car name)
+                                     (mapcar (lambda (prefix)
+                                               (if prefix
+                                                   (concat prefix
+                                                           ":"
+                                                           (cdr name))
+                                                 (cdr name)))
+                                       (cdr (assoc (car name)
+                                                   ns-prefixes-alist)))
+                                   (list (cdr name))))
+                               rng-complete-target-names)))
+          'string<))))
+       
+(defun rng-get-preferred-unused-prefix (ns)
+  (let ((ns-prefix (assoc (symbol-name ns) rng-preferred-prefix-alist))
+       iter prefix)
+    (when ns-prefix
+      (setq prefix (cdr ns-prefix))
+      (when (nxml-ns-get-prefix prefix)
+       ;; try to find an unused prefix
+       (setq iter (memq ns-prefix rng-preferred-prefix-alist))
+       (while (and iter
+                   (setq ns-prefix (assoc ns iter)))
+         (if (nxml-ns-get-prefix (cdr ns-prefix))
+             (setq iter (memq ns-prefix iter))
+           (setq prefix (cdr ns-prefix))
+           nil))))
+    prefix))
+
+(defun rng-strings-to-completion-alist (strings)
+  (mapcar (lambda (s) (cons s s))
+         (rng-uniquify-equal (sort (mapcar 'rng-escape-string strings)
+                                   'string<))))
+
+(provide 'rng-nxml)
+
+;;; rng-nxml.el ends here
diff --git a/lisp/nxml/rng-parse.el b/lisp/nxml/rng-parse.el
new file mode 100644 (file)
index 0000000..f4a0a4c
--- /dev/null
@@ -0,0 +1,104 @@
+;;; rng-parse.el --- parse an XML file and validate it against a schema
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This combines the validation machinery in rng-match.el with the
+;; parser in nxml-parse.el by using the `nxml-validate-function' hook.
+
+;;; Code:
+
+(require 'nxml-parse)
+(require 'rng-match)
+(require 'rng-dt)
+
+(defvar rng-parse-prev-was-start-tag nil)
+
+(defun rng-parse-validate-file (schema file)
+  "Parse and validate the XML document in FILE and return it as a list.
+The returned list has the same form as that returned by
+`nxml-parse-file'.  SCHEMA is a list representing the schema to use
+for validation, such as returned by the function `rng-c-load-schema'.
+If the XML document is invalid with respect to schema, an error will
+be signaled in the same way as when it is not well-formed."
+  (save-excursion
+    (set-buffer (nxml-parse-find-file file))
+    (unwind-protect
+       (let ((nxml-parse-file-name file)
+             (nxml-validate-function 'rng-parse-do-validate)
+             (rng-dt-namespace-context-getter '(nxml-ns-get-context))
+             rng-parse-prev-was-start-tag)
+         ;; We don't simply call nxml-parse-file, because
+         ;; we want to do rng-match-with-schema in the same
+         ;; buffer in which we will call the other rng-match-* functions.
+         (rng-match-with-schema schema
+           (nxml-parse-instance)))
+      (kill-buffer nil))))
+
+(defun rng-parse-do-validate (text start-tag)
+  (cond ((and (let ((tem rng-parse-prev-was-start-tag))
+               (setq rng-parse-prev-was-start-tag (and start-tag t))
+               tem)
+             (not start-tag)
+             (rng-match-text-typed-p))
+        (unless (rng-match-element-value (or text ""))
+          (cons "Invalid data" (and text 'text))))
+       ((and text
+             (not (rng-blank-p text))
+             (not (rng-match-mixed-text)))
+        (cons "Text not allowed" 'text))
+       ((not start-tag)
+        (unless (rng-match-end-tag)
+          (cons "Missing elements" nil)))
+       ((not (rng-match-start-tag-open
+              (rng-parse-to-match-name (car start-tag))))
+        (cons "Element not allowed" nil))
+       (t
+        (let ((atts (cadr start-tag))
+              (i 0)
+              att err)
+          (while (and atts (not err))
+            (setq att (car atts))
+            (when (not (and (consp (car att))
+                            (eq (caar att) nxml-xmlns-namespace-uri)))
+              (setq err
+                    (cond ((not (rng-match-attribute-name
+                                 (rng-parse-to-match-name (car att))))
+                           (cons "Attribute not allowed"
+                                 (cons 'attribute-name i)))
+                          ((not (rng-match-attribute-value (cdr att)))
+                           (cons "Invalid attribute value"
+                                 (cons 'attribute-value i))))))
+            (setq atts (cdr atts))
+            (setq i (1+ i)))
+          (or err
+              (unless (rng-match-start-tag-close)
+                (cons "Missing attributes" 'tag-close)))))))
+
+(defun rng-parse-to-match-name (name)
+  (if (consp name)
+      name
+    (cons nil name)))
+
+(provide 'rng-parse)
+
+;;; rng-parse.el ends here
diff --git a/lisp/nxml/rng-pttrn.el b/lisp/nxml/rng-pttrn.el
new file mode 100644 (file)
index 0000000..c3ae4c6
--- /dev/null
@@ -0,0 +1,189 @@
+;;; rng-pttrn.el --- RELAX NG patterns
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; pattern ::=
+;;   (ref <pattern> <local-name>)
+;;   | (choice <pattern> <pattern> ...)
+;;   | (group <pattern> <pattern> ...)
+;;   | (interleave <pattern> <pattern> ...)
+;;   | (zero-or-more <pattern>)
+;;   | (one-or-more <pattern>)
+;;   | (optional <pattern>)
+;;   | (mixed <pattern>)
+;;   | (value <datatype> <string> <context>)
+;;   | (data <datatype> <params>)
+;;   | (data-except <datatype> <params> <pattern>)
+;;   | (list <pattern>)
+;;   | (element <name-class> <pattern>)
+;;   | (attribute <name-class> <pattern>)
+;;   | (text)
+;;   | (empty)
+;;   | (not-allowed)
+;;
+;; params ::=
+;;   ((<param-name> . <param-value> ) ...)
+;; param-name ::= <symbol>
+;; param-value ::= <string>
+;;
+;; name-class ::=
+;;   (name <name>)
+;;   | (any-name)
+;;   | (any-name-except <name-class>)
+;;   | (ns-name <ns>)
+;;   | (ns-name-except <ns> <name-class>)
+;;   | (choice <name-class> <name-class> ...)
+;;
+;; name ::= (<ns> . <local-name>)
+;; ns ::= nil | <symbol>
+;; local-name ::= <string>
+;; datatype ::= (<datatype-uri> . <datatype-local-name>)
+;; datatype-uri ::= nil | <symbol>
+;; datatype-local-name ::= <symbol>
+
+;;; Code:
+
+(defvar rng-schema-change-hook nil
+  "Hook to be run after `rng-current-schema' changes.")
+
+(defvar rng-current-schema nil
+  "Pattern to be used as schema for the current buffer.")
+(make-variable-buffer-local 'rng-current-schema)
+
+(defun rng-make-ref (name)
+  (list 'ref nil name))
+
+(defun rng-ref-set (ref pattern)
+  (setcar (cdr ref) pattern))
+
+(defun rng-ref-get (ref) (cadr ref))
+
+(defun rng-make-choice (patterns)
+  (cons 'choice patterns))
+
+(defun rng-make-group (patterns)
+  (cons 'group patterns))
+
+(defun rng-make-interleave (patterns)
+  (cons 'interleave patterns))
+
+(defun rng-make-zero-or-more (pattern)
+  (list 'zero-or-more pattern))
+
+(defun rng-make-one-or-more (pattern)
+  (list 'one-or-more pattern))
+
+(defun rng-make-optional (pattern)
+  (list 'optional pattern))
+
+(defun rng-make-mixed (pattern)
+  (list 'mixed pattern))
+
+(defun rng-make-value (datatype str context)
+  (list 'value datatype str context))
+
+(defun rng-make-data (name params)
+  (list 'data name params))
+
+(defun rng-make-data-except (name params pattern)
+  (list 'data-except name params pattern))
+
+(defun rng-make-list (pattern)
+  (list 'list pattern))
+
+(defun rng-make-element (name-class pattern)
+  (list 'element name-class pattern))
+
+(defun rng-make-attribute (name-class pattern)
+  (list 'attribute name-class pattern))
+
+(defun rng-make-text ()
+  '(text))
+
+(defun rng-make-empty ()
+  '(empty))
+
+(defun rng-make-not-allowed ()
+  '(not-allowed))
+
+(defun rng-make-any-name-name-class ()
+  '(any-name))
+
+(defun rng-make-any-name-except-name-class (name-class)
+  (list 'any-name-except name-class))
+
+(defun rng-make-ns-name-name-class (ns)
+  (list 'ns-name ns))
+
+(defun rng-make-ns-name-except-name-class (ns name-class)
+  (list 'ns-name-except ns name-class))
+
+(defun rng-make-name-name-class (name)
+  (list 'name name))
+
+(defun rng-make-choice-name-class (name-classes)
+  (cons 'choice name-classes))
+
+(defconst rng-any-content
+  (let* ((ref (rng-make-ref "any-content"))
+        (pattern (rng-make-zero-or-more
+                   (rng-make-choice
+                    (list
+                     (rng-make-text)
+                     (rng-make-attribute (rng-make-any-name-name-class)
+                                         (rng-make-text))
+                     (rng-make-element (rng-make-any-name-name-class)
+                                       ref))))))
+    (rng-ref-set ref pattern)
+    pattern)
+  "A pattern that matches the attributes and content of any element.")
+
+(defconst rng-any-element
+  (let* ((ref (rng-make-ref "any-element"))
+        (pattern
+         (rng-make-element
+          (rng-make-any-name-name-class)
+          (rng-make-zero-or-more
+           (rng-make-choice
+            (list
+             (rng-make-text)
+             (rng-make-attribute (rng-make-any-name-name-class)
+                                 (rng-make-text))
+             ref))))))
+    (rng-ref-set ref pattern)
+    pattern)
+  "A pattern that matches any element.")
+
+;;; Names
+
+(defun rng-make-name (ns local-name)
+  (cons ns local-name))
+
+;;; Datatypes
+
+(defun rng-make-datatype (uri local-name)
+  (cons uri (intern local-name)))
+
+(provide 'rng-pttrn)
+
+;;; rng-pttrn.el ends here
diff --git a/lisp/nxml/rng-uri.el b/lisp/nxml/rng-uri.el
new file mode 100644 (file)
index 0000000..7ed8bef
--- /dev/null
@@ -0,0 +1,355 @@
+;;; rng-uri.el --- URI parsing and manipulation
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+(defun rng-file-name-uri (f)
+  "Return a URI for the filename F.
+Multibyte characters are left as is. Use `rng-uri-escape-multibyte' to
+escape them using %HH."
+  (setq f (expand-file-name f))
+  (let ((url
+        (replace-regexp-in-string "[\000-\032\177<>#%\"{}|\\^[]`%?;]"
+                                  'rng-percent-encode
+                                  f)))
+    (concat "file:"
+           (if (and (> (length url) 0)
+                    (= (aref url 0) ?/))
+               "//"
+             "///")
+           url)))
+
+(defun rng-uri-escape-multibyte (uri)
+  "Escape multibyte characters in URI."
+  (replace-regexp-in-string "[:nonascii:]"
+                           'rng-percent-encode
+                           (encode-coding-string uri 'utf-8)))
+
+(defun rng-percent-encode (str)
+  (apply 'concat
+        (mapcar (lambda (ch)
+                  (format "%%%x%x" (/ ch 16) (% ch 16)))
+                (string-to-list str))))
+
+
+(defun rng-uri-file-name (uri)
+  "Return the filename represented by a URI.
+Signal an error if URI is not a valid file URL."
+  (rng-uri-file-name-1 uri nil))
+
+(defun rng-uri-pattern-file-name-regexp (pattern)
+  "Return a regexp for filenames represented by URIs that match PATTERN."
+  (rng-uri-file-name-1 pattern 'match))
+
+(defun rng-uri-pattern-file-name-replace-match (pattern)
+  (rng-uri-file-name-1 pattern 'replace))
+
+;; pattern is either nil or match or replace
+(defun rng-uri-file-name-1 (uri pattern)
+  (unless (string-match "\\`\\(?:[^%]\\|%[0-9a-fA-F]{2}\\)*\\'" uri)
+    (rng-uri-error "Bad escapes in URI `%s'" uri))
+  (setq uri (rng-uri-unescape-multibyte uri))
+  (let* ((components
+         (or (rng-uri-split uri)
+             (rng-uri-error "Cannot split URI `%s' into its components" uri)))
+        (scheme (nth 0 components))
+        (authority (nth 1 components))
+        (path (nth 2 components))
+        (absolutep (string-match "\\`/" path))
+        (query (nth 3 components))
+        (fragment-id (nth 4 components)))
+    (cond ((not scheme)
+          (unless pattern
+            (rng-uri-error "URI `%s' does not have a scheme" uri)))
+         ((not (string= (downcase scheme) "file"))
+          (rng-uri-error "URI `%s' does not use the `file:' scheme" uri)))
+    (when (not (member authority
+                      (cons system-name '(nil "" "localhost"))))
+      (rng-uri-error "URI `%s' does not start with `file:///' or `file://localhost/'"
+            uri))
+    (when query
+      (rng-uri-error "`?' not escaped in file URI `%s'" uri))
+    (when fragment-id
+      (rng-uri-error "URI `%s' has a fragment identifier" uri))
+    (when (string-match ";" path)
+      (rng-uri-error "`;' not escaped in URI `%s'" uri))
+    (when (string-match "%2[fF]" path) ;; 2f is hex code of slash
+      (rng-uri-error "Escaped slash in URI `%s'" uri))
+    (when (and (eq system-type 'windows-nt)
+              absolutep
+              (file-name-absolute-p (substring path 1)))
+      (setq path (substring path 1)))
+    (when (and pattern (string-match "\\`\\./" path))
+      (setq path (substring path 2)))
+    (setq path 
+         (cond ((eq pattern 'match)
+                (rng-uri-unescape-unibyte-match path))
+               ((eq pattern 'replace)
+                (rng-uri-unescape-unibyte-replace path 2))
+               (t
+                (rng-uri-unescape-unibyte path))))
+    (when (string-match "\000" path)
+      (rng-uri-error "URI `%s' has NUL character in path" uri))
+    (when (eq pattern 'match)
+      (setq path
+           (concat (if absolutep
+                       "\\(\\)"
+                     "\\(\\(?:[^/]*/\\)*\\)")
+                   path)))
+    (cond ((eq pattern 'match)
+          (concat "\\`" path "\\'"))
+         ((and (eq pattern 'replace)
+               (not absolutep))
+          (concat "\\1" path))
+         (t path))))
+
+(defun rng-uri-error (&rest args)
+  (signal 'rng-uri-error (list (apply 'format args))))
+
+(put 'rng-uri-error 'error-conditions '(error rng-uri-error))
+(put 'rng-uri-error 'error-message "Invalid URI")
+
+(defun rng-uri-split (str)
+  (and (string-match "\\`\\(?:\\([^:/?#]+\\):\\)?\
+\\(?://\\([^/?#]*\\)\\)?\
+\\([^?#]*\\)\
+\\(?:\\?\\([^#]*\\)\\)?\
+\\(?:#\\(\\(?:.\\|\n\\)*\\)\\)?\\'"
+                    str)
+       (list (match-string 1 str)
+            (match-string 2 str)
+            (match-string 3 str)
+            (match-string 4 str)
+            (match-string 5 str))))
+
+(defun rng-uri-join (scheme authority path &optional query fragment-id)
+  (when path
+    (let (parts)
+      (when fragment-id
+       (setq parts (list "#" fragment-id)))
+      (when query
+       (setq parts
+             (cons "?"
+                   (cons query parts))))
+      (setq parts (cons path parts))
+      (when authority
+       (setq parts
+             (cons "//"
+                   (cons authority parts))))
+      (when scheme
+       (setq parts
+             (cons scheme
+                   (cons ":" parts))))
+      (apply 'concat parts))))
+                       
+(defun rng-uri-resolve (uri-ref base-uri)
+  "Resolve a possibly relative URI reference into absolute form.
+URI-REF is the URI reference to be resolved.
+BASE-URI is the base URI to use for resolving it.
+The algorithm is specified by RFC 2396.
+If there is some problem with URI-REF or BASE-URI, then
+URI-REF will be returned."
+  (let* ((components (rng-uri-split uri-ref))
+        (scheme (nth 0 components))
+        (authority (nth 1 components))
+        (path (nth 2 components))
+        (query (nth 3 components))
+        (fragment-id (nth 4 components))
+        (base-components (rng-uri-split base-uri)))
+    (if (or (not components)
+           scheme
+           (not base-components)
+           (not (nth 0 base-components)))
+       uri-ref
+      (setq scheme (nth 0 base-components))
+      (when (not authority)
+       (setq authority (nth 1 base-components))
+       (if (and (equal path "") (not query))
+           ;; Handle same document reference by returning
+           ;; same URI (RFC 2396bis does this too).
+           (setq path (nth 2 base-components)
+                 query (nth 3 base-components))
+         (setq path (rng-resolve-path path (nth 2 base-components)))))
+      (rng-uri-join scheme
+                   authority
+                   path
+                   query
+                   fragment-id))))
+
+;; See RFC 2396 5.2, steps 5 and 6
+(defun rng-resolve-path (path base-path)
+  ;; Step 5
+  (if (or (string-match "\\`/" path)
+         (not (string-match "\\`/" base-path)))
+      path
+    ;; Step 6
+    ;; (a), (b)
+    (let ((segments (rng-split-path path))
+         (base-segments (rng-split-path base-path)))
+      (if (> (length base-segments) 1)
+         (setq segments (nconc (nbutlast base-segments)
+                               segments))
+       (setcar segments
+               (concat (car base-segments) (car segments))))
+      ;; (d)
+      (let ((last-segment (last segments)))
+       (when (equal (car last-segment) ".")
+         (setcar last-segment "")))
+      ;; (c)
+      (setq segments (delete "." segments))
+      ;; (e)
+      (let (iter matched)
+       (while (progn
+                (setq matched nil)
+                (setq iter (cdr segments))
+                (while (and iter (not matched))
+                  (if (or (not (equal (cadr iter) ".."))
+                          (equal (car iter) ".."))
+                      (setq iter (cdr iter))
+                    (setcar iter nil)
+                    (setcar (cdr iter)
+                            ;; (f)
+                            (if (cddr iter) nil ""))
+                    (setq matched t)
+                    (setq segments (delq nil segments))))
+                matched)))
+      (rng-join-path segments))))
+
+(defun rng-relative-uri (full base)
+  "Return a URI that relative to BASE is equivalent to FULL.
+The returned URI will be relative if possible.
+Both FULL and BASE must be absolute URIs."
+  (let* ((components (rng-uri-split full))
+        (scheme (nth 0 components))
+        (authority (nth 1 components))
+        (path (nth 2 components))
+        (query (nth 3 components))
+        (fragment-id (nth 4 components))
+        (base-components (rng-uri-split base)))
+    (if (and components
+            base-components
+            scheme
+            (equal scheme
+                   (nth 0 base-components)))
+       (progn
+         (setq scheme nil)
+         (when (and authority
+                    (equal authority
+                           (nth 1 base-components)))
+           (setq authority nil)
+           (setq path (rng-relative-path path (nth 2 base-components))))
+         (rng-uri-join scheme authority path query fragment-id))
+      full)))
+
+(defun rng-relative-path (path base-path)
+  (let ((segments (rng-split-path path))
+       (base-segments (rng-split-path base-path)))
+    (when (> (length base-segments) 1)
+      (setq base-segments (nbutlast base-segments)))
+    (if (or (member "." segments)
+           (member ".." segments)
+           (member "." base-segments)
+           (member ".." base-segments))
+       path
+      (while (and segments
+                 base-segments
+                 (string= (car segments)
+                          (car base-segments)))
+       (setq segments (cdr segments))
+       (setq base-segments (cdr base-segments)))
+      (while base-segments
+       (setq base-segments (cdr base-segments))
+       (setq segments (cons ".." segments)))
+      (when (equal (car segments) "")
+       (setq segments (cons "." segments)))
+      (rng-join-path segments))))
+
+(defun rng-split-path (path)
+  (let ((start 0)
+       segments)
+    (while (string-match "/" path start)
+      (setq segments (cons (substring path start (match-beginning 0))
+                          segments))
+      (setq start (match-end 0)))
+    (nreverse (cons (substring path start) segments))))
+
+(defun rng-join-path (segments)
+  (and segments
+       (mapconcat 'identity segments "/")))
+
+(defun rng-uri-unescape-multibyte (str)
+  (replace-regexp-in-string "\\(?:%[89a-fA-F][0-9a-fA-F]\\)+"
+                           'rng-multibyte-percent-decode
+                           str))
+
+(defun rng-multibyte-percent-decode (str)
+  (decode-coding-string  (apply 'string
+                               (mapcar (lambda (h) (string-to-number h 16))
+                                       (split-string str "%")))
+                        'utf-8))
+    
+(defun rng-uri-unescape-unibyte (str)
+  (replace-regexp-in-string "%[0-7][0-9a-fA-F]"
+                           (lambda (h)
+                             (string-to-number (substring h 1) 16))
+                           str
+                           t
+                           t))
+
+(defun rng-uri-unescape-unibyte-match (str)
+  (replace-regexp-in-string "%[0-7][0-9a-fA-F]\\|[^%]"
+                           (lambda (match)
+                             (if (string= match "*")
+                                 "\\([^/]*\\)"
+                               (regexp-quote
+                                (if (= (length match) 1)
+                                    match
+                                  (string-to-number (substring match 1)
+                                                    16)))))
+                           str
+                           t
+                           t))
+
+(defun rng-uri-unescape-unibyte-replace (str next-match-index)
+  (replace-regexp-in-string
+   "%[0-7][0-9a-fA-F]\\|[^%]"
+   (lambda (match)
+     (if (string= match "*")
+        (let ((n next-match-index))
+          (setq next-match-index (1+ n))
+          (format "\\%s" n))
+       (let ((ch (if (= (length match) 1)
+                    (aref match 0)
+                  (string-to-number (substring match 1)
+                                    16))))
+        (if (eq ch ?\\)
+            (string ?\\ ?\\)
+          (string ch)))))
+     str
+     t
+     t))
+
+(provide 'rng-uri)
+
+;;; rng-uri.el ends here
diff --git a/lisp/nxml/rng-util.el b/lisp/nxml/rng-util.el
new file mode 100644 (file)
index 0000000..865da0f
--- /dev/null
@@ -0,0 +1,172 @@
+;;; rng-util.el --- utility functions for RELAX NG library
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;;; Code:
+
+(defun rng-make-datatypes-uri (uri)
+  (if (string-equal uri "")
+      ;; The spec doesn't say to do this, but it's perfectly conformant
+      ;; and better than using nil, I think.
+      'http://relaxng.org/ns/structure/1.0
+    (intern uri)))
+
+(defconst rng-xsd-datatypes-uri
+  (rng-make-datatypes-uri "http://www.w3.org/2001/XMLSchema-datatypes"))
+
+(defconst rng-builtin-datatypes-uri (rng-make-datatypes-uri ""))
+
+(defun rng-uniquify-eq (list)
+  "Destructively remove any element from LIST that is eq to
+its predecessor."
+  (and list
+       (let ((head list))
+        (while (cdr head)
+          (if (eq (car head) (cadr head))
+              (setcdr head (cddr head)))
+          (setq head (cdr head)))
+        list)))
+
+(defun rng-uniquify-equal (list)
+  "Destructively remove any element from LIST that is equal to
+its predecessor."
+  (and list
+       (let ((head list))
+        (while (cdr head)
+          (if (equal (car head) (cadr head))
+              (setcdr head (cddr head)))
+          (setq head (cdr head)))
+        list)))
+
+(defun rng-blank-p (str) (string-match "\\`[ \t\n\r]*\\'" str))
+
+(defun rng-substq (new old list)
+  "Replace first member of LIST (if any) that is eq to OLD by NEW.
+LIST is not modified."
+  (cond ((null list) nil)
+       ((eq (car list) old)
+        (cons new (cdr list)))
+       (t
+        (let ((tail (cons (car list)
+                          nil))
+              (rest (cdr list)))
+          (setq list tail)
+          (while rest
+            (let ((item (car rest)))
+              (setq rest (cdr rest))
+              (cond ((eq item old)
+                     (setcdr tail
+                             (cons new rest))
+                     (setq rest nil))
+                    (t
+                     (setq tail
+                           (setcdr tail
+                                   (cons item nil))))))))
+        list)))
+
+(defun rng-complete-before-point (start table prompt &optional predicate hist)
+  "Complete text between START and point.
+Replaces the text between START and point with a string chosen using a
+completion table and, when needed, input read from the user with the
+minibuffer.
+Returns the new string if either a complete and unique completion was
+determined automatically or input was read from the user. Otherwise,
+returns nil.
+TABLE is an alist, a symbol bound to a function or an obarray as with
+the function `completing-read'.
+PROMPT is the string to prompt with if user input is needed.
+PREDICATE is nil or a function as with `completing-read'.
+HIST, if non-nil, specifies a history list as with `completing-read'."
+  (let* ((orig (buffer-substring-no-properties start (point)))
+        (completion (try-completion orig table predicate)))
+    (cond ((not completion)
+          (if (string= orig "")
+              (message "No completions available")
+            (message "No completion for %s" (rng-quote-string orig)))
+          (ding)
+          nil)
+         ((eq completion t) orig)
+         ((not (string= completion orig))
+          (delete-region start (point))
+          (insert completion)
+          (cond ((not (rng-completion-exact-p completion table predicate))
+                 (message "Incomplete")
+                 nil)
+                ((eq (try-completion completion table predicate) t)
+                 completion)
+                (t
+                 (message "Complete but not unique")
+                 nil)))
+         (t
+          (setq completion
+                (let ((saved-minibuffer-setup-hook
+                       (default-value 'minibuffer-setup-hook)))
+                  (add-hook 'minibuffer-setup-hook
+                            'minibuffer-completion-help
+                            t)
+                  (unwind-protect
+                      (completing-read prompt
+                                       table
+                                       predicate
+                                       nil
+                                       orig
+                                       hist)
+                    (setq-default minibuffer-setup-hook
+                                  saved-minibuffer-setup-hook))))
+          (delete-region start (point))
+          (insert completion)
+          completion))))
+
+(defun rng-completion-exact-p (string table predicate)
+  (cond ((symbolp table)
+        (funcall table string predicate 'lambda))
+       ((vectorp table)
+        (intern-soft string table))
+       (t (assoc string table))))
+
+(defun rng-quote-string (s)
+  (concat "\"" s "\""))
+
+(defun rng-escape-string (s)
+  (replace-regexp-in-string "[&\"<>]"
+                           (lambda (match)
+                             (cdr (assoc match
+                                         '(("&" . "&amp;")
+                                           ("\"" . "&quot;")
+                                           (">" . "&gt;")
+                                           ("<" . "&lt;")))))
+                           s
+                           t))
+
+(defun rng-collapse-space (string)
+  (setq string
+       (replace-regexp-in-string "[ \t\r\n]+" " " string t t))
+  (when (string-match "\\` " string)
+    (setq string (substring string 1)))
+  (when (string-match " \\'" string)
+    (setq string (substring string 0 -1)))
+  string)
+
+(provide 'rng-util)
+
+;;; rng-util.el ends here
diff --git a/lisp/nxml/rng-valid.el b/lisp/nxml/rng-valid.el
new file mode 100644 (file)
index 0000000..d5ecb3a
--- /dev/null
@@ -0,0 +1,1467 @@
+;;; rng-valid.el --- real-time validation of XML using RELAX NG
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; For usage information, see the documentation for rng-validate-mode.
+;;
+;; This file provides a minor mode that continually validates a buffer
+;; against a RELAX NG schema. The validation state is used to support
+;; schema-sensitive editing as well as validation. Validation is
+;; performed while Emacs is idle.  XML parsing is done using
+;; xmltok.el. This file is responsible for checking that end-tags
+;; match their start-tags.  Namespace processing is handled by
+;; nxml-ns.el. The RELAX NG Compact Syntax schema is parsed into
+;; internal form by rng-cmpct.el.  This internal form is described by
+;; rng-pttrn.el.  Validation of the document by matching against this
+;; internal form is done by rng-match.el. Handling of W3C XML Schema
+;; datatypes is delegated by rng-match.el to rng-xsd.el.  The minor
+;; mode is intended to be used in conjunction with the nxml major
+;; mode, but does not have to be.
+;;
+;; The major responsibility of this file is to allow validation to
+;; happen incrementally.  If a buffer has been validated and is then
+;; changed, we can often revalidate it without having to completely
+;; parse and validate it from start to end.  As we parse and validate
+;; the buffer, we periodically cache the state.  The state has three
+;; components: the stack of open elements, the namespace processing
+;; state and the RELAX NG validation state. The state is cached as the
+;; value of the rng-state text property on the closing greater-than of
+;; tags (but at intervals, not on every tag).  We keep track of the
+;; position up to which cached state is known to be correct by adding
+;; a function to the buffer's after-change-functions. This is stored
+;; in the rng-validate-up-to-date-end variable.  The first way in
+;; which we make validation incremental is obvious: we start
+;; validation from the first cached state before
+;; rng-validate-up-to-date-end.
+;;
+;; To make this work efficiently, we have to be able to copy the
+;; current parsing and validation state efficiently.  We do this by
+;; minimizing destructive changes to the objects storing the state.
+;; When state is changed, we use the old state to create new objects
+;; representing the new state rather than destructively modifying the
+;; objects representing the old state. Copying the state is just a
+;; matter of making a list of three objects, one for each component of
+;; the state; the three objects themselves can be shared and do not
+;; need to be copied.
+;;
+;; There's one other idea that is used to make validation incremental.
+;; Suppose we have a buffer that's 4000 bytes long and suppose we
+;; validated it, caching state at positions 1000, 2000 and 3000.  Now
+;; suppose we make a change at position 1500 inserting 100 characters.
+;; rng-validate-up-to-date-end will be changed to 1500.  When Emacs
+;; becomes idle and we revalidate, validation will restart using the
+;; cached state at position 1000.  However, we take advantage of the
+;; cached state beyond rng-validate-up-to-date-end as follows.  When
+;; our validation reaches position 2100 (the current position of the
+;; character that was at 2000), we compare our current state with the
+;; cached state.  If they are the same, then we can stop parsing
+;; immediately and set rng-validate-up-to-date-end to the end of the
+;; buffer: we already know that the state cached at position 3100 is
+;; correct.  If they are not the same, then we have to continue
+;; parsing.  After the change, but before revalidation, we call the
+;; region from 1600 to the end of the buffer "conditionally
+;; up-to-date".
+;;
+;; As well as the cached parsing and validation state, we also keep
+;; track of the errors in the file.  Errors are stored as overlays
+;; with a category of rng-error.  The number of such overlays in the
+;; buffer must always be equal to rng-error-count.
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-enc)
+(require 'nxml-util)
+(require 'nxml-ns)
+(require 'rng-match)
+(require 'rng-util)
+(require 'rng-loc)
+
+;;; Customizable variables
+
+(defgroup relax-ng nil
+  "Validation of XML using RELAX NG."
+  :group 'wp
+  :group 'nxml
+  :group 'languages)
+
+(defface rng-error-face '((t (:underline "red")))
+  "Face for highlighting XML errors."
+  :group 'relax-ng)
+
+(defcustom rng-state-cache-distance 2000
+  "*Distance in characters between each parsing and validation state cache."
+  :type 'integer
+  :group 'relax-ng)
+
+(defcustom rng-validate-chunk-size 8000
+  "*Number of characters in a RELAX NG validation chunk.
+A validation chunk will be the smallest chunk that is at least this
+size and ends with a tag.  After validating a chunk, validation will
+continue only if Emacs is still idle."
+  :type 'integer
+  :group 'relax-ng)
+
+(defcustom rng-validate-delay 1.5
+  "*Time in seconds that Emacs must be idle before starting a full validation.
+A full validation continues until either validation is up to date
+or Emacs is no longer idle."
+  :type 'number
+  :group 'relax-ng)
+
+(defcustom rng-validate-quick-delay 0.3
+  "*Time in seconds that Emacs must be idle before starting a quick validation.
+A quick validation validates at most one chunk."
+  :type 'number
+  :group 'relax-ng)
+
+;; Global variables
+
+(defvar rng-validate-timer nil)
+(make-variable-buffer-local 'rng-validate-timer)
+;; ensure that we can cancel the timer even after a kill-all-local-variables
+(put 'rng-validate-timer 'permanent-local t)
+
+(defvar rng-validate-quick-timer nil)
+(make-variable-buffer-local 'rng-validate-quick-timer)
+;; ensure that we can cancel the timer even after a kill-all-local-variables
+(put 'rng-validate-quick-timer 'permanent-local t)
+
+(defvar rng-error-count nil
+  "Number of errors in the current buffer.  Always equal to number of
+overlays with category rng-error.")
+(make-variable-buffer-local 'rng-error-count)
+
+(defvar rng-message-overlay nil
+  "Overlay in this buffer whose help-echo property was last printed.
+Nil if none.")
+(make-variable-buffer-local 'rng-message-overlay)
+
+(defvar rng-message-overlay-inhibit-point nil
+  "Position at which message from overlay should be inhibited.
+If point is equal to this and the error overlay around
+point is `rng-message-overlay', then the `help-echo' property
+of the error overlay should not be printed with `message'.")
+(make-variable-buffer-local 'rng-message-overlay-inhibit-point)
+
+(defvar rng-message-overlay-current nil
+  "Non-nil if `rng-message-overlay' is still the current message.")
+(make-variable-buffer-local 'rng-message-overlay-current)
+
+(defvar rng-open-elements nil
+  "Stack of names of open elements represented as a list.
+Each member of the list is either t or a (PREFIX . LOCAL-NAME) pair.
+\(PREFIX . LOCAL-NAME) is pushed for a start-tag; t is pushed
+for a mismatched end-tag.")
+
+(defvar rng-pending-contents nil
+  "Text content of current element that has yet to be processed.
+Value is a list of segments (VALUE START END) positions in reverse
+order.  VALUE is a string or nil.  If VALUE is nil, then the value is
+the string between START and END.  A segment can also be nil
+indicating an unresolvable entity or character reference.")
+
+(defvar rng-collecting-text nil)
+
+(defvar rng-validate-up-to-date-end nil
+  "Last position where validation is known to be up to date.")
+(make-variable-buffer-local 'rng-validate-up-to-date-end)
+
+(defvar rng-conditional-up-to-date-start nil
+  "Marker for the start of the conditionally up-to-date region.
+Nil if there is no conditionally up-to-date region.  The conditionally
+up-to-date region must be such that for any cached state S with
+position P in the conditionally up-to-date region, if at some point it
+is determined that S becomes correct for P, then all states with
+position >= P in the conditionally up to date region must also then be
+correct and all errors between P and the end of the region must then
+be correctly marked.")
+(make-variable-buffer-local 'rng-conditional-up-to-date-start)
+
+(defvar rng-conditional-up-to-date-end nil
+  "Marker for the end of the conditionally up-to-date region.
+Nil if there is no conditionally up-to-date region.  See the variable
+`rng-conditional-up-to-date-start'.")
+(make-variable-buffer-local 'rng-conditional-up-to-date-end)
+
+(defvar rng-parsing-for-state nil
+  "Non-nil means we are currently parsing just to compute the state.
+Should be dynamically bound.")
+
+(defvar rng-validate-mode nil)
+(make-variable-buffer-local 'rng-validate-mode)
+
+(defvar rng-dtd nil)
+(make-variable-buffer-local 'rng-dtd)
+
+;;;###autoload
+(defun rng-validate-mode (&optional arg no-change-schema)
+  "Minor mode performing continual validation against a RELAX NG schema.
+
+Checks whether the buffer is a well-formed XML 1.0 document,
+conforming to the XML Namespaces Recommendation and valid against a
+RELAX NG schema. The mode-line indicates whether it is or not.  Any
+parts of the buffer that cause it not to be are considered errors and
+are highlighted with `rng-error-face'. A description of each error is
+available as a tooltip.  \\[rng-next-error] goes to the next error
+after point. Clicking mouse-1 on the word `Invalid' in the mode-line
+goes to the first error in the buffer. If the buffer changes, then it
+will be automatically rechecked when Emacs becomes idle; the
+rechecking will be paused whenever there is input pending..
+
+By default, uses a vacuous schema that allows any well-formed XML
+document. A schema can be specified explictly using
+\\[rng-set-schema-file-and-validate], or implicitly based on the buffer's
+file name or on the root element name.  In each case the schema must
+be a RELAX NG schema using the compact schema \(such schemas
+conventionally have a suffix of `.rnc').  The variable
+`rng-schema-locating-files' specifies files containing rules
+to use for finding the schema."
+  (interactive "P")
+  (setq rng-validate-mode
+       (if (null arg)
+           (not rng-validate-mode)
+         (> (prefix-numeric-value arg) 0)))
+  (save-restriction
+    (widen)
+    (nxml-with-unmodifying-text-property-changes
+      (rng-clear-cached-state (point-min) (point-max)))
+    ;; 1+ to clear empty overlays at (point-max)
+    (rng-clear-overlays (point-min) (1+ (point-max))))
+  (setq rng-validate-up-to-date-end 1)
+  (rng-clear-conditional-region)
+  (setq rng-error-count 0)
+  ;; do this here to avoid infinite loop if we set the schema
+  (remove-hook 'rng-schema-change-hook 'rng-validate-clear t)
+  (cond (rng-validate-mode
+        (unwind-protect
+            (save-excursion
+              ;; An error can change the current buffer
+              (when (or (not rng-current-schema)
+                        (and (eq rng-current-schema rng-any-element)
+                             (not no-change-schema)))
+                (rng-auto-set-schema t)))
+          (unless rng-current-schema (rng-set-schema-file-1 nil))
+          (add-hook 'rng-schema-change-hook 'rng-validate-clear nil t)
+          (add-hook 'after-change-functions 'rng-after-change-function nil t)
+          (add-hook 'kill-buffer-hook 'rng-kill-timers nil t)
+          (add-hook 'echo-area-clear-hook 'rng-echo-area-clear-function nil t)
+          (add-hook 'post-command-hook 'rng-maybe-echo-error-at-point nil t)
+          (rng-match-init-buffer)
+          (rng-activate-timers)
+          ;; Start validating right away if the buffer is visible.
+          ;; If it's not visible, don't do this, because the user
+          ;; won't get any progress indication. When the user finds
+          ;; a new file, then the buffer won't be visible
+          ;; when this is invoked.
+          (when (get-buffer-window (current-buffer) 'visible)
+            (rng-validate-while-idle (current-buffer)))))
+       (t
+        (rng-cancel-timers)
+        (force-mode-line-update)
+        (remove-hook 'kill-buffer-hook 'rng-cancel-timers t)
+        (remove-hook 'post-command-hook 'rng-maybe-echo-error-at-point t)
+        (remove-hook 'echo-area-clear-hook 'rng-echo-area-clear-function t)
+        (remove-hook 'after-change-functions 'rng-after-change-function t))))
+
+(defun rng-set-schema-file-and-validate (filename)
+  "Sets the schema and turns on `rng-validate-mode' if not already on.
+The schema is set like `rng-set-schema'."
+  (interactive "fSchema file: ")
+  (rng-set-schema-file filename)
+  (or rng-validate-mode (rng-validate-mode)))
+
+(defun rng-set-document-type-and-validate (type-id)
+  (interactive (list (rng-read-type-id)))
+  (and (rng-set-document-type type-id)
+       (or rng-validate-mode (rng-validate-mode))))
+    
+(defun rng-auto-set-schema-and-validate ()
+  "Set the schema for this buffer automatically and turn on `rng-validate-mode'.
+The schema is set like `rng-auto-set-schema'."
+  (interactive)
+  (rng-auto-set-schema)
+  (or rng-validate-mode (rng-validate-mode)))
+
+(defun rng-after-change-function (start end pre-change-len)
+  ;; Work around bug in insert-file-contents.
+  (when (> end (1+ (buffer-size)))
+    (setq start 1)
+    (setq end (1+ (buffer-size))))
+  (setq rng-message-overlay-inhibit-point nil)
+  (nxml-with-unmodifying-text-property-changes
+    (rng-clear-cached-state start end))
+  ;; rng-validate-up-to-date-end holds the position before the change
+  ;; Adjust it to reflect the change.
+  (if (< start rng-validate-up-to-date-end)
+      (setq rng-validate-up-to-date-end
+           (if (<= (+ start pre-change-len) rng-validate-up-to-date-end)
+               (+ rng-validate-up-to-date-end
+                  (- end start pre-change-len))
+             start)))
+  ;; Adjust the conditional zone
+  (cond (rng-conditional-up-to-date-start
+        (when (< rng-conditional-up-to-date-start end)
+          (if (< end rng-conditional-up-to-date-end)
+              (set-marker rng-conditional-up-to-date-start end)
+            (rng-clear-conditional-region))))
+       ((< end rng-validate-up-to-date-end)
+        (setq rng-conditional-up-to-date-end
+              (copy-marker rng-validate-up-to-date-end nil))
+        (setq rng-conditional-up-to-date-start
+              (copy-marker end t))))
+  ;; Adjust rng-validate-up-to-date-end
+  (if (< start rng-validate-up-to-date-end)
+      (setq rng-validate-up-to-date-end start))
+  ;; Must make rng-validate-up-to-date-end < point-max
+  ;; (unless the buffer is empty).
+  ;; otherwise validate-prepare will say there's nothing to do.
+  ;; Don't use (point-max) because we may be narrowed.
+  (if (> rng-validate-up-to-date-end (buffer-size))
+      (setq rng-validate-up-to-date-end
+           (max 1 (1- rng-validate-up-to-date-end))))
+  ;; Arrange to revalidate
+  (rng-activate-timers)
+  ;; Need to do this after activating the timer
+  (force-mode-line-update))
+
+(defun rng-compute-mode-line-string ()
+  (cond (rng-validate-timer
+        (concat " Validated:"
+                (number-to-string
+                 ;; Use floor rather than round because we want
+                 ;; to show 99% rather than 100% for changes near
+                 ;; the end.
+                 (floor (if (eq (buffer-size) 0)
+                            0.0
+                          (/ (* (- rng-validate-up-to-date-end 1) 100.0)
+                             (buffer-size)))))
+                "%%"))
+       ((> rng-error-count 0)
+        (concat " "
+                (propertize "Invalid"
+                            'help-echo "mouse-1: go to first error"
+                            'local-map (make-mode-line-mouse-map
+                                        'mouse-1
+                                        'rng-mouse-first-error))))
+       (t " Valid")))
+   
+(defun rng-cancel-timers ()
+  (let ((inhibit-quit t))
+    (when rng-validate-timer
+      (cancel-timer rng-validate-timer)
+      (setq rng-validate-timer nil))
+    (when rng-validate-quick-timer
+      (cancel-timer rng-validate-quick-timer)
+      (setq rng-validate-quick-timer nil))))
+
+(defun rng-kill-timers ()
+  ;; rng-validate-timer and rng-validate-quick-timer have the
+  ;; permanent-local property, so that the timers can be
+  ;; cancelled even after changing mode.
+  ;; This function takes care of cancelling the timers and
+  ;; then killing the local variables.
+  (when (local-variable-p 'rng-validate-timer)
+    (when rng-validate-timer
+      (cancel-timer rng-validate-timer))
+    (kill-local-variable 'rng-validate-timer))
+  (when (local-variable-p 'rng-validate-quick-timer)
+    (when rng-validate-quick-timer
+      (cancel-timer rng-validate-quick-timer))
+    (kill-local-variable 'rng-validate-quick-timer)))
+      
+(defun rng-activate-timers ()
+  (unless rng-validate-timer
+    (let ((inhibit-quit t))
+      (setq rng-validate-timer
+           (run-with-idle-timer rng-validate-delay
+                                t
+                                'rng-validate-while-idle
+                                (current-buffer)))
+      (setq rng-validate-quick-timer
+           (run-with-idle-timer rng-validate-quick-delay
+                                t
+                                'rng-validate-quick-while-idle
+                                (current-buffer))))))
+
+(defun rng-validate-clear ()
+  (rng-validate-mode 1 t))
+
+;; These two variables are dynamically bound and used
+;; to pass information between rng-validate-while-idle
+;; and rng-validate-while-idle-continue-p.
+
+(defvar rng-validate-display-point nil)
+(defvar rng-validate-display-modified-p nil)
+
+(defun rng-validate-while-idle-continue-p ()
+  ;; input-pending-p and sit-for run timers that are
+  ;; ripe.  Binding timer-idle-list to nil prevents
+  ;; this.  If we don't do this, then any ripe timers
+  ;; will get run, and we won't get any chance to
+  ;; validate until Emacs becomes idle again or until
+  ;; the other lower priority timers finish (which
+  ;; can take a very long time in the case of
+  ;; jit-lock).
+  (let ((timer-idle-list nil))
+    (and (not (input-pending-p))
+        ;; Fake rng-validate-up-to-date-end so that the mode line
+        ;; shows progress.  Also use this to save point.
+        (let ((rng-validate-up-to-date-end (point)))
+          (goto-char rng-validate-display-point)
+          (when (not rng-validate-display-modified-p)
+            (restore-buffer-modified-p nil))
+          (force-mode-line-update)
+          (let ((continue (sit-for 0)))
+            (goto-char rng-validate-up-to-date-end)
+            continue)))))
+
+;; Calling rng-do-some-validation once with a continue-p function, as
+;; opposed to calling it repeatedly, helps on initial validation of a
+;; large buffer with lots of errors.  The overlays for errors will all
+;; get added when rng-do-some-validation returns and won't slow the
+;; validation process down.
+
+(defun rng-validate-while-idle (buffer)
+  (with-current-buffer buffer
+    (if rng-validate-mode
+       (if (let ((rng-validate-display-point (point))
+                 (rng-validate-display-modified-p (buffer-modified-p)))
+             (rng-do-some-validation 'rng-validate-while-idle-continue-p))
+           (force-mode-line-update)
+         (rng-validate-done))
+      ;; must have done kill-all-local-variables
+      (rng-kill-timers))))
+
+(defun rng-validate-quick-while-idle (buffer)
+  (with-current-buffer buffer
+    (if rng-validate-mode
+       (if (rng-do-some-validation)
+           (force-mode-line-update)
+         (rng-validate-done))
+      ;; must have done kill-all-local-variables
+      (rng-kill-timers))))
+
+(defun rng-validate-done ()
+  (when (or (not (current-message))
+           (rng-current-message-from-error-overlay-p))
+    (rng-error-overlay-message (or (rng-error-overlay-after (point)) 
+                                  (rng-error-overlay-after (1- (point))))))
+  (rng-cancel-timers)
+  (force-mode-line-update))
+
+(defun rng-do-some-validation (&optional continue-p-function)
+  "Do some validation work. Return t if more to do, nil otherwise."
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-invisible-motion
+       (condition-case err
+           (and (rng-validate-prepare)
+                (let ((rng-dt-namespace-context-getter '(nxml-ns-get-context)))
+                  (nxml-with-unmodifying-text-property-changes
+                    (rng-do-some-validation-1 continue-p-function))))
+         ;; errors signalled from a function run by an idle timer
+         ;; are ignored; if we don't catch them, validation
+         ;; will get mysteriously stuck at a single place
+         (rng-compile-error
+          (message "Incorrect schema. %s" (nth 1 err))
+          (rng-validate-mode 0)
+          nil)
+         (error
+          (message "Internal error in rng-validate-mode triggered at buffer position %d. %s"
+                   (point)
+                   (error-message-string err))
+          (rng-validate-mode 0)
+          nil))))))
+
+(defun rng-validate-prepare ()
+  "Prepare to do some validation, initializing point and the state.
+Return t if there is work to do, nil otherwise."
+  (cond ((= rng-validate-up-to-date-end (point-min))
+        (rng-set-initial-state)
+        t)
+       ((= rng-validate-up-to-date-end (point-max))
+        nil)
+       (t (let ((state (get-text-property (1- rng-validate-up-to-date-end)
+                                          'rng-state)))
+            (cond (state
+                   (rng-restore-state state)
+                   (goto-char rng-validate-up-to-date-end))
+                  (t
+                   (let ((pos (previous-single-property-change
+                               rng-validate-up-to-date-end
+                               'rng-state)))
+                     (cond (pos
+                            (rng-restore-state
+                             (or (get-text-property (1- pos) 'rng-state)
+                                 (error "Internal error: state null")))
+                            (goto-char pos))
+                           (t (rng-set-initial-state))))))))))
+
+
+(defun rng-do-some-validation-1 (&optional continue-p-function)
+  (let ((limit (+ rng-validate-up-to-date-end
+                 rng-validate-chunk-size))
+       (remove-start rng-validate-up-to-date-end)
+       (next-cache-point (+ (point) rng-state-cache-distance))
+       (continue t)
+       (xmltok-dtd rng-dtd)
+       have-remaining-chars
+       xmltok-type
+       xmltok-start
+       xmltok-name-colon
+       xmltok-name-end
+       xmltok-replacement
+       xmltok-attributes
+       xmltok-namespace-attributes
+       xmltok-dependent-regions
+       xmltok-errors)
+    (when (= (point) 1)
+      (let ((regions (xmltok-forward-prolog)))
+       (rng-clear-overlays 1 (point))
+       (while regions
+         (when (eq (aref (car regions) 0) 'encoding-name)
+           (rng-process-encoding-name (aref (car regions) 1)
+                                      (aref (car regions) 2)))
+         (setq regions (cdr regions))))
+      (unless (equal rng-dtd xmltok-dtd)
+       (rng-clear-conditional-region))
+      (setq rng-dtd xmltok-dtd))
+    (while continue
+      (setq have-remaining-chars (rng-forward))
+      (let ((pos (point)))
+       (setq continue
+             (and have-remaining-chars
+                  (or (< pos limit)
+                      (and continue-p-function
+                           (funcall continue-p-function)
+                           (setq limit (+ limit rng-validate-chunk-size))
+                           t))))
+       (cond ((and rng-conditional-up-to-date-start
+                   ;; > because we are getting the state from (1- pos)
+                   (> pos rng-conditional-up-to-date-start)
+                   (< pos rng-conditional-up-to-date-end)
+                   (rng-state-matches-current (get-text-property (1- pos)
+                                                                 'rng-state)))
+              (when (< remove-start (1- pos))
+                (rng-clear-cached-state remove-start (1- pos)))
+              ;; sync up with cached validation state
+              (setq continue nil)
+              ;; do this before settting rng-validate-up-to-date-end
+              ;; in case we get a quit
+              (rng-mark-xmltok-errors)
+              (rng-mark-xmltok-dependent-regions)
+              (setq rng-validate-up-to-date-end
+                    (marker-position rng-conditional-up-to-date-end))
+              (rng-clear-conditional-region)
+              (setq have-remaining-chars
+                    (< rng-validate-up-to-date-end (point-max))))
+             ((or (>= pos next-cache-point)
+                  (not continue))
+              (setq next-cache-point (+ pos rng-state-cache-distance))
+              (rng-clear-cached-state remove-start pos)
+              (when have-remaining-chars
+                (rng-cache-state (1- pos)))
+              (setq remove-start pos)
+              (unless continue
+                ;; if we have just blank chars skip to the end
+                (when have-remaining-chars
+                  (skip-chars-forward " \t\r\n")
+                  (when (= (point) (point-max))
+                    (rng-clear-overlays pos (point))
+                    (rng-clear-cached-state pos (point))
+                    (setq have-remaining-chars nil)
+                    (setq pos (point))))
+                (when (not have-remaining-chars)
+                  (rng-process-end-document))
+                (rng-mark-xmltok-errors)
+                (rng-mark-xmltok-dependent-regions)
+                (setq rng-validate-up-to-date-end pos)
+                (when rng-conditional-up-to-date-end
+                  (cond ((<= rng-conditional-up-to-date-end pos)
+                         (rng-clear-conditional-region))
+                        ((< rng-conditional-up-to-date-start pos)
+                         (set-marker rng-conditional-up-to-date-start
+                                     pos)))))))))
+    have-remaining-chars))
+    
+(defun rng-clear-conditional-region ()
+  (when rng-conditional-up-to-date-start
+    (set-marker rng-conditional-up-to-date-start nil)
+    (setq rng-conditional-up-to-date-start nil))
+  (when rng-conditional-up-to-date-end
+    (set-marker rng-conditional-up-to-date-end nil)
+    (setq rng-conditional-up-to-date-end nil)))
+
+(defun rng-clear-cached-state (start end)
+  "Clear cached state between START and END."
+  (remove-text-properties start end '(rng-state nil)))
+
+(defun rng-cache-state (pos)
+  "Save the current state in a text property on the character at pos."
+  (put-text-property pos
+                    (1+ pos)
+                    'rng-state
+                    (rng-get-state)))
+
+(defun rng-state-matches-current (state)
+  (and state
+       (rng-match-state-equal (car state))
+       (nxml-ns-state-equal (nth 1 state))
+       (equal (nth 2 state) rng-open-elements)))
+
+(defun rng-get-state ()
+  (list (rng-match-state)
+       (nxml-ns-state)
+       rng-open-elements))
+
+(defun rng-restore-state (state)
+  (rng-set-match-state (car state))
+  (setq state (cdr state))
+  (nxml-ns-set-state (car state))
+  (setq rng-open-elements (cadr state))
+  (setq rng-pending-contents nil)
+  (setq rng-collecting-text (rng-match-text-typed-p)))
+
+(defun rng-set-initial-state ()
+  (nxml-ns-init)
+  (rng-match-start-document)
+  (setq rng-open-elements nil)
+  (setq rng-pending-contents nil)
+  (goto-char (point-min)))
+
+(defun rng-clear-overlays (beg end)
+  (unless rng-parsing-for-state
+    (let ((overlays (overlays-in beg end)))
+      (while overlays
+       (let* ((overlay (car overlays))
+              (category (overlay-get overlay 'category)))
+         (cond ((eq category 'rng-error)
+                (let ((inhibit-quit t))
+                  (when (eq overlay rng-message-overlay)
+                    (rng-error-overlay-message nil))
+                  (delete-overlay overlay)
+                  ;; rng-error-count could be nil
+                  ;; if overlays left over from a previous use
+                  ;; of rng-validate-mode that ended with a change of mode
+                  (when rng-error-count
+                    (setq rng-error-count (1- rng-error-count)))))
+               ((and (eq category 'rng-dependent)
+                     (<= beg (overlay-start overlay)))
+                (delete-overlay overlay))))
+       (setq overlays (cdr overlays))))))
+
+;;; Dependent regions
+
+(defun rng-mark-xmltok-dependent-regions ()
+  (while xmltok-dependent-regions
+    (apply 'rng-mark-xmltok-dependent-region
+          (car xmltok-dependent-regions))
+    (setq xmltok-dependent-regions
+         (cdr xmltok-dependent-regions))))
+
+(defun rng-mark-xmltok-dependent-region (fun start end &rest args)
+  (let ((overlay (make-overlay start end nil t t)))
+    (overlay-put overlay 'category 'rng-dependent)
+    (overlay-put overlay 'rng-funargs (cons fun args))))
+
+(put 'rng-dependent 'evaporate t)
+(put 'rng-dependent 'modification-hooks '(rng-dependent-region-changed))
+(put 'rng-dependent 'insert-behind-hooks '(rng-dependent-region-changed))
+
+(defun rng-dependent-region-changed (overlay
+                                    after-p
+                                    change-start
+                                    change-end
+                                    &optional pre-change-length)
+  (when (and after-p
+            ;; Emacs sometimes appears to call deleted overlays
+            (overlay-start overlay)
+            (let ((funargs (overlay-get overlay 'rng-funargs)))
+              (save-match-data
+                (save-excursion
+                  (save-restriction
+                    (widen)
+                    (apply (car funargs)
+                           (append (list change-start
+                                         change-end
+                                         pre-change-length
+                                         (overlay-start overlay)
+                                         (overlay-end overlay))
+                                   (cdr funargs))))))))
+    (rng-after-change-function (overlay-start overlay)
+                              change-end
+                              (+ pre-change-length
+                                 (- (overlay-start overlay)
+                                    change-start)))
+    (delete-overlay overlay)))
+
+;;; Error state
+
+(defun rng-mark-xmltok-errors ()
+  (while xmltok-errors
+    (let ((err (car xmltok-errors)))
+      (rng-mark-not-well-formed (xmltok-error-message err)
+                               (xmltok-error-start err)
+                               (xmltok-error-end err)))
+    (setq xmltok-errors (cdr xmltok-errors))))
+
+(defun rng-mark-invalid (message beg end)
+  (rng-mark-error message beg end))
+
+(defun rng-mark-not-well-formed (message beg end)
+  ;; Don't try to validate further
+  ;;(rng-set-match-state rng-not-allowed-ipattern)
+  (rng-mark-error message beg end))
+
+(defun rng-mark-error (message beg end)
+  (unless rng-parsing-for-state
+    (let ((overlays (overlays-in beg end)))
+      (while (and overlays message)
+       (let ((o (car overlays)))
+         (when (and (eq (overlay-get o 'category) 'rng-error)
+                    (= (overlay-start o) beg)
+                    (= (overlay-end o) end))
+           (overlay-put o
+                        'help-echo
+                        (concat (overlay-get o 'help-echo)
+                                "\n"
+                                message))
+           (setq message nil)))
+       (setq overlays (cdr overlays))))
+    (when message
+      (let ((inhibit-quit t))
+       (setq rng-error-count (1+ rng-error-count))
+       (let ((overlay
+              (make-overlay beg end nil t
+                            ;; Need to make the rear delimiter advance
+                            ;; with the front delimiter when the overlay
+                            ;; is empty, otherwise the front delimiter
+                            ;; will move past the rear delimiter.
+                            (= beg end))))
+         ;; Ensure when we have two overlapping messages, the help-echo
+         ;; of the one that starts first is shown
+         (overlay-put overlay 'priority beg)
+         (overlay-put overlay 'category 'rng-error)
+         (overlay-put overlay 'help-echo message))))))
+
+(put 'rng-error 'face 'rng-error-face)
+(put 'rng-error 'modification-hooks '(rng-error-modified))
+
+;; If we don't do this, then the front delimiter can move
+;; past the end delimiter.
+(defun rng-error-modified (overlay after-p beg end &optional pre-change-len)
+  (when (and after-p
+            (overlay-start overlay)    ; check not deleted
+            (>= (overlay-start overlay)
+                (overlay-end overlay)))
+    (let ((inhibit-quit t))
+      (delete-overlay overlay)
+      (setq rng-error-count (1- rng-error-count)))))
+
+(defun rng-echo-area-clear-function ()
+  (setq rng-message-overlay-current nil))
+
+;;; Error navigation
+            
+(defun rng-maybe-echo-error-at-point ()
+  (when (or (not (current-message))
+           (rng-current-message-from-error-overlay-p))
+    (rng-error-overlay-message (rng-error-overlay-after (point)))))
+
+(defun rng-error-overlay-after (pos)
+  (let ((overlays (overlays-in pos (1+ pos)))
+       (best nil))
+    (while overlays
+      (let ((overlay (car overlays)))
+       (when (and (eq (overlay-get overlay 'category)
+                      'rng-error)
+                  (or (not best)
+                      (< (overlay-start best)
+                         (overlay-start overlay))))
+         (setq best overlay)))
+      (setq overlays (cdr overlays)))
+    best))
+
+(defun rng-first-error ()
+  "Go to the first validation error.
+Turn on `rng-validate-mode' if it is not already on."
+  (interactive)
+  (or rng-validate-mode (rng-validate-mode))
+  (when (and (eq rng-validate-up-to-date-end 1)
+            (< rng-validate-up-to-date-end (point-max)))
+    (rng-do-some-validation))
+  (let ((err (rng-find-next-error-overlay (1- (point-min)))))
+    (if err
+       (rng-goto-error-overlay err)
+      (let ((pos (save-excursion
+                  (goto-char (point-min))
+                  (rng-next-error 1))))
+       (when pos
+         (goto-char pos))))))
+
+(defun rng-mouse-first-error (event)
+  "Go to the first validation error from a mouse click."
+  (interactive "e")
+  (select-window (posn-window (event-start event)))
+  (rng-first-error))
+
+(defun rng-next-error (arg)
+  "Go to the next validation error after point.
+Turn on `rng-validate-mode' if it is not already on.
+A prefix ARG specifies how many errors to move. A negative ARG
+moves backwards. Just \\[universal-argument] as a prefix
+means goto the first error."
+  (interactive "P")
+  (if (consp arg)
+      (rng-first-error)
+    (or rng-validate-mode (rng-validate-mode))
+    (setq arg (prefix-numeric-value arg))
+    (if (< arg 0)
+       (rng-previous-error-1 (- arg))
+      (rng-next-error-1 arg))))
+
+(defun rng-previous-error (arg)
+  "Go to the previous validation error before point.
+Turn on `rng-validate-mode' if it is not already on.
+A prefix ARG specifies how many errors to move. A negative ARG
+moves forwards. Just \\[universal-argument] as a prefix
+means goto the first error."
+  (interactive "P")
+  (if (consp arg)
+      (rng-first-error)
+    (or rng-validate-mode (rng-validate-mode))
+    (setq arg (prefix-numeric-value arg))
+    (if (< arg 0)
+       (rng-next-error-1 (- arg))
+      (rng-previous-error-1 arg))))
+
+(defun rng-next-error-1 (arg)
+  (let* ((pos (point))
+        err last-err)
+    (while (and (> arg 0)
+               (setq err (rng-find-next-error-overlay pos)))
+      (setq arg (1- arg))
+      (setq last-err err)
+      (setq pos (overlay-start err)))
+    (when (> arg 0)
+      (setq pos (max pos (1- rng-validate-up-to-date-end)))      
+      (when (< rng-validate-up-to-date-end (point-max))
+       (message "Parsing...")
+       (while (let ((more-to-do (rng-do-some-validation)))
+                (while (and (> arg 0)
+                            (setq err (rng-find-next-error-overlay pos)))
+                  (setq arg (1- arg))
+                  (setq last-err err)
+                  (setq pos (overlay-start err)))
+                (when (and (> arg 0)
+                           more-to-do
+                           (< rng-validate-up-to-date-end (point-max)))
+                  ;; Display percentage validated.
+                  (force-mode-line-update)
+                  ;; Force redisplay but don't allow idle timers to run.
+                  (let ((timer-idle-list nil))
+                    (sit-for 0))
+                  (setq pos
+                        (max pos (1- rng-validate-up-to-date-end)))
+                  t)))))
+    (if last-err
+       (rng-goto-error-overlay last-err)
+      (message "No more errors")
+      nil)))
+
+(defun rng-previous-error-1 (arg)
+  (let* ((pos (point))
+        err last-err)
+    (while (and (> arg 0)
+               (setq err (rng-find-previous-error-overlay pos)))
+      (setq pos (overlay-start err))
+      (setq last-err err)
+      (setq arg (1- arg)))
+    (when (and (> arg 0)
+              (< rng-validate-up-to-date-end (min pos (point-max))))
+      (message "Parsing...")
+      (while (and (rng-do-some-validation)
+                 (< rng-validate-up-to-date-end (min pos (point-max))))
+       (force-mode-line-update)
+       ;; Force redisplay but don't allow idle timers to run.
+       (let ((timer-idle-list nil))
+         (sit-for 0)))
+      (while (and (> arg 0)
+                 (setq err (rng-find-previous-error-overlay pos)))
+       (setq pos (overlay-start err))
+       (setq last-err err)
+       (setq arg (1- arg))))
+    (if last-err
+       (rng-goto-error-overlay last-err)
+      (message "No previous errors")
+      nil)))
+      
+(defun rng-goto-error-overlay (err)
+  "Goto the start of error overlay ERR and print its message."
+  (goto-char (overlay-start err))
+  (setq rng-message-overlay-inhibit-point nil)
+  (rng-error-overlay-message err))
+
+(defun rng-error-overlay-message (err)
+  (if err
+      (unless (or (and (eq rng-message-overlay-inhibit-point (point))
+                      (eq rng-message-overlay err))
+                 (= (point-max) 1))
+       (message "%s" (overlay-get err 'help-echo))
+       (setq rng-message-overlay-current t)
+       (setq rng-message-overlay-inhibit-point (point)))
+    (when (rng-current-message-from-error-overlay-p)
+      (message nil))
+    (setq rng-message-overlay-inhibit-point nil))
+  (setq rng-message-overlay err))
+
+(defun rng-current-message-from-error-overlay-p ()
+  (and rng-message-overlay-current
+       rng-message-overlay
+       (equal (overlay-get rng-message-overlay 'help-echo)
+             (current-message))))
+
+(defun rng-find-next-error-overlay (pos)
+  "Return the overlay for the next error starting after POS.
+Return nil if there is no such overlay or it is out of date.
+Do not do any additional validation."
+  (when rng-error-count
+    (let (done found overlays)
+      (while (not done)
+       (cond (overlays
+              (let ((overlay (car overlays)))
+                (setq overlays (cdr overlays))
+                (when (and (eq (overlay-get overlay 'category) 'rng-error)
+                           ;; Is it the first?
+                           (= (overlay-start overlay) pos)
+                           ;; Is it up to date?
+                           (<= (overlay-end overlay)
+                               rng-validate-up-to-date-end))
+                  (setq done t)
+                  (setq found overlay))))
+             ((or (= pos (point-max))
+                  (> (setq pos (next-overlay-change pos))
+                     rng-validate-up-to-date-end))
+              (setq done t))
+             (t (setq overlays (overlays-in pos (1+ pos))))))
+      found)))
+
+(defun rng-find-previous-error-overlay (pos)
+  "Return the overlay for the last error starting before POS.
+Return nil if there is no such overlay or it is out of date.
+Do not do any additional validation."
+  (when (and rng-error-count
+            (<= pos rng-validate-up-to-date-end))
+    (let (done found overlays)
+      (while (not done)
+       (cond (overlays
+              (let ((overlay (car overlays)))
+                (setq overlays (cdr overlays))
+                (when (and (eq (overlay-get overlay 'category) 'rng-error)
+                           ;; Is it the first?
+                           (= (overlay-start overlay) pos))
+                  (setq done t)
+                  (setq found overlay))))
+             ((= pos (point-min))
+              (setq done t))
+             (t
+              (setq pos (previous-overlay-change pos))
+              (setq overlays (overlays-in pos (1+ pos))))))
+      found)))
+
+;;; Parsing
+
+(defun rng-forward (&optional limit)
+  "Move forward over one or more tokens updating the state.
+If LIMIT is nil, stop after tags.
+If LIMIT is non-nil, stop when end of last token parsed is >= LIMIT.
+Return nil at end of buffer, t otherwise."
+  (let (type)
+    (while (progn
+            (setq type (xmltok-forward))
+            (rng-clear-overlays xmltok-start (point))
+            (let ((continue
+                   (cond ((eq type 'start-tag)
+                          (rng-process-start-tag 'start-tag)
+                          nil)
+                         ((eq type 'end-tag)
+                          (rng-process-end-tag)
+                          nil)
+                         ((eq type 'empty-element)
+                          (rng-process-start-tag 'empty-element)
+                          nil)
+                         ((eq type 'space)
+                          (rng-process-text xmltok-start nil t)
+                          t)
+                         ((eq type 'data)
+                          (rng-process-text xmltok-start nil nil)
+                          t)
+                         ((memq type '(entity-ref char-ref))
+                          (cond (xmltok-replacement
+                                 (rng-process-text xmltok-start
+                                                   nil
+                                                   'maybe
+                                                   xmltok-replacement))
+                                ((eq type 'char-ref)
+                                 (rng-process-unknown-char))
+                                (t
+                                 (rng-process-unknown-entity)))
+                          t)
+                         ((eq type 'cdata-section)
+                          (rng-process-text (+ xmltok-start 9) ; "<![CDATA["
+                                            (- (point) 3) ; "]]>"
+                                            'maybe)
+                          t)
+                         ((eq type 'partial-start-tag)
+                          (rng-process-start-tag 'partial-start-tag)
+                          t)
+                         ((eq type 'partial-empty-element)
+                          (rng-process-start-tag 'empty-element)
+                          t)
+                         ((eq type 'partial-end-tag)
+                          (rng-process-end-tag 'partial)
+                          t)
+                         (t type))))
+              (if limit
+                  (< (point) limit)
+                continue))))
+    (and type t)))
+
+(defun rng-process-start-tag (tag-type)
+  "TAG-TYPE is `start-tag' for a start-tag, `empty-element' for
+an empty element.  partial-empty-element should be passed
+as empty-element."
+  (and rng-collecting-text (rng-flush-text))
+  (setq rng-collecting-text nil)
+  (setq rng-pending-contents nil)
+  (rng-process-namespaces)
+  (let ((tag (rng-process-tag-name)))
+    (rng-process-attributes)
+    ;; set the state appropriately
+    (cond ((eq tag-type 'empty-element)
+          (rng-process-start-tag-close)
+          ;; deal with missing content with empty element
+          (when (not (rng-match-empty-content))
+            (rng-match-after)
+            (rng-mark-start-tag-close "Empty content not allowed"))
+          (nxml-ns-pop-state))
+         ((eq tag-type 'start-tag)
+          (rng-process-start-tag-close)
+          (setq rng-collecting-text (rng-match-text-typed-p))
+          (rng-push-tag tag))
+         ((eq tag-type 'partial-start-tag)
+          (rng-process-start-tag-close)
+          (rng-match-after)
+          (nxml-ns-pop-state)))))
+
+(defun rng-process-namespaces ()
+  (let ((nsatts xmltok-namespace-attributes)
+       prefixes)
+    (nxml-ns-push-state)
+    (while nsatts
+      (let* ((att (car nsatts))
+            (value (xmltok-attribute-value att)))
+       (when value
+         (let ((ns (nxml-make-namespace value))
+               (prefix (and (xmltok-attribute-prefix att)
+                            (xmltok-attribute-local-name att))))
+           (cond ((member prefix prefixes)
+                  (rng-mark-invalid "Duplicate namespace declaration"
+                                    (xmltok-attribute-name-start att)
+                                    (xmltok-attribute-name-end att)))
+                 ((not prefix)
+                  (nxml-ns-set-default ns))
+                 (ns
+                  (nxml-ns-set-prefix prefix ns))
+                 (t
+                  ;; cannot have xmlns:foo=""
+                  (rng-mark-invalid "Namespace prefix cannot be undeclared"
+                                    (1- (xmltok-attribute-value-start att))
+                                    (1+ (xmltok-attribute-value-end att)))))
+           (setq prefixes (cons prefix prefixes)))))
+      (setq nsatts (cdr nsatts)))))
+
+(defun rng-process-tag-name ()
+  (let* ((prefix (xmltok-start-tag-prefix))
+        (local-name (xmltok-start-tag-local-name))
+        (name
+         (if prefix
+             (let ((ns (nxml-ns-get-prefix prefix)))
+               (cond (ns (cons ns local-name))
+                     ((and (setq ns
+                                 (rng-match-infer-start-tag-namespace
+                                  local-name))
+                           (rng-match-start-tag-open (cons ns local-name)))
+                      (nxml-ns-set-prefix prefix ns)
+                      (rng-mark-start-tag-close "Missing xmlns:%s=\"%s\""
+                                                prefix
+                                                (nxml-namespace-name ns))
+                      nil)
+                     (t
+                      (rng-recover-bad-element-prefix)
+                      nil)))
+           (cons (nxml-ns-get-default) local-name))))
+    (when (and name
+              (not (rng-match-start-tag-open name)))
+      (unless (and (not (car name))
+                  (let ((ns (rng-match-infer-start-tag-namespace (cdr name))))
+                    (and ns
+                         (rng-match-start-tag-open (cons ns local-name))
+                         (progn
+                           (nxml-ns-set-default ns)
+                           ;; XXX need to check we don't have xmlns=""
+                           (rng-mark-start-tag-close "Missing xmlns=\"%s\""
+                                                     (nxml-namespace-name ns))
+                           t))))
+       (rng-recover-start-tag-open name)))
+    (cons prefix local-name)))
+
+(defun rng-process-attributes ()
+  (let ((atts xmltok-attributes)
+       names)
+    (while atts
+      (let* ((att (car atts))
+            (prefix (xmltok-attribute-prefix att))
+            (local-name (xmltok-attribute-local-name att))
+            (name
+             (if prefix
+                 (let ((ns (nxml-ns-get-prefix prefix)))
+                   (and ns
+                        (cons ns local-name)))
+               (cons nil local-name))))
+       (cond ((not name)
+              (rng-recover-bad-attribute-prefix att))
+             ((member name names)
+              (rng-recover-duplicate-attribute-name att))
+             ((not (rng-match-attribute-name name))
+              (rng-recover-attribute-name att))
+             ((rng-match-text-typed-p)
+              (let ((value (xmltok-attribute-value att)))
+                (if value
+                    (or (rng-match-attribute-value value)
+                        (rng-recover-attribute-value att))
+                  (rng-match-after))))
+             (t (or (rng-match-end-tag)
+                    (error "Internal error:\
+ invalid on untyped attribute value"))))
+       (setq names (cons name names)))
+      (setq atts (cdr atts)))))
+
+(defun rng-process-start-tag-close ()
+  ;; deal with missing attributes
+  (unless (rng-match-start-tag-close)
+    (rng-mark-start-tag-close (rng-missing-attributes-message))
+    (rng-match-ignore-attributes)))
+
+(defun rng-mark-start-tag-close (&rest args)
+  (when (not (eq xmltok-type 'partial-start-tag))
+    (rng-mark-invalid (apply 'format args)
+                     (- (point)
+                        (if (eq xmltok-type 'empty-element)
+                            2
+                          1))
+                     (point))))
+
+(defun rng-recover-bad-element-prefix ()
+  (rng-mark-invalid "Prefix not declared"
+                   (1+ xmltok-start)
+                   xmltok-name-colon)
+  (rng-match-unknown-start-tag-open))
+
+(defun rng-recover-bad-attribute-prefix (att)
+  (rng-mark-invalid "Prefix not declared"
+                   (xmltok-attribute-name-start att)
+                   (xmltok-attribute-name-colon att)))
+
+(defun rng-recover-duplicate-attribute-name (att)
+  (rng-mark-invalid "Duplicate attribute"
+                   (xmltok-attribute-name-start att)
+                   (xmltok-attribute-name-end att)))
+
+(defun rng-recover-start-tag-open (name)
+  (let ((required (rng-match-required-element-name)))
+    (cond ((and required
+               (rng-match-start-tag-open required)
+               (rng-match-after)
+               (rng-match-start-tag-open name))
+          (rng-mark-invalid (concat "Missing element "
+                                    (rng-quote-string
+                                     (rng-name-to-string required)))
+                            xmltok-start
+                            (1+ xmltok-start)))
+         ((and (rng-match-optionalize-elements)
+               (rng-match-start-tag-open name))
+          (rng-mark-invalid "Required elements missing"
+                            xmltok-start
+                            (1+ xmltok-start)))
+         ((rng-match-out-of-context-start-tag-open name)
+          (rng-mark-invalid "Element not allowed in this context"
+                            (1+ xmltok-start)
+                            xmltok-name-end))
+         (t
+          (rng-match-unknown-start-tag-open)
+          (rng-mark-invalid "Unknown element"
+                            (1+ xmltok-start)
+                            xmltok-name-end)))))
+
+(defun rng-recover-attribute-value (att)
+  (let ((start (xmltok-attribute-value-start att))
+       (end (xmltok-attribute-value-end att)))
+    (if (= start end)
+       (rng-mark-invalid "Empty attribute value invalid" start (1+ end))
+      (rng-mark-invalid "Attribute value invalid" start end)))
+  (rng-match-after))
+
+(defun rng-recover-attribute-name (att)
+  (rng-mark-invalid "Attribute not allowed"
+                   (xmltok-attribute-name-start att)
+                   (xmltok-attribute-name-end att)))
+
+(defun rng-missing-attributes-message ()
+  (let ((required-attributes
+        (rng-match-required-attribute-names)))
+    (cond ((not required-attributes)
+          "Required attributes missing")
+         ((not (cdr required-attributes))
+          (concat "Missing attribute "
+                  (rng-quote-string
+                   (rng-name-to-string (car required-attributes) t))))
+         (t
+          (concat "Missing attributes "
+                  (mapconcat (lambda (nm)
+                               (rng-quote-string
+                                (rng-name-to-string nm t)))
+                             required-attributes
+                             ", "))))))
+      
+(defun rng-process-end-tag (&optional partial)
+  (cond ((not rng-open-elements)
+        (rng-mark-not-well-formed "Extra end-tag"
+                                  xmltok-start
+                                  (point)))
+       ((or partial
+            (equal (cons (xmltok-end-tag-prefix)
+                         (xmltok-end-tag-local-name))
+                   (car rng-open-elements)))
+        (rng-end-element))
+       (t (rng-recover-mismatched-end-tag))))
+
+(defun rng-end-element ()
+  (if rng-collecting-text
+      (let ((contents (rng-contents-string)))
+       (cond ((not contents) (rng-match-after))
+             ((not (rng-match-element-value contents))
+              (let* ((region (rng-contents-region)))
+                (if (not region)
+                    (rng-mark-invalid "Empty content not allowed"
+                                      xmltok-start
+                                      (+ xmltok-start 2))
+                  (rng-mark-invalid "Invalid data"
+                                    (car region)
+                                    (cdr region))))
+              (rng-match-after)))
+       (setq rng-collecting-text nil)
+       (setq rng-pending-contents nil))
+    (unless (rng-match-end-tag)
+       (rng-mark-invalid (rng-missing-element-message)
+                        xmltok-start
+                        (+ xmltok-start 2))
+       (rng-match-after)))
+  (nxml-ns-pop-state)
+  (when (eq (car rng-open-elements) t)
+    (rng-pop-tag))
+  (rng-pop-tag))
+
+(defun rng-missing-element-message ()
+  (let ((element (rng-match-required-element-name)))
+    (if element
+       (concat "Missing element "
+               (rng-quote-string (rng-name-to-string element)))
+      "Required child elements missing")))
+
+(defun rng-recover-mismatched-end-tag ()
+  (let* ((name (cons (xmltok-end-tag-prefix)
+                    (xmltok-end-tag-local-name))))
+    (cond ((member name (cdr rng-open-elements))
+          (let* ((suppress-error (eq (car rng-open-elements) t))
+                 missing top)
+            (while (progn
+                     (setq top (car rng-open-elements))
+                     (rng-pop-tag)
+                     (unless (eq top t)
+                       (setq missing (cons top missing))
+                       (nxml-ns-pop-state)
+                       (rng-match-after))
+                     (not (equal top name))))
+            (unless suppress-error
+              (rng-mark-missing-end-tags (cdr missing)))))
+         ((rng-match-empty-before-p)
+          (rng-mark-mismatched-end-tag)
+          (rng-end-element))
+         (t (rng-mark-mismatched-end-tag)
+            (setq rng-open-elements
+                  (cons t rng-open-elements))))))
+
+(defun rng-mark-missing-end-tags (missing)
+  (rng-mark-not-well-formed
+   (format "Missing end-tag%s %s"
+          (if (null (cdr missing)) "" "s")
+          (mapconcat (lambda (name)
+                       (rng-quote-string
+                        (if (car name)
+                            (concat (car name)
+                                    ":"
+                                    (cdr name))
+                          (cdr name))))
+                     missing
+                     ", "))
+   xmltok-start
+   (+ xmltok-start 2)))
+
+(defun rng-mark-mismatched-end-tag ()
+  (rng-mark-not-well-formed "Mismatched end-tag"
+                           (+ xmltok-start 2)
+                           xmltok-name-end))
+
+(defun rng-push-tag (prefix-local-name)
+  (setq rng-open-elements
+       (cons prefix-local-name rng-open-elements)))
+
+(defun rng-pop-tag ()
+  (setq rng-open-elements (cdr rng-open-elements)))
+
+(defun rng-contents-string ()
+  (let ((contents rng-pending-contents))
+    (cond ((not contents) "")
+         ((memq nil contents) nil)
+         ((not (cdr contents))
+          (rng-segment-string (car contents)))
+         (t (apply 'concat
+                   (nreverse (mapcar 'rng-segment-string
+                                     contents)))))))
+
+(defun rng-segment-string (segment)
+  (or (car segment)
+      (apply 'buffer-substring-no-properties
+            (cdr segment))))
+
+(defun rng-segment-blank-p (segment)
+  (if (car segment)
+      (rng-blank-p (car segment))
+    (apply 'rng-region-blank-p
+          (cdr segment))))
+
+(defun rng-contents-region ()
+  (if (null rng-pending-contents)
+      nil
+    (let* ((contents rng-pending-contents)
+          (head (cdar contents))
+          (start (car head))
+          (end (cadr head)))
+      (while (setq contents (cdr contents))
+       (setq start (car (cdar contents))))
+      (cons start end))))
+
+(defun rng-process-text (start end whitespace &optional value)
+  "Process characters between position START and END as text.
+END nil means point. WHITESPACE t means known to be whitespace, nil
+means known not to be, anything else means unknown whether whitespace
+or not. END must not be nil if WHITESPACE is neither t nor nil.
+VALUE is a string or nil; nil means the value is equal to the
+string between START and END."
+  (cond (rng-collecting-text
+        (setq rng-pending-contents (cons (list value start (or end (point)))
+                                         rng-pending-contents)))
+       ((not (or (and whitespace
+                      (or (eq whitespace t)
+                          (if value
+                              (rng-blank-p value)
+                            (rng-region-blank-p start end))))
+                 (rng-match-mixed-text)))
+        (rng-mark-invalid "Text not allowed" start (or end (point))))))
+
+(defun rng-process-unknown-char ()
+  (when rng-collecting-text
+    (setq rng-pending-contents
+         (cons nil rng-pending-contents))))
+
+(defun rng-process-unknown-entity ()
+  (rng-process-unknown-char)
+  (rng-match-optionalize-elements))
+
+(defun rng-region-blank-p (beg end)
+  (save-excursion
+    (goto-char beg)
+    (= (skip-chars-forward " \n\r\t" end)
+       (- end beg))))
+
+(defun rng-flush-text ()
+  (while rng-pending-contents
+    (let ((segment (car rng-pending-contents)))
+      (unless (or (rng-segment-blank-p segment)
+                 (rng-match-mixed-text))
+       (let ((region (cdr segment)))
+         (rng-mark-invalid "In this context text cannot be mixed with elements"
+                           (car region)
+                           (cadr region)))))
+    (setq rng-pending-contents (cdr rng-pending-contents))))
+
+(defun rng-process-end-document ()
+  ;; this is necessary to clear empty overlays at (point-max)
+  (rng-clear-overlays (point) (point))
+  (let ((start (save-excursion
+                (skip-chars-backward " \t\r\n")
+                (point))))
+    (cond (rng-open-elements
+          (unless (eq (car rng-open-elements) t)
+            (rng-mark-not-well-formed "Missing end-tag"
+                                      start
+                                      (point))))
+         ((not (rng-match-nullable-p))
+          (rng-mark-not-well-formed "No document element"
+                                    start
+                                    (point))))))
+
+(defun rng-process-encoding-name (beg end)
+  (unless (let ((charset (buffer-substring-no-properties beg end)))
+           (or (nxml-mime-charset-coding-system charset)
+               (string= (downcase charset) "utf-16")))
+    (rng-mark-not-well-formed "Unsupported encoding" beg end)))
+
+(defun rng-name-to-string (name &optional attributep)
+  (let ((ns (car name))
+       (local-name (cdr name)))
+    (if (or (not ns)
+           (and (not attributep)
+                (eq (nxml-ns-get-default) ns)))
+       local-name
+      (let ((prefix (nxml-ns-prefix-for ns)))
+       (if prefix
+           (concat prefix ":" local-name)
+         (concat "{" (symbol-name ns) "}" local-name))))))
+
+(provide 'rng-valid)
+
+;;; rng-valid.el ends here
diff --git a/lisp/nxml/rng-xsd.el b/lisp/nxml/rng-xsd.el
new file mode 100644 (file)
index 0000000..65091ef
--- /dev/null
@@ -0,0 +1,858 @@
+;;; rng-xsd.el --- W3C XML Schema datatypes library for RELAX NG
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; The main entry point is `rng-xsd-compile'. The validator
+;; knows to use this for the datatype library with URI
+;; http://www.w3.org/2001/XMLSchema-datatypes because it
+;; is the value of the rng-dt-compile property on that URI
+;; as a symbol.
+;;
+;; W3C XML Schema Datatypes are specified by
+;;   http://www.w3.org/TR/xmlschema-2/
+;; Guidelines for using them with RELAX NG are described in
+;;   http://relaxng.org/xsd.html
+
+;;; Code:
+
+(require 'rng-dt)
+(require 'rng-util)
+(require 'xsd-regexp)
+
+;;;###autoload
+(put 'http://www.w3.org/2001/XMLSchema-datatypes
+     'rng-dt-compile
+     'rng-xsd-compile)
+
+;;;###autoload
+(defun rng-xsd-compile (name params)
+  "Provides W3C XML Schema as a RELAX NG datatypes library. NAME is a
+symbol giving the local name of the datatype.  PARAMS is a list of
+pairs (PARAM-NAME . PARAM-VALUE) where PARAM-NAME is a symbol giving
+the name of the parameter and PARAM-VALUE is a string giving its
+value.  If NAME or PARAMS are invalid, it calls rng-dt-error passing
+it arguments in the same style as format; the value from rng-dt-error
+will be returned.  Otherwise, it returns a list.  The first member of
+the list is t if any string is a legal value for the datatype and nil
+otherwise.  The second argument is a symbol; this symbol will be
+called as a function passing it a string followed by the remaining
+members of the list.  The function must return an object representing
+the value of the datatype that was represented by the string, or nil
+if the string is not a representation of any value. The object
+returned can be any convenient non-nil value, provided that, if two
+strings represent the same value, the returned objects must be equal."
+  (let ((convert (get name 'rng-xsd-convert)))
+    (if (not convert)
+       (rng-dt-error "There is no XSD datatype named %s" name)
+      (rng-xsd-compile1 name params convert))))
+
+;;; Parameters
+
+(defun rng-xsd-compile1 (name params convert)
+  (if (null params)
+      (cons (equal convert '(identity))
+           (cond ((eq name 'string) convert)
+                 ((eq name 'normalizedString)
+                  (cons 'rng-xsd-replace-space convert))
+                 ((and (not (eq name 'string))
+                       (or (memq 'identity convert)
+                           (memq 'rng-xsd-convert-any-uri convert)
+                           (memq 'rng-xsd-check-pattern convert)))
+                  (cons 'rng-xsd-collapse-space convert))
+                 (t convert)))
+    (let* ((param (car params))
+          (param-name (car param))
+          (param-value (cdr param)))
+      (cond ((memq param-name
+                  '(minExclusive maxExclusive minInclusive maxInclusive))
+            (let ((limit (apply (car convert)
+                                (cons param-value
+                                      (cdr convert))))
+                  (less-than-fun (get name 'rng-xsd-less-than)))
+              (cond ((not limit)
+                     (rng-dt-error "Minimum value %s is not valid"
+                                   param-value))
+                    ((not less-than-fun)
+                     (rng-dt-error "Values of type %s are not ordered"
+                                   param-name))
+                    (t
+                     (rng-xsd-compile1 name
+                                       (cdr params)
+                                       (cons (get param-name
+                                                  'rng-xsd-check)
+                                             (cons less-than-fun
+                                                   (cons limit convert))))))))
+           ((memq param-name '(length minLength maxLength))
+            (let ((limit (rng-xsd-string-to-non-negative-integer param-value))
+                  (length-fun (get name 'rng-xsd-length)))
+              (cond ((not limit)
+                     (rng-dt-error "Length %s is not valid" param-value))
+                    ((not length-fun)
+                     (rng-dt-error "Values of type %s do not have a length"
+                                   param-name))
+                    (t
+                     (rng-xsd-compile1 name
+                                       (cdr params)
+                                       (cons (get param-name
+                                                  'rng-xsd-check)
+                                             (cons length-fun
+                                                   (cons limit convert))))))))
+           ((memq param-name '(fractionDigits totalDigits))
+            (let ((n (rng-xsd-string-to-non-negative-integer param-value)))
+              (cond ((not n)
+                     (rng-dt-error "Number of digits %s is not valid"
+                                   param-value))
+                    (t
+                     (rng-xsd-compile1 name
+                                       (cdr params)
+                                       (cons (get param-name
+                                                  'rng-xsd-check)
+                                             (cons n convert)))))))
+           ((eq param-name 'pattern)
+            (condition-case err
+                (rng-xsd-compile1 name
+                                  (cdr params)
+                                  (cons 'rng-xsd-check-pattern
+                                        (cons (concat
+                                               "\\`"
+                                               (xsdre-translate param-value)
+                                               "\\'")
+                                              convert)))
+              (xsdre-invalid-regexp
+               (rng-dt-error "Invalid regular expression (%s)"
+                             (nth 1 err)))))
+           ((memq param-name '(enumeration whiteSpace))
+            (rng-dt-error "Facet %s cannot be used in RELAX NG" param-name))
+           (t (rng-dt-error "Unknown facet %s" param-name))))))
+         
+(defun rng-xsd-string-to-non-negative-integer (str)
+  (and (rng-xsd-convert-integer str)
+       (let ((n (string-to-number str)))
+        (and (integerp n)
+             (>= n 0)
+             n))))
+
+(defun rng-xsd-collapse-space (str convert &rest args)
+  (apply convert (cons (mapconcat 'identity (split-string str "[ \t\n\r]+")
+                                 " ")
+                      args)))
+
+(defun rng-xsd-replace-space (str convert &rest args)
+  (apply convert
+        (cons (let ((i 0)
+                    copied)
+                (while (and (setq i (string-match "[\r\n\t]" str i))
+                            (or copied (setq copied (copy-sequence str)))
+                            (aset copied i 32)
+                            (setq i (1+ i))))
+                (or copied str))
+              args)))
+
+(put 'minExclusive 'rng-xsd-check 'rng-xsd-check-min-exclusive)
+(put 'minInclusive 'rng-xsd-check 'rng-xsd-check-min-inclusive)
+(put 'maxExclusive 'rng-xsd-check 'rng-xsd-check-max-exclusive)
+(put 'maxInclusive 'rng-xsd-check 'rng-xsd-check-max-inclusive)
+(put 'length 'rng-xsd-check 'rng-xsd-check-length)
+(put 'minLength 'rng-xsd-check 'rng-xsd-check-min-length)
+(put 'maxLength 'rng-xsd-check 'rng-xsd-check-max-length)
+(put 'fractionDigits 'rng-xsd-check 'rng-xsd-check-fraction-digits)
+(put 'totalDigits 'rng-xsd-check 'rng-xsd-check-total-digits)
+
+(defun rng-xsd-check-min-exclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (funcall less-than-fun limit obj)
+        obj)))
+
+(defun rng-xsd-check-min-inclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (or (funcall less-than-fun limit obj)
+            (equal limit obj))
+        obj)))
+
+(defun rng-xsd-check-max-exclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (funcall less-than-fun obj limit)
+        obj)))
+
+(defun rng-xsd-check-max-inclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (or (funcall less-than-fun obj limit)
+            (equal obj limit))
+        obj)))
+
+(defun rng-xsd-check-min-length (str length-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (>= (funcall length-fun obj) limit)
+        obj)))
+
+(defun rng-xsd-check-max-length (str length-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (<= (funcall length-fun obj) limit)
+        obj)))
+
+(defun rng-xsd-check-length (str length-fun len convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (= (funcall length-fun obj) len)
+        obj)))
+
+(defun rng-xsd-check-fraction-digits (str n convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (<= (length (aref obj 2)) n)
+        obj)))
+
+(defun rng-xsd-check-total-digits (str n convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (<= (+ (length (aref obj 1))
+               (length (aref obj 2)))
+            n)
+        obj)))
+
+(defun rng-xsd-check-pattern (str regexp convert &rest args)
+  (and (string-match regexp str)
+       (apply convert (cons str args))))
+
+  
+(defun rng-xsd-convert-boolean (string)
+  (and (string-match "\\`[ \t\n\r]*\\(?:\\(true\\|1\\)\\|false\\|0\\)[ \t\n\r]*\\'" string)
+       (if (match-beginning 1) 'true 'false)))
+
+(defun rng-xsd-convert-decimal (string)
+  "Convert a string representing a decimal to an object representing
+its values.  A decimal value is represented by a vector [SIGN
+INTEGER-DIGITS FRACTION-DIGITS] where SIGN is 1 or -1, INTEGER-DIGITS
+is a string containing zero or more digits, with no leading zero, and
+FRACTION-DIGITS is a string containing zero or more digits with no
+trailing digits.  For example, -0021.0430 would be represented by [-1
+\"21\" \"043\"]."
+  (and (string-match "\\`[ \t\n\r]*\\([-+]\\)?\\(0*\\([1-9][0-9]*\\)?\\(\\.\\([0-9]*[1-9]\\)?0*\\)?\\)[ \t\n\r]*\\'" string)
+       (let ((digits (match-string 2 string)))
+        (and (not (string= digits "."))
+             (not (string= digits ""))))
+       (let ((integer-digits (match-string 3 string)))
+        (vector (if (and (equal (match-string 1 string) "-")
+                         ;; Normalize -0 to 0
+                         integer-digits)
+                    -1
+                  1)
+                (or integer-digits "")
+                (or (match-string 5 string) "")))))
+
+(defun rng-xsd-convert-integer (string)
+  (and (string-match "\\`[ \t\n\r]*\\([-+]\\)?\\(?:0*\\([1-9][0-9]*\\)\\|0+\\)[ \t\n\r]*\\'" string)
+       (let ((integer-digits (match-string 2 string)))
+        (vector (if (and (equal (match-string 1 string) "-")
+                         ;; Normalize -0 to 0
+                         integer-digits)
+                    -1
+                  1)
+                (or integer-digits "")
+                ""))))
+
+(defun rng-xsd-decimal< (n1 n2)
+  (< (rng-xsd-compare-decimal n1 n2) 0))
+
+(defun rng-xsd-compare-decimal (n1 n2)
+  "Return a < 0, 0, > 0 according as n1 < n2, n1 = n2 or n1 > n2."
+  (let* ((sign1 (aref n1 0))
+        (sign2 (aref n2 0))
+        (sign (- sign1 sign2)))
+    (if (= sign 0)
+       (* sign1
+          (let* ((int1 (aref n1 1))
+                 (int2 (aref n2 1))
+                 (len1 (length int1))
+                 (len2 (length int2))
+                 (lencmp (- len1 len2)))
+            (if (eq lencmp 0)
+                (if (string= int1 int2)
+                    (rng-xsd-strcmp (aref n1 2) (aref n2 2))
+                  (rng-xsd-strcmp int1 int2))
+              lencmp)))
+      sign)))
+
+(defconst rng-xsd-float-regexp
+  (concat "\\`[ \r\n\t]*\\(?:"
+         "\\("
+         "[-+]?\\(?:[0-9]+\\(?:\\.[0-9]*\\)?\\|\\.[0-9]+\\)"
+         "\\(?:[eE][-+]?[0-9]+\\)?"
+         "\\)"
+         "\\|\\(INF\\)"
+         "\\|\\(-INF\\)"
+         "\\|\\(NaN\\)"
+         "\\)[ \r\n\t]*\\'"))
+
+(defun rng-xsd-convert-float (string)
+  (cond ((not (string-match rng-xsd-float-regexp string)) nil)
+       ((match-beginning 1)
+        (float (string-to-number (match-string 1 string))))
+       ((match-beginning 2) 1.0e+INF)
+       ((match-beginning 3) -1.0e+INF)
+       ;; Don't use a NaN float because we want NaN to be equal to NaN
+       ((match-beginning 4) 'NaN)))
+        
+(defun rng-xsd-float< (f1 f2)
+  (and (not (eq f1 'NaN))
+       (not (eq f2 'NaN))
+       (< f1 f2)))
+  
+(defun rng-xsd-convert-token (string regexp)
+  (and (string-match regexp string)
+       (match-string 1 string)))
+
+(defun rng-xsd-convert-hex-binary (string)
+  (and (string-match "\\`[ \r\n\t]*\\(\\(?:[0-9A-Fa-f][0-9A-Fa-f]\\)*\\)[ \r\n\t]*\\'"
+                    string)
+       (downcase (match-string 1 string))))
+
+(defun rng-xsd-hex-binary-length (obj)
+  (/ (length obj) 2))
+
+(defconst rng-xsd-base64-binary-regexp
+  (let ((S "[ \t\r\n]*")
+       (B04 "[AQgw]")
+       (B16 "[AEIMQUYcgkosw048]")
+       (B64 "[A-Za-z0-9+/]"))
+    (concat "\\`" S "\\(?:\\(?:" B64 S "\\)\\{4\\}\\)*"
+           "\\(?:" B64 S B64 S B16 S "=" S 
+           "\\|" B64 S B04 S "=" S "=" S "\\)?\\'")))
+
+(defun rng-xsd-convert-base64-binary (string)
+  (and (string-match rng-xsd-base64-binary-regexp string)
+       (replace-regexp-in-string "[ \t\r\n]+" "" string t t)))
+
+(defun rng-xsd-base64-binary-length (obj)
+  (let ((n (* (/ (length obj) 4) 3)))
+    (if (and (> n 0)
+            (string= (substring obj -1) "="))
+       (- n (if (string= (substring obj -2) "==")
+                2
+              1))
+      n)))
+
+(defun rng-xsd-convert-any-uri (string)
+  (and (string-match "\\`\\(?:[^%]\\|%[0-9a-fA-F][0-9a-fA-F]\\)?*\\'" string)
+       (string-match "\\`[^#]*\\(?:#[^#]*\\)?\\'" string)
+       (string-match "\\`\\(?:[a-zA-Z][-+.A-Za-z0-9]*:.+\\|[^:]*\\(?:[#/?].*\\)?\\)\\'" string)
+       string))
+
+(defun rng-xsd-make-date-time-regexp (template)
+  "Returns a regular expression matching a ISO 8601 date/time. The
+template is a string with Y standing for years field, M standing for
+months, D standing for day of month, T standing for a literal T, t
+standing for time and - standing for a literal hyphen.  A time zone is
+always allowed at the end. Regardless of the fields appearing in the
+template, the regular expression will have twelve groups matching the
+year sign, year, month, day of month, hours, minutes, integer seconds,
+fractional seconds (including leading period), time zone, time zone
+sign, time zone hours, time zone minutes."
+  (let ((i 0)
+       (len (length template))
+       (parts nil)
+       first last c)
+    (while (< i len)
+      (setq c (aref template i))
+      (setq parts
+           (cons (cond ((eq c ?Y)
+                        (setq first 0)
+                        (setq last 1)
+                        "\\(-\\)?\\(\\(?:[1-9][0-9]*\\)?[0-9]\\{4\\}\\)")
+                       ((eq c ?M)
+                        (or first
+                            (setq first 2))
+                        (setq last 2)
+                        "\\([0-9][0-9]\\)")
+                       ((eq c ?D)
+                        (or first
+                            (setq first 3))
+                        (setq last 3)
+                        "\\([0-9][0-9]\\)")
+                       ((eq c ?t)
+                        (or first
+                            (setq first 4))
+                        (setq last 7)
+                        "\\([0-9][0-9]\\):\\([0-9][0-9]\\):\\([0-9][0-9]\\)\\(\\.[0-9]*\\)?")
+                       (t (string c)))
+                 parts))
+      (setq i (1+ i)))
+    (while (< last 7)
+      (setq last (1+ last))
+      ;; Add dummy fields that can never much but keep the group
+      ;; numbers uniform.
+      (setq parts (cons "\\(\\'X\\)?" parts)))
+    (setq parts (cons "\\(Z\\|\\([-+]\\)\\([0-9][0-9]\\):\\([0-5][0-9]\\)\\)?[ \t\n\r]*\\'"
+                     parts))
+    (setq parts (cons "\\`[ \t\n\r]*" (nreverse parts)))
+    (while (> first 0)
+      (setq first (1- first))
+      (setq parts (cons "\\(X\\)?" parts)))
+    (apply 'concat parts)))
+
+(defconst rng-xsd-seconds-per-day (* 24 60 60))
+(defconst rng-xsd-days-in-month [31 28 31 30 31 30 31 31 30 31 30 31])
+
+(defun rng-xsd-days-in-month (year month)
+  (if (and (= month 2) (rng-xsd-leap-year-p year))
+      29
+    (aref rng-xsd-days-in-month (1- month))))
+
+(defconst rng-xsd-months-to-days
+  (let ((v (make-vector 12 nil))
+       (total 0)
+       (i 0))
+    (while (< i 12)
+      (setq total (+ total (aref rng-xsd-days-in-month i)))
+      (aset v i total)
+      (setq i (1+ i)))
+    v))
+          
+(defun rng-xsd-convert-date-time (string regexp)
+  "Converts an XML Schema date/time to a list.  Returns nil if
+invalid.  REGEXP is a regexp for parsing the date time as returned by
+`rng-xsd-make-date-time-regexp'. The list has 4 members (HAS-TIME-ZONE
+DAY SECOND SECOND-FRACTION), where HAS-TIME-ZONE is t or nil depending
+on whether a time zone was specified, DAY is an integer giving a day
+number (with Jan 1 1AD being day 1), SECOND is the second within that
+day, and SECOND-FRACTION is a float giving the fractional part of the
+second."
+  (and (string-match regexp string)
+       (let ((year-sign (match-string 1 string))
+            (year (match-string 2 string))
+            (month (match-string 3 string))
+            (day (match-string 4 string))
+            (hour (match-string 5 string))
+            (minute (match-string 6 string))
+            (second (match-string 7 string))
+            (second-fraction (match-string 8 string))
+            (has-time-zone (match-string 9 string))
+            (time-zone-sign (match-string 10 string))
+            (time-zone-hour (match-string 11 string))
+            (time-zone-minute (match-string 12 string)))
+        (setq year-sign (if year-sign -1 1))
+        (setq year
+              (if year
+                  (* year-sign
+                     (string-to-number year))
+                2000))
+        (setq month
+              (if month (string-to-number month) 1))
+        (setq day
+              (if day (string-to-number day) 1))
+        (setq hour
+              (if hour (string-to-number hour) 0))
+        (setq minute
+              (if minute (string-to-number minute) 0))
+        (setq second
+              (if second (string-to-number second) 0))
+        (setq second-fraction
+              (if second-fraction
+                  (float (string-to-number second-fraction))
+                0.0))
+        (setq has-time-zone (and has-time-zone t))
+        (setq time-zone-sign
+              (if (equal time-zone-sign "-") -1 1))
+        (setq time-zone-hour
+              (if time-zone-hour (string-to-number time-zone-hour) 0))
+        (setq time-zone-minute
+              (if time-zone-minute (string-to-number time-zone-minute) 0))
+        (and (>= month 1)
+             (<= month 12)
+             (>= day 1)
+             (<= day (rng-xsd-days-in-month year month))
+             (<= hour 23)
+             (<= minute 59)
+             (<= second 60)            ; leap second
+             (<= time-zone-hour 23)
+             (<= time-zone-minute 59)
+             (cons has-time-zone
+                   (rng-xsd-add-seconds
+                    (list (rng-xsd-date-to-days year month day)
+                          (rng-xsd-time-to-seconds hour minute second)
+                          second-fraction)
+                    (* (rng-xsd-time-to-seconds time-zone-hour
+                                                time-zone-minute
+                                                0)
+                       (- time-zone-sign))))))))
+
+(defun rng-xsd-leap-year-p (year)
+  (and (= (% year 4) 0)
+       (or (/= (% year 100) 0)
+          (= (% year 400) 0))))
+
+(defun rng-xsd-time-to-seconds (hour minute second)
+  (+ (* (+ (* hour 60)
+          minute)
+       60)
+     second))
+
+(defconst rng-xsd-max-tz (rng-xsd-time-to-seconds 14 0 0))
+
+(defun rng-xsd-date-time< (dt1 dt2)
+  (cond ((eq (car dt1) (car dt2))
+        (rng-xsd-number-list< (cdr dt1) (cdr dt2)))
+       ((car dt1)
+        (rng-xsd-number-list< (cdr dt1)
+                              (rng-xsd-add-seconds (cdr dt2)
+                                                   (- rng-xsd-max-tz))))
+       (t
+        (rng-xsd-number-list< (rng-xsd-add-seconds (cdr dt1)
+                                                   rng-xsd-max-tz)
+                              (cdr dt2)))))
+
+(defun rng-xsd-add-seconds (date offset)
+  (let ((day (nth 0 date))
+       (second (+ (nth 1 date) offset))
+       (fraction (nth 2 date)))
+    (cond ((< second 0)
+          (list (1- day)
+                (+ second rng-xsd-seconds-per-day)
+                fraction))
+         ((>= second rng-xsd-seconds-per-day)
+          (list (1+ day)
+                (- second rng-xsd-seconds-per-day)
+                fraction))
+         (t (list day second fraction)))))
+
+(defun rng-xsd-number-list< (numbers1 numbers2)
+  (while (and numbers1 (= (car numbers1) (car numbers2)))
+    (setq numbers1 (cdr numbers1))
+    (setq numbers2 (cdr numbers2)))
+  (and numbers1
+       (< (car numbers1) (car numbers2))))
+       
+(defun rng-xsd-date-to-days (year month day)
+  "Return a unique day number where Jan 1 1 AD is day 1"
+  (if (> year 0)                       ; AD
+      (+ (rng-xsd-days-in-years (- year 1))
+        (rng-xsd-day-number-in-year year month day))
+    (- (+ (- (rng-xsd-days-in-years (- 3 year))
+            (rng-xsd-days-in-years 3))
+         (- (if (rng-xsd-leap-year-p year) 366 365)
+            (rng-xsd-day-number-in-year year month day))))))
+
+(defun rng-xsd-days-in-years (years)
+  "The number of days in YEARS years where the first year is 1AD."
+  (+ (* 365 years)
+     (/ years 4)
+     (- (/ years 100))
+     (/ years 400)))
+
+(defun rng-xsd-day-number-in-year (year month day)
+  (+ (if (= month 1)
+        0
+        (aref rng-xsd-months-to-days (- month 2)))
+     day
+     (if (and (> month 2)
+             (rng-xsd-leap-year-p year))
+        1
+       0)))
+
+(defconst rng-xsd-duration-regexp
+    "\\`[ \t\r\n]*\\(-\\)?P\
+\\([0-9]+Y\\)?\\([0-9]+M\\)?\\([0-9]+D\\)?\
+\\(?:T\\([0-9]+H\\)?\\([0-9]+M\\)?\
+\\(\\([0-9]+\\(?:\\.[0-9]*\\)?\\|\\.[0-9]+\\)S\\)?\\)?\
+[ \t\r\n]*\\'")
+
+
+(defun rng-xsd-convert-duration (string)
+  (and (string-match rng-xsd-duration-regexp string)
+       (let ((last (substring string -1)))
+        (not (or (string= last "P")
+                 (string= last "T"))))
+       ;; years months days hours minutes seconds
+       (let ((v (make-vector 6 0))
+            (sign (if (match-beginning 1) -1 1))
+            (i 0))
+        (while (< i 6)
+          (let ((start (match-beginning (+ i 2))))
+            (when start
+              (aset v i (* sign
+                           (string-to-number 
+                            (substring string
+                                       start
+                                       (1- (match-end (+ i 2)))))))))
+          (setq i (1+ i)))
+        ;; Force seconds to be float so that equal works properly.
+        (aset v 5 (float (aref v 5)))
+        v)))
+        
+(defconst rng-xsd-min-seconds-per-month (* 28 rng-xsd-seconds-per-day))
+
+(defun rng-xsd-duration< (d1 d2)
+  (let* ((months1 (rng-xsd-duration-months d1))
+        (months2 (rng-xsd-duration-months d2))
+        (seconds1 (rng-xsd-duration-seconds d1))
+        (seconds2 (rng-xsd-duration-seconds d2)))
+    (cond ((< months1 months2)
+          (if (< (- seconds1 seconds2) rng-xsd-min-seconds-per-month)
+              t
+            (rng-xsd-months-seconds< months1 seconds1 months2 seconds2)))
+         ((> months1 months2)
+          (if (< (- seconds2 seconds1) rng-xsd-min-seconds-per-month)
+              nil
+            (rng-xsd-months-seconds< months1 seconds1 months2 seconds2)))
+         (t (< seconds1 seconds2)))))
+
+(defconst xsd-duration-reference-dates
+  '((1696 . 9) (1697 . 2) (1903 . 3) (1903 . 7)))
+
+(defun rng-xsd-months-seconds< (months1 seconds1 months2 seconds2)
+  (let ((ret t)
+       (ref-dates xsd-duration-reference-dates))
+    (while (let* ((ref-date (car ref-dates))
+                 (ref-year (car ref-date))
+                 (ref-month (cdr ref-date)))
+            (unless (< (+ (rng-xsd-month-seconds months1
+                                                 ref-year
+                                                 ref-month)
+                          seconds1)
+                       (+ (rng-xsd-month-seconds months2
+                                                 ref-year
+                                                 ref-month)
+                          seconds2))
+                (setq ret nil))
+            (and ret
+                 (setq ref-dates (cdr ref-dates)))))
+    ret))
+
+
+(defun rng-xsd-month-seconds (months ref-year ref-month)
+  "Return the seconds in a number of months starting on a reference date.
+Returns a floating point number."
+  (* (rng-xsd-month-days (abs months) ref-year ref-month)
+     (float rng-xsd-seconds-per-day)
+     (if (< months 0) -1.0 1.0)))
+
+(defconst rng-xsd-years-per-gregorian-cycle 400)
+(defconst rng-xsd-months-per-gregorian-cycle
+  (* rng-xsd-years-per-gregorian-cycle 12))
+(defconst rng-xsd-leap-years-per-gregorian-cycle (- 100 (- 4 1)))
+(defconst rng-xsd-days-per-gregorian-cycle
+  (+ (* 365 rng-xsd-years-per-gregorian-cycle)
+     rng-xsd-leap-years-per-gregorian-cycle))
+
+(defun rng-xsd-month-days (months ref-year ref-month)
+  "Return the days in a number of months starting on a reference date.
+MONTHS must be an integer >= 0."
+  (let ((days 0))
+    (setq months (mod months rng-xsd-months-per-gregorian-cycle))
+    ;; This may be rather slow, but it is highly unlikely
+    ;; ever to be used in real life.
+    (while (> months 0)
+      (setq days
+           (+ (rng-xsd-days-in-month ref-year ref-month)
+              days))
+      (setq ref-month
+           (if (eq ref-month 12)
+               (progn
+                 (setq ref-year (1+ ref-year))
+                 1)
+             (1+ ref-month)))
+      (setq months (1- months)))
+    (+ (* (/ months rng-xsd-months-per-gregorian-cycle)
+         rng-xsd-days-per-gregorian-cycle)
+       days)))
+    
+(defun rng-xsd-duration-months (d)
+  (+ (* (aref d 0) 12)
+     (aref d 1)))
+
+(defun rng-xsd-duration-seconds (d)
+  (+ (* (+ (* (+ (* (aref d 2)
+                   24.0)
+                (aref d 3))
+             60.0)
+          (aref d 4))
+       60.0)
+     (aref d 5)))
+       
+(defun rng-xsd-convert-qname (string)
+  (and (string-match "\\`[ \r\n\t]*\\([_[:alpha:]][-._[:alnum:]]*\\(:[_[:alpha:]][-._[:alnum:]]*\\)?\\)[ \r\n\t]*\\'" string)
+       (let ((colon (match-beginning 2))
+            (context (apply (car rng-dt-namespace-context-getter)
+                            (cdr rng-dt-namespace-context-getter))))
+        (if colon
+            (let* ((prefix (substring string
+                                      (match-beginning 1)
+                                      colon))
+                   (binding (assoc prefix (cdr context))))
+              (and binding
+                   (cons (cdr binding)
+                         (substring string
+                                    (1+ colon)
+                                    (match-end 1)))))
+          (cons (car context)
+                (match-string 1 string))))))
+                    
+(defun rng-xsd-convert-list (string convert &rest args)
+  (let* ((tokens (split-string string "[ \t\n\r]+"))
+        (tem tokens))
+    (while tem
+      (let ((obj (apply convert
+                       (cons (car tem) args))))
+       (cond (obj
+              (setcar tem obj)
+              (setq tem (cdr tem)))
+             (t
+              (setq tokens nil)
+              (setq tem nil)))))
+    ;; Fortuitously this returns nil if the list is empty
+    ;; which is what we want since the list types
+    ;; have to have one or more members.
+    tokens))
+
+(defun rng-xsd-strcmp (s1 s2)
+  (cond ((string= s1 s2) 0)
+       ((string< s1 s2) -1)
+       (t 1)))
+
+(put 'string 'rng-xsd-convert '(identity))
+(put 'string 'rng-xsd-length 'length)
+(put 'string 'rng-xsd-matches-anything t)
+
+(put 'normalizedString 'rng-xsd-convert '(identity))
+(put 'normalizedString 'rng-xsd-length 'length)
+(put 'normalizedString 'rng-xsd-matches-anything t)
+
+(put 'token 'rng-xsd-convert '(identity))
+(put 'token 'rng-xsd-length 'length)
+(put 'token 'rng-xsd-matches-anything t)
+
+(put 'hexBinary 'rng-xsd-convert '(rng-xsd-convert-hex-binary))
+(put 'hexBinary 'rng-xsd-length 'rng-xsd-hex-binary-length)
+
+(put 'base64Binary 'rng-xsd-convert '(rng-xsd-convert-base64-binary))
+(put 'base64Binary 'rng-xsd-length 'rng-xsd-base64-binary-length)
+
+(put 'boolean 'rng-xsd-convert '(rng-xsd-convert-boolean))
+
+(put 'float 'rng-xsd-convert '(rng-xsd-convert-float))
+(put 'float 'rng-xsd-less-than 'rng-xsd-float<)
+
+(put 'double 'rng-xsd-convert '(rng-xsd-convert-float))
+(put 'double 'rng-xsd-less-than 'rng-xsd-float<)
+
+(put 'decimal 'rng-xsd-convert '(rng-xsd-convert-decimal))
+(put 'decimal 'rng-xsd-less-than 'rng-xsd-decimal<)
+
+(put 'integer 'rng-xsd-convert '(rng-xsd-convert-integer))
+(put 'integer 'rng-xsd-less-than 'rng-xsd-decimal<)
+
+(defun rng-xsd-def-integer-type (name min max)
+  (put name 'rng-xsd-less-than 'rng-xsd-decimal<)
+  (put name
+       'rng-xsd-convert 
+       (cdr (rng-xsd-compile 'integer
+                            (append (and min `((minInclusive . ,min)))
+                                    (and max `((maxInclusive . ,max))))))))
+
+(defun rng-xsd-def-token-type (name regexp)
+  (put name 'rng-xsd-convert (list 'rng-xsd-convert-token
+                                  (concat "\\`[\r\n\t ]*\\("
+                                          regexp
+                                          "\\)[\r\n\t ]*\\'")))
+  (put name 'rng-xsd-length 'length))
+
+(rng-xsd-def-token-type 'NMTOKEN "[-.:_[:alnum:]]+")
+(rng-xsd-def-token-type 'Name "[:_[:alpha:]][-.:_[:alnum:]]*")
+(rng-xsd-def-token-type 'NCName "[_[:alpha:]][-._[:alnum:]]*")
+(rng-xsd-def-token-type 'language
+                       "[a-zA-Z]\\{1,8\\}\\(?:-[a-zA-Z0-9]\\{1,8\\}\\)*")
+
+(put 'ENTITY 'rng-xsd-convert (get 'NCName 'rng-xsd-convert))
+(put 'ENTITY 'rng-xsd-length 'length)
+(put 'ID 'rng-xsd-convert (get 'NCName 'rng-xsd-convert))
+(put 'ID 'rng-xsd-length 'length)
+(put 'IDREF 'rng-xsd-convert (get 'NCName 'rng-xsd-convert))
+(put 'IDREF 'rng-xsd-length 'length)
+
+(defun rng-xsd-def-list-type (name member-name)
+  (put name 'rng-xsd-convert (cons 'rng-xsd-convert-list
+                                  (get member-name 'rng-xsd-convert)))
+  (put name 'rng-xsd-length 'length))
+
+(rng-xsd-def-list-type 'NMTOKENS 'NMTOKEN)
+(rng-xsd-def-list-type 'IDREFS 'IDREF)
+(rng-xsd-def-list-type 'ENTITIES 'ENTITY)
+
+(put 'anyURI 'rng-xsd-convert '(rng-xsd-convert-any-uri))
+(put 'anyURI 'rng-xsd-length 'length)
+
+(put 'QName 'rng-xsd-convert '(rng-xsd-convert-qname))
+(put 'NOTATION 'rng-xsd-convert '(rng-xsd-convert-qname))
+
+(defconst rng-xsd-long-max "9223372036854775807")
+(defconst rng-xsd-long-min "-9223372036854775808")
+(defconst rng-xsd-int-max "2147483647")
+(defconst rng-xsd-int-min "-2147483648")
+(defconst rng-xsd-short-max "32767")
+(defconst rng-xsd-short-min "-32768")
+(defconst rng-xsd-byte-max "127")
+(defconst rng-xsd-byte-min "-128")
+(defconst rng-xsd-unsigned-long-max "18446744073709551615")
+(defconst rng-xsd-unsigned-int-max "4294967295")
+(defconst rng-xsd-unsigned-short-max "65535")
+(defconst rng-xsd-unsigned-byte-max "255")
+
+(rng-xsd-def-integer-type 'nonNegativeInteger "0" nil)
+(rng-xsd-def-integer-type 'positiveInteger "1" nil)
+(rng-xsd-def-integer-type 'nonPositiveInteger nil "0")
+(rng-xsd-def-integer-type 'negativeInteger nil "-1")
+(rng-xsd-def-integer-type 'long rng-xsd-long-min rng-xsd-long-max)
+(rng-xsd-def-integer-type 'int rng-xsd-int-min rng-xsd-int-max)
+(rng-xsd-def-integer-type 'short rng-xsd-short-min rng-xsd-short-max)
+(rng-xsd-def-integer-type 'byte rng-xsd-byte-min rng-xsd-byte-max)
+(rng-xsd-def-integer-type 'unsignedLong "0" rng-xsd-unsigned-long-max)
+(rng-xsd-def-integer-type 'unsignedInt "0" rng-xsd-unsigned-int-max)
+(rng-xsd-def-integer-type 'unsignedShort "0" rng-xsd-unsigned-short-max)
+(rng-xsd-def-integer-type 'unsignedByte "0" rng-xsd-unsigned-byte-max)
+
+(defun rng-xsd-def-date-time-type (name template)
+  (put name 'rng-xsd-convert (list 'rng-xsd-convert-date-time
+                                  (rng-xsd-make-date-time-regexp template)))
+  (put name 'rng-xsd-less-than 'rng-xsd-date-time<))
+
+(rng-xsd-def-date-time-type 'dateTime "Y-M-DTt")
+(rng-xsd-def-date-time-type 'time "t")
+(rng-xsd-def-date-time-type 'date "Y-M-D")
+(rng-xsd-def-date-time-type 'gYearMonth "Y-M")
+(rng-xsd-def-date-time-type 'gYear "Y")
+(rng-xsd-def-date-time-type 'gMonthDay "--M-D")
+(rng-xsd-def-date-time-type 'gDay "---D")
+(rng-xsd-def-date-time-type 'gMonth "--M")
+
+(put 'duration 'rng-xsd-convert '(rng-xsd-convert-duration))
+(put 'duration 'rng-xsd-less-than 'rng-xsd-duration<)
+
+(provide 'rng-xsd)
+
+;;; rng-xsd.el ends here
diff --git a/lisp/nxml/subdirs.el b/lisp/nxml/subdirs.el
new file mode 100644 (file)
index 0000000..4103b56
--- /dev/null
@@ -0,0 +1,8 @@
+;; -*- no-byte-compile: t -*-
+;; In load-path, after this directory should come
+;; certain of its subdirectories.  Here we specify them.
+(normal-top-level-add-to-load-path '("char-name" ))
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; End:
diff --git a/lisp/nxml/test.invalid.xml b/lisp/nxml/test.invalid.xml
new file mode 100644 (file)
index 0000000..bdf6a2c
--- /dev/null
@@ -0,0 +1,8 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>An invalid document</title>
+  </head>
+  <body>
+    <p>This XHTML document is <span class="#foo">invalid</span>.</p>
+  </body>
+</html>
diff --git a/lisp/nxml/test.valid.xml b/lisp/nxml/test.valid.xml
new file mode 100644 (file)
index 0000000..56a1280
--- /dev/null
@@ -0,0 +1,8 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>A valid document</title>
+  </head>
+  <body>
+    <p>This is a valid, albeit boring, XHTML document.</p>
+  </body>
+</html>
diff --git a/lisp/nxml/xmltok.el b/lisp/nxml/xmltok.el
new file mode 100644 (file)
index 0000000..ed381cd
--- /dev/null
@@ -0,0 +1,1925 @@
+;;; xmltok.el --- XML tokenization
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This implements an XML 1.0 parser. It also implements the XML
+;; Namespaces Recommendation.  It is designed to be conforming, but it
+;; works a bit differently from a normal XML parser. An XML document
+;; consists of the prolog and an instance.  The prolog is parsed as a
+;; single unit using `xmltok-forward-prolog'.  The instance is
+;; considered as a sequence of tokens, where a token is something like
+;; a start-tag, a comment, a chunk of data or a CDATA section. The
+;; tokenization of the instance is stateless: the tokenization of one
+;; part of the instance does not depend on tokenization of the
+;; preceding part of the instance.  This allows the instance to be
+;; parsed incrementally.  The main entry point is `xmltok-forward':
+;; this can be called at any point in the instance provided it is
+;; between tokens.  The other entry point is `xmltok-forward-special'
+;; which skips over tokens other comments, processing instructions or
+;; CDATA sections (i.e. the constructs in an instance that can contain
+;; less than signs that don't start a token).
+;;
+;; This is a non-validating XML 1.0 processor.  It does not resolve
+;; parameter entities (including the external DTD subset) and it does
+;; not resolve external general entities.
+;;
+;; It is non-conformant by design in the following respects.
+;;
+;; 1. It expects the client to detect aspects of well-formedness that
+;; are not internal to a single token, specifically checking that
+;; end-tags match start-tags and that the instance contains exactly
+;; one element.
+;;
+;; 2. It expects the client to detect duplicate attributes.  Detection
+;; of duplicate attributes after expansion of namespace prefixes
+;; requires the namespace processing state.  Detection of duplicate
+;; attributes before expansion of namespace prefixes does not, but is
+;; redundant given that the client will do detection of duplicate
+;; attributes after expansion of namespace prefixes.
+;;
+;; 3. It allows the client to recover from well-formedness errors.
+;; This is essential for use in applications where the document is
+;; being parsed during the editing process.
+;;
+;; 4. It does not support documents that do not conform to the lexical
+;; requirements of the XML Namespaces Recommendation (e.g. a document
+;; with a colon in an entity name).
+;;
+;; There are also a number of things that have not yet been
+;; implemented that make it non-conformant.
+;;
+;; 1. It does not implement default attributes.  ATTLIST declarations
+;; are parsed, but no checking is done on the content of attribute
+;; value literals specifying default attribute values, and default
+;; attribute values are not reported to the client.
+;;
+;; 2. It does not implement internal entities containing elements. If
+;; an internal entity is referenced and parsing its replacement text
+;; yields one or more tags, then it will skip the reference and
+;; report this to the client.
+;;
+;; 3. It does not check the syntax of public identifiers in the DTD.
+;;
+;; 4. It allows some non-ASCII characters in certain situations where
+;; it should not.  For example, it only enforces XML 1.0's
+;; restrictions on name characters strictly for ASCII characters.  The
+;; problem here is XML's character model is based squarely on Unicode,
+;; whereas Emacs's is not (as of version 21).  It is not clear what
+;; the right thing to do is.
+
+;;; Code:
+
+(defvar xmltok-type nil)
+(defvar xmltok-start nil)
+(defvar xmltok-name-colon nil)
+(defvar xmltok-name-end nil)
+(defvar xmltok-replacement nil
+  "String containing replacement for a character or entity reference.")
+
+(defvar xmltok-attributes nil
+  "List containing attributes of last scanned element.
+Each member of the list is a vector representing an attribute, which
+can be accessed using the functions `xmltok-attribute-name-start',
+`xmltok-attribute-name-colon', `xmltok-attribute-name-end',
+`xmltok-attribute-value-start', `xmltok-attribute-value-end',
+`xmltok-attribute-raw-normalized-value', `xmltok-attribute-refs'.")
+
+(defvar xmltok-namespace-attributes nil
+  "List containing namespace declarations of last scanned element.
+List has same format as `xmltok-attributes'.")
+
+(defvar xmltok-dtd nil
+  "Information about the DTD used by `xmltok-forward'.
+`xmltok-forward-prolog' sets this up.
+
+It consists of an alist of general entity names vs definitions.  The
+first member of the alist is t if references to entities not in the
+alist are well-formed \(e.g. because there's an external subset that
+wasn't parsed).
+
+Each general entity name is a string. The definition is either nil, a
+symbol, a string, a cons cell.  If the definition is nil, then it
+means that it's an internal entity but the result of parsing it is
+unknown.  If it is a symbol, then the symbol is either `unparsed',
+meaning the entity is an unparsed entity, `external', meaning the
+entity is or references an external entity, `element', meaning the
+entity includes one or more elements, or `not-well-formed', meaning
+the replacement text is not well-formed.  If the definition is a
+string, then the replacement text of the entity is that string; this
+happens only during the parsing of the prolog. If the definition is a
+cons cell \(ER . AR), then ER specifies the string that results from
+referencing the entity in element content and AR is either nil,
+meaning the replacement text included a <, or a string which is the
+normalized attribute value.")
+
+(defvar xmltok-dependent-regions nil
+  "List of descriptors of regions that a parsed token depends on.
+
+A token depends on a region if the region occurs after the token and a
+change in the region may require the token to be reparsed.  This only
+happens with markup that is not well-formed.  For example, if a <?
+occurs without a matching ?>, then the <? is returned as a
+not-well-formed token.  However, this token is dependent on region
+from the end of the token to the end of the buffer: if this ever
+contains ?> then the buffer must be reparsed from the <?.
+
+A region descriptor is a list (FUN START END ARG ...), where FUN is a
+function to be called when the region changes, START and END are
+integers giving the start and end of the region, and ARG... are
+additional arguments to be passed to FUN.  FUN will be called with 5
+arguments followed by the additional arguments if any: the position of
+the start of the changed area in the region, the position of the end
+of the changed area in the region, the length of the changed area
+before the change, the position of the start of the region, the
+position of the end of the region. FUN must return non-nil if the
+region needs reparsing.  FUN will be called in a save-excursion with
+match-data saved.
+
+`xmltok-forward', `xmltok-forward-special' and `xmltok-forward-prolog'
+may add entries to the beginning of this list, but will not clear it.
+`xmltok-forward' and `xmltok-forward-special' will only add entries
+when returning tokens of type not-well-formed.")
+
+(defvar xmltok-errors nil
+  "List of errors detected by `xmltok-forward' and `xmltok-forward-prolog'.
+When `xmltok-forward' and `xmltok-forward-prolog' detect a
+well-formedness error, they will add an entry to the beginning of this
+list.  Each entry is a vector [MESSAGE START END], where MESSAGE is a
+string giving the error message and START and END are integers
+indicating the position of the error.")
+
+(defmacro xmltok-save (&rest body)
+  `(let (xmltok-type
+        xmltok-start
+        xmltok-name-colon
+        xmltok-name-end
+        xmltok-replacement
+        xmltok-attributes
+        xmltok-namespace-attributes
+        xmltok-dependent-regions
+        xmltok-errors)
+     ,@body))
+
+(put 'xmltok-save 'lisp-indent-function 0)
+(def-edebug-spec xmltok-save t)
+
+(defsubst xmltok-attribute-name-start (att)
+  (aref att 0))
+
+(defsubst xmltok-attribute-name-colon (att)
+  (aref att 1))
+
+(defsubst xmltok-attribute-name-end (att)
+  (aref att 2))
+
+(defsubst xmltok-attribute-value-start (att)
+  (aref att 3))
+
+(defsubst xmltok-attribute-value-end (att)
+  (aref att 4))
+
+(defsubst xmltok-attribute-raw-normalized-value (att)
+  "Return an object representing the normalized value of ATT.
+This can t indicating that the normalized value is the same as the
+buffer substring from the start to the end of the value or nil
+indicating that the value is not well-formed or a string."
+  (aref att 5))
+
+(defsubst xmltok-attribute-refs (att)
+  "Return a list of the entity and character references in ATT.
+Each member is a vector [TYPE START END] where TYPE is either char-ref
+or entity-ref and START and END are integers giving the start and end
+of the reference. Nested entity references are not included in the list."
+  (aref att 6))
+
+(defun xmltok-attribute-prefix (att)
+  (let ((colon (xmltok-attribute-name-colon att)))
+    (and colon
+        (buffer-substring-no-properties (xmltok-attribute-name-start att)
+                                        colon))))
+
+(defun xmltok-attribute-local-name (att)
+  (let ((colon (xmltok-attribute-name-colon att)))
+    (buffer-substring-no-properties (if colon
+                                       (1+ colon)
+                                     (xmltok-attribute-name-start att))
+                                   (xmltok-attribute-name-end att))))
+
+(defun xmltok-attribute-value (att)
+  (let ((rnv (xmltok-attribute-raw-normalized-value att)))
+    (and rnv
+        (if (stringp rnv)
+            rnv
+          (buffer-substring-no-properties (xmltok-attribute-value-start att)
+                                          (xmltok-attribute-value-end att))))))
+
+(defun xmltok-start-tag-prefix ()
+  (and xmltok-name-colon
+       (buffer-substring-no-properties (1+ xmltok-start)
+                                      xmltok-name-colon)))
+
+(defun xmltok-start-tag-local-name ()
+  (buffer-substring-no-properties (1+ (or xmltok-name-colon
+                                         xmltok-start))
+                                 xmltok-name-end))
+
+(defun xmltok-end-tag-prefix ()
+  (and xmltok-name-colon
+       (buffer-substring-no-properties (+ 2 xmltok-start)
+                                      xmltok-name-colon)))
+
+(defun xmltok-end-tag-local-name ()
+  (buffer-substring-no-properties (if xmltok-name-colon
+                                     (1+ xmltok-name-colon)
+                                   (+ 2 xmltok-start))
+                                 xmltok-name-end))
+
+(defun xmltok-start-tag-qname ()
+  (buffer-substring-no-properties (+ xmltok-start 1) xmltok-name-end))
+
+(defun xmltok-end-tag-qname ()
+  (buffer-substring-no-properties (+ xmltok-start 2) xmltok-name-end))
+
+(defsubst xmltok-make-attribute (name-begin
+                                name-colon
+                                name-end
+                                &optional
+                                value-begin
+                                value-end
+                                raw-normalized-value)
+  "Make an attribute.  RAW-NORMALIZED-VALUE is nil if the value is
+not well-formed, t if the normalized value is the string between
+VALUE-BEGIN and VALUE-END, otherwise a STRING giving the value."
+  (vector name-begin
+         name-colon
+         name-end
+         value-begin
+         value-end
+         raw-normalized-value
+         nil))
+
+(defsubst xmltok-error-message (err)
+  (aref err 0))
+
+(defsubst xmltok-error-start (err)
+  (aref err 1))
+
+(defsubst xmltok-error-end (err)
+  (aref err 2))
+
+(defsubst xmltok-make-error (message start end)
+  (vector message start end))
+
+(defun xmltok-add-error (message &optional start end)
+  (setq xmltok-errors
+       (cons (xmltok-make-error message
+                                (or start xmltok-start)
+                                (or end (point)))
+             xmltok-errors)))
+
+(defun xmltok-add-dependent (fun &optional start end &rest args)
+  (setq xmltok-dependent-regions
+       (cons (cons fun
+                   (cons (or start xmltok-start)
+                         (cons (or end (point-max))
+                               args)))
+             xmltok-dependent-regions)))
+
+(defun xmltok-forward ()
+  (setq xmltok-start (point))
+  (let* ((case-fold-search nil)
+        (space-count (skip-chars-forward " \t\r\n"))
+        (ch (char-after)))
+    (cond ((eq ch ?\<)
+          (cond ((> space-count 0)
+                 (setq xmltok-type 'space))
+                (t
+                 (goto-char (1+ (point)))
+                 (xmltok-scan-after-lt))))
+         ((eq ch ?\&)
+          (cond ((> space-count 0)
+                 (setq xmltok-type 'space))
+                (t
+                 (goto-char (1+ (point)))
+                 (xmltok-scan-after-amp
+                  (lambda (start end)
+                    (xmltok-handle-entity start end))))))
+         ((re-search-forward "[<&]\\|\\(]]>\\)" nil t)
+          (cond ((not (match-beginning 1))
+                 (goto-char (match-beginning 0))
+                 ;; must have got a non-space char
+                 (setq xmltok-type 'data))
+                ((= (match-beginning 1) xmltok-start)
+                 (xmltok-add-error "Found `]]>' not closing a CDATA section")
+                 (setq xmltok-type 'not-well-formed))
+                (t
+                 (goto-char (match-beginning 0))
+                 (setq xmltok-type
+                       (if (= (point) (+ xmltok-start space-count))
+                           'space
+                         'data)))))
+         ((eq ch nil)
+          (setq xmltok-type
+                (if (> space-count 0)
+                    'space
+                  nil)))
+         (t
+          (goto-char (point-max))
+          (setq xmltok-type 'data)))))
+
+(defun xmltok-forward-special (bound)
+  "Scan forward past the first special token starting at or after point.
+Return nil if there is no special token that starts before BOUND.
+CDATA sections, processing instructions and comments (and indeed
+anything starting with < following by ? or !) count
+as special.  Return the type of the token."
+  (when (re-search-forward "<[?!]" (1+ bound) t)
+    (setq xmltok-start (match-beginning 0))
+    (goto-char (1+ xmltok-start))
+    (let ((case-fold-search nil))
+      (xmltok-scan-after-lt))))
+
+(eval-when-compile
+
+  ;; A symbolic regexp is represented by a list whose CAR is the string
+  ;; containing the regexp and whose cdr is a list of symbolic names
+  ;; for the groups in the string.
+
+  ;; Construct a symbolic regexp from a regexp.
+  (defun xmltok-r (str)
+    (cons str nil))
+
+  ;; Concatenate zero of more regexps and symbolic regexps.
+  (defun xmltok+ (&rest args)
+    (let (strs names)
+      (while args
+       (let ((arg (car args)))
+         (if (stringp arg)
+             (setq strs (cons arg strs))
+           (setq strs (cons (car arg) strs))
+           (setq names (cons (cdr arg) names)))
+         (setq args (cdr args))))
+      (cons (apply 'concat (nreverse strs))
+           (apply 'append (nreverse names))))))
+
+(eval-when-compile
+  ;; Make a symbolic group named NAME from the regexp R.
+  ;; R may be a symbolic regexp or an ordinary regexp.
+  (defmacro xmltok-g (name &rest r)
+    (let ((sym (make-symbol "r")))
+      `(let ((,sym (xmltok+ ,@r)))
+        (if (stringp ,sym)
+            (cons (concat "\\(" ,sym "\\)") (cons ',name nil))
+          (cons (concat "\\(" (car ,sym) "\\)") (cons ',name (cdr ,sym)))))))
+
+  (defun xmltok-p (&rest r) (xmltok+ "\\(?:" 
+                                    (apply 'xmltok+ r)
+                                    "\\)"))
+
+  ;; Get the group index of ELEM in a LIST of symbols.
+  (defun xmltok-get-index (elem list)
+    (or elem
+       (error "Missing group name"))
+    (let ((found nil)
+         (i 1))
+      (while list
+       (cond ((eq elem (car list))
+              (setq found i)
+              (setq list nil))
+             (t
+              (setq i (1+ i))
+              (setq list (cdr list)))))
+      (or found
+         (error "Bad group name %s" elem))))
+
+  ;; Define a macro SYM using a symbolic regexp R.
+  ;; SYM can be called in three ways:
+  ;; (SYM regexp)
+  ;;   expands to the regexp in R
+  ;; (SYM start G)
+  ;;   expands to
+  ;;   (match-beginning N)
+  ;;   where N is the group index of G in R.
+  ;; (SYM end G)
+  ;;   expands to
+  ;;   (match-end N)
+  ;;   where N is the group index of G in R.
+  (defmacro xmltok-defregexp (sym r)
+    `(defalias ',sym
+       (let ((r ,r))
+        `(macro lambda (action &optional group-name)
+                (cond ((eq action 'regexp)
+                       ,(car r))
+                      ((or (eq action 'start) (eq action 'beginning))
+                       (list 'match-beginning (xmltok-get-index group-name
+                                                                ',(cdr r))))
+                      ((eq action 'end)
+                       (list 'match-end (xmltok-get-index group-name
+                                                          ',(cdr r))))
+                      ((eq action 'string)
+                       (list 'match-string
+                             (xmltok-get-index group-name ',(cdr r))))
+                      ((eq action 'string-no-properties)
+                       (list 'match-string-no-properties
+                             (xmltok-get-index group-name ',(cdr r))))
+                      (t (error "Invalid action: %s" action))))))))
+  
+
+(eval-when-compile
+  (let* ((or "\\|")
+        (open "\\(?:")
+        (gopen "\\(")
+        (close "\\)")
+        (name-start-char "[_[:alpha:]]")
+        (name-continue-not-start-char "[-.[:digit:]]")
+        (name-continue-char "[-._[:alnum:]]")
+        (* "*")
+        (+ "+")
+        (opt "?")
+        (question "\\?")
+        (s "[ \r\t\n]")
+        (s+ (concat s +))
+        (s* (concat s *))
+        (ncname (concat name-start-char name-continue-char *))
+        (entity-ref
+         (xmltok+ (xmltok-g entity-name ncname)
+                  (xmltok-g entity-ref-close ";") opt))
+        (decimal-ref
+         (xmltok+ (xmltok-g decimal "[0-9]" +)
+                  (xmltok-g decimal-ref-close ";") opt))
+        (hex-ref
+         (xmltok+ "x" open
+                  (xmltok-g hex "[0-9a-fA-F]" +)
+                  (xmltok-g hex-ref-close ";") opt
+                  close opt))
+        (char-ref
+         (xmltok+ (xmltok-g number-sign "#")
+                  open decimal-ref or hex-ref close opt))
+        (start-tag-close
+         (xmltok+ open (xmltok-g start-tag-close s* ">")
+                  or open (xmltok-g empty-tag-slash s* "/")
+                  (xmltok-g empty-tag-close ">") opt close
+                  or (xmltok-g start-tag-s s+)
+                  close))
+        (start-tag
+         (xmltok+ (xmltok-g start-tag-name
+                            ncname (xmltok-g start-tag-colon ":" ncname) opt)
+                  start-tag-close opt))
+        (end-tag
+         (xmltok+ (xmltok-g end-tag-slash "/")
+                  open (xmltok-g end-tag-name
+                                 ncname
+                                 (xmltok-g end-tag-colon ":" ncname) opt)
+                  (xmltok-g end-tag-close s* ">") opt
+                  close opt))
+        (comment
+         (xmltok+ (xmltok-g markup-declaration "!")
+                  (xmltok-g comment-first-dash "-"
+                            (xmltok-g comment-open "-") opt) opt))
+        (cdata-section
+         (xmltok+ "!"
+                 (xmltok-g marked-section-open "\\[")
+                 open "C"
+                 open "D"
+                 open "A"
+                 open "T"
+                 open "A"
+                 (xmltok-g cdata-section-open "\\[" ) opt
+                 close opt             ; A
+                 close opt             ; T
+                 close opt             ; A
+                 close opt             ; D
+                 close opt))           ; C
+        (processing-instruction
+         (xmltok-g processing-instruction-question question)))
+
+    (xmltok-defregexp xmltok-ncname  (xmltok+ open ncname close))
+
+    (xmltok-defregexp xmltok-after-amp
+                     (xmltok+ entity-ref or char-ref))
+    (xmltok-defregexp xmltok-after-lt
+                     (xmltok+ start-tag
+                              or end-tag
+                              ;; cdata-section must come before comment
+                              ;; because we treat <! as a comment
+                              ;; and Emacs doesn't do fully greedy matching
+                              ;; by default
+                              or cdata-section
+                              or comment
+                              or processing-instruction))
+    (xmltok-defregexp
+     xmltok-attribute
+     (let* ((lit1
+            (xmltok+ "'"
+                     "[^<'&\r\n\t]*"
+                     (xmltok-g complex1 "[&\r\n\t][^<']*") opt
+                     "'"))
+           (lit2 (cons (replace-regexp-in-string "'" "\"" (car lit1))
+                       '(complex2)))
+           (literal (xmltok-g literal lit1 or lit2))
+           (name (xmltok+ open (xmltok-g xmlns "xmlns") or ncname close
+                          (xmltok-g colon ":" ncname) opt)))
+       (xmltok+ (xmltok-g name name)
+                s* "="
+                ;; If the literal isn't followed by what it should be,
+                ;; then the closing delimiter is probably really the
+                ;; opening delimiter of another literal, so don't
+                ;; absorb the literal in this case.
+                open s* literal start-tag-close close opt)))
+    (xmltok-defregexp
+     xmltok-xml-declaration
+     (let* ((literal-content "[-._:a-zA-Z0-9]+")
+           (literal
+            (concat open "\"" literal-content "\""
+                    or "'" literal-content "'" close))
+           (version-att
+            (xmltok+ open
+                     s+ (xmltok-g version-name "version")
+                     s* "="
+                     s* (xmltok-g version-value literal)
+                     close opt))
+           (encoding-att
+            (xmltok+ open
+                     s+ (xmltok-g encoding-name "encoding")
+                     s* "="
+                     s* (xmltok-g encoding-value literal)
+                     close opt))
+          (yes-no
+           (concat open "yes" or "no" close))
+          (standalone-att
+           (xmltok+ open
+                    s+ (xmltok-g standalone-name "standalone")
+                    s* "="
+                    s* (xmltok-g standalone-value
+                                 "\"" yes-no "\"" or "'" yes-no "'")
+                    close opt)))
+       (xmltok+ "<" question "xml"
+               version-att
+               encoding-att
+               standalone-att
+               s* question ">")))
+    (xmltok-defregexp
+     xmltok-prolog
+     (let* ((single-char (xmltok-g single-char "[[|,(\"'>]"))
+           (internal-subset-close (xmltok-g internal-subset-close
+                                            "][ \t\r\n]*>"))
+           (starts-with-close-paren
+            (xmltok-g close-paren
+                      ")"
+                      (xmltok-p
+                       (xmltok-g close-paren-occur "[+?]")
+                       or
+                       (xmltok-g close-paren-star "\\*"))
+                      opt))
+           (starts-with-percent
+            (xmltok-g percent
+                      "%" (xmltok-g param-entity-ref
+                                    ncname
+                                    (xmltok-g param-entity-ref-close
+                                              ";") opt) opt))
+           (starts-with-nmtoken-not-name
+            (xmltok-g nmtoken
+                      (xmltok-p name-continue-not-start-char or ":")
+                      (xmltok-p name-continue-char or ":") *))
+           (nmtoken-after-colon
+            (xmltok+
+             (xmltok-p name-continue-not-start-char or ":")
+             (xmltok-p name-continue-char or ":") *
+             or
+             name-start-char
+             name-continue-char *
+             ":"
+             (xmltok-p name-continue-char or ":") *))
+           (after-ncname
+            (xmltok+ (xmltok-g ncname-nmtoken
+                               ":" (xmltok-p nmtoken-after-colon))
+                     or (xmltok-p (xmltok-g colon ":" ncname)
+                                  (xmltok-g colon-name-occur "[?+*]") opt)
+                     or (xmltok-g ncname-occur "[?+*]")
+                     or (xmltok-g ncname-colon ":")))
+           (starts-with-name
+            (xmltok-g name ncname (xmltok-p after-ncname) opt))
+           (starts-with-hash
+            (xmltok-g pound
+                      "#" (xmltok-g hash-name ncname)))
+           (markup-declaration
+            (xmltok-g markup-declaration
+                      "!" (xmltok-p (xmltok-g comment-first-dash "-"
+                                              (xmltok-g comment-open "-") opt)
+                                    or (xmltok-g named-markup-declaration
+                                                ncname)) opt))
+           (after-lt
+            (xmltok+ markup-declaration
+                     or (xmltok-g processing-instruction-question
+                                  question)
+                     or (xmltok-g instance-start
+                                  ncname)))
+           (starts-with-lt (xmltok-g less-than "<" (xmltok-p after-lt) opt)))
+       (xmltok+ starts-with-lt
+               or single-char
+               or starts-with-close-paren
+               or starts-with-percent
+               or starts-with-name
+               or starts-with-nmtoken-not-name
+               or starts-with-hash
+               or internal-subset-close)))))
+
+(defconst xmltok-ncname-regexp (xmltok-ncname regexp))
+
+(defun xmltok-scan-after-lt ()
+  (cond ((not (looking-at (xmltok-after-lt regexp)))
+        (xmltok-add-error "`<' that is not markup must be entered as `&lt;'")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (goto-char (match-end 0))
+        (cond ((xmltok-after-lt start start-tag-close)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-attributes nil)
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-type 'start-tag))
+              ((xmltok-after-lt start end-tag-close)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end end-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start end-tag-colon))
+               (setq xmltok-type 'end-tag))
+              ((xmltok-after-lt start start-tag-s)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-attributes nil)
+               (xmltok-scan-attributes)
+               xmltok-type)
+              ((xmltok-after-lt start empty-tag-close)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-attributes nil)
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-type 'empty-element))
+              ((xmltok-after-lt start cdata-section-open)
+               (setq xmltok-type
+                     (if (search-forward "]]>" nil t)
+                         'cdata-section
+                       (xmltok-add-error "No closing ]]>")
+                       (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                                             nil
+                                             nil
+                                             "]]>")
+                       'not-well-formed)))
+              ((xmltok-after-lt start processing-instruction-question)
+               (xmltok-scan-after-processing-instruction-open))
+              ((xmltok-after-lt start comment-open)
+               (xmltok-scan-after-comment-open))
+              ((xmltok-after-lt start empty-tag-slash)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-attributes nil)
+               (setq xmltok-namespace-attributes nil)
+               (xmltok-add-error "Expected `/>'" (1- (point)))
+               (setq xmltok-type 'partial-empty-element))
+              ((xmltok-after-lt start start-tag-name)
+               (xmltok-add-error "Missing `>'"
+                                 nil
+                                 (1+ xmltok-start))
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-attributes nil)
+               (setq xmltok-type 'partial-start-tag))
+              ((xmltok-after-lt start end-tag-name)
+               (setq xmltok-name-end (xmltok-after-lt end end-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start end-tag-colon))
+               (cond ((and (not xmltok-name-colon)
+                           (eq (char-after) ?:))
+                      (goto-char (1+ (point)))
+                      (xmltok-add-error "Expected name following `:'"
+                                        (1- (point))))
+                     (t
+                      (xmltok-add-error "Missing `>'"
+                                        nil
+                                        (1+ xmltok-start))))
+               (setq xmltok-type 'partial-end-tag))
+              ((xmltok-after-lt start end-tag-slash)
+               (xmltok-add-error "Expected name following `</'")
+               (setq xmltok-name-end nil)
+               (setq xmltok-name-colon nil)
+               (setq xmltok-type 'partial-end-tag))
+              ((xmltok-after-lt start marked-section-open)
+               (xmltok-add-error "Expected `CDATA[' after `<!['"
+                                 xmltok-start
+                                 (+ 3 xmltok-start))
+               (setq xmltok-type 'not-well-formed))
+              ((xmltok-after-lt start comment-first-dash)
+               (xmltok-add-error "Expected `-' after `<!-'"
+                                 xmltok-start
+                                 (+ 3 xmltok-start))
+               (setq xmltok-type 'not-well-formed))
+              ((xmltok-after-lt start markup-declaration)
+               (xmltok-add-error "Expected `[CDATA[' or `--' after `<!'"
+                                 xmltok-start
+                                 (+ 2 xmltok-start))
+               (setq xmltok-type 'not-well-formed))
+              (t
+               (xmltok-add-error "Not well-formed")
+               (setq xmltok-type 'not-well-formed))))))
+
+;; XXX This should be unified with
+;; xmltok-scan-prolog-after-processing-instruction-open
+;; XXX maybe should include rest of line (up to any <,>) in unclosed PI
+(defun xmltok-scan-after-processing-instruction-open ()
+  (cond ((not (search-forward "?>" nil t))
+        (xmltok-add-error "No closing ?>"
+                          xmltok-start
+                          (+ xmltok-start 2))
+        (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                              nil
+                              nil
+                              "?>")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (cond ((not (save-excursion
+                      (goto-char (+ 2 xmltok-start))
+                      (and (looking-at (xmltok-ncname regexp))
+                           (setq xmltok-name-end (match-end 0)))))
+               (setq xmltok-name-end (+ xmltok-start 2))
+               (xmltok-add-error "<? not followed by name"
+                                 (+ xmltok-start 2)
+                                 (+ xmltok-start 3)))
+              ((not (or (memq (char-after xmltok-name-end)
+                              '(?\n ?\t ?\r ? ))
+                        (= xmltok-name-end (- (point) 2))))
+               (xmltok-add-error "Target not followed by whitespace"
+                                 xmltok-name-end
+                                 (1+ xmltok-name-end)))
+              ((and (= xmltok-name-end (+ xmltok-start 5))
+                    (save-excursion
+                      (goto-char (+ xmltok-start 2))
+                      (let ((case-fold-search t))
+                        (looking-at "xml"))))
+               (xmltok-add-error "Processing instruction target is xml"
+                                 (+ xmltok-start 2)
+                                 (+ xmltok-start 5))))
+        (setq xmltok-type 'processing-instruction))))
+               
+(defun xmltok-scan-after-comment-open ()
+  (setq xmltok-type
+       (cond ((not (search-forward "--" nil t))
+              (xmltok-add-error "No closing -->")
+              (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                                    nil
+                                    nil
+                                    ;; not --> because
+                                    ;; -- is not allowed
+                                    ;; in comments in XML
+                                    "--")
+              'not-well-formed)
+             ((eq (char-after) ?>)
+              (goto-char (1+ (point)))
+              'comment)
+             (t
+              (xmltok-add-dependent
+               'xmltok-semi-closed-reparse-p
+               nil
+               (point)
+               "--"
+               2)
+              ;; just include the <!-- in the token
+              (goto-char (+ xmltok-start 4))
+              ;; Need do this after the goto-char because
+              ;; marked error should just apply to <!--
+              (xmltok-add-error "First following `--' not followed by `>'")
+              'not-well-formed))))
+
+(defun xmltok-scan-attributes ()
+  (let ((recovering nil)
+       (atts-needing-normalization nil))
+    (while (cond ((or (looking-at (xmltok-attribute regexp))
+                     ;; use non-greedy group
+                     (when (looking-at (concat "[^<>\n]+?"
+                                               (xmltok-attribute regexp)))
+                       (unless recovering
+                         (xmltok-add-error "Malformed attribute"
+                                           (point)
+                                           (save-excursion
+                                             (goto-char (xmltok-attribute start
+                                                                          name))
+                                             (skip-chars-backward "\r\n\t ")
+                                             (point))))
+                       t))
+                 (setq recovering nil)
+                 (goto-char (match-end 0))
+                 (let ((att (xmltok-add-attribute)))
+                   (when att
+                     (setq atts-needing-normalization
+                           (cons att atts-needing-normalization))))
+                 (cond ((xmltok-attribute start start-tag-s) t)
+                       ((xmltok-attribute start start-tag-close)
+                        (setq xmltok-type 'start-tag)
+                        nil)
+                       ((xmltok-attribute start empty-tag-close)
+                        (setq xmltok-type 'empty-element)
+                        nil)
+                       ((xmltok-attribute start empty-tag-slash)
+                        (setq xmltok-type 'partial-empty-element)
+                        (xmltok-add-error "Expected `/>'"
+                                          (1- (point)))
+                        nil)
+                       ((looking-at "[ \t\r\n]*[\"']")
+                        (goto-char (match-end 0))
+                        (xmltok-add-error "Missing closing delimiter"
+                                          (1- (point)))
+                        (setq recovering t)
+                        t)
+                       ((looking-at "[ \t]*\\([^ \t\r\n\"'=<>/]+\\)[ \t\r\n/>]")
+                        (goto-char (match-end 1))
+                        (xmltok-add-error "Attribute value not quoted"
+                                          (match-beginning 1))
+                        (setq recovering t)
+                        t)
+                       (t
+                        (xmltok-add-error "Missing attribute value"
+                                          (1- (point)))
+                        (setq recovering t)
+                        t)))
+                ((looking-at "[^<>\n]*/>")
+                 (let ((start (point)))
+                   (goto-char (match-end 0))
+                   (unless recovering
+                     (xmltok-add-error "Malformed empty-element"
+                                       start
+                                       (- (point) 2))))
+                 (setq xmltok-type 'empty-element)
+                 nil)
+                ((looking-at "[^<>\n]*>")
+                 (let ((start (point)))
+                   (goto-char (match-end 0))
+                   (unless recovering
+                     (xmltok-add-error "Malformed start-tag"
+                                       start
+                                       (1- (point)))))
+                 (setq xmltok-type 'start-tag)
+                 nil)
+                (t
+                 (when recovering
+                   (skip-chars-forward "^<>\n"))
+                 (xmltok-add-error "Missing `>'"
+                                   xmltok-start
+                                   (1+ xmltok-start))
+                 (setq xmltok-type 'partial-start-tag)
+                 nil)))
+    (while atts-needing-normalization
+      (xmltok-normalize-attribute (car atts-needing-normalization))
+      (setq atts-needing-normalization (cdr atts-needing-normalization))))
+  (setq xmltok-attributes
+       (nreverse xmltok-attributes))
+  (setq xmltok-namespace-attributes
+       (nreverse xmltok-namespace-attributes)))
+
+(defun xmltok-add-attribute ()
+  "Return the attribute if it needs normalizing, otherwise nil."
+  (let* ((needs-normalizing nil)
+        (att
+         (if (xmltok-attribute start literal)
+             (progn
+               (setq needs-normalizing
+                     (or (xmltok-attribute start complex1)
+                         (xmltok-attribute start complex2)))
+               (xmltok-make-attribute (xmltok-attribute start name)
+                                      (xmltok-attribute start colon)
+                                      (xmltok-attribute end name)
+                                      (1+ (xmltok-attribute start literal))
+                                      (1- (xmltok-attribute end literal))
+                                      (not needs-normalizing)))
+          (xmltok-make-attribute (xmltok-attribute start name)
+                                 (xmltok-attribute start colon)
+                                 (xmltok-attribute end name)))))
+    (if (xmltok-attribute start xmlns)
+       (setq xmltok-namespace-attributes
+             (cons att xmltok-namespace-attributes))
+      (setq xmltok-attributes
+           (cons att xmltok-attributes)))
+    (and needs-normalizing
+        att)))
+        
+(defun xmltok-normalize-attribute (att)
+  (let ((end (xmltok-attribute-value-end att))
+       (well-formed t)
+       (value-parts nil)
+       (refs nil))
+    (save-excursion
+      (goto-char (xmltok-attribute-value-start att))
+      (while (progn
+              (let ((n (skip-chars-forward "^\r\t\n&" end)))
+                (when (> n 0)
+                  (setq value-parts
+                        (cons (buffer-substring-no-properties (- (point) n)
+                                                              (point))
+                              value-parts))))
+              (when (< (point) end)
+                (goto-char (1+ (point)))
+                (cond ((eq (char-before) ?\&)
+                       (let ((xmltok-start (1- (point)))
+                              xmltok-type xmltok-replacement)
+                         (xmltok-scan-after-amp
+                          (lambda (start end)
+                            (xmltok-handle-entity start end t)))
+                         (cond ((or (eq xmltok-type 'char-ref)
+                                    (eq xmltok-type 'entity-ref))
+                                (setq refs
+                                      (cons (vector xmltok-type
+                                                    xmltok-start
+                                                    (point))
+                                            refs))
+                                (if xmltok-replacement
+                                    (setq value-parts
+                                          (cons xmltok-replacement
+                                                value-parts))
+                                  (setq well-formed nil)))
+                               (t (setq well-formed nil)))))
+                      (t (setq value-parts
+                               (cons " " value-parts)))))
+              (< (point) end))))
+    (when well-formed
+      (aset att 5 (apply 'concat (nreverse value-parts))))
+    (aset att 6 (nreverse refs))))
+
+(defun xmltok-scan-after-amp (entity-handler)
+  (cond ((not (looking-at (xmltok-after-amp regexp)))
+        (xmltok-add-error "`&' that is not markup must be entered as `&amp;'")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (goto-char (match-end 0))
+        (cond ((xmltok-after-amp start entity-ref-close)
+               (funcall entity-handler
+                        (xmltok-after-amp start entity-name)
+                        (xmltok-after-amp end entity-name))
+               (setq xmltok-type 'entity-ref))
+              ((xmltok-after-amp start decimal-ref-close)
+               (xmltok-scan-char-ref (xmltok-after-amp start decimal)
+                                     (xmltok-after-amp end decimal)
+                                     10))
+              ((xmltok-after-amp start hex-ref-close)
+               (xmltok-scan-char-ref (xmltok-after-amp start hex)
+                                     (xmltok-after-amp end hex)
+                                     16))
+              ((xmltok-after-amp start number-sign)
+               (xmltok-add-error "Missing character number")
+               (setq xmltok-type 'not-well-formed))
+              (t
+               (xmltok-add-error "Missing closing `;'")
+               (setq xmltok-type 'not-well-formed))))))
+
+(defconst xmltok-entity-error-messages
+  '((unparsed . "Referenced entity is unparsed")
+    (not-well-formed . "Referenced entity is not well-formed")
+    (external nil . "Referenced entity is external")
+    (element nil . "Referenced entity contains <")))
+
+(defun xmltok-handle-entity (start end &optional attributep)
+  (let* ((name (buffer-substring-no-properties start end))
+        (name-def (assoc name xmltok-dtd))
+        (def (cdr name-def)))
+    (cond ((setq xmltok-replacement (and (consp def)
+                                        (if attributep
+                                            (cdr def)
+                                          (car def)))))
+         ((null name-def)
+          (unless (eq (car xmltok-dtd) t)
+            (xmltok-add-error "Referenced entity has not been defined"
+                              start
+                              end)))
+         ((and attributep (consp def))
+          (xmltok-add-error "Referenced entity contains <"
+                            start
+                            end))
+         (t
+          (let ((err (cdr (assq def xmltok-entity-error-messages))))
+            (when (consp err)
+              (setq err (if attributep (cdr err) (car err))))
+            (when err
+              (xmltok-add-error err start end)))))))
+
+(defun xmltok-scan-char-ref (start end base)
+  (setq xmltok-replacement
+       (let ((n (string-to-int (buffer-substring-no-properties start end)
+                               base)))
+         (cond ((and (integerp n) (xmltok-valid-char-p n))
+                (setq n (xmltok-unicode-to-char n))
+                (and n (string n)))
+               (t
+                (xmltok-add-error "Invalid character code" start end)
+                nil))))
+  (setq xmltok-type 'char-ref))
+
+(defun xmltok-char-number (start end)
+  (let* ((base (if (eq (char-after (+ start 2)) ?x)
+                  16
+                10))
+        (n (string-to-int
+            (buffer-substring-no-properties (+ start (if (= base 16) 3 2))
+                                            (1- end))
+            base)))
+    (and (integerp n)
+        (xmltok-valid-char-p n)
+        n)))
+
+(defun xmltok-unclosed-reparse-p (change-start
+                                 change-end
+                                 pre-change-length
+                                 start
+                                 end
+                                 delimiter)
+  (let ((len-1 (1- (length delimiter))))
+    (goto-char (max start (- change-start len-1)))
+    (search-forward delimiter (min end (+ change-end len-1)) t)))
+
+;; Handles a <!-- with the next -- not followed by >
+
+(defun xmltok-semi-closed-reparse-p (change-start
+                                    change-end
+                                    pre-change-length
+                                    start
+                                    end
+                                    delimiter
+                                    delimiter-length)
+  (or (<= (- end delimiter-length) change-end)
+      (xmltok-unclosed-reparse-p change-start
+                                change-end
+                                pre-change-length
+                                start
+                                end
+                                delimiter)))
+
+(defun xmltok-valid-char-p (n)
+  "Return non-nil if n is the Unicode code of a valid XML character."
+  (cond ((< n #x20) (memq n '(#xA #xD #x9)))
+       ((< n #xD800) t)
+       ((< n #xE000) nil)
+       ((< n #xFFFE) t)
+       (t (and (> n #xFFFF)
+               (< n #x110000)))))
+
+(defun xmltok-unicode-to-char (n)
+  "Return the character corresponding to Unicode scalar value N.
+Return nil if unsupported in Emacs."
+  (decode-char 'ucs n))
+
+;;; Prolog parsing
+
+(defvar xmltok-contains-doctype nil)
+(defvar xmltok-doctype-external-subset-flag nil)
+(defvar xmltok-internal-subset-start nil)
+(defvar xmltok-had-param-entity-ref nil)
+(defvar xmltok-prolog-regions nil)
+(defvar xmltok-standalone nil
+  "Non-nil if there was an XML declaration specifying standalone=\"yes\",")
+(defvar xmltok-markup-declaration-doctype-flag nil)
+
+(defconst xmltok-predefined-entity-alist
+  '(("lt" "<" . "<")
+    ("gt" ">" . ">")
+    ("amp" "&" . "&")
+    ("apos" "'" . "'")
+    ("quot" "\"" . "\"")))
+
+(defun xmltok-forward-prolog ()
+  "Move forward to the end of the XML prolog.
+
+Returns a list of vectors [TYPE START END] where TYPE is a symbol and
+START and END are integers giving the start and end of the region of
+that type.  TYPE can be one of xml-declaration,
+xml-declaration-attribute-name, xml-declaration-attribute-value,
+comment, processing-instruction-left, processing-instruction-right,
+markup-declaration-open.  markup-declaration-close,
+internal-subset-open, internal-subset-close, hash-name, keyword,
+literal, encoding-name.
+Adds to `xmltok-errors' and `xmltok-dependent-regions' as appropriate."
+  (let ((case-fold-search nil)
+       xmltok-start
+       xmltok-type
+       xmltok-prolog-regions
+       xmltok-contains-doctype
+       xmltok-internal-subset-start
+       xmltok-had-param-entity-ref
+       xmltok-standalone
+       xmltok-doctype-external-subset-flag
+       xmltok-markup-declaration-doctype-flag)
+    (setq xmltok-dtd xmltok-predefined-entity-alist)
+    (xmltok-scan-xml-declaration)
+    (xmltok-next-prolog-token)
+    (while (condition-case err
+              (when (xmltok-parse-prolog-item)
+                (xmltok-next-prolog-token))
+            (xmltok-markup-declaration-parse-error
+             (xmltok-skip-markup-declaration))))
+    (when xmltok-internal-subset-start
+      (xmltok-add-error "No closing ]"
+                       (1- xmltok-internal-subset-start)
+                       xmltok-internal-subset-start))
+    (xmltok-parse-entities)
+    ;; XXX prune dependent-regions for those entirely in prolog
+    (nreverse xmltok-prolog-regions)))
+
+(defconst xmltok-bad-xml-decl-regexp
+  "[ \t\r\n]*<\\?xml\\(?:[ \t\r\n]\\|\\?>\\)")
+
+;;;###autoload
+(defun xmltok-get-declared-encoding-position (&optional limit)
+  "Return the position of the encoding in the XML declaration at point.
+If there is a well-formed XML declaration starting at point and it
+contains an encoding declaration, then return (START . END)
+where START and END are the positions of the start and the end
+of the encoding name; if there is no encoding declaration return
+the position where and encoding declaration could be inserted.
+If there is XML that is not well-formed that looks like an XML declaration,
+return nil.  Otherwise, return t.
+If LIMIT is non-nil, then do not consider characters beyond LIMIT."
+  (cond ((let ((case-fold-search nil))
+          (and (looking-at (xmltok-xml-declaration regexp))
+               (or (not limit) (<= (match-end 0) limit))))
+        (let ((end (xmltok-xml-declaration end encoding-value)))
+          (if end
+              (cons (1+ (xmltok-xml-declaration start encoding-value))
+                    (1- end))
+            (or (xmltok-xml-declaration end version-value)
+                (+ (point) 5)))))
+       ((not (let ((case-fold-search t))
+               (looking-at xmltok-bad-xml-decl-regexp))))))
+               
+(defun xmltok-scan-xml-declaration ()
+  (when (looking-at (xmltok-xml-declaration regexp))
+    (xmltok-add-prolog-region 'xml-declaration (point) (match-end 0))
+    (goto-char (match-end 0))
+    (when (xmltok-xml-declaration start version-name)
+      (xmltok-add-prolog-region 'xml-declaration-attribute-name
+                               (xmltok-xml-declaration start version-name)
+                               (xmltok-xml-declaration end version-name))
+      (let ((start (xmltok-xml-declaration start version-value))
+           (end (xmltok-xml-declaration end version-value)))
+       (xmltok-add-prolog-region 'xml-declaration-attribute-value
+                                 start
+                                 end)))
+    ;; XXX need to check encoding name
+    ;; Should start with letter, not contain colon
+    (when (xmltok-xml-declaration start encoding-name)
+      (xmltok-add-prolog-region 'xml-declaration-attribute-name
+                               (xmltok-xml-declaration start encoding-name)
+                               (xmltok-xml-declaration end encoding-name))
+      (let ((start (xmltok-xml-declaration start encoding-value))
+           (end (xmltok-xml-declaration end encoding-value)))
+       (xmltok-add-prolog-region 'encoding-name
+                                 (1+ start)
+                                 (1- end))
+       (xmltok-add-prolog-region 'xml-declaration-attribute-value
+                                 start
+                                 end)))
+    (when (xmltok-xml-declaration start standalone-name)
+      (xmltok-add-prolog-region 'xml-declaration-attribute-name
+                               (xmltok-xml-declaration start standalone-name)
+                               (xmltok-xml-declaration end standalone-name))
+      (let ((start (xmltok-xml-declaration start standalone-value))
+           (end (xmltok-xml-declaration end standalone-value)))
+       (xmltok-add-prolog-region 'xml-declaration-attribute-value
+                                 start
+                                 end)
+       (setq xmltok-standalone
+             (string= (buffer-substring-no-properties (1+ start) (1- end))
+                      "yes"))))
+    t))
+
+(defconst xmltok-markup-declaration-alist
+  '(("ELEMENT" . xmltok-parse-element-declaration)
+    ("ATTLIST" . xmltok-parse-attlist-declaration)
+    ("ENTITY" . xmltok-parse-entity-declaration)
+    ("NOTATION" . xmltok-parse-notation-declaration)))
+
+(defun xmltok-parse-prolog-item ()
+  (cond ((eq xmltok-type 'comment)
+        (xmltok-add-prolog-region 'comment
+                                  xmltok-start
+                                  (point))
+        t)
+       ((eq xmltok-type 'processing-instruction))
+       ((eq xmltok-type 'named-markup-declaration)
+        (setq xmltok-markup-declaration-doctype-flag nil)
+        (xmltok-add-prolog-region 'markup-declaration-open
+                                  xmltok-start
+                                  (point))
+        (let* ((name (buffer-substring-no-properties
+                      (+ xmltok-start 2)
+                      (point)))
+               (fun (cdr (assoc name xmltok-markup-declaration-alist))))
+          (cond (fun
+                 (unless xmltok-internal-subset-start
+                   (xmltok-add-error
+                    "Declaration allowed only in internal subset"))
+                 (funcall fun))
+                ((string= name "DOCTYPE")
+                 (xmltok-parse-doctype))
+                (t
+                 (xmltok-add-error "Unknown markup declaration"
+                                   (+ xmltok-start 2))
+                 (xmltok-next-prolog-token)
+                 (xmltok-markup-declaration-parse-error))))
+        t)
+       ((or (eq xmltok-type 'end-prolog)
+            (not xmltok-type))
+        nil)
+       ((eq xmltok-type 'internal-subset-close)
+        (xmltok-add-prolog-region 'internal-subset-close
+                                  xmltok-start
+                                  (1+ xmltok-start))
+        (xmltok-add-prolog-region 'markup-declaration-close
+                                  (1- (point))
+                                  (point))
+        (if xmltok-internal-subset-start
+            (setq xmltok-internal-subset-start nil)
+          (xmltok-add-error "]> outside internal subset"))
+        t)
+       ((eq xmltok-type 'param-entity-ref)
+        (if xmltok-internal-subset-start
+            (setq xmltok-had-param-entity-ref t)
+          (xmltok-add-error "Parameter entity reference outside document type declaration"))
+        t)
+       ;; If we don't do this, we can get thousands of errors when
+       ;; a plain text file is parsed.
+       ((not xmltok-internal-subset-start)
+        (when (let ((err (car xmltok-errors)))
+                (or (not err)
+                    (<= (xmltok-error-end err) xmltok-start)))
+          (goto-char xmltok-start))
+        nil)
+       ((eq xmltok-type 'not-well-formed) t)
+       (t
+        (xmltok-add-error "Token allowed only inside markup declaration")
+        t)))
+
+(defun xmltok-parse-doctype ()
+  (setq xmltok-markup-declaration-doctype-flag t)
+  (xmltok-next-prolog-token)
+  (when xmltok-internal-subset-start
+    (xmltok-add-error "DOCTYPE declaration not allowed in internal subset")
+    (xmltok-markup-declaration-parse-error))
+  (when xmltok-contains-doctype
+    (xmltok-add-error "Duplicate DOCTYPE declaration")
+    (xmltok-markup-declaration-parse-error))
+  (setq xmltok-contains-doctype t)
+  (xmltok-require-token 'name 'prefixed-name)
+  (xmltok-require-next-token "SYSTEM" "PUBLIC" ?\[ ?>)
+  (cond ((eq xmltok-type ?\[)
+        (setq xmltok-internal-subset-start (point)))
+       ((eq xmltok-type ?>))
+       (t
+        (setq xmltok-doctype-external-subset-flag t)
+        (xmltok-parse-external-id)
+        (xmltok-require-token ?\[ ?>)
+        (when (eq xmltok-type ?\[)
+          (setq xmltok-internal-subset-start (point))))))
+
+(defun xmltok-parse-attlist-declaration ()
+  (xmltok-require-next-token 'prefixed-name 'name)
+  (while (progn
+          (xmltok-require-next-token ?> 'name 'prefixed-name)
+          (if (eq xmltok-type ?>)
+              nil
+            (xmltok-require-next-token ?\(
+                                       "CDATA"
+                                       "ID"
+                                       "IDREF"
+                                       "IDREFS"
+                                       "ENTITY"
+                                       "ENTITIES"
+                                       "NMTOKEN"
+                                       "NMTOKENS"
+                                       "NOTATION")
+            (cond ((eq xmltok-type ?\()
+                   (xmltok-parse-nmtoken-group))
+                  ((string= (xmltok-current-token-string)
+                            "NOTATION")
+                   (xmltok-require-next-token ?\()
+                   (xmltok-parse-nmtoken-group)))
+            (xmltok-require-next-token "#IMPLIED"
+                                       "#REQUIRED"
+                                       "#FIXED"
+                                       'literal)
+            (when (string= (xmltok-current-token-string) "#FIXED")
+              (xmltok-require-next-token 'literal))
+            t))))
+                  
+(defun xmltok-parse-nmtoken-group ()
+  (while (progn
+          (xmltok-require-next-token 'nmtoken 'prefixed-name 'name)
+          (xmltok-require-next-token ?| ?\))
+          (eq xmltok-type ?|))))
+
+(defun xmltok-parse-element-declaration ()
+  (xmltok-require-next-token 'name 'prefixed-name)
+  (xmltok-require-next-token "EMPTY" "ANY" ?\()
+  (when (eq xmltok-type ?\()
+    (xmltok-require-next-token "#PCDATA"
+                              'name
+                              'prefixed-name
+                              'name-occur
+                              ?\()
+    (cond ((eq xmltok-type 'hash-name)
+          (xmltok-require-next-token ?| ?\) 'close-paren-star)
+          (while (eq xmltok-type ?|)
+            (xmltok-require-next-token 'name 'prefixed-name)
+            (xmltok-require-next-token 'close-paren-star ?|)))
+         (t (xmltok-parse-model-group))))
+  (xmltok-require-next-token ?>))
+
+(defun xmltok-parse-model-group ()
+  (xmltok-parse-model-group-member)
+  (xmltok-require-next-token ?|
+                            ?,
+                            ?\)
+                            'close-paren-star
+                            'close-paren-occur)
+  (when (memq xmltok-type '(?, ?|))
+    (let ((connector xmltok-type))
+      (while (progn
+              (xmltok-next-prolog-token)
+              (xmltok-parse-model-group-member)
+              (xmltok-require-next-token connector
+                                         ?\)
+                                         'close-paren-star
+                                         'close-paren-occur)
+              (eq xmltok-type connector))))))
+                                         
+(defun xmltok-parse-model-group-member ()
+  (xmltok-require-token 'name
+                       'prefixed-name
+                       'name-occur
+                       ?\()
+  (when (eq xmltok-type ?\()
+    (xmltok-next-prolog-token)
+    (xmltok-parse-model-group)))
+    
+(defun xmltok-parse-entity-declaration ()
+  (let (paramp name)
+    (xmltok-require-next-token 'name ?%)
+    (when (eq xmltok-type ?%)
+      (setq paramp t)
+      (xmltok-require-next-token 'name))
+    (setq name (xmltok-current-token-string))
+    (xmltok-require-next-token 'literal "SYSTEM" "PUBLIC")
+    (cond ((eq xmltok-type 'literal)
+          (let ((replacement (xmltok-parse-entity-value)))
+            (unless paramp
+              (xmltok-define-entity name replacement)))
+          (xmltok-require-next-token ?>))
+         (t
+          (xmltok-parse-external-id)
+          (if paramp
+              (xmltok-require-token ?>)
+            (xmltok-require-token ?> "NDATA")
+            (if (eq xmltok-type ?>)
+                (xmltok-define-entity name 'external)
+              (xmltok-require-next-token 'name)
+              (xmltok-require-next-token ?>)
+              (xmltok-define-entity name 'unparsed)))))))
+
+(defun xmltok-define-entity (name value)
+  (when (and (or (not xmltok-had-param-entity-ref)
+                xmltok-standalone)
+            (not (assoc name xmltok-dtd)))
+    (setq xmltok-dtd
+         (cons (cons name value) xmltok-dtd))))
+  
+(defun xmltok-parse-entity-value ()
+  (let ((lim (1- (point)))
+       (well-formed t)
+       value-parts
+       start)
+    (save-excursion
+      (goto-char (1+ xmltok-start))
+      (setq start (point))
+      (while (progn
+              (skip-chars-forward "^%&" lim)
+              (when (< (point) lim)
+                (goto-char (1+ (point)))
+                (cond ((eq (char-before) ?%)
+                       (xmltok-add-error "Parameter entity references are not allowed in the internal subset"
+                                         (1- (point))
+                                         (point))
+                       (setq well-formed  nil))
+                      (t
+                       (let ((xmltok-start (1- (point)))
+                              xmltok-type xmltok-replacement)
+                         (xmltok-scan-after-amp (lambda (start end)))
+                         (cond ((eq xmltok-type 'char-ref)
+                                (setq value-parts
+                                      (cons (buffer-substring-no-properties
+                                             start
+                                             xmltok-start)
+                                            value-parts))
+                                (setq value-parts
+                                      (cons xmltok-replacement
+                                            value-parts))
+                                (setq start (point)))
+                               ((eq xmltok-type 'not-well-formed)
+                                (setq well-formed nil))))))
+                t))))
+    (if (not well-formed)
+       nil
+      (apply 'concat
+            (nreverse (cons (buffer-substring-no-properties start lim)
+                            value-parts))))))
+                    
+(defun xmltok-parse-notation-declaration ()
+  (xmltok-require-next-token 'name)
+  (xmltok-require-next-token "SYSTEM" "PUBLIC")
+  (let ((publicp (string= (xmltok-current-token-string) "PUBLIC")))
+    (xmltok-require-next-token 'literal)
+    (cond (publicp
+          (xmltok-require-next-token 'literal ?>)
+          (unless (eq xmltok-type ?>)
+            (xmltok-require-next-token ?>)))
+         (t (xmltok-require-next-token ?>)))))
+
+(defun xmltok-parse-external-id ()
+  (xmltok-require-token "SYSTEM" "PUBLIC")
+  (let ((publicp (string= (xmltok-current-token-string) "PUBLIC")))
+    (xmltok-require-next-token 'literal)
+    (when publicp
+      (xmltok-require-next-token 'literal)))
+  (xmltok-next-prolog-token))
+
+(defun xmltok-require-next-token (&rest types)
+  (xmltok-next-prolog-token)
+  (apply 'xmltok-require-token types))
+
+(defun xmltok-require-token (&rest types)
+  ;; XXX Generate a more helpful error message
+  (while (and (not (let ((type (car types)))
+                    (if (stringp (car types))
+                        (string= (xmltok-current-token-string) type)
+                      (eq type xmltok-type))))
+             (setq types (cdr types))))
+  (unless types
+    (when (and xmltok-type
+              (not (eq xmltok-type 'not-well-formed)))
+      (xmltok-add-error "Unexpected token"))
+    (xmltok-markup-declaration-parse-error))
+  (let ((region-type (xmltok-prolog-region-type (car types))))
+    (when region-type
+      (xmltok-add-prolog-region region-type
+                               xmltok-start
+                               (point)))))
+
+(defun xmltok-current-token-string ()
+  (buffer-substring-no-properties xmltok-start (point)))
+
+(put 'xmltok-markup-declaration-parse-error
+     'error-conditions
+     '(error xmltok-markup-declaration-parse-error))
+
+(put 'xmltok-markup-declaration-parse-error
+     'error-message
+     "Syntax error in markup declaration")
+
+(defun xmltok-markup-declaration-parse-error ()
+  (signal 'xmltok-markup-declaration-parse-error nil))
+
+(defun xmltok-skip-markup-declaration ()
+  (while (cond ((eq xmltok-type ?>)
+               (xmltok-next-prolog-token)
+               nil)
+              ((and xmltok-markup-declaration-doctype-flag
+                    (eq xmltok-type ?\[))
+               (setq xmltok-internal-subset-start (point))
+               (xmltok-next-prolog-token)
+               nil)
+              ((memq xmltok-type '(nil
+                                   end-prolog
+                                   named-markup-declaration
+                                   comment
+                                   processing-instruction))
+               nil)
+              ((and xmltok-internal-subset-start
+                    (eq xmltok-type 'internal-subset-close))
+               nil)
+              (t (xmltok-next-prolog-token) t)))
+  xmltok-type)
+
+(defun xmltok-prolog-region-type (required)
+  (cond ((cdr (assq xmltok-type
+                   '((literal . literal)
+                     (?> . markup-declaration-close)
+                     (?\[ . internal-subset-open)
+                     (hash-name . hash-name)))))
+       ((and (stringp required) (eq xmltok-type 'name))
+        'keyword)))
+        
+;; Return new token type.
+                                   
+(defun xmltok-next-prolog-token ()
+  (skip-chars-forward " \t\r\n")
+  (setq xmltok-start (point))
+  (cond ((not (and (looking-at (xmltok-prolog regexp))
+                  (goto-char (match-end 0))))
+        (let ((ch (char-after)))
+          (cond (ch
+                 (goto-char (1+ (point)))
+                 (xmltok-add-error "Illegal char in prolog")
+                 (setq xmltok-type 'not-well-formed))
+                (t (setq xmltok-type nil)))))
+       ((or (xmltok-prolog start ncname-occur)
+            (xmltok-prolog start colon-name-occur))
+        (setq xmltok-name-end (1- (point)))
+        (setq xmltok-name-colon (xmltok-prolog start colon))
+        (setq xmltok-type 'name-occur))
+       ((xmltok-prolog start colon)
+        (setq xmltok-name-end (point))
+        (setq xmltok-name-colon (xmltok-prolog start colon))
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name"))
+        (setq xmltok-type 'prefixed-name))
+       ((or (xmltok-prolog start ncname-nmtoken)
+            (xmltok-prolog start ncname-colon))
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name token"))
+        (setq xmltok-type 'nmtoken))
+       ((xmltok-prolog start name)     
+        (setq xmltok-name-end (point))
+        (setq xmltok-name-colon nil)
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name"))
+        (setq xmltok-type 'name))
+       ((xmltok-prolog start hash-name)        
+        (setq xmltok-name-end (point))
+        (unless (looking-at "[ \t\r\n>)|%]")
+          (xmltok-add-error "Missing space after name"))
+        (setq xmltok-type 'hash-name))
+       ((xmltok-prolog start processing-instruction-question)
+        (xmltok-scan-prolog-after-processing-instruction-open))
+       ((xmltok-prolog start comment-open)
+        ;; XXX if not-well-formed, ignore some stuff
+        (xmltok-scan-after-comment-open))
+       ((xmltok-prolog start named-markup-declaration)
+        (setq xmltok-type 'named-markup-declaration))
+       ((xmltok-prolog start instance-start)
+        (goto-char xmltok-start)
+        (setq xmltok-type 'end-prolog))
+       ((xmltok-prolog start close-paren-star)
+        (setq xmltok-type 'close-paren-star))
+       ((xmltok-prolog start close-paren-occur)
+        (setq xmltok-type 'close-paren-occur))
+       ((xmltok-prolog start close-paren)
+        (unless (looking-at "[ \t\r\n>,|)]")
+          (xmltok-add-error "Missing space after )"))
+        (setq xmltok-type ?\)))
+       ((xmltok-prolog start single-char)
+        (let ((ch (char-before)))
+          (cond ((memq ch '(?\" ?\'))
+                 (xmltok-scan-prolog-literal))
+                (t (setq xmltok-type ch)))))
+       ((xmltok-prolog start percent)
+        (cond ((xmltok-prolog start param-entity-ref-close)
+               (setq xmltok-name-end (1- (point)))
+               (setq xmltok-type 'param-entity-ref))
+              ((xmltok-prolog start param-entity-ref)
+               (xmltok-add-error "Missing ;")
+               (setq xmltok-name-end (point))
+               (setq xmltok-type 'param-entity-ref))
+              ((looking-at "[ \t\r\n%]")
+               (setq xmltok-type ?%))
+              (t
+               (xmltok-add-error "Expected name after %")
+               (setq xmltok-type 'not-well-formed))))
+       ((xmltok-prolog start nmtoken)
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name token"))
+        (setq xmltok-type 'nmtoken))
+       ((xmltok-prolog start internal-subset-close)
+        (setq xmltok-type 'internal-subset-close))
+       ((xmltok-prolog start pound)
+        (xmltok-add-error "Expected name after #")
+        (setq xmltok-type 'not-well-formed))
+       ((xmltok-prolog start markup-declaration)
+        (xmltok-add-error "Expected name or -- after <!")
+        (setq xmltok-type 'not-well-formed))
+       ((xmltok-prolog start comment-first-dash)
+        (xmltok-add-error "Expected <!--")
+        (setq xmltok-type 'not-well-formed))
+       ((xmltok-prolog start less-than)
+        (xmltok-add-error "Incomplete markup")
+        (setq xmltok-type 'not-well-formed))
+       (t (error "Unhandled token in prolog %s"
+                 (match-string-no-properties 0)))))
+
+(defun xmltok-scan-prolog-literal ()
+  (let* ((delim (string (char-before)))
+        (safe-end (save-excursion
+                    (skip-chars-forward (concat "^<>[]" delim))
+                    (point)))
+        (end (save-excursion
+               (goto-char safe-end)
+               (search-forward delim nil t))))
+    (or (cond ((not end)
+              (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                                    nil
+                                    nil
+                                    delim)
+              nil)
+             ((save-excursion
+                (goto-char end)
+                (looking-at "[ \t\r\n>%[]"))
+              (goto-char end)
+              (setq xmltok-type 'literal))
+             ((eq (1+ safe-end) end)
+              (goto-char end)
+              (xmltok-add-error (format "Missing space after %s" delim)
+                                safe-end)
+              (setq xmltok-type 'literal))
+             (t
+              (xmltok-add-dependent 'xmltok-semi-closed-reparse-p
+                                    xmltok-start
+                                    (1+ end)
+                                    delim
+                                    1)
+              nil))
+       (progn
+         (xmltok-add-error (format "Missing closing %s" delim))
+         (goto-char safe-end)
+         (skip-chars-backward " \t\r\n")
+         (setq xmltok-type 'not-well-formed)))))
+
+(defun xmltok-scan-prolog-after-processing-instruction-open ()
+  (cond ((not (search-forward "?>" nil t))
+        (xmltok-add-error "No closing ?>"
+                          xmltok-start
+                          (+ xmltok-start 2))
+        (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                              nil
+                              nil
+                              "?>")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (let* ((end (point))
+               (target
+                (save-excursion
+                  (goto-char (+ xmltok-start 2))
+                  (and (looking-at (xmltok-ncname regexp))
+                       (or (memq (char-after (match-end 0))
+                                 '(?\n ?\t ?\r ? ))
+                           (= (match-end 0) (- end 2)))
+                       (match-string-no-properties 0)))))
+          (cond ((not target)
+                 (xmltok-add-error "\
+Processing instruction does not start with a name"
+                                   (+ xmltok-start 2)
+                                   (+ xmltok-start 3)))
+                ((not (and (= (length target) 3)
+                           (let ((case-fold-search t))
+                             (string-match "xml" target)))))
+                ((= xmltok-start 1)
+                 (xmltok-add-error "Invalid XML declaration"
+                                   xmltok-start
+                                   (point)))
+                ((save-excursion
+                   (goto-char xmltok-start)
+                   (looking-at (xmltok-xml-declaration regexp)))
+                 (xmltok-add-error "XML declaration not at beginning of file"
+                                   xmltok-start
+                                   (point)))
+                (t
+                 (xmltok-add-error "Processing instruction has target of xml"
+                                   (+ xmltok-start 2)
+                                   (+ xmltok-start 5))))
+          (xmltok-add-prolog-region 'processing-instruction-left
+                                    xmltok-start
+                                    (+ xmltok-start
+                                       2
+                                       (if target
+                                           (length target)
+                                         0)))
+          (xmltok-add-prolog-region 'processing-instruction-right
+                                    (if target
+                                        (save-excursion
+                                          (goto-char (+ xmltok-start
+                                                        (length target)
+                                                        2))
+                                          (skip-chars-forward " \t\r\n")
+                                          (point))
+                                      (+ xmltok-start 2))
+                                    (point)))
+        (setq xmltok-type 'processing-instruction))))
+
+(defun xmltok-parse-entities ()
+  (let ((todo xmltok-dtd))
+    (when (and (or xmltok-had-param-entity-ref
+                  xmltok-doctype-external-subset-flag)
+              (not xmltok-standalone))
+      (setq xmltok-dtd (cons t xmltok-dtd)))
+    (while todo
+      (xmltok-parse-entity (car todo))
+      (setq todo (cdr todo)))))
+  
+(defun xmltok-parse-entity (name-def)
+  (let ((def (cdr name-def))
+       ;; in case its value is buffer local 
+       (xmltok-dtd xmltok-dtd)
+       buf)
+    (when (stringp def)
+      (if (string-match "\\`[^&<\t\r\n]*\\'" def)
+         (setcdr name-def (cons def def))
+       (setcdr name-def 'not-well-formed) ; avoid infinite expansion loops
+       (setq buf (get-buffer-create
+                  (format " *Entity %s*" (car name-def))))
+       (save-excursion
+         (set-buffer buf)
+         (erase-buffer)
+         (insert def)
+         (goto-char (point-min))
+         (setcdr name-def
+                 (xmltok-parse-entity-replacement)))
+       (kill-buffer buf)))))
+
+(defun xmltok-parse-entity-replacement ()
+  (let ((def (cons "" "")))
+    (while (let* ((start (point))
+                 (found (re-search-forward "[<&\t\r\n]\\|]]>" nil t))
+                 (ch (and found (char-before)))
+                 (str (buffer-substring-no-properties
+                       start
+                       (if found
+                           (match-beginning 0)
+                         (point-max)))))
+            (setq def
+                  (xmltok-append-entity-def def
+                                            (cons str str)))
+            (cond ((not found) nil)
+                  ((eq ch ?>)
+                   (setq def 'not-well-formed)
+                   nil)
+                  ((eq ch ?<)
+                   (xmltok-save
+                     (setq xmltok-start (1- (point)))
+                     (xmltok-scan-after-lt)
+                     (setq def
+                           (xmltok-append-entity-def
+                            def
+                            (cond ((memq xmltok-type
+                                         '(start-tag
+                                           end-tag
+                                           empty-element))
+                                   'element)
+                                  ((memq xmltok-type
+                                         '(comment
+                                           processing-instruction))
+                                   (cons "" nil))
+                                  ((eq xmltok-type
+                                       'cdata-section)
+                                   (cons (buffer-substring-no-properties
+                                          (+ xmltok-start 9)
+                                          (- (point) 3))
+                                         nil))
+                                  (t 'not-well-formed)))))
+                   t)
+                  ((eq ch ?&)
+                   (let ((xmltok-start (1- (point)))
+                         xmltok-type
+                         xmltok-replacement
+                         xmltok-errors)
+                     (xmltok-scan-after-amp 'xmltok-handle-nested-entity)
+                     (cond ((eq xmltok-type 'entity-ref)
+                            (setq def
+                                  (xmltok-append-entity-def
+                                   def
+                                   xmltok-replacement)))
+                           ((eq xmltok-type 'char-ref)
+                            (setq def
+                                  (xmltok-append-entity-def
+                                   def
+                                   (if xmltok-replacement
+                                        (cons xmltok-replacement
+                                              xmltok-replacement)
+                                     (and xmltok-errors 'not-well-formed)))))
+                           (t
+                            (setq def 'not-well-formed))))
+                   t)
+                  (t
+                   (setq def
+                         (xmltok-append-entity-def
+                          def
+                          (cons (match-string-no-properties 0)
+                                " ")))
+                   t))))
+    def))
+
+(defun xmltok-handle-nested-entity (start end)
+  (let* ((name-def (assoc (buffer-substring-no-properties start end)
+                         xmltok-dtd))
+        (def (cdr name-def)))
+    (when (stringp def)
+      (xmltok-parse-entity name-def)
+      (setq def (cdr name-def)))
+    (setq xmltok-replacement
+         (cond ((null name-def)
+                (if (eq (car xmltok-dtd) t)
+                    nil
+                  'not-well-formed))
+               ((eq def 'unparsed) 'not-well-formed)
+               (t def)))))
+    
+(defun xmltok-append-entity-def (d1 d2)
+  (cond ((consp d1)
+        (if (consp d2)
+            (cons (concat (car d1) (car d2))
+                  (and (cdr d1)
+                       (cdr d2)
+                       (concat (cdr d1) (cdr d2))))
+          d2))
+       ((consp d2) d1)
+       (t
+        (let ((defs '(not-well-formed external element)))
+          (while (not (or (eq (car defs) d1)
+                          (eq (car defs) d2)))
+            (setq defs (cdr defs)))
+          (car defs)))))
+
+(defun xmltok-add-prolog-region (type start end)
+  (setq xmltok-prolog-regions
+       (cons (vector type start end)
+             xmltok-prolog-regions)))
+
+(defun xmltok-merge-attributes ()
+  "Return a list merging `xmltok-attributes' and 'xmltok-namespace-attributes'.
+The members of the merged list are in order of occurrence in the
+document.  The list may share list structure with `xmltok-attributes'
+and `xmltok-namespace-attributes'."
+  (cond ((not xmltok-namespace-attributes)
+        xmltok-attributes)
+       ((not xmltok-attributes)
+        xmltok-namespace-attributes)
+       (t
+        (let ((atts1 xmltok-attributes)
+              (atts2 xmltok-namespace-attributes)
+              merged)
+          (while (and atts1 atts2)
+            (cond ((< (xmltok-attribute-name-start (car atts1))
+                      (xmltok-attribute-name-start (car atts2)))
+                   (setq merged (cons (car atts1) merged))
+                   (setq atts1 (cdr atts1)))
+                  (t
+                   (setq merged (cons (car atts2) merged))
+                   (setq atts2 (cdr atts2)))))
+          (setq merged (nreverse merged))
+          (cond (atts1 (setq merged (nconc merged atts1)))
+                (atts2 (setq merged (nconc merged atts2))))
+          merged))))
+
+;;; Testing
+
+(defun xmltok-forward-test ()
+  (interactive)
+  (if (xmltok-forward)
+      (message "Scanned %s" xmltok-type)
+    (message "Scanned nothing")))
+
+(defun xmltok-next-prolog-token-test ()
+  (interactive)
+  (if (xmltok-next-prolog-token)
+      (message "Scanned %s"
+              (if (integerp xmltok-type)
+                  (string xmltok-type)
+                xmltok-type))
+    (message "Scanned end of file")))
+
+(provide 'xmltok)
+
+;;; xmltok.el ends here
diff --git a/lisp/nxml/xsd-regexp.el b/lisp/nxml/xsd-regexp.el
new file mode 100644 (file)
index 0000000..3f12c55
--- /dev/null
@@ -0,0 +1,2121 @@
+;;; xsd-regexp.el --- translate W3C XML Schema regexps to Emacs regexps
+
+;; Copyright (C) 2003 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, regexp
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2 of
+;; the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+;; MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This handles the regular expressions in the syntax defined by:
+;; W3C XML Schema Part 2: Datatypes
+;; <http://www.w3.org/TR/xmlschema-2/#regexs>
+;;
+;; The main entry point is `xsdre-translate'.
+;;
+;; The features of XSD regexps that make this non-trivial are:
+;;
+;; - \p{PROP} escape for matching characters that have various
+;;   Unicode-defined properties
+;; - character class subtraction:, e.g. [\p{L}-[abc]] matches
+;;   any character in the L category other than a, b and c.
+;;
+;; We compute the set of Unicode characters denoted by each XSD
+;; char-class as a list of ranges.  The regexp generated for a
+;; single escape can be large (several thousand characters).
+;;
+;; XSD has non-traditional rules about when characters must be
+;; and can be quoted with \.  These are quite different from
+;; the Emacs rules.
+;;
+;; The semantics of XSD regexps are defined in terms of Unicode.
+;; Non-Unicode characters are not allowed in regular expressions and
+;; will not match against the generated regular expressions.  A
+;; Unicode character means a character in one of the Mule charsets
+;; ascii, latin-iso8859-1, mule-unicode-0100-24ff,
+;; mule-unicode-2500-33ff, mule-unicode-e000-ffff, eight-bit-control
+;; or a character translateable to such a character (i.e a character
+;; for which `encode-char' will return non-nil).
+;;
+;; Using unify-8859-on-decoding-mode is probably a good idea here
+;; (and generally with XML and other Unicode-oriented formats).
+;;
+;; Unfortunately, this means that this package is currently useless
+;; for CJK characters, since there's no mule-unicode charset for the
+;; CJK ranges of Unicode.  We should devise a workaround for this
+;; until the fabled Unicode version of Emacs makes an appearance.
+
+;;; Code:
+
+(defun xsdre-translate (regexp)
+  "Translate a W3C XML Schema Datatypes regexp to an Emacs regexp.
+Returns a string.  REGEXP is a string. If REGEXP is not a valid XSD
+regexp, signal an `xsdre-invalid-regexp' condition."
+  (xsdre-from-symbolic
+   (xsdre-to-symbolic regexp)))
+
+(defvar xsdre-test-history nil)
+
+(defun xsdre-test-regexp ()
+  (interactive)
+  (while
+      (let* ((str (read-from-minibuffer "Regexp: "
+                                       nil
+                                       nil
+                                       nil
+                                       'xsdre-test-history))
+            (symbolic
+             (xsdre-to-symbolic str)))
+       (with-output-to-temp-buffer "*XSD Regexp Test*"
+         (princ "XSD regexp: ")
+         (princ str)
+         (princ "\n")
+         (princ "Symbolic: ")
+         (princ "\n")
+         (pp symbolic)
+         (princ "\n")
+         (princ "Emacs regexp: ")
+         (princ (xsdre-from-symbolic symbolic)))
+       t)))
+
+;;; Range lists
+
+(defsubst xsdre-make-range (first last)
+  "Return a representation of a range of integers.
+If the range contains a single integer, it is represented by that integer.
+Otherwise, it is represented by a (FIRST . LAST) pair."
+  (if (= first last)
+      first
+    (cons first last)))
+
+(defsubst xsdre-range-first (r)
+  "Return the first integer in a range."
+  (if (consp r) (car r) r))
+
+(defsubst xsdre-range-last (r)
+  "Return the last integer in a range."
+  (if (consp r) (cdr r) r))
+
+(defun xsdre-make-range-list (list)
+  "Make a range-list from a list of ranges.
+A range-list represents a set of integers by a list of ranges in a
+canonical form, in which ranges are in increasing order, and adjacent
+ranges are merged wherever possible."
+  (when list
+    (setq list 
+         (sort list 'xsdre-range-less-than))
+    (let* ((next (cdr list))
+          (tail list)
+          (head (car list))
+          (first (xsdre-range-first head))
+          (last (xsdre-range-last head)))
+      (while next
+       (setq head (car next))
+       (when (> (xsdre-range-last head) last)
+         (if (<= (xsdre-range-first head) (1+ last))
+             (setq last (xsdre-range-last head))
+           (setcar tail (xsdre-make-range first last))
+           (setcdr tail next)
+           (setq tail next)
+           (setq first (xsdre-range-first head))
+           (setq last (xsdre-range-last head))))
+       (setq next (cdr next)))
+      (setcar tail (xsdre-make-range first last))
+      (setcdr tail nil)
+      list)))
+    
+
+(defun xsdre-range-list-union (range-lists)
+  "Return a range-list the union of a list of range-lists."
+  (xsdre-make-range-list (apply 'append range-lists)))
+
+(defun xsdre-range-list-difference (orig subtract)
+  "Return a range-list for the difference of two range-lists."
+  (when orig
+    (let (new head next first last)
+      (while orig
+       (setq head (car orig))
+       (setq first (xsdre-range-first head))
+       (setq last (xsdre-range-last head))
+       (while (and subtract
+                   (< (xsdre-range-last (car subtract)) first))
+         (setq subtract (cdr subtract)))
+       (while (and subtract
+                   (<= first last)
+                   (<= (xsdre-range-first (car subtract)) last))
+         (when (< first (xsdre-range-first (car subtract)))
+           (setq new
+                 (cons (xsdre-make-range 
+                        first
+                        (1- (xsdre-range-first (car subtract))))
+                       new)))
+         (if (< (xsdre-range-last (car subtract)) last)
+             (progn
+               (setq first (1+ (xsdre-range-last (car subtract))))
+               (setq subtract (cdr subtract)))
+           (setq first (1+ last))))
+       (when (<= first last)
+         (setq new (cons (xsdre-make-range first last) new)))
+       (setq orig (cdr orig)))
+      (nreverse new))))
+
+(defun xsdre-range-less-than (r1 r2)
+  "Return non-nil if range R1 is less than range R2."
+  (or (< (xsdre-range-first r1) (xsdre-range-first r2))
+      (and (= (xsdre-range-first r1) (xsdre-range-first r2))
+          (< (xsdre-range-last r1) (xsdre-range-last r2)))))
+
+(defun xsdre-check-range-list (range-list)
+  "Check that range-list is a range-list.
+Signal an error if it is not."
+  (let ((last nil))
+    (while range-list
+      (unless (consp range-list)
+       (error "Range list not a list"))
+      (let ((head (car range-list)))
+       (unless (or (integerp head)
+                   (and (consp head)
+                        (integerp (car head))
+                        (integerp (cdr head))))
+         (error "Bad range %s" head))
+       (when (and last
+                  (not (< (1+ last) (xsdre-range-first head))))
+         (error "Ranges not strictly increasing"))
+       (setq last (xsdre-range-last head)))
+      (setq range-list (cdr range-list))))
+  t)
+       
+;;; Compiling symbolic regexps to Emacs regexps
+
+(defun xsdre-from-symbolic (re)
+  "Return an Emacs regexp for the symbolic regexp RE."
+  (apply 'concat
+        (nreverse (xsdre-compile-regexp re nil))))
+
+(defun xsdre-compile-regexp (re accum)
+  "Return a Emacs regular expression for the symbolic regexp RE.
+Returns a list of strings whose head is the regexp for RE
+and whose tail is ACCUM."
+  (cond ((not (consp re))
+        (xsdre-compile-char-class re accum))
+       ((eq (car re) 'choice)
+        (setq accum (cons "\\(?:" accum))
+        (let ((choices (cdr re)))
+          (while choices
+            (setq accum
+                  (xsdre-compile-regexp (car choices)
+                                        accum))
+            (setq choices (cdr choices))
+            (when choices
+              (setq accum
+                    (cons "\\|" accum)))))
+        (cons "\\)" accum))
+       ((eq (car re) 'sequence)
+        (let ((members (cdr re)))
+          (while members
+            (setq accum (xsdre-compile-regexp (car members)
+                                              accum))
+            (setq members (cdr members))))
+        accum)
+       ((eq (car re) 'repeat)
+        (let* ((sub (nth 1 re))
+               (lower (nth 2 re))
+               (upper (nth 3 re))
+               (need-paren (and (consp sub)
+                                (eq (car sub) 'sequence))))
+          (when need-paren
+            (setq accum (cons "\\(?:" accum)))
+          (setq accum
+                (xsdre-compile-regexp sub accum))
+          (when need-paren
+            (setq accum (cons "\\)" accum)))
+          (cond ((not upper)
+                 (cond ((eq lower 0)
+                        (cons "*" accum))
+                       ((eq lower 1)
+                        (cons "+" accum))
+                       (t
+                        (cons (concat "\\{"
+                                      (number-to-string lower)
+                                      ",\\}")
+                              accum))))
+                ((eq lower upper)
+                 (cons (concat "\\{"
+                               (number-to-string lower)
+                               "\\}")
+                       accum))
+                ((and (eq lower 0) (eq upper 1))
+                 (cons "?" accum))
+                (t
+                 (cons (concat "\\{"
+                               (number-to-string lower)
+                               ","
+                               (number-to-string upper)
+                               "\\}")
+                       accum)))))
+       (t (xsdre-compile-char-class re accum))))
+
+(defun xsdre-compile-char-class (cc accum)
+  "Return a Emacs regular expression for the symbolic character class CC.
+Returns a list of strings whose head is the regexp for CC
+and whose tail is ACCUM."
+  (cons (if (integerp cc)
+           (xsdre-compile-single-char cc)
+         (let ((ranges (xsdre-range-list-mule-intersection
+                        (xsdre-char-class-to-range-list cc))))
+           (cond ((null ranges) "\001-\000")
+                 ((and (null (cdr ranges))
+                       (= (xsdre-range-first (car ranges))
+                          (xsdre-range-last (car ranges))))
+                  (xsdre-compile-single-char
+                   (xsdre-range-first (car ranges))))
+                 (t (xsdre-range-list-to-char-alternative ranges)))))
+       accum))
+             
+(defun xsdre-compile-single-char (ch)
+  (if (memq ch '(?. ?* ?+ ?? ?\[ ?\] ?^ ?$ ?\\))
+      (string ?\\ ch)
+    (string (decode-char 'ucs ch))))
+  
+(defun xsdre-char-class-to-range-list (cc)
+  "Return a range-list for a symbolic char-class."
+  (cond ((integerp cc) (list cc))
+       ((symbolp cc)
+        (or (get cc 'xsdre-ranges)
+            (xsdre-char-class-to-range-list (get cc 'xsdre-char-class))))
+       ((integerp (car cc))
+        (if (= (car cc) (cdr cc))
+            (car cc)
+          cc))
+       ((eq (car cc) 'union)
+        (xsdre-range-list-union (mapcar 'xsdre-char-class-to-range-list
+                                        (cdr cc))))
+       ((eq (car cc) 'difference)
+        (xsdre-range-list-difference
+         (xsdre-char-class-to-range-list (nth 1 cc))
+         (xsdre-char-class-to-range-list (nth 2 cc))))
+       ((eq (car cc) 'range)
+        (list (xsdre-make-range (nth 1 cc) (nth 2 cc))))
+       (t (error "Internal error in XSD regexp compilation: \
+unknown char-class %s" cc))))
+
+(defconst xsdre-mule-char-set-ranges
+  '((0 . 127)
+    (128 . 159)
+    (160 . 255)
+    (#x0100 . #x24ff)
+    (#x2500 . #x33ff)
+    (#xe000 . #xffff))
+  "List of ranges for the Mule character sets containing Unicode characters.")
+
+(defun xsdre-range-list-mule-intersection (range-list)
+  "Return the intersection of RANGE-LIST with the mule-supported ranges.
+Also split ranges so that no range spans more that one mule charset."
+  (when range-list
+    (let* ((char-set-ranges (cdr xsdre-mule-char-set-ranges))
+          (mule-ranges nil)
+          (char-set-first (caar xsdre-mule-char-set-ranges))
+          (char-set-last (cdar xsdre-mule-char-set-ranges))
+          (range (car range-list))
+          (first (xsdre-range-first range))
+          (last (xsdre-range-last range)))
+      (setq range-list (cdr range-list))
+      (while (progn
+              (cond ((> first last)
+                     (if (null range-list)
+                         nil
+                       (setq range (car range-list))
+                       (setq first (xsdre-range-first range))
+                       (setq last (xsdre-range-last range))
+                       (setq range-list (cdr range-list))
+                       t))
+                    ((< char-set-last first)
+                     (if (null char-set-ranges)
+                         nil
+                       (setq char-set-first (caar char-set-ranges))
+                       (setq char-set-last (cdar char-set-ranges))
+                       (setq char-set-ranges (cdr char-set-ranges))
+                       t))
+                    ((< first char-set-first)
+                     (setq first char-set-first))
+                    ;; Now we know that
+                    ;; first <= last
+                    ;; first <= char-set-last
+                    ;; first >= char-set-first
+                    ((<= last char-set-last)
+                     (setq mule-ranges
+                           (cons (xsdre-make-range first last)
+                                 mule-ranges))
+                     (setq first (1+ last))
+                     t)
+                    (t
+                     (setq mule-ranges
+                           (cons (xsdre-make-range first char-set-last)
+                                 mule-ranges))
+                     (setq first (1+ char-set-last))
+                     t))))
+      (nreverse mule-ranges))))
+
+(defun xsdre-range-list-to-char-alternative (range-list)
+  "Return a char alternative for a range-list.
+RANGE-LIST must contain more than integer.
+The char alternative is a string containing an Emacs regexp
+consisting of a single char alternative delimited with []."
+  (let (range caret close-bracket hyphen chars first last)
+    (while range-list
+      (setq range (car range-list))
+      (setq first (xsdre-range-first range))
+      (setq last (xsdre-range-last range))
+      (while (and (cond ((eq first ?^)
+                        (setq caret t)
+                        (setq first (1+ first)))
+                       ((eq first ?-)
+                        (setq hyphen t)
+                        (setq first (1+ first)))
+                       ((eq first ?\])
+                        (setq close-bracket t)
+                        (setq first (1+ first))))
+                 (<= first last)))
+      (when (<= first last)
+       (setq chars
+             (cons first chars))
+       (when (< first last)
+         (setq chars
+               (if (and (eq last (1+ first))
+                        (not (eq last ?-)))
+                   (cons last chars)
+                 (cons last (cons ?- chars))))))
+      (setq range-list (cdr range-list)))
+    (setq chars
+         (mapcar (lambda (c)
+                   (decode-char 'ucs c))
+                 chars))
+    (when caret
+      (setq chars (cons ?^ chars)))
+    (when hyphen
+      (setq chars (cons ?- chars)))
+    (setq chars (cons ?\] chars))
+    (setq chars (nreverse chars))
+    (when close-bracket
+      (setq chars (cons ?\] chars)))
+    (when (equal chars '(?^ ?- ?\]))
+      (setq chars '(?- ?^ ?\])))
+    (setq chars (cons ?\[ chars))
+    (apply 'string chars)))
+      
+;;; Parsing
+
+(defvar xsdre-current-regexp nil
+  "List of characters remaining to be parsed. Dynamically bound.")
+
+(defun xsdre-to-symbolic (str)
+  "Convert a W3C XML Schema datatypes regexp to a symbolic form.
+
+The symbolic form has the following structure:
+
+REGEXP ::=
+  (sequence REGEXP ...)
+  | (choice REGEXP ...)
+  | (repeat REGEXP MIN MAX)
+  | CHAR-CLASS
+
+CHAR-CLASS ::=
+  CHAR
+  | SYMBOLIC-CHAR-CLASS
+  | RANGE
+  | (union CHAR-CLASS ...)
+  | (difference CHAR-CLASS CHAR-CLASS)
+
+RANGE ::= (range LOWER UPPER)
+
+MIN ::= INTEGER
+MAX ::= INTEGER | nil
+CHAR ::= UNICODE
+LOWER ::= UNICODE
+UPPER ::= UNICODE
+SYMBOLIC-CHAR-CLASS ::= SYMBOL
+
+where UNICODE is a integer specifying a Unicode code-point and
+SYMBOLIC-CHAR-CLASS is a symbol which has either a `xsdre-char-class'
+property whose value is a CHAR-CLASS, or a `xsdre-ranges' property
+whose value is a range-list."
+  (let ((xsdre-current-regexp (string-to-list str)))
+    (condition-case err
+       (let ((symbolic (xsdre-parse-regexp)))
+         (if xsdre-current-regexp
+             (xsdre-parse-error "Unexpected %c" (car xsdre-current-regexp))
+           symbolic))
+      (xsdre-parse-error
+       (signal 'xsdre-invalid-regexp
+              (list (apply 'format (cdr err))
+                    (- (length str)
+                       (length xsdre-current-regexp))))))))
+
+(put 'xsdre-invalid-regexp
+     'error-conditions
+     '(error xsdre-invalid-regexp))
+
+(put 'xsdre-invalid-regexp
+     'error-message
+     "Invalid W3C XML Schema Datatypes regular expression")
+
+(defun xsdre-parse-regexp ()
+  (let ((branches nil))
+    (while (progn
+            (setq branches (cons (xsdre-parse-branch) branches))
+            (when (eq (car xsdre-current-regexp) ?|)
+              (xsdre-advance)
+              t)))
+    (if (null (cdr branches))
+       (car branches)
+      (cons 'choice (nreverse branches)))))
+
+(defun xsdre-parse-branch ()
+  (let (items)
+    (while (let ((item (xsdre-try-parse-atom)))
+            (when item
+              (let ((quantifier (xsdre-try-parse-quantifier)))
+                (when quantifier
+                  (setq item
+                        (list 'repeat
+                              item
+                              (car quantifier)
+                              (cdr quantifier)))))
+              (setq items (cons item items)))))
+    (cond ((null items) '(sequence))
+         ((null (cdr items)) (car items))
+         (t (cons 'sequence (nreverse items))))))
+
+(defun xsdre-try-parse-quantifier ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond ((eq ch ?*) (xsdre-advance) '(0 . nil))
+         ((eq ch ?+) (xsdre-advance) '(1 . nil))
+         ((eq ch ??) (xsdre-advance) '(0 . 1))
+         ((eq ch ?{)
+          (xsdre-advance)
+          (let ((lower (xsdre-parse-bound)))
+            (setq ch (car xsdre-current-regexp))
+            (cond ((eq ch ?})
+                   (xsdre-advance)
+                   (cons lower lower))
+                  ((eq ch ?,)
+                   (xsdre-advance)
+                   (cond ((eq (car xsdre-current-regexp) ?})
+                          (xsdre-advance)
+                          (cons lower nil))
+                         (t
+                          (let ((upper (xsdre-parse-bound)))
+                            (xsdre-expect ?})
+                            (cons lower upper)))))
+                  (t (xsdre-parse-error "Expected , or }")))))
+         (t nil))))
+                       
+(defun xsdre-parse-bound ()
+  (let ((n 0))
+    (while (progn
+            (let* ((ch (car xsdre-current-regexp))
+                   (digit (memq ch '(?9 ?8 ?7 ?6 ?5 ?4 ?3 ?2 ?1 ?0))))
+              (unless digit
+                (xsdre-parse-error "Expected a digit"))
+              (setq n (+ (* n 10)
+                         (length (cdr digit)))))
+            (xsdre-advance)
+            (not (memq (car xsdre-current-regexp) '(?} ?,)))))
+    n))
+       
+
+(defun xsdre-try-parse-atom ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond  ((memq ch '(nil ?? ?* ?+ ?\) ?\{ ?\} ?| ?\])) nil)
+          ((eq ch ?\\)
+           (xsdre-advance)
+           (xsdre-parse-escape))
+          ((eq ch ?\()
+           (xsdre-advance)
+           (let ((ret (xsdre-parse-regexp)))
+             (xsdre-expect ?\))
+             ret))
+          ((eq ch ?\[)
+           (xsdre-parse-char-class))
+          ((eq ch ?.)
+           (xsdre-advance)
+           'dot)
+          (t
+           (let ((uc (encode-char ch 'ucs)))
+             (unless uc
+               (xsdre-parse-error "%c is not a Unicode character" ch))
+             (xsdre-advance) uc)))))
+
+(defun xsdre-parse-char-class ()
+  (xsdre-advance)
+  (let (compl members ret)
+    (when (eq (car xsdre-current-regexp) ?^)
+      (setq compl t)
+      (xsdre-advance))
+    (while (let ((member (xsdre-parse-char-class-member))
+                uc1 uc2)
+            (cond ((eq (car xsdre-current-regexp) ?\-)
+                   (xsdre-advance)
+                   (cond ((eq (car xsdre-current-regexp) ?\[)
+                          (setq members (cons member members))
+                          nil)
+                         ((not (integerp member))
+                          (xsdre-parse-error "Lower bound is not a single character"))
+                         ((not (setq uc1
+                                     (encode-char member 'ucs)))
+                          (xsdre-parse-error "Lower bound %c is not a Unicode character"
+                                 member))
+                         (t
+                          (let ((upper (xsdre-parse-char-class-member)))
+                            (unless (integerp upper)
+                              (xsdre-parse-error "Upper bound is not a single character"))
+                            (unless (setq uc2
+                                          (encode-char upper 'ucs))
+                              (xsdre-parse-error "Upper bound %c is not a Unicode character" upper))
+                            (setq members
+                                  (cons (list 'range uc1 uc2)
+                                        members)))
+                          (not (eq (car xsdre-current-regexp) ?\])))))
+                  (t (setq members (cons member members))
+                     (not (eq (car xsdre-current-regexp) ?\]))))))
+    (setq members (nreverse members))
+    (if (null (cdr members))
+       (setq ret (car members))
+      (setq ret (cons 'union members)))
+    (when compl
+      (setq ret (list 'difference 'any ret)))
+    (when (eq (car xsdre-current-regexp) ?\[)
+      (setq ret
+           (list 'difference ret (xsdre-parse-char-class))))
+    (xsdre-expect ?\])
+    ret))
+
+(defun xsdre-parse-char-class-member ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond ((null ch)
+          (xsdre-parse-error "Expected ]"))
+         ((eq ch ?\\)
+          (xsdre-advance)
+          (xsdre-parse-escape))
+         ((memq ch '(?\[ ?\] ?-))
+          (xsdre-parse-error "%c must be quoted in a character class" ch))
+         (t (xsdre-advance) ch))))
+
+(defconst xsdre-single-escape
+  '((?s . space)
+    (?i . name-initial)
+    (?c . name-continue)
+    (?d . digit)
+    (?w . word)))
+
+(defun xsdre-parse-escape ()
+  (let ((ch (car xsdre-current-regexp)))
+    (xsdre-advance)
+    (cond ((memq ch '(?\\ ?| ?. ?- ?^ ?* ?+ ?( ?) ?{ ?} ?[ ?])) ch)
+         ((eq ch ?r) ?\r)
+         ((eq ch ?n) ?\n)
+         ((eq ch ?t) ?\t)
+         ((cdr (assq ch xsdre-single-escape)))
+         ((let ((positive
+                 (cdr (assq (downcase ch) xsdre-single-escape))))
+            (and positive
+                 (list 'difference 'any positive))))
+         ((eq ch ?p) (xsdre-parse-prop))
+         ((eq ch ?P) (list 'difference 'any (xsdre-parse-prop)))
+         (t (if ch
+                (xsdre-parse-error "Missing char after \\")
+              (xsdre-parse-error "Bad escape %c" ch))))))
+       
+(defun xsdre-parse-prop ()
+  (xsdre-expect ?{)
+  (let ((name nil))
+    (while (not (eq (car xsdre-current-regexp) ?\}))
+      (unless xsdre-current-regexp
+       (xsdre-parse-error "Expected ?"))
+      (setq name (cons (car xsdre-current-regexp)
+                      name))
+      (xsdre-advance))
+    (xsdre-advance)
+    (setq name (nreverse name))
+    (cond ((null name) (xsdre-parse-error "Empty property name"))
+         ((null (cdr name))
+          (let ((category (intern (string (car name)))))
+            (unless (get category 'xsdre-unicode-category)
+              (xsdre-parse-error "%s is not a category" category))
+            category))
+         ((null (cddr name))
+          (let ((category (intern (string (car name) (cadr name)))))
+            (unless (get category 'xsdre-unicode-category)
+              (xsdre-parse-error "%s is not a category" category))
+            category))
+         ((not (and (eq (car name) ?I)
+                    (eq (cadr name) ?s)))
+          (xsdre-parse-error "Block name does not start with Is"))
+         (t
+          (let ((block (intern (apply 'string (cddr name)))))
+            (unless (get block 'xsdre-unicode-block)
+              (xsdre-parse-error "%s is not a block name" block))
+            block)))))
+
+(defun xsdre-expect (ch)
+  (if (eq (car xsdre-current-regexp) ch)
+      (xsdre-advance)
+    (xsdre-parse-error "Expected %c" ch)))
+    
+(defun xsdre-advance ()
+  (setq xsdre-current-regexp
+       (cdr xsdre-current-regexp)))
+
+(defun xsdre-parse-error (&rest args)
+  (signal 'xsdre-parse-error args))
+
+;; This error condition is used only internally.
+
+(put 'xsdre-parse-error
+     'error-conditions
+     '(error xsdre-parse-error))
+
+(put 'xsdre-parse-error
+     'error-message
+     "Internal error in parsing XSD regexp")
+     
+;;; Character class data
+
+(put 'dot 'xsdre-char-class '(difference any (union #xA #xD)))
+(put 'digit 'xsdre-char-class 'Nd)
+(put 'word 'xsdre-char-class '(difference any (union P Z C)))
+(put 'space 'xsdre-char-class '(union #x9 #xA #xD #x20))
+(put 'any 'xsdre-ranges '((#x0 . #x10FFFF)))
+
+(defconst xsdre-gen-categories
+  '(Lu Ll Lt Lm Lo Mn Mc Me Nd Nl No Pc Pd
+       Ps Pe Pi Pf Po Zs Zl Zp Sm Sc Sk So Cc Cf Co))
+
+(defun xsdre-gen-categories (file)
+  "Use a UnicodeData file to generate code to initialize Unicode categories.
+Code is inserted into the current buffer."
+  (interactive "fUnicodeData file: ")
+  (save-excursion
+    (set-buffer (find-file-noselect file))
+    (goto-char (point-min))
+    (mapcar (lambda (x) (put x 'xsdre-ranges nil)) xsdre-gen-categories)
+    (while (re-search-forward "^\\([0-9A-Fa-f]*\\);[^;]*;\\([A-Z][a-z]\\);"
+                             nil
+                             t)
+      (let* ((sym (intern (match-string-no-properties 2)))
+            (code (string-to-number (match-string-no-properties 1)
+                                    16))
+            (ranges (get sym 'xsdre-ranges))
+            (last-range (car ranges))
+            (forced-range (string= (buffer-substring-no-properties
+                                    (- (match-beginning 2) 6)
+                                    (1- (match-beginning 2)))
+                                   "Last>")))
+       (cond ((and (integerp last-range)
+                   (or forced-range
+                       (eq code (1+ last-range))))
+              (put sym
+                   'xsdre-ranges
+                   (cons (cons last-range code)
+                         (cdr ranges))))
+             ((and (consp last-range)
+                   (or forced-range
+                       (eq code (1+ (cdr last-range)))))
+              (put sym
+                   'xsdre-ranges
+                   (cons (cons (car last-range) code)
+                         (cdr ranges))))
+             (t
+              (put sym 'xsdre-ranges (cons code ranges))))))
+    (mapcar (lambda (x)
+             (put x
+                  'xsdre-ranges
+                  (nreverse (get x 'xsdre-ranges)))
+             nil)
+           xsdre-gen-categories))
+  (mapcar (lambda (x)
+           (let ((start (point)))
+             (pp (list 'xsdre-def-primitive-category
+                       (list 'quote x)
+                       (list 'quote (get x 'xsdre-ranges)))
+                 (current-buffer))
+             (save-excursion
+               (goto-char start)
+               (down-list 2)
+               (while (condition-case err
+                          (progn 
+                            (forward-sexp)
+                            t)
+                        (error nil))
+                 (when (and (< 70 (current-column))
+                            (not (looking-at ")")))
+                   (insert "\n")
+                   (lisp-indent-line))))))
+         xsdre-gen-categories))
+
+(defun xsdre-def-primitive-category (sym ranges)
+  (put sym 'xsdre-ranges ranges)
+  (put sym 'xsdre-unicode-category t))
+
+;;; Blocks
+
+(defun xsdre-def-block (sym ranges)
+  (put sym 'xsdre-ranges ranges)
+  (put sym 'xsdre-unicode-block t))
+
+(xsdre-def-block 'BasicLatin '((#x0000 . #x007F)))
+(xsdre-def-block 'Latin-1Supplement '((#x0080 . #x00FF)))
+(xsdre-def-block 'LatinExtended-A '((#x0100 . #x017F)))
+(xsdre-def-block 'LatinExtended-B '((#x0180 . #x024F)))
+(xsdre-def-block 'IPAExtensions '((#x0250 . #x02AF)))
+(xsdre-def-block 'SpacingModifierLetters '((#x02B0 . #x02FF)))
+(xsdre-def-block 'CombiningDiacriticalMarks '((#x0300 . #x036F)))
+(xsdre-def-block 'Greek '((#x0370 . #x03FF)))
+(xsdre-def-block 'Cyrillic '((#x0400 . #x04FF)))
+(xsdre-def-block 'Armenian '((#x0530 . #x058F)))
+(xsdre-def-block 'Hebrew '((#x0590 . #x05FF)))
+(xsdre-def-block 'Arabic '((#x0600 . #x06FF)))
+(xsdre-def-block 'Syriac '((#x0700 . #x074F)))
+(xsdre-def-block 'Thaana '((#x0780 . #x07BF)))
+(xsdre-def-block 'Devanagari '((#x0900 . #x097F)))
+(xsdre-def-block 'Bengali '((#x0980 . #x09FF)))
+(xsdre-def-block 'Gurmukhi '((#x0A00 . #x0A7F)))
+(xsdre-def-block 'Gujarati '((#x0A80 . #x0AFF)))
+(xsdre-def-block 'Oriya '((#x0B00 . #x0B7F)))
+(xsdre-def-block 'Tamil '((#x0B80 . #x0BFF)))
+(xsdre-def-block 'Telugu '((#x0C00 . #x0C7F)))
+(xsdre-def-block 'Kannada '((#x0C80 . #x0CFF)))
+(xsdre-def-block 'Malayalam '((#x0D00 . #x0D7F)))
+(xsdre-def-block 'Sinhala '((#x0D80 . #x0DFF)))
+(xsdre-def-block 'Thai '((#x0E00 . #x0E7F)))
+(xsdre-def-block 'Lao '((#x0E80 . #x0EFF)))
+(xsdre-def-block 'Tibetan '((#x0F00 . #x0FFF)))
+(xsdre-def-block 'Myanmar '((#x1000 . #x109F)))
+(xsdre-def-block 'Georgian '((#x10A0 . #x10FF)))
+(xsdre-def-block 'HangulJamo '((#x1100 . #x11FF)))
+(xsdre-def-block 'Ethiopic '((#x1200 . #x137F)))
+(xsdre-def-block 'Cherokee '((#x13A0 . #x13FF)))
+(xsdre-def-block 'UnifiedCanadianAboriginalSyllabics '((#x1400 . #x167F)))
+(xsdre-def-block 'Ogham '((#x1680 . #x169F)))
+(xsdre-def-block 'Runic '((#x16A0 . #x16FF)))
+(xsdre-def-block 'Khmer '((#x1780 . #x17FF)))
+(xsdre-def-block 'Mongolian '((#x1800 . #x18AF)))
+(xsdre-def-block 'LatinExtendedAdditional '((#x1E00 . #x1EFF)))
+(xsdre-def-block 'GreekExtended '((#x1F00 . #x1FFF)))
+(xsdre-def-block 'GeneralPunctuation '((#x2000 . #x206F)))
+(xsdre-def-block 'SuperscriptsandSubscripts '((#x2070 . #x209F)))
+(xsdre-def-block 'CurrencySymbols '((#x20A0 . #x20CF)))
+(xsdre-def-block 'CombiningMarksforSymbols '((#x20D0 . #x20FF)))
+(xsdre-def-block 'LetterlikeSymbols '((#x2100 . #x214F)))
+(xsdre-def-block 'NumberForms '((#x2150 . #x218F)))
+(xsdre-def-block 'Arrows '((#x2190 . #x21FF)))
+(xsdre-def-block 'MathematicalOperators '((#x2200 . #x22FF)))
+(xsdre-def-block 'MiscellaneousTechnical '((#x2300 . #x23FF)))
+(xsdre-def-block 'ControlPictures '((#x2400 . #x243F)))
+(xsdre-def-block 'OpticalCharacterRecognition '((#x2440 . #x245F)))
+(xsdre-def-block 'EnclosedAlphanumerics '((#x2460 . #x24FF)))
+(xsdre-def-block 'BoxDrawing '((#x2500 . #x257F)))
+(xsdre-def-block 'BlockElements '((#x2580 . #x259F)))
+(xsdre-def-block 'GeometricShapes '((#x25A0 . #x25FF)))
+(xsdre-def-block 'MiscellaneousSymbols '((#x2600 . #x26FF)))
+(xsdre-def-block 'Dingbats '((#x2700 . #x27BF)))
+(xsdre-def-block 'BraillePatterns '((#x2800 . #x28FF)))
+(xsdre-def-block 'CJKRadicalsSupplement '((#x2E80 . #x2EFF)))
+(xsdre-def-block 'KangxiRadicals '((#x2F00 . #x2FDF)))
+(xsdre-def-block 'IdeographicDescriptionCharacters '((#x2FF0 . #x2FFF)))
+(xsdre-def-block 'CJKSymbolsandPunctuation '((#x3000 . #x303F)))
+(xsdre-def-block 'Hiragana '((#x3040 . #x309F)))
+(xsdre-def-block 'Katakana '((#x30A0 . #x30FF)))
+(xsdre-def-block 'Bopomofo '((#x3100 . #x312F)))
+(xsdre-def-block 'HangulCompatibilityJamo '((#x3130 . #x318F)))
+(xsdre-def-block 'Kanbun '((#x3190 . #x319F)))
+(xsdre-def-block 'BopomofoExtended '((#x31A0 . #x31BF)))
+(xsdre-def-block 'EnclosedCJKLettersandMonths '((#x3200 . #x32FF)))
+(xsdre-def-block 'CJKCompatibility '((#x3300 . #x33FF)))
+(xsdre-def-block 'CJKUnifiedIdeographsExtensionA '((#x3400 . #x4DB5)))
+(xsdre-def-block 'CJKUnifiedIdeographs '((#x4E00 . #x9FFF)))
+(xsdre-def-block 'YiSyllables '((#xA000 . #xA48F)))
+(xsdre-def-block 'YiRadicals '((#xA490 . #xA4CF)))
+(xsdre-def-block 'HangulSyllables '((#xAC00 . #xD7A3)))
+;;(xsdre-def-block 'HighSurrogates '((#xD800 . #xDB7F)))
+;;(xsdre-def-block 'HighPrivateUseSurrogates '((#xDB80 . #xDBFF)))
+;;(xsdre-def-block 'LowSurrogates '((#xDC00 . #xDFFF)))
+(xsdre-def-block 'CJKCompatibilityIdeographs '((#xF900 . #xFAFF)))
+(xsdre-def-block 'AlphabeticPresentationForms '((#xFB00 . #xFB4F)))
+(xsdre-def-block 'ArabicPresentationForms-A '((#xFB50 . #xFDFF)))
+(xsdre-def-block 'CombiningHalfMarks '((#xFE20 . #xFE2F)))
+(xsdre-def-block 'CJKCompatibilityForms '((#xFE30 . #xFE4F)))
+(xsdre-def-block 'SmallFormVariants '((#xFE50 . #xFE6F)))
+(xsdre-def-block 'ArabicPresentationForms-B '((#xFE70 . #xFEFE)))
+(xsdre-def-block 'Specials '((#xFEFF . #xFEFF)))
+(xsdre-def-block 'HalfwidthandFullwidthForms '((#xFF00 . #xFFEF)))
+(xsdre-def-block 'Specials '((#xFFF0 . #xFFFD)))
+(xsdre-def-block 'OldItalic '((#x10300 . #x1032F)))
+(xsdre-def-block 'Gothic '((#x10330 . #x1034F)))
+(xsdre-def-block 'Deseret '((#x10400 . #x1044F)))
+(xsdre-def-block 'ByzantineMusicalSymbols '((#x1D000 . #x1D0FF)))
+(xsdre-def-block 'MusicalSymbols '((#x1D100 . #x1D1FF)))
+(xsdre-def-block 'MathematicalAlphanumericSymbols '((#x1D400 . #x1D7FF)))
+(xsdre-def-block 'CJKUnifiedIdeographsExtensionB '((#x20000 . #x2A6D6)))
+(xsdre-def-block 'CJKCompatibilityIdeographsSupplement '((#x2F800 . #x2FA1F)))
+(xsdre-def-block 'Tags '((#xE0000 . #xE007F)))
+(xsdre-def-block 'PrivateUse '((#xE000 . #xF8FF)
+                              (#xF0000 . #xFFFFD)
+                              (#x100000 . #x10FFFD)))
+
+;;; Categories
+
+;;; Derived categories
+
+(defun xsdre-def-derived-category (sym char-class)
+  (put sym 'xsdre-char-class char-class)
+  (put sym 'xsdre-unicode-category t))
+
+(xsdre-def-derived-category 'L '(union Lu Ll Lt Lm Lo))
+(xsdre-def-derived-category 'M '(union Mn Mc Me))
+(xsdre-def-derived-category 'N '(union Nd Nl No))
+(xsdre-def-derived-category 'P '(union Pc Pd Ps Pe Pi Pf Po))
+(xsdre-def-derived-category 'Z '(union Zs Zl Zp))
+(xsdre-def-derived-category 'S '(union Sm Sc Sk So))
+(xsdre-def-derived-category 'C '(union Cc Cf Co Cn))
+(xsdre-def-derived-category 'Cn '(difference any
+                                            (union L M N P Z S Cc Cf Co)))
+
+(xsdre-def-primitive-category
+ 'name-initial
+ '(#x003a
+   (#x0041 . #x005a)
+   #x005f
+   (#x0061 . #x007a)
+   (#x00c0 . #x00d6)
+   (#x00d8 . #x00f6)
+   (#x00f8 . #x0131)
+   (#x0134 . #x013e)
+   (#x0141 . #x0148)
+   (#x014a . #x017e)
+   (#x0180 . #x01c3)
+   (#x01cd . #x01f0)
+   (#x01f4 . #x01f5)
+   (#x01fa . #x0217)
+   (#x0250 . #x02a8)
+   (#x02bb . #x02c1)
+   #x0386
+   (#x0388 . #x038a)
+   #x038c
+   (#x038e . #x03a1)
+   (#x03a3 . #x03ce)
+   (#x03d0 . #x03d6)
+   #x03da
+   #x03dc
+   #x03de
+   #x03e0
+   (#x03e2 . #x03f3)
+   (#x0401 . #x040c)
+   (#x040e . #x044f)
+   (#x0451 . #x045c)
+   (#x045e . #x0481)
+   (#x0490 . #x04c4)
+   (#x04c7 . #x04c8)
+   (#x04cb . #x04cc)
+   (#x04d0 . #x04eb)
+   (#x04ee . #x04f5)
+   (#x04f8 . #x04f9)
+   (#x0531 . #x0556)
+   #x0559
+   (#x0561 . #x0586)
+   (#x05d0 . #x05ea)
+   (#x05f0 . #x05f2)
+   (#x0621 . #x063a)
+   (#x0641 . #x064a)
+   (#x0671 . #x06b7)
+   (#x06ba . #x06be)
+   (#x06c0 . #x06ce)
+   (#x06d0 . #x06d3)
+   #x06d5
+   (#x06e5 . #x06e6)
+   (#x0905 . #x0939)
+   #x093d
+   (#x0958 . #x0961)
+   (#x0985 . #x098c)
+   (#x098f . #x0990)
+   (#x0993 . #x09a8)
+   (#x09aa . #x09b0)
+   #x09b2
+   (#x09b6 . #x09b9)
+   (#x09dc . #x09dd)
+   (#x09df . #x09e1)
+   (#x09f0 . #x09f1)
+   (#x0a05 . #x0a0a)
+   (#x0a0f . #x0a10)
+   (#x0a13 . #x0a28)
+   (#x0a2a . #x0a30)
+   (#x0a32 . #x0a33)
+   (#x0a35 . #x0a36)
+   (#x0a38 . #x0a39)
+   (#x0a59 . #x0a5c)
+   #x0a5e
+   (#x0a72 . #x0a74)
+   (#x0a85 . #x0a8b)
+   #x0a8d
+   (#x0a8f . #x0a91)
+   (#x0a93 . #x0aa8)
+   (#x0aaa . #x0ab0)
+   (#x0ab2 . #x0ab3)
+   (#x0ab5 . #x0ab9)
+   #x0abd
+   #x0ae0
+   (#x0b05 . #x0b0c)
+   (#x0b0f . #x0b10)
+   (#x0b13 . #x0b28)
+   (#x0b2a . #x0b30)
+   (#x0b32 . #x0b33)
+   (#x0b36 . #x0b39)
+   #x0b3d
+   (#x0b5c . #x0b5d)
+   (#x0b5f . #x0b61)
+   (#x0b85 . #x0b8a)
+   (#x0b8e . #x0b90)
+   (#x0b92 . #x0b95)
+   (#x0b99 . #x0b9a)
+   #x0b9c
+   (#x0b9e . #x0b9f)
+   (#x0ba3 . #x0ba4)
+   (#x0ba8 . #x0baa)
+   (#x0bae . #x0bb5)
+   (#x0bb7 . #x0bb9)
+   (#x0c05 . #x0c0c)
+   (#x0c0e . #x0c10)
+   (#x0c12 . #x0c28)
+   (#x0c2a . #x0c33)
+   (#x0c35 . #x0c39)
+   (#x0c60 . #x0c61)
+   (#x0c85 . #x0c8c)
+   (#x0c8e . #x0c90)
+   (#x0c92 . #x0ca8)
+   (#x0caa . #x0cb3)
+   (#x0cb5 . #x0cb9)
+   #x0cde
+   (#x0ce0 . #x0ce1)
+   (#x0d05 . #x0d0c)
+   (#x0d0e . #x0d10)
+   (#x0d12 . #x0d28)
+   (#x0d2a . #x0d39)
+   (#x0d60 . #x0d61)
+   (#x0e01 . #x0e2e)
+   #x0e30
+   (#x0e32 . #x0e33)
+   (#x0e40 . #x0e45)
+   (#x0e81 . #x0e82)
+   #x0e84
+   (#x0e87 . #x0e88)
+   #x0e8a
+   #x0e8d
+   (#x0e94 . #x0e97)
+   (#x0e99 . #x0e9f)
+   (#x0ea1 . #x0ea3)
+   #x0ea5
+   #x0ea7
+   (#x0eaa . #x0eab)
+   (#x0ead . #x0eae)
+   #x0eb0
+   (#x0eb2 . #x0eb3)
+   #x0ebd
+   (#x0ec0 . #x0ec4)
+   (#x0f40 . #x0f47)
+   (#x0f49 . #x0f69)
+   (#x10a0 . #x10c5)
+   (#x10d0 . #x10f6)
+   #x1100
+   (#x1102 . #x1103)
+   (#x1105 . #x1107)
+   #x1109
+   (#x110b . #x110c)
+   (#x110e . #x1112)
+   #x113c
+   #x113e
+   #x1140
+   #x114c
+   #x114e
+   #x1150
+   (#x1154 . #x1155)
+   #x1159
+   (#x115f . #x1161)
+   #x1163
+   #x1165
+   #x1167
+   #x1169
+   (#x116d . #x116e)
+   (#x1172 . #x1173)
+   #x1175
+   #x119e
+   #x11a8
+   #x11ab
+   (#x11ae . #x11af)
+   (#x11b7 . #x11b8)
+   #x11ba
+   (#x11bc . #x11c2)
+   #x11eb
+   #x11f0
+   #x11f9
+   (#x1e00 . #x1e9b)
+   (#x1ea0 . #x1ef9)
+   (#x1f00 . #x1f15)
+   (#x1f18 . #x1f1d)
+   (#x1f20 . #x1f45)
+   (#x1f48 . #x1f4d)
+   (#x1f50 . #x1f57)
+   #x1f59
+   #x1f5b
+   #x1f5d
+   (#x1f5f . #x1f7d)
+   (#x1f80 . #x1fb4)
+   (#x1fb6 . #x1fbc)
+   #x1fbe
+   (#x1fc2 . #x1fc4)
+   (#x1fc6 . #x1fcc)
+   (#x1fd0 . #x1fd3)
+   (#x1fd6 . #x1fdb)
+   (#x1fe0 . #x1fec)
+   (#x1ff2 . #x1ff4)
+   (#x1ff6 . #x1ffc)
+   #x2126
+   (#x212a . #x212b)
+   #x212e
+   (#x2180 . #x2182)
+   #x3007
+   (#x3021 . #x3029)
+   (#x3041 . #x3094)
+   (#x30a1 . #x30fa)
+   (#x3105 . #x312c)
+   (#x4e00 . #x9fa5)
+   (#xac00 . #xd7a3)))
+
+(xsdre-def-derived-category 'name-continue '(union name-initial
+                                                  name-continue-not-initial))
+                         
+(xsdre-def-primitive-category 
+ 'name-continue-not-initial
+ '((#x002d . #x002e)
+   (#x0030 . #x0039)
+   #x00b7
+   (#x02d0 . #x02d1)
+   (#x0300 . #x0345)
+   (#x0360 . #x0361)
+   #x0387
+   (#x0483 . #x0486)
+   (#x0591 . #x05a1)
+   (#x05a3 . #x05b9)
+   (#x05bb . #x05bd)
+   #x05bf
+   (#x05c1 . #x05c2)
+   #x05c4
+   #x0640
+   (#x064b . #x0652)
+   (#x0660 . #x0669)
+   #x0670
+   (#x06d6 . #x06dc)
+   (#x06dd . #x06df)
+   (#x06e0 . #x06e4)
+   (#x06e7 . #x06e8)
+   (#x06ea . #x06ed)
+   (#x06f0 . #x06f9)
+   (#x0901 . #x0903)
+   #x093c
+   (#x093e . #x094c)
+   #x094d
+   (#x0951 . #x0954)
+   (#x0962 . #x0963)
+   (#x0966 . #x096f)
+   (#x0981 . #x0983)
+   #x09bc
+   (#x09be . #x09bf)
+   (#x09c0 . #x09c4)
+   (#x09c7 . #x09c8)
+   (#x09cb . #x09cd)
+   #x09d7
+   (#x09e2 . #x09e3)
+   (#x09e6 . #x09ef)
+   #x0a02
+   #x0a3c
+   (#x0a3e . #x0a42)
+   (#x0a47 . #x0a48)
+   (#x0a4b . #x0a4d)
+   (#x0a66 . #x0a6f)
+   (#x0a70 . #x0a71)
+   (#x0a81 . #x0a83)
+   #x0abc
+   (#x0abe . #x0ac5)
+   (#x0ac7 . #x0ac9)
+   (#x0acb . #x0acd)
+   (#x0ae6 . #x0aef)
+   (#x0b01 . #x0b03)
+   #x0b3c
+   (#x0b3e . #x0b43)
+   (#x0b47 . #x0b48)
+   (#x0b4b . #x0b4d)
+   (#x0b56 . #x0b57)
+   (#x0b66 . #x0b6f)
+   (#x0b82 . #x0b83)
+   (#x0bbe . #x0bc2)
+   (#x0bc6 . #x0bc8)
+   (#x0bca . #x0bcd)
+   #x0bd7
+   (#x0be7 . #x0bef)
+   (#x0c01 . #x0c03)
+   (#x0c3e . #x0c44)
+   (#x0c46 . #x0c48)
+   (#x0c4a . #x0c4d)
+   (#x0c55 . #x0c56)
+   (#x0c66 . #x0c6f)
+   (#x0c82 . #x0c83)
+   (#x0cbe . #x0cc4)
+   (#x0cc6 . #x0cc8)
+   (#x0cca . #x0ccd)
+   (#x0cd5 . #x0cd6)
+   (#x0ce6 . #x0cef)
+   (#x0d02 . #x0d03)
+   (#x0d3e . #x0d43)
+   (#x0d46 . #x0d48)
+   (#x0d4a . #x0d4d)
+   #x0d57
+   (#x0d66 . #x0d6f)
+   #x0e31
+   (#x0e34 . #x0e3a)
+   (#x0e46 . #x0e4e)
+   (#x0e50 . #x0e59)
+   #x0eb1
+   (#x0eb4 . #x0eb9)
+   (#x0ebb . #x0ebc)
+   #x0ec6
+   (#x0ec8 . #x0ecd)
+   (#x0ed0 . #x0ed9)
+   (#x0f18 . #x0f19)
+   (#x0f20 . #x0f29)
+   #x0f35
+   #x0f37
+   #x0f39
+   (#x0f3e . #x0f3f)
+   (#x0f71 . #x0f84)
+   (#x0f86 . #x0f8b)
+   (#x0f90 . #x0f95)
+   #x0f97
+   (#x0f99 . #x0fad)
+   (#x0fb1 . #x0fb7)
+   #x0fb9
+   (#x20d0 . #x20dc)
+   #x20e1
+   #x3005
+   (#x302a . #x302f)
+   (#x3031 . #x3035)
+   #x3099
+   #x309a
+   (#x309d . #x309e)
+   (#x30fc . #x30fe)))
+
+;;; Auto-generated section.
+
+;; The rest of the file was auto-generated by doing M-x xsdre-gen-categories
+;; on UnicodeData-3.1.0.txt available from
+;; http://www.unicode.org/Public/3.1-Update/UnicodeData-3.1.0.txt
+
+(xsdre-def-primitive-category 'Lu
+                             '((65 . 90)
+                               (192 . 214)
+                               (216 . 222)
+                               256 258 260 262 264 266 268 270 272 274 276
+                               278 280 282 284 286 288 290 292 294 296 298
+                               300 302 304 306 308 310 313 315 317 319 321
+                               323 325 327 330 332 334 336 338 340 342 344
+                               346 348 350 352 354 356 358 360 362 364 366
+                               368 370 372 374
+                               (376 . 377)
+                               379 381
+                               (385 . 386)
+                               388
+                               (390 . 391)
+                               (393 . 395)
+                               (398 . 401)
+                               (403 . 404)
+                               (406 . 408)
+                               (412 . 413)
+                               (415 . 416)
+                               418 420
+                               (422 . 423)
+                               425 428
+                               (430 . 431)
+                               (433 . 435)
+                               437
+                               (439 . 440)
+                               444 452 455 458 461 463 465 467 469 471 473
+                               475 478 480 482 484 486 488 490 492 494 497
+                               500
+                               (502 . 504)
+                               506 508 510 512 514 516 518 520 522 524 526
+                               528 530 532 534 536 538 540 542 546 548 550
+                               552 554 556 558 560 562 902
+                               (904 . 906)
+                               908
+                               (910 . 911)
+                               (913 . 929)
+                               (931 . 939)
+                               (978 . 980)
+                               986 988 990 992 994 996 998 1000 1002 1004
+                               1006 1012
+                               (1024 . 1071)
+                               1120 1122 1124 1126 1128 1130 1132 1134 1136
+                               1138 1140 1142 1144 1146 1148 1150 1152 1164
+                               1166 1168 1170 1172 1174 1176 1178 1180 1182
+                               1184 1186 1188 1190 1192 1194 1196 1198 1200
+                               1202 1204 1206 1208 1210 1212 1214
+                               (1216 . 1217)
+                               1219 1223 1227 1232 1234 1236 1238 1240 1242
+                               1244 1246 1248 1250 1252 1254 1256 1258 1260
+                               1262 1264 1266 1268 1272
+                               (1329 . 1366)
+                               (4256 . 4293)
+                               7680 7682 7684 7686 7688 7690 7692 7694 7696
+                               7698 7700 7702 7704 7706 7708 7710 7712 7714
+                               7716 7718 7720 7722 7724 7726 7728 7730 7732
+                               7734 7736 7738 7740 7742 7744 7746 7748 7750
+                               7752 7754 7756 7758 7760 7762 7764 7766 7768
+                               7770 7772 7774 7776 7778 7780 7782 7784 7786
+                               7788 7790 7792 7794 7796 7798 7800 7802 7804
+                               7806 7808 7810 7812 7814 7816 7818 7820 7822
+                               7824 7826 7828 7840 7842 7844 7846 7848 7850
+                               7852 7854 7856 7858 7860 7862 7864 7866 7868
+                               7870 7872 7874 7876 7878 7880 7882 7884 7886
+                               7888 7890 7892 7894 7896 7898 7900 7902 7904
+                               7906 7908 7910 7912 7914 7916 7918 7920 7922
+                               7924 7926 7928
+                               (7944 . 7951)
+                               (7960 . 7965)
+                               (7976 . 7983)
+                               (7992 . 7999)
+                               (8008 . 8013)
+                               8025 8027 8029 8031
+                               (8040 . 8047)
+                               (8120 . 8123)
+                               (8136 . 8139)
+                               (8152 . 8155)
+                               (8168 . 8172)
+                               (8184 . 8187)
+                               8450 8455
+                               (8459 . 8461)
+                               (8464 . 8466)
+                               8469
+                               (8473 . 8477)
+                               8484 8486 8488
+                               (8490 . 8493)
+                               (8496 . 8497)
+                               8499
+                               (65313 . 65338)
+                               (66560 . 66597)
+                               (119808 . 119833)
+                               (119860 . 119885)
+                               (119912 . 119937)
+                               119964
+                               (119966 . 119967)
+                               119970
+                               (119973 . 119974)
+                               (119977 . 119980)
+                               (119982 . 119989)
+                               (120016 . 120041)
+                               (120068 . 120069)
+                               (120071 . 120074)
+                               (120077 . 120084)
+                               (120086 . 120092)
+                               (120120 . 120121)
+                               (120123 . 120126)
+                               (120128 . 120132)
+                               120134
+                               (120138 . 120144)
+                               (120172 . 120197)
+                               (120224 . 120249)
+                               (120276 . 120301)
+                               (120328 . 120353)
+                               (120380 . 120405)
+                               (120432 . 120457)
+                               (120488 . 120512)
+                               (120546 . 120570)
+                               (120604 . 120628)
+                               (120662 . 120686)
+                               (120720 . 120744)))
+(xsdre-def-primitive-category 'Ll
+                             '((97 . 122)
+                               170 181 186
+                               (223 . 246)
+                               (248 . 255)
+                               257 259 261 263 265 267 269 271 273 275 277
+                               279 281 283 285 287 289 291 293 295 297 299
+                               301 303 305 307 309
+                               (311 . 312)
+                               314 316 318 320 322 324 326
+                               (328 . 329)
+                               331 333 335 337 339 341 343 345 347 349 351
+                               353 355 357 359 361 363 365 367 369 371 373
+                               375 378 380
+                               (382 . 384)
+                               387 389 392
+                               (396 . 397)
+                               402 405
+                               (409 . 411)
+                               414 417 419 421 424
+                               (426 . 427)
+                               429 432 436 438
+                               (441 . 442)
+                               (445 . 447)
+                               454 457 460 462 464 466 468 470 472 474
+                               (476 . 477)
+                               479 481 483 485 487 489 491 493
+                               (495 . 496)
+                               499 501 505 507 509 511 513 515 517 519 521
+                               523 525 527 529 531 533 535 537 539 541 543
+                               547 549 551 553 555 557 559 561 563
+                               (592 . 685)
+                               912
+                               (940 . 974)
+                               (976 . 977)
+                               (981 . 983)
+                               987 989 991 993 995 997 999 1001 1003 1005
+                             
+                               (1007 . 1011)
+                               1013
+                               (1072 . 1119)
+                               1121 1123 1125 1127 1129 1131 1133 1135 1137
+                               1139 1141 1143 1145 1147 1149 1151 1153 1165
+                               1167 1169 1171 1173 1175 1177 1179 1181 1183
+                               1185 1187 1189 1191 1193 1195 1197 1199 1201
+                               1203 1205 1207 1209 1211 1213 1215 1218 1220
+                               1224 1228 1233 1235 1237 1239 1241 1243 1245
+                               1247 1249 1251 1253 1255 1257 1259 1261 1263
+                               1265 1267 1269 1273
+                               (1377 . 1415)
+                               7681 7683 7685 7687 7689 7691 7693 7695 7697
+                               7699 7701 7703 7705 7707 7709 7711 7713 7715
+                               7717 7719 7721 7723 7725 7727 7729 7731 7733
+                               7735 7737 7739 7741 7743 7745 7747 7749 7751
+                               7753 7755 7757 7759 7761 7763 7765 7767 7769
+                               7771 7773 7775 7777 7779 7781 7783 7785 7787
+                               7789 7791 7793 7795 7797 7799 7801 7803 7805
+                               7807 7809 7811 7813 7815 7817 7819 7821 7823
+                               7825 7827
+                               (7829 . 7835)
+                               7841 7843 7845 7847 7849 7851 7853 7855 7857
+                               7859 7861 7863 7865 7867 7869 7871 7873 7875
+                               7877 7879 7881 7883 7885 7887 7889 7891 7893
+                               7895 7897 7899 7901 7903 7905 7907 7909 7911
+                               7913 7915 7917 7919 7921 7923 7925 7927 7929
+                             
+                               (7936 . 7943)
+                               (7952 . 7957)
+                               (7968 . 7975)
+                               (7984 . 7991)
+                               (8000 . 8005)
+                               (8016 . 8023)
+                               (8032 . 8039)
+                               (8048 . 8061)
+                               (8064 . 8071)
+                               (8080 . 8087)
+                               (8096 . 8103)
+                               (8112 . 8116)
+                               (8118 . 8119)
+                               8126
+                               (8130 . 8132)
+                               (8134 . 8135)
+                               (8144 . 8147)
+                               (8150 . 8151)
+                               (8160 . 8167)
+                               (8178 . 8180)
+                               (8182 . 8183)
+                               8319 8458
+                               (8462 . 8463)
+                               8467 8495 8500 8505
+                               (64256 . 64262)
+                               (64275 . 64279)
+                               (65345 . 65370)
+                               (66600 . 66637)
+                               (119834 . 119859)
+                               (119886 . 119892)
+                               (119894 . 119911)
+                               (119938 . 119963)
+                               (119990 . 119993)
+                               119995
+                               (119997 . 120000)
+                               (120002 . 120003)
+                               (120005 . 120015)
+                               (120042 . 120067)
+                               (120094 . 120119)
+                               (120146 . 120171)
+                               (120198 . 120223)
+                               (120250 . 120275)
+                               (120302 . 120327)
+                               (120354 . 120379)
+                               (120406 . 120431)
+                               (120458 . 120483)
+                               (120514 . 120538)
+                               (120540 . 120545)
+                               (120572 . 120596)
+                               (120598 . 120603)
+                               (120630 . 120654)
+                               (120656 . 120661)
+                               (120688 . 120712)
+                               (120714 . 120719)
+                               (120746 . 120770)
+                               (120772 . 120777)))
+(xsdre-def-primitive-category 'Lt
+                             '(453 456 459 498
+                                   (8072 . 8079)
+                                   (8088 . 8095)
+                                   (8104 . 8111)
+                                   8124 8140 8188))
+(xsdre-def-primitive-category 'Lm
+                             '((688 . 696)
+                               (699 . 705)
+                               (720 . 721)
+                               (736 . 740)
+                               750 890 1369 1600
+                               (1765 . 1766)
+                               3654 3782 6211 12293
+                               (12337 . 12341)
+                               (12445 . 12446)
+                               (12540 . 12542)
+                               65392
+                               (65438 . 65439)))
+(xsdre-def-primitive-category 'Lo
+                             '(443
+                               (448 . 451)
+                               (1488 . 1514)
+                               (1520 . 1522)
+                               (1569 . 1594)
+                               (1601 . 1610)
+                               (1649 . 1747)
+                               1749
+                               (1786 . 1788)
+                               1808
+                               (1810 . 1836)
+                               (1920 . 1957)
+                               (2309 . 2361)
+                               2365 2384
+                               (2392 . 2401)
+                               (2437 . 2444)
+                               (2447 . 2448)
+                               (2451 . 2472)
+                               (2474 . 2480)
+                               2482
+                               (2486 . 2489)
+                               (2524 . 2525)
+                               (2527 . 2529)
+                               (2544 . 2545)
+                               (2565 . 2570)
+                               (2575 . 2576)
+                               (2579 . 2600)
+                               (2602 . 2608)
+                               (2610 . 2611)
+                               (2613 . 2614)
+                               (2616 . 2617)
+                               (2649 . 2652)
+                               2654
+                               (2674 . 2676)
+                               (2693 . 2699)
+                               2701
+                               (2703 . 2705)
+                               (2707 . 2728)
+                               (2730 . 2736)
+                               (2738 . 2739)
+                               (2741 . 2745)
+                               2749 2768 2784
+                               (2821 . 2828)
+                               (2831 . 2832)
+                               (2835 . 2856)
+                               (2858 . 2864)
+                               (2866 . 2867)
+                               (2870 . 2873)
+                               2877
+                               (2908 . 2909)
+                               (2911 . 2913)
+                               (2949 . 2954)
+                               (2958 . 2960)
+                               (2962 . 2965)
+                               (2969 . 2970)
+                               2972
+                               (2974 . 2975)
+                               (2979 . 2980)
+                               (2984 . 2986)
+                               (2990 . 2997)
+                               (2999 . 3001)
+                               (3077 . 3084)
+                               (3086 . 3088)
+                               (3090 . 3112)
+                               (3114 . 3123)
+                               (3125 . 3129)
+                               (3168 . 3169)
+                               (3205 . 3212)
+                               (3214 . 3216)
+                               (3218 . 3240)
+                               (3242 . 3251)
+                               (3253 . 3257)
+                               3294
+                               (3296 . 3297)
+                               (3333 . 3340)
+                               (3342 . 3344)
+                               (3346 . 3368)
+                               (3370 . 3385)
+                               (3424 . 3425)
+                               (3461 . 3478)
+                               (3482 . 3505)
+                               (3507 . 3515)
+                               3517
+                               (3520 . 3526)
+                               (3585 . 3632)
+                               (3634 . 3635)
+                               (3648 . 3653)
+                               (3713 . 3714)
+                               3716
+                               (3719 . 3720)
+                               3722 3725
+                               (3732 . 3735)
+                               (3737 . 3743)
+                               (3745 . 3747)
+                               3749 3751
+                               (3754 . 3755)
+                               (3757 . 3760)
+                               (3762 . 3763)
+                               3773
+                               (3776 . 3780)
+                               (3804 . 3805)
+                               3840
+                               (3904 . 3911)
+                               (3913 . 3946)
+                               (3976 . 3979)
+                               (4096 . 4129)
+                               (4131 . 4135)
+                               (4137 . 4138)
+                               (4176 . 4181)
+                               (4304 . 4342)
+                               (4352 . 4441)
+                               (4447 . 4514)
+                               (4520 . 4601)
+                               (4608 . 4614)
+                               (4616 . 4678)
+                               4680
+                               (4682 . 4685)
+                               (4688 . 4694)
+                               4696
+                               (4698 . 4701)
+                               (4704 . 4742)
+                               4744
+                               (4746 . 4749)
+                               (4752 . 4782)
+                               4784
+                               (4786 . 4789)
+                               (4792 . 4798)
+                               4800
+                               (4802 . 4805)
+                               (4808 . 4814)
+                               (4816 . 4822)
+                               (4824 . 4846)
+                               (4848 . 4878)
+                               4880
+                               (4882 . 4885)
+                               (4888 . 4894)
+                               (4896 . 4934)
+                               (4936 . 4954)
+                               (5024 . 5108)
+                               (5121 . 5740)
+                               (5743 . 5750)
+                               (5761 . 5786)
+                               (5792 . 5866)
+                               (6016 . 6067)
+                               (6176 . 6210)
+                               (6212 . 6263)
+                               (6272 . 6312)
+                               (8501 . 8504)
+                               12294
+                               (12353 . 12436)
+                               (12449 . 12538)
+                               (12549 . 12588)
+                               (12593 . 12686)
+                               (12704 . 12727)
+                               (13312 . 19893)
+                               (19968 . 40869)
+                               (40960 . 42124)
+                               (44032 . 55203)
+                               (63744 . 64045)
+                               64285
+                               (64287 . 64296)
+                               (64298 . 64310)
+                               (64312 . 64316)
+                               64318
+                               (64320 . 64321)
+                               (64323 . 64324)
+                               (64326 . 64433)
+                               (64467 . 64829)
+                               (64848 . 64911)
+                               (64914 . 64967)
+                               (65008 . 65019)
+                               (65136 . 65138)
+                               65140
+                               (65142 . 65276)
+                               (65382 . 65391)
+                               (65393 . 65437)
+                               (65440 . 65470)
+                               (65474 . 65479)
+                               (65482 . 65487)
+                               (65490 . 65495)
+                               (65498 . 65500)
+                               (66304 . 66334)
+                               (66352 . 66377)
+                               (131072 . 173782)
+                               (194560 . 195101)))
+(xsdre-def-primitive-category 'Mn
+                             '((768 . 846)
+                               (864 . 866)
+                               (1155 . 1158)
+                               (1425 . 1441)
+                               (1443 . 1465)
+                               (1467 . 1469)
+                               1471
+                               (1473 . 1474)
+                               1476
+                               (1611 . 1621)
+                               1648
+                               (1750 . 1756)
+                               (1759 . 1764)
+                               (1767 . 1768)
+                               (1770 . 1773)
+                               1809
+                               (1840 . 1866)
+                               (1958 . 1968)
+                               (2305 . 2306)
+                               2364
+                               (2369 . 2376)
+                               2381
+                               (2385 . 2388)
+                               (2402 . 2403)
+                               2433 2492
+                               (2497 . 2500)
+                               2509
+                               (2530 . 2531)
+                               2562 2620
+                               (2625 . 2626)
+                               (2631 . 2632)
+                               (2635 . 2637)
+                               (2672 . 2673)
+                               (2689 . 2690)
+                               2748
+                               (2753 . 2757)
+                               (2759 . 2760)
+                               2765 2817 2876 2879
+                               (2881 . 2883)
+                               2893 2902 2946 3008 3021
+                               (3134 . 3136)
+                               (3142 . 3144)
+                               (3146 . 3149)
+                               (3157 . 3158)
+                               3263 3270
+                               (3276 . 3277)
+                               (3393 . 3395)
+                               3405 3530
+                               (3538 . 3540)
+                               3542 3633
+                               (3636 . 3642)
+                               (3655 . 3662)
+                               3761
+                               (3764 . 3769)
+                               (3771 . 3772)
+                               (3784 . 3789)
+                               (3864 . 3865)
+                               3893 3895 3897
+                               (3953 . 3966)
+                               (3968 . 3972)
+                               (3974 . 3975)
+                               (3984 . 3991)
+                               (3993 . 4028)
+                               4038
+                               (4141 . 4144)
+                               4146
+                               (4150 . 4151)
+                               4153
+                               (4184 . 4185)
+                               (6071 . 6077)
+                               6086
+                               (6089 . 6099)
+                               6313
+                               (8400 . 8412)
+                               8417
+                               (12330 . 12335)
+                               (12441 . 12442)
+                               64286
+                               (65056 . 65059)
+                               (119143 . 119145)
+                               (119163 . 119170)
+                               (119173 . 119179)
+                               (119210 . 119213)))
+(xsdre-def-primitive-category 'Mc
+                             '(2307
+                               (2366 . 2368)
+                               (2377 . 2380)
+                               (2434 . 2435)
+                               (2494 . 2496)
+                               (2503 . 2504)
+                               (2507 . 2508)
+                               2519
+                               (2622 . 2624)
+                               2691
+                               (2750 . 2752)
+                               2761
+                               (2763 . 2764)
+                               (2818 . 2819)
+                               2878 2880
+                               (2887 . 2888)
+                               (2891 . 2892)
+                               2903 2947
+                               (3006 . 3007)
+                               (3009 . 3010)
+                               (3014 . 3016)
+                               (3018 . 3020)
+                               3031
+                               (3073 . 3075)
+                               (3137 . 3140)
+                               (3202 . 3203)
+                               3262
+                               (3264 . 3268)
+                               (3271 . 3272)
+                               (3274 . 3275)
+                               (3285 . 3286)
+                               (3330 . 3331)
+                               (3390 . 3392)
+                               (3398 . 3400)
+                               (3402 . 3404)
+                               3415
+                               (3458 . 3459)
+                               (3535 . 3537)
+                               (3544 . 3551)
+                               (3570 . 3571)
+                               (3902 . 3903)
+                               3967 4140 4145 4152
+                               (4182 . 4183)
+                               (6068 . 6070)
+                               (6078 . 6085)
+                               (6087 . 6088)
+                               (119141 . 119142)
+                               (119149 . 119154)))
+(xsdre-def-primitive-category 'Me
+                             '((1160 . 1161)
+                               (1757 . 1758)
+                               (8413 . 8416)
+                               (8418 . 8419)))
+(xsdre-def-primitive-category 'Nd
+                             '((48 . 57)
+                               (1632 . 1641)
+                               (1776 . 1785)
+                               (2406 . 2415)
+                               (2534 . 2543)
+                               (2662 . 2671)
+                               (2790 . 2799)
+                               (2918 . 2927)
+                               (3047 . 3055)
+                               (3174 . 3183)
+                               (3302 . 3311)
+                               (3430 . 3439)
+                               (3664 . 3673)
+                               (3792 . 3801)
+                               (3872 . 3881)
+                               (4160 . 4169)
+                               (4969 . 4977)
+                               (6112 . 6121)
+                               (6160 . 6169)
+                               (65296 . 65305)
+                               (120782 . 120831)))
+(xsdre-def-primitive-category 'Nl
+                             '((5870 . 5872)
+                               (8544 . 8579)
+                               12295
+                               (12321 . 12329)
+                               (12344 . 12346)
+                               66378))
+(xsdre-def-primitive-category 'No
+                             '((178 . 179)
+                               185
+                               (188 . 190)
+                               (2548 . 2553)
+                               (3056 . 3058)
+                               (3882 . 3891)
+                               (4978 . 4988)
+                               8304
+                               (8308 . 8313)
+                               (8320 . 8329)
+                               (8531 . 8543)
+                               (9312 . 9371)
+                               9450
+                               (10102 . 10131)
+                               (12690 . 12693)
+                               (12832 . 12841)
+                               (12928 . 12937)
+                               (66336 . 66339)))
+(xsdre-def-primitive-category 'Pc
+                             '(95
+                               (8255 . 8256)
+                               12539
+                               (65075 . 65076)
+                               (65101 . 65103)
+                               65343 65381))
+(xsdre-def-primitive-category 'Pd
+                             '(45 173 1418 6150
+                                  (8208 . 8213)
+                                  12316 12336
+                                  (65073 . 65074)
+                                  65112 65123 65293))
+(xsdre-def-primitive-category 'Ps
+                             '(40 91 123 3898 3900 5787 8218 8222 8261 8317
+                                  8333 9001 12296 12298 12300 12302 12304
+                                  12308 12310 12312 12314 12317 64830 65077
+                                  65079 65081 65083 65085 65087 65089 65091
+                                  65113 65115 65117 65288 65339 65371 65378))
+(xsdre-def-primitive-category 'Pe
+                             '(41 93 125 3899 3901 5788 8262 8318 8334 9002
+                                  12297 12299 12301 12303 12305 12309 12311
+                                  12313 12315
+                                  (12318 . 12319)
+                                  64831 65078 65080 65082 65084 65086 65088
+                                  65090 65092 65114 65116 65118 65289 65341
+                                  65373 65379))
+(xsdre-def-primitive-category 'Pi
+                             '(171 8216
+                                   (8219 . 8220)
+                                   8223 8249))
+(xsdre-def-primitive-category 'Pf
+                             '(187 8217 8221 8250))
+(xsdre-def-primitive-category 'Po
+                             '((33 . 35)
+                               (37 . 39)
+                               42 44
+                               (46 . 47)
+                               (58 . 59)
+                               (63 . 64)
+                               92 161 183 191 894 903
+                               (1370 . 1375)
+                               1417 1470 1472 1475
+                               (1523 . 1524)
+                               1548 1563 1567
+                               (1642 . 1645)
+                               1748
+                               (1792 . 1805)
+                               (2404 . 2405)
+                               2416 3572 3663
+                               (3674 . 3675)
+                               (3844 . 3858)
+                               3973
+                               (4170 . 4175)
+                               4347
+                               (4961 . 4968)
+                               (5741 . 5742)
+                               (5867 . 5869)
+                               (6100 . 6106)
+                               6108
+                               (6144 . 6149)
+                               (6151 . 6154)
+                               (8214 . 8215)
+                               (8224 . 8231)
+                               (8240 . 8248)
+                               (8251 . 8254)
+                               (8257 . 8259)
+                               (8264 . 8269)
+                               (12289 . 12291)
+                               65072
+                               (65097 . 65100)
+                               (65104 . 65106)
+                               (65108 . 65111)
+                               (65119 . 65121)
+                               65128
+                               (65130 . 65131)
+                               (65281 . 65283)
+                               (65285 . 65287)
+                               65290 65292
+                               (65294 . 65295)
+                               (65306 . 65307)
+                               (65311 . 65312)
+                               65340 65377 65380))
+(xsdre-def-primitive-category 'Zs
+                             '(32 160 5760
+                                  (8192 . 8203)
+                                  8239 12288))
+(xsdre-def-primitive-category 'Zl
+                             '(8232))
+(xsdre-def-primitive-category 'Zp
+                             '(8233))
+(xsdre-def-primitive-category 'Sm
+                             '(43
+                               (60 . 62)
+                               124 126 172 177 215 247 8260
+                               (8314 . 8316)
+                               (8330 . 8332)
+                               (8592 . 8596)
+                               (8602 . 8603)
+                               8608 8611 8614 8622
+                               (8654 . 8655)
+                               8658 8660
+                               (8704 . 8945)
+                               (8968 . 8971)
+                               (8992 . 8993)
+                               9655 9665 9839 64297 65122
+                               (65124 . 65126)
+                               65291
+                               (65308 . 65310)
+                               65372 65374 65506
+                               (65513 . 65516)
+                               120513 120539 120571 120597 120629 120655
+                               120687 120713 120745 120771))
+(xsdre-def-primitive-category 'Sc
+                             '(36
+                               (162 . 165)
+                               (2546 . 2547)
+                               3647 6107
+                               (8352 . 8367)
+                               65129 65284
+                               (65504 . 65505)
+                               (65509 . 65510)))
+(xsdre-def-primitive-category 'Sk
+                             '(94 96 168 175 180 184
+                                  (697 . 698)
+                                  (706 . 719)
+                                  (722 . 735)
+                                  (741 . 749)
+                                  (884 . 885)
+                                  (900 . 901)
+                                  8125
+                                  (8127 . 8129)
+                                  (8141 . 8143)
+                                  (8157 . 8159)
+                                  (8173 . 8175)
+                                  (8189 . 8190)
+                                  (12443 . 12444)
+                                  65342 65344 65507))
+(xsdre-def-primitive-category 'So
+                             '((166 . 167)
+                               169 174 176 182 1154 1769
+                               (1789 . 1790)
+                               2554 2928
+                               (3841 . 3843)
+                               (3859 . 3863)
+                               (3866 . 3871)
+                               3892 3894 3896
+                               (4030 . 4037)
+                               (4039 . 4044)
+                               4047
+                               (8448 . 8449)
+                               (8451 . 8454)
+                               (8456 . 8457)
+                               8468
+                               (8470 . 8472)
+                               (8478 . 8483)
+                               8485 8487 8489 8494 8498 8506
+                               (8597 . 8601)
+                               (8604 . 8607)
+                               (8609 . 8610)
+                               (8612 . 8613)
+                               (8615 . 8621)
+                               (8623 . 8653)
+                               (8656 . 8657)
+                               8659
+                               (8661 . 8691)
+                               (8960 . 8967)
+                               (8972 . 8991)
+                               (8994 . 9000)
+                               (9003 . 9083)
+                               (9085 . 9114)
+                               (9216 . 9254)
+                               (9280 . 9290)
+                               (9372 . 9449)
+                               (9472 . 9621)
+                               (9632 . 9654)
+                               (9656 . 9664)
+                               (9666 . 9719)
+                               (9728 . 9747)
+                               (9753 . 9838)
+                               (9840 . 9841)
+                               (9985 . 9988)
+                               (9990 . 9993)
+                               (9996 . 10023)
+                               (10025 . 10059)
+                               10061
+                               (10063 . 10066)
+                               10070
+                               (10072 . 10078)
+                               (10081 . 10087)
+                               10132
+                               (10136 . 10159)
+                               (10161 . 10174)
+                               (10240 . 10495)
+                               (11904 . 11929)
+                               (11931 . 12019)
+                               (12032 . 12245)
+                               (12272 . 12283)
+                               12292
+                               (12306 . 12307)
+                               12320
+                               (12342 . 12343)
+                               (12350 . 12351)
+                               (12688 . 12689)
+                               (12694 . 12703)
+                               (12800 . 12828)
+                               (12842 . 12867)
+                               (12896 . 12923)
+                               12927
+                               (12938 . 12976)
+                               (12992 . 13003)
+                               (13008 . 13054)
+                               (13056 . 13174)
+                               (13179 . 13277)
+                               (13280 . 13310)
+                               (42128 . 42145)
+                               (42148 . 42163)
+                               (42165 . 42176)
+                               (42178 . 42180)
+                               42182 65508 65512
+                               (65517 . 65518)
+                               (65532 . 65533)
+                               (118784 . 119029)
+                               (119040 . 119078)
+                               (119082 . 119140)
+                               (119146 . 119148)
+                               (119171 . 119172)
+                               (119180 . 119209)
+                               (119214 . 119261)))
+(xsdre-def-primitive-category 'Cc
+                             '((0 . 31)
+                               (127 . 159)))
+(xsdre-def-primitive-category 'Cf
+                             '(1807
+                               (6155 . 6158)
+                               (8204 . 8207)
+                               (8234 . 8238)
+                               (8298 . 8303)
+                               65279
+                               (65529 . 65531)
+                               (119155 . 119162)
+                               917505
+                               (917536 . 917631)))
+(xsdre-def-primitive-category 'Co
+                             '((57344 . 63743)
+                               (983040 . 1048573)
+                               (1048576 . 1114109)))
+
+(provide 'xsd-regexp)
+
+;;; xsd-regexp.el ends here