aboutsummaryrefslogtreecommitdiffstats
path: root/lv2specgen
diff options
context:
space:
mode:
Diffstat (limited to 'lv2specgen')
-rw-r--r--lv2specgen/DTD/xhtml-attribs-1.mod142
-rw-r--r--lv2specgen/DTD/xhtml-base-1.mod53
-rw-r--r--lv2specgen/DTD/xhtml-basic-table-1.mod167
-rw-r--r--lv2specgen/DTD/xhtml-basic11-model-1.mod169
-rw-r--r--lv2specgen/DTD/xhtml-basic11.dtd221
-rw-r--r--lv2specgen/DTD/xhtml-bdo-1.mod47
-rw-r--r--lv2specgen/DTD/xhtml-blkphras-1.mod164
-rw-r--r--lv2specgen/DTD/xhtml-blkpres-1.mod40
-rw-r--r--lv2specgen/DTD/xhtml-blkstruct-1.mod57
-rw-r--r--lv2specgen/DTD/xhtml-charent-1.mod38
-rw-r--r--lv2specgen/DTD/xhtml-csismap-1.mod114
-rw-r--r--lv2specgen/DTD/xhtml-datatypes-1.mod85
-rw-r--r--lv2specgen/DTD/xhtml-edit-1.mod66
-rw-r--r--lv2specgen/DTD/xhtml-events-1.mod135
-rw-r--r--lv2specgen/DTD/xhtml-form-1.mod292
-rw-r--r--lv2specgen/DTD/xhtml-framework-1.mod97
-rw-r--r--lv2specgen/DTD/xhtml-hypertext-1.mod54
-rw-r--r--lv2specgen/DTD/xhtml-image-1.mod51
-rw-r--r--lv2specgen/DTD/xhtml-inlphras-1.mod203
-rw-r--r--lv2specgen/DTD/xhtml-inlpres-1.mod138
-rw-r--r--lv2specgen/DTD/xhtml-inlstruct-1.mod62
-rw-r--r--lv2specgen/DTD/xhtml-inlstyle-1.mod34
-rw-r--r--lv2specgen/DTD/xhtml-inputmode-1.mod39
-rw-r--r--lv2specgen/DTD/xhtml-lat1.ent235
-rw-r--r--lv2specgen/DTD/xhtml-legacy-1.mod400
-rw-r--r--lv2specgen/DTD/xhtml-link-1.mod59
-rw-r--r--lv2specgen/DTD/xhtml-list-1.mod129
-rw-r--r--lv2specgen/DTD/xhtml-meta-1.mod47
-rw-r--r--lv2specgen/DTD/xhtml-object-1.mod60
-rw-r--r--lv2specgen/DTD/xhtml-param-1.mod48
-rw-r--r--lv2specgen/DTD/xhtml-pres-1.mod38
-rw-r--r--lv2specgen/DTD/xhtml-qname-1.mod318
-rw-r--r--lv2specgen/DTD/xhtml-script-1.mod67
-rw-r--r--lv2specgen/DTD/xhtml-special.ent89
-rw-r--r--lv2specgen/DTD/xhtml-ssismap-1.mod32
-rw-r--r--lv2specgen/DTD/xhtml-struct-1.mod136
-rw-r--r--lv2specgen/DTD/xhtml-style-1.mod48
-rw-r--r--lv2specgen/DTD/xhtml-symbol.ent235
-rw-r--r--lv2specgen/DTD/xhtml-table-1.mod333
-rw-r--r--lv2specgen/DTD/xhtml-target-1.mod53
-rw-r--r--lv2specgen/DTD/xhtml-text-1.mod52
-rwxr-xr-xlv2specgen/lv2docgen.py138
-rwxr-xr-xlv2specgen/lv2specgen.py1525
l---------lv2specgen/style.css1
-rw-r--r--lv2specgen/template.html93
45 files changed, 6604 insertions, 0 deletions
diff --git a/lv2specgen/DTD/xhtml-attribs-1.mod b/lv2specgen/DTD/xhtml-attribs-1.mod
new file mode 100644
index 0000000..dbfe42e
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-attribs-1.mod
@@ -0,0 +1,142 @@
+<!-- ...................................................................... -->
+<!-- XHTML Common Attributes Module ...................................... -->
+<!-- file: xhtml-attribs-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-attribs-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Common Attributes 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-attribs-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Common Attributes
+
+ This module declares many of the common attributes for the XHTML DTD.
+ %NS.decl.attrib; is declared in the XHTML Qname module.
+
+ Note that this file was extended in XHTML Modularization 1.1 to
+ include declarations of "global" versions of the attribute collections.
+ The global versions of the attributes are for use on elements in other
+ namespaces. The global version of "common" includes the xmlns declaration
+ for the prefixed version of the xhtml namespace. If you are only using a
+ specific attribute or an individual attribute collection, you must also
+ include the XHTML.xmlns.attrib.prefixed PE on your elements.
+-->
+
+<!ENTITY % id.attrib
+ "id ID #IMPLIED"
+>
+
+<![%XHTML.global.attrs.prefixed;[
+<!ENTITY % XHTML.global.id.attrib
+ "%XHTML.prefix;:id ID #IMPLIED"
+>
+]]>
+
+<!ENTITY % class.attrib
+ "class NMTOKENS #IMPLIED"
+>
+
+<![%XHTML.global.attrs.prefixed;[
+<!ENTITY % XHTML.global.class.attrib
+ "%XHTML.prefix;:class NMTOKENS #IMPLIED"
+>
+]]>
+
+<!ENTITY % title.attrib
+ "title %Text.datatype; #IMPLIED"
+>
+
+<![%XHTML.global.attrs.prefixed;[
+<!ENTITY % XHTML.global.title.attrib
+ "%XHTML.prefix;:title %Text.datatype; #IMPLIED"
+>
+]]>
+
+<!ENTITY % Core.extra.attrib "" >
+
+<!ENTITY % Core.attrib
+ "%XHTML.xmlns.attrib;
+ %id.attrib;
+ %class.attrib;
+ %title.attrib;
+ xml:space ( preserve ) #FIXED 'preserve'
+ %Core.extra.attrib;"
+>
+
+<!ENTITY % XHTML.global.core.extra.attrib "" >
+
+<![%XHTML.global.attrs.prefixed;[
+
+<!ENTITY % XHTML.global.core.attrib
+ "%XHTML.global.id.attrib;
+ %XHTML.global.class.attrib;
+ %XHTML.global.title.attrib;
+ %XHTML.global.core.extra.attrib;"
+>
+]]>
+
+<!ENTITY % XHTML.global.core.attrib "" >
+
+
+<!ENTITY % lang.attrib
+ "xml:lang %LanguageCode.datatype; #IMPLIED"
+>
+
+<![%XHTML.bidi;[
+<!ENTITY % dir.attrib
+ "dir ( ltr | rtl ) #IMPLIED"
+>
+
+<!ENTITY % I18n.attrib
+ "%dir.attrib;
+ %lang.attrib;"
+>
+
+<![%XHTML.global.attrs.prefixed;[
+<!ENTITY XHTML.global.i18n.attrib
+ "%XHTML.prefix;:dir ( ltr | rtl ) #IMPLIED
+ %lang.attrib;"
+>
+]]>
+<!ENTITY XHTML.global.i18n.attrib "" >
+
+]]>
+<!ENTITY % I18n.attrib
+ "%lang.attrib;"
+>
+<!ENTITY % XHTML.global.i18n.attrib
+ "%lang.attrib;"
+>
+
+<!ENTITY % Common.extra.attrib "" >
+<!ENTITY % XHTML.global.common.extra.attrib "" >
+
+<!-- intrinsic event attributes declared previously
+-->
+<!ENTITY % Events.attrib "" >
+
+<!ENTITY % XHTML.global.events.attrib "" >
+
+<!ENTITY % Common.attrib
+ "%Core.attrib;
+ %I18n.attrib;
+ %Events.attrib;
+ %Common.extra.attrib;"
+>
+
+<!ENTITY % XHTML.global.common.attrib
+ "%XHTML.xmlns.attrib.prefixed;
+ %XHTML.global.core.attrib;
+ %XHTML.global.i18n.attrib;
+ %XHTML.global.events.attrib;
+ %XHTML.global.common.extra.attrib;"
+>
+
+<!-- end of xhtml-attribs-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-base-1.mod b/lv2specgen/DTD/xhtml-base-1.mod
new file mode 100644
index 0000000..ba47b40
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-base-1.mod
@@ -0,0 +1,53 @@
+<!-- ...................................................................... -->
+<!-- XHTML Base Element Module ........................................... -->
+<!-- file: xhtml-base-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-base-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Base Element 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-base-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Base element
+
+ base
+
+ This module declares the base element type and its attributes,
+ used to define a base URI against which relative URIs in the
+ document will be resolved.
+
+ Note that this module also redeclares the content model for
+ the head element to include the base element.
+-->
+
+<!-- base: Document Base URI ........................... -->
+
+<!ENTITY % base.element "INCLUDE" >
+<![%base.element;[
+<!ENTITY % base.content "EMPTY" >
+<!ENTITY % base.qname "base" >
+<!ELEMENT %base.qname; %base.content; >
+<!-- end of base.element -->]]>
+
+<!ENTITY % base.attlist "INCLUDE" >
+<![%base.attlist;[
+<!ATTLIST %base.qname;
+ %XHTML.xmlns.attrib;
+ href %URI.datatype; #REQUIRED
+>
+<!-- end of base.attlist -->]]>
+
+<!ENTITY % head.content
+ "( %HeadOpts.mix;,
+ ( ( %title.qname;, %HeadOpts.mix;, ( %base.qname;, %HeadOpts.mix; )? )
+ | ( %base.qname;, %HeadOpts.mix;, ( %title.qname;, %HeadOpts.mix; ))))"
+>
+
+<!-- end of xhtml-base-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-basic-table-1.mod b/lv2specgen/DTD/xhtml-basic-table-1.mod
new file mode 100644
index 0000000..acbd046
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-basic-table-1.mod
@@ -0,0 +1,167 @@
+<!-- ....................................................................... -->
+<!-- XHTML Basic Table Module ............................................. -->
+<!-- file: xhtml-basic-table-1.mod
+
+ This is XHTML Basic, a proper subset of XHTML.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-basic-table-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Basic Tables 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-basic-table-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Basic Tables
+
+ table, caption, tr, th, td
+
+ This table module declares elements and attributes defining
+ a table model based fundamentally on features found in the
+ widely-deployed HTML 3.2 table model. While this module
+ mimics the content model and table attributes of HTML 3.2
+ tables, the element types declared herein also includes all
+ HTML 4 common and most of the HTML 4 table attributes.
+-->
+
+<!-- declare qualified element type names:
+-->
+<!ENTITY % table.qname "table" >
+<!ENTITY % caption.qname "caption" >
+<!ENTITY % tr.qname "tr" >
+<!ENTITY % th.qname "th" >
+<!ENTITY % td.qname "td" >
+
+<!-- horizontal alignment attributes for cell contents
+-->
+<!ENTITY % CellHAlign.attrib
+ "align ( left
+ | center
+ | right ) #IMPLIED"
+>
+
+<!-- vertical alignment attributes for cell contents
+-->
+<!ENTITY % CellVAlign.attrib
+ "valign ( top
+ | middle
+ | bottom ) #IMPLIED"
+>
+
+<!-- scope is simpler than axes attribute for common tables
+-->
+<!ENTITY % scope.attrib
+ "scope ( row | col ) #IMPLIED"
+>
+
+<!-- table: Table Element .............................. -->
+
+<!ENTITY % table.element "INCLUDE" >
+<![%table.element;[
+<!ENTITY % table.content
+ "( %caption.qname;?, %tr.qname;+ )"
+>
+<!ELEMENT %table.qname; %table.content; >
+<!-- end of table.element -->]]>
+
+<!ENTITY % table.attlist "INCLUDE" >
+<![%table.attlist;[
+<!ATTLIST %table.qname;
+ %Common.attrib;
+ summary %Text.datatype; #IMPLIED
+ width %Length.datatype; #IMPLIED
+>
+<!-- end of table.attlist -->]]>
+
+<!-- caption: Table Caption ............................ -->
+
+<!ENTITY % caption.element "INCLUDE" >
+<![%caption.element;[
+<!ENTITY % caption.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ELEMENT %caption.qname; %caption.content; >
+<!-- end of caption.element -->]]>
+
+<!ENTITY % caption.attlist "INCLUDE" >
+<![%caption.attlist;[
+<!ATTLIST %caption.qname;
+ %Common.attrib;
+>
+<!-- end of caption.attlist -->]]>
+
+<!-- tr: Table Row ..................................... -->
+
+<!ENTITY % tr.element "INCLUDE" >
+<![%tr.element;[
+<!ENTITY % tr.content "( %th.qname; | %td.qname; )+" >
+<!ELEMENT %tr.qname; %tr.content; >
+<!-- end of tr.element -->]]>
+
+<!ENTITY % tr.attlist "INCLUDE" >
+<![%tr.attlist;[
+<!ATTLIST %tr.qname;
+ %Common.attrib;
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of tr.attlist -->]]>
+
+<!-- th: Table Header Cell ............................. -->
+
+<!-- th is for header cells, td for data,
+ but for cells acting as both use td
+-->
+
+<!ENTITY % th.element "INCLUDE" >
+<![%th.element;[
+<!ENTITY % th.content
+ "( #PCDATA | %FlowNoTable.mix; )*"
+>
+<!ELEMENT %th.qname; %th.content; >
+<!-- end of th.element -->]]>
+
+<!ENTITY % th.attlist "INCLUDE" >
+<![%th.attlist;[
+<!ATTLIST %th.qname;
+ %Common.attrib;
+ abbr %Text.datatype; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ %scope.attrib;
+ rowspan %Number.datatype; '1'
+ colspan %Number.datatype; '1'
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of th.attlist -->]]>
+
+<!-- td: Table Data Cell ............................... -->
+
+<!ENTITY % td.element "INCLUDE" >
+<![%td.element;[
+<!ENTITY % td.content
+ "( #PCDATA | %FlowNoTable.mix; )*"
+>
+<!ELEMENT %td.qname; %td.content; >
+<!-- end of td.element -->]]>
+
+<!ENTITY % td.attlist "INCLUDE" >
+<![%td.attlist;[
+<!ATTLIST %td.qname;
+ %Common.attrib;
+ abbr %Text.datatype; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ %scope.attrib;
+ rowspan %Number.datatype; '1'
+ colspan %Number.datatype; '1'
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of td.attlist -->]]>
+
+<!-- end of xhtml-basic-table-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-basic11-model-1.mod b/lv2specgen/DTD/xhtml-basic11-model-1.mod
new file mode 100644
index 0000000..d2a59e2
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-basic11-model-1.mod
@@ -0,0 +1,169 @@
+<!-- ....................................................................... -->
+<!-- XHTML Basic 1.1 Document Model Module .................................... -->
+<!-- file: xhtml-basic11-model-1.mod
+
+ This is XHTML Basic, a proper subset of XHTML.
+ Copyright 1998-2007 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-basic11-model-1.mod,v 1.6 2009/11/18 19:25:00 smccarro Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Basic 1.1 Document Model 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-basic11-model-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- XHTML Basic Document Model
+
+ This module describes the groupings of elements that make up
+ common content models for XHTML elements.
+-->
+
+<!-- Optional Elements in head .............. -->
+
+<!ENTITY % HeadOpts.mix
+ "( %script.qname; | %style.qname; | %meta.qname;
+ | %link.qname; | %object.qname; )*" >
+
+<!-- script and noscript are used to contain scripts
+ and alternative content
+-->
+<!ENTITY % Script.class "| %script.qname; | %noscript.qname;" >
+
+<!-- Miscellaneous Elements ................. -->
+
+<!ENTITY % Misc.extra "" >
+
+<!-- These elements are neither block nor inline, and can
+ essentially be used anywhere in the document body.
+-->
+<!ENTITY % Misc.class
+ "%Script.class;
+ %Misc.extra;"
+>
+
+<!-- Inline Elements ........................ -->
+
+<!ENTITY % InlStruct.class "%br.qname; | %span.qname;" >
+
+<!ENTITY % InlPhras.class
+ "| %em.qname; | %strong.qname; | %dfn.qname; | %code.qname;
+ | %samp.qname; | %kbd.qname; | %var.qname; | %cite.qname;
+ | %abbr.qname; | %acronym.qname; | %q.qname;" >
+
+<!ENTITY % InlPres.class
+ "| %tt.qname; | %i.qname; | %b.qname; | %big.qname;
+ | %small.qname; | %sub.qname; | %sup.qname;" >
+
+<!ENTITY % I18n.class "" >
+
+<!ENTITY % Anchor.class "| %a.qname;" >
+
+<!ENTITY % InlSpecial.class "| %img.qname; | %object.qname;" >
+
+<!ENTITY % InlForm.class
+ "| %input.qname; | %select.qname; | %textarea.qname;
+ | %label.qname; | %button.qname;" >
+
+<!ENTITY % Inline.extra "" >
+
+<!ENTITY % Inline.class
+ "%InlStruct.class;
+ %InlPhras.class;
+ %InlPres.class;
+ %Anchor.class;
+ %InlSpecial.class;
+ %InlForm.class;
+ %Inline.extra;"
+>
+
+<!ENTITY % InlNoAnchor.class
+ "%InlStruct.class;
+ %InlPhras.class;
+ %InlPres.class;
+ %InlSpecial.class;
+ %InlForm.class;
+ %Inline.extra;"
+>
+
+<!ENTITY % InlNoAnchor.mix
+ "%InlNoAnchor.class;
+ %Misc.class;"
+>
+
+<!ENTITY % Inline.mix
+ "%Inline.class;
+ %Misc.class;"
+>
+
+<!-- Block Elements ......................... -->
+
+<!ENTITY % Heading.class
+ "%h1.qname; | %h2.qname; | %h3.qname;
+ | %h4.qname; | %h5.qname; | %h6.qname;"
+>
+<!ENTITY % List.class "%ul.qname; | %ol.qname; | %dl.qname;" >
+
+<!ENTITY % Table.class "| %table.qname;" >
+
+<!ENTITY % Form.class "| %form.qname;" >
+
+<!ENTITY % Fieldset.class "| %fieldset.qname;" >
+
+<!ENTITY % BlkStruct.class "%p.qname; | %div.qname;" >
+
+<!ENTITY % BlkPhras.class
+ "| %pre.qname; | %blockquote.qname; | %address.qname;"
+>
+
+<!ENTITY % BlkPres.class "| %hr.qname;" >
+
+<!ENTITY % BlkSpecial.class
+ "%Table.class;
+ %Form.class;
+ %Fieldset.class;"
+>
+
+<!ENTITY % Block.extra "" >
+
+<!ENTITY % Block.class
+ "%BlkStruct.class;
+ %BlkPhras.class;
+ %BlkPres.class;
+ %BlkSpecial.class;
+ %Block.extra;"
+>
+
+<!ENTITY % Block.mix
+ "%Heading.class;
+ | %List.class;
+ | %Block.class;
+ %Misc.class;"
+>
+
+<!-- All Content Elements ................... -->
+
+<!-- declares all content except tables
+-->
+<!ENTITY % FlowNoTable.mix
+ "%Heading.class;
+ | %List.class;
+ | %BlkStruct.class;
+ %BlkPhras.class;
+ %Form.class;
+ %Block.extra;
+ | %Inline.class;
+ %Misc.class;"
+>
+
+<!ENTITY % Flow.mix
+ "%Heading.class;
+ | %List.class;
+ | %Block.class;
+ | %Inline.class;
+ %Misc.class;"
+>
+
+<!-- end of xhtml-basic11-model-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-basic11.dtd b/lv2specgen/DTD/xhtml-basic11.dtd
new file mode 100644
index 0000000..ea7b3d6
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-basic11.dtd
@@ -0,0 +1,221 @@
+<!-- XHTML Basic 1.1 DTD ...................................................... -->
+<!-- file: xhtml-basic10.dtd -->
+
+<!-- XHTML Basic 1.1 DTD
+
+ This is XHTML Basic, a proper subset of XHTML.
+
+ The Extensible HyperText Markup Language (XHTML)
+ Copyright 1998-2005 World Wide Web Consortium
+ (Massachusetts Institute of Technology, European Research Consortium
+ for Informatics and Mathematics, Keio University).
+ All Rights Reserved.
+
+ Permission to use, copy, modify and distribute the XHTML Basic 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.
+
+ Editors: Murray M. Altheim <mailto:altheim@eng.sun.com>
+ Peter Stark <mailto:Peter.Stark@ecs.ericsson.se>
+ Revision: $Id: xhtml-basic11.dtd,v 1.1 2007-03-16 04:00:58 ot Exp $ SMI
+
+-->
+<!-- This is the driver file for version 1.1 of the XHTML Basic DTD.
+
+ This DTD is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC: "-//W3C//DTD XHTML Basic 1.1//EN"
+ SYSTEM: "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"
+-->
+<!ENTITY % XHTML.version "-//W3C//DTD XHTML Basic 1.1//EN" >
+
+<!-- Use this URI to identify the default namespace:
+
+ "http://www.w3.org/1999/xhtml"
+
+ See the Qualified Names module for information
+ on the use of namespace prefixes in the DTD.
+-->
+<!ENTITY % NS.prefixed "IGNORE" >
+<!ENTITY % XHTML.prefix "" >
+
+<!-- Reserved for use with the XLink namespace:
+-->
+<!ENTITY % XLINK.xmlns "" >
+<!ENTITY % XLINK.xmlns.attrib "" >
+
+<!-- For example, if you are using XHTML Basic 1.1 directly, use
+ the public identifier in the DOCTYPE declaration, with the namespace
+ declaration on the document element to identify the default namespace:
+
+ <?xml version="1.0"?>
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"
+ "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd" >
+ <html xmlns="http://www.w3.org/1999/xhtml"
+ xml:lang="en" >
+ ...
+ </html>
+-->
+
+<!-- reserved for future use with document profiles -->
+<!ENTITY % XHTML.profile "" >
+
+<!-- Bidirectional Text features
+ This feature-test entity is used to declare elements
+ and attributes used for bidirectional text support.
+-->
+<!ENTITY % XHTML.bidi "IGNORE" >
+
+<?doc type="doctype" role="title" { XHTML Basic 1.1 } ?>
+
+<!-- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
+
+<!ENTITY % xhtml-events.module "INCLUDE" >
+<!ENTITY % xhtml-bdo.module "%XHTML.bidi;" >
+
+<!ENTITY % xhtml-model.mod
+ PUBLIC "-//W3C//ENTITIES XHTML Basic 1.1 Document Model 1.0//EN"
+ "xhtml-basic11-model-1.mod" >
+
+<!ENTITY % xhtml-framework.mod
+ PUBLIC "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN"
+ "xhtml-framework-1.mod" >
+%xhtml-framework.mod;
+
+<!ENTITY % pre.content
+ "( #PCDATA
+ | %InlStruct.class;
+ %InlPhras.class;
+ %Anchor.class;
+ %Inline.extra; )*"
+>
+
+<!ENTITY % xhtml-text.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Text 1.0//EN"
+ "xhtml-text-1.mod" >
+%xhtml-text.mod;
+
+<!ENTITY % xhtml-hypertext.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN"
+ "xhtml-hypertext-1.mod" >
+%xhtml-hypertext.mod;
+
+<!ENTITY % xhtml-list.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Lists 1.0//EN"
+ "xhtml-list-1.mod" >
+%xhtml-list.mod;
+
+<!-- Add in the value attribute to the li element -->
+<!ATTLIST %li.qname;
+ value %Number.datatype; #IMPLIED
+>
+
+<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
+
+<!-- Scripting Module ........................................... -->
+<!ENTITY % xhtml-script.module "INCLUDE" >
+<![%xhtml-script.module;[
+<!ENTITY % xhtml-script.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Scripting 1.0//EN"
+ "xhtml-script-1.mod" >
+%xhtml-script.mod;]]>
+
+<!-- Style Sheets Module ......................................... -->
+<!ENTITY % xhtml-style.module "INCLUDE" >
+<![%xhtml-style.module;[
+<!ENTITY % xhtml-style.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Style Sheets 1.0//EN"
+ "xhtml-style-1.mod" >
+%xhtml-style.mod;]]>
+
+<!-- Image Module ............................................... -->
+<!ENTITY % xhtml-image.module "INCLUDE" >
+<![%xhtml-image.module;[
+<!ENTITY % xhtml-image.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN"
+ "xhtml-image-1.mod" >
+%xhtml-image.mod;]]>
+
+<!-- Tables Module ............................................... -->
+<!ENTITY % xhtml-table.module "INCLUDE" >
+<![%xhtml-table.module;[
+<!ENTITY % xhtml-table.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Basic Tables 1.0//EN"
+ "xhtml-basic-table-1.mod" >
+%xhtml-table.mod;]]>
+
+<!-- Forms Module ............................................... -->
+<!ENTITY % xhtml-form.module "INCLUDE" >
+<![%xhtml-form.module;[
+<!ENTITY % xhtml-form.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Forms 1.0//EN"
+ "xhtml-form-1.mod" >
+%xhtml-form.mod;]]>
+
+<!-- Link Element Module ........................................ -->
+<!ENTITY % xhtml-link.module "INCLUDE" >
+<![%xhtml-link.module;[
+<!ENTITY % xhtml-link.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Link Element 1.0//EN"
+ "xhtml-link-1.mod" >
+%xhtml-link.mod;]]>
+
+<!-- Document Metainformation Module ............................ -->
+<!ENTITY % xhtml-meta.module "INCLUDE" >
+<![%xhtml-meta.module;[
+<!ENTITY % xhtml-meta.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN"
+ "xhtml-meta-1.mod" >
+%xhtml-meta.mod;]]>
+
+<!-- Base Element Module ........................................ -->
+<!ENTITY % xhtml-base.module "INCLUDE" >
+<![%xhtml-base.module;[
+<!ENTITY % xhtml-base.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Base Element 1.0//EN"
+ "xhtml-base-1.mod" >
+%xhtml-base.mod;]]>
+
+<!-- Param Element Module ....................................... -->
+<!ENTITY % xhtml-param.module "INCLUDE" >
+<![%xhtml-param.module;[
+<!ENTITY % xhtml-param.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Param Element 1.0//EN"
+ "xhtml-param-1.mod" >
+%xhtml-param.mod;]]>
+
+<!-- Embedded Object Module ..................................... -->
+<!ENTITY % xhtml-object.module "INCLUDE" >
+<![%xhtml-object.module;[
+<!ENTITY % xhtml-object.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Embedded Object 1.0//EN"
+ "xhtml-object-1.mod" >
+%xhtml-object.mod;]]>
+
+<!-- Inputmode Attribute Module .................................. -->
+<!ENTITY % xhtml-inputmode.module "INCLUDE" >
+<![%xhtml-inputmode.module;[
+<!ENTITY % xhtml-inputmode.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Inputmode 1.0//EN"
+ "xhtml-inputmode-1.mod" >
+%xhtml-inputmode.mod;]]>
+
+<!-- Target Attribute Module .................................... -->
+<!ENTITY % xhtml-target.module "INCLUDE" >
+<![%xhtml-target.module;[
+<!ENTITY % xhtml-target.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Target 1.0//EN"
+ "xhtml-target-1.mod" >
+%xhtml-target.mod;]]>
+
+
+<!ENTITY % xhtml-struct.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN"
+ "xhtml-struct-1.mod" >
+%xhtml-struct.mod;
+
+<!-- end of XHTML Basic 1.1 DTD ........................................... -->
diff --git a/lv2specgen/DTD/xhtml-bdo-1.mod b/lv2specgen/DTD/xhtml-bdo-1.mod
new file mode 100644
index 0000000..f5f093f
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-bdo-1.mod
@@ -0,0 +1,47 @@
+<!-- ...................................................................... -->
+<!-- XHTML BDO Element Module ............................................. -->
+<!-- file: xhtml-bdo-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-bdo-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML BDO Element 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-bdo-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Bidirectional Override (bdo) Element
+
+ This modules declares the element 'bdo', used to override the
+ Unicode bidirectional algorithm for selected fragments of text.
+
+ DEPENDENCIES:
+ Relies on the conditional section keyword %XHTML.bidi; declared
+ as "INCLUDE". Bidirectional text support includes both the bdo
+ element and the 'dir' attribute.
+-->
+
+<!ENTITY % bdo.element "INCLUDE" >
+<![%bdo.element;[
+<!ENTITY % bdo.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % bdo.qname "bdo" >
+<!ELEMENT %bdo.qname; %bdo.content; >
+<!-- end of bdo.element -->]]>
+
+<!ENTITY % bdo.attlist "INCLUDE" >
+<![%bdo.attlist;[
+<!ATTLIST %bdo.qname;
+ %Core.attrib;
+ xml:lang %LanguageCode.datatype; #IMPLIED
+ dir ( ltr | rtl ) #REQUIRED
+>
+]]>
+
+<!-- end of xhtml-bdo-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-blkphras-1.mod b/lv2specgen/DTD/xhtml-blkphras-1.mod
new file mode 100644
index 0000000..3ab40bd
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-blkphras-1.mod
@@ -0,0 +1,164 @@
+<!-- ...................................................................... -->
+<!-- XHTML Block Phrasal Module .......................................... -->
+<!-- file: xhtml-blkphras-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-blkphras-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Block Phrasal 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-blkphras-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Block Phrasal
+
+ address, blockquote, pre, h1, h2, h3, h4, h5, h6
+
+ This module declares the elements and their attributes used to
+ support block-level phrasal markup.
+-->
+
+<!ENTITY % address.element "INCLUDE" >
+<![%address.element;[
+<!ENTITY % address.content
+ "( #PCDATA | %Inline.mix; )*" >
+<!ENTITY % address.qname "address" >
+<!ELEMENT %address.qname; %address.content; >
+<!-- end of address.element -->]]>
+
+<!ENTITY % address.attlist "INCLUDE" >
+<![%address.attlist;[
+<!ATTLIST %address.qname;
+ %Common.attrib;
+>
+<!-- end of address.attlist -->]]>
+
+<!ENTITY % blockquote.element "INCLUDE" >
+<![%blockquote.element;[
+<!ENTITY % blockquote.content
+ "( %Block.mix; )*"
+>
+<!ENTITY % blockquote.qname "blockquote" >
+<!ELEMENT %blockquote.qname; %blockquote.content; >
+<!-- end of blockquote.element -->]]>
+
+<!ENTITY % blockquote.attlist "INCLUDE" >
+<![%blockquote.attlist;[
+<!ATTLIST %blockquote.qname;
+ %Common.attrib;
+ cite %URI.datatype; #IMPLIED
+>
+<!-- end of blockquote.attlist -->]]>
+
+<!ENTITY % pre.element "INCLUDE" >
+<![%pre.element;[
+<!ENTITY % pre.content
+ "( #PCDATA
+ | %InlStruct.class;
+ %InlPhras.class;
+ | %tt.qname; | %i.qname; | %b.qname;
+ %I18n.class;
+ %Anchor.class;
+ | %map.qname;
+ %Misc.class;
+ %Inline.extra; )*"
+>
+<!ENTITY % pre.qname "pre" >
+<!ELEMENT %pre.qname; %pre.content; >
+<!-- end of pre.element -->]]>
+
+<!ENTITY % pre.attlist "INCLUDE" >
+<![%pre.attlist;[
+<!ATTLIST %pre.qname;
+ %Common.attrib;
+>
+<!-- end of pre.attlist -->]]>
+
+<!-- ................... Heading Elements ................... -->
+
+<!ENTITY % Heading.content "( #PCDATA | %Inline.mix; )*" >
+
+<!ENTITY % h1.element "INCLUDE" >
+<![%h1.element;[
+<!ENTITY % h1.qname "h1" >
+<!ELEMENT %h1.qname; %Heading.content; >
+<!-- end of h1.element -->]]>
+
+<!ENTITY % h1.attlist "INCLUDE" >
+<![%h1.attlist;[
+<!ATTLIST %h1.qname;
+ %Common.attrib;
+>
+<!-- end of h1.attlist -->]]>
+
+<!ENTITY % h2.element "INCLUDE" >
+<![%h2.element;[
+<!ENTITY % h2.qname "h2" >
+<!ELEMENT %h2.qname; %Heading.content; >
+<!-- end of h2.element -->]]>
+
+<!ENTITY % h2.attlist "INCLUDE" >
+<![%h2.attlist;[
+<!ATTLIST %h2.qname;
+ %Common.attrib;
+>
+<!-- end of h2.attlist -->]]>
+
+<!ENTITY % h3.element "INCLUDE" >
+<![%h3.element;[
+<!ENTITY % h3.qname "h3" >
+<!ELEMENT %h3.qname; %Heading.content; >
+<!-- end of h3.element -->]]>
+
+<!ENTITY % h3.attlist "INCLUDE" >
+<![%h3.attlist;[
+<!ATTLIST %h3.qname;
+ %Common.attrib;
+>
+<!-- end of h3.attlist -->]]>
+
+<!ENTITY % h4.element "INCLUDE" >
+<![%h4.element;[
+<!ENTITY % h4.qname "h4" >
+<!ELEMENT %h4.qname; %Heading.content; >
+<!-- end of h4.element -->]]>
+
+<!ENTITY % h4.attlist "INCLUDE" >
+<![%h4.attlist;[
+<!ATTLIST %h4.qname;
+ %Common.attrib;
+>
+<!-- end of h4.attlist -->]]>
+
+<!ENTITY % h5.element "INCLUDE" >
+<![%h5.element;[
+<!ENTITY % h5.qname "h5" >
+<!ELEMENT %h5.qname; %Heading.content; >
+<!-- end of h5.element -->]]>
+
+<!ENTITY % h5.attlist "INCLUDE" >
+<![%h5.attlist;[
+<!ATTLIST %h5.qname;
+ %Common.attrib;
+>
+<!-- end of h5.attlist -->]]>
+
+<!ENTITY % h6.element "INCLUDE" >
+<![%h6.element;[
+<!ENTITY % h6.qname "h6" >
+<!ELEMENT %h6.qname; %Heading.content; >
+<!-- end of h6.element -->]]>
+
+<!ENTITY % h6.attlist "INCLUDE" >
+<![%h6.attlist;[
+<!ATTLIST %h6.qname;
+ %Common.attrib;
+>
+<!-- end of h6.attlist -->]]>
+
+<!-- end of xhtml-blkphras-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-blkpres-1.mod b/lv2specgen/DTD/xhtml-blkpres-1.mod
new file mode 100644
index 0000000..4263f76
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-blkpres-1.mod
@@ -0,0 +1,40 @@
+<!-- ...................................................................... -->
+<!-- XHTML Block Presentation Module ..................................... -->
+<!-- file: xhtml-blkpres-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-blkpres-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Block Presentation 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-blkpres-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Block Presentational Elements
+
+ hr
+
+ This module declares the elements and their attributes used to
+ support block-level presentational markup.
+-->
+
+<!ENTITY % hr.element "INCLUDE" >
+<![%hr.element;[
+<!ENTITY % hr.content "EMPTY" >
+<!ENTITY % hr.qname "hr" >
+<!ELEMENT %hr.qname; %hr.content; >
+<!-- end of hr.element -->]]>
+
+<!ENTITY % hr.attlist "INCLUDE" >
+<![%hr.attlist;[
+<!ATTLIST %hr.qname;
+ %Common.attrib;
+>
+<!-- end of hr.attlist -->]]>
+
+<!-- end of xhtml-blkpres-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-blkstruct-1.mod b/lv2specgen/DTD/xhtml-blkstruct-1.mod
new file mode 100644
index 0000000..4ecfc11
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-blkstruct-1.mod
@@ -0,0 +1,57 @@
+<!-- ...................................................................... -->
+<!-- XHTML Block Structural Module ....................................... -->
+<!-- file: xhtml-blkstruct-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-blkstruct-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Block Structural 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-blkstruct-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Block Structural
+
+ div, p
+
+ This module declares the elements and their attributes used to
+ support block-level structural markup.
+-->
+
+<!ENTITY % div.element "INCLUDE" >
+<![%div.element;[
+<!ENTITY % div.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ENTITY % div.qname "div" >
+<!ELEMENT %div.qname; %div.content; >
+<!-- end of div.element -->]]>
+
+<!ENTITY % div.attlist "INCLUDE" >
+<![%div.attlist;[
+<!ATTLIST %div.qname;
+ %Common.attrib;
+>
+<!-- end of div.attlist -->]]>
+
+<!ENTITY % p.element "INCLUDE" >
+<![%p.element;[
+<!ENTITY % p.content
+ "( #PCDATA | %Inline.mix; )*" >
+<!ENTITY % p.qname "p" >
+<!ELEMENT %p.qname; %p.content; >
+<!-- end of p.element -->]]>
+
+<!ENTITY % p.attlist "INCLUDE" >
+<![%p.attlist;[
+<!ATTLIST %p.qname;
+ %Common.attrib;
+>
+<!-- end of p.attlist -->]]>
+
+<!-- end of xhtml-blkstruct-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-charent-1.mod b/lv2specgen/DTD/xhtml-charent-1.mod
new file mode 100644
index 0000000..1ea7016
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-charent-1.mod
@@ -0,0 +1,38 @@
+<!-- ...................................................................... -->
+<!-- XHTML Character Entities Module ......................................... -->
+<!-- file: xhtml-charent-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2000 W3C (MIT, INRIA, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-charent-1.mod,v 1.1 2001/02/13 12:24:22 ht Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Character Entities 1.0//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml-modulatization/DTD/xhtml-charent-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Character Entities for XHTML
+
+ This module declares the set of character entities for XHTML,
+ including the Latin 1, Symbol and Special character collections.
+-->
+
+<!ENTITY % xhtml-lat1
+ PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "xhtml-lat1.ent" >
+<!ENTITY % xhtml-symbol
+ PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "xhtml-symbol.ent" >
+<!ENTITY % xhtml-special
+ PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
+ "xhtml-special.ent" >
+
+%xhtml-lat1;
+%xhtml-symbol;
+%xhtml-special;
+
+<!-- end of xhtml-charent-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-csismap-1.mod b/lv2specgen/DTD/xhtml-csismap-1.mod
new file mode 100644
index 0000000..686eee2
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-csismap-1.mod
@@ -0,0 +1,114 @@
+<!-- ...................................................................... -->
+<!-- XHTML Client-side Image Map Module .................................. -->
+<!-- file: xhtml-csismap-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-csismap-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Client-side Image Maps 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-csismap-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Client-side Image Maps
+
+ area, map
+
+ This module declares elements and attributes to support client-side
+ image maps. This requires that the Image Module (or a module
+ declaring the img element type) be included in the DTD.
+
+ These can be placed in the same document or grouped in a
+ separate document, although the latter isn't widely supported
+-->
+
+<!ENTITY % area.element "INCLUDE" >
+<![%area.element;[
+<!ENTITY % area.content "EMPTY" >
+<!ENTITY % area.qname "area" >
+<!ELEMENT %area.qname; %area.content; >
+<!-- end of area.element -->]]>
+
+<!ENTITY % Shape.datatype "( rect | circle | poly | default )">
+<!ENTITY % Coords.datatype "CDATA" >
+
+<!ENTITY % area.attlist "INCLUDE" >
+<![%area.attlist;[
+<!ATTLIST %area.qname;
+ %Common.attrib;
+ href %URI.datatype; #IMPLIED
+ shape %Shape.datatype; 'rect'
+ coords %Coords.datatype; #IMPLIED
+ nohref ( nohref ) #IMPLIED
+ alt %Text.datatype; #REQUIRED
+ tabindex %Number.datatype; #IMPLIED
+ accesskey %Character.datatype; #IMPLIED
+>
+<!-- end of area.attlist -->]]>
+
+<!-- modify anchor attribute definition list
+ to allow for client-side image maps
+-->
+<!ATTLIST %a.qname;
+ shape %Shape.datatype; 'rect'
+ coords %Coords.datatype; #IMPLIED
+>
+
+<!-- modify img attribute definition list
+ to allow for client-side image maps
+-->
+<!ATTLIST %img.qname;
+ usemap IDREF #IMPLIED
+>
+
+<!-- modify form input attribute definition list
+ to allow for client-side image maps
+-->
+<!ATTLIST %input.qname;
+ usemap IDREF #IMPLIED
+>
+
+<!-- modify object attribute definition list
+ to allow for client-side image maps
+-->
+<!ATTLIST %object.qname;
+ usemap IDREF #IMPLIED
+>
+
+<!-- 'usemap' points to the 'id' attribute of a <map> element,
+ which must be in the same document; support for external
+ document maps was not widely supported in HTML and is
+ eliminated in XHTML.
+
+ It is considered an error for the element pointed to by
+ a usemap IDREF to occur in anything but a <map> element.
+-->
+
+<!ENTITY % map.element "INCLUDE" >
+<![%map.element;[
+<!ENTITY % map.content
+ "(( %Block.mix; ) | %area.qname; )+"
+>
+<!ENTITY % map.qname "map" >
+<!ELEMENT %map.qname; %map.content; >
+<!-- end of map.element -->]]>
+
+<!ENTITY % map.attlist "INCLUDE" >
+<![%map.attlist;[
+<!ATTLIST %map.qname;
+ %XHTML.xmlns.attrib;
+ id ID #REQUIRED
+ %class.attrib;
+ %title.attrib;
+ %Core.extra.attrib;
+ %I18n.attrib;
+ %Events.attrib;
+>
+<!-- end of map.attlist -->]]>
+
+<!-- end of xhtml-csismap-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-datatypes-1.mod b/lv2specgen/DTD/xhtml-datatypes-1.mod
new file mode 100644
index 0000000..2da3445
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-datatypes-1.mod
@@ -0,0 +1,85 @@
+<!-- ...................................................................... -->
+<!-- XHTML Datatypes Module .............................................. -->
+<!-- file: xhtml-datatypes-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-datatypes-1.mod,v 4.1 2001/04/06 19:23:32 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-datatypes-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Datatypes
+
+ defines containers for the following datatypes, many of
+ these imported from other specifications and standards.
+-->
+
+<!-- Length defined for cellpadding/cellspacing -->
+
+<!-- nn for pixels or nn% for percentage length -->
+<!ENTITY % Length.datatype "CDATA" >
+
+<!-- space-separated list of link types -->
+<!ENTITY % LinkTypes.datatype "NMTOKENS" >
+
+<!-- single or comma-separated list of media descriptors -->
+<!ENTITY % MediaDesc.datatype "CDATA" >
+
+<!-- pixel, percentage, or relative -->
+<!ENTITY % MultiLength.datatype "CDATA" >
+
+<!-- one or more digits (NUMBER) -->
+<!ENTITY % Number.datatype "CDATA" >
+
+<!-- integer representing length in pixels -->
+<!ENTITY % Pixels.datatype "CDATA" >
+
+<!-- script expression -->
+<!ENTITY % Script.datatype "CDATA" >
+
+<!-- textual content -->
+<!ENTITY % Text.datatype "CDATA" >
+
+<!-- Imported Datatypes ................................ -->
+
+<!-- a single character from [ISO10646] -->
+<!ENTITY % Character.datatype "CDATA" >
+
+<!-- a character encoding, as per [RFC2045] -->
+<!ENTITY % Charset.datatype "CDATA" >
+
+<!-- a space separated list of character encodings, as per [RFC2045] -->
+<!ENTITY % Charsets.datatype "CDATA" >
+
+<!-- Color specification using color name or sRGB (#RRGGBB) values -->
+<!ENTITY % Color.datatype "CDATA" >
+
+<!-- media type, as per [RFC2045] -->
+<!ENTITY % ContentType.datatype "CDATA" >
+
+<!-- comma-separated list of media types, as per [RFC2045] -->
+<!ENTITY % ContentTypes.datatype "CDATA" >
+
+<!-- date and time information. ISO date format -->
+<!ENTITY % Datetime.datatype "CDATA" >
+
+<!-- formal public identifier, as per [ISO8879] -->
+<!ENTITY % FPI.datatype "CDATA" >
+
+<!-- a language code, as per [RFC3066] or its successor -->
+<!ENTITY % LanguageCode.datatype "CDATA" >
+
+<!-- a Uniform Resource Identifier, see [URI] -->
+<!ENTITY % URI.datatype "CDATA" >
+
+<!-- a space-separated list of Uniform Resource Identifiers, see [URI] -->
+<!ENTITY % URIs.datatype "CDATA" >
+
+<!-- end of xhtml-datatypes-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-edit-1.mod b/lv2specgen/DTD/xhtml-edit-1.mod
new file mode 100644
index 0000000..d3c6282
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-edit-1.mod
@@ -0,0 +1,66 @@
+<!-- ...................................................................... -->
+<!-- XHTML Editing Elements Module ....................................... -->
+<!-- file: xhtml-edit-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-edit-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Editing Markup 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-edit-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Editing Elements
+
+ ins, del
+
+ This module declares element types and attributes used to indicate
+ inserted and deleted content while editing a document.
+-->
+
+<!-- ins: Inserted Text ............................... -->
+
+<!ENTITY % ins.element "INCLUDE" >
+<![%ins.element;[
+<!ENTITY % ins.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ENTITY % ins.qname "ins" >
+<!ELEMENT %ins.qname; %ins.content; >
+<!-- end of ins.element -->]]>
+
+<!ENTITY % ins.attlist "INCLUDE" >
+<![%ins.attlist;[
+<!ATTLIST %ins.qname;
+ %Common.attrib;
+ cite %URI.datatype; #IMPLIED
+ datetime %Datetime.datatype; #IMPLIED
+>
+<!-- end of ins.attlist -->]]>
+
+<!-- del: Deleted Text ................................ -->
+
+<!ENTITY % del.element "INCLUDE" >
+<![%del.element;[
+<!ENTITY % del.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ENTITY % del.qname "del" >
+<!ELEMENT %del.qname; %del.content; >
+<!-- end of del.element -->]]>
+
+<!ENTITY % del.attlist "INCLUDE" >
+<![%del.attlist;[
+<!ATTLIST %del.qname;
+ %Common.attrib;
+ cite %URI.datatype; #IMPLIED
+ datetime %Datetime.datatype; #IMPLIED
+>
+<!-- end of del.attlist -->]]>
+
+<!-- end of xhtml-edit-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-events-1.mod b/lv2specgen/DTD/xhtml-events-1.mod
new file mode 100644
index 0000000..35589e0
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-events-1.mod
@@ -0,0 +1,135 @@
+<!-- ...................................................................... -->
+<!-- XHTML Intrinsic Events Module ....................................... -->
+<!-- file: xhtml-events-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-events-1.mod,v 1.4 2008/10/08 21:02:30 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Intrinsic Events 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-events-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Intrinsic Event Attributes
+
+ These are the event attributes defined in HTML 4,
+ Section 18.2.3 "Intrinsic Events". This module must be
+ instantiated prior to the Attributes Module but after
+ the Datatype Module in the Modular Framework module.
+
+ "Note: Authors of HTML documents are advised that changes
+ are likely to occur in the realm of intrinsic events
+ (e.g., how scripts are bound to events). Research in
+ this realm is carried on by members of the W3C Document
+ Object Model Working Group (see the W3C Web site at
+ http://www.w3.org/ for more information)."
+-->
+<!-- NOTE: Because the ATTLIST declarations in this module occur
+ before their respective ELEMENT declarations in other
+ modules, there may be a dependency on this module that
+ should be considered if any of the parameter entities used
+ for element type names (eg., %a.qname;) are redeclared.
+-->
+
+<!ENTITY % Events.attrib
+ "onclick %Script.datatype; #IMPLIED
+ ondblclick %Script.datatype; #IMPLIED
+ onmousedown %Script.datatype; #IMPLIED
+ onmouseup %Script.datatype; #IMPLIED
+ onmouseover %Script.datatype; #IMPLIED
+ onmousemove %Script.datatype; #IMPLIED
+ onmouseout %Script.datatype; #IMPLIED
+ onkeypress %Script.datatype; #IMPLIED
+ onkeydown %Script.datatype; #IMPLIED
+ onkeyup %Script.datatype; #IMPLIED"
+>
+
+<![%XHTML.global.attrs.prefixed;[
+<!ENTITY % XHTML.global.events.attrib
+ "%XHTML.prefix;:onclick %Script.datatype; #IMPLIED
+ %XHTML.prefix;:ondblclick %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onmousedown %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onmouseup %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onmouseover %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onmousemove %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onmouseout %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onkeypress %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onkeydown %Script.datatype; #IMPLIED
+ %XHTML.prefix;:onkeyup %Script.datatype; #IMPLIED"
+>
+]]>
+
+<!-- additional attributes on anchor element
+-->
+<!ATTLIST %a.qname;
+ onfocus %Script.datatype; #IMPLIED
+ onblur %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on form element
+-->
+<!ATTLIST %form.qname;
+ onsubmit %Script.datatype; #IMPLIED
+ onreset %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on label element
+-->
+<!ATTLIST %label.qname;
+ onfocus %Script.datatype; #IMPLIED
+ onblur %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on input element
+-->
+<!ATTLIST %input.qname;
+ onfocus %Script.datatype; #IMPLIED
+ onblur %Script.datatype; #IMPLIED
+ onselect %Script.datatype; #IMPLIED
+ onchange %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on select element
+-->
+<!ATTLIST %select.qname;
+ onfocus %Script.datatype; #IMPLIED
+ onblur %Script.datatype; #IMPLIED
+ onchange %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on textarea element
+-->
+<!ATTLIST %textarea.qname;
+ onfocus %Script.datatype; #IMPLIED
+ onblur %Script.datatype; #IMPLIED
+ onselect %Script.datatype; #IMPLIED
+ onchange %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on button element
+-->
+<!ATTLIST %button.qname;
+ onfocus %Script.datatype; #IMPLIED
+ onblur %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on body element
+-->
+<!ATTLIST %body.qname;
+ onload %Script.datatype; #IMPLIED
+ onunload %Script.datatype; #IMPLIED
+>
+
+<!-- additional attributes on area element
+-->
+<!ATTLIST %area.qname;
+ onfocus %Script.datatype; #IMPLIED
+ onblur %Script.datatype; #IMPLIED
+>
+
+<!-- end of xhtml-events-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-form-1.mod b/lv2specgen/DTD/xhtml-form-1.mod
new file mode 100644
index 0000000..de68a75
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-form-1.mod
@@ -0,0 +1,292 @@
+<!-- ...................................................................... -->
+<!-- XHTML Forms Module .................................................. -->
+<!-- file: xhtml-form-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-form-1.mod,v 4.1 2001/04/10 09:42:30 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Forms 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-form-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Forms
+
+ form, label, input, select, optgroup, option,
+ textarea, fieldset, legend, button
+
+ This module declares markup to provide support for online
+ forms, based on the features found in HTML 4 forms.
+-->
+
+<!-- declare qualified element type names:
+-->
+<!ENTITY % form.qname "form" >
+<!ENTITY % label.qname "label" >
+<!ENTITY % input.qname "input" >
+<!ENTITY % select.qname "select" >
+<!ENTITY % optgroup.qname "optgroup" >
+<!ENTITY % option.qname "option" >
+<!ENTITY % textarea.qname "textarea" >
+<!ENTITY % fieldset.qname "fieldset" >
+<!ENTITY % legend.qname "legend" >
+<!ENTITY % button.qname "button" >
+
+<!-- %BlkNoForm.mix; includes all non-form block elements,
+ plus %Misc.class;
+-->
+<!ENTITY % BlkNoForm.mix
+ "%Heading.class;
+ | %List.class;
+ | %BlkStruct.class;
+ %BlkPhras.class;
+ %BlkPres.class;
+ %Table.class;
+ %Block.extra;
+ %Misc.class;"
+>
+
+<!-- form: Form Element ................................ -->
+
+<!ENTITY % form.element "INCLUDE" >
+<![%form.element;[
+<!ENTITY % form.content
+ "( %BlkNoForm.mix;
+ | %fieldset.qname; )+"
+>
+<!ELEMENT %form.qname; %form.content; >
+<!-- end of form.element -->]]>
+
+<!ENTITY % form.attlist "INCLUDE" >
+<![%form.attlist;[
+<!ATTLIST %form.qname;
+ %Common.attrib;
+ action %URI.datatype; #REQUIRED
+ method ( get | post ) 'get'
+ name CDATA #IMPLIED
+ enctype %ContentType.datatype; 'application/x-www-form-urlencoded'
+ accept-charset %Charsets.datatype; #IMPLIED
+ accept %ContentTypes.datatype; #IMPLIED
+>
+<!-- end of form.attlist -->]]>
+
+<!-- label: Form Field Label Text ...................... -->
+
+<!-- Each label must not contain more than ONE field
+-->
+
+<!ENTITY % label.element "INCLUDE" >
+<![%label.element;[
+<!ENTITY % label.content
+ "( #PCDATA
+ | %input.qname; | %select.qname; | %textarea.qname; | %button.qname;
+ | %InlStruct.class;
+ %InlPhras.class;
+ %I18n.class;
+ %InlPres.class;
+ %Anchor.class;
+ %InlSpecial.class;
+ %Inline.extra;
+ %Misc.class; )*"
+>
+<!ELEMENT %label.qname; %label.content; >
+<!-- end of label.element -->]]>
+
+<!ENTITY % label.attlist "INCLUDE" >
+<![%label.attlist;[
+<!ATTLIST %label.qname;
+ %Common.attrib;
+ for IDREF #IMPLIED
+ accesskey %Character.datatype; #IMPLIED
+>
+<!-- end of label.attlist -->]]>
+
+<!-- input: Form Control ............................... -->
+
+<!ENTITY % input.element "INCLUDE" >
+<![%input.element;[
+<!ENTITY % input.content "EMPTY" >
+<!ELEMENT %input.qname; %input.content; >
+<!-- end of input.element -->]]>
+
+<!ENTITY % input.attlist "INCLUDE" >
+<![%input.attlist;[
+<!ENTITY % InputType.class
+ "( text | password | checkbox | radio | submit
+ | reset | file | hidden | image | button )"
+>
+<!-- attribute 'name' required for all but submit & reset
+-->
+<!ATTLIST %input.qname;
+ %Common.attrib;
+ type %InputType.class; 'text'
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked ( checked ) #IMPLIED
+ disabled ( disabled ) #IMPLIED
+ readonly ( readonly ) #IMPLIED
+ size %Number.datatype; #IMPLIED
+ maxlength %Number.datatype; #IMPLIED
+ src %URI.datatype; #IMPLIED
+ alt %Text.datatype; #IMPLIED
+ tabindex %Number.datatype; #IMPLIED
+ accesskey %Character.datatype; #IMPLIED
+ accept %ContentTypes.datatype; #IMPLIED
+>
+<!-- end of input.attlist -->]]>
+
+<!-- select: Option Selector ........................... -->
+
+<!ENTITY % select.element "INCLUDE" >
+<![%select.element;[
+<!ENTITY % select.content
+ "( %optgroup.qname; | %option.qname; )+"
+>
+<!ELEMENT %select.qname; %select.content; >
+<!-- end of select.element -->]]>
+
+<!ENTITY % select.attlist "INCLUDE" >
+<![%select.attlist;[
+<!ATTLIST %select.qname;
+ %Common.attrib;
+ name CDATA #IMPLIED
+ size %Number.datatype; #IMPLIED
+ multiple ( multiple ) #IMPLIED
+ disabled ( disabled ) #IMPLIED
+ tabindex %Number.datatype; #IMPLIED
+>
+<!-- end of select.attlist -->]]>
+
+<!-- optgroup: Option Group ............................ -->
+
+<!ENTITY % optgroup.element "INCLUDE" >
+<![%optgroup.element;[
+<!ENTITY % optgroup.content "( %option.qname; )+" >
+<!ELEMENT %optgroup.qname; %optgroup.content; >
+<!-- end of optgroup.element -->]]>
+
+<!ENTITY % optgroup.attlist "INCLUDE" >
+<![%optgroup.attlist;[
+<!ATTLIST %optgroup.qname;
+ %Common.attrib;
+ disabled ( disabled ) #IMPLIED
+ label %Text.datatype; #REQUIRED
+>
+<!-- end of optgroup.attlist -->]]>
+
+<!-- option: Selectable Choice ......................... -->
+
+<!ENTITY % option.element "INCLUDE" >
+<![%option.element;[
+<!ENTITY % option.content "( #PCDATA )" >
+<!ELEMENT %option.qname; %option.content; >
+<!-- end of option.element -->]]>
+
+<!ENTITY % option.attlist "INCLUDE" >
+<![%option.attlist;[
+<!ATTLIST %option.qname;
+ %Common.attrib;
+ selected ( selected ) #IMPLIED
+ disabled ( disabled ) #IMPLIED
+ label %Text.datatype; #IMPLIED
+ value CDATA #IMPLIED
+>
+<!-- end of option.attlist -->]]>
+
+<!-- textarea: Multi-Line Text Field ................... -->
+
+<!ENTITY % textarea.element "INCLUDE" >
+<![%textarea.element;[
+<!ENTITY % textarea.content "( #PCDATA )" >
+<!ELEMENT %textarea.qname; %textarea.content; >
+<!-- end of textarea.element -->]]>
+
+<!ENTITY % textarea.attlist "INCLUDE" >
+<![%textarea.attlist;[
+<!ATTLIST %textarea.qname;
+ %Common.attrib;
+ name CDATA #IMPLIED
+ rows %Number.datatype; #REQUIRED
+ cols %Number.datatype; #REQUIRED
+ disabled ( disabled ) #IMPLIED
+ readonly ( readonly ) #IMPLIED
+ tabindex %Number.datatype; #IMPLIED
+ accesskey %Character.datatype; #IMPLIED
+>
+<!-- end of textarea.attlist -->]]>
+
+<!-- fieldset: Form Control Group ...................... -->
+
+<!-- #PCDATA is to solve the mixed content problem,
+ per specification only whitespace is allowed
+-->
+
+<!ENTITY % fieldset.element "INCLUDE" >
+<![%fieldset.element;[
+<!ENTITY % fieldset.content
+ "( #PCDATA | %legend.qname; | %Flow.mix; )*"
+>
+<!ELEMENT %fieldset.qname; %fieldset.content; >
+<!-- end of fieldset.element -->]]>
+
+<!ENTITY % fieldset.attlist "INCLUDE" >
+<![%fieldset.attlist;[
+<!ATTLIST %fieldset.qname;
+ %Common.attrib;
+>
+<!-- end of fieldset.attlist -->]]>
+
+<!-- legend: Fieldset Legend ........................... -->
+
+<!ENTITY % legend.element "INCLUDE" >
+<![%legend.element;[
+<!ENTITY % legend.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ELEMENT %legend.qname; %legend.content; >
+<!-- end of legend.element -->]]>
+
+<!ENTITY % legend.attlist "INCLUDE" >
+<![%legend.attlist;[
+<!ATTLIST %legend.qname;
+ %Common.attrib;
+ accesskey %Character.datatype; #IMPLIED
+>
+<!-- end of legend.attlist -->]]>
+
+<!-- button: Push Button ............................... -->
+
+<!ENTITY % button.element "INCLUDE" >
+<![%button.element;[
+<!ENTITY % button.content
+ "( #PCDATA
+ | %BlkNoForm.mix;
+ | %InlStruct.class;
+ %InlPhras.class;
+ %InlPres.class;
+ %I18n.class;
+ %InlSpecial.class;
+ %Inline.extra; )*"
+>
+<!ELEMENT %button.qname; %button.content; >
+<!-- end of button.element -->]]>
+
+<!ENTITY % button.attlist "INCLUDE" >
+<![%button.attlist;[
+<!ATTLIST %button.qname;
+ %Common.attrib;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type ( button | submit | reset ) 'submit'
+ disabled ( disabled ) #IMPLIED
+ tabindex %Number.datatype; #IMPLIED
+ accesskey %Character.datatype; #IMPLIED
+>
+<!-- end of button.attlist -->]]>
+
+<!-- end of xhtml-form-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-framework-1.mod b/lv2specgen/DTD/xhtml-framework-1.mod
new file mode 100644
index 0000000..7d9d972
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-framework-1.mod
@@ -0,0 +1,97 @@
+<!-- ...................................................................... -->
+<!-- XHTML Modular Framework Module ...................................... -->
+<!-- file: xhtml-framework-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-framework-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-framework-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Modular Framework
+
+ This required module instantiates the modules needed
+ to support the XHTML modularization model, including:
+
+ + datatypes
+ + namespace-qualified names
+ + common attributes
+ + document model
+ + character entities
+
+ The Intrinsic Events module is ignored by default but
+ occurs in this module because it must be instantiated
+ prior to Attributes but after Datatypes.
+-->
+
+<!ENTITY % xhtml-arch.module "IGNORE" >
+<![%xhtml-arch.module;[
+<!ENTITY % xhtml-arch.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Base Architecture 1.0//EN"
+ "xhtml-arch-1.mod" >
+%xhtml-arch.mod;]]>
+
+<!ENTITY % xhtml-notations.module "IGNORE" >
+<![%xhtml-notations.module;[
+<!ENTITY % xhtml-notations.mod
+ PUBLIC "-//W3C//NOTATIONS XHTML Notations 1.0//EN"
+ "xhtml-notations-1.mod" >
+%xhtml-notations.mod;]]>
+
+<!ENTITY % xhtml-datatypes.module "INCLUDE" >
+<![%xhtml-datatypes.module;[
+<!ENTITY % xhtml-datatypes.mod
+ PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
+ "xhtml-datatypes-1.mod" >
+%xhtml-datatypes.mod;]]>
+
+<!-- placeholder for XLink support module -->
+<!ENTITY % xhtml-xlink.mod "" >
+%xhtml-xlink.mod;
+
+<!ENTITY % xhtml-qname.module "INCLUDE" >
+<![%xhtml-qname.module;[
+<!ENTITY % xhtml-qname.mod
+ PUBLIC "-//W3C//ENTITIES XHTML Qualified Names 1.0//EN"
+ "xhtml-qname-1.mod" >
+%xhtml-qname.mod;]]>
+
+<!ENTITY % xhtml-events.module "IGNORE" >
+<![%xhtml-events.module;[
+<!ENTITY % xhtml-events.mod
+ PUBLIC "-//W3C//ENTITIES XHTML Intrinsic Events 1.0//EN"
+ "xhtml-events-1.mod" >
+%xhtml-events.mod;]]>
+
+<!ENTITY % xhtml-attribs.module "INCLUDE" >
+<![%xhtml-attribs.module;[
+<!ENTITY % xhtml-attribs.mod
+ PUBLIC "-//W3C//ENTITIES XHTML Common Attributes 1.0//EN"
+ "xhtml-attribs-1.mod" >
+%xhtml-attribs.mod;]]>
+
+<!-- placeholder for content model redeclarations -->
+<!ENTITY % xhtml-model.redecl "" >
+%xhtml-model.redecl;
+
+<!ENTITY % xhtml-model.module "INCLUDE" >
+<![%xhtml-model.module;[
+<!-- instantiate the Document Model module declared in the DTD driver
+-->
+%xhtml-model.mod;]]>
+
+<!ENTITY % xhtml-charent.module "INCLUDE" >
+<![%xhtml-charent.module;[
+<!ENTITY % xhtml-charent.mod
+ PUBLIC "-//W3C//ENTITIES XHTML Character Entities 1.0//EN"
+ "xhtml-charent-1.mod" >
+%xhtml-charent.mod;]]>
+
+<!-- end of xhtml-framework-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-hypertext-1.mod b/lv2specgen/DTD/xhtml-hypertext-1.mod
new file mode 100644
index 0000000..7a7d8ca
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-hypertext-1.mod
@@ -0,0 +1,54 @@
+<!-- ...................................................................... -->
+<!-- XHTML Hypertext Module .............................................. -->
+<!-- file: xhtml-hypertext-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-hypertext-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-hypertext-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Hypertext
+
+ a
+
+ This module declares the anchor ('a') element type, which
+ defines the source of a hypertext link. The destination
+ (or link 'target') is identified via its 'id' attribute
+ rather than the 'name' attribute as was used in HTML.
+-->
+
+<!-- ............ Anchor Element ............ -->
+
+<!ENTITY % a.element "INCLUDE" >
+<![%a.element;[
+<!ENTITY % a.content
+ "( #PCDATA | %InlNoAnchor.mix; )*"
+>
+<!ENTITY % a.qname "a" >
+<!ELEMENT %a.qname; %a.content; >
+<!-- end of a.element -->]]>
+
+<!ENTITY % a.attlist "INCLUDE" >
+<![%a.attlist;[
+<!ATTLIST %a.qname;
+ %Common.attrib;
+ href %URI.datatype; #IMPLIED
+ charset %Charset.datatype; #IMPLIED
+ type %ContentType.datatype; #IMPLIED
+ hreflang %LanguageCode.datatype; #IMPLIED
+ rel %LinkTypes.datatype; #IMPLIED
+ rev %LinkTypes.datatype; #IMPLIED
+ accesskey %Character.datatype; #IMPLIED
+ tabindex %Number.datatype; #IMPLIED
+>
+<!-- end of a.attlist -->]]>
+
+<!-- end of xhtml-hypertext-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-image-1.mod b/lv2specgen/DTD/xhtml-image-1.mod
new file mode 100644
index 0000000..8561761
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-image-1.mod
@@ -0,0 +1,51 @@
+<!-- ...................................................................... -->
+<!-- XHTML Images Module ................................................. -->
+<!-- file: xhtml-image-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Rovision: $Id: xhtml-image-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-image-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Images
+
+ img
+
+ This module provides markup to support basic image embedding.
+-->
+
+<!-- To avoid problems with text-only UAs as well as to make
+ image content understandable and navigable to users of
+ non-visual UAs, you need to provide a description with
+ the 'alt' attribute, and avoid server-side image maps.
+-->
+
+<!ENTITY % img.element "INCLUDE" >
+<![%img.element;[
+<!ENTITY % img.content "EMPTY" >
+<!ENTITY % img.qname "img" >
+<!ELEMENT %img.qname; %img.content; >
+<!-- end of img.element -->]]>
+
+<!ENTITY % img.attlist "INCLUDE" >
+<![%img.attlist;[
+<!ATTLIST %img.qname;
+ %Common.attrib;
+ src %URI.datatype; #REQUIRED
+ alt %Text.datatype; #REQUIRED
+ longdesc %URI.datatype; #IMPLIED
+ name CDATA #IMPLIED
+ height %Length.datatype; #IMPLIED
+ width %Length.datatype; #IMPLIED
+>
+<!-- end of img.attlist -->]]>
+
+<!-- end of xhtml-image-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-inlphras-1.mod b/lv2specgen/DTD/xhtml-inlphras-1.mod
new file mode 100644
index 0000000..0d26daa
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-inlphras-1.mod
@@ -0,0 +1,203 @@
+<!-- ...................................................................... -->
+<!-- XHTML Inline Phrasal Module ......................................... -->
+<!-- file: xhtml-inlphras-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-inlphras-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Inline Phrasal 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlphras-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Inline Phrasal
+
+ abbr, acronym, cite, code, dfn, em, kbd, q, samp, strong, var
+
+ This module declares the elements and their attributes used to
+ support inline-level phrasal markup.
+-->
+
+<!ENTITY % abbr.element "INCLUDE" >
+<![%abbr.element;[
+<!ENTITY % abbr.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % abbr.qname "abbr" >
+<!ELEMENT %abbr.qname; %abbr.content; >
+<!-- end of abbr.element -->]]>
+
+<!ENTITY % abbr.attlist "INCLUDE" >
+<![%abbr.attlist;[
+<!ATTLIST %abbr.qname;
+ %Common.attrib;
+>
+<!-- end of abbr.attlist -->]]>
+
+<!ENTITY % acronym.element "INCLUDE" >
+<![%acronym.element;[
+<!ENTITY % acronym.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % acronym.qname "acronym" >
+<!ELEMENT %acronym.qname; %acronym.content; >
+<!-- end of acronym.element -->]]>
+
+<!ENTITY % acronym.attlist "INCLUDE" >
+<![%acronym.attlist;[
+<!ATTLIST %acronym.qname;
+ %Common.attrib;
+>
+<!-- end of acronym.attlist -->]]>
+
+<!ENTITY % cite.element "INCLUDE" >
+<![%cite.element;[
+<!ENTITY % cite.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % cite.qname "cite" >
+<!ELEMENT %cite.qname; %cite.content; >
+<!-- end of cite.element -->]]>
+
+<!ENTITY % cite.attlist "INCLUDE" >
+<![%cite.attlist;[
+<!ATTLIST %cite.qname;
+ %Common.attrib;
+>
+<!-- end of cite.attlist -->]]>
+
+<!ENTITY % code.element "INCLUDE" >
+<![%code.element;[
+<!ENTITY % code.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % code.qname "code" >
+<!ELEMENT %code.qname; %code.content; >
+<!-- end of code.element -->]]>
+
+<!ENTITY % code.attlist "INCLUDE" >
+<![%code.attlist;[
+<!ATTLIST %code.qname;
+ %Common.attrib;
+>
+<!-- end of code.attlist -->]]>
+
+<!ENTITY % dfn.element "INCLUDE" >
+<![%dfn.element;[
+<!ENTITY % dfn.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % dfn.qname "dfn" >
+<!ELEMENT %dfn.qname; %dfn.content; >
+<!-- end of dfn.element -->]]>
+
+<!ENTITY % dfn.attlist "INCLUDE" >
+<![%dfn.attlist;[
+<!ATTLIST %dfn.qname;
+ %Common.attrib;
+>
+<!-- end of dfn.attlist -->]]>
+
+<!ENTITY % em.element "INCLUDE" >
+<![%em.element;[
+<!ENTITY % em.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % em.qname "em" >
+<!ELEMENT %em.qname; %em.content; >
+<!-- end of em.element -->]]>
+
+<!ENTITY % em.attlist "INCLUDE" >
+<![%em.attlist;[
+<!ATTLIST %em.qname;
+ %Common.attrib;
+>
+<!-- end of em.attlist -->]]>
+
+<!ENTITY % kbd.element "INCLUDE" >
+<![%kbd.element;[
+<!ENTITY % kbd.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % kbd.qname "kbd" >
+<!ELEMENT %kbd.qname; %kbd.content; >
+<!-- end of kbd.element -->]]>
+
+<!ENTITY % kbd.attlist "INCLUDE" >
+<![%kbd.attlist;[
+<!ATTLIST %kbd.qname;
+ %Common.attrib;
+>
+<!-- end of kbd.attlist -->]]>
+
+<!ENTITY % q.element "INCLUDE" >
+<![%q.element;[
+<!ENTITY % q.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % q.qname "q" >
+<!ELEMENT %q.qname; %q.content; >
+<!-- end of q.element -->]]>
+
+<!ENTITY % q.attlist "INCLUDE" >
+<![%q.attlist;[
+<!ATTLIST %q.qname;
+ %Common.attrib;
+ cite %URI.datatype; #IMPLIED
+>
+<!-- end of q.attlist -->]]>
+
+<!ENTITY % samp.element "INCLUDE" >
+<![%samp.element;[
+<!ENTITY % samp.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % samp.qname "samp" >
+<!ELEMENT %samp.qname; %samp.content; >
+<!-- end of samp.element -->]]>
+
+<!ENTITY % samp.attlist "INCLUDE" >
+<![%samp.attlist;[
+<!ATTLIST %samp.qname;
+ %Common.attrib;
+>
+<!-- end of samp.attlist -->]]>
+
+<!ENTITY % strong.element "INCLUDE" >
+<![%strong.element;[
+<!ENTITY % strong.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % strong.qname "strong" >
+<!ELEMENT %strong.qname; %strong.content; >
+<!-- end of strong.element -->]]>
+
+<!ENTITY % strong.attlist "INCLUDE" >
+<![%strong.attlist;[
+<!ATTLIST %strong.qname;
+ %Common.attrib;
+>
+<!-- end of strong.attlist -->]]>
+
+<!ENTITY % var.element "INCLUDE" >
+<![%var.element;[
+<!ENTITY % var.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % var.qname "var" >
+<!ELEMENT %var.qname; %var.content; >
+<!-- end of var.element -->]]>
+
+<!ENTITY % var.attlist "INCLUDE" >
+<![%var.attlist;[
+<!ATTLIST %var.qname;
+ %Common.attrib;
+>
+<!-- end of var.attlist -->]]>
+
+<!-- end of xhtml-inlphras-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-inlpres-1.mod b/lv2specgen/DTD/xhtml-inlpres-1.mod
new file mode 100644
index 0000000..e8c9e39
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-inlpres-1.mod
@@ -0,0 +1,138 @@
+<!-- ...................................................................... -->
+<!-- XHTML Inline Presentation Module .................................... -->
+<!-- file: xhtml-inlpres-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-inlpres-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Inline Presentation 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlpres-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Inline Presentational Elements
+
+ b, big, i, small, sub, sup, tt
+
+ This module declares the elements and their attributes used to
+ support inline-level presentational markup.
+-->
+
+<!ENTITY % b.element "INCLUDE" >
+<![%b.element;[
+<!ENTITY % b.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % b.qname "b" >
+<!ELEMENT %b.qname; %b.content; >
+<!-- end of b.element -->]]>
+
+<!ENTITY % b.attlist "INCLUDE" >
+<![%b.attlist;[
+<!ATTLIST %b.qname;
+ %Common.attrib;
+>
+<!-- end of b.attlist -->]]>
+
+<!ENTITY % big.element "INCLUDE" >
+<![%big.element;[
+<!ENTITY % big.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % big.qname "big" >
+<!ELEMENT %big.qname; %big.content; >
+<!-- end of big.element -->]]>
+
+<!ENTITY % big.attlist "INCLUDE" >
+<![%big.attlist;[
+<!ATTLIST %big.qname;
+ %Common.attrib;
+>
+<!-- end of big.attlist -->]]>
+
+<!ENTITY % i.element "INCLUDE" >
+<![%i.element;[
+<!ENTITY % i.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % i.qname "i" >
+<!ELEMENT %i.qname; %i.content; >
+<!-- end of i.element -->]]>
+
+<!ENTITY % i.attlist "INCLUDE" >
+<![%i.attlist;[
+<!ATTLIST %i.qname;
+ %Common.attrib;
+>
+<!-- end of i.attlist -->]]>
+
+<!ENTITY % small.element "INCLUDE" >
+<![%small.element;[
+<!ENTITY % small.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % small.qname "small" >
+<!ELEMENT %small.qname; %small.content; >
+<!-- end of small.element -->]]>
+
+<!ENTITY % small.attlist "INCLUDE" >
+<![%small.attlist;[
+<!ATTLIST %small.qname;
+ %Common.attrib;
+>
+<!-- end of small.attlist -->]]>
+
+<!ENTITY % sub.element "INCLUDE" >
+<![%sub.element;[
+<!ENTITY % sub.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % sub.qname "sub" >
+<!ELEMENT %sub.qname; %sub.content; >
+<!-- end of sub.element -->]]>
+
+<!ENTITY % sub.attlist "INCLUDE" >
+<![%sub.attlist;[
+<!ATTLIST %sub.qname;
+ %Common.attrib;
+>
+<!-- end of sub.attlist -->]]>
+
+<!ENTITY % sup.element "INCLUDE" >
+<![%sup.element;[
+<!ENTITY % sup.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % sup.qname "sup" >
+<!ELEMENT %sup.qname; %sup.content; >
+<!-- end of sup.element -->]]>
+
+<!ENTITY % sup.attlist "INCLUDE" >
+<![%sup.attlist;[
+<!ATTLIST %sup.qname;
+ %Common.attrib;
+>
+<!-- end of sup.attlist -->]]>
+
+<!ENTITY % tt.element "INCLUDE" >
+<![%tt.element;[
+<!ENTITY % tt.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % tt.qname "tt" >
+<!ELEMENT %tt.qname; %tt.content; >
+<!-- end of tt.element -->]]>
+
+<!ENTITY % tt.attlist "INCLUDE" >
+<![%tt.attlist;[
+<!ATTLIST %tt.qname;
+ %Common.attrib;
+>
+<!-- end of tt.attlist -->]]>
+
+<!-- end of xhtml-inlpres-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-inlstruct-1.mod b/lv2specgen/DTD/xhtml-inlstruct-1.mod
new file mode 100644
index 0000000..2b86422
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-inlstruct-1.mod
@@ -0,0 +1,62 @@
+<!-- ...................................................................... -->
+<!-- XHTML Inline Structural Module ...................................... -->
+<!-- file: xhtml-inlstruct-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-inlstruct-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Inline Structural 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlstruct-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Inline Structural
+
+ br, span
+
+ This module declares the elements and their attributes
+ used to support inline-level structural markup.
+-->
+
+<!-- br: forced line break ............................. -->
+
+<!ENTITY % br.element "INCLUDE" >
+<![%br.element;[
+
+<!ENTITY % br.content "EMPTY" >
+<!ENTITY % br.qname "br" >
+<!ELEMENT %br.qname; %br.content; >
+
+<!-- end of br.element -->]]>
+
+<!ENTITY % br.attlist "INCLUDE" >
+<![%br.attlist;[
+<!ATTLIST %br.qname;
+ %Core.attrib;
+>
+<!-- end of br.attlist -->]]>
+
+<!-- span: generic inline container .................... -->
+
+<!ENTITY % span.element "INCLUDE" >
+<![%span.element;[
+<!ENTITY % span.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % span.qname "span" >
+<!ELEMENT %span.qname; %span.content; >
+<!-- end of span.element -->]]>
+
+<!ENTITY % span.attlist "INCLUDE" >
+<![%span.attlist;[
+<!ATTLIST %span.qname;
+ %Common.attrib;
+>
+<!-- end of span.attlist -->]]>
+
+<!-- end of xhtml-inlstruct-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-inlstyle-1.mod b/lv2specgen/DTD/xhtml-inlstyle-1.mod
new file mode 100644
index 0000000..85a2ca4
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-inlstyle-1.mod
@@ -0,0 +1,34 @@
+<!-- ...................................................................... -->
+<!-- XHTML Inline Style Module ........................................... -->
+<!-- file: xhtml-inlstyle-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-inlstyle-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Inline Style 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Inline Style
+
+ This module declares the 'style' attribute, used to support inline
+ style markup. This module must be instantiated prior to the XHTML
+ Common Attributes module in order to be included in %Core.attrib;.
+-->
+
+<!ENTITY % style.attrib
+ "style CDATA #IMPLIED"
+>
+
+
+<!ENTITY % Core.extra.attrib
+ "%style.attrib;"
+>
+
+<!-- end of xhtml-inlstyle-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-inputmode-1.mod b/lv2specgen/DTD/xhtml-inputmode-1.mod
new file mode 100644
index 0000000..36f1d36
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-inputmode-1.mod
@@ -0,0 +1,39 @@
+<!-- ...................................................................... -->
+<!-- XHTML Inputmode Module .............................................. -->
+<!-- file: xhtml-inputmode-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2007 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-inputmode-1.mod,v 1.2 2007/07/13 14:37:53 jigsaw Exp $
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Inputmode 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-inputmode-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Inputmode
+
+ inputmode
+
+ This module declares the 'inputmode' attribute used for suggesting the
+ input mode associated with an input or textarea element.
+-->
+
+<!-- render in this frame -->
+<!ENTITY % Inputmode.datatype "CDATA" >
+
+<!-- add 'inputmode' attribute to 'input' element -->
+<!ATTLIST %input.qname;
+ inputmode %Inputmode.datatype; #IMPLIED
+>
+
+<!-- add 'inputmode' attribute to 'textarea' element -->
+<!ATTLIST %textarea.qname;
+ inputmode %Inputmode.datatype; #IMPLIED
+>
+
+<!-- end of xhtml-inputmode-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-lat1.ent b/lv2specgen/DTD/xhtml-lat1.ent
new file mode 100644
index 0000000..6f1dd65
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-lat1.ent
@@ -0,0 +1,235 @@
+<!-- ...................................................................... -->
+<!-- XML-compatible ISO Latin 1 Character Entity Set for XHTML ............ -->
+<!-- file: xhtml-lat1.ent
+
+ Typical invocation:
+
+ <!ENTITY % xhtml-lat1
+ PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent" >
+ %xhtml-lat1;
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"
+
+ Revision: $Id: xhtml-lat1.ent,v 1.1 2001/02/13 12:24:22 ht Exp $ SMI
+
+ Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with conforming
+ SGML systems and applications as defined in ISO 8879, provided
+ this notice is included in all copies.
+-->
+
+<!ENTITY nbsp "&#160;" ><!-- no-break space = non-breaking space,
+ U+00A0 ISOnum -->
+<!ENTITY iexcl "&#161;" ><!-- inverted exclamation mark,
+ U+00A1 ISOnum -->
+<!ENTITY cent "&#162;" ><!-- cent sign,
+ U+00A2 ISOnum -->
+<!ENTITY pound "&#163;" ><!-- pound sign,
+ U+00A3 ISOnum -->
+<!ENTITY curren "&#164;" ><!-- currency sign,
+ U+00A4 ISOnum -->
+<!ENTITY yen "&#165;" ><!-- yen sign = yuan sign,
+ U+00A5 ISOnum -->
+<!ENTITY brvbar "&#166;" ><!-- broken bar = broken vertical bar,
+ U+00A6 ISOnum -->
+<!ENTITY sect "&#167;" ><!-- section sign,
+ U+00A7 ISOnum -->
+<!ENTITY uml "&#168;" ><!-- diaeresis = spacing diaeresis,
+ U+00A8 ISOdia -->
+<!ENTITY copy "&#169;" ><!-- copyright sign,
+ U+00A9 ISOnum -->
+<!ENTITY ordf "&#170;" ><!-- feminine ordinal indicator,
+ U+00AA ISOnum -->
+<!ENTITY laquo "&#171;" ><!-- left-pointing double angle quotation mark
+ = left pointing guillemet,
+ U+00AB ISOnum -->
+<!ENTITY not "&#172;" ><!-- not sign,
+ U+00AC ISOnum -->
+<!ENTITY shy "&#173;" ><!-- soft hyphen = discretionary hyphen,
+ U+00AD ISOnum -->
+<!ENTITY reg "&#174;" ><!-- registered sign = registered trade mark sign,
+ U+00AE ISOnum -->
+<!ENTITY macr "&#175;" ><!-- macron = spacing macron = overline
+ = APL overbar,
+ U+00AF ISOdia -->
+<!ENTITY deg "&#176;" ><!-- degree sign,
+ U+00B0 ISOnum -->
+<!ENTITY plusmn "&#177;" ><!-- plus-minus sign = plus-or-minus sign,
+ U+00B1 ISOnum -->
+<!ENTITY sup2 "&#178;" ><!-- superscript two = superscript digit two
+ = squared,
+ U+00B2 ISOnum -->
+<!ENTITY sup3 "&#179;" ><!-- superscript three = superscript digit three
+ = cubed,
+ U+00B3 ISOnum -->
+<!ENTITY acute "&#180;" ><!-- acute accent = spacing acute,
+ U+00B4 ISOdia -->
+<!ENTITY micro "&#181;" ><!-- micro sign,
+ U+00B5 ISOnum -->
+<!ENTITY para "&#182;" ><!-- pilcrow sign = paragraph sign,
+ U+00B6 ISOnum -->
+<!ENTITY middot "&#183;" ><!-- middle dot = Georgian comma
+ = Greek middle dot,
+ U+00B7 ISOnum -->
+<!ENTITY cedil "&#184;" ><!-- cedilla = spacing cedilla,
+ U+00B8 ISOdia -->
+<!ENTITY sup1 "&#185;" ><!-- superscript one = superscript digit one,
+ U+00B9 ISOnum -->
+<!ENTITY ordm "&#186;" ><!-- masculine ordinal indicator,
+ U+00BA ISOnum -->
+<!ENTITY raquo "&#187;" ><!-- right-pointing double angle quotation mark
+ = right pointing guillemet,
+ U+00BB ISOnum -->
+<!ENTITY frac14 "&#188;" ><!-- vulgar fraction one quarter
+ = fraction one quarter,
+ U+00BC ISOnum -->
+<!ENTITY frac12 "&#189;" ><!-- vulgar fraction one half
+ = fraction one half,
+ U+00BD ISOnum -->
+<!ENTITY frac34 "&#190;" ><!-- vulgar fraction three quarters
+ = fraction three quarters,
+ U+00BE ISOnum -->
+<!ENTITY iquest "&#191;" ><!-- inverted question mark
+ = turned question mark,
+ U+00BF ISOnum -->
+<!ENTITY Agrave "&#192;" ><!-- latin capital letter A with grave
+ = latin capital letter A grave,
+ U+00C0 ISOlat1 -->
+<!ENTITY Aacute "&#193;" ><!-- latin capital letter A with acute,
+ U+00C1 ISOlat1 -->
+<!ENTITY Acirc "&#194;" ><!-- latin capital letter A with circumflex,
+ U+00C2 ISOlat1 -->
+<!ENTITY Atilde "&#195;" ><!-- latin capital letter A with tilde,
+ U+00C3 ISOlat1 -->
+<!ENTITY Auml "&#196;" ><!-- latin capital letter A with diaeresis,
+ U+00C4 ISOlat1 -->
+<!ENTITY Aring "&#197;" ><!-- latin capital letter A with ring above
+ = latin capital letter A ring,
+ U+00C5 ISOlat1 -->
+<!ENTITY AElig "&#198;" ><!-- latin capital letter AE
+ = latin capital ligature AE,
+ U+00C6 ISOlat1 -->
+<!ENTITY Ccedil "&#199;" ><!-- latin capital letter C with cedilla,
+ U+00C7 ISOlat1 -->
+<!ENTITY Egrave "&#200;" ><!-- latin capital letter E with grave,
+ U+00C8 ISOlat1 -->
+<!ENTITY Eacute "&#201;" ><!-- latin capital letter E with acute,
+ U+00C9 ISOlat1 -->
+<!ENTITY Ecirc "&#202;" ><!-- latin capital letter E with circumflex,
+ U+00CA ISOlat1 -->
+<!ENTITY Euml "&#203;" ><!-- latin capital letter E with diaeresis,
+ U+00CB ISOlat1 -->
+<!ENTITY Igrave "&#204;" ><!-- latin capital letter I with grave,
+ U+00CC ISOlat1 -->
+<!ENTITY Iacute "&#205;" ><!-- latin capital letter I with acute,
+ U+00CD ISOlat1 -->
+<!ENTITY Icirc "&#206;" ><!-- latin capital letter I with circumflex,
+ U+00CE ISOlat1 -->
+<!ENTITY Iuml "&#207;" ><!-- latin capital letter I with diaeresis,
+ U+00CF ISOlat1 -->
+<!ENTITY ETH "&#208;" ><!-- latin capital letter ETH,
+ U+00D0 ISOlat1 -->
+<!ENTITY Ntilde "&#209;" ><!-- latin capital letter N with tilde,
+ U+00D1 ISOlat1 -->
+<!ENTITY Ograve "&#210;" ><!-- latin capital letter O with grave,
+ U+00D2 ISOlat1 -->
+<!ENTITY Oacute "&#211;" ><!-- latin capital letter O with acute,
+ U+00D3 ISOlat1 -->
+<!ENTITY Ocirc "&#212;" ><!-- latin capital letter O with circumflex,
+ U+00D4 ISOlat1 -->
+<!ENTITY Otilde "&#213;" ><!-- latin capital letter O with tilde,
+ U+00D5 ISOlat1 -->
+<!ENTITY Ouml "&#214;" ><!-- latin capital letter O with diaeresis,
+ U+00D6 ISOlat1 -->
+<!ENTITY times "&#215;" ><!-- multiplication sign,
+ U+00D7 ISOnum -->
+<!ENTITY Oslash "&#216;" ><!-- latin capital letter O with stroke
+ = latin capital letter O slash,
+ U+00D8 ISOlat1 -->
+<!ENTITY Ugrave "&#217;" ><!-- latin capital letter U with grave,
+ U+00D9 ISOlat1 -->
+<!ENTITY Uacute "&#218;" ><!-- latin capital letter U with acute,
+ U+00DA ISOlat1 -->
+<!ENTITY Ucirc "&#219;" ><!-- latin capital letter U with circumflex,
+ U+00DB ISOlat1 -->
+<!ENTITY Uuml "&#220;" ><!-- latin capital letter U with diaeresis,
+ U+00DC ISOlat1 -->
+<!ENTITY Yacute "&#221;" ><!-- latin capital letter Y with acute,
+ U+00DD ISOlat1 -->
+<!ENTITY THORN "&#222;" ><!-- latin capital letter THORN,
+ U+00DE ISOlat1 -->
+<!ENTITY szlig "&#223;" ><!-- latin small letter sharp s = ess-zed,
+ U+00DF ISOlat1 -->
+<!ENTITY agrave "&#224;" ><!-- latin small letter a with grave
+ = latin small letter a grave,
+ U+00E0 ISOlat1 -->
+<!ENTITY aacute "&#225;" ><!-- latin small letter a with acute,
+ U+00E1 ISOlat1 -->
+<!ENTITY acirc "&#226;" ><!-- latin small letter a with circumflex,
+ U+00E2 ISOlat1 -->
+<!ENTITY atilde "&#227;" ><!-- latin small letter a with tilde,
+ U+00E3 ISOlat1 -->
+<!ENTITY auml "&#228;" ><!-- latin small letter a with diaeresis,
+ U+00E4 ISOlat1 -->
+<!ENTITY aring "&#229;" ><!-- latin small letter a with ring above
+ = latin small letter a ring,
+ U+00E5 ISOlat1 -->
+<!ENTITY aelig "&#230;" ><!-- latin small letter ae
+ = latin small ligature ae,
+ U+00E6 ISOlat1 -->
+<!ENTITY ccedil "&#231;" ><!-- latin small letter c with cedilla,
+ U+00E7 ISOlat1 -->
+<!ENTITY egrave "&#232;" ><!-- latin small letter e with grave,
+ U+00E8 ISOlat1 -->
+<!ENTITY eacute "&#233;" ><!-- latin small letter e with acute,
+ U+00E9 ISOlat1 -->
+<!ENTITY ecirc "&#234;" ><!-- latin small letter e with circumflex,
+ U+00EA ISOlat1 -->
+<!ENTITY euml "&#235;" ><!-- latin small letter e with diaeresis,
+ U+00EB ISOlat1 -->
+<!ENTITY igrave "&#236;" ><!-- latin small letter i with grave,
+ U+00EC ISOlat1 -->
+<!ENTITY iacute "&#237;" ><!-- latin small letter i with acute,
+ U+00ED ISOlat1 -->
+<!ENTITY icirc "&#238;" ><!-- latin small letter i with circumflex,
+ U+00EE ISOlat1 -->
+<!ENTITY iuml "&#239;" ><!-- latin small letter i with diaeresis,
+ U+00EF ISOlat1 -->
+<!ENTITY eth "&#240;" ><!-- latin small letter eth,
+ U+00F0 ISOlat1 -->
+<!ENTITY ntilde "&#241;" ><!-- latin small letter n with tilde,
+ U+00F1 ISOlat1 -->
+<!ENTITY ograve "&#242;" ><!-- latin small letter o with grave,
+ U+00F2 ISOlat1 -->
+<!ENTITY oacute "&#243;" ><!-- latin small letter o with acute,
+ U+00F3 ISOlat1 -->
+<!ENTITY ocirc "&#244;" ><!-- latin small letter o with circumflex,
+ U+00F4 ISOlat1 -->
+<!ENTITY otilde "&#245;" ><!-- latin small letter o with tilde,
+ U+00F5 ISOlat1 -->
+<!ENTITY ouml "&#246;" ><!-- latin small letter o with diaeresis,
+ U+00F6 ISOlat1 -->
+<!ENTITY divide "&#247;" ><!-- division sign,
+ U+00F7 ISOnum -->
+<!ENTITY oslash "&#248;" ><!-- latin small letter o with stroke,
+ = latin small letter o slash,
+ U+00F8 ISOlat1 -->
+<!ENTITY ugrave "&#249;" ><!-- latin small letter u with grave,
+ U+00F9 ISOlat1 -->
+<!ENTITY uacute "&#250;" ><!-- latin small letter u with acute,
+ U+00FA ISOlat1 -->
+<!ENTITY ucirc "&#251;" ><!-- latin small letter u with circumflex,
+ U+00FB ISOlat1 -->
+<!ENTITY uuml "&#252;" ><!-- latin small letter u with diaeresis,
+ U+00FC ISOlat1 -->
+<!ENTITY yacute "&#253;" ><!-- latin small letter y with acute,
+ U+00FD ISOlat1 -->
+<!ENTITY thorn "&#254;" ><!-- latin small letter thorn with,
+ U+00FE ISOlat1 -->
+<!ENTITY yuml "&#255;" ><!-- latin small letter y with diaeresis,
+ U+00FF ISOlat1 -->
+<!-- end of xhtml-lat1.ent -->
diff --git a/lv2specgen/DTD/xhtml-legacy-1.mod b/lv2specgen/DTD/xhtml-legacy-1.mod
new file mode 100644
index 0000000..ebf11f7
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-legacy-1.mod
@@ -0,0 +1,400 @@
+<!-- ...................................................................... -->
+<!-- XHTML Legacy Markup Module ........................................... -->
+<!-- file: xhtml-legacy-1.mod
+
+ This is an extension of XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-legacy-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Legacy Markup 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-legacy-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- HTML Legacy Markup
+
+ font, basefont, center, s, strike, u, dir, menu, isindex
+
+ (plus additional datatypes and attributes)
+
+ This optional module declares additional markup for simple
+ presentation-related markup based on features found in the
+ HTML 4 Transitional and Frameset DTDs. This relies on
+ inclusion of the Legacy Redeclarations module. This module
+ also declares the frames, inline frames and object modules.
+
+ This is to allow XHTML 1.1 documents to be transformed for
+ display on HTML browsers where CSS support is inconsistent
+ or unavailable.
+-->
+<!-- Constructing a Legacy DTD
+
+ To construct a DTD driver obtaining a close approximation
+ of the HTML 4 Transitional and Frameset DTDs, declare the
+ Legacy Redeclarations module as the pre-framework redeclaration
+ parameter entity (%xhtml-prefw-redecl.mod;) and INCLUDE its
+ conditional section:
+
+ ...
+ <!ENTITY % xhtml-prefw-redecl.module "INCLUDE" >
+ <![%xhtml-prefw-redecl.module;[
+ <!ENTITY % xhtml-prefw-redecl.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Legacy Redeclarations 1.0//EN"
+ "xhtml-legacy-redecl-1.mod" >
+ %xhtml-prefw-redecl.mod;]]>
+
+ Such a DTD should be named with a variant FPI and redeclare
+ the value of the %XHTML.version; parameter entity to that FPI:
+
+ "-//Your Name Here//DTD XHTML Legacy 1.1//EN"
+
+ IMPORTANT: see also the notes included in the Legacy Redeclarations
+ Module for information on how to construct a DTD using this module.
+-->
+
+
+<!-- Additional Element Types .................................... -->
+
+<!-- font: Local Font Modifier ........................ -->
+
+<!ENTITY % font.element "INCLUDE" >
+<![%font.element;[
+<!ENTITY % font.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % font.qname "font" >
+<!ELEMENT %font.qname; %font.content; >
+<!-- end of font.element -->]]>
+
+<!ENTITY % font.attlist "INCLUDE" >
+<![%font.attlist;[
+<!ATTLIST %font.qname;
+ %Core.attrib;
+ %I18n.attrib;
+ size CDATA #IMPLIED
+ color %Color.datatype; #IMPLIED
+ face CDATA #IMPLIED
+>
+<!-- end of font.attlist -->]]>
+
+<!-- basefont: Base Font Size ......................... -->
+
+<!ENTITY % basefont.element "INCLUDE" >
+<![%basefont.element;[
+<!ENTITY % basefont.content "EMPTY" >
+<!ENTITY % basefont.qname "basefont" >
+<!ELEMENT %basefont.qname; %basefont.content; >
+<!-- end of basefont.element -->]]>
+
+<!ENTITY % basefont.attlist "INCLUDE" >
+<![%basefont.attlist;[
+<!ATTLIST %basefont.qname;
+ %id.attrib;
+ size CDATA #REQUIRED
+ color %Color.datatype; #IMPLIED
+ face CDATA #IMPLIED
+>
+<!-- end of basefont.attlist -->]]>
+
+<!-- center: Center Alignment ......................... -->
+
+<!ENTITY % center.element "INCLUDE" >
+<![%center.element;[
+<!ENTITY % center.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ENTITY % center.qname "center" >
+<!ELEMENT %center.qname; %center.content; >
+<!-- end of center.element -->]]>
+
+<!ENTITY % center.attlist "INCLUDE" >
+<![%center.attlist;[
+<!ATTLIST %center.qname;
+ %Common.attrib;
+>
+<!-- end of center.attlist -->]]>
+
+<!-- s: Strike-Thru Text Style ........................ -->
+
+<!ENTITY % s.element "INCLUDE" >
+<![%s.element;[
+<!ENTITY % s.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % s.qname "s" >
+<!ELEMENT %s.qname; %s.content; >
+<!-- end of s.element -->]]>
+
+<!ENTITY % s.attlist "INCLUDE" >
+<![%s.attlist;[
+<!ATTLIST %s.qname;
+ %Common.attrib;
+>
+<!-- end of s.attlist -->]]>
+
+<!-- strike: Strike-Thru Text Style ....................-->
+
+<!ENTITY % strike.element "INCLUDE" >
+<![%strike.element;[
+<!ENTITY % strike.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % strike.qname "strike" >
+<!ELEMENT %strike.qname; %strike.content; >
+<!-- end of strike.element -->]]>
+
+<!ENTITY % strike.attlist "INCLUDE" >
+<![%strike.attlist;[
+<!ATTLIST %strike.qname;
+ %Common.attrib;
+>
+<!-- end of strike.attlist -->]]>
+
+<!-- u: Underline Text Style ...........................-->
+
+<!ENTITY % u.element "INCLUDE" >
+<![%u.element;[
+<!ENTITY % u.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ENTITY % u.qname "u" >
+<!ELEMENT %u.qname; %u.content; >
+<!-- end of u.element -->]]>
+
+<!ENTITY % u.attlist "INCLUDE" >
+<![%u.attlist;[
+<!ATTLIST %u.qname;
+ %Common.attrib;
+>
+<!-- end of u.attlist -->]]>
+
+<!-- dir: Directory List .............................. -->
+
+<!-- NOTE: the content model for <dir> in HTML 4 excluded %Block.mix;
+-->
+<!ENTITY % dir.element "INCLUDE" >
+<![%dir.element;[
+<!ENTITY % dir.content
+ "( %li.qname; )+"
+>
+<!ENTITY % dir.qname "dir" >
+<!ELEMENT %dir.qname; %dir.content; >
+<!-- end of dir.element -->]]>
+
+<!ENTITY % dir.attlist "INCLUDE" >
+<![%dir.attlist;[
+<!ATTLIST %dir.qname;
+ %Common.attrib;
+ compact ( compact ) #IMPLIED
+>
+<!-- end of dir.attlist -->]]>
+
+<!-- menu: Menu List .................................. -->
+
+<!-- NOTE: the content model for <menu> in HTML 4 excluded %Block.mix;
+-->
+<!ENTITY % menu.element "INCLUDE" >
+<![%menu.element;[
+<!ENTITY % menu.content
+ "( %li.qname; )+"
+>
+<!ENTITY % menu.qname "menu" >
+<!ELEMENT %menu.qname; %menu.content; >
+<!-- end of menu.element -->]]>
+
+<!ENTITY % menu.attlist "INCLUDE" >
+<![%menu.attlist;[
+<!ATTLIST %menu.qname;
+ %Common.attrib;
+ compact ( compact ) #IMPLIED
+>
+<!-- end of menu.attlist -->]]>
+
+<!-- isindex: Single-Line Prompt ...................... -->
+
+<!ENTITY % isindex.element "INCLUDE" >
+<![%isindex.element;[
+<!ENTITY % isindex.content "EMPTY" >
+<!ENTITY % isindex.qname "isindex" >
+<!ELEMENT %isindex.qname; %isindex.content; >
+<!-- end of isindex.element -->]]>
+
+<!ENTITY % isindex.attlist "INCLUDE" >
+<![%isindex.attlist;[
+<!ATTLIST %isindex.qname;
+ %Core.attrib;
+ %I18n.attrib;
+ prompt %Text.datatype; #IMPLIED
+>
+<!-- end of isindex.attlist -->]]>
+
+
+<!-- Additional Attributes ....................................... -->
+
+<!-- Alignment attribute for Transitional use in HTML browsers
+ (this functionality is generally well-supported in CSS,
+ except within some contexts)
+-->
+<!ENTITY % align.attrib
+ "align ( left | center | right | justify ) #IMPLIED"
+>
+
+<!ATTLIST %applet.qname;
+ align ( top | middle | bottom | left | right ) #IMPLIED
+ hspace %Pixels.datatype; #IMPLIED
+ vspace %Pixels.datatype; #IMPLIED
+>
+
+<!ATTLIST %body.qname;
+ background %URI.datatype; #IMPLIED
+ bgcolor %Color.datatype; #IMPLIED
+ text %Color.datatype; #IMPLIED
+ link %Color.datatype; #IMPLIED
+ vlink %Color.datatype; #IMPLIED
+ alink %Color.datatype; #IMPLIED
+>
+
+<!ATTLIST %br.qname;
+ clear ( left | all | right | none ) 'none'
+>
+
+<!ATTLIST %caption.qname;
+ align ( top | bottom | left | right ) #IMPLIED
+>
+
+<!ATTLIST %div.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %h1.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %h2.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %h3.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %h4.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %h5.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %h6.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %hr.qname;
+ align ( left | center | right ) #IMPLIED
+ noshade ( noshade ) #IMPLIED
+ size %Pixels.datatype; #IMPLIED
+ width %Length.datatype; #IMPLIED
+>
+
+<!ATTLIST %img.qname;
+ align ( top | middle | bottom | left | right ) #IMPLIED
+ border %Pixels.datatype; #IMPLIED
+ hspace %Pixels.datatype; #IMPLIED
+ vspace %Pixels.datatype; #IMPLIED
+>
+
+<!ATTLIST %input.qname;
+ align ( top | middle | bottom | left | right ) #IMPLIED
+>
+
+<!ATTLIST %legend.qname;
+ align ( top | bottom | left | right ) #IMPLIED
+>
+
+<!ATTLIST %li.qname;
+ type CDATA #IMPLIED
+ value %Number.datatype; #IMPLIED
+>
+
+<!ATTLIST %object.qname;
+ align ( top | middle | bottom | left | right ) #IMPLIED
+ border %Pixels.datatype; #IMPLIED
+ hspace %Pixels.datatype; #IMPLIED
+ vspace %Pixels.datatype; #IMPLIED
+>
+
+<!ATTLIST %dl.qname;
+ compact ( compact ) #IMPLIED
+>
+
+<!ATTLIST %ol.qname;
+ type CDATA #IMPLIED
+ compact ( compact ) #IMPLIED
+ start %Number.datatype; #IMPLIED
+>
+
+<!ATTLIST %p.qname;
+ %align.attrib;
+>
+
+<!ATTLIST %pre.qname;
+ width %Length.datatype; #IMPLIED
+>
+
+<!ATTLIST %script.qname;
+ language %ContentType.datatype; #IMPLIED
+>
+
+<!ATTLIST %table.qname;
+ align ( left | center | right ) #IMPLIED
+ bgcolor %Color.datatype; #IMPLIED
+>
+
+<!ATTLIST %tr.qname;
+ bgcolor %Color.datatype; #IMPLIED
+>
+
+<!ATTLIST %th.qname;
+ nowrap ( nowrap ) #IMPLIED
+ bgcolor %Color.datatype; #IMPLIED
+ width %Length.datatype; #IMPLIED
+ height %Length.datatype; #IMPLIED
+>
+
+<!ATTLIST %td.qname;
+ nowrap ( nowrap ) #IMPLIED
+ bgcolor %Color.datatype; #IMPLIED
+ width %Length.datatype; #IMPLIED
+ height %Length.datatype; #IMPLIED
+>
+
+<!ATTLIST %ul.qname;
+ type CDATA #IMPLIED
+ compact ( compact ) #IMPLIED
+>
+
+<!-- Frames Module ............................................... -->
+<!ENTITY % xhtml-frames.module "IGNORE" >
+<![%xhtml-frames.module;[
+<!ENTITY % xhtml-frames.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Frames 1.0//EN"
+ "xhtml-frames-1.mod" >
+%xhtml-frames.mod;]]>
+
+<!-- Inline Frames Module ........................................ -->
+<!ENTITY % xhtml-iframe.module "INCLUDE" >
+<![%xhtml-iframe.module;[
+<!ATTLIST %iframe.qname;
+ align ( top | middle | bottom | left | right ) #IMPLIED
+>
+<!ENTITY % xhtml-iframe.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Inline Frame Element 1.0//EN"
+ "xhtml-iframe-1.mod" >
+%xhtml-iframe.mod;]]>
+
+<!-- end of xhtml-legacy-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-link-1.mod b/lv2specgen/DTD/xhtml-link-1.mod
new file mode 100644
index 0000000..2b4f92c
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-link-1.mod
@@ -0,0 +1,59 @@
+<!-- ...................................................................... -->
+<!-- XHTML Link Element Module ........................................... -->
+<!-- file: xhtml-link-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-link-1.mod,v 4.1 2001/04/05 06:57:40 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Link Element 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-link-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Link element
+
+ link
+
+ This module declares the link element type and its attributes,
+ which could (in principle) be used to define document-level links
+ to external resources such as:
+
+ a) for document specific toolbars/menus, e.g. start, contents,
+ previous, next, index, end, help
+ b) to link to a separate style sheet (rel="stylesheet")
+ c) to make a link to a script (rel="script")
+ d) by style sheets to control how collections of html nodes are
+ rendered into printed documents
+ e) to make a link to a printable version of this document
+ e.g. a postscript or pdf version (rel="alternate" media="print")
+-->
+
+<!-- link: Media-Independent Link ...................... -->
+
+<!ENTITY % link.element "INCLUDE" >
+<![%link.element;[
+<!ENTITY % link.content "EMPTY" >
+<!ENTITY % link.qname "link" >
+<!ELEMENT %link.qname; %link.content; >
+<!-- end of link.element -->]]>
+
+<!ENTITY % link.attlist "INCLUDE" >
+<![%link.attlist;[
+<!ATTLIST %link.qname;
+ %Common.attrib;
+ charset %Charset.datatype; #IMPLIED
+ href %URI.datatype; #IMPLIED
+ hreflang %LanguageCode.datatype; #IMPLIED
+ type %ContentType.datatype; #IMPLIED
+ rel %LinkTypes.datatype; #IMPLIED
+ rev %LinkTypes.datatype; #IMPLIED
+ media %MediaDesc.datatype; #IMPLIED
+>
+<!-- end of link.attlist -->]]>
+
+<!-- end of xhtml-link-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-list-1.mod b/lv2specgen/DTD/xhtml-list-1.mod
new file mode 100644
index 0000000..6c85f20
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-list-1.mod
@@ -0,0 +1,129 @@
+<!-- ...................................................................... -->
+<!-- XHTML Lists Module .................................................. -->
+<!-- file: xhtml-list-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-list-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Lists 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-list-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Lists
+
+ dl, dt, dd, ol, ul, li
+
+ This module declares the list-oriented element types
+ and their attributes.
+-->
+
+<!ENTITY % dl.qname "dl" >
+<!ENTITY % dt.qname "dt" >
+<!ENTITY % dd.qname "dd" >
+<!ENTITY % ol.qname "ol" >
+<!ENTITY % ul.qname "ul" >
+<!ENTITY % li.qname "li" >
+
+<!-- dl: Definition List ............................... -->
+
+<!ENTITY % dl.element "INCLUDE" >
+<![%dl.element;[
+<!ENTITY % dl.content "( %dt.qname; | %dd.qname; )+" >
+<!ELEMENT %dl.qname; %dl.content; >
+<!-- end of dl.element -->]]>
+
+<!ENTITY % dl.attlist "INCLUDE" >
+<![%dl.attlist;[
+<!ATTLIST %dl.qname;
+ %Common.attrib;
+>
+<!-- end of dl.attlist -->]]>
+
+<!-- dt: Definition Term ............................... -->
+
+<!ENTITY % dt.element "INCLUDE" >
+<![%dt.element;[
+<!ENTITY % dt.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ELEMENT %dt.qname; %dt.content; >
+<!-- end of dt.element -->]]>
+
+<!ENTITY % dt.attlist "INCLUDE" >
+<![%dt.attlist;[
+<!ATTLIST %dt.qname;
+ %Common.attrib;
+>
+<!-- end of dt.attlist -->]]>
+
+<!-- dd: Definition Description ........................ -->
+
+<!ENTITY % dd.element "INCLUDE" >
+<![%dd.element;[
+<!ENTITY % dd.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ELEMENT %dd.qname; %dd.content; >
+<!-- end of dd.element -->]]>
+
+<!ENTITY % dd.attlist "INCLUDE" >
+<![%dd.attlist;[
+<!ATTLIST %dd.qname;
+ %Common.attrib;
+>
+<!-- end of dd.attlist -->]]>
+
+<!-- ol: Ordered List (numbered styles) ................ -->
+
+<!ENTITY % ol.element "INCLUDE" >
+<![%ol.element;[
+<!ENTITY % ol.content "( %li.qname; )+" >
+<!ELEMENT %ol.qname; %ol.content; >
+<!-- end of ol.element -->]]>
+
+<!ENTITY % ol.attlist "INCLUDE" >
+<![%ol.attlist;[
+<!ATTLIST %ol.qname;
+ %Common.attrib;
+>
+<!-- end of ol.attlist -->]]>
+
+<!-- ul: Unordered List (bullet styles) ................ -->
+
+<!ENTITY % ul.element "INCLUDE" >
+<![%ul.element;[
+<!ENTITY % ul.content "( %li.qname; )+" >
+<!ELEMENT %ul.qname; %ul.content; >
+<!-- end of ul.element -->]]>
+
+<!ENTITY % ul.attlist "INCLUDE" >
+<![%ul.attlist;[
+<!ATTLIST %ul.qname;
+ %Common.attrib;
+>
+<!-- end of ul.attlist -->]]>
+
+<!-- li: List Item ..................................... -->
+
+<!ENTITY % li.element "INCLUDE" >
+<![%li.element;[
+<!ENTITY % li.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ELEMENT %li.qname; %li.content; >
+<!-- end of li.element -->]]>
+
+<!ENTITY % li.attlist "INCLUDE" >
+<![%li.attlist;[
+<!ATTLIST %li.qname;
+ %Common.attrib;
+>
+<!-- end of li.attlist -->]]>
+
+<!-- end of xhtml-list-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-meta-1.mod b/lv2specgen/DTD/xhtml-meta-1.mod
new file mode 100644
index 0000000..24a0b22
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-meta-1.mod
@@ -0,0 +1,47 @@
+<!-- ...................................................................... -->
+<!-- XHTML Document Metainformation Module ............................... -->
+<!-- file: xhtml-meta-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-meta-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-meta-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Meta Information
+
+ meta
+
+ This module declares the meta element type and its attributes,
+ used to provide declarative document metainformation.
+-->
+
+<!-- meta: Generic Metainformation ..................... -->
+
+<!ENTITY % meta.element "INCLUDE" >
+<![%meta.element;[
+<!ENTITY % meta.content "EMPTY" >
+<!ENTITY % meta.qname "meta" >
+<!ELEMENT %meta.qname; %meta.content; >
+<!-- end of meta.element -->]]>
+
+<!ENTITY % meta.attlist "INCLUDE" >
+<![%meta.attlist;[
+<!ATTLIST %meta.qname;
+ %XHTML.xmlns.attrib;
+ %I18n.attrib;
+ http-equiv NMTOKEN #IMPLIED
+ name NMTOKEN #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+>
+<!-- end of meta.attlist -->]]>
+
+<!-- end of xhtml-meta-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-object-1.mod b/lv2specgen/DTD/xhtml-object-1.mod
new file mode 100644
index 0000000..0d14cc5
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-object-1.mod
@@ -0,0 +1,60 @@
+<!-- ...................................................................... -->
+<!-- XHTML Embedded Object Module ........................................ -->
+<!-- file: xhtml-object-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-object-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Embedded Object 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-object-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Embedded Objects
+
+ object
+
+ This module declares the object element type and its attributes, used
+ to embed external objects as part of XHTML pages. In the document,
+ place param elements prior to other content within the object element.
+
+ Note that use of this module requires instantiation of the Param
+ Element Module.
+-->
+
+<!-- object: Generic Embedded Object ................... -->
+
+<!ENTITY % object.element "INCLUDE" >
+<![%object.element;[
+<!ENTITY % object.content
+ "( #PCDATA | %Flow.mix; | %param.qname; )*"
+>
+<!ENTITY % object.qname "object" >
+<!ELEMENT %object.qname; %object.content; >
+<!-- end of object.element -->]]>
+
+<!ENTITY % object.attlist "INCLUDE" >
+<![%object.attlist;[
+<!ATTLIST %object.qname;
+ %Common.attrib;
+ declare ( declare ) #IMPLIED
+ classid %URI.datatype; #IMPLIED
+ codebase %URI.datatype; #IMPLIED
+ data %URI.datatype; #IMPLIED
+ type %ContentType.datatype; #IMPLIED
+ codetype %ContentType.datatype; #IMPLIED
+ archive %URIs.datatype; #IMPLIED
+ standby %Text.datatype; #IMPLIED
+ height %Length.datatype; #IMPLIED
+ width %Length.datatype; #IMPLIED
+ name CDATA #IMPLIED
+ tabindex %Number.datatype; #IMPLIED
+>
+<!-- end of object.attlist -->]]>
+
+<!-- end of xhtml-object-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-param-1.mod b/lv2specgen/DTD/xhtml-param-1.mod
new file mode 100644
index 0000000..c101bed
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-param-1.mod
@@ -0,0 +1,48 @@
+<!-- ...................................................................... -->
+<!-- XHTML Param Element Module ..................................... -->
+<!-- file: xhtml-param-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-param-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Param Element 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-param-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Parameters for Java Applets and Embedded Objects
+
+ param
+
+ This module provides declarations for the param element,
+ used to provide named property values for the applet
+ and object elements.
+-->
+
+<!-- param: Named Property Value ....................... -->
+
+<!ENTITY % param.element "INCLUDE" >
+<![%param.element;[
+<!ENTITY % param.content "EMPTY" >
+<!ENTITY % param.qname "param" >
+<!ELEMENT %param.qname; %param.content; >
+<!-- end of param.element -->]]>
+
+<!ENTITY % param.attlist "INCLUDE" >
+<![%param.attlist;[
+<!ATTLIST %param.qname;
+ %XHTML.xmlns.attrib;
+ %id.attrib;
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype ( data | ref | object ) 'data'
+ type %ContentType.datatype; #IMPLIED
+>
+<!-- end of param.attlist -->]]>
+
+<!-- end of xhtml-param-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-pres-1.mod b/lv2specgen/DTD/xhtml-pres-1.mod
new file mode 100644
index 0000000..df0a9eb
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-pres-1.mod
@@ -0,0 +1,38 @@
+<!-- ...................................................................... -->
+<!-- XHTML Presentation Module ............................................ -->
+<!-- file: xhtml-pres-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-pres-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Presentation 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-pres-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Presentational Elements
+
+ This module defines elements and their attributes for
+ simple presentation-related markup.
+-->
+
+<!ENTITY % xhtml-inlpres.module "INCLUDE" >
+<![%xhtml-inlpres.module;[
+<!ENTITY % xhtml-inlpres.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Inline Presentation 1.0//EN"
+ "xhtml-inlpres-1.mod" >
+%xhtml-inlpres.mod;]]>
+
+<!ENTITY % xhtml-blkpres.module "INCLUDE" >
+<![%xhtml-blkpres.module;[
+<!ENTITY % xhtml-blkpres.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Block Presentation 1.0//EN"
+ "xhtml-blkpres-1.mod" >
+%xhtml-blkpres.mod;]]>
+
+<!-- end of xhtml-pres-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-qname-1.mod b/lv2specgen/DTD/xhtml-qname-1.mod
new file mode 100644
index 0000000..9a4ba76
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-qname-1.mod
@@ -0,0 +1,318 @@
+<!-- ....................................................................... -->
+<!-- XHTML Qname Module ................................................... -->
+<!-- file: xhtml-qname-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-qname-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES XHTML Qualified Names 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-qname-1.mod"
+
+ Revisions:
+ #2000-10-22: added qname declarations for ruby elements
+ ....................................................................... -->
+
+<!-- XHTML Qname (Qualified Name) Module
+
+ This module is contained in two parts, labeled Section 'A' and 'B':
+
+ Section A declares parameter entities to support namespace-
+ qualified names, namespace declarations, and name prefixing
+ for XHTML and extensions.
+
+ Section B declares parameter entities used to provide
+ namespace-qualified names for all XHTML element types:
+
+ %applet.qname; the xmlns-qualified name for <applet>
+ %base.qname; the xmlns-qualified name for <base>
+ ...
+
+ XHTML extensions would create a module similar to this one.
+ Included in the XHTML distribution is a template module
+ ('template-qname-1.mod') suitable for this purpose.
+-->
+
+<!-- Section A: XHTML XML Namespace Framework :::::::::::::::::::: -->
+
+<!-- 1. Declare a %XHTML.prefixed; conditional section keyword, used
+ to activate namespace prefixing. The default value should
+ inherit '%NS.prefixed;' from the DTD driver, so that unless
+ overridden, the default behaviour follows the overall DTD
+ prefixing scheme.
+-->
+<!ENTITY % NS.prefixed "IGNORE" >
+<!ENTITY % XHTML.prefixed "%NS.prefixed;" >
+
+<!-- By default, we always permit XHTML attribute collections to have
+ namespace-qualified prefixes as well.
+-->
+<!ENTITY % XHTML.global.attrs.prefixed "INCLUDE" >
+<!-- By default, we allow the XML Schema attributes on the root
+ element.
+-->
+<!ENTITY % XHTML.xsi.attrs "INCLUDE" >
+
+<!-- 2. Declare a parameter entity (eg., %XHTML.xmlns;) containing
+ the URI reference used to identify the XHTML namespace:
+-->
+<!ENTITY % XHTML.xmlns "http://www.w3.org/1999/xhtml" >
+
+<!-- 3. Declare parameter entities (eg., %XHTML.prefix;) containing
+ the default namespace prefix string(s) to use when prefixing
+ is enabled. This may be overridden in the DTD driver or the
+ internal subset of an document instance. If no default prefix
+ is desired, this may be declared as an empty string.
+
+ NOTE: As specified in [XMLNAMES], the namespace prefix serves
+ as a proxy for the URI reference, and is not in itself significant.
+-->
+<!ENTITY % XHTML.prefix "xhtml" >
+
+<!-- 4. Declare parameter entities (eg., %XHTML.pfx;) containing the
+ colonized prefix(es) (eg., '%XHTML.prefix;:') used when
+ prefixing is active, an empty string when it is not.
+-->
+<![%XHTML.prefixed;[
+<!ENTITY % XHTML.pfx "%XHTML.prefix;:" >
+]]>
+<!ENTITY % XHTML.pfx "" >
+
+<!-- declare qualified name extensions here ............ -->
+<!ENTITY % xhtml-qname-extra.mod "" >
+%xhtml-qname-extra.mod;
+
+<!-- 5. The parameter entity %XHTML.xmlns.extra.attrib; may be
+ redeclared to contain any non-XHTML namespace declaration
+ attributes for namespaces embedded in XHTML. The default
+ is an empty string. XLink should be included here if used
+ in the DTD.
+-->
+<!ENTITY % XHTML.xmlns.extra.attrib "" >
+
+<!-- The remainder of Section A is only followed in XHTML, not extensions. -->
+
+<!-- Declare a parameter entity %NS.decl.attrib; containing
+ all XML Namespace declarations used in the DTD, plus the
+ xmlns declaration for XHTML, its form dependent on whether
+ prefixing is active.
+-->
+<!ENTITY % XHTML.xmlns.attrib.prefixed
+ "xmlns:%XHTML.prefix; %URI.datatype; #FIXED '%XHTML.xmlns;'"
+>
+<![%XHTML.prefixed;[
+<!ENTITY % NS.decl.attrib
+ "%XHTML.xmlns.attrib.prefixed;
+ %XHTML.xmlns.extra.attrib;"
+>
+]]>
+<!ENTITY % NS.decl.attrib
+ "%XHTML.xmlns.extra.attrib;"
+>
+
+<!-- Declare a parameter entity %XSI.prefix as a prefix to use for XML
+ Schema Instance attributes.
+-->
+<!ENTITY % XSI.prefix "xsi" >
+
+<!ENTITY % XSI.xmlns "http://www.w3.org/2001/XMLSchema-instance" >
+
+<!-- Declare a parameter entity %XSI.xmlns.attrib as support for the
+ schemaLocation attribute, since this is legal throughout the DTD.
+-->
+<!ENTITY % XSI.xmlns.attrib
+ "xmlns:%XSI.prefix; %URI.datatype; #FIXED '%XSI.xmlns;'" >
+
+<!-- This is a placeholder for future XLink support.
+-->
+<!ENTITY % XLINK.xmlns.attrib "" >
+
+<!-- This is the attribute for the XML Schema namespace - XHTML
+ Modularization is also expressed in XML Schema, and it needs to
+ be legal to declare the XML Schema namespace and the
+ schemaLocation attribute on the root element of XHTML family
+ documents.
+-->
+<![%XHTML.xsi.attrs;[
+<!ENTITY % XSI.prefix "xsi" >
+<!ENTITY % XSI.pfx "%XSI.prefix;:" >
+<!ENTITY % XSI.xmlns "http://www.w3.org/2001/XMLSchema-instance" >
+
+<!ENTITY % XSI.xmlns.attrib
+ "xmlns:%XSI.prefix; %URI.datatype; #FIXED '%XSI.xmlns;'"
+>
+]]>
+<!ENTITY % XSI.prefix "" >
+<!ENTITY % XSI.pfx "" >
+<!ENTITY % XSI.xmlns.attrib "" >
+
+
+<!-- Declare a parameter entity %NS.decl.attrib; containing all
+ XML namespace declaration attributes used by XHTML, including
+ a default xmlns attribute when prefixing is inactive.
+-->
+<![%XHTML.prefixed;[
+<!ENTITY % XHTML.xmlns.attrib
+ "%NS.decl.attrib;
+ %XSI.xmlns.attrib;
+ %XLINK.xmlns.attrib;"
+>
+]]>
+<!ENTITY % XHTML.xmlns.attrib
+ "xmlns %URI.datatype; #FIXED '%XHTML.xmlns;'
+ %NS.decl.attrib;
+ %XSI.xmlns.attrib;
+ %XLINK.xmlns.attrib;"
+>
+
+<!-- placeholder for qualified name redeclarations -->
+<!ENTITY % xhtml-qname.redecl "" >
+%xhtml-qname.redecl;
+
+<!-- Section B: XHTML Qualified Names ::::::::::::::::::::::::::::: -->
+
+<!-- 6. This section declares parameter entities used to provide
+ namespace-qualified names for all XHTML element types.
+-->
+
+<!-- module: xhtml-applet-1.mod -->
+<!ENTITY % applet.qname "%XHTML.pfx;applet" >
+
+<!-- module: xhtml-base-1.mod -->
+<!ENTITY % base.qname "%XHTML.pfx;base" >
+
+<!-- module: xhtml-bdo-1.mod -->
+<!ENTITY % bdo.qname "%XHTML.pfx;bdo" >
+
+<!-- module: xhtml-blkphras-1.mod -->
+<!ENTITY % address.qname "%XHTML.pfx;address" >
+<!ENTITY % blockquote.qname "%XHTML.pfx;blockquote" >
+<!ENTITY % pre.qname "%XHTML.pfx;pre" >
+<!ENTITY % h1.qname "%XHTML.pfx;h1" >
+<!ENTITY % h2.qname "%XHTML.pfx;h2" >
+<!ENTITY % h3.qname "%XHTML.pfx;h3" >
+<!ENTITY % h4.qname "%XHTML.pfx;h4" >
+<!ENTITY % h5.qname "%XHTML.pfx;h5" >
+<!ENTITY % h6.qname "%XHTML.pfx;h6" >
+
+<!-- module: xhtml-blkpres-1.mod -->
+<!ENTITY % hr.qname "%XHTML.pfx;hr" >
+
+<!-- module: xhtml-blkstruct-1.mod -->
+<!ENTITY % div.qname "%XHTML.pfx;div" >
+<!ENTITY % p.qname "%XHTML.pfx;p" >
+
+<!-- module: xhtml-edit-1.mod -->
+<!ENTITY % ins.qname "%XHTML.pfx;ins" >
+<!ENTITY % del.qname "%XHTML.pfx;del" >
+
+<!-- module: xhtml-form-1.mod -->
+<!ENTITY % form.qname "%XHTML.pfx;form" >
+<!ENTITY % label.qname "%XHTML.pfx;label" >
+<!ENTITY % input.qname "%XHTML.pfx;input" >
+<!ENTITY % select.qname "%XHTML.pfx;select" >
+<!ENTITY % optgroup.qname "%XHTML.pfx;optgroup" >
+<!ENTITY % option.qname "%XHTML.pfx;option" >
+<!ENTITY % textarea.qname "%XHTML.pfx;textarea" >
+<!ENTITY % fieldset.qname "%XHTML.pfx;fieldset" >
+<!ENTITY % legend.qname "%XHTML.pfx;legend" >
+<!ENTITY % button.qname "%XHTML.pfx;button" >
+
+<!-- module: xhtml-hypertext-1.mod -->
+<!ENTITY % a.qname "%XHTML.pfx;a" >
+
+<!-- module: xhtml-image-1.mod -->
+<!ENTITY % img.qname "%XHTML.pfx;img" >
+
+<!-- module: xhtml-inlphras-1.mod -->
+<!ENTITY % abbr.qname "%XHTML.pfx;abbr" >
+<!ENTITY % acronym.qname "%XHTML.pfx;acronym" >
+<!ENTITY % cite.qname "%XHTML.pfx;cite" >
+<!ENTITY % code.qname "%XHTML.pfx;code" >
+<!ENTITY % dfn.qname "%XHTML.pfx;dfn" >
+<!ENTITY % em.qname "%XHTML.pfx;em" >
+<!ENTITY % kbd.qname "%XHTML.pfx;kbd" >
+<!ENTITY % q.qname "%XHTML.pfx;q" >
+<!ENTITY % samp.qname "%XHTML.pfx;samp" >
+<!ENTITY % strong.qname "%XHTML.pfx;strong" >
+<!ENTITY % var.qname "%XHTML.pfx;var" >
+
+<!-- module: xhtml-inlpres-1.mod -->
+<!ENTITY % b.qname "%XHTML.pfx;b" >
+<!ENTITY % big.qname "%XHTML.pfx;big" >
+<!ENTITY % i.qname "%XHTML.pfx;i" >
+<!ENTITY % small.qname "%XHTML.pfx;small" >
+<!ENTITY % sub.qname "%XHTML.pfx;sub" >
+<!ENTITY % sup.qname "%XHTML.pfx;sup" >
+<!ENTITY % tt.qname "%XHTML.pfx;tt" >
+
+<!-- module: xhtml-inlstruct-1.mod -->
+<!ENTITY % br.qname "%XHTML.pfx;br" >
+<!ENTITY % span.qname "%XHTML.pfx;span" >
+
+<!-- module: xhtml-ismap-1.mod (also csismap, ssismap) -->
+<!ENTITY % map.qname "%XHTML.pfx;map" >
+<!ENTITY % area.qname "%XHTML.pfx;area" >
+
+<!-- module: xhtml-link-1.mod -->
+<!ENTITY % link.qname "%XHTML.pfx;link" >
+
+<!-- module: xhtml-list-1.mod -->
+<!ENTITY % dl.qname "%XHTML.pfx;dl" >
+<!ENTITY % dt.qname "%XHTML.pfx;dt" >
+<!ENTITY % dd.qname "%XHTML.pfx;dd" >
+<!ENTITY % ol.qname "%XHTML.pfx;ol" >
+<!ENTITY % ul.qname "%XHTML.pfx;ul" >
+<!ENTITY % li.qname "%XHTML.pfx;li" >
+
+<!-- module: xhtml-meta-1.mod -->
+<!ENTITY % meta.qname "%XHTML.pfx;meta" >
+
+<!-- module: xhtml-param-1.mod -->
+<!ENTITY % param.qname "%XHTML.pfx;param" >
+
+<!-- module: xhtml-object-1.mod -->
+<!ENTITY % object.qname "%XHTML.pfx;object" >
+
+<!-- module: xhtml-script-1.mod -->
+<!ENTITY % script.qname "%XHTML.pfx;script" >
+<!ENTITY % noscript.qname "%XHTML.pfx;noscript" >
+
+<!-- module: xhtml-struct-1.mod -->
+<!ENTITY % html.qname "%XHTML.pfx;html" >
+<!ENTITY % head.qname "%XHTML.pfx;head" >
+<!ENTITY % title.qname "%XHTML.pfx;title" >
+<!ENTITY % body.qname "%XHTML.pfx;body" >
+
+<!-- module: xhtml-style-1.mod -->
+<!ENTITY % style.qname "%XHTML.pfx;style" >
+
+<!-- module: xhtml-table-1.mod -->
+<!ENTITY % table.qname "%XHTML.pfx;table" >
+<!ENTITY % caption.qname "%XHTML.pfx;caption" >
+<!ENTITY % thead.qname "%XHTML.pfx;thead" >
+<!ENTITY % tfoot.qname "%XHTML.pfx;tfoot" >
+<!ENTITY % tbody.qname "%XHTML.pfx;tbody" >
+<!ENTITY % colgroup.qname "%XHTML.pfx;colgroup" >
+<!ENTITY % col.qname "%XHTML.pfx;col" >
+<!ENTITY % tr.qname "%XHTML.pfx;tr" >
+<!ENTITY % th.qname "%XHTML.pfx;th" >
+<!ENTITY % td.qname "%XHTML.pfx;td" >
+
+<!-- module: xhtml-ruby-1.mod -->
+
+<!ENTITY % ruby.qname "%XHTML.pfx;ruby" >
+<!ENTITY % rbc.qname "%XHTML.pfx;rbc" >
+<!ENTITY % rtc.qname "%XHTML.pfx;rtc" >
+<!ENTITY % rb.qname "%XHTML.pfx;rb" >
+<!ENTITY % rt.qname "%XHTML.pfx;rt" >
+<!ENTITY % rp.qname "%XHTML.pfx;rp" >
+
+<!-- Provisional XHTML 2.0 Qualified Names ...................... -->
+
+<!-- module: xhtml-image-2.mod -->
+<!ENTITY % alt.qname "%XHTML.pfx;alt" >
+
+<!-- end of xhtml-qname-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-script-1.mod b/lv2specgen/DTD/xhtml-script-1.mod
new file mode 100644
index 0000000..aa702f1
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-script-1.mod
@@ -0,0 +1,67 @@
+<!-- ...................................................................... -->
+<!-- XHTML Document Scripting Module ..................................... -->
+<!-- file: xhtml-script-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-script-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Scripting 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-script-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Scripting
+
+ script, noscript
+
+ This module declares element types and attributes used to provide
+ support for executable scripts as well as an alternate content
+ container where scripts are not supported.
+-->
+
+<!-- script: Scripting Statement ....................... -->
+
+<!ENTITY % script.element "INCLUDE" >
+<![%script.element;[
+<!ENTITY % script.content "( #PCDATA )" >
+<!ENTITY % script.qname "script" >
+<!ELEMENT %script.qname; %script.content; >
+<!-- end of script.element -->]]>
+
+<!ENTITY % script.attlist "INCLUDE" >
+<![%script.attlist;[
+<!ATTLIST %script.qname;
+ %XHTML.xmlns.attrib;
+ %id.attrib;
+ xml:space ( preserve ) #FIXED 'preserve'
+ charset %Charset.datatype; #IMPLIED
+ type %ContentType.datatype; #REQUIRED
+ src %URI.datatype; #IMPLIED
+ defer ( defer ) #IMPLIED
+>
+<!-- end of script.attlist -->]]>
+
+<!-- noscript: No-Script Alternate Content ............. -->
+
+<!ENTITY % noscript.element "INCLUDE" >
+<![%noscript.element;[
+<!ENTITY % noscript.content
+ "( %Block.mix; )+"
+>
+<!ENTITY % noscript.qname "noscript" >
+<!ELEMENT %noscript.qname; %noscript.content; >
+<!-- end of noscript.element -->]]>
+
+<!ENTITY % noscript.attlist "INCLUDE" >
+<![%noscript.attlist;[
+<!ATTLIST %noscript.qname;
+ %Common.attrib;
+>
+<!-- end of noscript.attlist -->]]>
+
+<!-- end of xhtml-script-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-special.ent b/lv2specgen/DTD/xhtml-special.ent
new file mode 100644
index 0000000..e76ce90
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-special.ent
@@ -0,0 +1,89 @@
+<!-- ...................................................................... -->
+<!-- XML-compatible ISO Special Character Entity Set for XHTML ............ -->
+<!-- file: xhtml-lat1.ent
+
+ Typical invocation:
+
+ <!ENTITY % xhtml-special
+ PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent" >
+ %xhtml-special;
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"
+
+ Revision: $Id: xhtml-special.ent,v 1.1 2001/02/13 12:24:22 ht Exp $ SMI
+
+ Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with conforming
+ SGML systems and applications as defined in ISO 8879, provided
+ this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+ New names (i.e., not in ISO 8879 list) do not clash with any
+ existing ISO 8879 entity names. ISO 10646 character numbers
+ are given for each character, in hex. CDATA values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode 2.0 names.
+-->
+
+<!-- C0 Controls and Basic Latin -->
+<!--<!ENTITY quot "&#34;" >--> <!-- quotation mark = APL quote, U+0022 ISOnum -->
+<!--<!ENTITY amp "&#38;" >--> <!-- ampersand, U+0026 ISOnum -->
+<!--<!ENTITY lt "&#60;" >--> <!-- less-than sign, U+003C ISOnum -->
+<!--<!ENTITY gt "&#62;" >--> <!-- greater-than sign, U+003E ISOnum -->
+
+<!-- Latin Extended-A -->
+<!ENTITY OElig "&#338;" ><!-- latin capital ligature OE, U+0152 ISOlat2 -->
+<!ENTITY oelig "&#339;" ><!-- latin small ligature oe, U+0153 ISOlat2 -->
+
+<!-- ligature is a misnomer, this is a separate character in some languages -->
+<!ENTITY Scaron "&#352;" ><!-- latin capital letter S with caron,
+ U+0160 ISOlat2 -->
+<!ENTITY scaron "&#353;" ><!-- latin small letter s with caron,
+ U+0161 ISOlat2 -->
+<!ENTITY Yuml "&#376;" ><!-- latin capital letter Y with diaeresis,
+ U+0178 ISOlat2 -->
+
+<!-- Spacing Modifier Letters -->
+<!ENTITY circ "&#710;" ><!-- modifier letter circumflex accent,
+ U+02C6 ISOpub -->
+<!ENTITY tilde "&#732;" ><!-- small tilde, U+02DC ISOdia -->
+
+<!-- General Punctuation -->
+<!ENTITY ensp "&#8194;" ><!-- en space, U+2002 ISOpub -->
+<!ENTITY emsp "&#8195;" ><!-- em space, U+2003 ISOpub -->
+<!ENTITY thinsp "&#8201;" ><!-- thin space, U+2009 ISOpub -->
+<!ENTITY zwnj "&#8204;" ><!-- zero width non-joiner,
+ U+200C NEW RFC 2070 -->
+<!ENTITY zwj "&#8205;" ><!-- zero width joiner, U+200D NEW RFC 2070 -->
+<!ENTITY lrm "&#8206;" ><!-- left-to-right mark, U+200E NEW RFC 2070 -->
+<!ENTITY rlm "&#8207;" ><!-- right-to-left mark, U+200F NEW RFC 2070 -->
+<!ENTITY ndash "&#8211;" ><!-- en dash, U+2013 ISOpub -->
+<!ENTITY mdash "&#8212;" ><!-- em dash, U+2014 ISOpub -->
+<!ENTITY lsquo "&#8216;" ><!-- left single quotation mark,
+ U+2018 ISOnum -->
+<!ENTITY rsquo "&#8217;" ><!-- right single quotation mark,
+ U+2019 ISOnum -->
+<!ENTITY sbquo "&#8218;" ><!-- single low-9 quotation mark, U+201A NEW -->
+<!ENTITY ldquo "&#8220;" ><!-- left double quotation mark,
+ U+201C ISOnum -->
+<!ENTITY rdquo "&#8221;" ><!-- right double quotation mark,
+ U+201D ISOnum -->
+<!ENTITY bdquo "&#8222;" ><!-- double low-9 quotation mark, U+201E NEW -->
+<!ENTITY dagger "&#8224;" ><!-- dagger, U+2020 ISOpub -->
+<!ENTITY Dagger "&#8225;" ><!-- double dagger, U+2021 ISOpub -->
+<!ENTITY permil "&#8240;" ><!-- per mille sign, U+2030 ISOtech -->
+
+<!-- lsaquo is proposed but not yet ISO standardized -->
+<!ENTITY lsaquo "&#8249;" ><!-- single left-pointing angle quotation mark,
+ U+2039 ISO proposed -->
+<!-- rsaquo is proposed but not yet ISO standardized -->
+<!ENTITY rsaquo "&#8250;" ><!-- single right-pointing angle quotation mark,
+ U+203A ISO proposed -->
+<!ENTITY euro "&#8364;" ><!-- euro sign, U+20AC NEW -->
+
+<!-- end of xhtml-special.ent -->
diff --git a/lv2specgen/DTD/xhtml-ssismap-1.mod b/lv2specgen/DTD/xhtml-ssismap-1.mod
new file mode 100644
index 0000000..ebc4468
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-ssismap-1.mod
@@ -0,0 +1,32 @@
+<!-- ...................................................................... -->
+<!-- XHTML Server-side Image Map Module .................................. -->
+<!-- file: xhtml-ssismap-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-ssismap-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Server-side Image Maps 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-ssismap-1.mod"
+
+ Revisions:
+#2000-10-22: added declaration for 'ismap' on <input>
+ ....................................................................... -->
+
+<!-- Server-side Image Maps
+
+ This adds the 'ismap' attribute to the img and input elements
+ to support server-side processing of a user selection.
+-->
+
+<!ATTLIST %img.qname;
+ ismap ( ismap ) #IMPLIED
+>
+
+<!ATTLIST %input.qname;
+ ismap ( ismap ) #IMPLIED
+>
+
+<!-- end of xhtml-ssismap-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-struct-1.mod b/lv2specgen/DTD/xhtml-struct-1.mod
new file mode 100644
index 0000000..4bb420e
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-struct-1.mod
@@ -0,0 +1,136 @@
+<!-- ...................................................................... -->
+<!-- XHTML Structure Module .............................................. -->
+<!-- file: xhtml-struct-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-struct-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-struct-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Document Structure
+
+ title, head, body, html
+
+ The Structure Module defines the major structural elements and
+ their attributes.
+
+ Note that the content model of the head element type is redeclared
+ when the Base Module is included in the DTD.
+
+ The parameter entity containing the XML namespace URI value used
+ for XHTML is '%XHTML.xmlns;', defined in the Qualified Names module.
+-->
+
+<!-- title: Document Title ............................. -->
+
+<!-- The title element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+-->
+
+<!ENTITY % title.element "INCLUDE" >
+<![%title.element;[
+<!ENTITY % title.content "( #PCDATA )" >
+<!ENTITY % title.qname "title" >
+<!ELEMENT %title.qname; %title.content; >
+<!-- end of title.element -->]]>
+
+<!ENTITY % title.attlist "INCLUDE" >
+<![%title.attlist;[
+<!ATTLIST %title.qname;
+ %XHTML.xmlns.attrib;
+ %I18n.attrib;
+>
+<!-- end of title.attlist -->]]>
+
+<!-- head: Document Head ............................... -->
+
+<!ENTITY % head.element "INCLUDE" >
+<![%head.element;[
+<!ENTITY % head.content
+ "( %HeadOpts.mix;, %title.qname;, %HeadOpts.mix; )"
+>
+<!ENTITY % head.qname "head" >
+<!ELEMENT %head.qname; %head.content; >
+<!-- end of head.element -->]]>
+
+<!ENTITY % head.attlist "INCLUDE" >
+<![%head.attlist;[
+<!-- reserved for future use with document profiles
+-->
+<!ENTITY % profile.attrib
+ "profile %URIs.datatype; #IMPLIED"
+>
+
+<!ATTLIST %head.qname;
+ %XHTML.xmlns.attrib;
+ %I18n.attrib;
+ %profile.attrib;
+ %id.attrib;
+>
+<!-- end of head.attlist -->]]>
+
+<!-- body: Document Body ............................... -->
+
+<!ENTITY % body.element "INCLUDE" >
+<![%body.element;[
+<!ENTITY % body.content
+ "( %Block.mix; )*"
+>
+<!ENTITY % body.qname "body" >
+<!ELEMENT %body.qname; %body.content; >
+<!-- end of body.element -->]]>
+
+<!ENTITY % body.attlist "INCLUDE" >
+<![%body.attlist;[
+<!ATTLIST %body.qname;
+ %Common.attrib;
+>
+<!-- end of body.attlist -->]]>
+
+<!-- html: XHTML Document Element ...................... -->
+
+<!ENTITY % html.element "INCLUDE" >
+<![%html.element;[
+<!ENTITY % html.content "( %head.qname;, %body.qname; )" >
+<!ENTITY % html.qname "html" >
+<!ELEMENT %html.qname; %html.content; >
+<!-- end of html.element -->]]>
+
+<![%XHTML.xsi.attrs;[
+<!-- define a parameter for the XSI schemaLocation attribute -->
+<!ENTITY % XSI.schemaLocation.attrib
+ "%XSI.pfx;schemaLocation %URIs.datatype; #IMPLIED"
+>
+]]>
+<!ENTITY % XSI.schemaLocation.attrib "">
+
+<!ENTITY % html.attlist "INCLUDE" >
+<![%html.attlist;[
+<!-- version attribute value defined in driver
+-->
+<!ENTITY % XHTML.version.attrib
+ "version %FPI.datatype; #FIXED '%XHTML.version;'"
+>
+
+<!-- see the Qualified Names module for information
+ on how to extend XHTML using XML namespaces
+-->
+<!ATTLIST %html.qname;
+ %XHTML.xmlns.attrib;
+ %XSI.schemaLocation.attrib;
+ %XHTML.version.attrib;
+ %I18n.attrib;
+ %id.attrib;
+>
+<!-- end of html.attlist -->]]>
+
+<!-- end of xhtml-struct-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-style-1.mod b/lv2specgen/DTD/xhtml-style-1.mod
new file mode 100644
index 0000000..3105b2a
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-style-1.mod
@@ -0,0 +1,48 @@
+<!-- ...................................................................... -->
+<!-- XHTML Document Style Sheet Module ................................... -->
+<!-- file: xhtml-style-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-style-1.mod,v 4.1 2001/04/05 06:57:40 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML Style Sheets 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-style-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Style Sheets
+
+ style
+
+ This module declares the style element type and its attributes,
+ used to embed style sheet information in the document head element.
+-->
+
+<!-- style: Style Sheet Information .................... -->
+
+<!ENTITY % style.element "INCLUDE" >
+<![%style.element;[
+<!ENTITY % style.content "( #PCDATA )" >
+<!ENTITY % style.qname "style" >
+<!ELEMENT %style.qname; %style.content; >
+<!-- end of style.element -->]]>
+
+<!ENTITY % style.attlist "INCLUDE" >
+<![%style.attlist;[
+<!ATTLIST %style.qname;
+ %XHTML.xmlns.attrib;
+ %id.attrib;
+ %title.attrib;
+ %I18n.attrib;
+ xml:space ( preserve ) #FIXED 'preserve'
+ type %ContentType.datatype; #REQUIRED
+ media %MediaDesc.datatype; #IMPLIED
+>
+<!-- end of style.attlist -->]]>
+
+<!-- end of xhtml-style-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-symbol.ent b/lv2specgen/DTD/xhtml-symbol.ent
new file mode 100644
index 0000000..f72df1f
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-symbol.ent
@@ -0,0 +1,235 @@
+<!-- ...................................................................... -->
+<!-- ISO Math, Greek and Symbolic Character Entity Set for XHTML .......... -->
+<!-- file: xhtml-lat1.ent
+
+ Typical invocation:
+
+ <!ENTITY % xhtml-symbol
+ PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent" >
+ %xhtml-symbol;
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"
+
+ Revision: $Id: xhtml-symbol.ent,v 1.1 2001/02/13 12:24:23 ht Exp $ SMI
+
+ Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with conforming
+ SGML systems and applications as defined in ISO 8879, provided
+ this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+ New names (i.e., not in ISO 8879 list) do not clash with any
+ existing ISO 8879 entity names. ISO 10646 character numbers
+ are given for each character, in hex. CDATA values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode 2.0 names.
+-->
+
+<!-- Latin Extended-B -->
+<!ENTITY fnof "&#402;" ><!-- latin small f with hook = function
+ = florin, U+0192 ISOtech -->
+
+<!-- Greek -->
+<!ENTITY Alpha "&#913;" ><!-- greek capital letter alpha, U+0391 -->
+<!ENTITY Beta "&#914;" ><!-- greek capital letter beta, U+0392 -->
+<!ENTITY Gamma "&#915;" ><!-- greek capital letter gamma, U+0393 ISOgrk3 -->
+<!ENTITY Delta "&#916;" ><!-- greek capital letter delta, U+0394 ISOgrk3 -->
+<!ENTITY Epsilon "&#917;" ><!-- greek capital letter epsilon, U+0395 -->
+<!ENTITY Zeta "&#918;" ><!-- greek capital letter zeta, U+0396 -->
+<!ENTITY Eta "&#919;" ><!-- greek capital letter eta, U+0397 -->
+<!ENTITY Theta "&#920;" ><!-- greek capital letter theta, U+0398 ISOgrk3 -->
+<!ENTITY Iota "&#921;" ><!-- greek capital letter iota, U+0399 -->
+<!ENTITY Kappa "&#922;" ><!-- greek capital letter kappa, U+039A -->
+<!ENTITY Lambda "&#923;" ><!-- greek capital letter lambda, U+039B ISOgrk3 -->
+<!ENTITY Mu "&#924;" ><!-- greek capital letter mu, U+039C -->
+<!ENTITY Nu "&#925;" ><!-- greek capital letter nu, U+039D -->
+<!ENTITY Xi "&#926;" ><!-- greek capital letter xi, U+039E ISOgrk3 -->
+<!ENTITY Omicron "&#927;" ><!-- greek capital letter omicron, U+039F -->
+<!ENTITY Pi "&#928;" ><!-- greek capital letter pi, U+03A0 ISOgrk3 -->
+<!ENTITY Rho "&#929;" ><!-- greek capital letter rho, U+03A1 -->
+<!-- there is no Sigmaf, and no U+03A2 character either -->
+<!ENTITY Sigma "&#931;" ><!-- greek capital letter sigma, U+03A3 ISOgrk3 -->
+<!ENTITY Tau "&#932;" ><!-- greek capital letter tau, U+03A4 -->
+<!ENTITY Upsilon "&#933;" ><!-- greek capital letter upsilon,
+ U+03A5 ISOgrk3 -->
+<!ENTITY Phi "&#934;" ><!-- greek capital letter phi, U+03A6 ISOgrk3 -->
+<!ENTITY Chi "&#935;" ><!-- greek capital letter chi, U+03A7 -->
+<!ENTITY Psi "&#936;" ><!-- greek capital letter psi, U+03A8 ISOgrk3 -->
+<!ENTITY Omega "&#937;" ><!-- greek capital letter omega, U+03A9 ISOgrk3 -->
+<!ENTITY alpha "&#945;" ><!-- greek small letter alpha, U+03B1 ISOgrk3 -->
+<!ENTITY beta "&#946;" ><!-- greek small letter beta, U+03B2 ISOgrk3 -->
+<!ENTITY gamma "&#947;" ><!-- greek small letter gamma, U+03B3 ISOgrk3 -->
+<!ENTITY delta "&#948;" ><!-- greek small letter delta, U+03B4 ISOgrk3 -->
+<!ENTITY epsilon "&#949;" ><!-- greek small letter epsilon, U+03B5 ISOgrk3 -->
+<!ENTITY zeta "&#950;" ><!-- greek small letter zeta, U+03B6 ISOgrk3 -->
+<!ENTITY eta "&#951;" ><!-- greek small letter eta, U+03B7 ISOgrk3 -->
+<!ENTITY theta "&#952;" ><!-- greek small letter theta, U+03B8 ISOgrk3 -->
+<!ENTITY iota "&#953;" ><!-- greek small letter iota, U+03B9 ISOgrk3 -->
+<!ENTITY kappa "&#954;" ><!-- greek small letter kappa, U+03BA ISOgrk3 -->
+<!ENTITY lambda "&#955;" ><!-- greek small letter lambda, U+03BB ISOgrk3 -->
+<!ENTITY mu "&#956;" ><!-- greek small letter mu, U+03BC ISOgrk3 -->
+<!ENTITY nu "&#957;" ><!-- greek small letter nu, U+03BD ISOgrk3 -->
+<!ENTITY xi "&#958;" ><!-- greek small letter xi, U+03BE ISOgrk3 -->
+<!ENTITY omicron "&#959;" ><!-- greek small letter omicron, U+03BF NEW -->
+<!ENTITY pi "&#960;" ><!-- greek small letter pi, U+03C0 ISOgrk3 -->
+<!ENTITY rho "&#961;" ><!-- greek small letter rho, U+03C1 ISOgrk3 -->
+<!ENTITY sigmaf "&#962;" ><!-- greek small letter final sigma,
+ U+03C2 ISOgrk3 -->
+<!ENTITY sigma "&#963;" ><!-- greek small letter sigma, U+03C3 ISOgrk3 -->
+<!ENTITY tau "&#964;" ><!-- greek small letter tau, U+03C4 ISOgrk3 -->
+<!ENTITY upsilon "&#965;" ><!-- greek small letter upsilon,
+ U+03C5 ISOgrk3 -->
+<!ENTITY phi "&#966;" ><!-- greek small letter phi, U+03C6 ISOgrk3 -->
+<!ENTITY chi "&#967;" ><!-- greek small letter chi, U+03C7 ISOgrk3 -->
+<!ENTITY psi "&#968;" ><!-- greek small letter psi, U+03C8 ISOgrk3 -->
+<!ENTITY omega "&#969;" ><!-- greek small letter omega, U+03C9 ISOgrk3 -->
+<!ENTITY thetasym "&#977;" ><!-- greek small letter theta symbol,
+ U+03D1 NEW -->
+<!ENTITY upsih "&#978;" ><!-- greek upsilon with hook symbol,
+ U+03D2 NEW -->
+<!ENTITY piv "&#982;" ><!-- greek pi symbol, U+03D6 ISOgrk3 -->
+
+<!-- General Punctuation -->
+<!ENTITY bull "&#8226;" ><!-- bullet = black small circle,
+ U+2022 ISOpub -->
+<!-- bullet is NOT the same as bullet operator, U+2219 -->
+<!ENTITY hellip "&#8230;" ><!-- horizontal ellipsis = three dot leader,
+ U+2026 ISOpub -->
+<!ENTITY prime "&#8242;" ><!-- prime = minutes = feet, U+2032 ISOtech -->
+<!ENTITY Prime "&#8243;" ><!-- double prime = seconds = inches,
+ U+2033 ISOtech -->
+<!ENTITY oline "&#8254;" ><!-- overline = spacing overscore,
+ U+203E NEW -->
+<!ENTITY frasl "&#8260;" ><!-- fraction slash, U+2044 NEW -->
+
+<!-- Letterlike Symbols -->
+<!ENTITY weierp "&#8472;" ><!-- script capital P = power set
+ = Weierstrass p, U+2118 ISOamso -->
+<!ENTITY image "&#8465;" ><!-- blackletter capital I = imaginary part,
+ U+2111 ISOamso -->
+<!ENTITY real "&#8476;" ><!-- blackletter capital R = real part symbol,
+ U+211C ISOamso -->
+<!ENTITY trade "&#8482;" ><!-- trade mark sign, U+2122 ISOnum -->
+<!ENTITY alefsym "&#8501;" ><!-- alef symbol = first transfinite cardinal,
+ U+2135 NEW -->
+<!-- alef symbol is NOT the same as hebrew letter alef,
+ U+05D0 although the same glyph could be used to depict both characters -->
+
+<!-- Arrows -->
+<!ENTITY larr "&#8592;" ><!-- leftwards arrow, U+2190 ISOnum -->
+<!ENTITY uarr "&#8593;" ><!-- upwards arrow, U+2191 ISOnum-->
+<!ENTITY rarr "&#8594;" ><!-- rightwards arrow, U+2192 ISOnum -->
+<!ENTITY darr "&#8595;" ><!-- downwards arrow, U+2193 ISOnum -->
+<!ENTITY harr "&#8596;" ><!-- left right arrow, U+2194 ISOamsa -->
+<!ENTITY crarr "&#8629;" ><!-- downwards arrow with corner leftwards
+ = carriage return, U+21B5 NEW -->
+<!ENTITY lArr "&#8656;" ><!-- leftwards double arrow, U+21D0 ISOtech -->
+<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
+ but also does not have any other character for that function. So ? lArr can
+ be used for 'is implied by' as ISOtech suggests -->
+<!ENTITY uArr "&#8657;" ><!-- upwards double arrow, U+21D1 ISOamsa -->
+<!ENTITY rArr "&#8658;" ><!-- rightwards double arrow,
+ U+21D2 ISOtech -->
+<!-- Unicode does not say this is the 'implies' character but does not have
+ another character with this function so ?
+ rArr can be used for 'implies' as ISOtech suggests -->
+<!ENTITY dArr "&#8659;" ><!-- downwards double arrow, U+21D3 ISOamsa -->
+<!ENTITY hArr "&#8660;" ><!-- left right double arrow,
+ U+21D4 ISOamsa -->
+
+<!-- Mathematical Operators -->
+<!ENTITY forall "&#8704;" ><!-- for all, U+2200 ISOtech -->
+<!ENTITY part "&#8706;" ><!-- partial differential, U+2202 ISOtech -->
+<!ENTITY exist "&#8707;" ><!-- there exists, U+2203 ISOtech -->
+<!ENTITY empty "&#8709;" ><!-- empty set = null set = diameter,
+ U+2205 ISOamso -->
+<!ENTITY nabla "&#8711;" ><!-- nabla = backward difference,
+ U+2207 ISOtech -->
+<!ENTITY isin "&#8712;" ><!-- element of, U+2208 ISOtech -->
+<!ENTITY notin "&#8713;" ><!-- not an element of, U+2209 ISOtech -->
+<!ENTITY ni "&#8715;" ><!-- contains as member, U+220B ISOtech -->
+<!-- should there be a more memorable name than 'ni'? -->
+<!ENTITY prod "&#8719;" ><!-- n-ary product = product sign,
+ U+220F ISOamsb -->
+<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
+ the same glyph might be used for both -->
+<!ENTITY sum "&#8721;" ><!-- n-ary sumation, U+2211 ISOamsb -->
+<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
+ though the same glyph might be used for both -->
+<!ENTITY minus "&#8722;" ><!-- minus sign, U+2212 ISOtech -->
+<!ENTITY lowast "&#8727;" ><!-- asterisk operator, U+2217 ISOtech -->
+<!ENTITY radic "&#8730;" ><!-- square root = radical sign,
+ U+221A ISOtech -->
+<!ENTITY prop "&#8733;" ><!-- proportional to, U+221D ISOtech -->
+<!ENTITY infin "&#8734;" ><!-- infinity, U+221E ISOtech -->
+<!ENTITY ang "&#8736;" ><!-- angle, U+2220 ISOamso -->
+<!ENTITY and "&#8743;" ><!-- logical and = wedge, U+2227 ISOtech -->
+<!ENTITY or "&#8744;" ><!-- logical or = vee, U+2228 ISOtech -->
+<!ENTITY cap "&#8745;" ><!-- intersection = cap, U+2229 ISOtech -->
+<!ENTITY cup "&#8746;" ><!-- union = cup, U+222A ISOtech -->
+<!ENTITY int "&#8747;" ><!-- integral, U+222B ISOtech -->
+<!ENTITY there4 "&#8756;" ><!-- therefore, U+2234 ISOtech -->
+<!ENTITY sim "&#8764;" ><!-- tilde operator = varies with = similar to,
+ U+223C ISOtech -->
+<!-- tilde operator is NOT the same character as the tilde, U+007E,
+ although the same glyph might be used to represent both -->
+<!ENTITY cong "&#8773;" ><!-- approximately equal to, U+2245 ISOtech -->
+<!ENTITY asymp "&#8776;" ><!-- almost equal to = asymptotic to,
+ U+2248 ISOamsr -->
+<!ENTITY ne "&#8800;" ><!-- not equal to, U+2260 ISOtech -->
+<!ENTITY equiv "&#8801;" ><!-- identical to, U+2261 ISOtech -->
+<!ENTITY le "&#8804;" ><!-- less-than or equal to, U+2264 ISOtech -->
+<!ENTITY ge "&#8805;" ><!-- greater-than or equal to,
+ U+2265 ISOtech -->
+<!ENTITY sub "&#8834;" ><!-- subset of, U+2282 ISOtech -->
+<!ENTITY sup "&#8835;" ><!-- superset of, U+2283 ISOtech -->
+<!-- note that nsup, 'not a superset of, U+2283' is not covered by the Symbol
+ font encoding and is not included. Should it be, for symmetry?
+ It is in ISOamsn -->
+<!ENTITY nsub "&#8836;" ><!-- not a subset of, U+2284 ISOamsn -->
+<!ENTITY sube "&#8838;" ><!-- subset of or equal to, U+2286 ISOtech -->
+<!ENTITY supe "&#8839;" ><!-- superset of or equal to,
+ U+2287 ISOtech -->
+<!ENTITY oplus "&#8853;" ><!-- circled plus = direct sum,
+ U+2295 ISOamsb -->
+<!ENTITY otimes "&#8855;" ><!-- circled times = vector product,
+ U+2297 ISOamsb -->
+<!ENTITY perp "&#8869;" ><!-- up tack = orthogonal to = perpendicular,
+ U+22A5 ISOtech -->
+<!ENTITY sdot "&#8901;" ><!-- dot operator, U+22C5 ISOamsb -->
+<!-- dot operator is NOT the same character as U+00B7 middle dot -->
+
+<!-- Miscellaneous Technical -->
+<!ENTITY lceil "&#8968;" ><!-- left ceiling = apl upstile,
+ U+2308 ISOamsc -->
+<!ENTITY rceil "&#8969;" ><!-- right ceiling, U+2309 ISOamsc -->
+<!ENTITY lfloor "&#8970;" ><!-- left floor = apl downstile,
+ U+230A ISOamsc -->
+<!ENTITY rfloor "&#8971;" ><!-- right floor, U+230B ISOamsc -->
+<!ENTITY lang "&#9001;" ><!-- left-pointing angle bracket = bra,
+ U+2329 ISOtech -->
+<!-- lang is NOT the same character as U+003C 'less than'
+ or U+2039 'single left-pointing angle quotation mark' -->
+<!ENTITY rang "&#9002;" ><!-- right-pointing angle bracket = ket,
+ U+232A ISOtech -->
+<!-- rang is NOT the same character as U+003E 'greater than'
+ or U+203A 'single right-pointing angle quotation mark' -->
+
+<!-- Geometric Shapes -->
+<!ENTITY loz "&#9674;" ><!-- lozenge, U+25CA ISOpub -->
+
+<!-- Miscellaneous Symbols -->
+<!ENTITY spades "&#9824;" ><!-- black spade suit, U+2660 ISOpub -->
+<!-- black here seems to mean filled as opposed to hollow -->
+<!ENTITY clubs "&#9827;" ><!-- black club suit = shamrock,
+ U+2663 ISOpub -->
+<!ENTITY hearts "&#9829;" ><!-- black heart suit = valentine,
+ U+2665 ISOpub -->
+<!ENTITY diams "&#9830;" ><!-- black diamond suit, U+2666 ISOpub -->
+
+<!-- end of xhtml-symbol.ent -->
diff --git a/lv2specgen/DTD/xhtml-table-1.mod b/lv2specgen/DTD/xhtml-table-1.mod
new file mode 100644
index 0000000..4a59c35
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-table-1.mod
@@ -0,0 +1,333 @@
+<!-- ...................................................................... -->
+<!-- XHTML Table Module .................................................. -->
+<!-- file: xhtml-table-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-table-1.mod,v 1.4 2008/10/08 21:02:31 jules Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Tables 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-table-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Tables
+
+ table, caption, thead, tfoot, tbody, colgroup, col, tr, th, td
+
+ This module declares element types and attributes used to provide
+ table markup similar to HTML 4, including features that enable
+ better accessibility for non-visual user agents.
+-->
+
+<!-- declare qualified element type names:
+-->
+<!ENTITY % table.qname "table" >
+<!ENTITY % caption.qname "caption" >
+<!ENTITY % thead.qname "thead" >
+<!ENTITY % tfoot.qname "tfoot" >
+<!ENTITY % tbody.qname "tbody" >
+<!ENTITY % colgroup.qname "colgroup" >
+<!ENTITY % col.qname "col" >
+<!ENTITY % tr.qname "tr" >
+<!ENTITY % th.qname "th" >
+<!ENTITY % td.qname "td" >
+
+<!-- The frame attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the valign attribute.
+-->
+<!ENTITY % frame.attrib
+ "frame ( void
+ | above
+ | below
+ | hsides
+ | lhs
+ | rhs
+ | vsides
+ | box
+ | border ) #IMPLIED"
+>
+
+<!-- The rules attribute defines which rules to draw between cells:
+
+ If rules is absent then assume:
+
+ "none" if border is absent or border="0" otherwise "all"
+-->
+<!ENTITY % rules.attrib
+ "rules ( none
+ | groups
+ | rows
+ | cols
+ | all ) #IMPLIED"
+>
+
+<!-- horizontal alignment attributes for cell contents
+-->
+<!ENTITY % CellHAlign.attrib
+ "align ( left
+ | center
+ | right
+ | justify
+ | char ) #IMPLIED
+ char %Character.datatype; #IMPLIED
+ charoff %Length.datatype; #IMPLIED"
+>
+
+<!-- vertical alignment attribute for cell contents
+-->
+<!ENTITY % CellVAlign.attrib
+ "valign ( top
+ | middle
+ | bottom
+ | baseline ) #IMPLIED"
+>
+
+<!-- scope is simpler than axes attribute for common tables
+-->
+<!ENTITY % scope.attrib
+ "scope ( row
+ | col
+ | rowgroup
+ | colgroup ) #IMPLIED"
+>
+
+<!-- table: Table Element .............................. -->
+
+<!ENTITY % table.element "INCLUDE" >
+<![%table.element;[
+<!ENTITY % table.content
+ "( %caption.qname;?, ( %col.qname;* | %colgroup.qname;* ),
+ (( %thead.qname;?, %tfoot.qname;?, %tbody.qname;+ ) | ( %tr.qname;+ )))"
+>
+<!ELEMENT %table.qname; %table.content; >
+<!-- end of table.element -->]]>
+
+<!ENTITY % table.attlist "INCLUDE" >
+<![%table.attlist;[
+<!ATTLIST %table.qname;
+ %Common.attrib;
+ summary %Text.datatype; #IMPLIED
+ width %Length.datatype; #IMPLIED
+ border %Pixels.datatype; #IMPLIED
+ %frame.attrib;
+ %rules.attrib;
+ cellspacing %Length.datatype; #IMPLIED
+ cellpadding %Length.datatype; #IMPLIED
+>
+<!-- end of table.attlist -->]]>
+
+<!-- caption: Table Caption ............................ -->
+
+<!ENTITY % caption.element "INCLUDE" >
+<![%caption.element;[
+<!ENTITY % caption.content
+ "( #PCDATA | %Inline.mix; )*"
+>
+<!ELEMENT %caption.qname; %caption.content; >
+<!-- end of caption.element -->]]>
+
+<!ENTITY % caption.attlist "INCLUDE" >
+<![%caption.attlist;[
+<!ATTLIST %caption.qname;
+ %Common.attrib;
+>
+<!-- end of caption.attlist -->]]>
+
+<!-- thead: Table Header ............................... -->
+
+<!-- Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+-->
+
+<!ENTITY % thead.element "INCLUDE" >
+<![%thead.element;[
+<!ENTITY % thead.content "( %tr.qname; )+" >
+<!ELEMENT %thead.qname; %thead.content; >
+<!-- end of thead.element -->]]>
+
+<!ENTITY % thead.attlist "INCLUDE" >
+<![%thead.attlist;[
+<!ATTLIST %thead.qname;
+ %Common.attrib;
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of thead.attlist -->]]>
+
+<!-- tfoot: Table Footer ............................... -->
+
+<!-- Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+-->
+
+<!ENTITY % tfoot.element "INCLUDE" >
+<![%tfoot.element;[
+<!ENTITY % tfoot.content "( %tr.qname; )+" >
+<!ELEMENT %tfoot.qname; %tfoot.content; >
+<!-- end of tfoot.element -->]]>
+
+<!ENTITY % tfoot.attlist "INCLUDE" >
+<![%tfoot.attlist;[
+<!ATTLIST %tfoot.qname;
+ %Common.attrib;
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of tfoot.attlist -->]]>
+
+<!-- tbody: Table Body ................................. -->
+
+<!-- Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+
+<!ENTITY % tbody.element "INCLUDE" >
+<![%tbody.element;[
+<!ENTITY % tbody.content "( %tr.qname; )+" >
+<!ELEMENT %tbody.qname; %tbody.content; >
+<!-- end of tbody.element -->]]>
+
+<!ENTITY % tbody.attlist "INCLUDE" >
+<![%tbody.attlist;[
+<!ATTLIST %tbody.qname;
+ %Common.attrib;
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of tbody.attlist -->]]>
+
+<!-- colgroup: Table Column Group ...................... -->
+
+<!-- colgroup groups a set of col elements. It allows you
+ to group several semantically-related columns together.
+-->
+
+<!ENTITY % colgroup.element "INCLUDE" >
+<![%colgroup.element;[
+<!ENTITY % colgroup.content "( %col.qname; )*" >
+<!ELEMENT %colgroup.qname; %colgroup.content; >
+<!-- end of colgroup.element -->]]>
+
+<!ENTITY % colgroup.attlist "INCLUDE" >
+<![%colgroup.attlist;[
+<!ATTLIST %colgroup.qname;
+ %Common.attrib;
+ span %Number.datatype; '1'
+ width %MultiLength.datatype; #IMPLIED
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of colgroup.attlist -->]]>
+
+<!-- col: Table Column ................................. -->
+
+<!-- col elements define the alignment properties for
+ cells in one or more columns.
+
+ The width attribute specifies the width of the
+ columns, e.g.
+
+ width="64" width in screen pixels
+ width="0.5*" relative width of 0.5
+
+ The span attribute causes the attributes of one
+ col element to apply to more than one column.
+-->
+
+<!ENTITY % col.element "INCLUDE" >
+<![%col.element;[
+<!ENTITY % col.content "EMPTY" >
+<!ELEMENT %col.qname; %col.content; >
+<!-- end of col.element -->]]>
+
+<!ENTITY % col.attlist "INCLUDE" >
+<![%col.attlist;[
+<!ATTLIST %col.qname;
+ %Common.attrib;
+ span %Number.datatype; '1'
+ width %MultiLength.datatype; #IMPLIED
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of col.attlist -->]]>
+
+<!-- tr: Table Row ..................................... -->
+
+<!ENTITY % tr.element "INCLUDE" >
+<![%tr.element;[
+<!ENTITY % tr.content "( %th.qname; | %td.qname; )+" >
+<!ELEMENT %tr.qname; %tr.content; >
+<!-- end of tr.element -->]]>
+
+<!ENTITY % tr.attlist "INCLUDE" >
+<![%tr.attlist;[
+<!ATTLIST %tr.qname;
+ %Common.attrib;
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of tr.attlist -->]]>
+
+<!-- th: Table Header Cell ............................. -->
+
+<!-- th is for header cells, td for data,
+ but for cells acting as both use td
+-->
+
+<!ENTITY % th.element "INCLUDE" >
+<![%th.element;[
+<!ENTITY % th.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ELEMENT %th.qname; %th.content; >
+<!-- end of th.element -->]]>
+
+<!ENTITY % th.attlist "INCLUDE" >
+<![%th.attlist;[
+<!ATTLIST %th.qname;
+ %Common.attrib;
+ abbr %Text.datatype; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ %scope.attrib;
+ rowspan %Number.datatype; '1'
+ colspan %Number.datatype; '1'
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of th.attlist -->]]>
+
+<!-- td: Table Data Cell ............................... -->
+
+<!ENTITY % td.element "INCLUDE" >
+<![%td.element;[
+<!ENTITY % td.content
+ "( #PCDATA | %Flow.mix; )*"
+>
+<!ELEMENT %td.qname; %td.content; >
+<!-- end of td.element -->]]>
+
+<!ENTITY % td.attlist "INCLUDE" >
+<![%td.attlist;[
+<!ATTLIST %td.qname;
+ %Common.attrib;
+ abbr %Text.datatype; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ %scope.attrib;
+ rowspan %Number.datatype; '1'
+ colspan %Number.datatype; '1'
+ %CellHAlign.attrib;
+ %CellVAlign.attrib;
+>
+<!-- end of td.attlist -->]]>
+
+<!-- end of xhtml-table-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-target-1.mod b/lv2specgen/DTD/xhtml-target-1.mod
new file mode 100644
index 0000000..3739ef1
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-target-1.mod
@@ -0,0 +1,53 @@
+<!-- ...................................................................... -->
+<!-- XHTML Target Module ................................................. -->
+<!-- file: xhtml-target-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-target-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Target 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-target-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Target
+
+ target
+
+ This module declares the 'target' attribute used for opening windows
+-->
+
+<!-- render in this frame -->
+<!ENTITY % FrameTarget.datatype "CDATA" >
+
+<!-- add 'target' attribute to 'a' element -->
+<!ATTLIST %a.qname;
+ target %FrameTarget.datatype; #IMPLIED
+>
+
+<!-- add 'target' attribute to 'area' element -->
+<!ATTLIST %area.qname;
+ target %FrameTarget.datatype; #IMPLIED
+>
+
+<!-- add 'target' attribute to 'link' element -->
+<!ATTLIST %link.qname;
+ target %FrameTarget.datatype; #IMPLIED
+>
+
+<!-- add 'target' attribute to 'form' element -->
+<!ATTLIST %form.qname;
+ target %FrameTarget.datatype; #IMPLIED
+>
+
+<!-- add 'target' attribute to 'base' element -->
+<!ATTLIST %base.qname;
+ target %FrameTarget.datatype; #IMPLIED
+>
+
+<!-- end of xhtml-target-1.mod -->
diff --git a/lv2specgen/DTD/xhtml-text-1.mod b/lv2specgen/DTD/xhtml-text-1.mod
new file mode 100644
index 0000000..07ccb81
--- /dev/null
+++ b/lv2specgen/DTD/xhtml-text-1.mod
@@ -0,0 +1,52 @@
+<!-- ...................................................................... -->
+<!-- XHTML Text Module ................................................... -->
+<!-- file: xhtml-text-1.mod
+
+ This is XHTML, a reformulation of HTML as a modular XML application.
+ Copyright 1998-2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+ Revision: $Id: xhtml-text-1.mod,v 4.0 2001/04/02 22:42:49 altheim Exp $ SMI
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//ELEMENTS XHTML Text 1.0//EN"
+ SYSTEM "http://www.w3.org/MarkUp/DTD/xhtml-text-1.mod"
+
+ Revisions:
+ (none)
+ ....................................................................... -->
+
+<!-- Textual Content
+
+ The Text module includes declarations for all core
+ text container elements and their attributes.
+-->
+
+<!ENTITY % xhtml-inlstruct.module "INCLUDE" >
+<![%xhtml-inlstruct.module;[
+<!ENTITY % xhtml-inlstruct.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Inline Structural 1.0//EN"
+ "xhtml-inlstruct-1.mod" >
+%xhtml-inlstruct.mod;]]>
+
+<!ENTITY % xhtml-inlphras.module "INCLUDE" >
+<![%xhtml-inlphras.module;[
+<!ENTITY % xhtml-inlphras.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Inline Phrasal 1.0//EN"
+ "xhtml-inlphras-1.mod" >
+%xhtml-inlphras.mod;]]>
+
+<!ENTITY % xhtml-blkstruct.module "INCLUDE" >
+<![%xhtml-blkstruct.module;[
+<!ENTITY % xhtml-blkstruct.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Block Structural 1.0//EN"
+ "xhtml-blkstruct-1.mod" >
+%xhtml-blkstruct.mod;]]>
+
+<!ENTITY % xhtml-blkphras.module "INCLUDE" >
+<![%xhtml-blkphras.module;[
+<!ENTITY % xhtml-blkphras.mod
+ PUBLIC "-//W3C//ELEMENTS XHTML Block Phrasal 1.0//EN"
+ "xhtml-blkphras-1.mod" >
+%xhtml-blkphras.mod;]]>
+
+<!-- end of xhtml-text-1.mod -->
diff --git a/lv2specgen/lv2docgen.py b/lv2specgen/lv2docgen.py
new file mode 100755
index 0000000..23a239d
--- /dev/null
+++ b/lv2specgen/lv2docgen.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# lv2docgen, a documentation generator for LV2 plugins
+# Copyright 2012 David Robillard <d@drobilla.net>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+import errno
+import os
+import sys
+
+__date__ = '2012-03-27'
+__version__ = '0.0.0'
+__authors__ = 'David Robillard'
+__license__ = 'ISC License <http://www.opensource.org/licenses/isc>'
+__contact__ = 'devel@lists.lv2plug.in'
+
+try:
+ import rdflib
+except ImportError:
+ sys.exit('Error importing rdflib')
+
+doap = rdflib.Namespace('http://usefulinc.com/ns/doap#')
+lv2 = rdflib.Namespace('http://lv2plug.in/ns/lv2core#')
+rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
+rdfs = rdflib.Namespace('http://www.w3.org/2000/01/rdf-schema#')
+
+def uri_to_path(uri):
+ path = uri[uri.find(':'):]
+ while not path[0].isalpha():
+ path = path[1:]
+ return path
+
+def get_doc(model, subject):
+ comment = model.value(subject, rdfs.comment, None)
+ if comment:
+ return '<p class="content">%s</p>' % comment
+ return ''
+
+def port_doc(model, port):
+ name = model.value(port, lv2.name, None)
+ comment = model.value(port, rdfs.comment, None)
+ html = '<div class="specterm"><h3>%s</h3>' % name
+ html += get_doc(model, port)
+ html += '</div>'
+ return html
+
+def plugin_doc(model, plugin, style_uri):
+ uri = str(plugin)
+ name = model.value(plugin, doap.name, None)
+
+ html = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+<html about="%s"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:lv2="http://lv2plug.in/ns/lv2core#"
+ xml:lang="en">''' % uri
+
+ html += '''<head>
+ <title>%s</title>
+ <meta http-equiv="content-type" content="text/xhtml+xml; charset=utf-8" />
+ <meta name="generator" content="lv2docgen" />
+ <link href="%s" rel="stylesheet" type="text/css" />
+ </head>
+ <body>''' % (name, style_uri)
+
+ html += '''
+ <!-- HEADER -->
+ <div id="header">
+ <h1 id="title">%s</h1>
+ <table id="meta">
+ <tr><th>URI</th><td><a href="%s">%s</a></td></tr>
+ <tr><th>Version</th><td>%s</td></tr>
+ </table>
+ </div>
+''' % (name, uri, uri, '0.0.0')
+
+ html += get_doc(model, plugin)
+
+ ports_html = ''
+ for p in model.triples([plugin, lv2.port, None]):
+ ports_html += port_doc(model, p[2])
+
+ if len(ports_html):
+ html += '''
+ <h2 class="sec">Ports</h2>
+ <div class="content">
+%s
+ </div>''' % ports_html
+
+ html += ' </body></html>'
+ return html
+
+if __name__ == '__main__':
+ 'LV2 plugin documentation generator'
+
+ if len(sys.argv) < 2:
+ print('Usage: %s OUTDIR FILE...' % sys.argv[0])
+ sys.exit(1)
+
+ outdir = sys.argv[1]
+ files = sys.argv[2:]
+ model = rdflib.ConjunctiveGraph()
+ for f in files:
+ model.parse(f, format='n3')
+
+ style_uri = os.path.abspath(os.path.join(outdir, 'style.css'))
+ for p in model.triples([None, rdf.type, lv2.Plugin]):
+ plugin = p[0]
+ html = plugin_doc(model, plugin, style_uri)
+ path = uri_to_path(plugin)
+
+ outpath = os.path.join(outdir, path + '.html')
+ try:
+ os.makedirs(os.path.dirname(outpath))
+ except OSError:
+ e = sys.exc_info()[1]
+ if e.errno == errno.EEXIST:
+ pass
+ else:
+ raise
+
+ print('Writing <%s> documentation to %s' % (plugin, outpath))
+ out = open(outpath, 'w')
+ out.write(html)
+ out.close()
diff --git a/lv2specgen/lv2specgen.py b/lv2specgen/lv2specgen.py
new file mode 100755
index 0000000..ddd0ba5
--- /dev/null
+++ b/lv2specgen/lv2specgen.py
@@ -0,0 +1,1525 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# lv2specgen, a documentation generator for LV2 specifications.
+# Copyright (c) 2009-2014 David Robillard <d@drobilla.net>
+#
+# Based on SpecGen:
+# <http://forge.morfeo-project.org/wiki_en/index.php/SpecGen>
+# Copyright (c) 2003-2008 Christopher Schmidt <crschmidt@crschmidt.net>
+# Copyright (c) 2005-2008 Uldis Bojars <uldis.bojars@deri.org>
+# Copyright (c) 2007-2008 Sergio Fernández <sergio.fernandez@fundacionctic.org>
+#
+# This software is licensed under the terms of the MIT License.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+import datetime
+import optparse
+import os
+import re
+import sys
+import time
+import xml.sax.saxutils
+import xml.dom
+import xml.dom.minidom
+
+__date__ = "2011-10-26"
+__version__ = __date__.replace('-', '.')
+__authors__ = """
+Christopher Schmidt,
+Uldis Bojars,
+Sergio Fernández,
+David Robillard"""
+__license__ = "MIT License <http://www.opensource.org/licenses/mit>"
+__contact__ = "devel@lists.lv2plug.in"
+
+try:
+ from lxml import etree
+ have_lxml = True
+except:
+ have_lxml = False
+
+try:
+ import pygments
+ import pygments.lexers
+ import pygments.formatters
+ from pygments.lexer import RegexLexer, include, bygroups
+ from pygments.token import Text, Comment, Operator, Keyword, Name, String, Literal, Punctuation
+ have_pygments = True
+except ImportError:
+ print("Error importing pygments, syntax highlighting disabled")
+ have_pygments = False
+
+try:
+ import rdflib
+except ImportError:
+ sys.exit("Error importing rdflib")
+
+# Global Variables
+classranges = {}
+classdomains = {}
+linkmap = {}
+spec_url = None
+spec_ns_str = None
+spec_ns = None
+spec_pre = None
+spec_bundle = None
+specgendir = None
+ns_list = {
+ "http://www.w3.org/1999/02/22-rdf-syntax-ns#" : "rdf",
+ "http://www.w3.org/2000/01/rdf-schema#" : "rdfs",
+ "http://www.w3.org/2002/07/owl#" : "owl",
+ "http://www.w3.org/2001/XMLSchema#" : "xsd",
+ "http://rdfs.org/sioc/ns#" : "sioc",
+ "http://xmlns.com/foaf/0.1/" : "foaf",
+ "http://purl.org/dc/elements/1.1/" : "dc",
+ "http://purl.org/dc/terms/" : "dct",
+ "http://purl.org/rss/1.0/modules/content/" : "content",
+ "http://www.w3.org/2003/01/geo/wgs84_pos#" : "geo",
+ "http://www.w3.org/2004/02/skos/core#" : "skos",
+ "http://lv2plug.in/ns/lv2core#" : "lv2",
+ "http://usefulinc.com/ns/doap#" : "doap",
+ "http://ontologi.es/doap-changeset#" : "dcs"
+}
+
+rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
+rdfs = rdflib.Namespace('http://www.w3.org/2000/01/rdf-schema#')
+owl = rdflib.Namespace('http://www.w3.org/2002/07/owl#')
+lv2 = rdflib.Namespace('http://lv2plug.in/ns/lv2core#')
+doap = rdflib.Namespace('http://usefulinc.com/ns/doap#')
+dcs = rdflib.Namespace('http://ontologi.es/doap-changeset#')
+foaf = rdflib.Namespace('http://xmlns.com/foaf/0.1/')
+
+
+def findStatements(model, s, p, o):
+ return model.triples([s, p, o])
+
+
+def findOne(m, s, p, o):
+ l = findStatements(m, s, p, o)
+ try:
+ return sorted(l)[0]
+ except:
+ return None
+
+
+def getSubject(s):
+ return s[0]
+
+
+def getPredicate(s):
+ return s[1]
+
+
+def getObject(s):
+ return s[2]
+
+
+def getLiteralString(s):
+ return s
+
+
+def isResource(n):
+ return type(n) == rdflib.URIRef
+
+
+def isBlank(n):
+ return type(n) == rdflib.BNode
+
+
+def isLiteral(n):
+ return type(n) == rdflib.Literal
+
+
+def niceName(uri):
+ global spec_bundle
+ if uri.startswith(spec_bundle):
+ return uri[len(spec_bundle):]
+
+ regexp = re.compile("^(.*[/#])([^/#]+)$")
+ rez = regexp.search(uri)
+ if not rez:
+ return uri
+ pref = rez.group(1)
+ if pref in ns_list:
+ return ns_list.get(pref, pref) + ":" + rez.group(2)
+ else:
+ print("warning: prefix %s not in ns list:" % pref)
+ print(ns_list)
+ return uri
+
+
+def termName(m, urinode):
+ "Trims the namespace out of a term to give a name to the term."
+ return str(urinode).replace(spec_ns_str, "")
+
+
+def getLabel(m, urinode):
+ l = findOne(m, urinode, rdfs.label, None)
+ if l:
+ return getLiteralString(getObject(l))
+ else:
+ return ''
+
+if have_pygments:
+ # Based on sw.py by Philip Cooper
+ class Notation3Lexer(RegexLexer):
+ """
+ Lexer for N3 / Turtle / NT
+ """
+ name = 'N3'
+ aliases = ['n3', 'turtle']
+ filenames = ['*.n3', '*.ttl', '*.nt']
+ mimetypes = ['text/rdf+n3','application/x-turtle','application/n3']
+
+ tokens = {
+ 'comments': [
+ (r'(\s*#.*)', Comment)
+ ],
+ 'root': [
+ include('comments'),
+ (r'(\s*@(?:prefix|base|keywords)\s*)(\w*:\s+)?(<[^> ]*>\s*\.\s*)',bygroups(Keyword,Name.Variable,Name.Namespace)),
+ (r'\s*(<[^>]*\>)', Name.Class, ('triple','predObj')),
+ (r'(\s*[a-zA-Z_:][a-zA-Z0-9\-_:]*\s)', Name.Class, ('triple','predObj')),
+ (r'\s*\[\]\s*', Name.Class, ('triple','predObj')),
+ ],
+ 'triple' : [
+ (r'\s*\.\s*', Text, '#pop')
+ ],
+ 'predObj': [
+ include('comments'),
+ (r'\s*a\s*', Name.Keyword, 'object'),
+ (r'\s*[a-zA-Z_:][a-zA-Z0-9\-_:]*\b\s*', Name.Tag, 'object'),
+ (r'\s*(<[^>]*\>)', Name.Tag, 'object'),
+ (r'\s*\]\s*', Text, '#pop'),
+ (r'(?=\s*\.\s*)', Keyword, '#pop'),
+ ],
+ 'objList': [
+ include('comments'),
+ (r'\s*\)', Text, '#pop'),
+ include('object')
+ ],
+ 'object': [
+ include('comments'),
+ (r'\s*\[', Text, 'predObj'),
+ (r'\s*<[^> ]*>', Name.Tag),
+ (r'\s*("""(?:.|\n)*?""")(\@[a-z]{2-4}|\^\^<?[a-zA-Z0-9\-\:_#/\.]*>?)?\s*', bygroups(Literal.String,Text)),
+ (r'\s*".*?[^\\]"(?:\@[a-z]{2-4}|\^\^<?[a-zA-Z0-9\-\:_#/\.]*>?)?\s*', Literal.String),
+ (r'\s*[0-9]+\.[0-9]*\s*\n?', Literal.Number),
+ (r'\s*[0-9]+\s*\n?', Literal.Number),
+ (r'\s*[a-zA-Z0-9\-_\:]+\s*', Name.Tag),
+ (r'\s*\(', Text, 'objList'),
+ (r'\s*;\s*\n?', Punctuation, '#pop'),
+ (r'\s*,\s*\n?', Punctuation), # Added by drobilla so "," is not an error
+ (r'(?=\s*\])', Text, '#pop'),
+ (r'(?=\s*\.)', Text, '#pop'),
+ ],
+ }
+
+def linkify(string):
+ if linkmap == {}:
+ return string
+
+ "Add links to code documentation for identifiers"
+ if string in linkmap.keys():
+ # Exact match for complete string
+ return linkmap[string]
+
+ rgx = re.compile('([^a-zA-Z0-9_:])(' + \
+ '|'.join(map(re.escape, linkmap)) + \
+ ')([^a-zA-Z0-9_:])')
+
+ def translateCodeLink(match):
+ return match.group(1) + linkmap[match.group(2)] + match.group(3)
+
+ return rgx.sub(translateCodeLink, string)
+
+def getComment(m, urinode, classlist, proplist, instalist):
+ c = findOne(m, urinode, lv2.documentation, None)
+ if c:
+ markup = getLiteralString(getObject(c))
+
+ # Syntax highlight all C code
+ if have_pygments:
+ code_rgx = re.compile('<pre class="c-code">(.*?)</pre>', re.DOTALL)
+ while True:
+ code = code_rgx.search(markup)
+ if not code:
+ break
+ match_str = xml.sax.saxutils.unescape(code.group(1))
+ code_str = pygments.highlight(
+ match_str,
+ pygments.lexers.CLexer(),
+ pygments.formatters.HtmlFormatter())
+ markup = code_rgx.sub(code_str, markup, 1)
+
+ # Syntax highlight all Turtle code
+ if have_pygments:
+ code_rgx = re.compile('<pre class="turtle-code">(.*?)</pre>', re.DOTALL)
+ while True:
+ code = code_rgx.search(markup)
+ if not code:
+ break
+ match_str = xml.sax.saxutils.unescape(code.group(1))
+ code_str = pygments.highlight(
+ match_str,
+ Notation3Lexer(),
+ pygments.formatters.HtmlFormatter())
+ markup = code_rgx.sub(code_str, markup, 1)
+
+ # Add links to code documentation for identifiers
+ markup = linkify(markup)
+
+ # Transform prefixed names like eg:something into links if possible
+ rgx = re.compile('([a-zA-Z0-9_-]+):([a-zA-Z0-9_-]+)')
+ namespaces = getNamespaces(m)
+ def translateLink(match):
+ text = match.group(0)
+ prefix = match.group(1)
+ name = match.group(2)
+ curie = match.group(0)
+ uri = rdflib.URIRef(spec_ns + name)
+ if prefix == spec_pre:
+ if not ((classlist and uri in classlist) or
+ (instalist and uri in instalist) or
+ (proplist and uri in proplist)):
+ print("warning: Link to undefined resource <%s>\n" % text)
+ return '<a href="#%s">%s</a>' % (name, curie)
+ elif prefix in namespaces:
+ return '<a href="%s">%s</a>' % (
+ namespaces[match.group(1)] + match.group(2),
+ match.group(0))
+ else:
+ return text
+ markup = rgx.sub(translateLink, markup)
+
+ # Transform names like #foo into links into this spec if possible
+ rgx = re.compile('([ \t\n\r\f\v^]+)\#([a-zA-Z0-9_-]+)')
+ def translateLocalLink(match):
+ text = match.group(0)
+ space = match.group(1)
+ name = match.group(2)
+ uri = rdflib.URIRef(spec_ns + name)
+ if ((classlist and uri in classlist) or
+ (instalist and uri in instalist) or
+ (proplist and uri in proplist)):
+ return '%s<a href="#%s">%s</a>' % (space, name, name)
+ else:
+ print("warning: Link to undefined resource <%s>\n" % name)
+ return text
+ markup = rgx.sub(translateLocalLink, markup)
+
+ if have_lxml:
+ try:
+ # Parse and validate documentation as XHTML Basic 1.1
+ doc = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"
+ "DTD/xhtml-basic11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head xml:lang="en" profile="profile">
+ <title>Validation Skeleton Document</title>
+ </head>
+ <body>
+%s
+ </body>
+</html>
+""" % str(markup.decode())
+
+ oldcwd = os.getcwd()
+ os.chdir(specgendir)
+ parser = etree.XMLParser(dtd_validation=True, no_network=True)
+ root = etree.fromstring(doc, parser)
+ os.chdir(oldcwd)
+ except Exception as e:
+ print("Invalid lv2:documentation for %s\n%s" % (urinode, e))
+ line_num = 1
+ for line in doc.split('\n'):
+ print('%3d: %s' % (line_num, line))
+ line_num += 1
+
+ return markup
+
+ c = findOne(m, urinode, rdfs.comment, None)
+ if c:
+ text = getLiteralString(getObject(c))
+ return '<p>%s</p>' % xml.sax.saxutils.escape(text)
+
+ return ''
+
+
+def getProperty(val, first=True):
+ "Return a string representing a property value in a property table"
+ doc = ''
+ if not first:
+ doc += '<tr><td></td>' # Empty cell in header column
+ doc += '<td>%s</td></tr>\n' % val
+ return doc
+
+
+def endProperties(first):
+ if first:
+ return '</tr>'
+ else:
+ return ''
+
+
+def rdfsPropertyInfo(term, m):
+ """Generate HTML for properties: Domain, range"""
+ global classranges
+ global classdomains
+ doc = ""
+ range = ""
+ domain = ""
+
+ # Find subPropertyOf information
+ rlist = ''
+ first = True
+ for st in findStatements(m, term, rdfs.subPropertyOf, None):
+ k = getTermLink(getObject(st), term, rdfs.subPropertyOf)
+ rlist += getProperty(k, first)
+ first = False
+ if rlist != '':
+ doc += '<tr><th>Sub-property of</th>' + rlist
+
+ # Domain stuff
+ domains = findStatements(m, term, rdfs.domain, None)
+ domainsdoc = ""
+ first = True
+ for d in sorted(domains):
+ union = findOne(m, getObject(d), owl.unionOf, None)
+ if union:
+ uris = parseCollection(m, getObject(union))
+ for uri in uris:
+ domainsdoc += getProperty(getTermLink(uri, term, rdfs.domain), first)
+ add(classdomains, uri, term)
+ else:
+ if not isBlank(getObject(d)):
+ domainsdoc += getProperty(getTermLink(getObject(d), term, rdfs.domain), first)
+ first = False
+ if (len(domainsdoc) > 0):
+ doc += "<tr><th>Domain</th>%s" % domainsdoc
+
+ # Range stuff
+ ranges = findStatements(m, term, rdfs.range, None)
+ rangesdoc = ""
+ first = True
+ for r in sorted(ranges):
+ union = findOne(m, getObject(r), owl.unionOf, None)
+ if union:
+ uris = parseCollection(m, getObject(union))
+ for uri in uris:
+ rangesdoc += getProperty(getTermLink(uri, term, rdfs.range), first)
+ add(classranges, uri, term)
+ first = False
+ else:
+ if not isBlank(getObject(r)):
+ rangesdoc += getProperty(getTermLink(getObject(r), term, rdfs.range), first)
+ first = False
+ if (len(rangesdoc) > 0):
+ doc += "<tr><th>Range</th>%s" % rangesdoc
+
+ return doc
+
+
+def parseCollection(model, node):
+ uris = []
+
+ while node:
+ first = findOne(model, node, rdf.first, None)
+ rest = findOne(model, node, rdf.rest, None)
+ if not first or not rest:
+ break;
+
+ uris.append(getObject(first))
+ node = getObject(rest)
+
+ return uris
+
+
+def getTermLink(uri, subject=None, predicate=None):
+ uri = str(uri)
+ extra = ''
+ if subject is not None and predicate is not None:
+ extra = 'about="%s" rel="%s" resource="%s"' % (str(subject), niceName(str(predicate)), uri)
+ if (uri.startswith(spec_ns_str)):
+ return '<a href="#%s" %s>%s</a>' % (uri.replace(spec_ns_str, ""), extra, niceName(uri))
+ else:
+ return '<a href="%s" %s>%s</a>' % (uri, extra, niceName(uri))
+
+
+def rdfsClassInfo(term, m):
+ """Generate rdfs-type information for Classes: ranges, and domains."""
+ global classranges
+ global classdomains
+ doc = ""
+
+ # Find subClassOf information
+ restrictions = []
+ superclasses = []
+ for st in findStatements(m, term, rdfs.subClassOf, None):
+ if not isBlank(getObject(st)):
+ uri = getObject(st)
+ if not uri in superclasses:
+ superclasses.append(uri)
+ else:
+ meta_type = findOne(m, getObject(st), rdf.type, None)
+ restrictions.append(getSubject(meta_type))
+
+ if len(superclasses) > 0:
+ superclasses.sort()
+ doc += "\n<tr><th>Sub-class of</th>"
+ first = True
+ for superclass in superclasses:
+ doc += getProperty(getTermLink(superclass), first)
+ first = False
+
+ for r in sorted(restrictions):
+ props = findStatements(m, r, None, None)
+ onProp = None
+ comment = None
+ for p in props:
+ if getPredicate(p) == owl.onProperty:
+ onProp = getObject(p)
+ elif getPredicate(p) == rdfs.comment:
+ comment = getObject(p)
+ if onProp is not None:
+ doc += '<tr><th>Restriction on %s</th><td>' % getTermLink(onProp)
+
+ prop_str = ''
+ last_pred = None
+ first = True
+ for p in findStatements(m, r, None, None):
+ if (getPredicate(p) == owl.onProperty
+ or getPredicate(p) == rdfs.comment
+ or (getPredicate(p) == rdf.type and getObject(p) == owl.Restriction)
+ or getPredicate(p) == lv2.documentation):
+ last_pred = None
+ continue
+
+ if getPredicate(p) != last_pred:
+ prop_str += '<tr><th>%s</th>\n' % getTermLink(getPredicate(p))
+ first = True
+ if isResource(getObject(p)):
+ prop_str += getProperty(getTermLink(getObject(p)), first)
+ first = False
+ elif isLiteral(getObject(p)):
+ prop_str += getProperty(getLiteralString(getObject(p)), first)
+ first = False
+
+ last_pred = getPredicate(p)
+
+ prop_str += endProperties(first)
+
+ if prop_str != '':
+ doc += '<table class=\"restriction\">%s</table>\n' % prop_str
+ if comment is not None:
+ doc += "<span>%s</span>\n" % getLiteralString(comment)
+ doc += '</td></tr>'
+
+ # Find out about properties which have rdfs:domain of t
+ d = classdomains.get(str(term), "")
+ if d:
+ d.sort()
+ dlist = ''
+ first = True
+ for k in d:
+ dlist += getProperty(getTermLink(k), first)
+ first = False
+ doc += "<tr><th>In domain of</th>%s" % dlist
+
+ # Find out about properties which have rdfs:range of t
+ r = classranges.get(str(term), "")
+ if r:
+ r.sort()
+ rlist = ''
+ first = True
+ for k in r:
+ rlist += getProperty(getTermLink(k), first)
+ first = False
+ doc += "<tr><th>In range of</th>%s" % rlist
+
+ return doc
+
+
+def isSpecial(pred):
+ """Return True if the predicate is "special" and shouldn't be emitted generically"""
+ return pred in [rdf.type, rdfs.range, rdfs.domain, rdfs.label, rdfs.comment, rdfs.subClassOf, rdfs.subPropertyOf, lv2.documentation]
+
+
+def blankNodeDesc(node, m):
+ properties = findStatements(m, node, None, None)
+ doc = ''
+ last_pred = ''
+ for p in sorted(properties):
+ if isSpecial(getPredicate(p)):
+ continue
+ doc += '<tr>'
+ doc += '<td class="blankterm">%s</td>\n' % getTermLink(getPredicate(p))
+ if isResource(getObject(p)):
+ doc += '<td class="blankdef">%s</td>\n' % getTermLink(getObject(p))
+ # getTermLink(str(getObject(p)), node, getPredicate(p))
+ elif isLiteral(getObject(p)):
+ doc += '<td class="blankdef">%s</td>\n' % getLiteralString(getObject(p))
+ elif isBlank(getObject(p)):
+ doc += '<td class="blankdef">' + blankNodeDesc(getObject(p), m) + '</td>\n'
+ else:
+ doc += '<td class="blankdef">?</td>\n'
+ doc += '</tr>'
+ if doc != '':
+ doc = '<table class="blankdesc">\n%s\n</table>\n' % doc
+ return doc
+
+
+def extraInfo(term, m):
+ """Generate information about misc. properties of a term"""
+ doc = ""
+ properties = findStatements(m, term, None, None)
+ first = True
+ for p in sorted(properties):
+ if isSpecial(getPredicate(p)):
+ continue
+ doc += '<tr><th>%s</th>\n' % getTermLink(getPredicate(p))
+ if isResource(getObject(p)):
+ doc += getProperty(getTermLink(getObject(p), term, getPredicate(p)), first)
+ elif isLiteral(getObject(p)):
+ doc += getProperty(linkify(str(getObject(p))), first)
+ elif isBlank(getObject(p)):
+ doc += getProperty(str(blankNodeDesc(getObject(p), m)), first)
+ else:
+ doc += getProperty('?', first)
+
+ #doc += endProperties(first)
+
+ return doc
+
+
+def rdfsInstanceInfo(term, m):
+ """Generate rdfs-type information for instances"""
+ doc = ""
+
+ first = True
+ for match in sorted(findStatements(m, term, rdf.type, None)):
+ doc += getProperty(getTermLink(getObject(match),
+ term,
+ rdf.type),
+ first)
+ first = False
+
+ if doc != "":
+ doc = "<tr><th>Type</th>" + doc
+
+ doc += endProperties(first)
+
+ return doc
+
+
+def owlInfo(term, m):
+ """Returns an extra information that is defined about a term using OWL."""
+ res = ''
+
+ # Inverse properties ( owl:inverseOf )
+ first = True
+ for st in findStatements(m, term, owl.inverseOf, None):
+ res += getProperty(getTermLink(getObject(st)), first)
+ first = False
+ if res != "":
+ res += endProperties(first)
+ res = "<tr><th>Inverse:</th>\n" + res
+
+ def owlTypeInfo(term, propertyType, name):
+ if findOne(m, term, rdf.type, propertyType):
+ return "<tr><th>OWL Type</th><td>%s</td></tr>\n" % name
+ else:
+ return ""
+
+ res += owlTypeInfo(term, owl.DatatypeProperty, "Datatype Property")
+ res += owlTypeInfo(term, owl.ObjectProperty, "Object Property")
+ res += owlTypeInfo(term, owl.AnnotationProperty, "Annotation Property")
+ res += owlTypeInfo(term, owl.InverseFunctionalProperty, "Inverse Functional Property")
+ res += owlTypeInfo(term, owl.SymmetricProperty, "Symmetric Property")
+
+ return res
+
+def isDeprecated(m, subject):
+ deprecated = findOne(m, subject, owl.deprecated, None)
+ return deprecated and (str(deprecated[2]).find("true") >= 0)
+
+def docTerms(category, list, m, classlist, proplist, instalist):
+ """
+ A wrapper class for listing all the terms in a specific class (either
+ Properties, or Classes. Category is 'Property' or 'Class', list is a
+ list of term names (strings), return value is a chunk of HTML.
+ """
+ doc = ""
+ nspre = spec_pre
+ for item in list:
+ t = termName(m, item)
+ if (t.startswith(spec_ns_str)) and (
+ len(t[len(spec_ns_str):].split("/")) < 2):
+ term = t
+ t = t.split(spec_ns_str[-1])[1]
+ curie = "%s:%s" % (nspre, t)
+ else:
+ if t.startswith("http://"):
+ term = t
+ curie = getShortName(t)
+ t = getAnchor(t)
+ else:
+ term = spec_ns[t]
+ curie = "%s:%s" % (nspre, t)
+
+ term_uri = term
+
+ doc += """<div class="specterm" id="%s" about="%s">\n<h3>%s <a href="#%s">%s</a></h3>\n""" % (t, term_uri, category, getAnchor(str(term_uri)), curie)
+
+ label = getLabel(m, term)
+ comment = getComment(m, term, classlist, proplist, instalist)
+ is_deprecated = isDeprecated(m, term)
+
+ doc += '<div class="spectermbody">'
+ if label != '' or comment != '' or is_deprecated:
+ doc += '<div class="description">'
+
+ if label != '':
+ doc += "<div property=\"rdfs:label\" class=\"label\">%s</div>" % label
+
+ if is_deprecated:
+ doc += '<div class="warning">DEPRECATED</div>'
+
+ if comment != '':
+ doc += "<div property=\"rdfs:comment\">%s</div>" % comment
+
+ if label != '' or comment != '' or is_deprecated:
+ doc += "</div>"
+
+ terminfo = ""
+ if category == 'Property':
+ terminfo += owlInfo(term, m)
+ terminfo += rdfsPropertyInfo(term, m)
+ if category == 'Class':
+ terminfo += rdfsClassInfo(term, m)
+ if category == 'Instance':
+ terminfo += rdfsInstanceInfo(term, m)
+
+ terminfo += extraInfo(term, m)
+
+ if (len(terminfo) > 0): # to prevent empty list (bug #882)
+ doc += '\n<table class="terminfo">%s</table>\n' % terminfo
+
+ doc += '</div>'
+ doc += "\n</div>\n\n"
+
+ return doc
+
+
+def getShortName(uri):
+ uri = str(uri)
+ if ("#" in uri):
+ return uri.split("#")[-1]
+ else:
+ return uri.split("/")[-1]
+
+
+def getAnchor(uri):
+ uri = str(uri)
+ if (uri.startswith(spec_ns_str)):
+ return uri[len(spec_ns_str):].replace("/", "_")
+ else:
+ return getShortName(uri)
+
+
+def buildIndex(m, classlist, proplist, instalist=None, filelist=None):
+ if not (classlist or proplist or instalist or filelist):
+ return ''
+
+ head = '<tr>'
+ body = '<tr>'
+
+ def termLink(m, t):
+ if str(t).startswith(spec_ns_str):
+ name = termName(m, t)
+ return '<a href="#%s">%s</a>' % (name, name)
+ else:
+ return '<a href="%s">%s</a>' % (str(t), str(t))
+
+ if (len(classlist) > 0):
+ head += '<th>Classes</th>'
+ body += '<td><ul>'
+ classlist.sort()
+ shown = {}
+ for c in classlist:
+ if c in shown:
+ continue
+
+ # Skip classes that are subclasses of classes defined in this spec
+ local_subclass = False
+ for p in findStatements(m, c, rdfs.subClassOf, None):
+ parent = str(p[2])
+ if parent[0:len(spec_ns_str)] == spec_ns_str:
+ local_subclass = True
+ if local_subclass:
+ continue
+
+ shown[c] = True
+ body += '<li>' + termLink(m, c)
+ def class_tree(c):
+ tree = ''
+ shown[c] = True
+
+ subclasses = []
+ for s in findStatements(m, None, rdfs.subClassOf, c):
+ subclasses += [getSubject(s)]
+ subclasses.sort()
+
+ for s in subclasses:
+ tree += '<li>' + termLink(m, s)
+ tree += class_tree(s)
+ tree += '</li>'
+ if tree != '':
+ tree = '<ul>' + tree + '</ul>'
+ return tree
+ body += class_tree(c)
+ body += '</li>'
+ body += '</ul></td>\n'
+
+ if (len(proplist) > 0):
+ head += '<th>Properties</th>'
+ body += '<td><ul>'
+ proplist.sort()
+ for p in proplist:
+ body += '<li>%s</li>' % termLink(m, p)
+ body += '</ul></td>\n'
+
+ if (instalist is not None and len(instalist) > 0):
+ head += '<th>Instances</th>'
+ body += '<td><ul>'
+ instalist.sort()
+ for i in instalist:
+ p = getShortName(i)
+ anchor = getAnchor(i)
+ body += '<li><a href="#%s">%s</a></li>' % (anchor, p)
+ body += '</ul></td>\n'
+
+ if (filelist is not None and len(filelist) > 0):
+ head += '<th>Files</th>'
+ body += '<td><ul>'
+ filelist.sort()
+ for i in filelist:
+ p = getShortName(i)
+ anchor = getAnchor(i)
+ body += '<li><a href="%s">%s</a></li>' % (i, os.path.basename(i))
+ body += '</ul></td>\n'
+
+ head += '</tr>'
+ body += '</tr>'
+ return '<table class="index"><thead>%s</thead>\n<tbody>%s</tbody></table>' % (head, body)
+
+
+def add(where, key, value):
+ if not key in where:
+ where[key] = []
+ if not value in where[key]:
+ where[key].append(value)
+
+
+def specInformation(m, ns):
+ """
+ Read through the spec (provided as a Redland model) and return classlist
+ and proplist. Global variables classranges and classdomains are also filled
+ as appropriate.
+ """
+ global classranges
+ global classdomains
+
+ # Find the class information: Ranges, domains, and list of all names.
+ classtypes = [rdfs.Class, owl.Class, rdfs.Datatype]
+ classlist = []
+ for onetype in classtypes:
+ for classStatement in findStatements(m, None, rdf.type, onetype):
+ for range in findStatements(m, None, rdfs.range, getSubject(classStatement)):
+ if not isBlank(getSubject(classStatement)):
+ add(classranges,
+ str(getSubject(classStatement)),
+ str(getSubject(range)))
+ for domain in findStatements(m, None, rdfs.domain, getSubject(classStatement)):
+ if not isBlank(getSubject(classStatement)):
+ add(classdomains,
+ str(getSubject(classStatement)),
+ str(getSubject(domain)))
+ if not isBlank(getSubject(classStatement)):
+ klass = getSubject(classStatement)
+ if klass not in classlist and str(klass).startswith(ns):
+ classlist.append(klass)
+
+ # Create a list of properties in the schema.
+ proptypes = [rdf.Property, owl.ObjectProperty, owl.DatatypeProperty, owl.AnnotationProperty]
+ proplist = []
+ for onetype in proptypes:
+ for propertyStatement in findStatements(m, None, rdf.type, onetype):
+ prop = getSubject(propertyStatement)
+ if prop not in proplist and str(prop).startswith(ns):
+ proplist.append(prop)
+
+ return classlist, proplist
+
+
+def specProperty(m, subject, predicate):
+ "Return a property of the spec."
+ for c in findStatements(m, subject, predicate, None):
+ return getLiteralString(getObject(c))
+ return ''
+
+
+def specProperties(m, subject, predicate):
+ "Return a property of the spec."
+ properties = []
+ for c in findStatements(m, subject, predicate, None):
+ properties += [getObject(c)]
+ return properties
+
+
+def specAuthors(m, subject):
+ "Return an HTML description of the authors of the spec."
+
+ subjects = [subject];
+ p = findOne(m, subject, lv2.project, None)
+ if p:
+ subjects += [getObject(p)]
+
+ dev = set()
+ for s in subjects:
+ for i in findStatements(m, s, doap.developer, None):
+ for j in findStatements(m, getObject(i), foaf.name, None):
+ dev.add(getLiteralString(getObject(j)))
+
+ maint = set()
+ for s in subjects:
+ for i in findStatements(m, s, doap.maintainer, None):
+ for j in findStatements(m, getObject(i), foaf.name, None):
+ maint.add(getLiteralString(getObject(j)))
+
+ doc = ''
+
+ devdoc = ''
+ first = True
+ for d in dev:
+ if not first:
+ devdoc += ', '
+ devdoc += '<span class="author" property="doap:developer">%s</span>' % d
+ first = False
+ if len(dev) == 1:
+ doc += '<tr><th class="metahead">Developer</th><td>%s</td></tr>' % devdoc
+ elif len(dev) > 0:
+ doc += '<tr><th class="metahead">Developers</th><td>%s</td></tr>' % devdoc
+
+ maintdoc = ''
+ first = True
+ for m in maint:
+ if not first:
+ maintdoc += ', '
+ maintdoc += '<span class="author" property="doap:maintainer">%s</span>' % m
+ first = False
+ if len(maint) == 1:
+ doc += '<tr><th class="metahead">Maintainer</th><td>%s</td></tr>' % maintdoc
+ elif len(maint) > 0:
+ doc += '<tr><th class="metahead">Maintainers</th><td>%s</td></tr>' % maintdoc
+
+ return doc
+
+
+def releaseChangeset(m, release, prefix=''):
+ changeset = findOne(m, release, dcs.changeset, None)
+ if changeset is None:
+ return ''
+
+ entry = ''
+ #entry = '<dd><ul>\n'
+ for i in sorted(findStatements(m, getObject(changeset), dcs.item, None)):
+ item = getObject(i)
+ label = findOne(m, item, rdfs.label, None)
+ if not label:
+ print("error: dcs:item has no rdfs:label")
+ continue
+
+ text = getLiteralString(getObject(label))
+ if prefix:
+ text = prefix + ': ' + text
+
+ entry += '<li>%s</li>\n' % text
+
+ #entry += '</ul></dd>\n'
+ return entry
+
+
+def specHistoryEntries(m, subject, entries):
+ for r in findStatements(m, subject, doap.release, None):
+ release = getObject(r)
+ revNode = findOne(m, release, doap.revision, None)
+ if not revNode:
+ print("error: doap:release has no doap:revision")
+ continue
+
+ rev = getLiteralString(getObject(revNode))
+
+ created = findOne(m, release, doap.created, None)
+
+ dist = findOne(m, release, doap['file-release'], None)
+ if dist:
+ entry = '<dt><a href="%s">Version %s</a>' % (getObject(dist), rev)
+ else:
+ entry = '<dt>Version %s' % rev
+ #print("warning: doap:release has no doap:file-release")
+
+ if created:
+ entry += ' (%s)</dt>\n' % getLiteralString(getObject(created))
+ else:
+ entry += ' (<span class="warning">EXPERIMENTAL</span>)</dt>'
+
+ entry += '<dd><ul>\n%s' % releaseChangeset(m, release)
+
+ if dist is not None:
+ entries[(getObject(created), getObject(dist))] = entry
+
+ return entries
+
+
+def specHistoryMarkup(entries):
+ if len(entries) > 0:
+ history = '<dl>\n'
+ for e in sorted(entries.keys(), reverse=True):
+ history += entries[e] + '</ul></dd>'
+ history += '</dl>\n'
+ return history
+ else:
+ return ''
+
+
+def specHistory(m, subject):
+ return specHistoryMarkup(specHistoryEntries(m, subject, {}))
+
+
+def specVersion(m, subject):
+ """
+ Return a (minorVersion, microVersion, date) tuple
+ """
+ # Get the date from the latest doap release
+ latest_doap_revision = ""
+ latest_doap_release = None
+ for i in findStatements(m, subject, doap.release, None):
+ for j in findStatements(m, getObject(i), doap.revision, None):
+ revision = getLiteralString(getObject(j))
+ if latest_doap_revision == "" or revision > latest_doap_revision:
+ latest_doap_revision = revision
+ latest_doap_release = getObject(i)
+ date = ""
+ if latest_doap_release is not None:
+ for i in findStatements(m, latest_doap_release, doap.created, None):
+ date = getLiteralString(getObject(i))
+
+ # Get the LV2 version
+ minor_version = 0
+ micro_version = 0
+ for i in findStatements(m, None, lv2.minorVersion, None):
+ minor_version = int(getLiteralString(getObject(i)))
+ for i in findStatements(m, None, lv2.microVersion, None):
+ micro_version = int(getLiteralString(getObject(i)))
+ return (minor_version, micro_version, date)
+
+
+def getInstances(model, classes, properties):
+ """
+ Extract all resources instanced in the ontology
+ (aka "everything that is not a class or a property")
+ """
+ instances = []
+ for c in classes:
+ for i in findStatements(model, None, rdf.type, c):
+ if not isResource(getSubject(i)):
+ continue
+ inst = getSubject(i)
+ if inst not in instances and str(inst) != spec_url:
+ instances.append(inst)
+ for i in findStatements(model, None, rdf.type, None):
+ if ((not isResource(getSubject(i)))
+ or (getSubject(i) in classes)
+ or (getSubject(i) in instances)
+ or (getSubject(i) in properties)):
+ continue
+ full_uri = str(getSubject(i))
+ if (full_uri.startswith(spec_ns_str)):
+ instances.append(getSubject(i))
+ return instances
+
+def load_tags(path, docdir):
+ "Build a (symbol => URI) map from a Doxygen tag file."
+
+ if not path or not docdir:
+ return {}
+
+ def getChildText(elt, tagname):
+ "Return the content of the first child node with a certain tag name."
+ for e in elt.childNodes:
+ if e.nodeType == xml.dom.Node.ELEMENT_NODE and e.tagName == tagname:
+ return e.firstChild.nodeValue
+ return ''
+
+ def linkTo(filename, anchor, sym):
+ if anchor:
+ return '<span><a href="%s/%s#%s">%s</a></span>' % (docdir, filename, anchor, sym)
+ else:
+ return '<span><a href="%s/%s">%s</a></span>' % (docdir, filename, sym)
+
+ tagdoc = xml.dom.minidom.parse(path)
+ root = tagdoc.documentElement
+ linkmap = {}
+ for cn in root.childNodes:
+ if (cn.nodeType == xml.dom.Node.ELEMENT_NODE
+ and cn.tagName == 'compound'
+ and cn.getAttribute('kind') != 'page'):
+
+ name = getChildText(cn, 'name')
+ filename = getChildText(cn, 'filename')
+ anchor = getChildText(cn, 'anchor')
+ if not filename.endswith('.html'):
+ filename += '.html'
+
+ if cn.getAttribute('kind') != 'group':
+ linkmap[name] = linkTo(filename, anchor, name)
+
+ prefix = ''
+ if cn.getAttribute('kind') == 'struct':
+ prefix = name + '::'
+
+ members = cn.getElementsByTagName('member')
+ for m in members:
+ mname = prefix + getChildText(m, 'name')
+ mafile = getChildText(m, 'anchorfile')
+ manchor = getChildText(m, 'anchor')
+ linkmap[mname] = linkTo(mafile, manchor, mname)
+
+ return linkmap
+
+
+def writeIndex(model, specloc, index_path, root_path, root_uri):
+ # Get extension URI
+ ext_node = model.value(None, rdf.type, lv2.Specification)
+ if not ext_node:
+ ext_node = model.value(None, rdf.type, owl.Ontology)
+ if not ext_node:
+ print('no extension found in %s' % bundle)
+ sys.exit(1)
+
+ ext = str(ext_node)
+
+ # Get version
+ minor = 0
+ micro = 0
+ try:
+ minor = int(model.value(ext_node, lv2.minorVersion, None))
+ micro = int(model.value(ext_node, lv2.microVersion, None))
+ except:
+ e = sys.exc_info()[1]
+ print('warning: %s: failed to find version for %s' % (bundle, ext))
+
+ # Get date
+ date = None
+ for r in model.triples([ext_node, doap.release, None]):
+ revision = model.value(r[2], doap.revision, None)
+ if str(revision) == ('%d.%d' % (minor, micro)):
+ date = model.value(r[2], doap.created, None)
+ break
+
+ # Verify that this date is the latest
+ for r in model.triples([ext_node, doap.release, None]):
+ this_date = model.value(r[2], doap.created, None)
+ if this_date > date:
+ print('warning: %s revision %d.%d (%s) is not the latest release' % (
+ ext_node, minor, micro, date))
+ break
+
+ # Get name and short description
+ name = model.value(ext_node, doap.name, None)
+ shortdesc = model.value(ext_node, doap.shortdesc, None)
+
+ # Chop 'LV2' prefix from name for cleaner index
+ if name.startswith('LV2 '):
+ name = name[4:]
+
+ # Find relative link target
+ if root_uri and ext_node.startswith(root_uri):
+ target = ext_node[len(root_uri):]
+ else:
+ target = os.path.relpath(ext_node, root_path)
+
+ # Specification (comment is to act as a sort key)
+ if not options.online_docs:
+ target += '/' + os.path.basename(target) + '.html'
+ row = '<tr><!-- %s --><td><a rel="rdfs:seeAlso" href="%s">%s</a></td>' % (
+ b, target, name)
+
+ # API
+ row += '<td><a rel="rdfs:seeAlso" href="../doc/html/group__%s.html">%s</a></td>' % (
+ b, b)
+
+ # Description
+ if shortdesc:
+ row += '<td>' + str(shortdesc) + '</td>'
+ else:
+ row += '<td></td>'
+
+ # Version
+ version_str = '%s.%s' % (minor, micro)
+ if minor == 0 or (micro % 2 != 0):
+ row += '<td><span style="color: red">' + version_str + '</span></td>'
+ else:
+ row += '<td>' + version_str + '</td>'
+
+ # Status
+ deprecated = model.value(ext_node, owl.deprecated, None)
+ if minor == 0:
+ row += '<td><span class="error">Experimental</span></td>'
+ elif deprecated and str(deprecated[2]) != "false":
+ row += '<td><span class="warning">Deprecated</span></td>'
+ elif micro % 2 == 0:
+ row += '<td><span class="success">Stable</span></td>'
+
+ row += '</tr>'
+
+ # index = open(os.path.join(out, 'index_rows', b), 'w')
+ index = open(index_path, 'w')
+ index.write(row)
+ index.close()
+
+
+def specgen(specloc, indir, style_uri, docdir, tags, opts, instances=False, root_link=None, index_path=None, root_path=None, root_uri=None):
+ """The meat and potatoes: Everything starts here."""
+
+ global spec_bundle
+ global spec_url
+ global spec_ns_str
+ global spec_ns
+ global spec_pre
+ global ns_list
+ global specgendir
+ global linkmap
+
+ spec_bundle = "file://%s/" % os.path.abspath(os.path.dirname(specloc))
+ specgendir = os.path.abspath(indir)
+
+ # Template
+ temploc = os.path.join(indir, "template.html")
+ template = None
+ f = open(temploc, "r")
+ template = f.read()
+ f.close()
+
+ # Load code documentation link map from tags file
+ linkmap = load_tags(tags, docdir)
+
+ m = rdflib.ConjunctiveGraph()
+ manifest_path = os.path.join(os.path.dirname(specloc), 'manifest.ttl')
+ if os.path.exists(manifest_path):
+ m.parse(manifest_path, format='n3')
+ m.parse(specloc, format='n3')
+
+ bundle_path = os.path.split(specloc[specloc.find(':') + 1:])[0]
+ abs_bundle_path = os.path.abspath(bundle_path)
+ spec_url = getOntologyNS(m)
+ spec = rdflib.URIRef(spec_url)
+
+ # Load all seeAlso files recursively
+ seeAlso = set()
+ done = False
+ while not done:
+ done = True
+ for uri in specProperties(m, spec, rdfs.seeAlso):
+ if uri[:7] == 'file://':
+ path = uri[7:]
+ if (path != os.path.abspath(specloc) and
+ path.endswith('ttl') and
+ path not in seeAlso):
+ seeAlso.add(path)
+ m.parse(path, format='n3')
+ done = False
+
+ spec_ns_str = spec_url
+ if (spec_ns_str[-1] != "/" and spec_ns_str[-1] != "#"):
+ spec_ns_str += "#"
+
+ spec_ns = rdflib.Namespace(spec_ns_str)
+
+ namespaces = getNamespaces(m)
+ keys = sorted(namespaces.keys())
+ prefixes_html = "<span>"
+ for i in keys:
+ uri = namespaces[i]
+ if uri.startswith('file:'):
+ continue;
+ ns_list[str(uri)] = i
+ if (str(uri) == spec_url + '#' or
+ str(uri) == spec_url + '/' or
+ str(uri) == spec_url):
+ spec_pre = i
+ prefixes_html += '<a href="%s">%s</a> ' % (uri, i)
+ prefixes_html += "</span>"
+
+ if spec_pre is None:
+ print('No namespace prefix for %s defined' % specloc)
+ sys.exit(1)
+
+ ns_list[spec_ns_str] = spec_pre
+
+ classlist, proplist = specInformation(m, spec_ns_str)
+ classlist = sorted(classlist)
+ proplist = sorted(proplist)
+
+ instalist = None
+ if instances:
+ instalist = sorted(getInstances(m, classlist, proplist),
+ key=lambda x: getShortName(x).lower())
+
+ filelist = []
+ see_also_files = specProperties(m, spec, rdfs.seeAlso)
+ see_also_files.sort()
+ for f in see_also_files:
+ uri = str(f)
+ if uri[:7] == 'file://':
+ uri = uri[7:]
+ if uri[:len(abs_bundle_path)] == abs_bundle_path:
+ uri = uri[len(abs_bundle_path) + 1:]
+ else:
+ continue # Skip seeAlso file outside bundle
+
+ filelist += [uri]
+
+ azlist = buildIndex(m, classlist, proplist, instalist, filelist)
+
+ # Generate Term HTML
+ termlist = docTerms('Property', proplist, m, classlist, proplist, instalist)
+ termlist = docTerms('Class', classlist, m, classlist, proplist, instalist) + termlist
+ if instances:
+ termlist += docTerms('Instance', instalist, m, classlist, proplist, instalist)
+
+ name = specProperty(m, spec, doap.name)
+ title = name
+ if root_link:
+ name = '<a href="%s">%s</a>' % (root_link, name)
+
+ template = template.replace('@TITLE@', title)
+ template = template.replace('@NAME@', name)
+ template = template.replace('@SHORT_DESC@', specProperty(m, spec, doap.shortdesc))
+ template = template.replace('@URI@', spec)
+ template = template.replace('@PREFIX@', spec_pre)
+ if spec_pre == 'lv2':
+ template = template.replace('@XMLNS@', '')
+ else:
+ template = template.replace('@XMLNS@', ' xmlns:%s="%s"' % (spec_pre, spec_ns_str))
+
+ filename = os.path.basename(specloc)
+ basename = filename[0:filename.rfind('.')]
+
+ template = template.replace('@STYLE_URI@', style_uri)
+ template = template.replace('@PREFIXES@', str(prefixes_html))
+ template = template.replace('@BASE@', spec_ns_str)
+ template = template.replace('@AUTHORS@', specAuthors(m, spec))
+ template = template.replace('@INDEX@', azlist)
+ template = template.replace('@REFERENCE@', termlist)
+ template = template.replace('@FILENAME@', filename)
+ template = template.replace('@HEADER@', basename + '.h')
+ template = template.replace('@HISTORY@', specHistory(m, spec))
+
+ mail_row = ''
+ if 'list_email' in opts:
+ mail_row = '<tr><th>Discuss</th><td><a href="mailto:%s">%s</a>' % (
+ opts['list_email'], opts['list_email'])
+ if 'list_page' in opts:
+ mail_row += ' <a href="%s">(subscribe)</a>' % opts['list_page']
+ mail_row += '</td></tr>'
+ template = template.replace('@MAIL@', mail_row)
+
+ version = specVersion(m, spec) # (minor, micro, date)
+ date_string = version[2]
+ if date_string == "":
+ date_string = "Undated"
+
+ version_string = "%s.%s" % (version[0], version[1])
+ experimental = (version[0] == 0 or version[1] % 2 == 1)
+ if experimental:
+ version_string += ' <span class="warning">EXPERIMENTAL</span>'
+
+ if isDeprecated(m, rdflib.URIRef(spec_url)):
+ version_string += ' <span class="warning">DEPRECATED</span>'
+
+ template = template.replace('@VERSION@', version_string)
+
+ content_links = ''
+ if docdir is not None:
+ content_links = '<li><a href="%s">API</a></li>' % os.path.join(docdir, 'group__%s.html' % basename)
+
+ template = template.replace('@CONTENT_LINKS@', content_links)
+
+ comment = getComment(m, rdflib.URIRef(spec_url), classlist, proplist, instalist)
+ if comment != '':
+ template = template.replace('@COMMENT@', comment)
+ else:
+ template = template.replace('@COMMENT@', '')
+
+ now = int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))
+ build_date = datetime.datetime.utcfromtimestamp(now)
+ template = template.replace('@DATE@', build_date.strftime('%F'))
+ template = template.replace('@TIME@', build_date.strftime('%F %H:%M UTC'))
+
+ # Write index row
+ if index_path is not None:
+ writeIndex(m, specloc, index_path, root_path, root_uri)
+
+ return template
+
+
+def save(path, text):
+ try:
+ f = open(path, "w")
+ f.write(text)
+ f.flush()
+ f.close()
+ except Exception:
+ e = sys.exc_info()[1]
+ print('Error writing to file "' + path + '": ' + str(e))
+
+
+def getNamespaces(m):
+ """Return a prefix:URI dictionary of all namespaces seen during parsing"""
+ nspaces = {}
+ for prefix, uri in m.namespaces():
+ if not re.match('default[0-9]*', prefix) and not prefix == 'xml':
+ # Skip silly default namespaces added by rdflib
+ nspaces[prefix] = uri
+ return nspaces
+
+
+def getOntologyNS(m):
+ ns = None
+ s = findOne(m, None, rdf.type, lv2.Specification)
+ if not s:
+ s = findOne(m, None, rdf.type, owl.Ontology)
+ if s:
+ if not isBlank(getSubject(s)):
+ ns = str(getSubject(s))
+
+ if (ns == None):
+ sys.exit("Impossible to get ontology's namespace")
+ else:
+ return ns
+
+
+def usage():
+ script = os.path.basename(sys.argv[0])
+ return "Usage: %s ONTOLOGY_TTL OUTPUT_HTML [OPTION]..." % script
+
+if __name__ == "__main__":
+ """Ontology specification generator tool"""
+
+ indir = os.path.abspath(os.path.dirname(sys.argv[0]))
+ if not os.path.exists(os.path.join(indir, 'template.html')):
+ indir = os.path.join(os.path.dirname(indir), 'share', 'lv2specgen')
+
+ opt = optparse.OptionParser(usage=usage(),
+ description='Write HTML documentation for an RDF ontology.')
+ opt.add_option('--list-email', type='string', dest='list_email',
+ help='Mailing list email address')
+ opt.add_option('--list-page', type='string', dest='list_page',
+ help='Mailing list info page address')
+ opt.add_option('--template-dir', type='string', dest='template_dir', default=indir,
+ help='Template directory')
+ opt.add_option('--style-uri', type='string', dest='style_uri', default='style.css',
+ help='Stylesheet URI')
+ opt.add_option('--docdir', type='string', dest='docdir', default=None,
+ help='Doxygen output directory')
+ opt.add_option('--index', type='string', dest='index_path', default=None,
+ help='Index row output file')
+ opt.add_option('--tags', type='string', dest='tags', default=None,
+ help='Doxygen tags file')
+ opt.add_option('-r', '--root-path', type='string', dest='root_path', default='',
+ help='Root path')
+ opt.add_option('-R', '--root-uri', type='string', dest='root_uri', default='',
+ help='Root URI')
+ opt.add_option('-p', '--prefix', type='string', dest='prefix',
+ help='Specification Turtle prefix')
+ opt.add_option('-i', '--instances', action='store_true', dest='instances',
+ help='Document instances')
+ opt.add_option('--copy-style', action='store_true', dest='copy_style',
+ help='Copy style from template directory to output directory')
+ opt.add_option('--online', action='store_true', dest='online_docs',
+ help='Generate online documentation')
+
+ (options, args) = opt.parse_args()
+ opts = vars(options)
+
+ if len(args) < 2:
+ opt.print_help()
+ sys.exit(-1)
+
+ spec_pre = options.prefix
+ ontology = "file:" + str(args[0])
+ output = args[1]
+ index_path = options.index_path
+ docdir = options.docdir
+ tags = options.tags
+
+ out = '.'
+ spec = args[0]
+ path = os.path.dirname(spec)
+ outdir = os.path.abspath(os.path.join(out, path))
+
+ bundle = str(outdir)
+ b = os.path.basename(outdir)
+
+ if not os.access(os.path.abspath(spec), os.R_OK):
+ print('warning: extension %s has no %s.ttl file' % (b, b))
+ sys.exit(1)
+
+ # Root link
+ root_path = opts['root_path']
+ root_uri = opts['root_uri']
+ root_link = os.path.relpath(root_path, path) if root_path else '.'
+ if not options.online_docs:
+ root_link = os.path.join(root_link, 'index.html')
+
+ # Generate spec documentation
+ specdoc = specgen(
+ spec,
+ indir,
+ opts['style_uri'],
+ docdir,
+ tags,
+ opts,
+ instances=True,
+ root_link=root_link,
+ index_path=index_path,
+ root_path=root_path,
+ root_uri=root_uri)
+
+ # Save to HTML output file
+ save(output, specdoc)
+
+ if opts['copy_style']:
+ import shutil
+ shutil.copyfile(os.path.join(indir, 'style.css'),
+ os.path.join(os.path.dirname(output), 'style.css'))
diff --git a/lv2specgen/style.css b/lv2specgen/style.css
new file mode 120000
index 0000000..f320096
--- /dev/null
+++ b/lv2specgen/style.css
@@ -0,0 +1 @@
+../doc/style.css \ No newline at end of file
diff --git a/lv2specgen/template.html b/lv2specgen/template.html
new file mode 100644
index 0000000..5056aef
--- /dev/null
+++ b/lv2specgen/template.html
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+<html about="@URI@"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:dct="http://purl.org/dc/terms/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:lv2="http://lv2plug.in/ns/lv2core#"
+ @XMLNS@
+ xml:lang="en">
+ <head>
+ <title>@TITLE@</title>
+ <meta http-equiv="content-type" content="text/xhtml+xml; charset=utf-8" />
+ <meta name="generator" content="lv2specgen" />
+ <link href="@STYLE_URI@" rel="stylesheet" type="text/css" />
+ </head>
+ <body>
+
+ <!-- HEADER -->
+ <div id="topbar">
+ <div id="header">
+ <div id="titlebox">
+ <h1 id="title">@NAME@</h1>
+ <div id="subtitle"><a href="@URI@">@URI@</a></div>
+ <div id="shortdesc">@SHORT_DESC@</div>
+ </div>
+ <table id="meta">
+ <!--<tr><th>URI</th><td><a href="@URI@">@URI@</a></td></tr>
+ <tr><th>Version</th><td>@REVISION@</td></tr>-->
+ <!--<tr><th>Prefixes</th><td>@PREFIXES@</td></tr>-->
+ <tr><th>Version</th><td>@VERSION@</td></tr>
+ <tr><th>Date</th><td>@DATE@</td></tr>
+ @MAIL@
+ @AUTHORS@
+ </table>
+ </div>
+ <ul id="contents">
+ <!-- <li><a href="#sec-description">Description</a></li> -->
+ <li><a href="#sec-index">Index</a></li>
+ <li><a href="#sec-reference">Reference</a></li>
+ <li><a href="#sec-history">History</a></li>
+ @CONTENT_LINKS@
+ </ul>
+ </div>
+
+ <!-- DESCRIPTION -->
+ <!--<h2 class="sec" id="sec-description">Description</h2>-->
+ <div class="content">@COMMENT@</div>
+
+ <!-- INDEX -->
+ <h2 class="sec" id="sec-index">Index</h2>
+ <div class="content" id="index">
+ @INDEX@
+ </div>
+
+ <!-- DOCUMENTATION -->
+ <h2 class="sec" id="sec-reference">Reference</h2>
+ <div class="content">
+ @REFERENCE@
+ </div>
+
+ <!-- HISTORY -->
+ <h2 class="sec" id="sec-history">History</h2>
+ <div class="content">
+ @HISTORY@
+ </div>
+
+ <!-- FOOTER -->
+ <div id="footer">
+ <div>
+ This document is available under the
+ <a about="" rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">
+ Creative Commons Attribution-ShareAlike License
+ </a>
+ </div>
+ <div>
+ Valid
+ <a about="" rel="dct:conformsTo" resource="http://www.w3.org/TR/rdfa-syntax"
+ href="http://validator.w3.org/check?uri=referer">
+ XHTML+RDFa
+ </a>
+ and
+ <a about="" rel="dct:conformsTo" resource="http://www.w3.org/TR/CSS2"
+ href="http://jigsaw.w3.org/css-validator/check/referer">
+ CSS
+ </a>
+ generated from @FILENAME@ by <a href="http://drobilla.net/software/lv2specgen">lv2specgen</a>
+ </div>
+ </div>
+
+ </body>
+</html>