aboutsummaryrefslogtreecommitdiffstats
path: root/lib/docbuilder
diff options
context:
space:
mode:
Diffstat (limited to 'lib/docbuilder')
-rw-r--r--lib/docbuilder/AUTHORS10
-rw-r--r--lib/docbuilder/Makefile37
-rw-r--r--lib/docbuilder/doc/html/.gitignore0
-rw-r--r--lib/docbuilder/doc/man3/.gitignore0
-rw-r--r--lib/docbuilder/doc/man6/.gitignore0
-rw-r--r--lib/docbuilder/doc/pdf/.gitignore0
-rw-r--r--lib/docbuilder/doc/src/Makefile132
-rw-r--r--lib/docbuilder/doc/src/block_tags.xml431
-rw-r--r--lib/docbuilder/doc/src/book.xml50
-rw-r--r--lib/docbuilder/doc/src/character_entities.xml546
-rw-r--r--lib/docbuilder/doc/src/docb_gen.xml213
-rw-r--r--lib/docbuilder/doc/src/docb_transform.xml224
-rw-r--r--lib/docbuilder/doc/src/docb_xml_check.xml59
-rw-r--r--lib/docbuilder/doc/src/docbuilder_app.xml57
-rw-r--r--lib/docbuilder/doc/src/fasc_dtds.xml115
-rw-r--r--lib/docbuilder/doc/src/fascicules.xml15
-rw-r--r--lib/docbuilder/doc/src/gazonk17
-rw-r--r--lib/docbuilder/doc/src/header_tags.xml183
-rw-r--r--lib/docbuilder/doc/src/inline_tags.xml254
-rw-r--r--lib/docbuilder/doc/src/make.dep33
-rw-r--r--lib/docbuilder/doc/src/man.gifbin0 -> 6048 bytes
-rw-r--r--lib/docbuilder/doc/src/man.ps750
-rw-r--r--lib/docbuilder/doc/src/notes.xml156
-rw-r--r--lib/docbuilder/doc/src/overview.xml185
-rw-r--r--lib/docbuilder/doc/src/part.xml43
-rw-r--r--lib/docbuilder/doc/src/part_notes.xml37
-rw-r--r--lib/docbuilder/doc/src/ref_man.xml40
-rw-r--r--lib/docbuilder/doc/src/refman_dtds.xml667
-rw-r--r--lib/docbuilder/doc/src/user_guide_dtds.xml181
-rw-r--r--lib/docbuilder/dtd/Makefile91
-rw-r--r--lib/docbuilder/dtd/application.dtd29
-rw-r--r--lib/docbuilder/dtd/appref.dtd33
-rw-r--r--lib/docbuilder/dtd/book.dtd73
-rw-r--r--lib/docbuilder/dtd/bookinsidecover.dtd36
-rw-r--r--lib/docbuilder/dtd/chapter.dtd36
-rw-r--r--lib/docbuilder/dtd/cites.dtd35
-rw-r--r--lib/docbuilder/dtd/common.dtd87
-rw-r--r--lib/docbuilder/dtd/common.entities.dtd24
-rw-r--r--lib/docbuilder/dtd/common.header.dtd42
-rw-r--r--lib/docbuilder/dtd/common.image.dtd21
-rw-r--r--lib/docbuilder/dtd/common.refs.dtd40
-rw-r--r--lib/docbuilder/dtd/common.table.dtd25
-rw-r--r--lib/docbuilder/dtd/comref.dtd31
-rw-r--r--lib/docbuilder/dtd/cref.dtd34
-rw-r--r--lib/docbuilder/dtd/erlref.dtd31
-rw-r--r--lib/docbuilder/dtd/fascicules.dtd35
-rw-r--r--lib/docbuilder/dtd/fileref.dtd31
-rw-r--r--lib/docbuilder/dtd/part.dtd29
-rw-r--r--lib/docbuilder/dtd/report.dtd138
-rw-r--r--lib/docbuilder/dtd/terms.dtd36
-rw-r--r--lib/docbuilder/dtd/xhtml-lat1.ent196
-rw-r--r--lib/docbuilder/dtd/xhtml-special.ent80
-rw-r--r--lib/docbuilder/dtd/xhtml-symbol.ent237
-rw-r--r--lib/docbuilder/dtd/xhtml1-frameset.dtd1235
-rw-r--r--lib/docbuilder/dtd/xhtml1-strict.dtd978
-rw-r--r--lib/docbuilder/dtd/xhtml1-transitional.dtd1201
-rw-r--r--lib/docbuilder/ebin/.gitignore0
-rw-r--r--lib/docbuilder/etc/Makefile67
-rw-r--r--lib/docbuilder/etc/note.gifbin0 -> 1539 bytes
-rw-r--r--lib/docbuilder/etc/warning.gifbin0 -> 1498 bytes
-rw-r--r--lib/docbuilder/info2
-rw-r--r--lib/docbuilder/src/Makefile121
-rw-r--r--lib/docbuilder/src/docb_edoc_xml_cb.erl1163
-rw-r--r--lib/docbuilder/src/docb_gen.erl138
-rw-r--r--lib/docbuilder/src/docb_html.erl394
-rw-r--r--lib/docbuilder/src/docb_html_layout.erl380
-rw-r--r--lib/docbuilder/src/docb_html_ref.erl79
-rw-r--r--lib/docbuilder/src/docb_html_util.erl543
-rw-r--r--lib/docbuilder/src/docb_html_util_iso.erl204
-rw-r--r--lib/docbuilder/src/docb_main.erl651
-rw-r--r--lib/docbuilder/src/docb_pretty_format.erl177
-rw-r--r--lib/docbuilder/src/docb_tr_application2html.erl288
-rw-r--r--lib/docbuilder/src/docb_tr_appref2html.erl48
-rw-r--r--lib/docbuilder/src/docb_tr_chapter2html.erl59
-rw-r--r--lib/docbuilder/src/docb_tr_cite2html.erl136
-rw-r--r--lib/docbuilder/src/docb_tr_comref2html.erl46
-rw-r--r--lib/docbuilder/src/docb_tr_cref2html.erl61
-rw-r--r--lib/docbuilder/src/docb_tr_erlref2html.erl46
-rw-r--r--lib/docbuilder/src/docb_tr_fileref2html.erl46
-rw-r--r--lib/docbuilder/src/docb_tr_first2html.erl46
-rw-r--r--lib/docbuilder/src/docb_tr_index2html.erl197
-rw-r--r--lib/docbuilder/src/docb_tr_part2html.erl240
-rw-r--r--lib/docbuilder/src/docb_tr_refs2kwic.erl156
-rw-r--r--lib/docbuilder/src/docb_tr_report2html.erl70
-rw-r--r--lib/docbuilder/src/docb_tr_term2html.erl126
-rw-r--r--lib/docbuilder/src/docb_transform.erl161
-rw-r--r--lib/docbuilder/src/docb_util.erl237
-rw-r--r--lib/docbuilder/src/docb_util.hrl34
-rw-r--r--lib/docbuilder/src/docb_xmerl_tree_cb.erl343
-rw-r--r--lib/docbuilder/src/docb_xmerl_xml_cb.erl88
-rw-r--r--lib/docbuilder/src/docb_xml_check.erl44
-rw-r--r--lib/docbuilder/src/docbuilder.app.src37
-rw-r--r--lib/docbuilder/src/docbuilder.appup.src1
-rw-r--r--lib/docbuilder/test/Makefile80
-rw-r--r--lib/docbuilder/test/docb_SUITE.erl31
-rwxr-xr-xlib/docbuilder/test/docb_SUITE_data/cdata_problem.xml22
-rw-r--r--lib/docbuilder/vsn.mk12
-rwxr-xr-xlib/docbuilder/xsd/application.xsd31
-rwxr-xr-xlib/docbuilder/xsd/appref.xsd27
-rwxr-xr-xlib/docbuilder/xsd/book.xsd292
-rwxr-xr-xlib/docbuilder/xsd/chapter.xsd45
-rwxr-xr-xlib/docbuilder/xsd/common.entities.xsd2
-rwxr-xr-xlib/docbuilder/xsd/common.header.xsd29
-rwxr-xr-xlib/docbuilder/xsd/common.image.xsd18
-rwxr-xr-xlib/docbuilder/xsd/common.refs.xsd102
-rwxr-xr-xlib/docbuilder/xsd/common.table.xsd42
-rwxr-xr-xlib/docbuilder/xsd/common.xsd212
-rwxr-xr-xlib/docbuilder/xsd/comref.xsd26
-rwxr-xr-xlib/docbuilder/xsd/cref.xsd35
-rwxr-xr-xlib/docbuilder/xsd/erlref.xsd26
-rwxr-xr-xlib/docbuilder/xsd/fascicules.xsd25
-rwxr-xr-xlib/docbuilder/xsd/fileref.xsd26
-rwxr-xr-xlib/docbuilder/xsd/part.xsd31
113 files changed, 16842 insertions, 0 deletions
diff --git a/lib/docbuilder/AUTHORS b/lib/docbuilder/AUTHORS
new file mode 100644
index 0000000000..4f2a8e9361
--- /dev/null
+++ b/lib/docbuilder/AUTHORS
@@ -0,0 +1,10 @@
+Docbuilder is a rewrite of the Old docbuilder
+and takes XML as input instead of SGML.
+Docbuilder makes use of xmerl for parsing XML
+and produces HTML. Everything is written in Erlang
+and there are no dependencies to external tools.
+
+Original Authors:
+Gunilla Arendt
+
+Contributors:
diff --git a/lib/docbuilder/Makefile b/lib/docbuilder/Makefile
new file mode 100644
index 0000000000..21f42421d6
--- /dev/null
+++ b/lib/docbuilder/Makefile
@@ -0,0 +1,37 @@
+# ``The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved via the world wide web at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+# AB. All Rights Reserved.''
+#
+# $Id$
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+#
+# Macros
+#
+
+SUB_DIRECTORIES = src dtd etc doc/src
+
+include vsn.mk
+VSN = $(DOCB_VSN)
+
+SPECIAL_TARGETS =
+
+#
+# Default Subdir Targets
+#
+include $(ERL_TOP)/make/otp_subdir.mk
+
+
diff --git a/lib/docbuilder/doc/html/.gitignore b/lib/docbuilder/doc/html/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/docbuilder/doc/html/.gitignore
diff --git a/lib/docbuilder/doc/man3/.gitignore b/lib/docbuilder/doc/man3/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/docbuilder/doc/man3/.gitignore
diff --git a/lib/docbuilder/doc/man6/.gitignore b/lib/docbuilder/doc/man6/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/docbuilder/doc/man6/.gitignore
diff --git a/lib/docbuilder/doc/pdf/.gitignore b/lib/docbuilder/doc/pdf/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/docbuilder/doc/pdf/.gitignore
diff --git a/lib/docbuilder/doc/src/Makefile b/lib/docbuilder/doc/src/Makefile
new file mode 100644
index 0000000000..ae34266844
--- /dev/null
+++ b/lib/docbuilder/doc/src/Makefile
@@ -0,0 +1,132 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+#
+# The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved online at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# %CopyrightEnd%
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../../vsn.mk
+VSN=$(DOCB_VSN)
+APPLICATION=docbuilder
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
+
+# ----------------------------------------------------
+# Target Specs
+# ----------------------------------------------------
+XML_APPLICATION_FILES = ref_man.xml
+XML_REF3_FILES = \
+ docb_gen.xml \
+ docb_transform.xml \
+ docb_xml_check.xml
+XML_REF6_FILES = \
+ docbuilder_app.xml
+
+XML_PART_FILES = part.xml part_notes.xml
+XML_CHAPTER_FILES = \
+ overview.xml \
+ user_guide_dtds.xml \
+ refman_dtds.xml \
+ fasc_dtds.xml \
+ header_tags.xml \
+ block_tags.xml \
+ inline_tags.xml \
+ character_entities.xml \
+ notes.xml
+
+BOOK_FILES = book.xml
+
+GIF_FILES = \
+ man.gif
+
+
+XML_FILES = \
+ $(BOOK_FILES) $(XML_CHAPTER_FILES) \
+ $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_REF6_FILES) \
+ $(XML_APPLICATION_FILES)
+
+# ----------------------------------------------------
+
+HTML_FILES = \
+ $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
+ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html)
+
+INFO_FILE = ../../info
+
+MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
+MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6)
+
+HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
+
+TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+DVIPS_FLAGS +=
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+$(HTMLDIR)/%.gif: %.gif
+ $(INSTALL_DATA) $< $@
+
+docs: pdf html man
+
+$(TOP_PDF_FILE): $(XML_FILES)
+
+pdf: $(TOP_PDF_FILE)
+
+html: gifs $(HTML_REF_MAN_FILE)
+
+man: $(MAN3_FILES) $(MAN6_FILES)
+
+gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
+
+debug opt:
+
+clean clean_docs:
+ rm -rf $(HTMLDIR)/*
+ rm -f $(MAN3DIR)/*
+ rm -f $(MAN6DIR)/*
+ rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
+ rm -f errs core *~
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_docs_spec: docs
+ $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf
+ $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf
+ $(INSTALL_DIR) $(RELSYSDIR)/doc/html
+ $(INSTALL_DATA) $(HTMLDIR)/* \
+ $(RELSYSDIR)/doc/html
+ $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR)
+ $(INSTALL_DIR) $(RELEASE_PATH)/man/man3
+ $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3
+ $(INSTALL_DIR) $(RELEASE_PATH)/man/man6
+ $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6
+
+release_spec:
diff --git a/lib/docbuilder/doc/src/block_tags.xml b/lib/docbuilder/doc/src/block_tags.xml
new file mode 100644
index 0000000000..f5ba083f38
--- /dev/null
+++ b/lib/docbuilder/doc/src/block_tags.xml
@@ -0,0 +1,431 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Block Tags</title>
+ <prepared/>
+ <docno/>
+ <date/>
+ <rev/>
+ <file>block_tags.xml</file>
+ </header>
+
+ <p>Block tags typically define a separate block of information, such
+ as a paragraph or a list.</p>
+
+ <p>The following subset of block tags are common for all DTDs in
+ the DocBuilder DTD suite:
+ <marker id="block_subset"></marker>
+ <seealso marker="#pTAG">&lt;p&gt;</seealso>,
+ <seealso marker="#preTAG">&lt;pre&gt;</seealso>,
+ <seealso marker="#codeTAG">&lt;code&gt;</seealso>,
+ <seealso marker="#listTAG">&lt;list&gt;</seealso>,
+ <seealso marker="#taglistTAG">&lt;taglist&gt;</seealso>,
+ <seealso marker="#codeincludeTAG">&lt;codeinclude&gt;</seealso> and
+ <seealso marker="#erlevalTAG">&lt;erleval&gt;</seealso>.
+ </p>
+
+ <section>
+ <marker id="brTAG"></marker>
+ <title>&lt;br&gt; - Line Break</title>
+
+ <p>Forces a newline. Example:</p>
+ <pre>
+Eat yourself&lt;br/&gt;senseless!
+ </pre>
+ <p>results in:</p>
+ <p>Eat yourself<br/>senseless!</p>
+
+ <p>The <c><![CDATA[<br>]]></c> tag is both a block- and an inline
+ tag.</p>
+ </section>
+
+ <section>
+ <marker id="codeTAG"></marker>
+ <title>&lt;code&gt; - Code Example</title>
+
+ <p>Highlight code examples. Example:</p>
+ <pre>
+&lt;code>
+sum([H|T]) ->
+ H + sum(T);
+sum([]) ->
+ 0.
+&lt;/code>
+ </pre>
+ <p>results in:</p>
+ <code>
+sum([H|T]) ->
+ H + sum(T);
+sum([]) ->
+ 0.
+ </code>
+
+ <p>There is an attribute <c>type = "erl" | "c" | "none"</c>, but
+ currently this attribute is ignored by DocBuilder. Default value
+ is <c>"none"</c></p>
+
+ <note>
+ <p>No tags are allowed within the tag and no
+ <seealso marker="character_entities">character
+ entities</seealso> are expanded.</p>
+ </note>
+ </section>
+
+ <section>
+ <marker id="codeincludeTAG"></marker>
+ <title>&lt;codeinclude&gt; - Code Inclusion</title>
+
+ <p>Include external code snippets. The attribute <c>file</c>
+ gives the file name and <c>tag</c> defines a string which
+ delimits the code snippet. Example:</p>
+ <pre>
+&lt;codeinclude file="gazonk" tag="%% Erlang example"/&gt;
+ </pre>
+ <p>results in:</p>
+ <codeinclude file="gazonk" tag="%% Erlang example"/>
+
+ <p>provided there is a file named <c>gazonk</c> looking like this:
+ </p>
+ <code>
+...
+
+%% Erlang example
+-module(gazonk).
+
+start() ->
+ {error,"Pid required!"}.
+start(Pid) ->
+ spawn(fun() -> init(Pid) end).
+%% Erlang example
+
+...
+ </code>
+
+ <p>If the <c>tag</c> attribute is omitted, the whole file is
+ included.</p>
+
+ <p>There is also an attribute <c>type = "erl" | "c" | "none"</c>, but
+ currently this attribute is ignored by DocBuilder. Default value
+ is <c>"none"</c></p>
+ </section>
+
+ <section>
+ <marker id="erlevalTAG"></marker>
+ <title>&lt;erleval&gt; - Erlang Evaluation</title>
+
+ <p>Include the result from evaluating an Erlang expression. Example:
+ </p>
+ <code><![CDATA[
+<erleval expr="{A,b,C}={a,b,c}. "/>
+ ]]></code>
+ <p>results in:</p>
+ <erleval expr="{A,b,C}={a,b,c}. "></erleval>
+
+ <p>Note the '.' and space after the expression.</p>
+ </section>
+
+ <section>
+ <marker id="listTAG"></marker>
+ <title>&lt;list&gt; - List</title>
+
+ <p>The attribute <c>type = "ordered"|"bulleted"</c> decides if
+ the list is numbered or bulleted. Default is <c>"bulleted"</c>.
+ </p>
+
+ <p>Lists contains list items, tag <c><![CDATA[<item>]]></c>, which
+ can contain plain text,
+ the <seealso marker="#block_subset">common subset of block
+ tags</seealso> and <seealso marker="inline_tags">inline
+ tags</seealso>. Example:</p>
+ <pre>
+&lt;list type="ordered"&gt;
+ &lt;item&gt;Askosal:
+ &lt;list&gt;
+ &lt;item&gt;Nullalisis&lt;/item>
+ &lt;item&gt;Facilisis&lt;/item>
+ &lt;/list&gt;
+ &lt;/item>
+ &lt;item&gt;Ankara&lt;/item>
+&lt;/list&gt;
+ </pre>
+ <p>results in:</p>
+ <list type="ordered">
+ <item>
+ <p>Askosal:</p>
+ <list type="bulleted">
+ <item>Nullalisis</item>
+ <item>Facilisis</item>
+ </list>
+ </item>
+ <item>Ankara</item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="markerTAG"></marker>
+ <title>&lt;marker&gt; - Marker</title>
+
+ <p>Used as an anchor for hypertext references. The
+ <c><![CDATA[<marker>]]></c> tag is both a block- and an inline
+ tag and is described in
+ the <seealso marker="inline_tags#markerTAG">Inline Tags</seealso>
+ section.</p>
+ </section>
+
+ <section>
+ <marker id="pTAG"></marker>
+ <title>&lt;p&gt; - Paragraph</title>
+
+ <p>Paragraphs contain plain text and
+ <seealso marker="inline_tags">inline tags</seealso>. Example:</p>
+ <pre>
+&lt;p&gt;I call specific attention to
+ the authority given by the &lt;em&gt;21st Amendment&lt;/em&gt;
+ to the Constitution to prohibit transportation
+ or importation of intoxicating liquors into
+ any State in violation of the laws of such
+ State.&lt;/p&gt;
+ </pre>
+ <p>results in:</p>
+ <p>I call specific attention to
+ the authority given by the <em>21st Amendment</em>
+ to the Constitution to prohibit transportation
+ or importation of intoxicating liquors into
+ any State in violation of the laws of such
+ State.</p>
+ </section>
+
+ <section>
+ <marker id="noteTAG"></marker>
+ <title>&lt;note&gt; - Note</title>
+
+ <p>Highlights a note. Can contain block tags except
+ <c><![CDATA[<note>]]></c>, <c><![CDATA[<warning>]]></c>,
+ <c><![CDATA[<image>]]></c> and <c><![CDATA[<table>]]></c>.
+ Example:</p>
+<pre>
+&lt;note>
+ &lt;p>This function is mainly intended for debugging.&lt;/p>
+&lt;/note>
+ </pre>
+ <p>results in:</p>
+ <note>
+ <p>This function is mainly intended for debugging.</p>
+ </note>
+ </section>
+
+ <section>
+ <marker id="preTAG"></marker>
+ <title>&lt;pre&gt; - Pre-formatted Text</title>
+
+ <p>Used for documentation of system interaction. Can contain text,
+ <seealso marker="inline_tags#seealsoTAG">seealso</seealso>,
+ <seealso marker="inline_tags#urlTAG">url</seealso> and
+ <c><![CDATA[<input>]]></c> tags.</p>
+
+ <p>The <c><![CDATA[<input>]]></c> tag is used to highlight user
+ input. Example:</p>
+ <pre>
+&lt;pre&gt;
+$ &lt;input&gt;erl&lt;/input&gt;
+Erlang (BEAM) emulator version 5.5.3 [async-threads:0] [hipe] [kernel-poll:false]
+
+Eshell V5.5.3 (abort with ^G)
+1&gt; &lt;input&gt;pwd().&lt;/input&gt;
+/home/user
+2&gt; &lt;input&gt;halt().&lt;/input&gt;
+&lt;/pre&gt;
+ </pre>
+ <p> results in:</p>
+ <pre>
+$ <input>erl</input>
+Erlang (BEAM) emulator version 5.5.3 [async-threads:0] [hipe] [kernel-poll:false]
+
+Eshell V5.5.3 (abort with ^G)
+1> <input>pwd().</input>
+/home/user
+2> <input>halt().</input>
+ </pre>
+
+ <p>All <seealso marker="character_entities">character
+ entities</seealso> are expanded.</p>
+ </section>
+
+ <section>
+ <marker id="quoteTAG"></marker>
+ <title>&lt;quote&gt; - Quotation</title>
+
+ <p>Highlight quotations from other works, or dialog spoken by
+ characters in a narrative. Contains one or more
+ <seealso marker="#pTAG">&lt;p&gt;</seealso> tags. Example:</p>
+ <pre>
+&lt;p&gt;Whereas Section 217(a) of the Act of Congress entitled
+"An Act ..." approved June 16, 1933, provides as follows:&lt;/p&gt;
+&lt;quote&gt;
+ &lt;p&gt;Section 217(a) The President shall proclaim the law.&lt;/p>
+&lt;/quote&gt;
+ </pre>
+ <p>results in:</p>
+ <p>Whereas Section 217(a) of the Act of Congress entitled
+ "An Act ..." approved June 16, 1933, provides as follows:</p>
+ <quote>
+ <p>Section 217(a) The President shall proclaim the law.</p>
+ </quote>
+ </section>
+
+ <section>
+ <marker id="taglistTAG"></marker>
+ <marker id="tagTAG"></marker>
+ <title>&lt;taglist&gt; - Definition List</title>
+
+ <p>Definition lists contains pairs of tags,
+ <c><![CDATA[<tag>]]></c>, and list items,
+ <c><![CDATA[<item>]]></c>.</p>
+
+ <p><c><![CDATA[<tag>]]></c> can contain plain text,
+ <seealso marker="inline_tags#cTAG">&lt;c&gt;</seealso>,
+ <seealso marker="inline_tags#emTAG">&lt;em&gt;</seealso>,
+ <seealso marker="inline_tags#seealsoTAG">&lt;seealso&gt;</seealso>
+ and <seealso marker="inline_tags#urlTAG">&lt;url&gt;</seealso>
+ tags.</p>
+
+ <p><c><![CDATA[<item>]]></c> can contain plain text,
+ the <seealso marker="#block_subset">common subset of block
+ tags</seealso> and <seealso marker="inline_tags">inline
+ tags</seealso>. Example:</p>
+ <pre>
+&lt;taglist>
+ &lt;tag>&lt;c>eacces&lt;/c>&lt;/tag>
+ &lt;item>Permission denied.&lt;/item>
+ &lt;tag>&lt;c>enoent&lt;/c>&lt;/tag>
+ &lt;item>No such file or directory.&lt;/item>
+&lt;/taglist>
+ </pre>
+ <p>results in:</p>
+ <taglist>
+ <tag><c>eacces</c></tag>
+ <item>Permission denied.</item>
+ <tag><c>enoent</c></tag>
+ <item>No such file or directory.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <marker id="warningTAG"></marker>
+ <title>&lt;warning&gt; - Warning</title>
+
+ <p>Highlights a warning. Can contain block tags except
+ <c><![CDATA[<note>]]></c>, <c><![CDATA[<warning>]]></c>,
+ <c><![CDATA[<image>]]></c> and <c><![CDATA[<table>]]></c>.
+ Example:</p>
+<pre>
+&lt;warning>
+ &lt;p>This function might be removed in a future version without
+ prior warning.&lt;/p>
+&lt;/warning>
+ </pre>
+ <p>results in:</p>
+ <warning>
+ <p>This function might be removed in a future version without
+ prior warning.</p>
+ </warning>
+ </section>
+
+ <section>
+ <marker id="imageTAG"></marker>
+ <marker id="icaptionTAG"></marker>
+ <title>&lt;image&gt; - Image</title>
+
+ <p>Graphics is imported using the <c><![CDATA[<image>]]></c> tag.
+ An image caption <c><![CDATA[<icaption>]]></c>, containing plain
+ text, must be supplied. Example:</p>
+ <pre>
+&lt;image file="man"&gt;
+ &lt;icaption&gt;A Silly Man&lt;/icaption&gt;
+&lt;/image&gt;
+ </pre>
+ <p>results in:</p>
+ <image file="man.gif">
+ <icaption>A Silly Man</icaption>
+ </image>
+
+ <p>This assumes that <c>man.gif</c> exists in the current directory.
+ </p>
+ </section>
+
+ <section>
+ <marker id="tableTAG"></marker>
+ <marker id="rowTAG"></marker>
+ <marker id="cellTAG"></marker>
+ <marker id="tcaptionTAG"></marker>
+ <title>&lt;table&gt; - Table</title>
+
+ <p>The table format is similar to how tables are described in HTML
+ 3.2. A table contains one or more rows, <c><![CDATA[<row>]]></c>,
+ and a table caption <c><![CDATA[<tcaption>]]></c>, containing
+ plain text.</p>
+
+ <p>Each row contains one or more cells, <c><![CDATA[<cell>]]></c>.
+ The attributes <c>align = "left"|"center"|"right"</c> and
+ <c>valign = "top"|"middle"|"bottom"</c> decides how text is
+ aligned in the cell horizontally and vertically. Default is
+ "<c>left</c>" and "<c>middle</c>".</p>
+
+ <p>Each cell contains plain text and
+ <seealso marker="inline_tags">inline tags</seealso>. Example:</p>
+ <pre><![CDATA[
+ <table>
+ <row>
+ <cell align="left" valign="top"><em>Boys</em></cell>
+ <cell align="center" valign="middle"><em>Girls</em></cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Juda</cell>
+ <cell align="right" valign="bottom">Susy</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Anders</cell>
+ <cell align="left" valign="middle">Victoria</cell>
+ </row>
+ <tcaption>A table caption</tcaption>
+ </table>
+ ]]></pre>
+ <p>results in:</p>
+ <table>
+ <row>
+ <cell align="left" valign="top"><em>Boys</em></cell>
+ <cell align="center" valign="middle"><em>Girls</em></cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Juda</cell>
+ <cell align="right" valign="bottom">Susy</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Anders</cell>
+ <cell align="left" valign="middle">Victoria</cell>
+ </row>
+ <tcaption>A table caption</tcaption>
+ </table>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/book.xml b/lib/docbuilder/doc/src/book.xml
new file mode 100644
index 0000000000..a13d56dd8a
--- /dev/null
+++ b/lib/docbuilder/doc/src/book.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE book SYSTEM "book.dtd">
+
+<book xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header titlestyle="normal">
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>DocBuilder</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <insidecover>
+ </insidecover>
+ <pagetext>Docbuilder</pagetext>
+ <preamble>
+ <contents level="2"></contents>
+ </preamble>
+ <parts lift="no">
+ <xi:include href="part.xml"/>
+ </parts>
+ <applications>
+ <xi:include href="ref_man.xml"/>
+ </applications>
+ <releasenotes>
+ <xi:include href="notes.xml"/>
+ </releasenotes>
+ <listoffigures></listoffigures>
+ <listoftables></listoftables>
+ <listofterms></listofterms>
+ <index></index>
+</book>
+
diff --git a/lib/docbuilder/doc/src/character_entities.xml b/lib/docbuilder/doc/src/character_entities.xml
new file mode 100644
index 0000000000..e78cf0ebec
--- /dev/null
+++ b/lib/docbuilder/doc/src/character_entities.xml
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Character Entities</title>
+ <prepared/>
+ <docno/>
+ <date/>
+ <rev/>
+ <file>character_entities.xml</file>
+ </header>
+
+ <section>
+ <title>Added Latin 1</title>
+
+ <p>The DocBuilder DTD suite uses the same character entities as
+ defined in HTML 3.2
+ (<c>ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML</c>). That is:
+ for an &amp; (ampersand), use the entity: <c>&amp;amp;</c>, for
+ &ouml; use the entity <c>&amp;ouml;</c> and so on.</p>
+
+ <table>
+ <row>
+ <cell align="left" valign="middle"><em>Character</em></cell>
+ <cell align="left" valign="middle"><em>Entity</em></cell>
+ <cell align="left" valign="middle"><em>Description</em></cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&amp;</cell>
+ <cell align="left" valign="middle">&amp;amp;</cell>
+ <cell align="left" valign="middle">ampersand</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&gt;</cell>
+ <cell align="left" valign="middle">&amp;gt;</cell>
+ <cell align="left" valign="middle">greater than</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&lt;</cell>
+ <cell align="left" valign="middle">&amp;lt;</cell>
+ <cell align="left" valign="middle">less than</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&nbsp;</cell>
+ <cell align="left" valign="middle">&amp;nbsp;</cell>
+ <cell align="left" valign="middle">no-break space</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&iexcl;</cell>
+ <cell align="left" valign="middle">&amp;iexcl;</cell>
+ <cell align="left" valign="middle">inverted exclamation mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&cent;</cell>
+ <cell align="left" valign="middle">&amp;cent;</cell>
+ <cell align="left" valign="middle">cent sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&pound;</cell>
+ <cell align="left" valign="middle">&amp;pound;</cell>
+ <cell align="left" valign="middle">pound sterling sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&curren;</cell>
+ <cell align="left" valign="middle">&amp;curren;</cell>
+ <cell align="left" valign="middle">general currency sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&yen;</cell>
+ <cell align="left" valign="middle">&amp;yen;</cell>
+ <cell align="left" valign="middle">yen sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&brvbar;</cell>
+ <cell align="left" valign="middle">&amp;brvbar;</cell>
+ <cell align="left" valign="middle">broken (vertical) bar</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&sect;</cell>
+ <cell align="left" valign="middle">&amp;sect;</cell>
+ <cell align="left" valign="middle">section sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&uml;</cell>
+ <cell align="left" valign="middle">&amp;uml;</cell>
+ <cell align="left" valign="middle">umlaut (dieresis)</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&copy;</cell>
+ <cell align="left" valign="middle">&amp;copy;</cell>
+ <cell align="left" valign="middle">copyright sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ordf;</cell>
+ <cell align="left" valign="middle">&amp;ordf;</cell>
+ <cell align="left" valign="middle">ordinal indicator, feminine</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&laquo;</cell>
+ <cell align="left" valign="middle">&amp;laquo;</cell>
+ <cell align="left" valign="middle">angle quotation mark, left</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&not;</cell>
+ <cell align="left" valign="middle">&amp;not;</cell>
+ <cell align="left" valign="middle">not sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&shy;</cell>
+ <cell align="left" valign="middle">&amp;shy;</cell>
+ <cell align="left" valign="middle">soft hyphen</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&reg;</cell>
+ <cell align="left" valign="middle">&amp;reg;</cell>
+ <cell align="left" valign="middle">registered sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&macr;</cell>
+ <cell align="left" valign="middle">&amp;macr;</cell>
+ <cell align="left" valign="middle">macron</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&deg;</cell>
+ <cell align="left" valign="middle">&amp;deg;</cell>
+ <cell align="left" valign="middle">degree sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&plusmn;</cell>
+ <cell align="left" valign="middle">&amp;plusmn;</cell>
+ <cell align="left" valign="middle">plus-or-minus</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&sup2;</cell>
+ <cell align="left" valign="middle">&amp;sup2;</cell>
+ <cell align="left" valign="middle">superscript two</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&sup3;</cell>
+ <cell align="left" valign="middle">&amp;sup3;</cell>
+ <cell align="left" valign="middle">superscript three</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&acute;</cell>
+ <cell align="left" valign="middle">&amp;acute;</cell>
+ <cell align="left" valign="middle">acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&micro;</cell>
+ <cell align="left" valign="middle">&amp;micro;</cell>
+ <cell align="left" valign="middle">micro sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&para;</cell>
+ <cell align="left" valign="middle">&amp;para;</cell>
+ <cell align="left" valign="middle">pilcrow (paragraph sign)</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&middot;</cell>
+ <cell align="left" valign="middle">&amp;middot;</cell>
+ <cell align="left" valign="middle">middle dot</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&cedil;</cell>
+ <cell align="left" valign="middle">&amp;cedil;</cell>
+ <cell align="left" valign="middle">cedilla</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&sup1;</cell>
+ <cell align="left" valign="middle">&amp;sup1;</cell>
+ <cell align="left" valign="middle">superscript one</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ordm;</cell>
+ <cell align="left" valign="middle">&amp;ordm;</cell>
+ <cell align="left" valign="middle">ordinal indicator, masculine</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&raquo;</cell>
+ <cell align="left" valign="middle">&amp;raquo;</cell>
+ <cell align="left" valign="middle">angle quotation mark, right</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&frac14;</cell>
+ <cell align="left" valign="middle">&amp;frac14;</cell>
+ <cell align="left" valign="middle">fraction one-quarter</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&frac12;</cell>
+ <cell align="left" valign="middle">&amp;frac12;</cell>
+ <cell align="left" valign="middle">fraction one-half</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&frac34;</cell>
+ <cell align="left" valign="middle">&amp;frac34;</cell>
+ <cell align="left" valign="middle">fraction three-quarters</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&iquest;</cell>
+ <cell align="left" valign="middle">&amp;iquest;</cell>
+ <cell align="left" valign="middle">inverted question mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Agrave;</cell>
+ <cell align="left" valign="middle">&amp;Agrave;</cell>
+ <cell align="left" valign="middle">capital A, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Aacute;</cell>
+ <cell align="left" valign="middle">&amp;Aacute;</cell>
+ <cell align="left" valign="middle">capital A, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Acirc;</cell>
+ <cell align="left" valign="middle">&amp;Acirc;</cell>
+ <cell align="left" valign="middle">capital A, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Atilde;</cell>
+ <cell align="left" valign="middle">&amp;Atilde;</cell>
+ <cell align="left" valign="middle">capital A, tilde</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Auml;</cell>
+ <cell align="left" valign="middle">&amp;Auml;</cell>
+ <cell align="left" valign="middle">capital A, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Aring;</cell>
+ <cell align="left" valign="middle">&amp;Aring;</cell>
+ <cell align="left" valign="middle">capital A, ring</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&AElig;</cell>
+ <cell align="left" valign="middle">&amp;AElig;</cell>
+ <cell align="left" valign="middle">capital AE diphthong (ligature)</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ccedil;</cell>
+ <cell align="left" valign="middle">&amp;Ccedil;</cell>
+ <cell align="left" valign="middle">capital C, cedilla</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Egrave;</cell>
+ <cell align="left" valign="middle">&amp;Egrave;</cell>
+ <cell align="left" valign="middle">capital E, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Eacute;</cell>
+ <cell align="left" valign="middle">&amp;Eacute;</cell>
+ <cell align="left" valign="middle">capital E, acute accen</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ecirc;</cell>
+ <cell align="left" valign="middle">&amp;Ecirc;</cell>
+ <cell align="left" valign="middle">capital E, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Euml;</cell>
+ <cell align="left" valign="middle">&amp;Euml;</cell>
+ <cell align="left" valign="middle">capital E, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Igrave;</cell>
+ <cell align="left" valign="middle">&amp;Igrave;</cell>
+ <cell align="left" valign="middle">capital I, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Iacute;</cell>
+ <cell align="left" valign="middle">&amp;Iacute;</cell>
+ <cell align="left" valign="middle">capital I, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Icirc;</cell>
+ <cell align="left" valign="middle">&amp;Icirc;</cell>
+ <cell align="left" valign="middle">capital I, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Iuml;</cell>
+ <cell align="left" valign="middle">&amp;Iuml;</cell>
+ <cell align="left" valign="middle">capital I, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ETH;</cell>
+ <cell align="left" valign="middle">&amp;ETH;</cell>
+ <cell align="left" valign="middle">capital Eth, Icelandic</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ntilde;</cell>
+ <cell align="left" valign="middle">&amp;Ntilde;</cell>
+ <cell align="left" valign="middle">capital N, tilde</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ograve;</cell>
+ <cell align="left" valign="middle">&amp;Ograve;</cell>
+ <cell align="left" valign="middle">capital O, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Oacute;</cell>
+ <cell align="left" valign="middle">&amp;Oacute;</cell>
+ <cell align="left" valign="middle">capital O, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ocirc;</cell>
+ <cell align="left" valign="middle">&amp;Ocirc;</cell>
+ <cell align="left" valign="middle">capital O, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Otilde;</cell>
+ <cell align="left" valign="middle">&amp;Otilde;</cell>
+ <cell align="left" valign="middle">capital O, tilde</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ouml;</cell>
+ <cell align="left" valign="middle">&amp;Ouml;</cell>
+ <cell align="left" valign="middle">capital O, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&times;</cell>
+ <cell align="left" valign="middle">&amp;times;</cell>
+ <cell align="left" valign="middle">multiply sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Oslash;</cell>
+ <cell align="left" valign="middle">&amp;Oslash;</cell>
+ <cell align="left" valign="middle">capital O, slash</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ugrave;</cell>
+ <cell align="left" valign="middle">&amp;Ugrave;</cell>
+ <cell align="left" valign="middle">capital U, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Uacute;</cell>
+ <cell align="left" valign="middle">&amp;Uacute;</cell>
+ <cell align="left" valign="middle">capital U, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Ucirc;</cell>
+ <cell align="left" valign="middle">&amp;Ucirc;</cell>
+ <cell align="left" valign="middle">capital U, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Uuml;</cell>
+ <cell align="left" valign="middle">&amp;Uuml;</cell>
+ <cell align="left" valign="middle">capital U, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&Yacute;</cell>
+ <cell align="left" valign="middle">&amp;Yacute;</cell>
+ <cell align="left" valign="middle">capital Y, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&THORN;</cell>
+ <cell align="left" valign="middle">&amp;THORN;</cell>
+ <cell align="left" valign="middle">capital THORN, Icelandic</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&szlig;</cell>
+ <cell align="left" valign="middle">&amp;szlig;</cell>
+ <cell align="left" valign="middle">small sharp s, German (sz ligature)</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&agrave;</cell>
+ <cell align="left" valign="middle">&amp;agrave;</cell>
+ <cell align="left" valign="middle">small a, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&aacute;</cell>
+ <cell align="left" valign="middle">&amp;aacute;</cell>
+ <cell align="left" valign="middle">small a, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&acirc;</cell>
+ <cell align="left" valign="middle">&amp;acirc;</cell>
+ <cell align="left" valign="middle">small a, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&atilde;</cell>
+ <cell align="left" valign="middle">&amp;atilde;</cell>
+ <cell align="left" valign="middle">small a, tilde</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&auml;</cell>
+ <cell align="left" valign="middle">&amp;auml;</cell>
+ <cell align="left" valign="middle">small a, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&aring;</cell>
+ <cell align="left" valign="middle">&amp;aring;</cell>
+ <cell align="left" valign="middle">small a, ring</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&aelig;</cell>
+ <cell align="left" valign="middle">&amp;aelig;</cell>
+ <cell align="left" valign="middle">small ae diphthong (ligature)</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ccedil;</cell>
+ <cell align="left" valign="middle">&amp;ccedil;</cell>
+ <cell align="left" valign="middle">small c, cedilla</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&egrave;</cell>
+ <cell align="left" valign="middle">&amp;egrave;</cell>
+ <cell align="left" valign="middle">small e, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&eacute;</cell>
+ <cell align="left" valign="middle">&amp;eacute;</cell>
+ <cell align="left" valign="middle">small e, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ecirc;</cell>
+ <cell align="left" valign="middle">&amp;ecirc;</cell>
+ <cell align="left" valign="middle">small e, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&euml;</cell>
+ <cell align="left" valign="middle">&amp;euml;</cell>
+ <cell align="left" valign="middle">small e, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&igrave;</cell>
+ <cell align="left" valign="middle">&amp;igrave;</cell>
+ <cell align="left" valign="middle">small i, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&iacute;</cell>
+ <cell align="left" valign="middle">&amp;iacute;</cell>
+ <cell align="left" valign="middle">small i, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&icirc;</cell>
+ <cell align="left" valign="middle">&amp;icirc;</cell>
+ <cell align="left" valign="middle">small i, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&iuml;</cell>
+ <cell align="left" valign="middle">&amp;iuml;</cell>
+ <cell align="left" valign="middle">small i, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&eth;</cell>
+ <cell align="left" valign="middle">&amp;eth;</cell>
+ <cell align="left" valign="middle">small eth, Icelandic</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ntilde;</cell>
+ <cell align="left" valign="middle">&amp;ntilde;</cell>
+ <cell align="left" valign="middle">small n, tilde</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ograve;</cell>
+ <cell align="left" valign="middle">&amp;ograve;</cell>
+ <cell align="left" valign="middle">small o, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&oacute;</cell>
+ <cell align="left" valign="middle">&amp;oacute;</cell>
+ <cell align="left" valign="middle">small o, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ocirc;</cell>
+ <cell align="left" valign="middle">&amp;ocirc;</cell>
+ <cell align="left" valign="middle">small o, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&otilde;</cell>
+ <cell align="left" valign="middle">&amp;otilde;</cell>
+ <cell align="left" valign="middle">small o, tilde</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ouml;</cell>
+ <cell align="left" valign="middle">&amp;ouml;</cell>
+ <cell align="left" valign="middle">small o, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&divide;</cell>
+ <cell align="left" valign="middle">&amp;divide;</cell>
+ <cell align="left" valign="middle">divide sign</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&oslash;</cell>
+ <cell align="left" valign="middle">&amp;oslash;</cell>
+ <cell align="left" valign="middle">small o, slash</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ugrave;</cell>
+ <cell align="left" valign="middle">&amp;ugrave;</cell>
+ <cell align="left" valign="middle">small u, grave accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&uacute;</cell>
+ <cell align="left" valign="middle">&amp;uacute;</cell>
+ <cell align="left" valign="middle">small u, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&ucirc;</cell>
+ <cell align="left" valign="middle">&amp;ucirc;</cell>
+ <cell align="left" valign="middle">small u, circumflex accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&uuml;</cell>
+ <cell align="left" valign="middle">&amp;uuml;</cell>
+ <cell align="left" valign="middle">small u, dieresis or umlaut mark</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&yacute;</cell>
+ <cell align="left" valign="middle">&amp;yacute;</cell>
+ <cell align="left" valign="middle">small y, acute accent</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&thorn;</cell>
+ <cell align="left" valign="middle">&amp;thorn;</cell>
+ <cell align="left" valign="middle">small thorn, Icelandic</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">&yuml;</cell>
+ <cell align="left" valign="middle">&amp;yuml;</cell>
+ <cell align="left" valign="middle">small y, dieresis or umlaut mark</cell>
+ </row>
+ <tcaption>Accented Latin-1 alphabetic characters.</tcaption>
+ </table>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/docb_gen.xml b/lib/docbuilder/doc/src/docb_gen.xml
new file mode 100644
index 0000000000..49eb79ae24
--- /dev/null
+++ b/lib/docbuilder/doc/src/docb_gen.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="iso-8859-1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1999</year>
+ <year>2007</year>
+ <holder>Ericsson AB, All Rights Reserved</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ </legalnotice>
+ <title>docb_gen</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <module>docb_gen</module>
+ <modulesummary>Generate XML from EDoc comments in Erlang source code.
+ </modulesummary>
+
+ <description>
+ <p><c>docb_gen</c> contains functions for generating XML
+ documentation source code according to the <c>erlref</c> or
+ <c>chapter</c> DTD from
+ <seealso marker="edoc:chapter">EDoc</seealso> comments in Erlang
+ source code or an <c>overview.edoc</c> file, using EDoc.</p>
+ </description>
+
+ <funcs>
+ <func>
+ <name>module(File) -> ok | {error, Reason}</name>
+ <name>module(File, Options) -> ok | {error, Reason}</name>
+ <fsummary>Generate XML from EDoc comments in Erlang source code.
+ </fsummary>
+ <type>
+ <v>File = string()</v>
+ <v>Options = [Opt]</v>
+ <v>Opt = {def,Defs} | {includes,Dirs} | {preprocess,Bool}
+ | {sort_functions,Bool}</v>
+ <v>Defs = [{atom(),string()}]</v>
+ <v>Dirs = [string()]</v>
+ <v>Bool = bool()</v>
+ <v>Reason = badfile | {badopt,term()} | term()</v>
+ </type>
+ <desc>
+ <p>Generates XML documentation source code according to
+ the <c>erlref</c> DTD from EDoc comments <c>File</c>, using
+ the EDoc application.</p>
+
+ <p><c>File</c> is an Erlang source file, given with or without
+ the <c>.erl</c> extension as <c>Name.erl</c> or <c>Name</c>.
+ The resulting XML file is created in the current working
+ directory and named <c>Name.xml</c>.</p>
+
+ <p><c>Options</c> is a list of options, see below.</p>
+
+ <p>Returns <c>ok</c> if successful, and an error tuple
+ otherwise.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>users_guide(File) -> ok | {error, Reason}</name>
+ <name>users_guide(File, Options) -> ok | {error, Reason}</name>
+ <fsummary>Generate XML from EDoc comments in Erlang source code
+ </fsummary>
+ <type>
+ <v>File -- see module/1,2</v>
+ <v>Options -- see module/1,2</v>
+ <v>Reason -- see module/1,2</v>
+ </type>
+ <desc>
+ <p>Like <c>module/1,2</c> but generates XML source code
+ according to the <c>chapter</c> DTD from an
+ <c>overview.edoc</c> or similar file.</p>
+
+ <p>The resulting file is named <c>chapter.xml</c>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>Options</title>
+ <taglist>
+ <tag><c>{def, [{Name,Text}]}</c></tag>
+ <item>Specifies EDoc macro definitions. See
+ <seealso marker="edoc:edoc">edoc:get_doc/2</seealso>.</item>
+
+ <tag><c>{includes, [Dir]}</c></tag>
+ <item>Specifies directories where EDoc should search for include
+ files. See
+ <seealso marker="edoc:edoc">edoc:read_source/2</seealso>.</item>
+
+ <tag><c>{preprocess, true|false}</c></tag>
+ <item>Specifies if EDoc should read the source file via the Erlang
+ preprocessor. Default is <c>false</c>. See
+ <seealso marker="edoc:edoc">edoc:read_source/2</seealso>.</item>
+
+ <tag><c>{sort_functions, true|false}</c></tag>
+ <item>Specifies if the functions in the resulting XML file should
+ be sorted alphabetically. Default is <c>true</c>.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>Limitations</title>
+ <p>The mapping from the EDoc XHTML output to valid Erlang/OTP XML
+ is not complete. An attempt has been made to cover the most
+ commonly used XHTML constructs, but there will still be cases
+ where XML generation fails or where the resulting XML is
+ inadequate. This is especially true for <c>users_guide/1,2</c>.
+ </p>
+
+ <p>Known limitations for some XHTML tags:</p>
+ <taglist>
+ <tag><c><![CDATA[<a>]]></c></tag>
+ <item>
+ <p>All attributes except the first <c>href</c> or <c>name</c>
+ attribute are ignored.</p>
+ <p>A <c>href</c> attribute means the <c><![CDATA[<a>]]></c> tag
+ will be transformed to a <c><![CDATA[<seealso>]]></c> or
+ <c><![CDATA[<url>]]></c> tag and an attempt is made to
+ resolve the reference if necessary.</p>
+
+ <p>A <c>name</c> attribute means the <c><![CDATA[<a>]]></c> tag
+ will be transformed to a <c><![CDATA[<marker>]]></c> tag.</p>
+ </item>
+
+ <tag><c><![CDATA[<b>, <em>, <pre>]]></c></tag>
+ <item>Cannot contain other tags in Erlang/OTP XML, content is
+ converted to plain text.
+ </item>
+
+ <tag><c><![CDATA[<center>]]></c></tag>
+ <item>No corresponding Erlang/OTP XML tag, converted to plain
+ text.
+ </item>
+
+ <tag><c><![CDATA[<font>]]></c></tag>
+ <item>No corresponding Erlang/OTP XML tag, converted to plain
+ text.
+ </item>
+
+ <tag><c><![CDATA[<h1>, <h2>, ...]]></c></tag>
+ <item>There is no tag corresponding to a header in Erlang/OTP XML,
+ so these are converted to plain text instead, with
+ the exception of <c><![CDATA[<h3>]]></c> and
+ <c><![CDATA[<h4>]]></c> tags within <c>overview.edoc</c>, see
+ part about "<c>chapter</c> DTD" below.
+ </item>
+
+ <tag><c><![CDATA[<sup>]]></c></tag>
+ <item>There is no tag corresponding to superscript in Erlang/OTP
+ XML, so this is converted to plain text within brackets "(..)".
+ </item>
+
+ <tag>References</tag>
+ <item>The markers automatically inserted by EDoc at each heading
+ and function will override the markers automatically inserted
+ by DocBuilder, with the unfortunate result that the links in
+ the left-hand frame of the User's Guide will not work, and
+ also that cross referencing a function in a module the usual
+ Erlang/OTP way
+ "<c><![CDATA[<seealso marker="edoc:edoc#run/3...>]]></c>" does
+ not work. (But
+ "<c><![CDATA[<seealso marker="edoc:edoc#run-3...>]]></c>" does.)
+ </item>
+ </taglist>
+
+ <p><em>erlref DTD</em></p>
+ <taglist>
+ <tag>Tables</tag>
+ <item>Tables are not allowed. The contents of a table is
+ converted to text instead, each row corresponding to one line
+ of text.
+ </item>
+ </taglist>
+
+ <p><em>chapter DTD</em></p>
+ <taglist>
+ <tag>Sections</tag>
+ <item>Only two levels of sections. <c><![CDATA[<h3>]]></c>
+ (equivalent to EDoc headings "<c>== Heading ==</c>") is
+ interpreted as start of top-level section, or if there is no
+ <c><![CDATA[<h3>]]></c> tag, the entire document is made into
+ one top-level section. <c><![CDATA[<h4>]]></c> (equivalent to
+ EDoc sub-headings ("<c><![CDATA[=== Sub-heading ===]]></c>") is
+ interpreted as start of second-level section.
+ </item>
+
+ <tag>Tables</tag>
+ <item>Tables without borders are converted to text in the same
+ manner as for the <c>erlref</c> DTD.
+ </item>
+ </taglist>
+ </section>
+
+</erlref>
+
diff --git a/lib/docbuilder/doc/src/docb_transform.xml b/lib/docbuilder/doc/src/docb_transform.xml
new file mode 100644
index 0000000000..b8975e2698
--- /dev/null
+++ b/lib/docbuilder/doc/src/docb_transform.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2001</year>
+ <year>2007</year>
+ <holder>Ericsson AB, All Rights Reserved</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ </legalnotice>
+
+ <title>docb_transform</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <module>docb_transform</module>
+ <modulesummary>Transform XML to HTML</modulesummary>
+ <description>
+ <p><c>docb_transform</c> contains functions for transforming XML
+ documentation source code to HTML.</p>
+ </description>
+
+ <funcs>
+ <func>
+ <name>file(File) -> ok | {error, Reason}</name>
+ <name>file(File, Options) -> ok | {error, Reason}</name>
+ <fsummary>Transform XML to HTML</fsummary>
+ <type>
+ <v>File = string()</v>
+ <v>Options = [Opt]</v>
+ <v>Opt -- see below</v>
+ </type>
+ <desc>
+ <p>Transforms XML documentation source code to HTML.</p>
+
+ <p><c>File</c> is a documentation source file, given with or
+ without the <c>.xml</c> extension as <c>Name.xml</c> or
+ <c>Name</c>.</p>
+
+ <p>If <c>File</c> contains XML code according to a basic DTD
+ (<c>chapter</c>, <c>erlref</c>, ...), the resulting HTML
+ file is named <c>Name.html</c>.</p>
+
+ <p>If <c>File</c> contains XML code according to a compound DTD
+ (<c>application</c> or <c>part</c>), several files are
+ created:</p>
+ <list>
+ <item>A cover page for the application with two frames,
+ <c>Name_frame.html</c>.</item>
+ <item>The contents of the left frame and a front page,
+ <c>Name.html</c> and <c>Name_first.html</c>.</item>
+ <item>A bibliography and a glossary, <c>Name_cite.html</c>
+ and <c>Name_term.html</c>.</item>
+ <item>In the case of an <c>application</c> DTD an index
+ is created, <c>Name.kwc</c> and <c>Name_index.html</c>.
+ </item>
+ <item>One HTML file for each file included from <c>File</c>.
+ </item>
+ <item>Also, if there exists a <c>fascicules.xml</c> file where
+ the value of the <c>entry</c> attribute for <c>File</c> is
+ <c>"yes"</c>, the cover page is copied to <c>index.html</c>.
+ </item>
+ </list>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>Options</title>
+ <taglist>
+ <tag><c>{html_mod, Module}, Module=atom()</c></tag>
+ <item>
+ <p>A callback module can be used for specifying HTML snippets
+ that should be included in the generated HTML files, see
+ below.</p>
+ </item>
+
+ <tag><c>{outdir, Dir}, Dir=string()</c></tag>
+ <item>
+ <p>Destination for generated files. Default is current working
+ directory.</p>
+ </item>
+
+ <tag><c>{number, Number}, Number=int()</c></tag>
+ <item>
+ <p>First chapter number when transforming a <c>chapter</c>
+ file. Default is 1.</p>
+ </item>
+
+ <tag><c>{ptype, unix|windows}</c></tag>
+ <item>
+ <p>For <c>path</c> elements, the specified file path should be
+ presented.</p>
+ </item>
+
+ <tag><c>silent</c></tag>
+ <item>
+ <p>Silent - no warnings, only error information is printed.</p>
+ </item>
+
+ <tag><c>{top, Index}, Index=string()</c></tag>
+ <item>
+ <p>Specifies the value of "Top" in the left frame of a front
+ page, which normally should be some kind of top index file
+ for the documentation.</p>
+ </item>
+
+ <tag><c>{vsn, Vsn}, Vsn=string()</c></tag>
+ <item>
+ <p>Application version number. Overrides a version number
+ defined in the XML document. Visible in the left frame and
+ on the front page.</p>
+ </item>
+
+ <tag><c>{term_defs, File}, File=string()</c></tag>
+ <item>
+ <p>Use the global glossary definitions in <c>File</c>, which
+ should contain a list of tuples <c>{Id, Name, Definition,
+ Owner}</c>. See the section
+ <seealso marker="inline_tags#termTAG">&lt;term&gt;,
+ &lt;termdef&gt; - Glossary</seealso> in the User's Guide.
+ </p>
+ </item>
+
+ <tag><c>{cite_defs, File}, File=string()</c></tag>
+ <item>
+ <p>Use the global bibliography definitions in <c>File</c>, which
+ should contain a list of tuples <c>{Id, Title, Info,
+ Owner}</c>. See the section
+ <seealso marker="inline_tags#citeTAG">&lt;cite&gt;,
+ &lt;citedef&gt; - Bibliography</seealso> in the User's
+ Guide.</p>
+ </item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>Callback Module</title>
+
+ <p>A <c>html_mod</c> callback module can include the functions
+ specified below. Note that there is no check that the resulting
+ HTML code is valid. All functions are optional.</p>
+ </section>
+
+ <funcs>
+ <func>
+ <name>Module:head() -> string()</name>
+ <fsummary>Snippet to be included in head of a document.</fsummary>
+ <desc>
+ <p>Defines a HTML snippet to be included in the head of
+ a document, after the <c>&lt;HEAD></c> start tag and
+ <c>&lt;TITLE></c> tag:</p>
+ <pre>
+&lt;HTML>
+&lt;HEAD>
+ &lt;TITLE>...&lt;/TITLE>
+ - snippet is included here -
+ ...
+&lt;/HEAD>
+...
+&lt;/HTML>
+ </pre>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:top() -> string()</name>
+ <fsummary>Snippet to be included at the top of a document.
+ </fsummary>
+ <desc>
+ <p>Defines a HTML snippet to be included at the top of a
+ document, after the <c>&lt;BODY></c> start tag.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:bottom() -> string()</name>
+ <fsummary>Snippet to be included at the bottom of a document.
+ </fsummary>
+ <desc>
+ <p>Defines a HTML snippet to be included at the bottom of a
+ document, before the <c>&lt;/BODY></c> end tag.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:seealso(SeeAlso) -> Href</name>
+ <fsummary></fsummary>
+ <type>
+ <v>SeeAlso = Href = string()</v>
+ </type>
+ <desc>
+ <p>When referring to another part of the document, or another
+ document, the XML tag <c>&lt;seealso&gt;</c> is used:
+ <c><![CDATA[<seealso marker="File#Marker">...text...</seealso>]]></c>.
+ By default, this is translated to
+ <c><![CDATA[<A HREF="File.html#Marker>...text...</A>]]></c>.</p>
+
+ <p>This function makes it possible to specify an alternative
+ translation <c>Href</c> of the <c>marker</c> attribute value
+ <c>SeeAlso</c>. For example, in OTP this is used to resolve
+ cross references between applications.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
diff --git a/lib/docbuilder/doc/src/docb_xml_check.xml b/lib/docbuilder/doc/src/docb_xml_check.xml
new file mode 100644
index 0000000000..7ec456c014
--- /dev/null
+++ b/lib/docbuilder/doc/src/docb_xml_check.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2007</year>
+ <year>2007</year>
+ <holder>Ericsson AB, All Rights Reserved</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ </legalnotice>
+
+ <title>docb_xml_check</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <module>docb_xml_check</module>
+ <modulesummary>Validate XML documentation source code</modulesummary>
+ <description>
+ <p><c>docb_xml_check</c> contains functions for validating XML
+ documentation source code.</p>
+ </description>
+
+ <funcs>
+ <func>
+ <name>validate(File) -> ok | error | {error, badfile}</name>
+ <fsummary>Validate XML source code.</fsummary>
+ <type>
+ <v>File = string()</v>
+ </type>
+ <desc>
+ <p>Validates the XML documentation source code in <c>File</c>.
+ The <c>.xml</c> extension can be omitted.</p>
+
+ <p>Returns <c>ok</c> if successful, otherwise error information
+ is printed and the function returns <c>error</c>.
+ If <c>File</c> does not exist, <c>{error, badfile}</c> is
+ returned.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
diff --git a/lib/docbuilder/doc/src/docbuilder_app.xml b/lib/docbuilder/doc/src/docbuilder_app.xml
new file mode 100644
index 0000000000..a1df496258
--- /dev/null
+++ b/lib/docbuilder/doc/src/docbuilder_app.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE appref SYSTEM "appref.dtd">
+
+<appref>
+ <header>
+ <copyright>
+ <year>2007</year>
+ <year>2007</year>
+ <holder>Ericsson AB, All Rights Reserved</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ </legalnotice>
+
+ <title>docbuilder</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <app>docbuilder</app>
+ <appsummary>The DocBuilder Application</appsummary>
+ <description>
+ <p>DocBuilder provides functionality for generating HTML
+ documentation for Erlang modules and Erlang/OTP applications
+ from XML source code and/or EDoc comments in Erlang source code.
+ </p>
+ </description>
+
+ <section>
+ <title>Limitations</title>
+ <p>DocBuilder is primarily intended for generating documentation
+ for Erlang/OTP itself. That is, no attempt has been made to create
+ a tool suitable for generating documentation in general.</p>
+ </section>
+
+ <section>
+ <title>See Also</title>
+ <p>DocBuilder User's Guide,
+ <seealso marker="docb_gen">docb_gen(3)</seealso>,
+ <seealso marker="docb_transform">docb_transform(3)</seealso>
+ <seealso marker="docb_xml_check"></seealso></p>
+ </section>
+
+</appref>
+
diff --git a/lib/docbuilder/doc/src/fasc_dtds.xml b/lib/docbuilder/doc/src/fasc_dtds.xml
new file mode 100644
index 0000000000..dec8189b55
--- /dev/null
+++ b/lib/docbuilder/doc/src/fasc_dtds.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2007</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Fascicules DTDs</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>fasc_dtds.xml</file>
+ </header>
+
+ <section>
+ <title>The fascicules DTD</title>
+
+ <p>The <c>fascicules</c> DTD is a special kind of DTD which can be
+ used to specify the different parts of the documentation, and
+ which one of those should be shown as default.</p>
+
+ <p>Example:</p>
+
+ <pre><![CDATA[
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
+<fascicules>
+ <fascicule file="part" href="part_frame.html" entry="no">
+ User's Guide
+ </fascicule>
+ <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
+ Reference Manual
+ </fascicule>
+ <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
+ Release Notes
+ </fascicule>
+</fascicules>
+ ]]></pre>
+
+ <p>In the example, it is specified that the documentation for this
+ application consists of three parts: User's Guide, where
+ the "cover page" (with the two frames) is located in
+ <c>part_frame.html</c>, Reference Manual with the cover page
+ <c>ref_man_frame.html</c> and Release Notes with the cover page
+ <c>part_notes_frame.html</c>.</p>
+
+ <p>As a result, at the top of the left frame in the generated HTML
+ documentation, there will be corresponding links to User's Guide,
+ Reference Manual and Release Notes.</p>
+
+ <p>The attribute <c>entry="yes"</c> specifies that it is
+ the Reference Manual which should be shown as default. This means
+ that when generating the HTML files, <c>application_frame.html</c>
+ will be copied to <c>index.html</c>.</p>
+
+ <note>
+ <p>DocBuilder assumes that the XML file written according to
+ the <c>fascicules</c> DTD is called <c>fascicules.xml</c>.</p>
+ </note>
+
+ <p>This file is optional. If it does not exist, there are no links
+ to other parts of the documentation (as they are not known) in
+ the left frame, and no <c>index.html</c> is created.</p>
+ </section>
+
+ <section>
+ <marker id="fasciculesTAG"></marker>
+ <title>&lt;fascicules&gt;</title>
+
+ <p>Top level tag for the <c>fascicules</c> DTD.</p>
+
+ <p>Contains one or more
+ <seealso marker="#fasciculeTAG">&lt;fascicule&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="fasciculeTAG"></marker>
+ <title>&lt;fascicule&gt;</title>
+
+ <p>Specifies properties for one "part" of the documentation for an
+ application.</p>
+
+ <p>Contains plain text, the name of this part.</p>
+
+ <p>The <c>file</c> attribute should specify the file name for
+ the corresponding <c>part</c> or <c>application</c>, without
+ the <c>.xml</c> extension.</p>
+
+ <p>The <c>href</c> attribute should specify the file name for
+ the corresponding HTML cover page file, without the <c>.html</c>
+ extension.</p>
+
+ <p>The optional <c>entry="yes"|"no"</c> attribute specifies if
+ the HTML cover page should be copied to <c>index.html</c> or
+ not. Default is <c>"no"</c>.</p>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/fascicules.xml b/lib/docbuilder/doc/src/fascicules.xml
new file mode 100644
index 0000000000..1b9d6bc94d
--- /dev/null
+++ b/lib/docbuilder/doc/src/fascicules.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
+
+<fascicules>
+ <fascicule file="part" href="part_frame.html" entry="no">
+ User's Guide
+ </fascicule>
+ <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
+ Reference Manual
+ </fascicule>
+ <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
+ Release Notes
+ </fascicule>
+</fascicules>
+
diff --git a/lib/docbuilder/doc/src/gazonk b/lib/docbuilder/doc/src/gazonk
new file mode 100644
index 0000000000..1cf0b8f7bc
--- /dev/null
+++ b/lib/docbuilder/doc/src/gazonk
@@ -0,0 +1,17 @@
+This example code is used in block_tags.xml.
+
+%% Erlang example
+-module(gazonk).
+
+start() ->
+ {error,"Pid required!"}.
+
+start(Pid) ->
+ spawn(smalltalk,main,[]).
+%% Erlang example
+
+// A little C example
+int main() {
+ for(;;);
+}
+// A little C example
diff --git a/lib/docbuilder/doc/src/header_tags.xml b/lib/docbuilder/doc/src/header_tags.xml
new file mode 100644
index 0000000000..b1456d679a
--- /dev/null
+++ b/lib/docbuilder/doc/src/header_tags.xml
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Header Tags</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>header_tags.xml</file>
+ </header>
+
+ <p>Each document begins with a header part, which looks the same for
+ all DTDs. Here the title of the document is specified, as well as
+ administrative data like who is responsible for the document, which
+ version is it, when was it last changed and such.</p>
+
+ <p>An full header looks like:</p>
+ <pre>
+&lt;header>
+ &lt;copyright>...&lt;/copyright>
+ &lt;legalnotice>...&lt;/legalnotice>
+ &lt;title>...&lt;/title>
+ &lt;prepared>...&lt;/prepared>
+ &lt;responsible>...&lt;/responsible>
+ &lt;docno>...&lt;/docno>
+ &lt;approved>...&lt;/approved>
+ &lt;checked>...&lt;/checked>
+ &lt;date>...&lt;/date>
+ &lt;rev>...&lt;/rev>
+ &lt;file>...&lt;/file>
+&lt;/header>
+ </pre>
+
+ <section>
+ <marker id="headerTAG"></marker>
+ <title>&lt;header&gt;</title>
+
+ <p>Top level tag for the header part.</p>
+ </section>
+
+ <section>
+ <marker id="copyrightTAG"></marker>
+ <title>&lt;copyright&gt;</title>
+
+ <p>The <c>copyright</c> element holds information about date(s) and holder(s) of
+ a document copyright. The <c>copyright</c> element is optional.
+ The <c>copyright</c> element has an inner structure containing one or
+ more
+ <c>year</c> elements followed by zero of more <c>holder</c> elements.<br/>
+ See example below:
+ </p>
+ <code><![CDATA[
+ <copyright>
+ <year>1997</year>
+ <year>2007</year>
+ <holder>Ericsson AB</holder>
+ </copyright>
+ ]]></code>
+ </section>
+
+ <section>
+ <marker id="legalnoticeTAG"></marker>
+ <title>&lt;legalnotice&gt;</title>
+
+ <p>The <c>legalnotice</c> element is used to express copyright, trademark,
+ license, and other legal formalities of a document. The element contains
+ only PCDATA in the same manner as <c>code</c> and <c>pre</c>.
+ </p>
+ </section>
+
+ <section>
+ <marker id="titleTAG"></marker>
+ <title>&lt;title&gt;</title>
+
+ <p>For <c>part</c> and <c>application</c> documents, this will be
+ the title of the document, visible in the left frame and on
+ the front page.</p>
+
+ <p>For <c>chapter</c> documents, this will be the chapter name.</p>
+
+ <p>For reference manual documents, this tag is ignored.</p>
+ </section>
+
+ <section>
+ <title>&lt;shorttitle&gt;</title>
+
+ <p>This optional tag is ignored by DocBuilder. It will likely be
+ removed in the future.</p>
+ </section>
+
+ <section>
+ <marker id="preparedTAG"></marker>
+ <title>&lt;prepared&gt;</title>
+
+ <p>This tag is intended for administrative use and is ignored by
+ DocBuilder.</p>
+ </section>
+
+ <section>
+ <marker id="responsibleTAG"></marker>
+ <title>&lt;responsible&gt;</title>
+
+ <p>This optional tag is intended for administrative use and is
+ ignored by DocBuilder.</p>
+ </section>
+
+ <section>
+ <marker id="docnoTAG"></marker>
+ <title>&lt;docno&gt;</title>
+
+ <p>Document number.</p>
+
+ <p>For <c>part</c> and <c>application</c> documents, the document
+ number is visible in the left frame and on the front page.</p>
+
+ <p>For other types of documents, this tag is ignored.</p>
+ </section>
+
+ <section>
+ <marker id="approvedTAG"></marker>
+ <title>&lt;approved&gt;</title>
+
+ <p>This optional tag is intended for administrative use and is
+ ignored by DocBuilder.</p>
+ </section>
+
+ <section>
+ <marker id="checkedTAG"></marker>
+ <title>&lt;checked&gt;</title>
+
+ <p>This optional tag is intended for administrative use and is
+ ignored by DocBuilder.</p>
+ </section>
+
+ <section>
+ <marker id="dateTAG"></marker>
+ <title>&lt;date&gt;</title>
+
+ <p>This tag is intended for administrative use and is ignored by
+ DocBuilder.</p>
+ </section>
+
+ <section>
+ <marker id="revTAG"></marker>
+ <title>&lt;rev&gt;</title>
+
+ <p>Document version.</p>
+
+ <p>For <c>part</c> and <c>application</c> documents, the document
+ version is visible in the left frame and on the front page.</p>
+
+ <p>For other types of documents, this tag is ignored.</p>
+ </section>
+
+ <section>
+ <marker id="fileTAG"></marker>
+ <title>&lt;file&gt;</title>
+
+ <p>This optional tag is intended for administrative use and is
+ ignored by DocBuilder.</p>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/inline_tags.xml b/lib/docbuilder/doc/src/inline_tags.xml
new file mode 100644
index 0000000000..e1d392076a
--- /dev/null
+++ b/lib/docbuilder/doc/src/inline_tags.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Inline Tags</title>
+ <prepared/>
+ <docno/>
+ <date/>
+ <rev/>
+ <file>inline_tags.xml</file>
+ </header>
+
+ <p>Inline tags are typically used within block tags, for example to
+ highlight a word within a paragraph.</p>
+
+ <section>
+ <marker id="brTAG"></marker>
+ <title>&lt;br&gt; - Line Break</title>
+
+ <p>Forces a newline. The <c><![CDATA[<br>]]></c> tag is both a
+ block- and an inline tag and is described in
+ the <seealso marker="block_tags#brTAG">Block Tags</seealso>
+ section.</p>
+ </section>
+
+ <section>
+ <marker id="cTAG"></marker>
+ <title>&lt;c&gt; - Code</title>
+
+ <p>Highlights things like variables and file names in a text flow.
+ Can contain plain text only. Newlines and tabs are ignored as
+ opposed to the <seealso marker="block_tags#codeTAG">code</seealso>
+ tag. All <seealso marker="character_entities">character
+ entities</seealso> are expanded. Example:</p>
+ <pre>
+&lt;p>Returns &lt;c>true&lt;/c> if &lt;c>Term&lt;/c> is an integer.&lt;/p>
+ </pre>
+ <p>results in:</p>
+ <p>Returns <c>true</c> if <c>Term</c> is an integer.</p>
+ </section>
+
+ <section>
+ <marker id="emTAG"></marker>
+ <title>&lt;em&gt; - Emphasis</title>
+
+ <p>Highlights words which are important within a text flow. Example:
+ </p>
+ <pre>
+&lt;p>The application &lt;em>must&lt;/em> be up and running.&lt;/p>
+ </pre>
+ <p>results in:</p>
+ <p>The application <em>must</em> be up and running.</p>
+
+ <p>Contains plain text or a
+ <seealso marker="#cTAG">&lt;c&gt;</seealso> tag.</p>
+ </section>
+
+ <section>
+ <marker id="markerTAG"/>
+ <title>&lt;marker&gt; - Marker</title>
+
+ <p>Used as an anchor for hypertext references. The <c>id</c>
+ attribute defines the name of the marker. Example:</p>
+ <marker id="marker_example"/>
+ <pre>
+&lt;marker id="marker_example"/&gt;
+ </pre>
+
+ <p>The <seealso marker="#seealsoTAG">&lt;seealso&gt;</seealso> tag
+ is used to refer to the marker.</p>
+
+ <p>The <c><![CDATA[<marker>]]></c> tag is both a block- and an
+ inline tag.</p>
+ </section>
+
+ <section>
+ <marker id="pathTAG"></marker>
+ <title>&lt;path&gt; - Path</title>
+
+ <p>Highlights file paths. The attributes <c>unix</c> and
+ <c>windows</c> makes it possible to specify different paths for
+ different file path notations. Default for both are "".
+ Example:</p>
+ <pre>
+&lt;p>Look at the &lt;path unix=".profile" windows="win.ini"&gt;start-up file&lt;/path&gt;
+ if you intend to alter the initial behavior.&lt;/p>
+ </pre>
+ <p>If no <c>ptype</c> option is specified when calling
+ <seealso marker="docb_transform#file/1">docb_transform:file/1,2</seealso>,
+ this simply results in:</p>
+ <p>"Look at the <path>start-up file</path>
+ if you intend to alter the initial behavior."</p>
+
+ <p>If both the options <c>{ptype,unix}</c> and
+ <c>{ptype,windows}</c> are specified, the example instead results
+ in:</p>
+ <p>"Look at the <path unix=".profile" windows="win.ini">start-up file</path>
+ if you intend to alter the initial behavior."</p>
+ </section>
+
+ <section>
+ <marker id="seealsoTAG"></marker>
+ <title>&lt;seealso&gt; - Local Cross Reference</title>
+
+ <p>A cross reference (hypertext link) to a marker in the same file,
+ a marker in another file, or (the top of) another file, given by
+ the <c>marker</c> attribute. Must contain plain text. Examples:
+ </p>
+
+ <pre><![CDATA[
+ <seealso marker="#marker_example">marker example</seealso>
+ ]]></pre>
+ <p>results in:
+ <seealso marker="#marker_example">marker example</seealso>
+ (a hypertext link to the marker example above).</p>
+
+ <pre><![CDATA[
+ <seealso marker="block_tags#markerTAG">marker tag</seealso>
+ ]]></pre>
+ <p>results in:
+ <seealso marker="block_tags#markerTAG">marker tag</seealso>
+ (a hypertext link to the marker section in the Block Tags
+ chapter).</p>
+
+ <pre><![CDATA[
+ <seealso marker="overview">Overview</seealso>
+ ]]></pre>
+ <p>results in:
+ <seealso marker="overview">Overview</seealso>
+ (a hypertext link to the Overview chapter).</p>
+
+ <p>Note the use of "#" before the name of the marker. Note also
+ that the filename extension <c>.html</c> is omitted. This is
+ because the default behavior of DocBuilder is to translate
+ <c><![CDATA[<seealso marker="File#Marker">text</seealso>]]></c>
+ to <c><![CDATA[<A HREF="File.html#Marker">text</A>]]></c>.</p>
+
+ <p>The default behaviour can be modified by using the callback
+ module option to <c>docb_transform:file/1,2</c> and defining a
+ callback function
+ <seealso marker="docb_transform#Module:seealso/1">Module:seealso/1</seealso>.
+ This possibility is for example used in OTP to resolve cross
+ references between applications.</p>
+ </section>
+
+ <section>
+ <marker id="urlTAG"></marker>
+ <title>&lt;url&gt; - Non-Local Cross Reference</title>
+
+ <p>A reference to a file outside the documentation, a web address or
+ similar, given by the <c>href</c> attribute. Must contain plain
+ text. Example:</p>
+ <pre><![CDATA[
+<url href="http://www.erlang.org">erlang.org</url>
+ ]]></pre>
+ <p>results in: <url href="http://www.erlang.org">erlang.org</url>
+ </p>
+ </section>
+
+ <section>
+ <marker id="termTAG"></marker>
+ <marker id="termdefTAG"></marker>
+ <title>&lt;term&gt;, &lt;termdef&gt; - Glossary</title>
+
+ <p>Used to highlight a term with a local (for this document only) or
+ global definition. The identity of the term is given by
+ the <c>id</c> attribute.</p>
+
+ <p>For a locally defined term, the tag contains a
+ <c>&lt;termdef&gt;</c>, which in turn contains an explanation of
+ the term as plain text. Example:</p>
+ <pre><![CDATA[
+<term id="HTML"><termdef>Hyper-Text Markup Language</termdef></term>
+ ]]></pre>
+
+ <p>For a globally defined term, the tag is empty. Example:</p>
+ <pre><![CDATA[
+<term id="HTML"/>
+ ]]></pre>
+
+ <p>Global definitions are given to DocBuilder in a file, using the
+ <seealso marker="docb_transform#file/1">docb_transform:file/1,2</seealso>
+ option <c>term_defs</c>. The file should contain a list of tuples,
+ one for each term definition, on the format
+ <c>{Id,Name,Definition,Owner}</c>. The <c>Owner</c> part is just
+ for administration, if there are several people contributing to a
+ term definition file. Example:</p>
+ <pre>
+[...,
+ {"HTML", "HTML", "Hyper-Text Markup Language", "Gunilla"},
+ ...].
+ </pre>
+
+ <p>DocBuilder will collect both local and global definitions in a
+ glossary, which can be reached from a link in the left frame of
+ the HTML documentation.</p>
+
+ <p>In the generated HTML, it is the term name which will be visible.
+ For locally defined terms, the id and the name are the same.
+ The name has a hypertext link to the definition in the glossary.
+ Example:</p>
+ <pre><![CDATA[
+<term id="HTML"><termdef>Hyper-Text Markup Language</termdef></term>
+ ]]></pre>
+ <p>results in: <term id="HTML"><termdef>Hyper-Text Markup Language</termdef></term>
+ </p>
+
+ <p>If a term is defined both locally and globally, the global
+ definition takes precedence.</p>
+ </section>
+
+ <section>
+ <marker id="citeTAG"></marker>
+ <marker id="citedefTAG"></marker>
+ <title>&lt;cite&gt;, &lt;citedef&gt; - Bibliography</title>
+
+ <p>Works the same way as <c>&lt;term&gt;</c> and
+ <c>&lt;termdef&gt;</c>, but for a bibliography list rather than
+ a glossary.</p>
+
+ <p>A global bibliography list is given to DocBuilder in a file,
+ using the <seealso marker="docb_transform#file/1">docb_transform:file/1,2</seealso>
+ option <c>cite_defs</c>. The file should contain a list of tuples,
+ one for each cite, on the format
+ <c>{Id,Title,Info,Owner}</c>. The <c>Owner</c> part is just
+ for administration, if there are several people contributing to a
+ bibliography file. Example:</p>
+ <pre>
+[...,
+ {"erlbook","Concurrent Programming in ERLANG","J. Armstrong, R. Virding, C. Wikstr&ouml;m, M. Williams, Concurrent Programming in ERLANG, Prentice Hall, 1996, ISBN 0-13-508301-X","jocke"},
+ ...].
+ </pre>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/make.dep b/lib/docbuilder/doc/src/make.dep
new file mode 100644
index 0000000000..d9b075e114
--- /dev/null
+++ b/lib/docbuilder/doc/src/make.dep
@@ -0,0 +1,33 @@
+# ----------------------------------------------------
+# >>>> Do not edit this file <<<<
+# This file was automaticly generated by
+# /home/otp/bin/docdepend
+# ----------------------------------------------------
+
+
+# ----------------------------------------------------
+# TeX files that the DVI file depend on
+# ----------------------------------------------------
+
+book.dvi: block_tags.tex book.tex character_entities.tex \
+ docb_gen.tex docb_transform.tex docb_xml_check.tex \
+ docbuilder_app.tex fasc_dtds.tex header_tags.tex \
+ inline_tags.tex overview.tex part.tex ref_man.tex \
+ refman_dtds.tex user_guide_dtds.tex
+
+# ----------------------------------------------------
+# Source inlined when transforming from source to LaTeX
+# ----------------------------------------------------
+
+block_tags.tex: gazonk
+
+book.tex: ref_man.xml
+
+inline_tags.tex: ../../../../system/doc/definitions/term.defs
+
+# ----------------------------------------------------
+# Pictures that the DVI file depend on
+# ----------------------------------------------------
+
+book.dvi: man.ps
+
diff --git a/lib/docbuilder/doc/src/man.gif b/lib/docbuilder/doc/src/man.gif
new file mode 100644
index 0000000000..8656c7443d
--- /dev/null
+++ b/lib/docbuilder/doc/src/man.gif
Binary files differ
diff --git a/lib/docbuilder/doc/src/man.ps b/lib/docbuilder/doc/src/man.ps
new file mode 100644
index 0000000000..b4d7ef7636
--- /dev/null
+++ b/lib/docbuilder/doc/src/man.ps
@@ -0,0 +1,750 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /clearcase/otp/internal_tools/sgml/test/man.ps
+%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley
+%%BoundingBox: 243 308 369 484
+%%Pages: 1
+%%DocumentFonts:
+%%EndComments
+%%EndProlog
+
+%%Page: 1 1
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% define string to hold a scanline's worth of data
+/pix 126 string def
+
+% define space for color conversions
+/grays 126 string def % space for gray scale line
+/npixls 0 def
+/rgbindx 0 def
+
+% lower left corner
+243 308 translate
+
+% size of image (on paper, in 1/72inch coords)
+126.00000 175.96800 scale
+
+126 176 8 % dimensions of data
+[126 0 0 -176 0 176] % mapping matrix
+{currentfile pix readhexstring pop}
+image
+
+110000110011111111111100111111110011110011111111111100111111112222222222
+33445544446655665555665566666655666666888888778899888899aabbaabbbbbbaabb
+bbaaaaaaaabbbbbbaabbccddbbaaaaccccccddddccddddccbbccccccbbccccaabbaaaaaa
+9999aaaa8899887777554455666655555544
+000000110011110000001100112222111111001111111100001111111111112222112233
+55334444446666775544555555775577777766888888889988889999aaccbbaabb99aaaa
+bbbbaaaaaaaabbbbccccccccccccbbccccccccddccddddccbbaaccddccbbaaccbbbbaaaa
+999999889977667755554455666655444444
+110011000011000000111111111100111100112211111111110011111111112222222233
+3344444455446677665555667777667788888888667788aa88999999aabbaabbaa889999
+aabbbbbbaaaaaabbddccccccbbccccccbbaaccccccccccccbbccccccccbbbbbbbbaaaa99
+9999aa888877666655555555555544333344
+110000110011110000001111111111000011001122110011111111002211222211224433
+3333444444556677666655667777667777888877666688998899aa99aabbaaaaaaaabbaa
+99aabbaabbbbbbbbbbccbbddaabbccbbaa99ccddccccccbbccccccddccbbbbaaccaa9988
+889988887766665566665544443344554444
+000000000000110011000000110000110000001111000000111100221111111133222222
+33444433444455667777555555776666778888667777778888aa998888bbaa99aaaaaabb
+bbbbbbaabbccbbbbbbccbbbbbbccccaabbbbbbccccccbbbbbbbbccbbbbbbbbbbbbaa7788
+aa9988889966666655666655553355556644
+110011111111111100111100110011000000001100002211111122221122111122222222
+33443333334455776666776666667766778855668866777788448899889988889999bbaa
+aaaabbaaaabbbbaabbbbbbbbbbbbaa99bbaabbccddccccccbbccbbbbaabbbbaaaa777788
+aa9999aa9988776677777755555544556655
+110000001111111122111111000000001111110011111111110022111111111133222233
+223322445555445544667777667777667777887788887799883377999999998899aaaaaa
+99aabbbbccbbbbbbbbbbaaaaaabb99aaaabbbbbbccccccbbccccbbbbaabbaaccaa886688
+9999aaaa9988888866667744555544445544
+110000111122111111221100111111110011111111111100111111222222221122333333
+22222244556655445555667788778888aaaa88aa889999aabbaaaa998888998899aa99aa
+bbaabbccbbbbaaaabbbbbbbbbbbbaabbaaaaccccccbbccddccbbaabbaabbaabb99888888
+99aa99aa9988888866446655554444444444
+110000001111111111110011110000111100221111001111000011222222222222333344
+223322444466664455667766777788777755556666333344557788aa9999888888aa88aa
+aabbbbaabbaaccbbaaaaaaccbbccaa99bbccccccccbbccccccbbbbbbbbaabbaaaa99aa88
+999988999988887766664455445555555544
+110011111100001111111111110000000011111111110011111122111111112233222222
+443333555544444455777788775522000000000000000000000000447799aaaa99888899
+aaaabbaaaaccbbaaaabbbbbbbbaa7788bbddccccbbbbbbbbccbbbbaabbaaaaaaaaaa9999
+aa999988aa99887766666655444455445544
+000000110011110000110000110011001100001111110000111122112211112211222222
+5544444455443333446677772200000000000000000000000000000000337799999999aa
+9999aabbbbbbaaaa88aaaabbbb889988ccccccbbccbbbbaaaa9999bb8855889999999988
+998888998888886655667755554455554433
+110011001111001100001100111111000000001100111100111111222211113333222211
+44555544444433445555550000000000000000000000000011000000000000003377aa99
+888899aa99aa9999aaaabbaabb99aabbaabbbbccaabbaaaabb88aaaa995588aaaaaa8888
+8888aa998888887755777766554444332222
+111111110011111111001111001111110000000011000011001111111122332222223322
+334466554444444455441100000000000000000000000000000000001155220000113366
+998888aa99998899bbbbaabbbbaaaaaabbbbbbbbbbaabbaaaa99aaaa8888aa9999889988
+7799aa888888665566666655554433334422
+221111110011000011111111110000000000110011110000111111001111333311223333
+443344443344554488440011553300000000000000000000000000227788883300000011
+4444559999887799aaaaaaccbbaaaa9988ccccbbaabbbbaaaa99aa9988aa999988888888
+776688888877667766554455444444444433
+221111110011111100110011000011000000000000110000110011001111112222221122
+2222333333111111448899ccffddbb77442222221111000000000044bbddccaa33000000
+00000000558888998899bbaabbaabbaa99bbaabbaaaabbaa99aa99999988778888777777
+663355778877776666665544444433333322
+221100222211001111112200111111000011000000000011001100111111112211112211
+332244220011000055ddffeeeeeeeeeeddddddeeddcc88330000000044ddddcc55000000
+000000000077aaaa999999aaaabbbbbbaa99aabbbbaaaabbaaaaaa999999888888557755
+664466666677666655667755443333223322
+221111222211221111111100000011110000110000001100111111110011111122112222
+3322000000000044ddffffeeffeeeeeeeeeeeeeeffeeffdd885511000033aaddaa330011
+2211000000339988889999aaaaaabbaabbbbbbbbbbaaaaaabb99aa8899aa999988665577
+665577777766555544443366443344333322
+221111111122221111001111111100000000000000001111111111111111111111223344
+22000000000077ddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffeebb440000005588661100
+11000000001188888888aa9999aabbbbbbaaaabbaabbbbbbaa8899888899888888776666
+556666776666443366555555445533333333
+112211111122221111221100111100110000000000001111001100000000111122112211
+000000000088eeeeeeeeeeeeffeeeeffffeeeeeeffeeeeeeeeeeffee8811000000118866
+0000000000118899888899aaaabbbbbbbbbbbb99aabbaaaaaa9988888877888877555566
+555555666655446655556655444444443344
+221111111100111111110011111111110011001100110000111100110011111111000000
+0000000088ffeeddeeeeeeeeeeeeeeeeeeeeffeeeeffffeeeeeeeeffffbb775566aaeeee
+aa332233000088aa88888899bbaaaa99aabbaaaabbaabbbbaaaa88888877888877555555
+445577666655554455555566665544665533
+110000111111110011111111111111110000000000001100111111000011111111110000
+00000088ddddddddddffeeffeeeeeeeeeeeeffeeeeeeeeffeeeeeeeeeeffffffffffeedd
+eecc441111002288997788aa99aaaa99aa99aabbbbaabbaaaa9977778888777777776655
+555577776666666666666677775555555555
+001111110011001100111111112211111100110000000011110011111111001111000000
+000022aaddccddddeeeeeeeeeeeeeeeeeeeeeeeeeeffeeffeeeeeeffeeffeeeeeeeeeeee
+eeffdd3311110044998899999999aaaaaaaaaabbaabbbbaaaa8888778877888866776677
+665566667755556644665555554444666666
+110011110011111111001100002211111100110011111100111100111111111100000000
+000022bbcccccccceeeeeeeeeeeeeeeeeeeeffeeffeeffffffeeeeffeeffeeffeeeeeeee
+eeddeebb6644000088998899bbbbbbaabbbbbbaabbbbbbcc999988888877888877667777
+557777777766665544555555555555665566
+110011221111111111111111111111221100001100110011111111221100221100000000
+00001199aabbccccddeeeeeeeeeeeeeeeeeeeeeeffffeeffeeffeeeeffeeffeeeeeeeeee
+eeddeeeebb88110066aa99aabbccbbaabbbbbbaabbbbbbbbbb99aaaa9988777766667777
+666677777777665544665566555566664455
+221111222222111111111111221111111111111111001111111100221122221100000000
+000022aabbbbaaccddeeeeeeeeddeeeeeeffeeeeeeeeffeeffeeffeeffffeeeeeeeeeeee
+eeeeeeeeeecc220066aaaaaaaabbbbbbccaabbaaaabbccbbaaaaaa998888886677887777
+777777888866776655667755665566666655
+222211222222111122111122111111000000001111111111111122111122220000000000
+00002299bbaaaabbddeeeeeeddeeffeeeeeeeeeeffeeeeeeeeffeeeeffffffeeeeeeeeee
+eeeeeeeeeecc330044aaaabbaabbbbbbaaaabb99aabbbbbbbbaaaa889988888877888888
+887777778888776644777777666677667766
+222222332233222211221111221111110000111111222222222211222222221100000000
+00001188cc99aabbddddddeeeeeeeeeeeeeeffeeeeeeeeeeffeeeeffeeffeeeeeeeeeeee
+eeeeeeeeeeee440044bbaabbbbaabbbb9999aaaabbaabbbbbb9999998888887788888899
+887777778888887755776677667755667755
+221122442222222222332211222222111111001111222222221133112222220000000000
+00001177bbaaaaaaeeddeeddeeeeddeeeeeeeeeeeeeeeeeeffeeffffeeeeeeffeeeeeedd
+eeeeffeeddffaa0022aabbbbbbbbbbaaaa99bbbbaabbaabbaa9988888888998888887777
+888866777788888888888877666655445566
+331133442233333333332222332211111111111111112222222233221122220000000000
+0000115599aabbccddddeeddeeeeeeeeeeeeeeeeffeeeeffeeffeeffffffeeffeeffddee
+eeeeeeeeeeffdd110088bbbbbbccbbaa99bbaabbaaaabbbbbbbb99888888888888666677
+777777778888666677888877775544444455
+332222332222334422222233222233110011222222112233223322222211221100000000
+000000228899aabbddddeeddeeeeeeeeeeeeeeeeffeeeeeeffeeffeeeeffeeffeeeeeedd
+eeffeeeeeeeecc220066bbaabbbbbbaaaa999999aaaaaaaa9999aaaa9988888877776688
+888877778888776677887777666666665544
+333311332233333333222222222233331111113322222222223322332222220000000000
+000000225577aabbccddddddeeeeeeeeeeeeeeeeeeeeeeffffffffeeffffeeeeeeeeeeee
+eeeeeeeeeeeedd110044bbaaaabbaabb99999999aabbaa999999aa999999998888777788
+888855888888886677777788777777555555
+222211222222224444111122222211222233221133443344332233333322551100000000
+00000022557788aaccddeeddddeeddeeeeeeeeeeffffeeffeeeeffeeeeeeeeffeeffeedd
+eeeeeeeeeeeedd33003399aaaabbbbaaaa88999999aaaaaa99aaaabbaaaaaa9999778888
+887766888888885577776666777766556644
+222211222222222233334422222222112233222233554444332222222222440000000000
+0000001144779988bbccddddddffddeeeeeeffeeeeeeeeffffffeeeeeeffeeffffeeeedd
+eeeeeeeeeeeedd2200228899aaaaaa88888899999999bbaa99aabbbbbbaa999988888888
+887777778877665566886666666677775566
+443322111133331111222233332222332222332233223333333333332233331100000000
+000000115555668899ddddddddeeeeeeeeffeeffffffeeffeeeeffeeeeeeeeeeeeeeeedd
+eeeeeeeeeeeedd2200339999aabbaa889999aaaa99aabbaaaa99bbbbaaaa998899998888
+888888997777775577777777777777666666
+332211223322222222221122223333221122112233333333332244333333330000000000
+0000000033444466aaccccddddeeeeeeeeeeeeffeeeeeeffeeeeeeeeeeffeeeeffffeedd
+eeeeeeeeeeeecc2200228899aaaa9988aaaaaaaa99aa99bbaabbaaaa99999988aa999988
+888888887777776677666666776666556644
+332222222233222233332222333333331133332233224433333344554444331100000000
+000000110044777788aaeeeeddeeeeddddddeeeeeeeeeeffeeffeeeeeeeeeeeeeeeedddd
+ddeeddeeeeeedd220011aa9999aa999999bbbbbb99bbbbbbbbbbbbaaaaaa999999888899
+998888888888666677556677666655555555
+332222222222333333443333333322443333443344334433444455553333330000000000
+000000002233557788ccccccccaa775555446688ccddcceeeeeeeeeeddeeeeeeeeeedddd
+eeddeeeeeeeedd44003399aa88aaaa99aaaaaaaa99bbbbbbbbbbbbbbbbbbaa999999aa88
+888866887788775577667755556655555544
+331122332222444433333333223333333344444444554433445555664444441100000000
+00000000332244889999777788330000000000116688aaddccddddccddddaa88aa99aadd
+ddddeeeeeeddee660022aa99999999bb99bbbbaaaabbbbbbbbccbbbbbbbbaa99aaaa8888
+888877776677667755777755445555556655
+331122333333335544554433333322443344555555554433334433556655441100000000
+000000000000225544221100110000000000001111557799ccbb88778877110011003388
+bbddeeeeeeddee55002299aa999999aaaabbaabbaabbbbbbaaaaaabbaaaabbaa99998888
+887777667788666666666666555555554444
+333333333322444444555555444444444455556666555544334455336666551100000000
+000000001111001100000000000000000000000011224455889966111111000000000011
+66aaddeeeeeeee550033aa99aa999999bb99bbccaabbbbaaaaaaaabbaaaabbaabb888888
+667777777777775577554455553344444444
+223344332233555544556666665533335544556655555533446655555555661100000000
+00001100111100000000000011000000000000000011449999bb77000000000000004433
+225588cceeeeff660044aaaa888899aa9999aaaa99aabbaaaaaa99bbbb9999aaaa998888
+886677777777667766555555443355554455
+443344332233556655666655666633555544555555555555555566555555662200000000
+0000001111110000000000001100000000000000000066ddeeee990000000000000066bb
+bb88bbcceeeeee880066aaaa9999bb9999aa99998899aa999999aaaabbaaaaaa99889988
+778888776677666655444455665555554433
+443333442233445577665566666655444444666655667766666666666644443300000000
+0000001133220000000000000000000000000000000055eeeeeebb110000000000000022
+bbffddddeeeeff88007799999999aabbaa9999999988aa99999999bbaaaa888877888888
+887777777766666655664455554455443344
+444422335566557766776666555544444455556666555555556666668899aa5500000000
+0000002233220000000000000044110011110000000055ffeeffcc110000000000000000
+0077ddddddddeebb118899999999aaaaaa8888aa88aaaaaa9999aabbaaaa997755889988
+887766777766775555665555444444443344
+555544333344556666556666445566556666555555665566665555335566999922000000
+0000002244332200000000001177663366330000000088eeeeffdd110000001100112200
+000066cceeeeeebb66ccbbaa9999aaaa998899aaaabbbbaa9988aaaabb99998888888877
+777755776666666655555555554444444444
+445555554444555555557766445544666677665566666666776611000000002233000000
+00000022445544112233442255442211110000000033bbeeeeeeee880000002255999966
+330033ddeeeeeeddddeeeeffccaa99998899aaaabbbbaaaa999999999999999988888877
+777766665566666655665544444444553333
+444444556666445555776666555566667777775566666655665500000000000000000000
+00000000334433337799999988775533112244225599ccddeeeeffee885533111166bbcc
+bb6666ddffeeeeeeeeeeaa66aa99aa889999bbbbbbbb99aa999999999999998888888877
+667766555555555555444433444444333322
+334444445577665555556666665566665577666644444466664400000000000000000000
+000000002255667788bbbbbbaabb998866556688aabbddeeeeeeeeeedd8888bbaaccddee
+eeeeddeeeeeeddeebb22000066aa88aabbaaccbbaa99aa99889988999999889999888877
+777766666666665544334455443333333333
+333355444466557766776655555555556666664455446666665500000000000000000000
+0000000011335577aaccddddddccbb998899ccddddccddeeffeeeeeeeedd8899ddeeeeee
+eeddffeeeeeedddd3322220066aaaaaabb99bbbb99aaaa88888899888888888877887777
+556688553355665533444433334433333344
+444444225555445566888866666666777777776666556666664400000000000000000000
+0000000011224477aaddddeeddddddddddddddddddddeeeeeeffeeeeeeeecc88aaddeeee
+eeeeeeeeeeeeeecc66dd8800779988bbbbaabbbbaaaa9988888888999977776677776666
+557766553355556644443333333344221133
+77bbccbb9988774455667777667788888877886666667777666611000000000000000000
+0000001111335577bbccddddeeeeeeddeeeeddddccddeeeeffeeeeeeeeeeffddddddeeee
+eeeeffeeeeeeddccddeedd22999988aa99aaaa8899aa9988888888888888776677777766
+776666665555555544444444332222112211
+bbeeffffffeeeedd88444455668899998866776666666677775533000000000000000000
+0011114433446688bbccccccddddeeeeddddbbddeeddeeeeffffeeffeeffeeffffffeeee
+ffeeeeffeeeeeebb77eeee88cc889999aaaa99aa99998888778888888888668888997777
+777777667766665533334433332222222222
+77ddeeffeeffeeeeee995555557788888888776677775577776655221100000000001100
+1122225555665588aabbbbccddddddeeccaabbeeddccddeeeeeeffeeffeeeeeeffeeeeee
+eeffeeffeeeeffcc33bbeeeebbaaaaaa99aaaa9999888877889999999988777788887777
+888866556677665533334433112211222222
+4499bbbbeeeeeeeeeeee6633667799889988778877667788777777332200110000001100
+444477888866667799aabbccccddddddbb8888aa7755779999bbddeeffffeeeeeeffeeee
+eeddeeeeffeeeedd44bbeeeebbaaaa99aaaaaa99889999888888aa99aa88776677888877
+887777666666554433554422222222222211
+003322446677cceeeeeeaa66777788888888888877667788887788662211113300002222
+66887777665566667799aabbccccccaa88443322000011223344446677ccffeeeeeeeeff
+eebbeeeeeecceeeeaacceeeebbbbaaaaaabbaabbaa999988778899998888888888778888
+777766776677665555442222222233222222
+00220000000066ccffeeffaa776677887777887777777788888877773311005566115533
+7788996666445566667799bbccbbaaaa9933000000000000000000000066ffeeeeffeeee
+eeddeeffeeffeeffeeddeeddbbaaaa99aaaaaabbccaaaa88889988999988888877888877
+888877667766666644332244442222223322
+1111000000000044aaeeffdd777755777788778877777788888888776611221122888844
+88aa77776655445555778899aa7788aaaa44000000000000000000000077ffeeeeddeeee
+eeeeeeeeeeeeeeeeeeeeffccaaaaaa9999aaaaaabbaaaa9999888899bb99888866778888
+777777665555554444333322222222221122
+22000000001111001177dddd999999886666888877887788778888888844115544aa8888
+9988888866555555446666666666bbcc99330000000000000000000055eeffeeeeccddee
+eeeeeeeeffeeffeeeeeeeeccaaaabbbbaaaabbbbaaaaaa88889999aa8899886688777766
+778888775566554433332233333322331111
+4400000000443300000033bbffeeffeebb666677888888888888777766663333bbbb88bb
+aa998888885555554444221144aaccbb330000000000000000000033ccffeeeeffddcccc
+cceeeeeeeeffeeeeeeffeebbbbbbbbbbbbaaaaaaaabbaa8899aa99889999888877888877
+667777668888998844332244442244332222
+770000000077ccbb996677eeeeeeeeeeeebb5566777788889988777777777755ccbbaacc
+bbaa9988775577664400000055bb6633110000000000000000000077bbddeeeeeeffddaa
+bbddddddddddffeeffeeeebbbbccccbbbbbbaaaaaaaa8888888888998899888888888888
+776677aaddeeeedd77223344443344333311
+dd77000011aa99aaddeecccceeeeeeeeeeeebbaa6677888899887788778888cceeccbbbb
+ccaa998888888855110000337733000000000000000000000000005599ddccddeeeeeedd
+aa99ccddaacceeffeeeeeeeebbaaccbbbbaa99aa99998888887799998899998877888888
+8888cceeeeeeeeddbb553344333333333322
+eeee88000077220033998866aaeeeeeeeeeeeeeeaa777788aa8899997788aaddccbbcccc
+ccbbaaaabb9977440000335522000000000000000000000000000000227788aaeeeeeeee
+bb8899ccddaaaaeeeeeeeeffcc99aaaa99999999aaaa8888888888777777888877777788
+88cceeeeeeeeddeeeeaa3344444433443333
+eeeedd55004488000011110077ffeeeeeeeeeeeeffbb8877889988999999ddddddddddcc
+ddccccbb8866332200113300000000000000000000000000000000000000334488cceeee
+ddccaa88bbbb6655bbffeeeeeeccaa9999aaaa99998899997777889999aa998888888866
+3388ddddddddcc88ccdd9944334433443322
+eeeeee88110066110000000088eeeeeeeeeeffeeeeeecc9977889999aacceeddeeeedddd
+ddddaa88663300000000000000000000000000000000000000000011000000000022aadd
+eeddccbb99aa88111188eeffeeffddaa99aaaaaa88998888888888aaeeeeeebbbbddddaa
+1155ccaa55443311aaeedd88222222332211
+ddccdd88440000000000000077ddeeeeeeeeeeffeeeeffeebb99aaaaccddeeeeeeeeeeee
+ddbb777777442200000000000000000000000000001188ccbb9999bb8833000000002222
+77ddddddccbb8844000044ddffffffeeaa88aa9999998888888888cceeddeeddeeeeeedd
+2288bb991100000066bbddcc551122222222
+cc666622221100000000000055ddeeeeeeeeeeeeeeeeeeeeee9999ccddeeeeffeeeeeeee
+eeddccaa884422331100000000000000000000001177eeeeeeeedddddd99550000001133
+1155ddeeddddcc8855000033aaeeeeffdd9999aa9999aa88995555cceeeeddeeeeeeeebb
+00559999440000000055bbddbb3322223322
+ffdd4400001100000000000044ddeeeeeeeeeeeeeeeeeeeeeeccbbeeffeeeeeeeeffeeee
+eeddeeccbb8866772200000000000000000000001144668899aabbddddccbb66110044bb
+bbbbcccceeeeddddcc8877332277cceeeeeebb88999999aadd7799eeeeeeeeeeeeddddaa
+4444775577220000000044bbee7711222211
+eeeecc33000000000000000033cceeeeeeeeeeeeeeeeeeffeeffeeffeeeeffeeffeeffff
+eeffeeddeeccbb884411000000000000000011000000000000000088ccddddaa6644bbee
+ddffeeddeeeeeeeeeeffffeeddbbddeeffeeeeddaa88aaccddbbeeddeeddddeeeeee8844
+7711221100000000001177ccddbb44112211
+eeeeffaa000000000000000066eeeeeeddddeeeeffeeeeeeffeeeeeeffeeeeffeeeeffff
+eeeeeeeeeeeeeecc66110000000000000022666655334433446688bbeeddeeddbbccddee
+eeeeeeeeeeddeeeeffffeeeeffffffeeeeeeeeffdd99cceeddbbddeeddddeeddeecc2200
+22000000000000003399ccccdddd88111122
+eeeeeeee550000000000000088eeddddddccddddeeeeddeeeeeeeeeeffeeffeeeeffffee
+ffffeeeeffeeeeee99220000000011336688bbddddddddeeeeffeeeeeeeeeeeeeeeeeeee
+ffeeffeeeeeeeeffeeeeeeffeeffeeeeffeeeeeeffddddeedd99ccddddddeeeedd660000
+00000000000000001166ccddddeeaa222222
+eeeeeeee880000000000000099eecc888888ddccccaa88ccddeeeeeeeeeeffeeffeeffee
+ffeeeeffeeeeeeddbb3300001122336688aaddeeeeddeeeeeeeeeeffffeeeeffeeeeeeee
+eeffeeffeeeeeeeeeeffeeeeffeeeeeeeeeeeeeeeeccccddcc5588aacceeddeecc220000
+0000000000000000004499bbccddcc331111
+eeeeeeee990000000000000088ddccdd6622bbddbb4455ddbbaaeeeeffeeffeeeeeeffff
+eeffeeeeeeeeddcc996633335522335588aaccddeeeeeeeeeeeeeeeeeeffeeffffeeeeff
+ffeeeeffffeeeeeeeeffeeeeeeffeeeeeeeeeeeeff99779988003377ccddeeee99000000
+000000000000000000000055bbddcc441122
+ffeeeeeedd3300000000000077cceeee880044aabb55ccffddccddffeeeeffeeeeeeeeff
+eeffeeeeeeddccbb776644442211223377aaccddeeeeeeeeeeeeffffffeeffeeeeeeffee
+ffeeeeeeeeeeeeffffeeeeffeeeeffffeeffeeffff8811333300001199ddeeee66000000
+0000000000000000001155ccddccdd551111
+eeeeeeeedd991100000000000077ccdd555577111133ddffeeddddffffffeeffffffeeee
+ffffeeeeffddccbb7733110000000011336688bbcccceeeeeeeeeeffeeeeffffffeeeeee
+ffeeffeeffeeffeeeeffeeffeeffffeeffeeffeeff99000000000066ddddeecc22000000
+00000000000000004499ccdddddddd771122
+eeeeeeeeeedd6600000000000000226677ddee66000088bbcc8866777799ccbbaabbbbcc
+ddeeffffffeeeeeebb6644110000000000113355668899bbbbddddddeeeeeeddeeeeeeff
+eeeeeeeeeeeeeeffffeeffffeeeeddddccddddddee990000000000aaffeeeeaa00000000
+00000000000000005588bbccccdddd880011
+eeeeffeeeeeebb99220000000000000055bbaa3300000011220000003399aa9988886666
+66888888bbddeeeeeeddcc9933000000000000000011224466778888aabbddddeeeeeeee
+ffffeeffffeeeeeeccbbbbaaaa777777774411222211000000000055aaaaaa6622000000
+00000000000000004499bbccddddee991111
+eeeeeeffeeddddcc4422220000000000001133000000000000000000669999aaaa99aa99
+999911000011445588aacccc88110000000000000000222222223322336699bbddeeffee
+ffeeeeddccccccaaaaaaaabbbbaabbbbbb66000000220000000000001111110000000000
+000000000000001155aabbddccddddbb2211
+ffeeffeeeeeecccc99aa55000000000000000000000000000000001188888899aaaaaaaa
+99770000000000000000113333000000000000000000000011000000002277cceeeeddaa
+8888ccccccccccccbbbbccddbbbbbbbbcc88000000000000000000000000000000000000
+00000000000000116699ccddddddeecc2211
+eeeeeeeeeeeeddccddccbb661100000000000000000000000000227788778877889999aa
+660000000000000000000000000000000000000000111100000000000011445544331100
+0088ccccccccccccccbbbbccccbbbbbbaa99110000000000000000000000000000000000
+000000000000002266aaccddddddddcc3300
+eeeeeeeeeeeeddddbbccccccaa88887788aa440000000000004488778888887788779977
+110000000000000000000000000000000000001111111111001111000000000000000000
+55ccccbbccccbbccccbbbbbbbbbbbb999999772200000000000000000000000000000000
+000000000000002277aaddddccccdddd5511
+eeeeeeffffddddddddddeeddddeeddeeddcc773311000000337766777777667766776611
+000000000000000000000000000000000000000000000000000000000000000000000055
+ccbbbbccbbccccbbbbbbbbbbbbaaaaaaaa99997711000000000000000000000000000000
+000000000000001166aabbccccdddddd7711
+eeeeffeeeeeeeeeeeeddeeddeeddddddccbb996611001144777777776677776666771100
+0000110000000000000000000000000000000000000000000000000000000000000022dd
+8844ccbbbbaabbaabbbbaabbaaaaaa99aa99aa7766110000000000000000000011557777
+66330000000000003388aaccdddddddd9911
+ddeeddeeeeeeeeeeddeeddddeeddddccbbaa883300004466667777666655666688440000
+0000001111000000000000000000000000000000000000000000000000000000000099ff
+aa0077bb99aabbbbbbbb99aaaa99999999aa887766440000000000000000003388bbccbb
+cc773300110000002277bbbbccccddddaa22
+ddeeddeeeeeeddeeeeddddddddddddbb9988330000336655886688776655556688220000
+00000011222211000000000000000000000000000000000000000000000000000077eeff
+bb001199ccbbaaaaaaaaaa889988999999997777777733000000000000001166aaccccdd
+ccbb770066550000336699ccddccdddddd55
+99aabbddddeeddeeddddddcceeddcc887755110011556666667777776677775522000000
+000011224455441100000000000000000000000000000000000000000000000066eeeeee
+cc0000338899bb999999999988888888aa998888777755000000000000002277bbccccdd
+ddcc991177882200336699bbddccddddddaa
+22333366ccddddddddccddbbaa9977333311001144666655666688889966330000000000
+0000115555777777551100000000000000000000000000000000000000000044ddeeeeee
+ee220000002277aabbaaaaaa99888899aa99aa88777766220000000000000055aaccddcc
+ddcc991133885522113388ccccddddccccdd
+0000000088aa888888887733221100000000115566776677777799994411000000000000
+00001155777788998877773300000000000000110000000000000000000077cceeeeeeee
+ee2200000000003377aabbbbaaaa9988aaaaaa999977665500000000000000117799aabb
+ccbb883311443311112266bbccccdddddddd
+000000002233001122111100000000002244667766668866888899220000000000000000
+000000777799aaaa99aaaa99550000000000000000000000000000003388ddeeeeeeffee
+ee33000000001100003388ccbbaa99999999999988775566330000000000000011558899
+aa9977220011000011335588ccddddeeddee
+00000000000000000000000000001144667766667788aa99aa8811000000000000000000
+0000003377aabb99bbbbccaa77663300000000000000000000000055cceeeeeeeeeeeeff
+ee3300000000001100000055aaccaaaa9988778888887755553300000000000000115566
+776622000000000000113377bbddccdddddd
+00000000000000000000000000336677777788777788aa99661100000000000000000000
+000000117799aaccccccccbbbbaa99440000000000000000002288ddeeeeeeeeffeeeeee
+dd22000000000000110000002288aaaaaa99778888778877776644000000000000002222
+22110000000000000000003388aaccddddee
+000000000000000000000022667777887788777799884411000000000000000000000000
+0000000077aabbccddddccccddccddbb88442200000000000088ffeeeeeeeeffeeeeeeff
+dd1100000000000000110000000044aabbaa999999888888665566440000000000000000
+0000000000000000000000001155bbccdddd
+000000000000000022556688776688888877887733000000000000000000000000000000
+0000000055bbccddccddddddddeeeedddddd8800000011110000bbffeeeeeeeeffeeeeff
+dd1100000000000000001100000000224444667777778888887766555500000000000000
+00000000000000000000000000003388ccdd
+000000001133558899998888887788998899660000000000000000000000000000000000
+0000000022aaccddddddeeeeeeeeeeeeeedd330000117766447733ddeeeeffeeeeeeeeff
+aa0000000000000000000000000000000000000000113344667788887766110000000000
+000000000000000000000000000000117799
+0000446688aabb88aa999988998888999977000000000000000000000000000000000000
+0000000000aaccddeeeeeeeeeeeeeeeeffaa00000044dd7788ee77aaeeffeeeeffeeffff
+880000000000000000000000000000000000000000000000001122222233441100000000
+000000000000000000000000000000000033
+777788aa9988888888888899aa8899886600000000000000000000000000000000000000
+000000000088ddeeeeeeeeeeeeeeeeffeeaa550066bbdd99cceeccaaffeeeeeeeeffeeff
+550000000000000000000000000000000000000000000000000000000000113322000000
+000000000000000000000000000000000000
+884422331100000000000022331100000000000000000000000000000000000000000000
+000000000077ddeeeeeeffeeffffffffbbaa6611aaddeecceeeeeebbeeffeeffffeeffee
+440000000000000000000000000000000000000000000000000000000000000022110000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000077ddeeeeeeeeffeeeeffcc1111113399bbee88cceeee99aaffffeeffeeeeee
+330000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000044ddeeeeeeeeffeeeeff66002266001166ee66aaeeee6666ffeeeeeeeeffdd
+110000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000022ddeeeeeeeeeeffffcc11001155003388eeddddeebb2211ddffeeffeeffcc
+110000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000aaffeeeeffeeeeff8800000088221155cceebbbb55000088ffeeeeeeffcc
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000077eeeeeeeeeeeeee3300000088660055ccdd554411000044ffffffeeffbb
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000022ddffeeffffff990055330055990077dddd221111330011ccffeeffff88
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000bbffeeeeeeee442299770022aa0077dddd442266bb9944aaffeeffff88
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000066ffeeeeff882288ddaa000077331188993399eeeeffcc99eeeeeeff77
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000011ddffeeffaa99ddeecc11001111001199bbeeeeeeeeeebbddffeecc11
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000066ffeeeeffeeeeeeee2200000066bbddeeeeeeeeeeffddcceebb5500
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000055ddeeeeeeeeffee550055aaaacceeccddffffeeeeeeeeeeffcc00
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000aaffeeffeeeeee66337788bbeeeeeeeeffeeffeeeeeeeeffcc00
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000033cceeeeeeeeeeee440066ddeeeeeeeeeeeeeeeeffeeffeeffbb00
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000055eeeeffeeffeeee88aacceeddeeeeeeeeeeeeffeeeeffeeff8800
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000011ddeeeeeeeeeeeeddddddeeeeeeeeffeeeeffeeffffeeffff6600
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000088ffeeffeeeeeeeeeeddeeeeeeffeeeeeeeeffeeeeffeeff4400
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000033eeeeeeffeeeeeeeeeeffeeeeeeeeeeddeeeeeeeeffeeee3300
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000011bbffeeeeffeeddeeddddbbaaaaddddcceeffeeffeeffee2200
+000000000000000000000000000000000000000000000000000000002200220000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000088ffeeeeeeddddcc9999aaaaddeeeeeeffeeffeeeeffcc0000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000044eeffeeffccddddccddeeeeeeeeeeeeeeeeeeffffffaa0000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000099ffcc5544cceeddddeeddccddeeddddeeeeeeeeff990000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000044ff9911004499aabbccccccccddbbaabbccddffff660000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000011ccbb996655bbbbaaccbbbbddddaaaaccddcceeee550000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000006688000066ddcccceeeeeeeeffeeddccaabbeeff330000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000001144000066eeeeeeddccbbbbbb7722220022bbee110000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000022665599aaccbbaabb775588778899cc000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000002211001177bbddbbaabbaa99ddeedd8844000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000110077bbddddeeffeeeeffeeffaa00000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000088aaeeffeeddccbbcc776655996600000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000778877555533445588113355882200000000
+441100000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000007799ccccddbbddeeee3300000000
+331100000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000001155bbeeeeeeeeffeeeeeeff5500000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000004488ddeeeeeeeeeeeeeeeedd2200000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000033bbddeeeeeeffeeeeffaa0000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000088ccddeeeeeeeeeeff880000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000044aaeeeeffeeeeeeff550000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000001188ddccccddbb9988000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000022222233774422000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000116699aaccddbb44000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000002288888888992200000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000002255661100000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000011000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000113355882200000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000011778899771100000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000002244110000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000110000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000001100
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000001100
+000000000000000000000000000000000000000000000000000000000033110000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000022440000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000011220000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000001100000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000001100000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000001100000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000110000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000001100000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000
+001100110011001100110011001100110000000000000000000000000000000000000000
+000000000000000000000000000000000000000000221100000000000000000000001111
+110000001100001100110000110000000000000000000000000000000000000000001100
+001100000000000000000000110000001100
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
diff --git a/lib/docbuilder/doc/src/notes.xml b/lib/docbuilder/doc/src/notes.xml
new file mode 100644
index 0000000000..1131bbaf91
--- /dev/null
+++ b/lib/docbuilder/doc/src/notes.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2007</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>DocBuilder Release Notes</title>
+ <prepared>otp_appnotes</prepared>
+ <docno>nil</docno>
+ <date>nil</date>
+ <rev>nil</rev>
+ <file>notes.xml</file>
+ </header>
+ <p>This document describes the changes made to the DocBuilder
+ application.</p>
+
+<section><title>Docbuilder 0.9.8.6</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The documentation is now built with open source tools
+ (xsltproc and fop) that exists on most platforms. One
+ visible change is that the frames are removed.</p>
+ <p>
+ Own Id: OTP-8201</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Docbuilder 0.9.8.5</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>The copyright notices have been updated.</p>
+ <p>
+ Own Id: OTP-7851</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Docbuilder 0.9.8.4</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The element "code" with multiple CDATA or CDATA plus
+ other data now works as expected, previously it caused a
+ crash.</p>
+ <p>
+ Own Id: OTP-7236</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Docbuilder 0.9.8</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The generated html should now be valid xhtml (with a few
+ exceptions to be fixed in next version).</p>
+ <p>
+ Own Id: OTP-7027</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+ <section><title>Docbuilder 0.9.7</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ New fonts and new CSS style included in generated html documents.
+ </p>
+ </item>
+ <item>
+ <p>
+ Updated DTD's with new header elements copyright and legalnotice.
+ Element authors changed to optional instead of mandatory.
+
+ </p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section><title>Docbuilder 0.9.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Line breaks within <c>pre</c> are now always preserved.</p>
+ <p>
+ The definition of <c>name</c> in the cref DTD is now
+ correctly handled.</p>
+ <p>
+ <c>docb_transform</c>: The HTML snippet returned by the
+ <c>Module:head()</c> callback function is now placed
+ below the title in the HTML file (as specified in the
+ documentation), not on the same line.</p>
+ <p>
+ <c>docb_gen</c>: Added option <c>sort_functions</c>.</p>
+ <p>
+ Fixed bugs in cites and terms DTD, and also in book,
+ bookinsidecover and report DTDs which are not officially
+ supported (yet).</p>
+ <p>
+ License info added to all DTD files.</p>
+ <p>
+ Corrections and clarifications made to the User's Guide.</p>
+ <p>
+ Own Id: OTP-6775</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>DocBuilder 0.9</title>
+ <p>First version of DocBuilder released as part of Erlang/OTP.
+ Previously it has been used as an internal tool only.</p>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/overview.xml b/lib/docbuilder/doc/src/overview.xml
new file mode 100644
index 0000000000..ca13c5d436
--- /dev/null
+++ b/lib/docbuilder/doc/src/overview.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+ <title>Overview</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>overview.xml</file>
+ </header>
+
+ <section>
+ <title>Background</title>
+
+ <p>DocBuilder has been used within the OTP project to generate
+ documentation for Erlang/OTP itself for more than ten years.
+ It has now been released as a regular Erlang/OTP application.</p>
+
+ <p>The intention with DocBuilder is that it should be as easy to
+ use and maintain as possible and generate adequate documentation
+ for OTP's needs. It uses frames, which can probably be regarded as
+ old-fashioned today. Hopefully, this should be improved in
+ the future.</p>
+
+ <p>Originally, DocBuilder input was SGML files and external tools
+ was used for parsing. The internal version used in the OTP
+ project can generate not only HTML code but also LaTeX (for PDF
+ and PostScript) and nroff (for UNIX man pages). (Again, using
+ external tools). Because of this, the parsed source code is
+ transformed into a tree structure before being transformed again
+ into the desired format.</p>
+ </section>
+
+ <section>
+ <title>DTD Suite</title>
+
+ <p>Input is written as XML according to one of the DTDs and output
+ is corresponding HTML. Documentation for an Erlang/OTP application
+ is usually organized as follows:</p>
+ <taglist>
+ <tag><em>User's Guide</em></tag>
+ <item>
+ <p>(DTD:
+ <seealso marker="user_guide_dtds#partDTD">part</seealso>)
+ A collection of chapters
+ (<seealso marker="user_guide_dtds#chapterDTD">chapter</seealso>).
+ </p>
+ </item>
+
+ <tag><em>Reference Manual</em></tag>
+ <item>
+ <p>(DTD:
+ <seealso marker="refman_dtds#applicationDTD">application</seealso>
+ A collection of manual pages for modules
+ (<seealso marker="refman_dtds#erlrefDTD">erlref</seealso>),
+ applications
+ (<seealso marker="refman_dtds#apprefDTD">appref</seealso>),
+ commands
+ (<seealso marker="refman_dtds#comrefDTD">comref</seealso>),
+ C libraries
+ (<seealso marker="refman_dtds#crefDTD">cref</seealso>) and
+ files
+ (<seealso marker="refman_dtds#filerefDTD">fileref</seealso>).
+ </p>
+ </item>
+
+ <tag><em>Release Notes</em></tag>
+ <item>
+ <p>Same structure as the User's Guide.</p>
+ </item>
+ </taglist>
+
+ <p>In some cases, one or more of the User's Guide, Reference Manual
+ and Release Notes are omitted. Also, it is possible to use either
+ the <c>application</c> or <c>part</c> DTD to write other types
+ of documentation for the application.</p>
+
+ <p>A special kind of DTD,
+ <seealso marker="fasc_dtds">fascicules</seealso>, can be used to
+ specify the different parts of the documentation, and which one
+ of those should be shown as default.</p>
+ </section>
+
+ <section>
+ <title>Structure of Generated HTML</title>
+
+ <p>The generated HTML corresponding to a <c>part</c> or
+ <c>application</c> document is split into a left frame and a right
+ frame. The left frame contains information about the document
+ and links to the included files, that is chapters or manual pages.
+ The right frame is used to display either the front page for
+ the document, or the selected chapter/manual page.</p>
+
+ <p>The left frame also contains links to a bibliography and a
+ glossary, which are automatically generated.</p>
+
+ <p>In the case of an <c>application</c> document, the left frame
+ also contains a link to an automatically generated index.</p>
+ </section>
+
+ <section>
+ <title>Basic Tags</title>
+
+ <p>All DTDs in the DocBuilder DTD suite share a basic set of tags.
+ An author can easily switch from one DTD to another and still use
+ the same basic tags. It is furthermore easy to copy pieces of
+ information from one document to another, even though they do not
+ use the same DTD.</p>
+
+ <p>The basic set of tags are divided into two categories:
+ <seealso marker="block_tags">block tags</seealso> and
+ <seealso marker="inline_tags">inline tags</seealso>. Block tags
+ typically define a separate block of information, like a
+ paragraph or a list. Inline tags are typically used within block
+ tags, for example a highlighted word within a paragraph.</p>
+ </section>
+
+ <section>
+ <title>About This Document</title>
+
+ <p>In this User's Guide, the structure of the different documents
+ and the meaning of the tags are explained. There are numerous
+ examples of documentation source code.</p>
+
+ <p>For readability and simplicity, the examples have been kept as
+ short as possible. For an example of what the generated HTML
+ will look like, it is recommended to look at the DocBuilder
+ documentation itself:</p>
+ <list>
+ <item>This User's Guide is written using the <c>part</c> and
+ <c>chapter</c> DTDs.</item>
+
+ <item>The Reference Manual is written using
+ the <c>application</c>, <c>appref</c> and <c>erlref</c> DTDs.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Usage</title>
+
+ <list type="ordered">
+ <item>
+ <p>Create the relevant XML files.</p>
+
+ <p>If there are EDoc comments in a module, the function
+ <seealso marker="docb_gen#module/1">docb_gen:module/1,2</seealso>
+ can be used to generate an XML file according to
+ the <c>erlref</c> DTD for this module.</p>
+ </item>
+
+ <item>
+ <p>The XML files can be validated using
+ <seealso marker="docb_xml_check#validate/1">docb_xml_check:validate/1</seealso>.
+ </p>
+ </item>
+
+ <item>
+ <p>Generate HTML files by using
+ <seealso marker="docb_transform#file/1">docb_transform:file/1,2</seealso>.
+ </p>
+ </item>
+ </list>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/part.xml b/lib/docbuilder/doc/src/part.xml
new file mode 100644
index 0000000000..546c6c612e
--- /dev/null
+++ b/lib/docbuilder/doc/src/part.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE part SYSTEM "part.dtd">
+
+<part xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>2007</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+ <title>DocBuilder User's Guide</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <description>
+ <p><em>Docbuilder</em> provides functionality for generating HTML
+ documentation for Erlang modules and Erlang/OTP applications
+ from XML source code and/or EDoc comments in Erlang source code.</p>
+ </description>
+ <xi:include href="overview.xml"/>
+ <xi:include href="user_guide_dtds.xml"/>
+ <xi:include href="refman_dtds.xml"/>
+ <xi:include href="fasc_dtds.xml"/>
+ <xi:include href="header_tags.xml"/>
+ <xi:include href="block_tags.xml"/>
+ <xi:include href="inline_tags.xml"/>
+ <xi:include href="character_entities.xml"/>
+</part>
+
diff --git a/lib/docbuilder/doc/src/part_notes.xml b/lib/docbuilder/doc/src/part_notes.xml
new file mode 100644
index 0000000000..2f824630fb
--- /dev/null
+++ b/lib/docbuilder/doc/src/part_notes.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE part SYSTEM "part.dtd">
+
+<part xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>2007</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>DocBuilder Release Notes</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <description>
+ <p><em>Docbuilder</em> provides functionality for generating HTML
+ documentation for Erlang modules and Erlang/OTP applications
+ from XML source code and/or EDoc comments in Erlang source code.</p>
+ </description>
+ <xi:include href="notes.xml"/>
+</part>
+
diff --git a/lib/docbuilder/doc/src/ref_man.xml b/lib/docbuilder/doc/src/ref_man.xml
new file mode 100644
index 0000000000..7be8ace32f
--- /dev/null
+++ b/lib/docbuilder/doc/src/ref_man.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE application SYSTEM "application.dtd">
+
+<application xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>2007</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>DocBuilder Reference Manual</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <description>
+ <p><em>DocBuilder</em> provides functionality for generating HTML
+ documentation for Erlang modules and Erlang/OTP applications
+ from XML source code and/or EDoc comments in Erlang source code.</p>
+ </description>
+ <xi:include href="docbuilder_app.xml"/>
+ <xi:include href="docb_gen.xml"/>
+ <xi:include href="docb_transform.xml"/>
+ <xi:include href="docb_xml_check.xml"/>
+</application>
+
diff --git a/lib/docbuilder/doc/src/refman_dtds.xml b/lib/docbuilder/doc/src/refman_dtds.xml
new file mode 100644
index 0000000000..a7beaed708
--- /dev/null
+++ b/lib/docbuilder/doc/src/refman_dtds.xml
@@ -0,0 +1,667 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Reference Manual DTDs</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>refman_dtds.xml</file>
+ </header>
+
+ <p>There are five DTDs for writing manual pages about applications,
+ shell commands, C libraries, Erlang modules and files, all with a
+ similar structure:</p>
+
+ <list type="bulleted">
+ <item>A header.</item>
+ <item>Name of the application/command/library/module/file.</item>
+ <item>Short summary (one line).</item>
+ <item>A longer description.</item>
+ <item>"Formal" definitions of functions or commands.</item>
+ <item>Optional sections of free text.</item>
+ <item>Optional section with the name(s) and email(s) of the author(s).</item>
+ </list>
+
+ <p>The differences between the DTDs are the tags for the name,
+ the short summary and some tags inside the "formal" definitions.</p>
+
+ <section>
+ <marker id="applicationDTD"></marker>
+ <title>The application DTD</title>
+
+ <p>The <c>application</c> DTD is intended for a Reference Manual and
+ groups a set of manual pages into one unit. The structure is
+ similar to the part DTD: first an introduction and then the manual
+ pages, written in separate files with the
+ <seealso marker="#apprefDTD">appref</seealso>,
+ <seealso marker="#comrefDTD">comref</seealso>,
+ <seealso marker="#crefDTD">cref</seealso>,
+ <seealso marker="#erlrefDTD">erlref</seealso>, or
+ <seealso marker="#filerefDTD">fileref</seealso> DTD.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;?xml version="1.0" encoding="latin1" ?>
+&lt;!DOCTYPE application SYSTEM "application.dtd">
+&lt;application>
+ &lt;header>
+ &lt;title>Application name&lt;/title>
+ &lt;prepared/>
+ &lt;docno/>
+ &lt;date/>
+ &lt;rev/>
+ &lt;/header>
+
+ &lt;description>
+ &lt;p>Application description...&lt;/p>
+ &lt;/description>
+
+ &lt;include file="module1">
+ &lt;include file="module2">
+&lt;/application>
+ </pre>
+ </section>
+
+ <section>
+ <marker id="applicationTAG"></marker>
+ <title>&lt;application&gt;</title>
+
+ <p>The top level tag of an <c>application</c> DTD.</p>
+
+ <p>Contains a
+ <seealso marker="header_tags">&lt;header&gt;</seealso>,
+ an optional
+ <seealso marker="user_guide_dtds#descriptionTAG">&lt;description&gt;</seealso>,
+ followed by one or more
+ <seealso marker="user_guide_dtds#includeTAG">&lt;include&gt;</seealso>.
+ </p>
+ </section>
+
+ <section>
+ <marker id="apprefDTD"></marker>
+ <title>The appref DTD</title>
+
+ <p>This is the DTD for writing an application manual page.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;?xml version="1.0" encoding="latin1" ?>
+&lt;!DOCTYPE appref SYSTEM "appref.dtd">
+&lt;appref>
+ &lt;header>
+ &lt;title>Application name&lt;/title>
+ &lt;prepared/>
+ &lt;docno/>
+ &lt;date/>
+ &lt;rev/>
+ &lt;/header>
+
+ &lt;app>Application name&lt;/app>
+
+ &lt;appsummary>A short application summary.&lt;/appsummary>
+
+ &lt;description>
+ &lt;p>A longer description of the application.&lt;/p>
+ &lt;/description>
+
+ &lt;section>
+ &lt;title>Configuration&lt;/title>
+
+ &lt;p>...&lt;/p>
+ &lt;/section>
+
+ ...
+
+ &lt;authors>
+ &lt;aname>Name of author&lt;/aname>
+ &lt;email>Email of author&lt;/email>
+ &lt;/authors>
+&lt;/appref>
+ </pre>
+
+ <section>
+ <marker id="apprefTAG"></marker>
+ <title>&lt;appref&gt;</title>
+
+ <p>The top level tag of an <c>appref</c> DTD.</p>
+
+ <p>Contains
+ <seealso marker="header_tags#headerTAG">&lt;header&gt;</seealso>,
+ <seealso marker="#appTAG">&lt;app&gt;</seealso>,
+ <seealso marker="#appsummaryTAG">&lt;appsummary&gt;</seealso>,
+ <seealso marker="#descriptionTAG">&lt;description&gt;</seealso>,
+ zero or more
+ <seealso marker="#sectionTAG">&lt;section&gt;</seealso> and
+ <seealso marker="#funcsTAG">&lt;funcs&gt;</seealso>,
+ followed by zero or more
+ <seealso marker="#authorsTAG">&lt;authors&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="appTAG"></marker>
+ <title>&lt;app&gt;</title>
+
+ <p>The application name. Contains plain text.</p>
+ </section>
+
+ <section>
+ <marker id="appsummaryTAG"></marker>
+ <title>&lt;appsummary&gt;</title>
+
+ <p>Short summary. Contains plain text.</p>
+ </section>
+ </section>
+
+ <section>
+ <marker id="comrefDTD"></marker>
+ <title>The comref DTD</title>
+
+ <p>This is the DTD for writing a command manual page.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;?xml version="1.0" encoding="latin1" ?>
+&lt;!DOCTYPE comref SYSTEM "comref.dtd">
+&lt;comref>
+ &lt;header>
+ &lt;title>Command name&lt;/title>
+ &lt;prepared/>
+ &lt;docno/>
+ &lt;date/>
+ &lt;rev/>
+ &lt;/header>
+
+ &lt;com>Command name&lt;/com>
+
+ &lt;comsummary>A short command summary.&lt;/comsummary>
+
+ &lt;description>
+ &lt;p>A long description of the command.&lt;/p>
+ &lt;/description>
+
+ &lt;funcs>
+ &lt;func>
+ &lt;name>command&lt;/name>
+ &lt;name>command -flag &lt;arg>&lt;/name>
+ &lt;fsummary>A short command summary (max 40 characters).&lt;/fsummary>
+ &lt;desc>
+ &lt;p>An extended command description.
+ &lt;/desc>
+ &lt;/func>
+ &lt;/funcs>
+
+ &lt;section>
+ &lt;title>Options&lt;/title>
+
+ &lt;p>...&lt;/p>
+ &lt;/section>
+
+ &lt;authors>
+ &lt;aname>Name of author&lt;/aname>
+ &lt;email>Email of author&lt;/email>
+ &lt;/authors>
+&lt;/comref>
+ </pre>
+
+ <section>
+ <marker id="comrefTAG"></marker>
+ <title>&lt;comref&gt;</title>
+
+ <p>The top level tag for a <c>comref</c> DTD.</p>
+
+ <p>Contains
+ <seealso marker="header_tags#headerTAG">&lt;header&gt;</seealso>,
+ <seealso marker="#comTAG">&lt;com&gt;</seealso>,
+ <seealso marker="#comsummaryTAG">&lt;comsummary&gt;</seealso>,
+ <seealso marker="#descriptionTAG">&lt;description&gt;</seealso>,
+ zero or more
+ <seealso marker="#sectionTAG">&lt;section&gt;</seealso> and
+ <seealso marker="#funcsTAG">&lt;funcs&gt;</seealso>,
+ followed by zero or more
+ <seealso marker="#authorsTAG">&lt;authors&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="comTAG"></marker>
+ <title>&lt;com&gt;</title>
+
+ <p>The command name. Contains plain text.</p>
+ </section>
+
+ <section>
+ <marker id="comsummaryTAG"></marker>
+
+ <title>&lt;comsummary&gt;</title>
+
+ <p>Short summary. Contains plain text.</p>
+ </section>
+ </section>
+
+ <section>
+ <marker id="crefDTD"></marker>
+ <title>The cref DTD</title>
+
+ <p>This is the DTD for writing a C library manual page.</p>
+
+ <p>Example:</p>
+ <pre><![CDATA[
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE cref SYSTEM "cref.dtd">
+<cref>
+ <header>
+ <title>C library name</title>
+ <prepared/>
+ <docno/>
+ <date/>
+ <rev/>
+ </header>
+
+ <lib>C library name</lib>
+
+ <libsummary>A short C library summary.</libsummary>
+
+ <description>
+ <p>A longer description of the C library.</p>
+ </description>
+
+ <funcs>
+ <func>
+ <name><ret>void</ret><nametext>start(bar)</nametext></name>
+ <name><ret>void</ret><nametext>start(foo)</nametext></name>
+ <fsummary>A short function summary (max 40 characters).</fsummary>
+ <type>
+ <v>char bar</v>
+ <v>int foo</v>
+ </type>
+ <desc>
+ <p>An extended function description.</p>
+ </desc>
+ </func>
+
+ ...
+ </funcs>
+
+ <section>
+ <title>A title</title>
+
+ <p>Some text...</p>
+ </section>
+
+
+</cref>
+ ]]></pre>
+
+ <section>
+ <marker id="crefTAG"></marker>
+ <title>&lt;cref&gt;</title>
+
+ <p>The top level tag for a <c>cref</c> DTD.</p>
+
+ <p>Contains
+ <seealso marker="header_tags#headerTAG">&lt;header&gt;</seealso>,
+ <seealso marker="#libTAG">&lt;lib&gt;</seealso>,
+ <seealso marker="#libsummaryTAG">&lt;libsummary&gt;</seealso>,
+ <seealso marker="#descriptionTAG">&lt;description&gt;</seealso>,
+ zero or more
+ <seealso marker="#sectionTAG">&lt;section&gt;</seealso> and
+ <seealso marker="#funcsTAG">&lt;funcs&gt;</seealso>, followed by
+ zero or more
+ <seealso marker="#authorsTAG">&lt;authors&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="libTAG"></marker>
+ <title>&lt;lib&gt;</title>
+
+ <p>The C library name or acronym. Contains plain text.</p>
+ </section>
+
+ <section>
+ <marker id="libsummaryTAG"></marker>
+ <title>&lt;libsummary&gt;</title>
+
+ <p>Short summary. Contains plain text.</p>
+ </section>
+ </section>
+
+ <section>
+ <marker id="erlrefDTD"></marker>
+ <title>The erlref DTD</title>
+
+ <p>This is the DTD for writing Erlang module manual pages.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;?xml version="1.0" encoding="latin1" ?>
+&lt;!DOCTYPE erlref SYSTEM "erlref.dtd">
+&lt;erlref>
+ &lt;header>
+ &lt;title>Module name&lt;/title>
+ &lt;prepared/>
+ &lt;docno/>
+ &lt;date/>
+ &lt;rev/>
+ &lt;/header>
+
+ &lt;module>Module name&lt;/module>
+
+ &lt;modulesummary>A short module summary.&lt;/modulesummary>
+
+ &lt;description>
+ &lt;p>A longer description of the module.&lt;/p>
+ &lt;/description>
+
+ &lt;funcs>
+ &lt;func>
+ &lt;name>start() -> Result&lt;/name>
+ &lt;name>start(N) -> Result&lt;/name>
+ &lt;fsummary>A short function summary (max 40 characters).&lt;/fsummary>
+ &lt;type>
+ &lt;v>Pid = pid()&lt;/v>
+ &lt;v>N = int()&lt;/v>
+ &lt;v>Result = {ok, Pid} | {error, Reason}&lt;/v>
+ &lt;v>Reason = term()&lt;/v>
+ &lt;d>A parameter description.&lt;/d>
+ &lt;/type>
+ &lt;desc>
+ &lt;p>An extended function description.&lt;/p>
+ &lt;/desc>
+ &lt;/func>
+
+ ...
+ &lt;/funcs>
+
+ &lt;section>
+ &lt;title>Some Title&lt;/title>
+ &lt;p>Some text...&lt;/p>
+ &lt;/section>
+
+ &lt;authors>
+ &lt;aname>Name of author&lt;/aname>
+ &lt;email>Email of author&lt;/email>
+ &lt;/authors>
+&lt;/erlref>
+ </pre>
+
+ <section>
+ <marker id="erlrefTAG"></marker>
+ <title>&lt;erlref&gt;</title>
+
+ <p>The top level tag for an <c>erlref</c> DTD.</p>
+
+ <p>Contains
+ <seealso marker="header_tags#headerTAG">&lt;header&gt;</seealso>,
+ <seealso marker="#moduleTAG">&lt;module&gt;</seealso>,
+ <seealso marker="#modulesummaryTAG">&lt;modulesummary&gt;</seealso>,
+ <seealso marker="#descriptionTAG">&lt;description&gt;</seealso>,
+ zero or more
+ <seealso marker="#sectionTAG">&lt;section&gt;</seealso> and
+ <seealso marker="#funcsTAG">&lt;funcs&gt;</seealso>,
+ followed by zero or more
+ <seealso marker="#authorsTAG">&lt;authors&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="moduleTAG"></marker>
+ <title>&lt;module&gt;</title>
+
+ <p>The module name. Contains plain text.</p>
+ </section>
+
+ <section>
+ <marker id="modulesummaryTAG"></marker>
+ <title>&lt;modulesummary&gt;</title>
+
+ <p>Short summary. Contains plain text.</p>
+ </section>
+ </section>
+
+ <section>
+ <marker id="filerefDTD"></marker>
+ <title>The fileref DTD</title>
+
+ <p>This is the DTD for writing file manual pages. In OTP, this DTD
+ is used for defining the format of for example <c>.rel</c> and
+ <c>.app</c> files.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;?xml version="1.0" encoding="latin1" ?>
+&lt;!DOCTYPE fileref SYSTEM "fileref.dtd">
+&lt;fileref>
+ &lt;header>
+ &lt;title>File name&lt;/title>
+ &lt;prepared/>
+ &lt;docno/>
+ &lt;date/>
+ &lt;rev/>
+ &lt;/header>
+
+ &lt;file>fileref&lt;/file>
+
+ &lt;filesummary>A short file summary.&lt;/filesummary>
+
+ &lt;description>
+ &lt;p>A longer description of the file.&lt;/p>
+ &lt;/description>
+
+ &lt;section>
+ &lt;title>File format&lt;/title>
+
+ &lt;p>...&lt;/p>
+ &lt;/section>
+
+ &lt;authors>
+ &lt;aname>Name of author&lt;/aname>
+ &lt;email>Email of author&lt;/email>
+ &lt;/authors>
+&lt;/fileref>
+ </pre>
+
+ <p>The file reference manual can also contain function definitions,
+ similar to the <c>erlref</c> DTD.</p>
+
+ <section>
+ <marker id="filerefTAG"></marker>
+ <title>&lt;fileref&gt;</title>
+
+ <p>The top level tag for a <c>fileref</c> DTD.</p>
+
+ <p>Contains
+ <seealso marker="header_tags#headerTAG">&lt;header&gt;</seealso>,
+ <seealso marker="#fileTAG">&lt;file&gt;</seealso>,
+ <seealso marker="#filesummaryTAG">&lt;filesummary&gt;</seealso>,
+ <seealso marker="#descriptionTAG">&lt;description&gt;</seealso>,
+ zero or more
+ <seealso marker="#sectionTAG">&lt;section&gt;</seealso> and
+ <seealso marker="#funcsTAG">&lt;funcs&gt;</seealso>,
+ followed by zero or more
+ <seealso marker="#authorsTAG">&lt;authors&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="fileTAG"></marker>
+ <title>&lt;file&gt;</title>
+
+ <p>The name of the file or file type. Contains plain text.</p>
+ </section>
+
+ <section>
+ <marker id="filesummaryTAG"></marker>
+ <title>&lt;filesummary&gt;</title>
+
+ <p>Short summary. Contains plain text.</p>
+ </section>
+ </section>
+
+ <section>
+ <marker id="descriptionTAG"></marker>
+ <title>&lt;description&gt;</title>
+
+ <p>The introduction after the title and before sections and
+ "formal" definitions.</p>
+
+ <p>Contains any combination and any number of
+ <seealso marker="block_tags">block tags</seealso> except
+ <c><![CDATA[<image>]]></c> and <c><![CDATA[<table>]]></c>.</p>
+ </section>
+
+ <section>
+ <marker id="sectionTAG"></marker>
+ <title>&lt;section&gt;</title>
+
+ <p>Subdivisions of the document. Contains an optional
+ <seealso marker="inline_tags#markerTAG">&lt;marker&gt;</seealso>,
+ a <seealso marker="user_guide_dtds#titleTAG">&lt;title&gt;</seealso>,
+
+ followed by any combination and any number of
+ <seealso marker="block_tags">block tags</seealso> except
+ <c><![CDATA[<image>]]></c> and <c><![CDATA[<table>]]></c>.</p>
+ </section>
+
+ <section>
+ <marker id="funcsTAG"></marker>
+ <title>&lt;funcs&gt;</title>
+
+ <p>A group of "formal" function definitions.</p>
+
+ <p>Contains one or more
+ <seealso marker="#funcTAG">&lt;func&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="funcTAG"></marker>
+ <title>&lt;func&gt;</title>
+
+ <p>A "formal" function definition.</p>
+
+ <p>Contains one or more
+ <seealso marker="#nameTAG">&lt;name&gt;</seealso>, followed by
+ <seealso marker="#fsummaryTAG">&lt;fsummary&gt;</seealso>,
+ <seealso marker="#typeTAG">&lt;type&gt;</seealso> (optional) and
+ <seealso marker="#descTAG">&lt;desc&gt;</seealso> (optional).</p>
+ </section>
+
+ <section>
+ <marker id="nameTAG"></marker>
+ <title>&lt;name&gt;</title>
+
+ <p>Function/command signature with name, arguments and return value.
+ Contains plain text, except for the <c>cref</c> DTD where it
+ contains a <c><![CDATA[<ret>]]></c> (return type, plain text) and
+ a <c><![CDATA[<nametext>]]></c> (function name and arguments,
+ plain text).</p>
+
+ <p>In the case of an <c>erlref</c> DTD, DocBuilder will
+ automatically try to add a
+ <seealso marker="inline_tags#markerTAG">marker</seealso>,
+ <c><![CDATA[<marker id="Name/Arity">]]></c> or
+ <c><![CDATA[<marker id="Name">]]></c>, based on the contents of
+ this tag before the function definition.</p>
+
+ <p>Example: Consider the following name definition</p>
+ <pre><![CDATA[
+<name>foo(Arg1, Arg2) -> ok | {error, Reason}</name>
+ ]]></pre>
+
+ <p>DocBuilder will create a marker
+ <c><![CDATA[<marker id="foo/2">]]></c> before the function
+ definition in the generated HTML. That is, referring to
+ the function using
+ <c><![CDATA[<seealso marker="#foo/2">foo/2</seealso>]]></c> will
+ automatically work.</p>
+ </section>
+
+ <section>
+ <marker id="fsummaryTAG"></marker>
+ <title>&lt;fsummary&gt;</title>
+
+ <p>Function/command summary. Contains plain text,
+ <seealso marker="inline_tags#cTAG">&lt;c&gt;</seealso> and
+ <seealso marker="inline_tags#emTAG">&lt;em&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="typeTAG"></marker>
+ <title>&lt;type&gt;</title>
+
+ <p>Type declarations for the function/command.</p>
+
+ <p>Contains one or more pairs of
+ <seealso marker="#vTAG">&lt;v&gt;</seealso> and
+ <seealso marker="#dTAG">&lt;d&gt;</seealso> (optional).</p>
+ </section>
+
+ <section>
+ <marker id="vTAG"></marker>
+ <title>&lt;v&gt;</title>
+
+ <p>Type declaration for an argument or return value. Contains plain
+ text.</p>
+ </section>
+
+ <section>
+ <marker id="dTAG"></marker>
+ <title>&lt;d&gt;</title>
+
+ <p>Description for an argument or return value. Contains plain text,
+ <seealso marker="inline_tags#cTAG">&lt;c&gt;</seealso> and
+ <seealso marker="inline_tags#emTAG">&lt;em&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="descTAG"></marker>
+ <title>&lt;desc&gt;</title>
+
+ <p>Function/command description. Contains
+ <seealso marker="block_tags">block tags</seealso> except
+ <c>&lt;image&gt;</c> and <c>&lt;table&gt;</c>.</p>
+ </section>
+
+ <section>
+ <marker id="authorsTAG"></marker>
+ <title>&lt;authors&gt;</title>
+
+ <p>Authors of the manual page. The <c>authors</c> element is optional.</p>
+
+ <p>Contains one or more pairs of
+ <seealso marker="#anameTAG">&lt;aname&gt;</seealso> and
+ <seealso marker="#emailTAG">&lt;email&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="anameTAG"></marker>
+ <title>&lt;aname&gt;</title>
+
+ <p>Author name. Contains plain text.</p>
+ </section>
+
+ <section>
+ <marker id="emailTAG"></marker>
+ <title>&lt;email&gt;</title>
+
+ <p>Author email address. Contains plain text.</p>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/doc/src/user_guide_dtds.xml b/lib/docbuilder/doc/src/user_guide_dtds.xml
new file mode 100644
index 0000000000..a2db44f830
--- /dev/null
+++ b/lib/docbuilder/doc/src/user_guide_dtds.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>User's Guide DTDs</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>user_guide_dtds.xml</file>
+ </header>
+
+ <section>
+ <marker id="partDTD"></marker>
+ <title>The part DTD</title>
+
+ <p>The <c>part</c> DTD is intended for a "normal" document, like
+ the User's Guide or Release Notes. First are some paragraphs
+ introducing the main contents. After that follows chapters,
+ written in separate files with
+ the <seealso marker="#chapterDTD">chapter</seealso> DTD.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;?xml version="1.0" encoding="latin1" ?>
+&lt;!DOCTYPE part SYSTEM "part.dtd"&gt;
+&lt;part&gt;
+ &lt;header&gt;
+ &lt;title&gt;The chapter title&lt;/title&gt;
+ &lt;prepared&gt;The author&lt;/prepared&gt;
+ &lt;docno/&gt;
+ &lt;date/&gt;
+ &lt;rev/&gt;
+ &lt;/header&gt;
+
+ &lt;description&gt;
+ &lt;p&gt;Some text..&lt;/p&gt;
+ &lt;/description&gt;
+
+ &lt;include file="file1"&gt;&lt;/include&gt;
+ &lt;include file="file2"&gt;&lt;/include&gt;
+&lt;/part&gt;
+ </pre>
+ </section>
+
+ <section>
+ <marker id="partTAG"></marker>
+ <title>&lt;part></title>
+
+ <p>The top level tag of a <c>part</c> DTD.</p>
+
+ <p>Contains a
+ <seealso marker="header_tags">&lt;header&gt;</seealso>,
+ an optional
+ <seealso marker="#descriptionTAG">&lt;description&gt;</seealso>,
+ followed by one or more
+ <seealso marker="#includeTAG">&lt;include&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="descriptionTAG"/>
+ <title>&lt;description&gt;</title>
+
+ <p>The introduction after the title and before the bulk of
+ included chapters/manual pages.</p>
+
+ <p>Contains any combination and any number
+ of <seealso marker="block_tags">block tags</seealso> except
+ <c><![CDATA[<image>]]></c> and <c><![CDATA[<table>]]></c>.</p>
+ </section>
+
+ <section>
+ <marker id="includeTAG"></marker>
+ <title>&lt;include&gt;</title>
+
+ <p>An empty tag. The attribute <c>file</c> specifies a file to
+ include. The <c>.xml</c> file extension should be omitted.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;include file="notes">&lt;/include>
+ </pre>
+ </section>
+
+ <section>
+ <marker id="chapterDTD"></marker>
+ <title>The chapter DTD</title>
+
+ <p>The <c>chapter</c> DTD is intended for a chapter in a User's
+ Guide or similar with text divided into sections, which can be
+ nested.</p>
+
+ <p>Example:</p>
+ <pre>
+&lt;?xml version="1.0" encoding="latin1" ?>
+&lt;!DOCTYPE chapter SYSTEM "chapter.dtd">
+&lt;chapter>
+ &lt;header>
+ &lt;title>Title on first level&lt;/title>
+ &lt;prepared/>
+ &lt;docno/>
+ &lt;date/>
+ &lt;rev/>
+ &lt;/header>
+
+ &lt;p>Introduction...&lt;/p>
+
+ &lt;section>
+ &lt;title>Title on second level&lt;/title>
+
+ &lt;p>First paragraph.&lt;/p>
+
+ &lt;p>Second paragraph etc.&lt;/p>
+
+ &lt;section>
+ &lt;title>Title on third level&lt;/title>
+
+ &lt;p>...&lt;/p>
+ &lt;/section>
+ &lt;/section>
+
+ ...
+&lt;/chapter>
+ </pre>
+ </section>
+
+ <section>
+ <marker id="chapterTAG"></marker>
+ <title>&lt;chapter&gt;</title>
+
+ <p>The top level tag of a <c>chapter</c> DTD.</p>
+
+ <p>Contains a
+ <seealso marker="header_tags">&lt;header&gt;</seealso>,
+ an optional introduction consisting of any combination of
+ <seealso marker="block_tags">block tags</seealso>,
+ followed by one or more
+ <seealso marker="#sectionTAG">&lt;section&gt;</seealso>.</p>
+ </section>
+
+ <section>
+ <marker id="sectionTAG"></marker>
+ <title>&lt;section&gt;</title>
+
+ <p>Subdivision of a chapter.</p>
+
+ <p>Contains an optional
+ <seealso marker="inline_tags#markerTAG">&lt;marker&gt;</seealso>,
+ a <seealso marker="#titleTAG">&lt;title&gt;</seealso>,
+ followed by any combination and any number of
+ <seealso marker="block_tags">block tags</seealso> and
+ <c><![CDATA[<section>]]></c>.</p>
+ </section>
+
+ <section>
+ <marker id="titleTAG"></marker>
+ <title>&lt;title&gt;</title>
+
+ <p>Section title, contains plain text.</p>
+ </section>
+</chapter>
+
diff --git a/lib/docbuilder/dtd/Makefile b/lib/docbuilder/dtd/Makefile
new file mode 100644
index 0000000000..05c656f3fc
--- /dev/null
+++ b/lib/docbuilder/dtd/Makefile
@@ -0,0 +1,91 @@
+# ``The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved via the world wide web at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999-2000, Ericsson
+# Utvecklings AB. All Rights Reserved.''
+#
+# $Id$
+#
+
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+VSN=$(DOCB_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/docbuilder-$(VSN)
+
+# ----------------------------------------------------
+# Common Macros
+# ----------------------------------------------------
+
+DTD_FILES = \
+ application.dtd \
+ appref.dtd \
+ book.dtd \
+ bookinsidecover.dtd \
+ chapter.dtd \
+ cites.dtd \
+ common.dtd \
+ common.entities.dtd \
+ common.header.dtd \
+ common.image.dtd \
+ common.refs.dtd \
+ common.table.dtd \
+ comref.dtd \
+ cref.dtd \
+ erlref.dtd \
+ fascicules.dtd \
+ fileref.dtd \
+ part.dtd \
+ report.dtd \
+ terms.dtd \
+ xhtml-lat1.ent \
+ xhtml-special.ent \
+ xhtml-symbol.ent \
+ xhtml1-frameset.dtd \
+ xhtml1-strict.dtd \
+ xhtml1-transitional.dtd
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+debug opt:
+
+clean:
+
+docs:
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec:
+ $(INSTALL_DIR) $(RELSYSDIR)/dtd
+ $(INSTALL_DATA) $(DTD_FILES) $(RELSYSDIR)/dtd
+
+release_docs_spec:
+
+
+
+
+
+
+
diff --git a/lib/docbuilder/dtd/application.dtd b/lib/docbuilder/dtd/application.dtd
new file mode 100644
index 0000000000..8a1e8832ec
--- /dev/null
+++ b/lib/docbuilder/dtd/application.dtd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common SYSTEM "common.dtd" >
+%common;
+<!ENTITY % common.header SYSTEM "common.header.dtd" >
+%common.header;
+
+<!ELEMENT application (header,description?,include+) >
+<!ELEMENT description (%block;|quote|br|marker|warning|note)* >
+<!ELEMENT include EMPTY >
+<!ATTLIST include file CDATA #REQUIRED>
diff --git a/lib/docbuilder/dtd/appref.dtd b/lib/docbuilder/dtd/appref.dtd
new file mode 100644
index 0000000000..70a5ff37af
--- /dev/null
+++ b/lib/docbuilder/dtd/appref.dtd
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common.refs SYSTEM "common.refs.dtd" >
+%common.refs;
+
+<!-- Structure -->
+
+<!ELEMENT appref (header,app,appsummary,description,
+ (section|funcs)*,authors?) >
+<!ELEMENT app (#PCDATA) >
+<!ELEMENT appsummary (#PCDATA) >
+
+<!-- `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd -->
+<!ELEMENT name (#PCDATA) >
diff --git a/lib/docbuilder/dtd/book.dtd b/lib/docbuilder/dtd/book.dtd
new file mode 100644
index 0000000000..bb89a6d255
--- /dev/null
+++ b/lib/docbuilder/dtd/book.dtd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common SYSTEM "common.dtd" >
+%common;
+<!ENTITY % common.header SYSTEM "common.header.dtd" >
+%common.header;
+<!ENTITY % common.table SYSTEM "common.table.dtd" >
+%common.table;
+
+<!ELEMENT book (header,
+ insidecover?,
+ pagetext,
+ preamble,
+ (applications|parts|headline|pagetext)+,
+ (listoffigures?,
+ listoftables?,
+ listofterms?,
+ bibliography?,
+ index?)) >
+
+<!ELEMENT pagetext (#PCDATA) >
+<!ELEMENT preamble (contents?,preface?) >
+<!ELEMENT preface (title?,(%block;|quote|br|marker|warning|note|table)*) >
+
+<!ELEMENT insidecover (#PCDATA|br|theheader|vfill|vspace|tt|bold|
+ include)* >
+<!ELEMENT tt (#PCDATA|br|theheader|vfill)* >
+<!ELEMENT bold (#PCDATA|br|theheader|vfill)* >
+<!ELEMENT vfill EMPTY >
+<!ELEMENT theheader EMPTY >
+<!ATTLIST theheader tag (title|prepared|responsible|docno|
+ approved|checked|date|rev|file|
+ abbreviation|
+ none) "none" >
+
+
+<!ELEMENT applications (include)* >
+<!ELEMENT parts (title?,description?,(include|onepart)*) >
+<!ATTLIST parts lift (yes|no) "no" >
+<!ELEMENT headline (#PCDATA) >
+<!ELEMENT index EMPTY >
+<!ELEMENT listoffigures EMPTY >
+<!ELEMENT listoftables EMPTY >
+<!ELEMENT listofterms EMPTY >
+<!ELEMENT bibliography EMPTY >
+<!ELEMENT contents EMPTY >
+<!ATTLIST contents level (0|1|2|3) "2">
+
+<!ELEMENT onepart (title?,description?,include+) >
+<!ATTLIST onepart lift (yes|no) "no" >
+
+<!ELEMENT description (%block;|quote|br|marker|warning|note)* >
+
+<!ELEMENT include EMPTY >
+<!ATTLIST include file CDATA #REQUIRED>
diff --git a/lib/docbuilder/dtd/bookinsidecover.dtd b/lib/docbuilder/dtd/bookinsidecover.dtd
new file mode 100644
index 0000000000..d6efbef6a4
--- /dev/null
+++ b/lib/docbuilder/dtd/bookinsidecover.dtd
@@ -0,0 +1,36 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!ENTITY % ISOlat1 SYSTEM "xhtml-lat1.ent" >
+%ISOlat1;
+
+<!ENTITY amp "&#x0026;" >
+<!ENTITY gt "&#x003E;" >
+<!ENTITY lt "&#x003C;" >
+
+<!ELEMENT bookinsidecover (#PCDATA|br|theheader|vfill|tt|bold)* >
+
+<!ELEMENT tt (#PCDATA|br|theheader|vfill)* >
+<!ELEMENT bold (#PCDATA|br|theheader|vfill)* >
+<!ELEMENT vfill EMPTY >
+<!ELEMENT theheader EMPTY >
+<!ATTLIST theheader tag (title|prepared|responsible|docno|
+ approved|checked|date|rev|file|
+ none) "none" >
+
+<!ELEMENT br EMPTY >
diff --git a/lib/docbuilder/dtd/chapter.dtd b/lib/docbuilder/dtd/chapter.dtd
new file mode 100644
index 0000000000..eb2c96b04f
--- /dev/null
+++ b/lib/docbuilder/dtd/chapter.dtd
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common SYSTEM "common.dtd" >
+%common;
+<!ENTITY % common.header SYSTEM "common.header.dtd" >
+%common.header;
+<!ENTITY % common.table SYSTEM "common.table.dtd" >
+%common.table;
+<!ENTITY % common.image SYSTEM "common.image.dtd" >
+%common.image;
+
+<!-- Structure -->
+
+<!ELEMENT chapter (header,(%block;|quote|warning|note|br|
+ image|marker|table)*,section+) >
+<!ELEMENT section (marker*,title,
+ (%block;|quote|warning|note|br|image|marker|
+ table|section)*) >
diff --git a/lib/docbuilder/dtd/cites.dtd b/lib/docbuilder/dtd/cites.dtd
new file mode 100644
index 0000000000..334574bff9
--- /dev/null
+++ b/lib/docbuilder/dtd/cites.dtd
@@ -0,0 +1,35 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!ENTITY % ISOlat1 SYSTEM "xhtml-lat1.ent" >
+%ISOlat1;
+
+<!ENTITY amp "&#x0026;" >
+<!ENTITY gt "&#x003E;" >
+<!ENTITY lt "&#x003C;" >
+
+<!-- Structure -->
+
+<!ELEMENT cites (cite)* >
+<!ELEMENT cite (id, shortdef, def, resp?) >
+<!ELEMENT id (#PCDATA) >
+<!ELEMENT shortdef (#PCDATA) >
+<!ELEMENT def (#PCDATA|c|em)* >
+<!ELEMENT resp (#PCDATA) >
+<!ELEMENT c (#PCDATA) >
+<!ELEMENT em (#PCDATA|c)* >
diff --git a/lib/docbuilder/dtd/common.dtd b/lib/docbuilder/dtd/common.dtd
new file mode 100644
index 0000000000..2c4ad51ab1
--- /dev/null
+++ b/lib/docbuilder/dtd/common.dtd
@@ -0,0 +1,87 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!-- This file contains common stuff for all dtds. -->
+
+<!ENTITY % common.entities SYSTEM "common.entities.dtd" >
+%common.entities;
+
+<!ENTITY % block "p|pre|code|list|taglist|codeinclude|
+ erleval" >
+<!ENTITY % inline "#PCDATA|c|em|term|cite|br|path|seealso|
+ url|marker" >
+<!-- XXX -->
+<!ELEMENT p (%inline;)* >
+<!ELEMENT pre (#PCDATA|seealso|url|input)* >
+<!ELEMENT input (#PCDATA|seealso|url)* >
+<!ELEMENT code (#PCDATA) >
+<!ATTLIST code type (erl|c|none) "none" >
+<!ELEMENT quote (p)* >
+<!ELEMENT warning (%block;|quote|br|marker)* >
+<!ELEMENT note (%block;|quote|br|marker)* >
+<!ELEMENT c (#PCDATA) >
+<!ELEMENT em (#PCDATA|c)* >
+
+<!-- XXX -->
+<!ELEMENT term (termdef?) >
+<!ATTLIST term id CDATA #REQUIRED >
+<!ELEMENT termdef (#PCDATA) >
+<!ELEMENT cite (citedef?) >
+<!ATTLIST cite id CDATA #REQUIRED >
+<!ELEMENT citedef (ctitle,cauthor,chowpublished) >
+<!ELEMENT ctitle (#PCDATA) >
+<!ELEMENT cauthor (#PCDATA) >
+<!ELEMENT chowpublished (#PCDATA) >
+
+<!-- XXX -->
+<!ELEMENT br EMPTY >
+
+<!-- Path -->
+
+<!ELEMENT path (#PCDATA) >
+<!ATTLIST path unix CDATA ""
+ windows CDATA "" >
+
+<!-- List -->
+
+<!ELEMENT list (item+) >
+<!ATTLIST list type (ordered|bulleted) "bulleted" >
+<!ELEMENT taglist (tag,item)+ >
+<!ELEMENT tag (#PCDATA|c|em|seealso|url)* >
+<!ELEMENT item (%inline;|%block;)* >
+
+<!-- References -->
+
+<!ELEMENT seealso (#PCDATA) >
+<!ATTLIST seealso marker CDATA #REQUIRED >
+<!ELEMENT url (#PCDATA) >
+<!ATTLIST url href CDATA #REQUIRED >
+<!ELEMENT marker EMPTY >
+<!ATTLIST marker id CDATA #REQUIRED >
+
+<!-- CodeInclude -->
+
+<!ELEMENT codeinclude EMPTY >
+<!ATTLIST codeinclude file CDATA #REQUIRED
+ tag CDATA ""
+ type (erl|c|none) "none" >
+
+<!-- ErlEval -->
+
+<!ELEMENT erleval EMPTY >
+<!ATTLIST erleval expr CDATA #REQUIRED >
diff --git a/lib/docbuilder/dtd/common.entities.dtd b/lib/docbuilder/dtd/common.entities.dtd
new file mode 100644
index 0000000000..f893ecd070
--- /dev/null
+++ b/lib/docbuilder/dtd/common.entities.dtd
@@ -0,0 +1,24 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!ENTITY % ISOlat1 SYSTEM "xhtml-lat1.ent" >
+%ISOlat1;
+
+<!ENTITY amp "&#x0026;" >
+<!ENTITY gt "&#x003E;" >
+<!ENTITY lt "&#x003C;" >
diff --git a/lib/docbuilder/dtd/common.header.dtd b/lib/docbuilder/dtd/common.header.dtd
new file mode 100644
index 0000000000..d422a89693
--- /dev/null
+++ b/lib/docbuilder/dtd/common.header.dtd
@@ -0,0 +1,42 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!ELEMENT header (copyright?,legalnotice?,title,shorttitle?,
+ prepared,responsible?,docno,approved?,
+ checked?,date,rev,file?) >
+
+<!--
+The titlestyle attribute is only defined to make all the book.xml files
+go through the validation. The attribute is not used for anything
+-->
+<!ATTLIST header titlestyle (special|normal) "normal">
+
+<!ELEMENT title (#PCDATA) >
+<!ELEMENT shorttitle (#PCDATA) >
+<!ELEMENT prepared (#PCDATA) >
+<!ELEMENT responsible (#PCDATA) >
+<!ELEMENT docno (#PCDATA) >
+<!ELEMENT approved (#PCDATA) >
+<!ELEMENT checked (#PCDATA) >
+<!ELEMENT copyright (year+,holder*) >
+<!ELEMENT legalnotice (#PCDATA) >
+<!ELEMENT date (#PCDATA) >
+<!ELEMENT rev (#PCDATA) >
+<!ELEMENT file (#PCDATA) >
+<!ELEMENT year (#PCDATA) >
+<!ELEMENT holder (#PCDATA) >
diff --git a/lib/docbuilder/dtd/common.image.dtd b/lib/docbuilder/dtd/common.image.dtd
new file mode 100644
index 0000000000..fc95a669dd
--- /dev/null
+++ b/lib/docbuilder/dtd/common.image.dtd
@@ -0,0 +1,21 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!ELEMENT image (icaption) >
+<!ATTLIST image file CDATA #REQUIRED >
+<!ELEMENT icaption (#PCDATA) >
diff --git a/lib/docbuilder/dtd/common.refs.dtd b/lib/docbuilder/dtd/common.refs.dtd
new file mode 100644
index 0000000000..7b9974fbda
--- /dev/null
+++ b/lib/docbuilder/dtd/common.refs.dtd
@@ -0,0 +1,40 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!-- This file contains common stuff for the *ref.dtd files.
+ Note that `name' is defined in each *ref.dtd. -->
+
+<!ENTITY % common SYSTEM "common.dtd" >
+%common;
+<!ENTITY % common.header SYSTEM "common.header.dtd" >
+%common.header;
+
+<!ELEMENT description (%block;|quote|br|marker|warning|note)* >
+<!ELEMENT funcs (func)+ >
+<!ELEMENT func (name+,fsummary,type?,desc?) >
+<!-- ELEMENT name is defined in each ref dtd -->
+<!ELEMENT fsummary (#PCDATA|c|em)* >
+<!ELEMENT type (v,d?)+ >
+<!ELEMENT v (#PCDATA) >
+<!ELEMENT d (#PCDATA|c|em)* >
+<!ELEMENT desc (%block;|quote|br|marker|warning|note)* >
+<!ELEMENT authors (aname,email)+ >
+<!ELEMENT aname (#PCDATA) >
+<!ELEMENT email (#PCDATA) >
+<!ELEMENT section (marker*,title,(%block;|quote|br|marker|
+ warning|note)*) >
diff --git a/lib/docbuilder/dtd/common.table.dtd b/lib/docbuilder/dtd/common.table.dtd
new file mode 100644
index 0000000000..7741da1018
--- /dev/null
+++ b/lib/docbuilder/dtd/common.table.dtd
@@ -0,0 +1,25 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!ELEMENT table (row+,tcaption) >
+<!ATTLIST table align (left|center|right) "center" >
+<!ELEMENT row (cell+) >
+<!ELEMENT cell (%inline;)* >
+<!ATTLIST cell align (left|center|right) "left"
+ valign (top|middle|bottom) "middle" >
+<!ELEMENT tcaption (#PCDATA) >
diff --git a/lib/docbuilder/dtd/comref.dtd b/lib/docbuilder/dtd/comref.dtd
new file mode 100644
index 0000000000..fcdea625d5
--- /dev/null
+++ b/lib/docbuilder/dtd/comref.dtd
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common.refs SYSTEM "common.refs.dtd" >
+%common.refs;
+
+<!ELEMENT comref (header,com,comsummary,description,
+ (section|funcs)*,authors?) >
+<!ELEMENT com (#PCDATA) >
+<!ELEMENT comsummary (#PCDATA) >
+
+<!-- `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd -->
+<!ELEMENT name (#PCDATA) >
diff --git a/lib/docbuilder/dtd/cref.dtd b/lib/docbuilder/dtd/cref.dtd
new file mode 100644
index 0000000000..e43bb2bf51
--- /dev/null
+++ b/lib/docbuilder/dtd/cref.dtd
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common.refs SYSTEM "common.refs.dtd" >
+%common.refs;
+
+<!ELEMENT cref (header,lib,libsummary,description,
+ (section|funcs)*,authors?) >
+<!ELEMENT lib (#PCDATA) >
+<!ELEMENT libsummary (#PCDATA) >
+
+<!-- `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd -->
+<!ELEMENT name (ret,nametext) >
+<!ELEMENT ret (#PCDATA) >
+<!ELEMENT nametext (#PCDATA) >
+
diff --git a/lib/docbuilder/dtd/erlref.dtd b/lib/docbuilder/dtd/erlref.dtd
new file mode 100644
index 0000000000..21656a1446
--- /dev/null
+++ b/lib/docbuilder/dtd/erlref.dtd
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common.refs SYSTEM "common.refs.dtd" >
+%common.refs;
+
+<!ELEMENT erlref (header,module,modulesummary,description,
+ (section|funcs)*,authors?) >
+<!ELEMENT module (#PCDATA) >
+<!ELEMENT modulesummary (#PCDATA) >
+
+<!-- `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd -->
+<!ELEMENT name (#PCDATA) >
diff --git a/lib/docbuilder/dtd/fascicules.dtd b/lib/docbuilder/dtd/fascicules.dtd
new file mode 100644
index 0000000000..b14276a2c0
--- /dev/null
+++ b/lib/docbuilder/dtd/fascicules.dtd
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % ISOlat1 SYSTEM "xhtml-lat1.ent" >
+%ISOlat1;
+
+<!ENTITY amp "&#x0026;" >
+<!ENTITY gt "&#x003E;" >
+<!ENTITY lt "&#x003C;" >
+
+<!-- Structure -->
+
+<!ELEMENT fascicules (fascicule)+ >
+<!ELEMENT fascicule (#PCDATA) >
+<!ATTLIST fascicule file CDATA #REQUIRED
+ href CDATA #REQUIRED
+ entry (yes|no) "no" >
+
diff --git a/lib/docbuilder/dtd/fileref.dtd b/lib/docbuilder/dtd/fileref.dtd
new file mode 100644
index 0000000000..5a1cc54afe
--- /dev/null
+++ b/lib/docbuilder/dtd/fileref.dtd
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common.refs SYSTEM "common.refs.dtd" >
+%common.refs;
+
+<!ELEMENT fileref (header,file,filesummary,description,
+ (section|funcs)*,authors?) >
+<!-- Note: ELEMENT file is already defined -->
+<!ELEMENT filesummary (#PCDATA) >
+
+<!-- `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd -->
+<!ELEMENT name (#PCDATA) >
diff --git a/lib/docbuilder/dtd/part.dtd b/lib/docbuilder/dtd/part.dtd
new file mode 100644
index 0000000000..3f97199042
--- /dev/null
+++ b/lib/docbuilder/dtd/part.dtd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % common SYSTEM "common.dtd" >
+%common;
+<!ENTITY % common.header SYSTEM "common.header.dtd" >
+%common.header;
+
+<!ELEMENT part (header,description?,include+) >
+<!ELEMENT description (%block;|quote|br|marker|warning|note)* >
+<!ELEMENT include EMPTY >
+<!ATTLIST include file CDATA #REQUIRED>
diff --git a/lib/docbuilder/dtd/report.dtd b/lib/docbuilder/dtd/report.dtd
new file mode 100644
index 0000000000..3d07e6e5a7
--- /dev/null
+++ b/lib/docbuilder/dtd/report.dtd
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+
+<!ENTITY % ISOlat1 SYSTEM "xhtml-lat1.ent" >
+%ISOlat1;
+
+<!ENTITY amp "&#x0026;" >
+<!ENTITY gt "&#x003E;" >
+<!ENTITY lt "&#x003C;" >
+
+<!ENTITY % header "title,prepared,responsible,docno,approved,
+ checked,date,rev,file" >
+<!ENTITY % block "p|pre|code|list|taglist|erlinclude|
+ codeinclude|erleval" >
+<!ENTITY % inline "#PCDATA|i|b|c|em|term|cite|br|path|seealso|
+ url|marker" >
+
+<!-- Structure -->
+
+<!ELEMENT report (header,section+) >
+<!ELEMENT header (title,prepared,responsible?,docno,approved?,
+ checked?,date,rev,file?) >
+<!ELEMENT title (#PCDATA) >
+<!ELEMENT prepared (#PCDATA) >
+<!ELEMENT responsible (#PCDATA) >
+<!ELEMENT docno (#PCDATA) >
+<!ELEMENT approved (#PCDATA) >
+<!ELEMENT checked (#PCDATA) >
+<!ELEMENT date (#PCDATA) >
+<!ELEMENT rev (#PCDATA) >
+<!ELEMENT file (#PCDATA) >
+
+<!ELEMENT section (marker*,title,
+ (%block;|quote|warning|note|br|image|marker|
+ table|section)*) >
+<!ELEMENT p (%inline;|index)* >
+<!ELEMENT pre (#PCDATA|seealso|url|input)* >
+<!ELEMENT input (#PCDATA|seealso|url)* >
+<!ELEMENT code (#PCDATA) >
+<!ATTLIST code type (erl|c|none) "none" >
+<!ELEMENT quote (p)* >
+<!ELEMENT warning (%block;|quote|br|image|marker|table)* >
+<!ELEMENT note (%block;|quote|br|image|marker|table)* >
+<!ELEMENT i (#PCDATA|b|c|em)* >
+<!ELEMENT b (#PCDATA|i|c|em)* >
+<!ELEMENT c (#PCDATA) >
+<!ELEMENT em (#PCDATA|i|b|c)* >
+<!ELEMENT term (termdef?) >
+<!ATTLIST term id CDATA #REQUIRED >
+<!ELEMENT termdef (#PCDATA) >
+<!ELEMENT cite (citedef?) >
+<!ATTLIST cite id CDATA #REQUIRED >
+<!ELEMENT citedef (ctitle,cauthor,chowpublished) >
+<!ELEMENT ctitle (#PCDATA) >
+<!ELEMENT cauthor (#PCDATA) >
+<!ELEMENT chowpublished (#PCDATA) >
+<!ELEMENT br EMPTY >
+
+<!-- Path -->
+
+<!ELEMENT path (#PCDATA) >
+<!ATTLIST path unix CDATA ""
+ windows CDATA "" >
+
+<!-- List -->
+
+<!ELEMENT list (item+) >
+<!ATTLIST list type (ordered|bulleted) "bulleted" >
+<!ELEMENT taglist (tag,item)+ >
+<!ELEMENT tag (#PCDATA|i|b|c|em|seealso|url)* >
+<!ELEMENT item (%inline;|%block;)* >
+
+<!-- Image -->
+
+<!ELEMENT image (icaption?) >
+<!ATTLIST image file CDATA #REQUIRED >
+<!ELEMENT icaption (#PCDATA) >
+
+<!-- References -->
+
+<!ELEMENT seealso (#PCDATA) >
+<!ATTLIST seealso marker CDATA #REQUIRED >
+<!ELEMENT url (#PCDATA) >
+<!ATTLIST url href CDATA #REQUIRED >
+<!ELEMENT marker EMPTY >
+<!ATTLIST marker id CDATA #REQUIRED >
+
+<!-- Table -->
+
+<!ELEMENT table (row+,tcaption?) >
+<!ATTLIST table width CDATA "0"
+ colspec CDATA "" >
+<!ELEMENT row (cell+) >
+<!ELEMENT cell (%inline;)* >
+<!ATTLIST cell align (left|center|right) "left"
+ valign (top|middle|bottom) "middle" >
+<!ELEMENT tcaption (#PCDATA) >
+
+<!-- ErlInclude -->
+
+<!ELEMENT erlinclude EMPTY >
+<!ATTLIST erlinclude file CDATA #REQUIRED
+ tag CDATA #REQUIRED >
+
+<!-- CodeInclude -->
+
+<!ELEMENT codeinclude EMPTY >
+<!ATTLIST codeinclude file CDATA #REQUIRED
+ tag CDATA ""
+ type (erl|c|none) "none" >
+
+<!-- ErlEval -->
+
+<!ELEMENT erleval EMPTY >
+<!ATTLIST erleval expr CDATA #REQUIRED >
+
+<!-- Index FOR COMPATIBILITY -->
+
+<!ELEMENT index EMPTY >
+<!ATTLIST index txt CDATA #REQUIRED >
+
diff --git a/lib/docbuilder/dtd/terms.dtd b/lib/docbuilder/dtd/terms.dtd
new file mode 100644
index 0000000000..6105ec593e
--- /dev/null
+++ b/lib/docbuilder/dtd/terms.dtd
@@ -0,0 +1,36 @@
+<!--
+ ``The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved via the world wide web at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ Portions created by Ericsson are Copyright 1999-2007, Ericsson AB.
+ All Rights Reserved.''
+
+ $Id$
+-->
+<!ENTITY % ISOlat1 SYSTEM "xhtml-lat1.ent" >
+%ISOlat1;
+
+<!ENTITY amp "&#x0026;" >
+<!ENTITY gt "&#x003E;" >
+<!ENTITY lt "&#x003C;" >
+
+<!-- Structure -->
+
+<!ELEMENT terms (term)* >
+<!ELEMENT term (id, shortdef, def, resp?) >
+<!ELEMENT id (#PCDATA) >
+<!ELEMENT shortdef (#PCDATA) >
+<!ELEMENT def (#PCDATA|c|em)* >
+<!ELEMENT resp (#PCDATA) >
+<!ELEMENT c (#PCDATA) >
+<!ELEMENT em (#PCDATA|c)* >
+
diff --git a/lib/docbuilder/dtd/xhtml-lat1.ent b/lib/docbuilder/dtd/xhtml-lat1.ent
new file mode 100644
index 0000000000..aaae738cfc
--- /dev/null
+++ b/lib/docbuilder/dtd/xhtml-lat1.ent
@@ -0,0 +1,196 @@
+<!-- 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.
+-->
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
+ %HTMLlat1;
+-->
+
+<!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 = discretionary hyphen,
+ 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 -->
diff --git a/lib/docbuilder/dtd/xhtml-special.ent b/lib/docbuilder/dtd/xhtml-special.ent
new file mode 100644
index 0000000000..ca358b2fec
--- /dev/null
+++ b/lib/docbuilder/dtd/xhtml-special.ent
@@ -0,0 +1,80 @@
+<!-- Special characters for XHTML -->
+
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
+ %HTMLspecial;
+-->
+
+<!-- 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. values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode names.
+-->
+
+<!-- C0 Controls and Basic Latin -->
+<!ENTITY quot "&#34;"> <!-- quotation mark, U+0022 ISOnum -->
+<!ENTITY amp "&#38;#38;"> <!-- ampersand, U+0026 ISOnum -->
+<!ENTITY lt "&#38;#60;"> <!-- less-than sign, U+003C ISOnum -->
+<!ENTITY gt "&#62;"> <!-- greater-than sign, U+003E ISOnum -->
+<!ENTITY apos "&#39;"> <!-- apostrophe = APL quote, U+0027 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 -->
+<!ENTITY lsaquo "&#8249;"> <!-- single left-pointing angle quotation mark,
+ U+2039 ISO proposed -->
+<!-- lsaquo is proposed but not yet ISO standardized -->
+<!ENTITY rsaquo "&#8250;"> <!-- single right-pointing angle quotation mark,
+ U+203A ISO proposed -->
+<!-- rsaquo is proposed but not yet ISO standardized -->
+
+<!-- Currency Symbols -->
+<!ENTITY euro "&#8364;"> <!-- euro sign, U+20AC NEW -->
diff --git a/lib/docbuilder/dtd/xhtml-symbol.ent b/lib/docbuilder/dtd/xhtml-symbol.ent
new file mode 100644
index 0000000000..63c2abfa6f
--- /dev/null
+++ b/lib/docbuilder/dtd/xhtml-symbol.ent
@@ -0,0 +1,237 @@
+<!-- Mathematical, Greek and Symbolic characters for XHTML -->
+
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
+ %HTMLsymbol;
+-->
+
+<!-- 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. values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode names.
+-->
+
+<!-- Latin Extended-B -->
+<!ENTITY fnof "&#402;"> <!-- latin small letter 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 lamda,
+ 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 lamda,
+ 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 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;"> <!-- black-letter capital I = imaginary part,
+ U+2111 ISOamso -->
+<!ENTITY real "&#8476;"> <!-- black-letter 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, 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 -->
+<!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 summation, 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 -->
+<!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 sign'
+ 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 sign'
+ 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 -->
diff --git a/lib/docbuilder/dtd/xhtml1-frameset.dtd b/lib/docbuilder/dtd/xhtml1-frameset.dtd
new file mode 100644
index 0000000000..d128f2eb7c
--- /dev/null
+++ b/lib/docbuilder/dtd/xhtml1-frameset.dtd
@@ -0,0 +1,1235 @@
+<!--
+ Extensible HTML version 1.0 Frameset DTD
+
+ This is the same as HTML 4 Frameset except for
+ changes due to the differences between XML and SGML.
+
+ Namespace = http://www.w3.org/1999/xhtml
+
+ For further information, see: http://www.w3.org/TR/xhtml1
+
+ Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
+ All Rights Reserved.
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"
+
+ $Revision: 1.2 $
+ $Date: 2002/08/01 18:37:55 $
+
+-->
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "xhtml-lat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "xhtml-symbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "xhtml-special.ent">
+%HTMLspecial;
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA">
+ <!-- media type, as per [RFC2045] -->
+
+<!ENTITY % ContentTypes "CDATA">
+ <!-- comma-separated list of media types, as per [RFC2045] -->
+
+<!ENTITY % Charset "CDATA">
+ <!-- a character encoding, as per [RFC2045] -->
+
+<!ENTITY % Charsets "CDATA">
+ <!-- a space separated list of character encodings, as per [RFC2045] -->
+
+<!ENTITY % LanguageCode "NMTOKEN">
+ <!-- a language code, as per [RFC3066] -->
+
+<!ENTITY % Character "CDATA">
+ <!-- a single character, as per section 2.2 of [XML] -->
+
+<!ENTITY % Number "CDATA">
+ <!-- one or more digits -->
+
+<!ENTITY % LinkTypes "CDATA">
+ <!-- space-separated list of link types -->
+
+<!ENTITY % MediaDesc "CDATA">
+ <!-- single or comma-separated list of media descriptors -->
+
+<!ENTITY % URI "CDATA">
+ <!-- a Uniform Resource Identifier, see [RFC2396] -->
+
+<!ENTITY % UriList "CDATA">
+ <!-- a space separated list of Uniform Resource Identifiers -->
+
+<!ENTITY % Datetime "CDATA">
+ <!-- date and time information. ISO date format -->
+
+<!ENTITY % Script "CDATA">
+ <!-- script expression -->
+
+<!ENTITY % StyleSheet "CDATA">
+ <!-- style sheet data -->
+
+<!ENTITY % Text "CDATA">
+ <!-- used for titles etc. -->
+
+<!ENTITY % FrameTarget "NMTOKEN">
+ <!-- render in this frame -->
+
+<!ENTITY % Length "CDATA">
+ <!-- nn for pixels or nn% for percentage length -->
+
+<!ENTITY % MultiLength "CDATA">
+ <!-- pixel, percentage, or relative -->
+
+<!ENTITY % MultiLengths "CDATA">
+ <!-- comma-separated list of MultiLength -->
+
+<!ENTITY % Pixels "CDATA">
+ <!-- integer representing length in pixels -->
+
+<!-- these are used for image maps -->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+
+<!ENTITY % Coords "CDATA">
+ <!-- comma separated list of lengths -->
+
+<!-- used for object, applet, img, input and iframe -->
+<!ENTITY % ImgAlign "(top|middle|bottom|left|right)">
+
+<!-- a color using sRGB: #RRGGBB as Hex values -->
+<!ENTITY % Color "CDATA">
+
+<!-- There are also 16 widely known color names with their sRGB values:
+
+ Black = #000000 Green = #008000
+ Silver = #C0C0C0 Lime = #00FF00
+ Gray = #808080 Olive = #808000
+ White = #FFFFFF Yellow = #FFFF00
+ Maroon = #800000 Navy = #000080
+ Red = #FF0000 Blue = #0000FF
+ Purple = #800080 Teal = #008080
+ Fuchsia= #FF00FF Aqua = #00FFFF
+-->
+
+<!--=================== Generic Attributes ===============================-->
+
+<!-- core attributes common to most elements
+ id document-wide unique id
+ class space separated list of classes
+ style associated style info
+ title advisory title/amplification
+-->
+<!ENTITY % coreattrs
+ "id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED"
+ >
+
+<!-- internationalization attributes
+ lang language code (backwards compatible)
+ xml:lang language code (as per XML 1.0 spec)
+ dir direction for weak/neutral text
+-->
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED"
+ >
+
+<!-- attributes for common UI events
+ onclick a pointer button was clicked
+ ondblclick a pointer button was double clicked
+ onmousedown a pointer button was pressed down
+ onmouseup a pointer button was released
+ onmousemove a pointer was moved onto the element
+ onmouseout a pointer was moved away from the element
+ onkeypress a key was pressed and released
+ onkeydown a key was pressed down
+ onkeyup a key was released
+-->
+<!ENTITY % events
+ "onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED"
+ >
+
+<!-- attributes for elements that can get the focus
+ accesskey accessibility key character
+ tabindex position in tabbing order
+ onfocus the element got the focus
+ onblur the element lost the focus
+-->
+<!ENTITY % focus
+ "accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED"
+ >
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!-- text alignment for p, div, h1-h6. The default is
+ align="left" for ltr headings, "right" for rtl -->
+
+<!ENTITY % TextAlign "align (left|center|right|justify) #IMPLIED">
+
+<!--=================== Text Elements ====================================-->
+
+<!ENTITY % special.extra
+ "object | applet | img | map | iframe">
+
+<!ENTITY % special.basic
+ "br | span | bdo">
+
+<!ENTITY % special
+ "%special.basic; | %special.extra;">
+
+<!ENTITY % fontstyle.extra "big | small | font | basefont">
+
+<!ENTITY % fontstyle.basic "tt | i | b | u
+ | s | strike ">
+
+<!ENTITY % fontstyle "%fontstyle.basic; | %fontstyle.extra;">
+
+<!ENTITY % phrase.extra "sub | sup">
+<!ENTITY % phrase.basic "em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym">
+
+<!ENTITY % phrase "%phrase.basic; | %phrase.extra;">
+
+<!ENTITY % inline.forms "input | select | textarea | label | button">
+
+<!-- these can occur at block or inline level -->
+<!ENTITY % misc.inline "ins | del | script">
+
+<!-- these can only occur at block level -->
+<!ENTITY % misc "noscript | %misc.inline;">
+
+
+<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
+
+<!-- %Inline; covers inline or "text-level" elements -->
+<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
+
+<!--================== Block level elements ==============================-->
+
+<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
+<!ENTITY % lists "ul | ol | dl | menu | dir">
+<!ENTITY % blocktext "pre | hr | blockquote | address | center">
+
+<!ENTITY % block
+ "p | %heading; | div | %lists; | %blocktext; | isindex | fieldset | table">
+
+<!-- %Flow; mixes block and inline and is used for list items etc. -->
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+
+<!--================== Content models for exclusions =====================-->
+
+<!-- a elements use %Inline; excluding a -->
+
+<!ENTITY % a.content
+ "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*">
+
+<!-- pre uses %Inline excluding img, object, applet, big, small,
+ sub, sup, font, or basefont -->
+
+<!ENTITY % pre.content
+ "(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; |
+ %inline.forms; | %misc.inline;)*">
+
+
+<!-- form uses %Flow; excluding form -->
+
+<!ENTITY % form.content "(#PCDATA | %block; | %inline; | %misc;)*">
+
+<!-- button uses %Flow; but excludes a, form, form controls, iframe -->
+
+<!ENTITY % button.content
+ "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | br | span | bdo | object | applet | img | map |
+ %fontstyle; | %phrase; | %misc;)*">
+
+<!--================ Document Structure ==================================-->
+
+<!-- the namespace URI designates the document profile -->
+
+<!ELEMENT html (head, frameset)>
+<!ATTLIST html
+ %i18n;
+ id ID #IMPLIED
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ >
+
+<!--================ Document Head =======================================-->
+
+<!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
+
+<!-- content model is %head.misc; combined with a single
+ title and an optional base element in any order -->
+
+<!ELEMENT head (%head.misc;,
+ ((title, %head.misc;, (base, %head.misc;)?) |
+ (base, %head.misc;, (title, %head.misc;))))>
+
+<!ATTLIST head
+ %i18n;
+ id ID #IMPLIED
+ profile %URI; #IMPLIED
+ >
+
+<!-- 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.
+ -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title
+ %i18n;
+ id ID #IMPLIED
+ >
+
+<!-- document base URI -->
+
+<!ELEMENT base EMPTY>
+<!ATTLIST base
+ id ID #IMPLIED
+ href %URI; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- generic metainformation -->
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %i18n;
+ id ID #IMPLIED
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ >
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the link element in document head 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 stylesheets 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")
+-->
+
+<!ELEMENT link EMPTY>
+<!ATTLIST link
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- style info, which may include CDATA sections -->
+<!ELEMENT style (#PCDATA)>
+<!ATTLIST style
+ %i18n;
+ id ID #IMPLIED
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- script statements, which may include CDATA sections -->
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script
+ id ID #IMPLIED
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ language CDATA #IMPLIED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- alternate content container for non script-based rendering -->
+
+<!ELEMENT noscript %Flow;>
+<!ATTLIST noscript
+ %attrs;
+ >
+
+<!--======================= Frames =======================================-->
+
+<!-- only one noframes element permitted per document -->
+
+<!ELEMENT frameset (frameset|frame|noframes)*>
+<!ATTLIST frameset
+ %coreattrs;
+ rows %MultiLengths; #IMPLIED
+ cols %MultiLengths; #IMPLIED
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ >
+
+<!-- reserved frame names start with "_" otherwise starts with letter -->
+
+<!-- tiled window within frameset -->
+
+<!ELEMENT frame EMPTY>
+<!ATTLIST frame
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ noresize (noresize) #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ >
+
+<!-- inline subwindow -->
+
+<!ELEMENT iframe %Flow;>
+<!ATTLIST iframe
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ align %ImgAlign; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!-- alternate content container for non frame-based rendering -->
+
+<!ELEMENT noframes (body)>
+<!ATTLIST noframes
+ %attrs;
+ >
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT body %Flow;>
+<!ATTLIST body
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ background %URI; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ text %Color; #IMPLIED
+ link %Color; #IMPLIED
+ vlink %Color; #IMPLIED
+ alink %Color; #IMPLIED
+ >
+
+<!ELEMENT div %Flow;> <!-- generic language/style container -->
+<!ATTLIST div
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT p %Inline;>
+<!ATTLIST p
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from h1 (the most important)
+ to h6 (the least important).
+-->
+
+<!ELEMENT h1 %Inline;>
+<!ATTLIST h1
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h2 %Inline;>
+<!ATTLIST h2
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h3 %Inline;>
+<!ATTLIST h3
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h4 %Inline;>
+<!ATTLIST h4
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h5 %Inline;>
+<!ATTLIST h5
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h6 %Inline;>
+<!ATTLIST h6
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- Unordered list bullet styles -->
+
+<!ENTITY % ULStyle "(disc|square|circle)">
+
+<!-- Unordered list -->
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %attrs;
+ type %ULStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ >
+
+<!-- Ordered list numbering style
+
+ 1 arabic numbers 1, 2, 3, ...
+ a lower alpha a, b, c, ...
+ A upper alpha A, B, C, ...
+ i lower roman i, ii, iii, ...
+ I upper roman I, II, III, ...
+
+ The style is applied to the sequence number which by default
+ is reset to 1 for the first list item in an ordered list.
+-->
+<!ENTITY % OLStyle "CDATA">
+
+<!-- Ordered (numbered) list -->
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %attrs;
+ type %OLStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ start %Number; #IMPLIED
+ >
+
+<!-- single column list (DEPRECATED) -->
+<!ELEMENT menu (li)+>
+<!ATTLIST menu
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- multiple column list (DEPRECATED) -->
+<!ELEMENT dir (li)+>
+<!ATTLIST dir
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- LIStyle is constrained to: "(%ULStyle;|%OLStyle;)" -->
+<!ENTITY % LIStyle "CDATA">
+
+<!-- list item -->
+
+<!ELEMENT li %Flow;>
+<!ATTLIST li
+ %attrs;
+ type %LIStyle; #IMPLIED
+ value %Number; #IMPLIED
+ >
+
+<!-- definition lists - dt for term, dd for its definition -->
+
+<!ELEMENT dl (dt|dd)+>
+<!ATTLIST dl
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!ELEMENT dt %Inline;>
+<!ATTLIST dt
+ %attrs;
+ >
+
+<!ELEMENT dd %Flow;>
+<!ATTLIST dd
+ %attrs;
+ >
+
+<!--=================== Address ==========================================-->
+
+<!-- information on author -->
+
+<!ELEMENT address (#PCDATA | %inline; | %misc.inline; | p)*>
+<!ATTLIST address
+ %attrs;
+ >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %attrs;
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- content is %Inline; excluding
+ "img|object|applet|big|small|sub|sup|font|basefont" -->
+
+<!ELEMENT pre %pre.content;>
+<!ATTLIST pre
+ %attrs;
+ width %Number; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT blockquote %Flow;>
+<!ATTLIST blockquote
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!--=================== Text alignment ===================================-->
+
+<!-- center content -->
+<!ELEMENT center %Flow;>
+<!ATTLIST center
+ %attrs;
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+
+<!--
+ ins/del are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+-->
+<!ELEMENT ins %Flow;>
+<!ATTLIST ins
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!ELEMENT del %Flow;>
+<!ATTLIST del
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!--================== The Anchor Element ================================-->
+
+<!-- content is %Inline; except that anchors shouldn't be nested -->
+
+<!ELEMENT a %a.content;>
+<!ATTLIST a
+ %attrs;
+ %focus;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--===================== Inline Elements ================================-->
+
+<!ELEMENT span %Inline;> <!-- generic language/style container -->
+<!ATTLIST span
+ %attrs;
+ >
+
+<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
+<!ATTLIST bdo
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ >
+
+<!ELEMENT br EMPTY> <!-- forced line break -->
+<!ATTLIST br
+ %coreattrs;
+ clear (left|all|right|none) "none"
+ >
+
+<!ELEMENT em %Inline;> <!-- emphasis -->
+<!ATTLIST em %attrs;>
+
+<!ELEMENT strong %Inline;> <!-- strong emphasis -->
+<!ATTLIST strong %attrs;>
+
+<!ELEMENT dfn %Inline;> <!-- definitional -->
+<!ATTLIST dfn %attrs;>
+
+<!ELEMENT code %Inline;> <!-- program code -->
+<!ATTLIST code %attrs;>
+
+<!ELEMENT samp %Inline;> <!-- sample -->
+<!ATTLIST samp %attrs;>
+
+<!ELEMENT kbd %Inline;> <!-- something user would type -->
+<!ATTLIST kbd %attrs;>
+
+<!ELEMENT var %Inline;> <!-- variable -->
+<!ATTLIST var %attrs;>
+
+<!ELEMENT cite %Inline;> <!-- citation -->
+<!ATTLIST cite %attrs;>
+
+<!ELEMENT abbr %Inline;> <!-- abbreviation -->
+<!ATTLIST abbr %attrs;>
+
+<!ELEMENT acronym %Inline;> <!-- acronym -->
+<!ATTLIST acronym %attrs;>
+
+<!ELEMENT q %Inline;> <!-- inlined quote -->
+<!ATTLIST q
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!ELEMENT sub %Inline;> <!-- subscript -->
+<!ATTLIST sub %attrs;>
+
+<!ELEMENT sup %Inline;> <!-- superscript -->
+<!ATTLIST sup %attrs;>
+
+<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
+<!ATTLIST tt %attrs;>
+
+<!ELEMENT i %Inline;> <!-- italic font -->
+<!ATTLIST i %attrs;>
+
+<!ELEMENT b %Inline;> <!-- bold font -->
+<!ATTLIST b %attrs;>
+
+<!ELEMENT big %Inline;> <!-- bigger font -->
+<!ATTLIST big %attrs;>
+
+<!ELEMENT small %Inline;> <!-- smaller font -->
+<!ATTLIST small %attrs;>
+
+<!ELEMENT u %Inline;> <!-- underline -->
+<!ATTLIST u %attrs;>
+
+<!ELEMENT s %Inline;> <!-- strike-through -->
+<!ATTLIST s %attrs;>
+
+<!ELEMENT strike %Inline;> <!-- strike-through -->
+<!ATTLIST strike %attrs;>
+
+<!ELEMENT basefont EMPTY> <!-- base font size -->
+<!ATTLIST basefont
+ id ID #IMPLIED
+ size CDATA #REQUIRED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!ELEMENT font %Inline;> <!-- local change to font -->
+<!ATTLIST font
+ %coreattrs;
+ %i18n;
+ size CDATA #IMPLIED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!--==================== Object ======================================-->
+<!--
+ object is used to embed objects as part of HTML pages.
+ param elements should precede other content. Parameters
+ can also be expressed as attribute/value pairs on the
+ object element itself when brevity is desired.
+-->
+
+<!ELEMENT object (#PCDATA | param | %block; | form |%inline; | %misc;)*>
+<!ATTLIST object
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--
+ param is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced
+ by attribute value pairs on the object start tag.
+-->
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ id ID #IMPLIED
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ >
+
+<!--=================== Java applet ==================================-->
+<!--
+ One of code or object attributes must be present.
+ Place param elements before other content.
+-->
+<!ELEMENT applet (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST applet
+ %coreattrs;
+ codebase %URI; #IMPLIED
+ archive CDATA #IMPLIED
+ code CDATA #IMPLIED
+ object CDATA #IMPLIED
+ alt %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ width %Length; #REQUIRED
+ height %Length; #REQUIRED
+ align %ImgAlign; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--=================== Images ===========================================-->
+
+<!--
+ To avoid accessibility problems for people who aren't
+ able to see the image, you should provide a text
+ description using the alt and longdesc attributes.
+ In addition, avoid the use of server-side image maps.
+-->
+
+<!ELEMENT img EMPTY>
+<!ATTLIST img
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ name NMTOKEN #IMPLIED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!-- usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
+<!ATTLIST map
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ >
+
+<!ELEMENT area EMPTY>
+<!ATTLIST area
+ %attrs;
+ %focus;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--================ Forms ===============================================-->
+
+<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
+
+<!ATTLIST form
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ name NMTOKEN #IMPLIED
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--
+ Each label must not contain more than ONE field
+ Label elements shouldn't be nested.
+-->
+<!ELEMENT label %Inline;>
+<!ATTLIST label
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!ENTITY % InputType
+ "(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)"
+ >
+
+<!-- the name attribute is required for all but submit & reset -->
+
+<!ELEMENT input EMPTY> <!-- form control -->
+<!ATTLIST input
+ %attrs;
+ %focus;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ >
+
+<!ELEMENT select (optgroup|option)+> <!-- option selector -->
+<!ATTLIST select
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!ELEMENT optgroup (option)+> <!-- option group -->
+<!ATTLIST optgroup
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ >
+
+<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
+<!ATTLIST option
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
+<!ATTLIST textarea
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!--
+ The fieldset element is used to group form fields.
+ Only one legend element should occur in the content
+ and if present should only be preceded by whitespace.
+-->
+<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
+<!ATTLIST fieldset
+ %attrs;
+ >
+
+<!ENTITY % LAlign "(top|bottom|left|right)">
+
+<!ELEMENT legend %Inline;> <!-- fieldset label -->
+<!ATTLIST legend
+ %attrs;
+ accesskey %Character; #IMPLIED
+ align %LAlign; #IMPLIED
+ >
+
+<!--
+ Content is %Flow; excluding a, form, form controls, iframe
+-->
+<!ELEMENT button %button.content;> <!-- push button -->
+<!ATTLIST button
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ >
+
+<!-- single-line text input control (DEPRECATED) -->
+<!ELEMENT isindex EMPTY>
+<!ATTLIST isindex
+ %coreattrs;
+ %i18n;
+ prompt %Text; #IMPLIED
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- Derived from IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The border attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ 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 % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ 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 % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents
+
+ char alignment char, e.g. char=":"
+ charoff offset for alignment char
+-->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
+<!ELEMENT caption %Inline;>
+<!ELEMENT thead (tr)+>
+<!ELEMENT tfoot (tr)+>
+<!ELEMENT tbody (tr)+>
+<!ELEMENT colgroup (col)*>
+<!ELEMENT col EMPTY>
+<!ELEMENT tr (th|td)+>
+<!ELEMENT th %Flow;>
+<!ELEMENT td %Flow;>
+
+<!ATTLIST table
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ align %TAlign; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST caption
+ %attrs;
+ align %CAlign; #IMPLIED
+ >
+
+<!--
+colgroup groups a set of col elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST colgroup
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ 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.
+-->
+<!ATTLIST col
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+
+ Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+
+ Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST thead
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tfoot
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tbody
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tr
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ bgcolor %Color; #IMPLIED
+ >
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- th is for headers, td for data and for cells acting as both -->
+
+<!ATTLIST th
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ >
+
+<!ATTLIST td
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ >
+
diff --git a/lib/docbuilder/dtd/xhtml1-strict.dtd b/lib/docbuilder/dtd/xhtml1-strict.dtd
new file mode 100644
index 0000000000..2927b9ece7
--- /dev/null
+++ b/lib/docbuilder/dtd/xhtml1-strict.dtd
@@ -0,0 +1,978 @@
+<!--
+ Extensible HTML version 1.0 Strict DTD
+
+ This is the same as HTML 4 Strict except for
+ changes due to the differences between XML and SGML.
+
+ Namespace = http://www.w3.org/1999/xhtml
+
+ For further information, see: http://www.w3.org/TR/xhtml1
+
+ Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
+ All Rights Reserved.
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+
+ $Revision: 1.1 $
+ $Date: 2002/08/01 13:56:03 $
+
+-->
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "xhtml-lat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "xhtml-symbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "xhtml-special.ent">
+%HTMLspecial;
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA">
+ <!-- media type, as per [RFC2045] -->
+
+<!ENTITY % ContentTypes "CDATA">
+ <!-- comma-separated list of media types, as per [RFC2045] -->
+
+<!ENTITY % Charset "CDATA">
+ <!-- a character encoding, as per [RFC2045] -->
+
+<!ENTITY % Charsets "CDATA">
+ <!-- a space separated list of character encodings, as per [RFC2045] -->
+
+<!ENTITY % LanguageCode "NMTOKEN">
+ <!-- a language code, as per [RFC3066] -->
+
+<!ENTITY % Character "CDATA">
+ <!-- a single character, as per section 2.2 of [XML] -->
+
+<!ENTITY % Number "CDATA">
+ <!-- one or more digits -->
+
+<!ENTITY % LinkTypes "CDATA">
+ <!-- space-separated list of link types -->
+
+<!ENTITY % MediaDesc "CDATA">
+ <!-- single or comma-separated list of media descriptors -->
+
+<!ENTITY % URI "CDATA">
+ <!-- a Uniform Resource Identifier, see [RFC2396] -->
+
+<!ENTITY % UriList "CDATA">
+ <!-- a space separated list of Uniform Resource Identifiers -->
+
+<!ENTITY % Datetime "CDATA">
+ <!-- date and time information. ISO date format -->
+
+<!ENTITY % Script "CDATA">
+ <!-- script expression -->
+
+<!ENTITY % StyleSheet "CDATA">
+ <!-- style sheet data -->
+
+<!ENTITY % Text "CDATA">
+ <!-- used for titles etc. -->
+
+<!ENTITY % Length "CDATA">
+ <!-- nn for pixels or nn% for percentage length -->
+
+<!ENTITY % MultiLength "CDATA">
+ <!-- pixel, percentage, or relative -->
+
+<!ENTITY % Pixels "CDATA">
+ <!-- integer representing length in pixels -->
+
+<!-- these are used for image maps -->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+
+<!ENTITY % Coords "CDATA">
+ <!-- comma separated list of lengths -->
+
+<!--=================== Generic Attributes ===============================-->
+
+<!-- core attributes common to most elements
+ id document-wide unique id
+ class space separated list of classes
+ style associated style info
+ title advisory title/amplification
+-->
+<!ENTITY % coreattrs
+ "id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED"
+ >
+
+<!-- internationalization attributes
+ lang language code (backwards compatible)
+ xml:lang language code (as per XML 1.0 spec)
+ dir direction for weak/neutral text
+-->
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED"
+ >
+
+<!-- attributes for common UI events
+ onclick a pointer button was clicked
+ ondblclick a pointer button was double clicked
+ onmousedown a pointer button was pressed down
+ onmouseup a pointer button was released
+ onmousemove a pointer was moved onto the element
+ onmouseout a pointer was moved away from the element
+ onkeypress a key was pressed and released
+ onkeydown a key was pressed down
+ onkeyup a key was released
+-->
+<!ENTITY % events
+ "onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED"
+ >
+
+<!-- attributes for elements that can get the focus
+ accesskey accessibility key character
+ tabindex position in tabbing order
+ onfocus the element got the focus
+ onblur the element lost the focus
+-->
+<!ENTITY % focus
+ "accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED"
+ >
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!--=================== Text Elements ====================================-->
+
+<!ENTITY % special.pre
+ "br | span | bdo | map">
+
+
+<!ENTITY % special
+ "%special.pre; | object | img ">
+
+<!ENTITY % fontstyle "tt | i | b | big | small ">
+
+<!ENTITY % phrase "em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup ">
+
+<!ENTITY % inline.forms "input | select | textarea | label | button">
+
+<!-- these can occur at block or inline level -->
+<!ENTITY % misc.inline "ins | del | script">
+
+<!-- these can only occur at block level -->
+<!ENTITY % misc "noscript | %misc.inline;">
+
+<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
+
+<!-- %Inline; covers inline or "text-level" elements -->
+<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
+
+<!--================== Block level elements ==============================-->
+
+<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
+<!ENTITY % lists "ul | ol | dl">
+<!ENTITY % blocktext "pre | hr | blockquote | address">
+
+<!ENTITY % block
+ "p | %heading; | div | %lists; | %blocktext; | fieldset | table">
+
+<!ENTITY % Block "(%block; | form | %misc;)*">
+
+<!-- %Flow; mixes block and inline and is used for list items etc. -->
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+
+<!--================== Content models for exclusions =====================-->
+
+<!-- a elements use %Inline; excluding a -->
+
+<!ENTITY % a.content
+ "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*">
+
+<!-- pre uses %Inline excluding big, small, sup or sup -->
+
+<!ENTITY % pre.content
+ "(#PCDATA | a | %fontstyle; | %phrase; | %special.pre; | %misc.inline;
+ | %inline.forms;)*">
+
+<!-- form uses %Block; excluding form -->
+
+<!ENTITY % form.content "(%block; | %misc;)*">
+
+<!-- button uses %Flow; but excludes a, form and form controls -->
+
+<!ENTITY % button.content
+ "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | %special; | %fontstyle; | %phrase; | %misc;)*">
+
+<!--================ Document Structure ==================================-->
+
+<!-- the namespace URI designates the document profile -->
+
+<!ELEMENT html (head, body)>
+<!ATTLIST html
+ %i18n;
+ id ID #IMPLIED
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ >
+
+<!--================ Document Head =======================================-->
+
+<!ENTITY % head.misc "(script|style|meta|link|object)*">
+
+<!-- content model is %head.misc; combined with a single
+ title and an optional base element in any order -->
+
+<!ELEMENT head (%head.misc;,
+ ((title, %head.misc;, (base, %head.misc;)?) |
+ (base, %head.misc;, (title, %head.misc;))))>
+
+<!ATTLIST head
+ %i18n;
+ id ID #IMPLIED
+ profile %URI; #IMPLIED
+ >
+
+<!-- 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.
+ -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title
+ %i18n;
+ id ID #IMPLIED
+ >
+
+<!-- document base URI -->
+
+<!ELEMENT base EMPTY>
+<!ATTLIST base
+ href %URI; #REQUIRED
+ id ID #IMPLIED
+ >
+
+<!-- generic metainformation -->
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %i18n;
+ id ID #IMPLIED
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ >
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the link element in document head 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 stylesheets 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")
+-->
+
+<!ELEMENT link EMPTY>
+<!ATTLIST link
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ >
+
+<!-- style info, which may include CDATA sections -->
+<!ELEMENT style (#PCDATA)>
+<!ATTLIST style
+ %i18n;
+ id ID #IMPLIED
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- script statements, which may include CDATA sections -->
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script
+ id ID #IMPLIED
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- alternate content container for non script-based rendering -->
+
+<!ELEMENT noscript %Block;>
+<!ATTLIST noscript
+ %attrs;
+ >
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT body %Block;>
+<!ATTLIST body
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ >
+
+<!ELEMENT div %Flow;> <!-- generic language/style container -->
+<!ATTLIST div
+ %attrs;
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT p %Inline;>
+<!ATTLIST p
+ %attrs;
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from h1 (the most important)
+ to h6 (the least important).
+-->
+
+<!ELEMENT h1 %Inline;>
+<!ATTLIST h1
+ %attrs;
+ >
+
+<!ELEMENT h2 %Inline;>
+<!ATTLIST h2
+ %attrs;
+ >
+
+<!ELEMENT h3 %Inline;>
+<!ATTLIST h3
+ %attrs;
+ >
+
+<!ELEMENT h4 %Inline;>
+<!ATTLIST h4
+ %attrs;
+ >
+
+<!ELEMENT h5 %Inline;>
+<!ATTLIST h5
+ %attrs;
+ >
+
+<!ELEMENT h6 %Inline;>
+<!ATTLIST h6
+ %attrs;
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- Unordered list -->
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %attrs;
+ >
+
+<!-- Ordered (numbered) list -->
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %attrs;
+ >
+
+<!-- list item -->
+
+<!ELEMENT li %Flow;>
+<!ATTLIST li
+ %attrs;
+ >
+
+<!-- definition lists - dt for term, dd for its definition -->
+
+<!ELEMENT dl (dt|dd)+>
+<!ATTLIST dl
+ %attrs;
+ >
+
+<!ELEMENT dt %Inline;>
+<!ATTLIST dt
+ %attrs;
+ >
+
+<!ELEMENT dd %Flow;>
+<!ATTLIST dd
+ %attrs;
+ >
+
+<!--=================== Address ==========================================-->
+
+<!-- information on author -->
+
+<!ELEMENT address %Inline;>
+<!ATTLIST address
+ %attrs;
+ >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %attrs;
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- content is %Inline; excluding "img|object|big|small|sub|sup" -->
+
+<!ELEMENT pre %pre.content;>
+<!ATTLIST pre
+ %attrs;
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT blockquote %Block;>
+<!ATTLIST blockquote
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+<!--
+ ins/del are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+-->
+<!ELEMENT ins %Flow;>
+<!ATTLIST ins
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!ELEMENT del %Flow;>
+<!ATTLIST del
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!--================== The Anchor Element ================================-->
+
+<!-- content is %Inline; except that anchors shouldn't be nested -->
+
+<!ELEMENT a %a.content;>
+<!ATTLIST a
+ %attrs;
+ %focus;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ >
+
+<!--===================== Inline Elements ================================-->
+
+<!ELEMENT span %Inline;> <!-- generic language/style container -->
+<!ATTLIST span
+ %attrs;
+ >
+
+<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
+<!ATTLIST bdo
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ >
+
+<!ELEMENT br EMPTY> <!-- forced line break -->
+<!ATTLIST br
+ %coreattrs;
+ >
+
+<!ELEMENT em %Inline;> <!-- emphasis -->
+<!ATTLIST em %attrs;>
+
+<!ELEMENT strong %Inline;> <!-- strong emphasis -->
+<!ATTLIST strong %attrs;>
+
+<!ELEMENT dfn %Inline;> <!-- definitional -->
+<!ATTLIST dfn %attrs;>
+
+<!ELEMENT code %Inline;> <!-- program code -->
+<!ATTLIST code %attrs;>
+
+<!ELEMENT samp %Inline;> <!-- sample -->
+<!ATTLIST samp %attrs;>
+
+<!ELEMENT kbd %Inline;> <!-- something user would type -->
+<!ATTLIST kbd %attrs;>
+
+<!ELEMENT var %Inline;> <!-- variable -->
+<!ATTLIST var %attrs;>
+
+<!ELEMENT cite %Inline;> <!-- citation -->
+<!ATTLIST cite %attrs;>
+
+<!ELEMENT abbr %Inline;> <!-- abbreviation -->
+<!ATTLIST abbr %attrs;>
+
+<!ELEMENT acronym %Inline;> <!-- acronym -->
+<!ATTLIST acronym %attrs;>
+
+<!ELEMENT q %Inline;> <!-- inlined quote -->
+<!ATTLIST q
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!ELEMENT sub %Inline;> <!-- subscript -->
+<!ATTLIST sub %attrs;>
+
+<!ELEMENT sup %Inline;> <!-- superscript -->
+<!ATTLIST sup %attrs;>
+
+<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
+<!ATTLIST tt %attrs;>
+
+<!ELEMENT i %Inline;> <!-- italic font -->
+<!ATTLIST i %attrs;>
+
+<!ELEMENT b %Inline;> <!-- bold font -->
+<!ATTLIST b %attrs;>
+
+<!ELEMENT big %Inline;> <!-- bigger font -->
+<!ATTLIST big %attrs;>
+
+<!ELEMENT small %Inline;> <!-- smaller font -->
+<!ATTLIST small %attrs;>
+
+<!--==================== Object ======================================-->
+<!--
+ object is used to embed objects as part of HTML pages.
+ param elements should precede other content. Parameters
+ can also be expressed as attribute/value pairs on the
+ object element itself when brevity is desired.
+-->
+
+<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST object
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ >
+
+<!--
+ param is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced
+ by attribute value pairs on the object start tag.
+-->
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ id ID #IMPLIED
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ >
+
+<!--=================== Images ===========================================-->
+
+<!--
+ To avoid accessibility problems for people who aren't
+ able to see the image, you should provide a text
+ description using the alt and longdesc attributes.
+ In addition, avoid the use of server-side image maps.
+ Note that in this DTD there is no name attribute. That
+ is only available in the transitional and frameset DTD.
+-->
+
+<!ELEMENT img EMPTY>
+<!ATTLIST img
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ >
+
+<!-- usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
+<!ATTLIST map
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ >
+
+<!ELEMENT area EMPTY>
+<!ATTLIST area
+ %attrs;
+ %focus;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ >
+
+<!--================ Forms ===============================================-->
+<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
+
+<!ATTLIST form
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ >
+
+<!--
+ Each label must not contain more than ONE field
+ Label elements shouldn't be nested.
+-->
+<!ELEMENT label %Inline;>
+<!ATTLIST label
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!ENTITY % InputType
+ "(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)"
+ >
+
+<!-- the name attribute is required for all but submit & reset -->
+
+<!ELEMENT input EMPTY> <!-- form control -->
+<!ATTLIST input
+ %attrs;
+ %focus;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ >
+
+<!ELEMENT select (optgroup|option)+> <!-- option selector -->
+<!ATTLIST select
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!ELEMENT optgroup (option)+> <!-- option group -->
+<!ATTLIST optgroup
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ >
+
+<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
+<!ATTLIST option
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
+<!ATTLIST textarea
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!--
+ The fieldset element is used to group form fields.
+ Only one legend element should occur in the content
+ and if present should only be preceded by whitespace.
+-->
+<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
+<!ATTLIST fieldset
+ %attrs;
+ >
+
+<!ELEMENT legend %Inline;> <!-- fieldset label -->
+<!ATTLIST legend
+ %attrs;
+ accesskey %Character; #IMPLIED
+ >
+
+<!--
+ Content is %Flow; excluding a, form and form controls
+-->
+<!ELEMENT button %button.content;> <!-- push button -->
+<!ATTLIST button
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- Derived from IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The border attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ 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 % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ 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 % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal alignment attributes for cell contents
+
+ char alignment char, e.g. char=':'
+ charoff offset for alignment char
+-->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
+<!ELEMENT caption %Inline;>
+<!ELEMENT thead (tr)+>
+<!ELEMENT tfoot (tr)+>
+<!ELEMENT tbody (tr)+>
+<!ELEMENT colgroup (col)*>
+<!ELEMENT col EMPTY>
+<!ELEMENT tr (th|td)+>
+<!ELEMENT th %Flow;>
+<!ELEMENT td %Flow;>
+
+<!ATTLIST table
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ >
+
+<!ATTLIST caption
+ %attrs;
+ >
+
+<!--
+colgroup groups a set of col elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST colgroup
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ 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.
+-->
+<!ATTLIST col
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+
+ Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+
+ Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST thead
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tfoot
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tbody
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tr
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- th is for headers, td for data and for cells acting as both -->
+
+<!ATTLIST th
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST td
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ >
+
diff --git a/lib/docbuilder/dtd/xhtml1-transitional.dtd b/lib/docbuilder/dtd/xhtml1-transitional.dtd
new file mode 100644
index 0000000000..628f27ac50
--- /dev/null
+++ b/lib/docbuilder/dtd/xhtml1-transitional.dtd
@@ -0,0 +1,1201 @@
+<!--
+ Extensible HTML version 1.0 Transitional DTD
+
+ This is the same as HTML 4 Transitional except for
+ changes due to the differences between XML and SGML.
+
+ Namespace = http://www.w3.org/1999/xhtml
+
+ For further information, see: http://www.w3.org/TR/xhtml1
+
+ Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
+ All Rights Reserved.
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+
+ $Revision: 1.2 $
+ $Date: 2002/08/01 18:37:55 $
+
+-->
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "xhtml-lat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "xhtml-symbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "xhtml-special.ent">
+%HTMLspecial;
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA">
+ <!-- media type, as per [RFC2045] -->
+
+<!ENTITY % ContentTypes "CDATA">
+ <!-- comma-separated list of media types, as per [RFC2045] -->
+
+<!ENTITY % Charset "CDATA">
+ <!-- a character encoding, as per [RFC2045] -->
+
+<!ENTITY % Charsets "CDATA">
+ <!-- a space separated list of character encodings, as per [RFC2045] -->
+
+<!ENTITY % LanguageCode "NMTOKEN">
+ <!-- a language code, as per [RFC3066] -->
+
+<!ENTITY % Character "CDATA">
+ <!-- a single character, as per section 2.2 of [XML] -->
+
+<!ENTITY % Number "CDATA">
+ <!-- one or more digits -->
+
+<!ENTITY % LinkTypes "CDATA">
+ <!-- space-separated list of link types -->
+
+<!ENTITY % MediaDesc "CDATA">
+ <!-- single or comma-separated list of media descriptors -->
+
+<!ENTITY % URI "CDATA">
+ <!-- a Uniform Resource Identifier, see [RFC2396] -->
+
+<!ENTITY % UriList "CDATA">
+ <!-- a space separated list of Uniform Resource Identifiers -->
+
+<!ENTITY % Datetime "CDATA">
+ <!-- date and time information. ISO date format -->
+
+<!ENTITY % Script "CDATA">
+ <!-- script expression -->
+
+<!ENTITY % StyleSheet "CDATA">
+ <!-- style sheet data -->
+
+<!ENTITY % Text "CDATA">
+ <!-- used for titles etc. -->
+
+<!ENTITY % FrameTarget "NMTOKEN">
+ <!-- render in this frame -->
+
+<!ENTITY % Length "CDATA">
+ <!-- nn for pixels or nn% for percentage length -->
+
+<!ENTITY % MultiLength "CDATA">
+ <!-- pixel, percentage, or relative -->
+
+<!ENTITY % Pixels "CDATA">
+ <!-- integer representing length in pixels -->
+
+<!-- these are used for image maps -->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+
+<!ENTITY % Coords "CDATA">
+ <!-- comma separated list of lengths -->
+
+<!-- used for object, applet, img, input and iframe -->
+<!ENTITY % ImgAlign "(top|middle|bottom|left|right)">
+
+<!-- a color using sRGB: #RRGGBB as Hex values -->
+<!ENTITY % Color "CDATA">
+
+<!-- There are also 16 widely known color names with their sRGB values:
+
+ Black = #000000 Green = #008000
+ Silver = #C0C0C0 Lime = #00FF00
+ Gray = #808080 Olive = #808000
+ White = #FFFFFF Yellow = #FFFF00
+ Maroon = #800000 Navy = #000080
+ Red = #FF0000 Blue = #0000FF
+ Purple = #800080 Teal = #008080
+ Fuchsia= #FF00FF Aqua = #00FFFF
+-->
+
+<!--=================== Generic Attributes ===============================-->
+
+<!-- core attributes common to most elements
+ id document-wide unique id
+ class space separated list of classes
+ style associated style info
+ title advisory title/amplification
+-->
+<!ENTITY % coreattrs
+ "id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED"
+ >
+
+<!-- internationalization attributes
+ lang language code (backwards compatible)
+ xml:lang language code (as per XML 1.0 spec)
+ dir direction for weak/neutral text
+-->
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED"
+ >
+
+<!-- attributes for common UI events
+ onclick a pointer button was clicked
+ ondblclick a pointer button was double clicked
+ onmousedown a pointer button was pressed down
+ onmouseup a pointer button was released
+ onmousemove a pointer was moved onto the element
+ onmouseout a pointer was moved away from the element
+ onkeypress a key was pressed and released
+ onkeydown a key was pressed down
+ onkeyup a key was released
+-->
+<!ENTITY % events
+ "onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED"
+ >
+
+<!-- attributes for elements that can get the focus
+ accesskey accessibility key character
+ tabindex position in tabbing order
+ onfocus the element got the focus
+ onblur the element lost the focus
+-->
+<!ENTITY % focus
+ "accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED"
+ >
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!-- text alignment for p, div, h1-h6. The default is
+ align="left" for ltr headings, "right" for rtl -->
+
+<!ENTITY % TextAlign "align (left|center|right|justify) #IMPLIED">
+
+<!--=================== Text Elements ====================================-->
+
+<!ENTITY % special.extra
+ "object | applet | img | map | iframe">
+
+<!ENTITY % special.basic
+ "br | span | bdo">
+
+<!ENTITY % special
+ "%special.basic; | %special.extra;">
+
+<!ENTITY % fontstyle.extra "big | small | font | basefont">
+
+<!ENTITY % fontstyle.basic "tt | i | b | u
+ | s | strike ">
+
+<!ENTITY % fontstyle "%fontstyle.basic; | %fontstyle.extra;">
+
+<!ENTITY % phrase.extra "sub | sup">
+<!ENTITY % phrase.basic "em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym">
+
+<!ENTITY % phrase "%phrase.basic; | %phrase.extra;">
+
+<!ENTITY % inline.forms "input | select | textarea | label | button">
+
+<!-- these can occur at block or inline level -->
+<!ENTITY % misc.inline "ins | del | script">
+
+<!-- these can only occur at block level -->
+<!ENTITY % misc "noscript | %misc.inline;">
+
+<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
+
+<!-- %Inline; covers inline or "text-level" elements -->
+<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
+
+<!--================== Block level elements ==============================-->
+
+<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
+<!ENTITY % lists "ul | ol | dl | menu | dir">
+<!ENTITY % blocktext "pre | hr | blockquote | address | center | noframes">
+
+<!ENTITY % block
+ "p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table">
+
+<!-- %Flow; mixes block and inline and is used for list items etc. -->
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+
+<!--================== Content models for exclusions =====================-->
+
+<!-- a elements use %Inline; excluding a -->
+
+<!ENTITY % a.content
+ "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*">
+
+<!-- pre uses %Inline excluding img, object, applet, big, small,
+ font, or basefont -->
+
+<!ENTITY % pre.content
+ "(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; |
+ %inline.forms; | %misc.inline;)*">
+
+<!-- form uses %Flow; excluding form -->
+
+<!ENTITY % form.content "(#PCDATA | %block; | %inline; | %misc;)*">
+
+<!-- button uses %Flow; but excludes a, form, form controls, iframe -->
+
+<!ENTITY % button.content
+ "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | br | span | bdo | object | applet | img | map |
+ %fontstyle; | %phrase; | %misc;)*">
+
+<!--================ Document Structure ==================================-->
+
+<!-- the namespace URI designates the document profile -->
+
+<!ELEMENT html (head, body)>
+<!ATTLIST html
+ %i18n;
+ id ID #IMPLIED
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ >
+
+<!--================ Document Head =======================================-->
+
+<!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
+
+<!-- content model is %head.misc; combined with a single
+ title and an optional base element in any order -->
+
+<!ELEMENT head (%head.misc;,
+ ((title, %head.misc;, (base, %head.misc;)?) |
+ (base, %head.misc;, (title, %head.misc;))))>
+
+<!ATTLIST head
+ %i18n;
+ id ID #IMPLIED
+ profile %URI; #IMPLIED
+ >
+
+<!-- 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.
+ -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title
+ %i18n;
+ id ID #IMPLIED
+ >
+
+<!-- document base URI -->
+
+<!ELEMENT base EMPTY>
+<!ATTLIST base
+ id ID #IMPLIED
+ href %URI; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- generic metainformation -->
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %i18n;
+ id ID #IMPLIED
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ >
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the link element in document head 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 stylesheets 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")
+-->
+
+<!ELEMENT link EMPTY>
+<!ATTLIST link
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- style info, which may include CDATA sections -->
+<!ELEMENT style (#PCDATA)>
+<!ATTLIST style
+ %i18n;
+ id ID #IMPLIED
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- script statements, which may include CDATA sections -->
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script
+ id ID #IMPLIED
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ language CDATA #IMPLIED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- alternate content container for non script-based rendering -->
+
+<!ELEMENT noscript %Flow;>
+<!ATTLIST noscript
+ %attrs;
+ >
+
+<!--======================= Frames =======================================-->
+
+<!-- inline subwindow -->
+
+<!ELEMENT iframe %Flow;>
+<!ATTLIST iframe
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ align %ImgAlign; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!-- alternate content container for non frame-based rendering -->
+
+<!ELEMENT noframes %Flow;>
+<!ATTLIST noframes
+ %attrs;
+ >
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT body %Flow;>
+<!ATTLIST body
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ background %URI; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ text %Color; #IMPLIED
+ link %Color; #IMPLIED
+ vlink %Color; #IMPLIED
+ alink %Color; #IMPLIED
+ >
+
+<!ELEMENT div %Flow;> <!-- generic language/style container -->
+<!ATTLIST div
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT p %Inline;>
+<!ATTLIST p
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from h1 (the most important)
+ to h6 (the least important).
+-->
+
+<!ELEMENT h1 %Inline;>
+<!ATTLIST h1
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h2 %Inline;>
+<!ATTLIST h2
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h3 %Inline;>
+<!ATTLIST h3
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h4 %Inline;>
+<!ATTLIST h4
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h5 %Inline;>
+<!ATTLIST h5
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h6 %Inline;>
+<!ATTLIST h6
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- Unordered list bullet styles -->
+
+<!ENTITY % ULStyle "(disc|square|circle)">
+
+<!-- Unordered list -->
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %attrs;
+ type %ULStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ >
+
+<!-- Ordered list numbering style
+
+ 1 arabic numbers 1, 2, 3, ...
+ a lower alpha a, b, c, ...
+ A upper alpha A, B, C, ...
+ i lower roman i, ii, iii, ...
+ I upper roman I, II, III, ...
+
+ The style is applied to the sequence number which by default
+ is reset to 1 for the first list item in an ordered list.
+-->
+<!ENTITY % OLStyle "CDATA">
+
+<!-- Ordered (numbered) list -->
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %attrs;
+ type %OLStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ start %Number; #IMPLIED
+ >
+
+<!-- single column list (DEPRECATED) -->
+<!ELEMENT menu (li)+>
+<!ATTLIST menu
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- multiple column list (DEPRECATED) -->
+<!ELEMENT dir (li)+>
+<!ATTLIST dir
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- LIStyle is constrained to: "(%ULStyle;|%OLStyle;)" -->
+<!ENTITY % LIStyle "CDATA">
+
+<!-- list item -->
+
+<!ELEMENT li %Flow;>
+<!ATTLIST li
+ %attrs;
+ type %LIStyle; #IMPLIED
+ value %Number; #IMPLIED
+ >
+
+<!-- definition lists - dt for term, dd for its definition -->
+
+<!ELEMENT dl (dt|dd)+>
+<!ATTLIST dl
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!ELEMENT dt %Inline;>
+<!ATTLIST dt
+ %attrs;
+ >
+
+<!ELEMENT dd %Flow;>
+<!ATTLIST dd
+ %attrs;
+ >
+
+<!--=================== Address ==========================================-->
+
+<!-- information on author -->
+
+<!ELEMENT address (#PCDATA | %inline; | %misc.inline; | p)*>
+<!ATTLIST address
+ %attrs;
+ >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %attrs;
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- content is %Inline; excluding
+ "img|object|applet|big|small|sub|sup|font|basefont" -->
+
+<!ELEMENT pre %pre.content;>
+<!ATTLIST pre
+ %attrs;
+ width %Number; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT blockquote %Flow;>
+<!ATTLIST blockquote
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!--=================== Text alignment ===================================-->
+
+<!-- center content -->
+<!ELEMENT center %Flow;>
+<!ATTLIST center
+ %attrs;
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+<!--
+ ins/del are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+-->
+<!ELEMENT ins %Flow;>
+<!ATTLIST ins
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!ELEMENT del %Flow;>
+<!ATTLIST del
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!--================== The Anchor Element ================================-->
+
+<!-- content is %Inline; except that anchors shouldn't be nested -->
+
+<!ELEMENT a %a.content;>
+<!ATTLIST a
+ %attrs;
+ %focus;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--===================== Inline Elements ================================-->
+
+<!ELEMENT span %Inline;> <!-- generic language/style container -->
+<!ATTLIST span
+ %attrs;
+ >
+
+<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
+<!ATTLIST bdo
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ >
+
+<!ELEMENT br EMPTY> <!-- forced line break -->
+<!ATTLIST br
+ %coreattrs;
+ clear (left|all|right|none) "none"
+ >
+
+<!ELEMENT em %Inline;> <!-- emphasis -->
+<!ATTLIST em %attrs;>
+
+<!ELEMENT strong %Inline;> <!-- strong emphasis -->
+<!ATTLIST strong %attrs;>
+
+<!ELEMENT dfn %Inline;> <!-- definitional -->
+<!ATTLIST dfn %attrs;>
+
+<!ELEMENT code %Inline;> <!-- program code -->
+<!ATTLIST code %attrs;>
+
+<!ELEMENT samp %Inline;> <!-- sample -->
+<!ATTLIST samp %attrs;>
+
+<!ELEMENT kbd %Inline;> <!-- something user would type -->
+<!ATTLIST kbd %attrs;>
+
+<!ELEMENT var %Inline;> <!-- variable -->
+<!ATTLIST var %attrs;>
+
+<!ELEMENT cite %Inline;> <!-- citation -->
+<!ATTLIST cite %attrs;>
+
+<!ELEMENT abbr %Inline;> <!-- abbreviation -->
+<!ATTLIST abbr %attrs;>
+
+<!ELEMENT acronym %Inline;> <!-- acronym -->
+<!ATTLIST acronym %attrs;>
+
+<!ELEMENT q %Inline;> <!-- inlined quote -->
+<!ATTLIST q
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!ELEMENT sub %Inline;> <!-- subscript -->
+<!ATTLIST sub %attrs;>
+
+<!ELEMENT sup %Inline;> <!-- superscript -->
+<!ATTLIST sup %attrs;>
+
+<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
+<!ATTLIST tt %attrs;>
+
+<!ELEMENT i %Inline;> <!-- italic font -->
+<!ATTLIST i %attrs;>
+
+<!ELEMENT b %Inline;> <!-- bold font -->
+<!ATTLIST b %attrs;>
+
+<!ELEMENT big %Inline;> <!-- bigger font -->
+<!ATTLIST big %attrs;>
+
+<!ELEMENT small %Inline;> <!-- smaller font -->
+<!ATTLIST small %attrs;>
+
+<!ELEMENT u %Inline;> <!-- underline -->
+<!ATTLIST u %attrs;>
+
+<!ELEMENT s %Inline;> <!-- strike-through -->
+<!ATTLIST s %attrs;>
+
+<!ELEMENT strike %Inline;> <!-- strike-through -->
+<!ATTLIST strike %attrs;>
+
+<!ELEMENT basefont EMPTY> <!-- base font size -->
+<!ATTLIST basefont
+ id ID #IMPLIED
+ size CDATA #REQUIRED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!ELEMENT font %Inline;> <!-- local change to font -->
+<!ATTLIST font
+ %coreattrs;
+ %i18n;
+ size CDATA #IMPLIED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!--==================== Object ======================================-->
+<!--
+ object is used to embed objects as part of HTML pages.
+ param elements should precede other content. Parameters
+ can also be expressed as attribute/value pairs on the
+ object element itself when brevity is desired.
+-->
+
+<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST object
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--
+ param is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced
+ by attribute value pairs on the object start tag.
+-->
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ id ID #IMPLIED
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ >
+
+<!--=================== Java applet ==================================-->
+<!--
+ One of code or object attributes must be present.
+ Place param elements before other content.
+-->
+<!ELEMENT applet (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST applet
+ %coreattrs;
+ codebase %URI; #IMPLIED
+ archive CDATA #IMPLIED
+ code CDATA #IMPLIED
+ object CDATA #IMPLIED
+ alt %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ width %Length; #REQUIRED
+ height %Length; #REQUIRED
+ align %ImgAlign; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--=================== Images ===========================================-->
+
+<!--
+ To avoid accessibility problems for people who aren't
+ able to see the image, you should provide a text
+ description using the alt and longdesc attributes.
+ In addition, avoid the use of server-side image maps.
+-->
+
+<!ELEMENT img EMPTY>
+<!ATTLIST img
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ name NMTOKEN #IMPLIED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Length; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!-- usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
+<!ATTLIST map
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name CDATA #IMPLIED
+ >
+
+<!ELEMENT area EMPTY>
+<!ATTLIST area
+ %attrs;
+ %focus;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--================ Forms ===============================================-->
+
+<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
+
+<!ATTLIST form
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ name NMTOKEN #IMPLIED
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--
+ Each label must not contain more than ONE field
+ Label elements shouldn't be nested.
+-->
+<!ELEMENT label %Inline;>
+<!ATTLIST label
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!ENTITY % InputType
+ "(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)"
+ >
+
+<!-- the name attribute is required for all but submit & reset -->
+
+<!ELEMENT input EMPTY> <!-- form control -->
+<!ATTLIST input
+ %attrs;
+ %focus;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ >
+
+<!ELEMENT select (optgroup|option)+> <!-- option selector -->
+<!ATTLIST select
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!ELEMENT optgroup (option)+> <!-- option group -->
+<!ATTLIST optgroup
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ >
+
+<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
+<!ATTLIST option
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
+<!ATTLIST textarea
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!--
+ The fieldset element is used to group form fields.
+ Only one legend element should occur in the content
+ and if present should only be preceded by whitespace.
+-->
+<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
+<!ATTLIST fieldset
+ %attrs;
+ >
+
+<!ENTITY % LAlign "(top|bottom|left|right)">
+
+<!ELEMENT legend %Inline;> <!-- fieldset label -->
+<!ATTLIST legend
+ %attrs;
+ accesskey %Character; #IMPLIED
+ align %LAlign; #IMPLIED
+ >
+
+<!--
+ Content is %Flow; excluding a, form, form controls, iframe
+-->
+<!ELEMENT button %button.content;> <!-- push button -->
+<!ATTLIST button
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ >
+
+<!-- single-line text input control (DEPRECATED) -->
+<!ELEMENT isindex EMPTY>
+<!ATTLIST isindex
+ %coreattrs;
+ %i18n;
+ prompt %Text; #IMPLIED
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- Derived from IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The border attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ 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 % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ 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 % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents
+
+ char alignment char, e.g. char=':'
+ charoff offset for alignment char
+-->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
+<!ELEMENT caption %Inline;>
+<!ELEMENT thead (tr)+>
+<!ELEMENT tfoot (tr)+>
+<!ELEMENT tbody (tr)+>
+<!ELEMENT colgroup (col)*>
+<!ELEMENT col EMPTY>
+<!ELEMENT tr (th|td)+>
+<!ELEMENT th %Flow;>
+<!ELEMENT td %Flow;>
+
+<!ATTLIST table
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ align %TAlign; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST caption
+ %attrs;
+ align %CAlign; #IMPLIED
+ >
+
+<!--
+colgroup groups a set of col elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST colgroup
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ 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.
+-->
+<!ATTLIST col
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+
+ Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+
+ Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST thead
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tfoot
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tbody
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tr
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ bgcolor %Color; #IMPLIED
+ >
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- th is for headers, td for data and for cells acting as both -->
+
+<!ATTLIST th
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Length; #IMPLIED
+ height %Length; #IMPLIED
+ >
+
+<!ATTLIST td
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Length; #IMPLIED
+ height %Length; #IMPLIED
+ >
+
diff --git a/lib/docbuilder/ebin/.gitignore b/lib/docbuilder/ebin/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/docbuilder/ebin/.gitignore
diff --git a/lib/docbuilder/etc/Makefile b/lib/docbuilder/etc/Makefile
new file mode 100644
index 0000000000..a2f669d749
--- /dev/null
+++ b/lib/docbuilder/etc/Makefile
@@ -0,0 +1,67 @@
+# ``The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved via the world wide web at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999-2000, Ericsson
+# Utvecklings AB. All Rights Reserved.''
+#
+# $Id$
+#
+
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+VSN=$(DOCB_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/docbuilder-$(VSN)
+
+# ----------------------------------------------------
+# Common Macros
+# ----------------------------------------------------
+
+VAR_FILES = \
+ note.gif \
+ warning.gif
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+debug opt:
+
+clean:
+
+docs:
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec:
+ $(INSTALL_DIR) $(RELSYSDIR)/etc
+ $(INSTALL_DATA) $(VAR_FILES) $(RELSYSDIR)/etc
+
+release_docs_spec:
+
+
+
+
+
+
+
diff --git a/lib/docbuilder/etc/note.gif b/lib/docbuilder/etc/note.gif
new file mode 100644
index 0000000000..6fffe30419
--- /dev/null
+++ b/lib/docbuilder/etc/note.gif
Binary files differ
diff --git a/lib/docbuilder/etc/warning.gif b/lib/docbuilder/etc/warning.gif
new file mode 100644
index 0000000000..96af52360e
--- /dev/null
+++ b/lib/docbuilder/etc/warning.gif
Binary files differ
diff --git a/lib/docbuilder/info b/lib/docbuilder/info
new file mode 100644
index 0000000000..33ce19fb4b
--- /dev/null
+++ b/lib/docbuilder/info
@@ -0,0 +1,2 @@
+group: tools
+short: Tool for generating HTML documentation for applications.
diff --git a/lib/docbuilder/src/Makefile b/lib/docbuilder/src/Makefile
new file mode 100644
index 0000000000..e8a07a54e8
--- /dev/null
+++ b/lib/docbuilder/src/Makefile
@@ -0,0 +1,121 @@
+# ``The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved via the world wide web at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999-2000, Ericsson
+# Utvecklings AB. All Rights Reserved.''
+#
+# $Id$
+#
+
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+VSN=$(DOCB_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/docbuilder-$(VSN)
+
+# ----------------------------------------------------
+# Common Macros
+# ----------------------------------------------------
+
+MODULES= \
+ docb_edoc_xml_cb \
+ docb_gen \
+ docb_html \
+ docb_html_layout \
+ docb_html_ref \
+ docb_html_util \
+ docb_html_util_iso \
+ docb_main \
+ docb_pretty_format \
+ docb_tr_application2html \
+ docb_tr_appref2html \
+ docb_tr_chapter2html \
+ docb_tr_cite2html \
+ docb_tr_comref2html \
+ docb_tr_cref2html \
+ docb_tr_erlref2html \
+ docb_tr_fileref2html \
+ docb_tr_first2html \
+ docb_tr_index2html \
+ docb_tr_part2html \
+ docb_tr_refs2kwic \
+ docb_tr_report2html \
+ docb_tr_term2html \
+ docb_transform \
+ docb_util \
+ docb_xmerl_tree_cb \
+ docb_xmerl_xml_cb \
+ docb_xml_check
+
+HRL_FILES= \
+ docb_util.hrl
+
+ERL_FILES= $(MODULES:%=%.erl)
+
+TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+
+APP_FILE= docbuilder.app
+APPUP_FILE= docbuilder.appup
+APP_SRC= $(APP_FILE).src
+APPUP_SRC= $(APPUP_FILE).src
+APP_TARGET= $(EBIN)/$(APP_FILE)
+APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+ERL_FLAGS +=
+XMERL = ../../xmerl
+ERL_COMPILE_FLAGS += -I$(XMERL)/include
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+
+clean:
+ rm -f $(TARGET_FILES) $(APP_TARGET)
+ rm -f errs core *~
+
+$(APP_TARGET): $(APP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+docs:
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)/src
+ $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)/src
+ $(INSTALL_DIR) $(RELSYSDIR)/ebin
+ $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(RELSYSDIR)/ebin
+
+release_docs_spec:
+
+
+
+
+
diff --git a/lib/docbuilder/src/docb_edoc_xml_cb.erl b/lib/docbuilder/src/docb_edoc_xml_cb.erl
new file mode 100644
index 0000000000..4dba843341
--- /dev/null
+++ b/lib/docbuilder/src/docb_edoc_xml_cb.erl
@@ -0,0 +1,1163 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the Licence for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson AB.
+%% Portions created by Ericsson are Copyright 1999-2006, Ericsson AB.
+%% All Rights Reserved.��
+%%
+%% $Id$
+%%
+-module(docb_edoc_xml_cb).
+
+%% This is the EDoc callback module for creating DocBuilder erlref
+%% documents (man pages) in XML format, and also a DocBuilder chapter
+%% document based on "overview.edoc".
+%%
+%% Usage examples:
+%% docb_gen File
+%% docb_gen -chapter overview.edoc
+%% or (from an Erlang shell)
+%% edoc:file(File, [{layout,docb_edoc_xml_cb},{file_suffix,".xml"},
+%% {preprocess,true}]).
+%%
+%% The origin of this file is the edoc module otpsgml_layout.erl
+%% written by Richard Carlsson.
+
+-export([module/2, overview/2]).
+
+-include("xmerl.hrl").
+
+-define(NL, "\n").
+
+%%-User interface-------------------------------------------------------
+
+%% ERLREF
+module(Element, Opts) ->
+ SortP = proplists:get_value(sort_functions, Opts, true),
+ XML = layout_module(Element, SortP),
+ xmerl:export_simple([XML], docb_xmerl_xml_cb, []).
+
+%% CHAPTER
+overview(Element, _Opts) ->
+ XML = layout_chapter(Element),
+ xmerl:export_simple([XML], docb_xmerl_xml_cb, []).
+
+%%--Internal functions--------------------------------------------------
+
+layout_module(#xmlElement{name = module, content = Es}=E, SortP) ->
+ Name = get_attrval(name, E),
+ Desc = get_content(description, Es),
+ ShortDesc = text_only(get_content(briefDescription, Desc)),
+ FullDesc = otp_xmlify(get_content(fullDescription, Desc)),
+ Types0 = get_content(typedecls, Es),
+ Types1 = lists:sort([{type_name(Et), Et} || Et <- Types0]),
+ Functions =
+ case SortP of
+ true ->
+ lists:sort([{function_name(Ef), Ef} ||
+ Ef <- get_content(functions, Es)]);
+ false ->
+ [{function_name(Ef), Ef} ||
+ Ef <- get_content(functions, Es)]
+ end,
+ Header = {header, [
+ ?NL,{title, [Name]},
+ ?NL,{prepared, [""]},
+ ?NL,{responsible, [""]},
+ ?NL,{docno, ["1"]},
+ ?NL,{approved, [""]},
+ ?NL,{checked, [""]},
+ ?NL,{date, [""]},
+ ?NL,{rev, ["A"]},
+ ?NL,{file, [Name++".xml"]}
+ ]},
+ Module = {module, [Name]},
+ ModuleSummary = {modulesummary, ShortDesc},
+ Description = {description, [?NL|FullDesc]},
+ Types = case Types1 of
+ [] -> [];
+ _ ->
+ [?NL, {section,[{title,["DATA TYPES"]},
+ {marker,[{id,"types"}],[]},
+ ?NL|types(Types1)]}]
+ end,
+ Funcs = functions(Functions),
+ See = seealso_module(Es),
+ Authors = {authors, authors(Es)},
+ {erlref,
+ [?NL,Header,
+ ?NL,Module,
+ ?NL,ModuleSummary,
+ ?NL,Description]
+ ++ Types ++
+ [?NL,Funcs,
+ ?NL,See,
+ ?NL,Authors]
+ }.
+
+layout_chapter(#xmlElement{name=overview, content=Es}) ->
+ Title = get_text(title, Es),
+ Header = {header, [
+ ?NL,{title,[Title]},
+ ?NL,{prepared,[""]},
+ ?NL,{docno,[""]},
+ ?NL,{date,[""]},
+ ?NL,{rev,[""]},
+ ?NL,{file, ["chapter.xml"]}
+ ]},
+ DescEs = get_content(description, Es),
+ FullDescEs = get_content(fullDescription, DescEs),
+ Sections = chapter_ify(FullDescEs, first),
+ {chapter, [?NL, Header, ?NL | Sections]}.
+
+chapter_ify([], _) ->
+ [];
+chapter_ify(Es, first) ->
+ %% Everything up to the first section should be made into
+ %% plain paragraphs -- or if no first section is found, everything
+ %% should be made into one
+ case find_next(h3, Es) of
+ {Es, []} ->
+ SubSections = subchapter_ify(Es, first),
+ [{section, [?NL,{title,["Overview"]},
+ ?NL | SubSections]}];
+ {FirstEs, RestEs} ->
+ otp_xmlify(FirstEs) ++ chapter_ify(RestEs, next)
+ end;
+chapter_ify([#xmlElement{name=h3} = E | Es], next) ->
+ {SectionEs, RestEs} = find_next(h3, Es),
+ SubSections = subchapter_ify(SectionEs, first),
+ {Marker, Title} = chapter_title(E),
+ [{section, [?NL,{marker,[{id,Marker}],[]},
+ ?NL,{title,[Title]},
+ ?NL | SubSections]} | chapter_ify(RestEs, next)].
+
+subchapter_ify([], _) ->
+ [];
+subchapter_ify(Es, first) ->
+ %% Everything up to the (possible) first subsection should be
+ %% made into plain paragraphs
+ {FirstEs, RestEs} = find_next(h4, Es),
+ otp_xmlify(FirstEs) ++ subchapter_ify(RestEs, next);
+subchapter_ify([#xmlElement{name=h4} = E | Es], next) ->
+ {SectionEs, RestEs} = find_next(h4, Es),
+ Elements = otp_xmlify(SectionEs),
+ {Marker, Title} = chapter_title(E),
+ [{section, [?NL,{marker,[{id,Marker}],[]},
+ ?NL,{title,[Title]},
+ ?NL | Elements]} | subchapter_ify(RestEs, next)].
+
+chapter_title(#xmlElement{content=Es}) -> % name = h3 | h4
+ case Es of
+ [#xmlElement{name=a} = E] ->
+ {get_attrval(name, E), get_text(E)}
+ end.
+
+%%--XHTML->XML transformation-------------------------------------------
+
+%% otp_xmlify(Es1) -> Es2
+%% Es1 = Es2 = [#xmlElement{} | #xmlText{}]
+%% Fix things that are allowed in XHTML but not in chapter/erlref DTDs.
+%% 1) lists (<ul>, <ol>, <dl>) and code snippets (<pre>) can not occur
+%% within a <p>, such a <p> must be splitted into a sequence of <p>,
+%% <ul>, <ol>, <dl> and <pre>.
+%% 2) <a> must only have either a href attribute (corresponds to a
+%% <seealso> or <url> in the XML code) in which case its content
+%% must be plain text; or a name attribute (<marker>).
+%% 3a) <b> content must be plain text.
+%% b) <em> content must be plain text (or actually a <code> element
+%% as well, but a simplification is used here).
+%% c) <pre> content must be plain text (or could actually contain
+%% <input> as well, but a simplification is used here).
+%% 4) <code> content must be plain text, or the element must be split
+%% into a list of elements.
+%% 5a) <h1>, <h2> etc is not allowed - replaced by its content within
+%% a <b> tag.
+%% b) <center> is not allowed - replaced by its content.
+%% c) <font> -"-
+%% 6) <table> is not allowed in erlref, translated to text instead.
+%% Also a <table> in chapter without a border is translated to text.
+%% A <table> in chapter with a border must contain a <tcaption>.
+%% 7) <sup> is not allowed - is replaced with its text content
+%% within parenthesis.
+%% 8) <blockquote> contents may need to be made into paragraphs
+%% 9) <th> (table header) is not allowed - is replaced by
+%% <td><em>...</em></td>.
+otp_xmlify([]) ->
+ [];
+otp_xmlify(Es0) ->
+ Es = case is_paragraph(hd(Es0)) of
+
+ %% If the first element is a <p> xmlElement, then
+ %% the entire element list is ready to be otp_xmlified.
+ true ->
+ Es0;
+
+ %% If the first element is not a <p> xmlElement, then all
+ %% elements up to the first <p> (or end of list) must be
+ %% made into a paragraph (using the {p, Es} construction)
+ %% before the list is otp_xmlified.
+ false ->
+ case find_next(p, Es0, []) of
+ {[#xmlText{value=Str}] = First, Rest} ->
+ %% Special case: Making a paragraph out of a
+ %% blank line isn't a great idea.
+ case is_empty(Str) of
+ true ->
+ Rest;
+ false ->
+ [{p,First}|Rest]
+ end;
+ {First, Rest} ->
+ [{p,First}|Rest]
+ end
+ end,
+
+ %% Fix paragraph breaks not needed in XHTML but in XML
+ EsFixed = otp_xmlify_fix(Es),
+
+ otp_xmlify_es(EsFixed).
+
+%% EDoc does not always translate empty lines (with leading "%%")
+%% as paragraph break, this is the fix
+otp_xmlify_fix(Es) ->
+ otp_xmlify_fix(Es, []).
+otp_xmlify_fix([#xmlText{value="\n \n"++_} = E1, E2 | Es], Res) ->
+ %% This is how it looks when generating an erlref from a .erl file
+ case is_paragraph(E2) of
+ false ->
+ {P, After} = find_p_ending(Es, []),
+ otp_xmlify_fix(After, [{p, [E2|P]}, E1 | Res]);
+ true ->
+ otp_xmlify_fix([E2|Es], [E1|Res])
+ end;
+otp_xmlify_fix([#xmlText{value="\n\n"} = E1, E2 | Es], Res) ->
+ %% This is how it looks when generating a chapter from overview.edoc
+ case is_paragraph(E2) of
+ false ->
+ {P, After} = find_p_ending(Es, []),
+ otp_xmlify_fix(After, [{p, [E2|P]}, E1 | Res]);
+ true ->
+ otp_xmlify_fix([E2|Es], [E1|Res])
+ end;
+otp_xmlify_fix([E|Es], Res) ->
+ otp_xmlify_fix(Es, [E|Res]);
+otp_xmlify_fix([], Res) ->
+ lists:reverse(Res).
+
+otp_xmlify_es([E | Es]) ->
+ case is_paragraph(E) of
+ true ->
+ case otp_xmlify_psplit(E) of
+
+ %% paragraph contained inline tags and text only
+ nosplit ->
+ otp_xmlify_e(E) ++ otp_xmlify_es(Es);
+
+ %% paragraph contained dl, ul and/or pre and has been
+ %% splitted
+ SubEs ->
+ lists:flatmap(fun otp_xmlify_e/1, SubEs) ++
+ otp_xmlify_es(Es)
+ end;
+ false ->
+ otp_xmlify_e(E) ++ otp_xmlify_es(Es)
+ end;
+otp_xmlify_es([]) ->
+ [].
+
+%% otp_xmlify_psplit(P) -> nosplit | [E]
+%% Handles case 1) above.
+%% Uses the {p, Es} construct, thus replaces an p xmlElement with one
+%% or more {p, Es} tuples if splitting the paraghrap is necessary.
+otp_xmlify_psplit(P) ->
+ otp_xmlify_psplit(p_content(P), [], []).
+otp_xmlify_psplit([#xmlElement{name=Name}=E | Es], Content, Res) ->
+ if
+ Name==blockquote; Name==ul; Name==ol; Name==dl; Name==pre;
+ Name==table ->
+ case Content of
+ [] ->
+ otp_xmlify_psplit(Es, [], [E|Res]);
+ [#xmlText{value=Str}] ->
+ %% Special case: Making a paragraph out of a blank
+ %% line isn't a great idea. Instead, this can be
+ %% viewed as the case above, where there is no
+ %% content to make a paragraph out of
+ case is_empty(Str) of
+ true ->
+ otp_xmlify_psplit(Es, [], [E|Res]);
+ false ->
+ Pnew = {p, lists:reverse(Content)},
+ otp_xmlify_psplit(Es, [], [E,Pnew|Res])
+ end;
+ _ ->
+ Pnew = {p, lists:reverse(Content)},
+ otp_xmlify_psplit(Es, [], [E,Pnew|Res])
+ end;
+
+ true ->
+ otp_xmlify_psplit(Es, [E|Content], Res)
+ end;
+otp_xmlify_psplit([E | Es], Content, Res) ->
+ otp_xmlify_psplit(Es, [E|Content], Res);
+otp_xmlify_psplit([], _Content, []) ->
+ nosplit;
+otp_xmlify_psplit([], [], Res) ->
+ lists:reverse(Res);
+otp_xmlify_psplit([], [#xmlText{value="\n\n"}], Res) ->
+ lists:reverse(Res);
+otp_xmlify_psplit([], Content, Res) ->
+ Pnew = {p, lists:reverse(Content)},
+ lists:reverse([Pnew|Res]).
+
+%% otp_xmlify_e(E) -> [E]
+%% This is the function which does the actual transformation of
+%% single elements, normally by making sure the content corresponds
+%% to what is allowed by the OTP DTDs.
+%% Returns a list of elements as the xmlification in some cases
+%% returns no element or more than one element (although in most cases
+%% exactly one element).
+otp_xmlify_e(#xmlElement{name=a} = E) -> % 2) above
+ otp_xmlify_a(E);
+otp_xmlify_e(#xmlElement{name=Tag} = E) % 3a-c)
+ when Tag==b; Tag==em; Tag==pre ->
+ Content = text_only(E#xmlElement.content),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=code} = E) -> % 4)
+ case catch text_only(E#xmlElement.content) of
+ {'EXIT', _Error} ->
+ otp_xmlify_code(E);
+ Content ->
+ [E#xmlElement{content=Content}]
+ end;
+otp_xmlify_e(#xmlElement{name=Tag} = E) % 5a
+ when Tag==h1; Tag==h2; Tag==h3; Tag==h4; Tag==h5;
+ Tag==center;
+ Tag==font ->
+ Content = text_only(E#xmlElement.content),
+ [E#xmlElement{name=b, content=Content}];
+otp_xmlify_e(#xmlElement{name=Tag} = E) % 5b-c)
+ when Tag==center;
+ Tag==font ->
+ otp_xmlify_e(E#xmlElement.content);
+otp_xmlify_e(#xmlElement{name=table} = E) -> % 6)
+ case parent(E) of
+ module ->
+ otp_xmlify_table(E#xmlElement.content);
+ overview ->
+ case get_attrval(border, E) of
+ "" -> % implies border="0"
+ [{p, otp_xmlify_table(E#xmlElement.content)}];
+ "0" ->
+ [{p, otp_xmlify_table(E#xmlElement.content)}];
+ _Val ->
+ Content0 = otp_xmlify_e(E#xmlElement.content),
+ Summary = #xmlText{value=get_attrval(summary, E)},
+ TCaption = E#xmlElement{name=tcaption,
+ attributes=[],
+ content=[Summary]},
+ Content = Content0 ++ [TCaption],
+ [E#xmlElement{attributes=[], content=Content}]
+ end
+ end;
+otp_xmlify_e(#xmlElement{name=sup} = E) -> % 7)
+ Text = get_text(E),
+ [#xmlText{parents = E#xmlElement.parents,
+ pos = E#xmlElement.pos,
+ language = E#xmlElement.language,
+ value = "(" ++ Text ++ ")"}];
+otp_xmlify_e(#xmlElement{name=blockquote} = E) -> % 8)
+ Content = otp_xmlify_blockquote(E#xmlElement.content),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=th} = E) -> % 9)
+ Content = otp_xmlify_e(E#xmlElement.content),
+ EmE = E#xmlElement{name=em, content=Content},
+ [E#xmlElement{name=td, content=[EmE]}];
+otp_xmlify_e(#xmlElement{name=p} = E) -> % recurse
+ Content = otp_xmlify_e(E#xmlElement.content),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e({p, Content1}) ->
+ Content2 = otp_xmlify_e(Content1),
+ [{p, Content2}];
+otp_xmlify_e(#xmlElement{name=ul} = E) ->
+ Content = otp_xmlify_e(E#xmlElement.content),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=li} = E) ->
+ %% Content may need to be made into <p>s etc.
+ Content = otp_xmlify(E#xmlElement.content),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=dl} = E) ->
+ Content0 = otp_xmlify_e(E#xmlElement.content),
+ Content = otp_xmlify_dl(Content0),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=dt} = E) ->
+ %% Special fix: Markers in <taglist> <tag>s are not allowed,
+ %% save it using 'put' and place the marker first in the <item>
+ %% instead
+ Content = case E#xmlElement.content of
+ [#xmlElement{name=a} = A] ->
+ put(dt_marker, otp_xmlify_e(A)),
+ otp_xmlify_e(A#xmlElement.content);
+ _ ->
+ otp_xmlify_e(E#xmlElement.content)
+ end,
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=dd} = E) ->
+ %% Content may need to be made into <p>s etc.
+ Content0 = otp_xmlify(E#xmlElement.content),
+ Content = case get(dt_marker) of
+ undefined -> Content0;
+ [Marker] ->
+ put(dt_marker, undefined),
+ [Marker#xmlElement{content=[]}|Content0]
+ end,
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=tr} = E) ->
+ Content = otp_xmlify_e(E#xmlElement.content),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e(#xmlElement{name=td} = E) ->
+ Content = otp_xmlify_e(E#xmlElement.content),
+ [E#xmlElement{content=Content}];
+otp_xmlify_e([E | Es]) ->
+ otp_xmlify_e(E) ++ otp_xmlify_e(Es);
+otp_xmlify_e([]) ->
+ [];
+otp_xmlify_e(E) ->
+ [E].
+
+%%--Tags with special handling------------------------------------------
+
+%% otp_xmlify_a(A1) -> [A2]
+%% Takes an <a> element and filters the attributes to decide wheather
+%% its a seealso/url or a marker.
+%% In the case of a seealso/url, the href part is checked, making
+%% sure a .xml/.html file extension is removed (as DocBuilder inserts
+%% .html extension when resolving cross references).
+%% Also, references to other applications //App has a href attribute
+%% value "OTPROOT/..." (due to app_default being set to "OTPROOT" in
+%% docb_gen.erl), in this case both href attribute and content must be
+%% formatted correctly according to DocBuilder requirements.
+otp_xmlify_a(A) ->
+ [Attr0] = filter_a_attrs(A#xmlElement.attributes),
+ case Attr0 of
+ #xmlAttribute{name=href, value=Href0} -> % seealso | url
+ Content0 = text_only(A#xmlElement.content),
+ {Href, Content} = otp_xmlify_a_href(Href0, Content0),
+ [A#xmlElement{attributes=[Attr0#xmlAttribute{value=Href}],
+ content=Content}];
+ #xmlAttribute{name=name} -> % marker
+ Content = otp_xmlify_e(A#xmlElement.content),
+ [A#xmlElement{attributes=[Attr0], content=Content}]
+ end.
+
+%% filter_a_attrs(Attrs) -> [Attr]
+%% Removes all attributes from a <a> element except the href or
+%% name attribute.
+filter_a_attrs([#xmlAttribute{name=href} = Attr | _Attrs]) ->
+ [Attr];
+filter_a_attrs([#xmlAttribute{name=name} = Attr | _Attrs]) ->
+ [Attr];
+filter_a_attrs([_Attr|Attrs]) ->
+ filter_a_attrs(Attrs);
+filter_a_attrs([]) ->
+ [].
+
+%% otp_xmlify_a_href(Href0, Es0) -> {Href1, Es1}
+%% Href = string()
+otp_xmlify_a_href("#"++_ = Marker, Es0) -> % <seealso marker="#what">
+ {Marker, Es0};
+otp_xmlify_a_href("http:"++_ = URL, Es0) -> % external URL
+ {URL, Es0};
+otp_xmlify_a_href("OTPROOT"++AppRef, Es0) -> % <.. marker="App:FileRef
+ case split(AppRef, "/") of
+ [AppS, "doc", FileRef1] ->
+ FileRef = AppS++":"++otp_xmlify_a_fileref(FileRef1, AppS),
+ [#xmlText{value=Str0} = T] = Es0,
+ Str = case split(Str0, "/") of
+ %% //Application
+ [AppS2] ->
+ %% AppS2 can differ from AppS
+ %% Example: xmerl/XMerL
+ AppS2;
+ [_AppS,ModRef] ->
+ case split(ModRef, ":") of
+ %% //Application/Module
+ [Module] ->
+ Module++"(3)";
+ %% //Application/Module:Type()
+ [_Module,_Type] ->
+ ModRef
+ end;
+ %% //Application/Module:Function/Arity
+ [_AppS,ModFunc,Arity] ->
+ ModFunc++"/"++Arity
+ end,
+ {FileRef, [T#xmlText{value=Str}]}
+ end;
+otp_xmlify_a_href("../"++File, Es0) ->
+ %% Special case: This kind of relative path is used on some
+ %% places within i.e. EDoc and refers to a file within the same
+ %% application tree.
+ %% Correct the path according to the OTP directory structure
+ {"../../"++File, Es0};
+otp_xmlify_a_href(FileRef1, Es0) -> % File within the same application
+ FileRef2 = otp_xmlify_a_fileref(FileRef1, this),
+ {FileRef2, Es0}.
+
+%% otp_xmlify_a_fileref(FileRef1, AppS|this) -> FileRef2
+%% AppS = FileRef = string()
+otp_xmlify_a_fileref(FileRef1, AppS) ->
+ case split(FileRef1, ".#") of
+
+ %% EDoc default name is "overview-summary.html,
+ %% name of OTP User's Guide chapter is "chapter.xml"
+ ["overview-summary", _Ext] ->
+ "chapter";
+ ["overview-summary", _Ext, Marker] ->
+ "chapter#"++Marker;
+
+ [File, Ext] when Ext=="xml";
+ Ext=="html", AppS/=this ->
+ File;
+ [File, Ext, Marker0] ->
+ %% Here is an awkward solution to an awkward problem
+ %% The marker automatically inserted by DocBuilder at
+ %% each function does not seem to work for EDoc generated
+ %% ERLREFs.
+ %% So if the referenced marker is in an ERLREF generated
+ %% by EDoc, keep it "as is", ie "function-arity".
+ %% If the referenced marker is NOT in an ERLREF generated
+ %% by EDoc, the marker should be on the format
+ %% "function/arity".
+ %% The awkward part of the solution is to decide wheather
+ %% the ERLREF is generated by EDoc or not: Here we make
+ %% the decision based on which application the module
+ %% belongs to -- which is ok when the module was written
+ %% but probably not in the future...
+ EDocApps = ["edoc","hipe","syntax_tools","xmerl"],
+ IsEDocGenerated = lists:member(AppS, EDocApps),
+ Marker = if
+ %% The marker is in a file in *this*
+ %% application (which documentation obviously
+ %% is generated by EDoc), or it is in a file
+ %% in an application which documentation
+ %% is assumed to be generated by EDoc
+ AppS==this; IsEDocGenerated ->
+ Marker0;
+
+ %% The marker is in a file in an application
+ %% which documentation is assumed NOT to be
+ %% generated by EDoc
+ true ->
+ case split(Marker0, "-") of
+ [Func,Arity] ->
+ Func++"/"++Arity;
+ _ ->
+ Marker0
+ end
+ end,
+ if
+ %% Ignore file extension in file reference if it either
+ %% is ".xml" or if it is ".html" but AppS/=this, that
+ %% is, we're resolving an OTPROOT file reference
+ Ext=="xml";
+ Ext=="html", AppS/=this ->
+ File++"#"++Marker;
+ true ->
+ File++"."++Ext++"#"++Marker
+ end;
+
+ %% References to other files than XML files are kept as-is
+ _ ->
+ FileRef1
+ end.
+
+%% otp_xmlify_blockquote(Es1) -> Es2
+%% Ensures that the content of a <blockquote> is divided into
+%% <p>s using the {p, Es} construct.
+otp_xmlify_blockquote([#xmlElement{name=p} = E|Es]) ->
+ [E | otp_xmlify_blockquote(Es)];
+otp_xmlify_blockquote([#xmlText{} = E|Es]) ->
+ {P, After} = find_p_ending(Es, []),
+ [{p, [E|P]} | otp_xmlify_blockquote(After)];
+otp_xmlify_blockquote([]) ->
+ [].
+
+%% otp_xmlify_code(E) -> Es
+%% Takes a <code> xmlElement and split it into a list of <code> and
+%% other xmlElements. Necessary when it contains more than a single
+%% xmlText element.
+%% Example:
+%% #xmlElement{name=code,
+%% content=[#xmlText{}, #xmlElement{name=br}, #xmlText{}]}
+%% =>
+%% [#xmlElement{name=code, content=[#xmlText{}]},
+%% #xmlElement{name=br},
+%% #xmlElement{name=code, content=[#xmlText{}]}]
+otp_xmlify_code(E) ->
+ otp_xmlify_code(E, E#xmlElement.content, []).
+otp_xmlify_code(Code, [#xmlText{} = E|Es], Acc) ->
+ otp_xmlify_code(Code, Es, [Code#xmlElement{content=[E]}|Acc]);
+otp_xmlify_code(Code, [#xmlElement{} = E|Es], Acc) ->
+ otp_xmlify_code(Code, Es, [E|Acc]);
+otp_xmlify_code(_Code, [], Acc) ->
+ lists:reverse(Acc).
+
+%% otp_xmlify_dl(Es1) -> Es2
+%% Insert empty <dd> elements if necessary.
+%% OTP DTDs does not allow <taglist>s with <tag>s but no <item>s.
+otp_xmlify_dl([#xmlElement{name=dt} = E|Es]) ->
+ [E|otp_xmlify_dl(Es, E)];
+otp_xmlify_dl([E|Es]) ->
+ [E|otp_xmlify_dl(Es)];
+otp_xmlify_dl([]) ->
+ [].
+
+otp_xmlify_dl([#xmlElement{name=dd} = E|Es], _DT) ->
+ [E|otp_xmlify_dl(Es)];
+otp_xmlify_dl([#xmlElement{name=dt} = E|Es], DT) ->
+ DD = DT#xmlElement{name=dd, attributes=[], content=[]},
+ [DD,E|otp_xmlify_dl(Es, E)];
+otp_xmlify_dl([E|Es], DT) ->
+ [E|otp_xmlify_dl(Es, DT)];
+otp_xmlify_dl([], DT) ->
+ DD = DT#xmlElement{name=dd, attributes=[], content=[]},
+ [DD].
+
+%% otp_xmlify_table(Es1) -> Es2
+%% Transform <table> contents into "text", that is, inline elements.
+otp_xmlify_table([#xmlText{} = E|Es]) ->
+ [E | otp_xmlify_table(Es)];
+otp_xmlify_table([#xmlElement{name=tbody} = E|Es]) ->
+ otp_xmlify_table(E#xmlElement.content)++otp_xmlify_table(Es);
+otp_xmlify_table([#xmlElement{name=tr} = E|Es]) ->
+ %% Insert newlines between table rows
+ otp_xmlify_table(E#xmlElement.content)++[{br,[]}]++otp_xmlify_table(Es);
+otp_xmlify_table([#xmlElement{name=th} = E|Es]) ->
+ [{em, E#xmlElement.content} | otp_xmlify_table(Es)];
+otp_xmlify_table([#xmlElement{name=td} = E|Es]) ->
+ otp_xmlify_e(E#xmlElement.content) ++ otp_xmlify_table(Es);
+otp_xmlify_table([]) ->
+ [].
+
+%%--Misc help functions used by otp_xmlify/1 et al---------------------
+
+%% find_next(Tag, Es) -> {Es1, Es2}
+%% Returns {Es1, Es2} where Es1 is the list of all elements up to (but
+%% not including) the first element with tag Tag in Es, and Es2
+%% is the remaining elements of Es.
+find_next(Tag, Es) ->
+ find_next(Tag, Es, []).
+find_next(Tag, [#xmlElement{name=Tag} = E | Es], AccEs) ->
+ {lists:reverse(AccEs), [E|Es]};
+find_next(Tag, [E|Es], AccEs) ->
+ find_next(Tag, Es, [E|AccEs]);
+find_next(_Tag, [], AccEs) ->
+ {lists:reverse(AccEs), []}.
+
+%% find_p_ending(Es, []) -> {Es1, Es2}
+%% Returns {Es1, Es2} where Es1 is the list of all elements up to (but
+%% not including) the first paragraph break in Es, and Es2 is
+%% the remaining elements of Es2.
+%% Paragraph break = <p> tag or empty line
+%% the next blank line, <p> or end-of-list as P, and the remaining
+%% elements of Es as After.
+find_p_ending([#xmlText{value="\n \n"++_} = E|Es], P) ->
+ {lists:reverse(P), [E|Es]};
+find_p_ending([#xmlElement{name=p} = E|Es], P) ->
+ {lists:reverse(P), [E|Es]};
+find_p_ending([E|Es], P) ->
+ find_p_ending(Es, [E|P]);
+find_p_ending([], P) ->
+ {lists:reverse(P), []}.
+
+%% is_paragraph(E | P) -> bool()
+%% P = {p, Es}
+is_paragraph(#xmlElement{name=p}) -> true;
+is_paragraph({p, _Es}) -> true;
+is_paragraph(_E) -> false.
+
+%% p_content(E | P) -> Es
+p_content(#xmlElement{content=Content}) -> Content;
+p_content({p, Content}) -> Content.
+
+%% is_empty(Str) -> bool()
+%% Str = string()
+%% Returns true if Str is empty in the sense that it contains nothing
+%% but spaces, tabs or newlines.
+is_empty("\n"++Str) ->
+ is_empty(Str);
+is_empty(" "++Str) ->
+ is_empty(Str);
+is_empty("\t"++Str) ->
+ is_empty(Str);
+is_empty("") ->
+ true;
+is_empty(_) ->
+ false.
+
+%% split(Str, Seps) -> [Str]
+split(Str, Seps) ->
+ split(Str, Seps, []).
+
+split([Ch|Str], Seps, Acc) ->
+ case lists:member(Ch, Seps) of
+ true -> split(Str, Seps, Acc);
+ false -> split(Str, Seps, Acc, [Ch])
+ end;
+split([], _Seps, Acc) ->
+ lists:reverse(Acc).
+
+split([Ch|Str], Seps, Acc, Chs) ->
+ case lists:member(Ch, Seps) of
+ true -> split(Str, Seps, [lists:reverse(Chs)|Acc]);
+ false -> split(Str, Seps, Acc, [Ch|Chs])
+ end;
+split([], _Seps, Acc, Chs) ->
+ lists:reverse([lists:reverse(Chs)|Acc]).
+
+%%--Functions for creating an erlref document---------------------------
+
+%% function_name(F) -> string()
+%% F = #xmlElement{name=function}
+%% Returns the name of a function as "name/arity".
+function_name(E) ->
+ get_attrval(name, E) ++ "/" ++ get_attrval(arity, E).
+
+%% functions(Fs) -> Es
+%% Fs = [{Name, F}]
+%% Name = string() "name/arity"
+%% F = #xmlElement{name=function}
+functions(Fs) ->
+ Es = lists:flatmap(fun ({Name, E}) -> function(Name, E) end, Fs),
+ if
+ Es==[] ->
+ [];
+ true ->
+ {funcs, Es}
+ end.
+
+function(_Name, E=#xmlElement{content = Es}) ->
+ TypeSpec = get_content(typespec, Es),
+ [?NL,{func, [ ?NL,
+ {name,
+ case funcheader(TypeSpec) of
+ [] ->
+ signature(get_content(args, Es),
+ get_attrval(name, E));
+ Spec -> Spec
+ end
+ },
+ ?NL,{fsummary, fsummary(Es)},
+ ?NL,local_types(TypeSpec),
+ ?NL,{desc,
+ label_anchor(E)++
+ deprecated(Es)++
+ fulldesc(Es)++
+ seealso_function(Es)}
+ ]}].
+
+fsummary([]) -> ["\s"];
+fsummary(Es) ->
+ Desc = get_content(description, Es),
+ case get_content(briefDescription, Desc) of
+ [] ->
+ fsummary_equiv(Es); % no description at all if no equiv
+ ShortDesc ->
+ text_only(ShortDesc)
+ end.
+
+fsummary_equiv(Es) ->
+ case get_content(equiv, Es) of
+ [] -> ["\s"];
+ Es1 ->
+ case get_content(expr, Es1) of
+ [] -> ["\s"];
+ [Expr] ->
+ ["Equivalent to ", Expr, ".",?NL]
+ end
+ end.
+
+label_anchor(E) ->
+ case get_attrval(label, E) of
+ "" -> [];
+ Ref -> [{marker, [{id, Ref}],[]},?NL]
+ end.
+
+label_anchor(Content, E) ->
+ case get_attrval(label, E) of
+ "" -> Content;
+ Ref -> {p,[{marker, [{id, Ref}],[]},
+ {em, Content}]}
+ end.
+
+signature(Es, Name) ->
+ [Name, "("] ++ seq(fun arg/1, Es) ++ [") -> term()", ?NL].
+
+arg(#xmlElement{content = Es}) ->
+ [get_text(argName, Es)].
+
+funcheader([]) -> [];
+funcheader(Es) ->
+ [t_name(get_elem(erlangName, Es))] ++ t_utype(get_elem(type, Es)).
+
+local_types([]) -> [];
+local_types(Es) ->
+ local_defs2(get_elem(localdef, Es)).
+
+local_defs2([]) -> [];
+local_defs2(Es) ->
+ {type,[?NL | [{v, localdef2(E)} || E <- Es]]}.
+
+%% Like localdef/1, but does not use label_anchor/2 -- we don't want any
+%% markers or em tags in <v> tag, plain text only!
+localdef2(#xmlElement{content = Es}) ->
+ case get_elem(typevar, Es) of
+ [] ->
+ t_utype(get_elem(type, Es));
+ [V] ->
+ t_var(V) ++ [" = "] ++ t_utype(get_elem(type, Es))
+ end.
+
+type_name(#xmlElement{content = Es}) ->
+ t_name(get_elem(erlangName, get_content(typedef, Es))).
+
+types(Ts) ->
+ Es = lists:flatmap(fun ({Name, E}) -> typedecl(Name, E) end, Ts),
+ [?NL, {taglist,[?NL|Es]}].
+
+typedecl(Name, #xmlElement{content = Es}) ->
+ TypedefEs = get_content(typedef, Es),
+ Id = "type-"++Name,
+ [{tag, typedef(TypedefEs)},
+ ?NL,
+ {item, [{marker,[{id,Id}],[]} |
+ local_defs(get_elem(localdef, TypedefEs)) ++ fulldesc(Es)]},
+ ?NL].
+
+typedef(Es) ->
+ Name = ([t_name(get_elem(erlangName, Es)), "("]
+ ++ seq(fun t_utype_elem/1, get_content(argtypes, Es), [")"])),
+ case get_elem(type, Es) of
+ [] ->
+ [{tt, Name}];
+ Type ->
+ [{tt, Name ++ [" = "] ++ t_utype(Type)}]
+ end.
+
+local_defs([]) -> [];
+local_defs(Es) ->
+ [?NL, {ul, [{li, [{tt, localdef(E)}]} || E <- Es]}].
+
+localdef(E = #xmlElement{content = Es}) ->
+ Var = case get_elem(typevar, Es) of
+ [] ->
+ [label_anchor(t_abstype(get_content(abstype, Es)), E)];
+ [V] ->
+ t_var(V)
+ end,
+ Var ++ [" = "] ++ t_utype(get_elem(type, Es)).
+
+deprecated(Es) ->
+ case get_content(deprecated, Es) of
+ [] -> [];
+ DeprEs ->
+ Es2 = get_content(fullDescription,
+ get_content(description, DeprEs)),
+ Es3 = otp_xmlify_e(Es2),
+ [{p, [{em, ["This function is deprecated: "]} |Es3]}, ?NL]
+ end.
+
+fulldesc(Es) ->
+ case get_content(fullDescription, get_content(description, Es)) of
+ [] ->
+ index_desc(Es);
+ Desc ->
+ [?NL|otp_xmlify(Desc)] ++ [?NL]
+ end.
+
+index_desc(Es) ->
+ Desc = get_content(description, Es),
+ case get_content(briefDescription, Desc) of
+ [] ->
+ equiv(Es); % no description at all if no equiv
+ ShortDesc ->
+ ShortDesc
+ end.
+
+seealso_module(Es) ->
+ case get_elem(see, Es) of
+ [] -> [];
+ Es1 ->
+ {section,[{title,["See also"]},{p,seq(fun see/1, Es1, [])}]}
+ end.
+seealso_function(Es) ->
+ case get_elem(see, Es) of
+ [] -> [];
+ Es1 ->
+ [{p, [{em, ["See also:"]}, " "] ++ seq(fun see/1, Es1, ["."])},
+ ?NL]
+ end.
+
+%% ELEMENT see PCDATA
+%% ATTLIST name PCDATA
+%% href PCDATA
+see(#xmlElement{content=Es0} = E) ->
+ Href0 = get_attrval(href, E),
+ {Href, Es} = otp_xmlify_a_href(Href0, Es0),
+ [{seealso, [{marker, Href}], Es}].
+
+equiv(Es) ->
+ case get_content(equiv, Es) of
+ [] -> ["\s"];
+ Es1 ->
+ case get_content(expr, Es1) of
+ [] -> [];
+ [Expr] ->
+ Expr1 = [Expr],
+ Expr2 = case get_elem(see, Es1) of
+ [] ->
+ {c,Expr1};
+ [E=#xmlElement{}] ->
+ case get_attrval(href, E) of
+ "" ->
+ {c,Expr1};
+ Ref ->
+ {seealso, [{marker, Ref}], Expr1}
+ end
+ end,
+ [{p, ["Equivalent to ", Expr2, "."]}, ?NL]
+ end
+ end.
+
+authors(Es) ->
+ case get_elem(author, Es) of
+ [] ->
+ [?NL,{aname,["\s"]},?NL,{email,["\s"]}];
+ Es1 ->
+ [?NL|seq(fun author/1, Es1, "", [])]
+ end.
+
+author(E=#xmlElement{}) ->
+ Name = case get_attrval(name, E) of
+ [] -> "\s";
+ N -> N
+ end,
+ Mail = case get_attrval(email, E) of
+ [] -> "\s";
+ M -> M
+ end,
+ [?NL,{aname,[Name]},?NL,{email,[Mail]}].
+
+t_name([E]) ->
+ N = get_attrval(name, E),
+ case get_attrval(module, E) of
+ "" -> N;
+ M ->
+ S = M ++ ":" ++ N,
+ case get_attrval(app, E) of
+ "" -> S;
+ A -> "//" ++ A ++ "/" ++ S
+ end
+ end.
+
+t_utype([E]) ->
+ t_utype_elem(E).
+
+t_utype_elem(E=#xmlElement{content = Es}) ->
+ case get_attrval(name, E) of
+ "" -> t_type(Es);
+ Name ->
+ T = t_type(Es),
+ case T of
+ [Name] -> T; % avoid generating "Foo::Foo"
+ T -> [Name] ++ ["::"] ++ T
+ end
+ end.
+
+t_type([E=#xmlElement{name = typevar}]) ->
+ t_var(E);
+t_type([E=#xmlElement{name = atom}]) ->
+ t_atom(E);
+t_type([E=#xmlElement{name = integer}]) ->
+ t_integer(E);
+t_type([E=#xmlElement{name = float}]) ->
+ t_float(E);
+t_type([#xmlElement{name = nil}]) ->
+ t_nil();
+t_type([#xmlElement{name = list, content = Es}]) ->
+ t_list(Es);
+t_type([#xmlElement{name = tuple, content = Es}]) ->
+ t_tuple(Es);
+t_type([#xmlElement{name = 'fun', content = Es}]) ->
+ t_fun(Es);
+t_type([#xmlElement{name = abstype, content = Es}]) ->
+ t_abstype(Es);
+t_type([#xmlElement{name = union, content = Es}]) ->
+ t_union(Es);
+t_type([#xmlElement{name = record, content = Es}]) ->
+ t_record(Es).
+
+t_var(E) ->
+ [get_attrval(name, E)].
+
+t_atom(E) ->
+ [get_attrval(value, E)].
+
+t_integer(E) ->
+ [get_attrval(value, E)].
+
+t_float(E) ->
+ [get_attrval(value, E)].
+
+t_nil() ->
+ ["[]"].
+
+t_list(Es) ->
+ ["["] ++ t_utype(get_elem(type, Es)) ++ ["]"].
+
+t_tuple(Es) ->
+ ["{"] ++ seq(fun t_utype_elem/1, Es, ["}"]).
+
+t_fun(Es) ->
+ ["("] ++ seq(fun t_utype_elem/1, get_content(argtypes, Es),
+ [") -> "] ++ t_utype(get_elem(type, Es))).
+
+t_record([E|Es]) ->
+ ["#", get_attrval(value, E), "{"++ seq(fun t_field/1, Es) ++"}"].
+t_field(#xmlElement{name=field, content=[Atom,Type]}) ->
+ [get_attrval(value, Atom), "="] ++ t_utype_elem(Type).
+
+t_abstype(Es) ->
+ case split_at_colon(t_name(get_elem(erlangName, Es)),[]) of
+ {Mod,Type} ->
+ [Type, "("] ++
+ seq(fun t_utype_elem/1, get_elem(type, Es), [")"]) ++
+ [" (see module ", Mod, ")"];
+ Type ->
+ [Type, "("] ++
+ seq(fun t_utype_elem/1, get_elem(type, Es), [")"])
+ end.
+
+%% Split at one colon, but not at two (or more)
+split_at_colon([$:,$:|_]=Rest,Acc) ->
+ lists:reverse(Acc)++Rest;
+split_at_colon([$:|Type],Acc) ->
+ {lists:reverse(Acc),Type};
+split_at_colon([Char|Rest],Acc) ->
+ split_at_colon(Rest,[Char|Acc]);
+split_at_colon([],Acc) ->
+ lists:reverse(Acc).
+
+t_union(Es) ->
+ seq(fun t_utype_elem/1, Es, " | ", []).
+
+%% seq(Fun, Es)
+%% seq(Fun, Es, Tail)
+%% seq(Fun, Es, Sep, Tail) -> [string()]
+%% Fun = function(E) -> [string()]
+%% Sep = string()
+%% Tail = [string()]
+%% Applies Fun to each element E in Es and return the appended list of
+%% strings, separated by Sep which defaults to ", " and ended by Tail
+%% which defaults to [].
+seq(Fun, Es) ->
+ seq(Fun, Es, []).
+seq(Fun, Es, Tail) ->
+ seq(Fun, Es, ", ", Tail).
+seq(Fun, [E], _Sep, Tail) ->
+ Fun(E) ++ Tail;
+seq(Fun, [E | Es], Sep, Tail) ->
+ Fun(E) ++ [Sep] ++ seq(Fun, Es, Sep, Tail);
+seq(_Fun, [], _Sep, Tail) ->
+ Tail.
+
+%%--Misc functions for accessing fields etc-----------------------------
+
+%% Type definitions used below:
+%% E = #xmlElement{} | #xmlText{}
+%% Es = [E]
+%% Tag = atom(), XHTML tag
+%% Name = atom(), XHTML attribute name
+%% Attrs = [#xmlAttribute{}]
+%% Ts = [#xmlText{}]
+
+%% parent(E) -> module | overview
+parent(E) ->
+ Parents = E#xmlElement.parents,
+ {Parent,_} = lists:last(Parents),
+ Parent.
+
+%% get_elem(Tag, Es1) -> Es2
+%% Returns a list of all elements in Es which have the name Tag.
+get_elem(Name, [#xmlElement{name = Name} = E | Es]) ->
+ [E | get_elem(Name, Es)];
+get_elem(Name, [_ | Es]) ->
+ get_elem(Name, Es);
+get_elem(_, []) ->
+ [].
+
+%% get_attr(Name, Attrs1) -> Attrs2
+%% Returns a list of all attributes in Attrs1 which have the name Name.
+get_attr(Name, [#xmlAttribute{name = Name} = A | As]) ->
+ [A | get_attr(Name, As)];
+get_attr(Name, [_ | As]) ->
+ get_attr(Name, As);
+get_attr(_, []) ->
+ [].
+
+%% get_attrval(Name, E) -> string()
+%% If E has one attribute with name Name, return its value, otherwise ""
+get_attrval(Name, #xmlElement{attributes = As}) ->
+ case get_attr(Name, As) of
+ [#xmlAttribute{value = V}] ->
+ V;
+ [] -> ""
+ end.
+
+%% get_content(Tag, Es1) -> Es2
+%% If there is one element in Es1 with name Tag, returns its contents,
+%% otherwise []
+get_content(Name, Es) ->
+ case get_elem(Name, Es) of
+ [#xmlElement{content = Es1}] ->
+ Es1;
+ [] -> []
+ end.
+
+%% get_text(Tag, Es) -> string()
+%% If there is one element in Es with name Tag, and its content is
+%% a single xmlText, return the value of this xmlText.
+%% Otherwise return "".
+get_text(Name, Es) ->
+ case get_content(Name, Es) of
+ [#xmlText{value = Text}] ->
+ Text;
+ [] -> ""
+ end.
+
+%% get_text(E) -> string()
+%% Return the value of an single xmlText which is the content of E,
+%% possibly recursively.
+get_text(#xmlElement{content=[#xmlText{value=Text}]}) ->
+ Text;
+get_text(#xmlElement{content=[E]}) ->
+ get_text(E).
+
+%% text_only(Es) -> Ts
+%% Takes a list of xmlElement and xmlText and return a lists of xmlText.
+text_only([#xmlElement{} = E |Es]) ->
+ text_only(E#xmlElement.content) ++ text_only(Es);
+text_only([#xmlText{} = E |Es]) ->
+ [E | text_only(Es)];
+text_only([]) ->
+ [].
diff --git a/lib/docbuilder/src/docb_gen.erl b/lib/docbuilder/src/docb_gen.erl
new file mode 100644
index 0000000000..0d8d640324
--- /dev/null
+++ b/lib/docbuilder/src/docb_gen.erl
@@ -0,0 +1,138 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_gen).
+
+-export([module/1, module/2, users_guide/1, users_guide/2]).
+
+-record(args, {suffix=".xml",
+ layout=docb_edoc_xml_cb,
+ def=[],
+ includes=[],
+ preprocess=false,
+ sort_functions=true}).
+
+%% module(File) -> ok | {error, Reason}
+%% module(File, Opts) -> ok | {error, Reason}
+%% File = string(), file name with or without ".erl" extension
+%% Opts -- see code
+%% Reason = badfile | {badopt, Term}
+module(File0) ->
+ module(File0, []).
+module(File0, RawOpts) ->
+ File = case filename:extension(File0) of
+ ".erl" -> File0;
+ _ -> File0++".erl"
+ end,
+ case filelib:is_regular(File) of
+ true ->
+ case parse(RawOpts, #args{}) of
+ {ok, Args} ->
+ Opts = [{def, Args#args.def},
+ {includes, Args#args.includes},
+ {preprocess, Args#args.preprocess},
+ {sort_functions, Args#args.sort_functions},
+
+ {app_default, "OTPROOT"},
+ {file_suffix, Args#args.suffix},
+ {dir, "."},
+ {layout, Args#args.layout}],
+ edoc:file(File, Opts);
+ Error ->
+ Error
+ end;
+ false ->
+ {error, badfile}
+ end.
+
+%% users_guide(File) -> ok | {error, Reason}
+%% users_guide(File, Opts) -> ok | {error, Reason}
+%% File = string()
+%% Opts -- see code
+%% Reason = badfile | {badopt, Opt}
+users_guide(File) ->
+ users_guide(File, []).
+users_guide(File, RawOpts) ->
+ case filelib:is_regular(File) of
+ true ->
+ case parse(RawOpts, #args{}) of
+ {ok, Args} ->
+ Opts = [{def, Args#args.def},
+ {app_default, "OTPROOT"},
+ {file_suffix, Args#args.suffix},
+ {layout, Args#args.layout}],
+
+ Env = edoc_lib:get_doc_env(Opts),
+
+ {ok, Tags} =
+ edoc_extract:file(File, overview, Env, Opts),
+ Data =
+ edoc_data:overview("Overview", Tags, Env, Opts),
+ F = fun(M) -> M:overview(Data, Opts) end,
+ Text = edoc_lib:run_layout(F, Opts),
+
+ OutFile = "chapter" ++ Args#args.suffix,
+ edoc_lib:write_file(Text, ".", OutFile);
+ Error ->
+ Error
+ end;
+ false ->
+ {error, badfile}
+ end.
+
+parse([{output,xml} | RawOpts], Args) ->
+ parse(RawOpts, Args); % default, no update of record necessary
+parse([{output,sgml} | RawOpts], Args) ->
+ parse(RawOpts, Args#args{suffix=".sgml", layout=docb_edoc_sgml_cb});
+parse([{def,Defs} | RawOpts], Args) ->
+ case parse_defs(Defs) of
+ true ->
+ Args2 = Args#args{def=Args#args.def++Defs},
+ parse(RawOpts, Args2);
+ false ->
+ {error, {badopt, {def,Defs}}}
+ end;
+parse([{includes,Dirs} | RawOpts], Args) ->
+ case parse_includes(Dirs) of
+ true ->
+ Args2 = Args#args{includes=Args#args.includes++Dirs},
+ parse(RawOpts, Args2);
+ false ->
+ {error, {badopt, {includes,Dirs}}}
+ end;
+parse([{preprocess,Bool} | RawOpts], Args) when Bool==true;
+ Bool==false ->
+ parse(RawOpts, Args#args{preprocess=Bool});
+parse([{sort_functions,Bool} | RawOpts], Args) when Bool==true;
+ Bool==false ->
+ parse(RawOpts, Args#args{sort_functions=Bool});
+parse([], Args) ->
+ {ok, Args};
+parse([Opt | _RawOpts], _Args) ->
+ {error, {badopt, Opt}}.
+
+parse_defs(Defs) ->
+ lists:all(fun({Key,Val}) when is_atom(Key), is_list(Val) -> true;
+ (_) -> false
+ end,
+ Defs).
+
+parse_includes(Dirs) ->
+ lists:all(fun(Dir) when is_list(Dir) -> true;
+ (_) -> false
+ end,
+ Dirs).
diff --git a/lib/docbuilder/src/docb_html.erl b/lib/docbuilder/src/docb_html.erl
new file mode 100644
index 0000000000..9aea4c8a66
--- /dev/null
+++ b/lib/docbuilder/src/docb_html.erl
@@ -0,0 +1,394 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_html).
+
+-export([rule/2, rule/3]).
+
+rule([p, item, list|_], {_, _, _}) ->
+ {"", "<br />\n"};
+rule([p, item, taglist|_], {_, _, _}) ->
+ {"", "<br />\n"};
+rule([p|_], _) ->
+ {"\n<p>", "\n</p>"};
+
+rule([pre|_], _) ->
+ {"\n<div class=\"example\"><pre>\n", "\n</pre></div>\n"};
+
+rule([input|_], _) ->
+ {"<strong>", "</strong>"};
+
+rule([quote|_], _) ->
+ {"\n<blockquote>\n", "\n</blockquote>\n"};
+
+rule([i|_], _) ->
+ {"<em>", "</em>"};
+
+rule([b|_], _) ->
+ {"<strong>", "</strong>"};
+
+rule([c|_], _) ->
+ {"<span class=\"code\">", "</span>"};
+
+rule([em|_], _) ->
+ {"<strong>", "</strong>"};
+
+rule([sub|_], _) ->
+ {"<sub>", "</sub>"};
+
+rule([sup|_], _) ->
+ {"<sup>", "</sup>"};
+
+rule([termdef|_], _) ->
+ {drop, ""};
+
+rule([citedef|_], _) ->
+ {drop, ""};
+
+rule([br|_], _) ->
+ {"<br />\n", ""};
+
+rule([digression|_], _) ->
+ {"<table>\n"
+ " <tr>\n"
+ " <td width=\"23\"></td>\n"
+ " <td>\n"
+ " <font size=\"-1\">\n",
+ " </font>\n"
+ " </td>\n"
+ " </tr>\n"
+ "</table>\n"};
+
+rule([list, item, list|_], {_, ["ORDERED"], _}) ->
+ {"\n<ol>\n", "\n</ol>\n"};
+rule([list, item, taglist|_], {_, ["ORDERED"], _}) ->
+ {"\n<ol>\n", "\n</ol>\n"};
+rule([list|_], {_, ["ORDERED"], _}) ->
+ {"\n<ol>\n", "\n</ol>\n"};
+rule([list, item, list|_], {_, ["BULLETED"], _}) ->
+ {"\n<ul>\n", "\n</ul>\n"};
+rule([list, item, taglist|_], {_, ["BULLETED"], _}) ->
+ {"\n<ul>\n", "\n</ul>\n"};
+rule([list|_], {_, ["BULLETED"], _}) ->
+ {"\n<ul>\n", "\n</ul>\n"};
+
+rule([taglist, item, taglist|_], _) ->
+ {"\n<dl>\n", "\n</dl>\n"};
+rule([taglist, item, list|_], _) ->
+ {"\n<dl>\n", "\n</dl>\n"};
+rule([taglist|_], _) ->
+ {"\n<dl>\n", "\n</dl>\n"};
+
+rule([tag|_], _) ->
+ {"\n<dt>\n", "\n</dt>\n"};
+
+rule([item, list|_], _) ->
+ {"\n<li>\n", "\n</li>\n\n"};
+rule([item, taglist|_], _) ->
+ {"\n<dd>\n", "\n</dd>\n"};
+
+rule([image|_], {_, [File], _}) ->
+ File2 =
+ case filename:extension(File) of
+ [] -> File ++ ".gif";
+ _ -> File
+ end,
+ {["\n<center>\n", "<img alt=\"", File2, "\" src=\"", File2,
+ "\"/><br/>\n"],
+ "\n</center>\n"};
+
+rule([icaption|_], _) ->
+ {"<em>", "</em>\n"};
+
+rule([url|_], {_, [HREF], _}) ->
+ URI = docb_html_util:make_uri(HREF),
+ {io_lib:format("<a target=\"_top\" href=\"~s\">", [URI]), "</a>"};
+
+rule([marker|_], {_, [ID], _}) ->
+ %% remove all chars before first # including the #
+ {ok, NewID, _} = regexp:sub(ID, "^[^#]*#", ""),
+ %% replace "/" with "-" because "/" xhtml does not
+ %% allow "/" in the name attribute of element <a>
+ %% so we have to do the same as for marker i.e
+ %% Function/Arity is translated to an anchor in xhtml
+ %% like this : <a name="Function-Arity"/>
+ NewID2 = [case X of $/ -> $-;_->X end||X <- NewID],
+ {drop, ["<a name=\"", NewID2, "\"><!-- Empty --></a>"]};
+
+rule([table|_], {_, ["", ""], Ts}) ->
+ {newargs,
+ "\n<center>\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\">\n",
+ reorder_table(Ts),
+ "\n</table>\n"
+ "</center>\n"};
+rule([table|_], {_, [Width, ""], Ts}) ->
+ {newargs,
+ ["\n<center>\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\" ",
+ "width=\"", Width, "%\">\n"],
+ reorder_table(Ts),
+ "\n</table>\n"
+ "</center>\n"};
+
+%% The clauses above are for the report DTD. This one is for the other
+%% DTDs.
+rule([table|_], {_, ["LEFT"], Ts}) ->
+ {newargs,
+ "\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\">\n",
+ reorder_table(Ts),
+ "\n</table>\n"};
+
+rule([table|_], {_, _, Ts}) ->
+ {newargs,
+ "\n<center>\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\">\n",
+ reorder_table(Ts),
+ "\n</table>\n"
+ "</center>\n"};
+
+rule([row|_], _) ->
+ {" <tr>\n", "\n </tr>\n"};
+
+rule([cell|_], {_, ["", ""], _}) ->
+ {" <td>\n", "\n </td>\n"};
+rule([cell|_], {_, [Align, ""], _}) ->
+ {[" <td align=\"", string:to_lower(Align), "\">\n"], "\n </td>\n"};
+rule([cell|_], {_, ["", VAlign], _}) ->
+ {[" <td valign=\"", string:to_lower(VAlign), "\">\n"], "\n </td>\n"};
+rule([cell|_], {_, [Align, VAlign], _}) ->
+ {[" <td align=\"", string:to_lower(Align), "\" valign=\"", string:to_lower(VAlign), "\">\n"],
+ "\n </td>\n"};
+
+rule([tcaption|_], _) ->
+ {" <caption align=\"bottom\"><em>", "</em></caption>\n"};
+
+rule([codeinclude|_], {_, [File, Tag, _Type], _}) ->
+%% Type can be "ERL", "C" or "NONE"
+ {ok,Data} = docb_html_util:code_include(File, Tag),
+ {drop, ["\n<div class=\"example\"><pre>\n", Data,
+ "\n</pre></div>\n"]};
+
+rule([erleval|_], {_, [Expr], _}) ->
+ docb_html_util:erl_eval(Expr);
+
+rule([pcdata, pre|_], {_, _, Data}) ->
+ %% Do not remove leading spaces.
+ {drop, docb_html_util:pcdata_to_html(Data, false)};
+
+rule([pcdata|_], {_, _, Data}) ->
+ {drop, docb_html_util:pcdata_to_html(Data)}.
+
+rule([seealso|_], {_, [Marker], _}, Opts) ->
+ Href =
+ case docb_util:html_snippet(seealso, Marker, Opts) of
+ "" ->
+ %% DocBuilder default behavior:
+ %% Marker is of format "Path#Fragment", both optional.
+ %% Translated to <A HREF="Path.html#Fragment">
+ case string:chr(Marker, $#) of
+ 0 -> % No Fragment
+ Marker++".html";
+ 1 -> % No Path
+ %% replace "/" with "-" because "/" xhtml does not
+ %% allow "/" in the name attribute of element <a>
+ %% so we have to do the same as for marker i.e
+ %% Function/Arity is translated to an anchor in xhtml
+ %% like this : <a name="Function-Arity"/>
+ [case X of $/ -> $-;_->X end||X <- Marker];
+ _ ->
+ Marker1 = [case X of $/ -> $-;_->X end||X <- Marker],
+ case string:tokens(Marker1, "#") of
+ [Path] -> % # at end, remove it
+ Path++".html";
+ [Path | Frag0] ->
+ Path++".html#"++
+ docb_util:join(Frag0, "#")
+ end
+ end;
+ Href0 ->
+ %% User defined behavior, use result as-is
+ Href0
+ end,
+ {{["<a href=\"", Href, "\">"], "</a>"}, Opts};
+
+rule([warning|_], _, Opts) ->
+ docb_html_util:copy_pics("warning.gif", "warning.gif", Opts),
+ {{"\n<div class=\"warning\">\n"
+ "<div class=\"label\">Warning</div>\n"
+ "<div class=\"content\">\n",
+ "\n</div>"
+ "\n</div>\n"}, Opts};
+
+rule([note|_], _, Opts) ->
+ docb_html_util:copy_pics("note.gif", "note.gif", Opts),
+ {{"\n<div class=\"note\">\n"
+ "<div class=\"label\">Note</div>\n"
+ "<div class=\"content\">",
+ "\n</div>"
+ "\n</div>\n"}, Opts};
+
+rule([path|_], {_, [UNIX, Windows], [{pcdata, _, Text}]}, Opts) ->
+ UnixPart =
+ docb_util:an_option({ptype,"unix"}, Opts) and (UNIX/=""),
+ WinPart =
+ docb_util:an_option({ptype,"windows"}, Opts) and (Windows/=""),
+ if
+ UnixPart, WinPart ->
+ {{drop, [docb_html_util:pcdata_to_html(Text),
+ " <font size=\"-2\">(<code>UNIX: ",
+ docb_html_util:attribute_cdata_to_html(UNIX),
+ ", ",
+ "Windows: ",
+ docb_html_util:attribute_cdata_to_html(Windows),
+ "</code>)</font>"]},
+ Opts};
+ UnixPart ->
+ {{drop, [docb_html_util:pcdata_to_html(Text),
+ " <font size=\"-1\">(<code>UNIX: ",
+ docb_html_util:attribute_cdata_to_html(UNIX),
+ "</code>)</font>"]},
+ Opts};
+ WinPart ->
+ {{drop, [docb_html_util:pcdata_to_html(Text),
+ " <font size=\"-1\">(<code>Windows: ",
+ docb_html_util:attribute_cdata_to_html(Windows),
+ "</code>)</font>"]},
+ Opts};
+ true ->
+ {{drop, docb_html_util:pcdata_to_html(Text)}, Opts}
+ end;
+
+rule([term|_], {_, [ID], _}, Opts) ->
+ case docb_util:an_option(dict, Opts) of
+ false ->
+ case docb_util:lookup_option({defs, term}, Opts) of
+ false ->
+ {{drop, ["<em><strong>",
+ ID,
+ "</strong></em> "]}, Opts};
+ TermList ->
+ case lists:keysearch(ID, 1, TermList) of
+ false ->
+ {{drop, ["<em><strong>", ID,
+ "</strong></em> "]},
+ Opts};
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<em><strong>", Name,
+ "</strong></em> "]},
+ Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, [ "<em><strong>", Name,
+ "</strong></em> "]},
+ Opts}
+ end
+ end;
+ true ->
+ case docb_util:lookup_option({defs, term}, Opts) of
+ false ->
+ {{drop, ["<em><strong>", ID,
+ "</strong></em> "]}, Opts};
+ TermList ->
+ PartApplication =
+ docb_util:lookup_option(part_application, Opts),
+ case lists:keysearch(ID, 1, TermList) of
+ false ->
+ {{drop, ["<a href=\"", PartApplication,
+ "_term.html#", ID, "\">", ID,
+ "</a> "]}, Opts};
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<a href=\"", PartApplication,
+ "_term.html#", ID, "\">", Name,
+ "</a> "]}, Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, ["<a href=\"", PartApplication,
+ "_term.html#", ID, "\">", Name,
+ "</a> "]}, Opts}
+ end
+ end
+ end;
+
+rule([cite|_], {_, [ID], _}, Opts) ->
+ case docb_util:an_option(dict, Opts) of
+ false ->
+ case docb_util:lookup_option({defs, cite}, Opts) of
+ false ->
+ {{drop, ["<em><strong>", ID, "</strong></em> "]},
+ Opts};
+ CiteList ->
+ case lists:keysearch(ID, 1, CiteList) of
+ false ->
+ {{drop,
+ ["<em><strong>", ID, "</strong></em> "]},
+ Opts};
+
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<em><strong>", Name,
+ "</strong></em> "]},
+ Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, ["<em><strong>", Name,
+ "</strong></em> "]},
+ Opts}
+ end
+ end;
+ true ->
+ case docb_util:lookup_option({defs, cite}, Opts) of
+ false ->
+ {{drop, ["<em><strong>", ID, "</strong></em> "]},
+ Opts};
+ CiteList ->
+ PartApp =
+ docb_util:lookup_option(part_application, Opts),
+ case lists:keysearch(ID, 1, CiteList) of
+ false ->
+ {{drop, ["<a href=\"", PartApp,
+ "_cite.html#", ID, "\">", ID,
+ "</a> "]},
+ Opts};
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<a href=\"", PartApp,
+ "_cite.html#", ID, "\">", Name,
+ "</a> "]},
+ Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, ["<a href=\"", PartApp,
+ "_cite.html#", ID, "\">", Name,
+ "</a> "]},
+ Opts}
+ end
+ end
+ end;
+
+rule([code|_], {_, [Type], [{pcdata, _, Code}]}, Opts) ->
+ case lists:member(Type,["ERL","C","NONE"]) of
+ true ->
+ {{drop, ["\n<div class=\"example\"><pre>\n", docb_html_util:element_cdata_to_html(Code),
+ "\n</pre></div>\n"]}, Opts};
+ false ->
+ exit({error,"unknown type of <code>"})
+ end.
+
+reorder_table(TableContent) ->
+ reorder_table(TableContent, [], []).
+reorder_table([], Caption, NewTableContent) ->
+ Caption ++ lists:reverse(NewTableContent);
+reorder_table([{tcaption,_,_} = Caption | TableContent], _, NewTableContent) ->
+ reorder_table(TableContent, [Caption], NewTableContent);
+reorder_table([Row | TableContent], Caption, NewTableContent) ->
+ reorder_table(TableContent, Caption, [Row | NewTableContent]).
diff --git a/lib/docbuilder/src/docb_html_layout.erl b/lib/docbuilder/src/docb_html_layout.erl
new file mode 100644
index 0000000000..dca80ac58e
--- /dev/null
+++ b/lib/docbuilder/src/docb_html_layout.erl
@@ -0,0 +1,380 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_html_layout).
+
+-export([report_top/2, report_bot/1,
+ first_top/2, first_bot/1,
+ ref_top/2, ref_bot/1,
+ chapter_top/2, chapter_bot/1,
+ application_toc_top/3, application_toc_top/4,
+ part_toc_top/3, part_toc_top/4, part_toc_bot/0,
+ index_top/1, index_bot/0]).
+
+%% Report
+
+report_top(Data, Opts) ->
+ [Title, Prepared, _Responsible, DocNo, _Approved, _Checked, _Date,
+ Vsn0, _File] = Data,
+ html_header(Title, Opts) ++
+ docb_util:html_snippet(top, Opts) ++
+"<center>
+<h1>" ++ Title ++ "</h1>
+<big>
+ " ++ DocNo ++ version(Opts, Vsn0) ++ "<br />
+ " ++ Prepared ++ "<br />
+</big>
+</center>
+".
+
+report_bot(Opts) ->
+ docb_util:html_snippet(bottom, Opts) ++
+"</body>
+</html>
+".
+
+%% First
+
+first_top(Data, Opts) ->
+ [Title, _Prepared, _Responsible, DocNo, _Approved, _Checked, _Date,
+ Vsn0, _File] = Data,
+ html_header(Title, Opts) ++
+ docb_util:html_snippet(top, Opts) ++
+"<center>
+<h1>" ++ Title ++ "</h1>
+<big>" ++ DocNo ++ version(Opts, Vsn0) ++ "<br />
+</big>
+</center>
+".
+
+first_bot(Opts) ->
+ report_bot(Opts).
+
+%% Reference
+
+ref_top(Data, Opts) ->
+ [Title, _Prepared, _Responsible, _DocNo, _Approved, _Checked,
+ _Date, _Rev, _File] = Data,
+ ref_html_header(Title, Opts) ++
+"<!-- refpage -->\n" ++
+ docb_util:html_snippet(top, Opts) ++
+"<center>
+<h1>" ++ Title ++ "</h1>
+</center>".
+
+ref_bot(Opts) ->
+ docb_util:html_snippet(bottom, Opts) ++
+"</body>
+</html>
+".
+
+%% Chapter
+
+chapter_top(Data, Opts) ->
+ [Title, _Prepared, _Responsible, _DocNo, _Approved, _Checked,
+ _Date, _Rev, _File] = Data,
+ html_header(Title, Opts) ++
+ docb_util:html_snippet(top, Opts).
+
+chapter_bot(Opts) ->
+ report_bot(Opts).
+
+%% Application ToC
+
+application_toc_top(Data, DocName, Opts) ->
+ [Title, _Prepared, _Responsible, DocNo, _Approved, _Checked,
+ _Date, Vsn0, _File] = Data,
+ html_header(Title, []) ++
+"<center>
+<strong>" ++ Title ++ "</strong>
+<p>
+<small>
+ " ++ DocNo ++ version(Opts, Vsn0) ++ "
+</small>
+</p>
+<p>
+<small>
+ <a target=\"document\" href=\"" ++ DocName ++ "_cite.html\">Bibliography</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_term.html\">Glossary</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_index.html\">Index</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_first.html\">Cover</a>" ++ top_index(Opts) ++
+"</small>
+</p>
+</center>
+<p>
+<small>
+<strong>Table of Contents</strong>
+</small>
+</p>
+".
+
+application_toc_top(Data, DocName, Opts, HRefTexts) ->
+ [Title, _Prepared, _Responsible, DocNo, _Approved, _Checked,
+ _Date, Vsn0, _File] = Data,
+ html_header(Title, []) ++
+"<center>
+<small>
+" ++
+ docb_util:join(
+ lists:map(
+ fun({HRef, Text}) ->
+ "<a target=\"_top\" href=\"" ++ HRef ++ "\">" ++
+ Text ++ "</a>"
+ end,
+ HRefTexts), " | ") ++ top_index(Opts) ++
+"</small>
+<p>
+<strong>" ++ Title ++ "</strong>
+</p>
+<p>
+<small>" ++ DocNo ++ version(Opts, Vsn0) ++ "<br />
+</small>
+</p>
+<p>
+<small>
+ <a target=\"document\" href=\"" ++ DocName ++ "_cite.html\">Bibliography</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_term.html\">Glossary</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_index.html\">Index</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_first.html\">Cover</a>
+</small>
+</p>
+</center>
+<p>
+<small>
+<strong>Table of Contents</strong>
+</small>
+</p>
+".
+
+%% Part ToC
+
+part_toc_top(Data, DocName, Opts) ->
+ [Title, _Prepared, _Responsible, DocNo, _Approved, _Checked,
+ _Date, Vsn0, _File] = Data,
+ html_header(Title, []) ++
+"<center>
+<p>
+<strong>" ++ Title ++ "</strong>
+</p>
+<p>
+<small>" ++ DocNo ++ version(Opts, Vsn0) ++ "<br />
+</small>
+</p>
+<p>
+<small>
+ <a target=\"document\" href=\"" ++ DocName ++ "_cite.html\">Bibliography</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_term.html\">Glossary</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_first.html\">Cover</a>" ++
+ top_index(Opts) ++
+"</small>
+</p>
+</center>
+<p>
+<small>
+<strong>Table of Contents</strong>
+</small>
+</p>
+".
+
+part_toc_top(Data, DocName, Opts, HRefTexts) ->
+ [Title, _Prepared, _Responsible, DocNo, _Approved, _Checked,
+ _Date, Vsn0, _File] = Data,
+ html_header(Title, []) ++
+"<center>
+<p>
+<small>
+" ++
+ docb_util:join(
+ lists:map(
+ fun({HRef, Text}) ->
+ "<a target=\"_top\" href=\"" ++ HRef ++ "\">" ++
+ Text ++ "</a>"
+ end,
+ HRefTexts), " | ") ++ top_index(Opts) ++
+"</small>
+</p>
+<p>
+<strong>" ++ Title ++ "</strong>
+</p>
+<p>
+<small>
+ " ++ DocNo ++ version(Opts, Vsn0) ++ "<br />
+</small>
+</p>
+<p>
+<small>
+ <a target=\"document\" href=\"" ++ DocName ++ "_cite.html\">Bibliography</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_term.html\">Glossary</a> |
+ <a target=\"document\" href=\"" ++ DocName ++ "_first.html\">Cover</a>
+</small>
+</p>
+</center>
+<p>
+<small>
+<strong>Table of Contents</strong>
+</small>
+</p>
+".
+
+part_toc_bot() ->
+"</body >
+</html>
+".
+
+%% Index
+
+index_top(_Data) ->
+ ref_html_header("INDEX", []) ++
+"<h1>INDEX</h1>
+<p><em>Emphasized</em> index entries refer to <em>modules</em>
+and <code>Courier</code> ditos to <code>functions</code>.\n</p>\n".
+
+index_bot() ->
+ part_toc_bot().
+
+%% Internal functions
+
+html_header(Title, Opts) ->
+ Vsn = docb_util:version(),
+%%"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
+"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
+<!-- This document was generated using DocBuilder-" ++ Vsn ++ " -->
+<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">
+<head>
+ <title>" ++ Title ++ "</title>
+ <meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\"/>
+ " ++ docb_util:html_snippet(head, Opts) ++ "
+ <style type=\"text/css\">
+<!--
+ body { font-family: Verdana, Arial, Helvetica, sans-serif }
+ span.bold_code { font-family: courier;font-weight: bold}
+ span.code { font-family: courier;font-weight: normal}
+
+.note, .warning {
+ border: solid black 1px;
+ margin: 1em 3em;
+}
+
+.note .label {
+ background: #30d42a;
+ color: white;
+ font-weight: bold;
+ padding: 5px 10px;
+}
+.note .content {
+ background: #eafeea;
+ color: black;
+ line-height: 120%;
+ font-size: 90%;
+ padding: 5px 10px;
+}
+.warning .label {
+ background: #C00;
+ color: white;
+ font-weight: bold;
+ padding: 5px 10px;
+}
+.warning .content {
+ background: #FFF0F0;
+ color: black;
+ line-height: 120%;
+ font-size: 90%;
+ padding: 5px 10px;
+}
+
+ .example { background-color:#eeeeff }
+ pre { font-family: courier; font-weight: normal }
+ .REFBODY { margin-left: 13mm }
+ .REFTYPES { margin-left: 8mm }
+-->
+ </style>
+</head>
+<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\" vlink=\"#FF00FF\" alink=\"#FF0000\">
+".
+
+ref_html_header(Title, Opts) ->
+ Vsn = docb_util:version(),
+%%"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
+"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
+<!-- This document was generated using DocBuilder-" ++ Vsn ++ " -->
+<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">
+<head>
+ <title>" ++ Title ++ "</title>
+ <meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\"/>
+ " ++ docb_util:html_snippet(head, Opts) ++ "
+ <style type=\"text/css\">
+<!--
+ body { font-family: Verdana, Arial, Helvetica, sans-serif }
+ span.bold_code { font-family: courier;font-weight: bold}
+ span.code { font-family: courier;font-weight: normal}
+
+.note, .warning {
+ border: solid black 1px;
+ margin: 1em 3em;
+}
+
+.note .label {
+ background: #30d42a;
+ color: white;
+ font-weight: bold;
+ padding: 5px 10px;
+}
+.note .content {
+ background: #eafeea;
+ color: black;
+ line-height: 120%;
+ font-size: 90%;
+ padding: 5px 10px;
+}
+.warning .label {
+ background: #C00;
+ color: white;
+ font-weight: bold;
+ padding: 5px 10px;
+}
+.warning .content {
+ background: #FFF0F0;
+ color: black;
+ line-height: 120%;
+ font-size: 90%;
+ padding: 5px 10px;
+}
+
+ .example { background-color:#eeeeff }
+ pre { font-family: courier; font-weight: normal }
+ .REFBODY { margin-left: 13mm }
+ .REFTYPES { margin-left: 8mm }
+-->
+ </style>
+</head>
+<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\" vlink=\"#FF00FF\" alink=\"#FF0000\">
+".
+
+version(Opts, Vsn0) ->
+ case docb_util:lookup_option(vsn, Opts, Vsn0) of
+ "" -> "";
+ Vsn -> " Version " ++ Vsn
+ end.
+
+top_index(Opts) ->
+ case docb_util:lookup_option(top, Opts) of
+ false -> "";
+ TIFile ->
+ " | <a target=\"_top\" href=\"" ++ TIFile ++ "\">Top</a>"
+ end.
diff --git a/lib/docbuilder/src/docb_html_ref.erl b/lib/docbuilder/src/docb_html_ref.erl
new file mode 100644
index 0000000000..c5c166f1ae
--- /dev/null
+++ b/lib/docbuilder/src/docb_html_ref.erl
@@ -0,0 +1,79 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_html_ref).
+
+-export([rule/2, rule/3]).
+
+rule([description|_],_) ->
+ {"\n<h3>DESCRIPTION</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([funcs|_],_) ->
+ {"\n<h3>EXPORTS</h3>\n",""};
+
+rule([func|_],_) ->
+ {"\n<p>",""};
+
+rule([name, func, funcs, RefType|_], {_,_,[{pcdata,[],Name0}]}) ->
+ Name1 = docb_html_util:make_anchor_name_short(Name0, RefType),
+ {"<a name=\"" ++ Name1 ++ "\"><span class=\"bold_code\">",
+ "</span></a><br/>\n"};
+
+rule([fsummary|_],_) ->
+ {drop, "\n</p>\n"};
+
+rule([type|_], _) ->
+ {"\n<div class=\"REFBODY\"><p>Types:</p>\n <div class=\"REFTYPES\">\n<p>\n",
+ "\n </p> </div>\n</div>\n"};
+
+rule([v|_], _) ->
+ {"<span class=\"bold_code\">","</span><br/>\n"};
+
+rule([d|_], _) ->
+ {"\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([desc|_], _) ->
+ {"\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([authors|_], _) ->
+ {"\n<h3>AUTHORS</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([aname|_], _) ->
+ {"", " - "};
+
+rule([section|_], {1,_,_}) ->
+ {"", ""};
+rule([section|_], {_N,_,_}) ->
+ {"", "\n</div>\n"};
+
+rule([title|_], _) ->
+ {"\n<h3>", "</h3>\n<div class=\"REFBODY\">\n"};
+
+rule(TagHistory, TagBody) ->
+ docb_html:rule(TagHistory, TagBody).
+
+rule([email|_], _, Opts) ->
+ case docb_util:html_snippet(email, Opts) of
+ "" ->
+ {{"","<br/>\n"}, Opts};
+ Email ->
+ {{drop, Email++"<br/>\n"}, Opts}
+ end;
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html:rule(TagHistory, TagBody, Opts).
+
diff --git a/lib/docbuilder/src/docb_html_util.erl b/lib/docbuilder/src/docb_html_util.erl
new file mode 100644
index 0000000000..b2951706ea
--- /dev/null
+++ b/lib/docbuilder/src/docb_html_util.erl
@@ -0,0 +1,543 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_html_util).
+
+-export([attribute_cdata_to_html/1,
+ element_cdata_to_html/1,
+ pcdata_to_html/1, pcdata_to_html/2]).
+-export([copy_pics/3]).
+-export([extract_header_data/2, all_header_data/1]).
+-export([make_uri/1,
+ make_anchor_href/1, make_anchor_href_short/3,
+ make_anchor_name_short/2,
+ make_funcdef_short/2]).
+-export([erl_include/2, code_include/2, erl_eval/1]).
+-export([number/3, count_sections/1]).
+-export([format_toc/1]).
+-export([html_latin1_sort_order/1]).
+
+%%--Handle CDATA and PCDATA---------------------------------------------
+
+%% NB: Functions for transforming sgmls/XMerL data output to html.
+%% Do not use these for included text files (cf code_include and
+%% erl_include).
+
+attribute_cdata_to_html(Data) ->
+ data2html(Data, false).
+
+element_cdata_to_html(Data) ->
+ data2html(Data, false).
+
+pcdata_to_html(Data) ->
+ data2html(Data, true).
+
+pcdata_to_html(Data, RmSp) ->
+ data2html(Data, RmSp).
+
+%% PCDATA, CDATA: Replace entities, and optionally delete
+%% leading and multiple spaces. CDATA never contains entities to
+%% replace.
+
+%% data2html(Cs, RmSpace)
+data2html([246| Cs], RmSp) ->
+ [$&, $#, $2, $4, $6, $;| data2html(Cs, RmSp)];
+data2html([$>| Cs], RmSp) ->
+ [$&, $#, $6, $2, $;| data2html(Cs, RmSp)];
+data2html([$<| Cs], RmSp) ->
+ [$&, $#, $6, $0, $;| data2html(Cs, RmSp)];
+data2html([$&| Cs], RmSp) ->
+ [$&, $#, $3, $8, $;| data2html(Cs, RmSp)];
+data2html([$\"| Cs], RmSp) ->
+ [$&, $#, $3, $4, $;| data2html(Cs, RmSp)];
+data2html([$\n| Cs], RmSp) ->
+ data2html(Cs, RmSp);
+data2html([$\\, $n| Cs], false) ->
+ [$\n| data2html(Cs, false)];
+data2html([$\\, $n| Cs], true) ->
+ [$\n| data2html(delete_leading_space(Cs), true)];
+data2html([$ , $ | Cs], true) -> % delete multiple space
+ [$ | data2html(delete_leading_space(Cs), true)];
+data2html([$\\, $|| Cs0], RmSp) ->
+ {Ent, Cs1} = collect_entity(Cs0),
+ [entity_to_html(Ent)| data2html(Cs1, RmSp)];
+data2html([$\\, $0, $1, $2| Cs], RmSp) ->
+ data2html(Cs, RmSp);
+data2html([$\\, $\\, $n| Cs], RmSp) ->
+ [$\\, $n| data2html(Cs, RmSp)];
+data2html([$\\, O1, O2, O3| Cs], RmSp)
+ when O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7, O3 >= $0, O3 =< $7 ->
+ case octal2dec(O1, O2, O3) of
+ 173 -> % soft hyphen
+ data2html(Cs, RmSp);
+ C when C > 31, C < 256 ->
+ Ent = io_lib:format("&#~w;", [C]),
+ [Ent| data2html(Cs, RmSp)];
+ C ->
+ [C| data2html(Cs, RmSp)]
+ end;
+data2html([$\\, $\\| Cs], RmSp) ->
+ [$\\| data2html(Cs, RmSp)];
+data2html([C| Cs], RmSp) ->
+ [C| data2html(Cs, RmSp)];
+data2html([], _) ->
+ [].
+
+delete_leading_space([$ | Cs]) ->
+ delete_leading_space(Cs);
+delete_leading_space(Cs) ->
+ Cs.
+
+collect_entity(Data) ->
+ collect_entity(Data, []).
+
+collect_entity([$\\, $|| Cs], Rs) ->
+ {lists:reverse(Rs), Cs};
+collect_entity([C| Cs], Rs) ->
+ collect_entity(Cs, [C| Rs]);
+collect_entity([], Rs) ->
+ {[], lists:reverse(Rs)}.
+
+entity_to_html("&") -> "&#38;";
+entity_to_html("\"") -> "&#34;";
+entity_to_html("<") -> "&#60;";
+entity_to_html(">") -> "&#62;";
+entity_to_html([$\\, O1, O2, O3])
+ when O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7, O3 >= $0, O3 =< $7 ->
+ case octal2dec(O1, O2, O3) of
+ 173 -> % soft hyphen
+ "";
+ Value ->
+ io_lib:format("&#~w;", [Value])
+ end;
+entity_to_html(Other) ->
+ docb_html_util_iso:entity_to_html(Other).
+
+octal2dec(O1, O2, O3) ->
+ (O1*8+O2)*8+O3-73*$0.
+
+%%--Copy images---------------------------------------------------------
+
+copy_pics(Src, Dest, Opts) ->
+ Dir = code:lib_dir(docbuilder),
+ InFile = filename:join([Dir, "etc", Src]),
+ OutFile = docb_util:outfile(Dest, "", Opts),
+
+ case filelib:last_modified(OutFile) of
+ 0 -> % File doesn't exist
+ file:copy(InFile, OutFile);
+
+ OutMod2 ->
+ InMod1s = calendar:datetime_to_gregorian_seconds(
+ filelib:last_modified(InFile)),
+ OutMod2s = calendar:datetime_to_gregorian_seconds(OutMod2),
+ if
+ InMod1s > OutMod2s -> % InFile is newer than OutFile
+ file:copy(InFile, OutFile);
+ true ->
+ ok
+ end
+ end.
+
+%%--Resolve header data-------------------------------------------------
+
+extract_header_data(Key, {header, [], List}) ->
+ case lists:keysearch(Key, 1, List) of
+ {value, {Key, [], []}} ->
+ "";
+ {value, {Key, [], [{pcdata, [], Value}]}} ->
+ pcdata_to_html(Value);
+ false ->
+ ""
+ end.
+
+all_header_data(Header) ->
+ all_header_data(Header,
+ [title, prepared, responsible, docno, approved,
+ checked, date, rev, file]).
+
+all_header_data(_Header, []) ->
+ [];
+all_header_data(Header, [Key| Rest]) ->
+ [extract_header_data(Key, Header) | all_header_data(Header, Rest)].
+
+%%--Resolve hypertext references----------------------------------------
+
+%% URI regular expression (RFC 2396):
+%% "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"
+%% We split it in five parts:
+%% scheme: "^(([^:/?#]+):)?" (includes trailing `:')
+%% authority: "^(//([^/?#]*))?" (includes leading `//')
+%% path: "^([^?#]*)"
+%% query: "^(\\?([^#]*))?" (includes leading `?')
+%% fragment: "^(#(.*))?" (includes leading `#')
+
+make_uri(Cs) ->
+ lists:flatmap(
+ fun({path, S}) ->
+ case regexp:match(S, "\.xml?\$") of
+ {match, _, _} ->
+ {ok, NS, _} = regexp:sub(S, "\.xml?\$", ".html"),
+ NS;
+ _ ->
+ S
+ end;
+ ({_, S}) ->
+ S
+ end,
+ split_uri(Cs)).
+
+split_uri(URI) ->
+ split_uri(URI, [{scheme, "^(([^:/?#]+):)?"},
+ {authority, "^(//([^/?#]*))?"},
+ {path, "^([^?#]*)"},
+ {'query', "^(\\?([^#]*))?"},
+ {fragment, "^(#(.*))?"}]).
+
+split_uri("", [{Tag, _R}| T]) ->
+ [{Tag, ""}| split_uri("", T)];
+split_uri(Cs0, [{Tag, R}| T]) ->
+ {match, 1, N} = regexp:match(Cs0, R),
+ Cs1 = string:substr(Cs0, 1, N),
+ Cs2 = strip_and_escape_uri_component(Tag, Cs1),
+ [{Tag, Cs2}| split_uri(string:substr(Cs0, N+1), T)];
+split_uri(_, []) ->
+ [].
+
+strip_and_escape_uri_component(authority, "//" ++ Cs) ->
+ "//" ++ escape_uri(string:strip(Cs));
+strip_and_escape_uri_component(path, Cs) ->
+ escape_uri(string:strip(Cs));
+strip_and_escape_uri_component('query', "?" ++ Cs) ->
+ "?" ++ escape_uri(string:strip(Cs));
+strip_and_escape_uri_component(fragment, "#" ++ Cs) ->
+ "#" ++ escape_uri(string:strip(Cs));
+strip_and_escape_uri_component(_, "") ->
+ "";
+strip_and_escape_uri_component(_, Cs) ->
+ escape_uri(string:strip(Cs)).
+
+escape_uri([C|Cs]) when C =< 32;
+ C == $<; C == $<; C == $#; C == $%; C == $";
+ C == $?;
+ C == ${; C == $}; C ==$|; C == $\\; C == $^;
+ C == $[; C == $]; C ==$';
+ C >= 127 ->
+ [$%, mk_hex(C div 16), mk_hex(C rem 16)| escape_uri(Cs)];
+escape_uri([C|Cs]) ->
+ [C|escape_uri(Cs)];
+escape_uri([]) ->
+ [].
+
+mk_hex(C) when C<10 ->
+ C + $0;
+mk_hex(C) ->
+ C - 10 + $a.
+
+make_anchor_href(HRef) ->
+ case regexp:split(HRef, "#") of
+ {ok, [HRef]} ->
+ %% No `#' in HRef, i.e. only path
+ make_anchor_href(HRef, "");
+ {ok, [Path, Fragment]}->
+ make_anchor_href(Path, Fragment)
+ end.
+
+make_anchor_href(Path0, Frag0) ->
+ Frag1 = string:strip(Frag0),
+ Path1 = case Path0 of
+ "" ->
+ "";
+ _ ->
+ case regexp:match(Path0, "\.xml?\$") of
+ nomatch ->
+ Path0 ++ ".html";
+ _ ->
+ {ok, NewPath, _} = regexp:sub(Path0,
+ "\.xml?\$",
+ ".html"),
+ NewPath
+ end
+ end,
+ case Frag1 of
+ "" ->
+ attribute_cdata_to_html(Path1);
+ _ ->
+ attribute_cdata_to_html(Path1) ++
+ "#" ++
+ attribute_cdata_to_html([case Ch of $/ -> $-; _ -> Ch end||
+ Ch <-Frag1])
+ end.
+
+make_anchor_href_short(Path, Frag, RefType) ->
+ ShortFrag = make_funcdef_short(Frag, RefType,"-"),
+ make_anchor_href(Path, ShortFrag).
+
+make_anchor_name_short(FuncName0, RefType) ->
+ FuncName1 = make_funcdef_short(FuncName0, RefType,"-"),
+ attribute_cdata_to_html(FuncName1).
+
+make_funcdef_short(FuncDef0, RefType) ->
+ make_funcdef_short(FuncDef0, RefType, "/").
+
+make_funcdef_short(FuncDef0, RefType,Delimiter) ->
+ FuncDef1 = docb_util:trim(FuncDef0),
+ Any0 = case lists:member(RefType, [cref, erlref]) of
+ true ->
+ case catch docb_util:fknidx(FuncDef1, Delimiter) of
+ {'EXIT', _} ->
+ false;
+ Any1 ->
+ Any1
+ end;
+ false ->
+ false
+ end,
+ case Any0 of
+ false ->
+ case string:tokens(FuncDef1, " ") of
+ [Any2| _] ->
+ Any2;
+ _ ->
+ FuncDef1
+ end;
+ _ ->
+ Any0
+ end.
+
+%%--Include tags--------------------------------------------------------
+
+%% Only used in report DTD
+erl_include(File, Tag) ->
+ case docb_main:include_file(File, Tag) of
+ {ok, Cs} ->
+ {drop, "\n<pre>\n" ++ text_to_html(Cs) ++ "\n</pre>\n"};
+ error ->
+ {drop, ""}
+ end.
+
+code_include(File, Tag) ->
+ case docb_main:include(File, Tag, Tag) of
+ {ok, Cs} ->
+ {ok,text_to_html(Cs)};
+ error ->
+ {error, {codeinclude,File}}
+ end.
+
+erl_eval(Expr) ->
+ Cs = docb_main:eval_str(Expr),
+ {drop, "\n<pre>\n" ++ text_to_html(Cs) ++ "\n</pre>\n"}.
+
+%% Only replaces certain characters. Spaces and new lines etc are kept.
+%% Used for plain text (e.g. inclusions of code).
+text_to_html([$>| Cs]) ->
+ [$&, $#, $6, $2, $;| text_to_html(Cs)];
+text_to_html([$<| Cs]) ->
+ [$&, $#, $6, $0, $;| text_to_html(Cs)];
+text_to_html([$&| Cs]) ->
+ [$&, $#, $3, $8, $;| text_to_html(Cs)];
+text_to_html([$\"| Cs]) ->
+ [$&, $#, $3, $4, $;| text_to_html(Cs)];
+text_to_html([C| Cs]) ->
+ [C| text_to_html(Cs)];
+text_to_html([]) ->
+ [].
+
+%%--Number sections-----------------------------------------------------
+
+number({Tag, Attrs, More}, none, File) ->
+ {Tag, Attrs, do_number(More, [1], File)};
+number({Tag, Attrs, More}, Prefix, File) ->
+ {Tag, Attrs, do_number(More, [list_to_integer(Prefix)], File)}.
+
+do_number([], _, _) ->
+ [];
+do_number([{header, Attrs, More}| Rest], NN, File) ->
+ [{header, Attrs, More}| do_number(Rest, NN, File)];
+do_number([{section, Attrs, More}| Rest], [N| NN], File) ->
+ [{section, Attrs, do_number(More, [1, N| NN], File)}|
+ do_number(Rest, [N+1| NN], File)];
+do_number([{title, _, [{pcdata, _, Title}]}| More], [N| NN], File) ->
+ Format = make_format(length(NN)),
+ Number = lists:flatten(io_lib:format(Format, lists:reverse(NN))),
+ [{marker, [{"ID", "CDATA", Number}], []},
+ {title, [{"NUMBER", "CDATA", Number},
+ {"FILE", "CDATA", File}],
+ [{pcdata, [], Title}]}| do_number(More, [N| NN], File)];
+do_number([{pcdata, Attrs, More}| Rest], NN, File) ->
+ [{pcdata, Attrs, More}| do_number(Rest, NN, File)];
+do_number([{Tag, Attrs, More}| Rest], NN, File) ->
+ [{Tag, Attrs, do_number(More, NN, File)}|do_number(Rest, NN, File)].
+
+make_format(1) ->
+ "~w";
+make_format(N) ->
+ "~w." ++ make_format(N-1).
+
+count_sections([section| Rest]) ->
+ 1 + count_sections(Rest);
+count_sections([_| Rest]) ->
+ count_sections(Rest);
+count_sections([]) ->
+ 0.
+
+%%--Make a ToC----------------------------------------------------------
+
+format_toc(Toc) ->
+ lists:map(fun({Number, Title}) ->
+ [Number, " <a href = \"#", Number,
+ "\">", Title, "</a><br/>\n"]
+ end, Toc).
+
+%%--Convert HTML ISO Latin 1 characters to ordinary characters----------
+
+%% To be used for sorting. Cs must be flat.
+html_latin1_sort_order(Cs) ->
+ hlso(Cs).
+
+hlso([]) ->
+ [];
+hlso([$&, $#, C2, C1, C0, $;| Cs])
+ when $0 =< C2, C2 =< $9, $0 =< C1, C1 =< $9, $0 =< C0, C0 =< $9 ->
+ C = ((C2-$0)*10 + (C1-$0))*10 + C0-$0,
+ hlso0(C, Cs);
+hlso([$&, $#, C1, C0, $;| Cs])
+ when $0 =< C1, C1 =< $9, $0 =< C0, C0 =< $9 ->
+ C = (C1-$0)*10 + C0-$0,
+ hlso0(C, Cs);
+hlso([C| Cs]) ->
+ [C| hlso(Cs)].
+
+hlso0(C, Cs) when 0 =< C, C =< 159 ->
+ [C| hlso(Cs)];
+hlso0(160, Cs) -> %% no-break space
+ hlso(Cs); % Remove it.
+hlso0(161, Cs) -> %% inverted exclamation mark
+ [$? |hlso(Cs)];
+hlso0(162, Cs) -> %% cent sign
+ [$$|hlso(Cs)];
+hlso0(163, Cs) -> %% pound sterling sign
+ [$$|hlso(Cs)];
+hlso0(164, Cs) -> %% general currency sign
+ [$$|hlso(Cs)];
+hlso0(165, Cs) -> %% yen sign
+ [$$|hlso(Cs)];
+hlso0(166, Cs) -> %% broken (vertical) bar
+ [$| |hlso(Cs)];
+hlso0(167, Cs) -> %% section sign
+ [$$|hlso(Cs)];
+hlso0(168, Cs) -> %% umlaut (dieresis)
+ [$: |hlso(Cs)];
+hlso0(169, Cs) -> %% copyright sign
+ [$c |hlso(Cs)];
+hlso0(170, Cs) -> %% ordinal indicator, feminine
+ [$f |hlso(Cs)];
+hlso0(171, Cs) -> %% angle quotation mark, left
+ [$" |hlso(Cs)];
+hlso0(172, Cs) -> %% not sign
+ [$- |hlso(Cs)];
+hlso0(173, Cs) -> %% soft hyphen
+ [$- |hlso(Cs)];
+hlso0(174, Cs) -> %% registered sign
+ [$r |hlso(Cs)];
+hlso0(175, Cs) -> %% macron
+ [$- |hlso(Cs)];
+hlso0(176, Cs) -> %% degree sign
+ [$d |hlso(Cs)];
+hlso0(177, Cs) -> %% plus-or-minus sign
+ [$+ |hlso(Cs)];
+hlso0(178, Cs) -> %% superscript two
+ [$2 |hlso(Cs)];
+hlso0(179, Cs) -> %% superscript three
+ [$3 |hlso(Cs)];
+hlso0(180, Cs) -> %% acute accent
+ [$' |hlso(Cs)];
+hlso0(181, Cs) -> %% micro sign
+ [$' |hlso(Cs)];
+hlso0(182, Cs) -> %% pilcrow (paragraph sign)
+ [$$|hlso(Cs)];
+hlso0(183, Cs) -> %% middle dot
+ [$. |hlso(Cs)];
+hlso0(184, Cs) -> %% cedilla
+ [$c |hlso(Cs)];
+hlso0(185, Cs) -> %% superscript one
+ [$1 |hlso(Cs)];
+hlso0(186, Cs) -> %% ordinal indicator, masculine
+ [$m |hlso(Cs)];
+hlso0(187, Cs) -> %% angle quotation mark, right
+ [$" |hlso(Cs)];
+hlso0(188, Cs) -> %% fraction one-quarter
+ [$4 |hlso(Cs)];
+hlso0(189, Cs) -> %% fraction one-half
+ [$2 |hlso(Cs)];
+hlso0(190, Cs) -> %% fraction three-quarters
+ [$3 |hlso(Cs)];
+hlso0(191, Cs) -> %% inverted question mark
+ [$? |hlso(Cs)];
+
+hlso0(C, Cs) when 192 =< C, C =< 198 -> %% capital A
+ [$A |hlso(Cs)];
+hlso0(199, Cs) -> %% capital C, cedilla
+ [$C |hlso(Cs)];
+hlso0(C, Cs) when 200 =< C, C =< 203 -> %% capital E
+ [$E |hlso(Cs)];
+hlso0(C, Cs) when 204 =< C, C =< 207 -> %% capital I
+ [$I |hlso(Cs)];
+hlso0(208, Cs) -> %% capital Eth, Icelandic
+ [$D |hlso(Cs)];
+hlso0(209, Cs) -> %% capital N, tilde
+ [$N |hlso(Cs)];
+hlso0(C, Cs) when 210 =< C, C =< 214 -> %% capital O
+ [$O |hlso(Cs)];
+hlso0(215, Cs) -> %% multiply sign
+ [$x |hlso(Cs)];
+hlso0(216, Cs) -> %% capital O, slash
+ [$O |hlso(Cs)];
+hlso0(C, Cs) when 217 =< C, C =< 220 -> %% capital U
+ [$U |hlso(Cs)];
+hlso0(221, Cs) -> %% capital Y, acute accent
+ [$Y |hlso(Cs)];
+hlso0(222, Cs) -> %% capital THORN, Icelandic
+ [$T |hlso(Cs)];
+hlso0(223, Cs) -> %% small sharp s, German (sz
+ [$s |hlso(Cs)];
+hlso0(C, Cs) when 224 =< C, C =< 230-> %% small a
+ [$a |hlso(Cs)];
+hlso0(231, Cs) -> %% small c, cedilla
+ [$c |hlso(Cs)];
+hlso0(C, Cs) when 232 =< C, C =< 235 -> %% small e
+ [$e |hlso(Cs)];
+hlso0(C, Cs) when 236 =< C, C =< 239 -> %% small i
+ [$i |hlso(Cs)];
+hlso0(240, Cs) -> %% small eth, Icelandic
+ [$d |hlso(Cs)];
+hlso0(241, Cs) -> %% small n, tilde
+ [$n |hlso(Cs)];
+hlso0(C, Cs) when 242 =< C, C =< 246 -> %% small o
+ [$o |hlso(Cs)];
+hlso0(247, Cs) -> %% divide sign
+ [$/ |hlso(Cs)];
+hlso0(248, Cs) -> %% small o, slash
+ [$o |hlso(Cs)];
+hlso0(C, Cs) when 249 =< C, C =< 252 -> %% small u
+ [$u |hlso(Cs)];
+hlso0(253, Cs) -> %% small y, acute accent
+ [$y |hlso(Cs)];
+hlso0(254, Cs) -> %% small thorn, Icelandic
+ [$t |hlso(Cs)];
+hlso0(255, Cs) -> %% small y, dieresis or umlaut
+ [$y |hlso(Cs)].
diff --git a/lib/docbuilder/src/docb_html_util_iso.erl b/lib/docbuilder/src/docb_html_util_iso.erl
new file mode 100644
index 0000000000..c836805cd2
--- /dev/null
+++ b/lib/docbuilder/src/docb_html_util_iso.erl
@@ -0,0 +1,204 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_html_util_iso).
+-export([entity_to_html/1]).
+
+%% Encodes ISOtech, ISOnum and ISOgrk3.
+%%
+%% All entities are of the form "[abcdef]".
+%%
+entity_to_html(Entity) when is_list(Entity), hd(Entity) =/= $[ ->
+ Entity;
+entity_to_html(Entity) ->
+ case (catch enc(Entity)) of
+ {'EXIT', _} ->
+ Entity;
+ Enc ->
+ "<font face=symbol>" ++ Enc ++ "</font>"
+ end.
+
+enc("[Delta ]") -> "&#68;";
+%% enc("[Dot ]") -> "&#0;";
+%% enc("[DotDot]") -> "&#0;";
+enc("[Gamma ]") -> "&#71;";
+enc("[Lambda]") -> "&#76;";
+enc("[Omega ]") -> "&#87;";
+enc("[Phi ]") -> "&#70;";
+enc("[Pi ]") -> "&#80;";
+enc("[Prime ]") -> "&#178;";
+enc("[Psi ]") -> "&#89;";
+enc("[Sigma ]") -> "&#83;";
+enc("[Theta ]") -> "&#81;";
+enc("[Upsi ]") -> "&#161;";
+%% enc("[Verbar]") -> "&#0;";
+enc("[Xi ]") -> "&#88;";
+
+enc("[aleph ]") -> "&#192;";
+enc("[alpha ]") -> "&#97;";
+enc("[amp ]") -> "&#38;";
+enc("[and ]") -> "&#217;";
+enc("[ang ]") -> "&#208;";
+%% enc("[ang90 ]") -> "&#0;";
+%% enc("[angsph]") -> "&#0;";
+%% enc("[angst ]") -> "&#0;";
+enc("[ap ]") -> "&#187;";
+
+%% enc("[becaus]") -> "&#0;";
+%% enc("[bernou]") -> "&#0;";
+enc("[bepsi ]") -> "&#39;";
+enc("[beta ]") -> "&#98;";
+enc("[bottom]") -> "&#94;";
+enc("[bull ]") -> "&#183;";
+
+enc("[cap ]") -> "&#199;";
+enc("[chi ]") -> "&#99;";
+enc("[clubs ]") -> "&#167;";
+%% enc("[compfn]") -> "&#0;";
+enc("[cong ]") -> "&#64;";
+enc("[copy ]") -> "&#211;";
+%% enc("[conint]") -> "&#0;";
+enc("[cup ]") -> "&#200;";
+
+enc("[dArr ]") -> "&#223;";
+enc("[darr ]") -> "&#175;";
+enc("[deg ]") -> "&#176;";
+enc("[delta ]") -> "&#100;";
+enc("[diam ]") -> "&#224;";
+enc("[diams ]") -> "&#168;";
+enc("[divide]") -> "&#184;";
+
+enc("[empty ]") -> "&#198;";
+%% enc("[epsi ]") -> "&#0;";
+%% enc("[epsis ]") -> "&#0;";
+enc("[epsiv ]") -> "&#101;";
+enc("[equiv ]") -> "&#186;";
+enc("[eta ]") -> "&#104;";
+enc("[exist ]") -> "&#36;";
+
+enc("[fnof ]") -> "&#166;";
+enc("[forall]") -> "&#34;";
+
+enc("[gamma ]") -> "&#103;";
+%% enc("[gammad]") -> "&#0;";
+enc("[ge ]") -> "&#179;";
+enc("[gt ]") -> "&#62;";
+
+%% enc("[hamilt]") -> "&#0;";
+enc("[hArr ]") -> "&#219;";
+enc("[harr ]") -> "&#171;";
+enc("[hearts]") -> "&#169;";
+enc("[horbar]") -> "&#190;";
+
+enc("[iff ]") -> "&#219;";
+enc("[image ]") -> "&#193;";
+enc("[infin ]") -> "&#165;";
+enc("[int ]") -> "&#242;";
+enc("[iota ]") -> "&#105;";
+enc("[isin ]") -> "&#206;";
+
+enc("[kappa ]") -> "&#107;";
+%%enc("[kappav]") -> "&#0;";
+
+enc("[lArr ]") -> "&#220;";
+%% enc("[lagran]") -> "&#0;";
+enc("[lambda]") -> "&#108;";
+enc("[lang ]") -> "&#225;";
+enc("[larr ]") -> "&#172;";
+enc("[le ]") -> "&#163;";
+%% enc("[lowast]") -> "&#0;";
+enc("[lowbar]") -> "&#95;";
+enc("[lt ]") -> "&#60;";
+
+enc("[middot]") -> "&#215;";
+enc("[minus ]") -> "&#45;";
+%% enc("[mnplus]") -> "&#0;";
+enc("[mu ]") -> "&#109;";
+
+enc("[nabla ]") -> "&#209;";
+enc("[ne ]") -> "&#185;";
+enc("[ni ]") -> "&#39;";
+enc("[nsub ]") -> "&#203;";
+enc("[not ]") -> "&#216;";
+enc("[notin ]") -> "&#207;";
+enc("[nu ]") -> "&#110;";
+
+enc("[omega ]") -> "&#119;";
+enc("[or ]") -> "&#218;";
+%% enc("[order ]") -> "&#0;";
+enc("[oplus ]") -> "&#197;";
+enc("[otimes]") -> "&#196;";
+
+%% enc("[par ]") -> "&#0;";
+enc("[part ]") -> "&#182;";
+%% enc("[permil]") -> "&#0;";
+enc("[perp ]") -> "&#94;"; % bottom
+enc("[phis ]") -> "&#102;";
+enc("[phiv ]") -> "&#106;";
+%% enc("[phmmat]") -> "&#0;";
+enc("[pi ]") -> "&#112;";
+enc("[piv ]") -> "&#118;";
+enc("[plus ]") -> "&#43;";
+enc("[plusmn]") -> "&#177;";
+enc("[prime ]") -> "&#162;";
+enc("[prod ]") -> "&#213;";
+enc("[prop ]") -> "&#181;";
+enc("[psi ]") -> "&#121;";
+
+enc("[radic ]") -> "&#214;";
+enc("[rang ]") -> "&#241;";
+enc("[rArr ]") -> "&#222;";
+enc("[rarr ]") -> "&#174;";
+enc("[real ]") -> "&#194;";
+enc("[reg ]") -> "&#210;";
+enc("[rho ]") -> "&#114;";
+%% enc("[rhov ]") -> "&#0;";
+
+enc("[sigma ]") -> "&#115;";
+enc("[sigmav]") -> "&#86;";
+enc("[sim ]") -> "&#126;";
+%% enc("[sime ]") -> "&#0;";
+%% enc("[square]") -> "&#0;";
+enc("[sol ]") -> "&#164;";
+enc("[spades]") -> "&#170;";
+enc("[sub ]") -> "&#204;";
+enc("[sube ]") -> "&#205;";
+enc("[sup ]") -> "&#201;";
+enc("[supe ]") -> "&#202;";
+enc("[sum ]") -> "&#229;";
+
+enc("[tau ]") -> "&#116;";
+enc("[tdot ]") -> "&#188;";
+enc("[there4]") -> "&#92;";
+enc("[thetas]") -> "&#113;";
+enc("[thetav]") -> "&#74;";
+enc("[times ]") -> "&#180;";
+%% enc("[tprime]") -> "&#0;";
+enc("[trade ]") -> "&#212;";
+
+enc("[uArr ]") -> "&#221;";
+enc("[uarr ]") -> "&#173;";
+enc("[upsi ]") -> "&#117;";
+
+enc("[verbar]") -> "&#189;";
+
+%% enc("[wedgeq]") -> "&#0;";
+enc("[weierp]") -> "&#195;";
+
+enc("[xi ]") -> "&#120;";
+
+enc("[zeta ]") -> "&#122;".
diff --git a/lib/docbuilder/src/docb_main.erl b/lib/docbuilder/src/docb_main.erl
new file mode 100644
index 0000000000..ef21f65557
--- /dev/null
+++ b/lib/docbuilder/src/docb_main.erl
@@ -0,0 +1,651 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_main).
+
+-export([process/2,
+ parse/2, parse1/2,
+ pp/2,
+ insert_after/3,
+ transform/5, pp/5,
+ include_file/2, include/3,
+ eval_str/1,
+ validate_html/1
+ ]).
+-export([do_parse_sgmls/1]).
+
+%%----------------------------------------------------------------------
+
+%% process(File, Opts) -> errors | ok
+%% Parses the source file File and transforms the result to html,
+%% latex and/or man page format.
+process(File, Opts) ->
+
+ File1 = File ++ ".tmpconv",
+ os:cmd("sed -e 's/xi:include[ \t]*href/include file/g' -e 's/xmlns:xi=\"http:\\/\\/www.w3.org\\/2001\\/XInclude\"//g' < " ++
+ File ++ ".xml > " ++ File1 ++ ".xml"), %LATH
+
+ case parse1(File1, Opts) of
+ errors ->
+ file:delete(File1 ++ ".xml"),
+ errors;
+ {ok, Tree} ->
+ From = element(1, Tree),
+ Tos0 =
+ lists:foldl(
+ fun(latex, Acc) -> [latex|Acc];
+ (html, Acc) -> [html|Acc];
+ ({man, _Section}, Acc) -> [man|Acc];
+ (_, Acc) -> Acc
+ end, [], Opts),
+
+ %% If no target format is specified, assume HTML:
+ Tos = if
+ Tos0==[] -> [html];
+ true -> Tos0
+ end,
+
+ Result = [transform(From, To, Opts, File, Tree)||To <- Tos],
+ case lists:member(transformation_error,Result) of
+ true ->
+ file:delete(File1 ++ ".xml"),
+ errors;
+ _ ->
+ file:delete(File1 ++ ".xml"),
+ ok
+ end
+
+ end.
+
+%%----------------------------------------------------------------------
+
+%% parse(File, Opts) -> {ok, Tree} | errors
+%% Parses the source file File, resulting in a tree structure.
+parse(File, Opts) ->
+ case docb_util:lookup_option(src_type, Opts) of
+ ".xml" ->
+ parse_xml(File++".xml", Opts);
+ ".sgml" ->
+ parse_sgml(File, Opts)
+ end.
+
+%% parse1(File, Opts) -> {ok, Tree} | errors
+%% Like parse/2, but in the SGML case also prints the parse errors
+%% (in File.html.sgmls_errs) information to stdout.
+parse1(File, Opts) ->
+ parse(File, [{print_parse_errs, true}|Opts]).
+
+
+validate_html(InFile) ->
+ ScanOpts = [{validation,true}, {fetch_fun, fun fetch_dtd/2}],
+ case xmerl_scan:file(InFile, ScanOpts) of
+ {_XMLTuple,[]} -> % ok
+ {InFile,ok};
+ {'EXIT',Reason} ->
+ {InFile,Reason}
+ end.
+
+fetch_dtd({public,_,"http://www.w3.org/TR/xhtml1/DTD/"++ Rest},GlobalState) ->
+ Filename = filename:join(docb_util:dtd_dir(),Rest),
+ {ok,{file,Filename},GlobalState};
+fetch_dtd({public,_,Str},GlobalState) ->
+ {ok,{file,filename:join(docb_util:dtd_dir(),Str)},GlobalState}.
+
+
+
+parse_xml(InFile, Opts) ->
+ DtdDir = docb_util:dtd_dir(),
+ ScanOpts = [{validation,true}, {fetch_path, [DtdDir]}],
+ PrintP = docb_util:lookup_option(print_parse_errs, Opts),
+ case catch xmerl_scan:file(InFile, ScanOpts) of
+ {'EXIT', Error} when PrintP ->
+ docb_util:message(error,
+ "XML validation error:~n~p", [Error]),
+ errors;
+ {'EXIT', _Error} ->
+ errors;
+ {error, Reason} -> % probably file error
+ docb_util:message(error, "XML scan error: ~p", [Reason]),
+ errors;
+ {Doc, []} ->
+ case catch xmerl:export([Doc], docb_xmerl_tree_cb) of
+ [Tree] ->
+ verify(Tree),
+ {ok, Tree};
+ {'EXIT', Error} ->
+ docb_util:message(error,
+ "XML export error:~n~p", [Error]),
+ errors
+ end
+ end.
+
+parse_sgml(InFile, Opts) ->
+
+ Pfx = tmp_file_prefix(InFile, Opts),
+ OutFile = Pfx ++ "sgmls_output",
+ ErrFile = Pfx ++ "sgmls_errs",
+
+ EntVals = lists:usort(docb_util:lookup_options(ent, Opts)),
+ Ents = lists:flatten([" -ent " ++ Val || Val <- EntVals]),
+ Cmd = docb_util:old_docb_dir() ++ "/bin/docb_sgmls_run " ++
+ Ents ++ " " ++ InFile ++ ".sgml " ++ OutFile ++ " " ++ ErrFile,
+
+ case os:cmd(Cmd) of
+ [] ->
+ PrintP = docb_util:lookup_option(print_parse_errs, Opts),
+ case filelib:file_size(ErrFile) of
+ 0 -> % implies no errors
+ parse_sgmls(InFile, OutFile);
+ _ when PrintP ->
+ cat(ErrFile),
+ errors;
+ _ ->
+ errors
+ end;
+ Msg ->
+ docb_util:message(error, "~p", [Msg]),
+ errors
+ end.
+
+tmp_file_prefix(File, Opts) ->
+ lists:concat(
+ [File, "." | lists:foldl(
+ fun(latex, Acc) -> ["latex."|Acc];
+ (html, Acc) -> ["html."|Acc];
+ ({man, Section}, Acc) -> ["man", Section, "."|Acc];
+ (_, Acc) -> Acc
+ end, [], Opts)]).
+
+parse_sgmls(InFile, SgmlsFile) ->
+ case file:open(SgmlsFile, [read]) of
+ {ok, Fd} ->
+ Res = case (catch do_parse_sgmls(Fd)) of
+ {ok, Tree} ->
+ {ok, Tree};
+ {'EXIT', Reason} ->
+ docb_util:message(
+ error,
+ "Cannot parse sgmls output file "
+ "~s, obtained from parsing ~s, "
+ "reason: ~w",
+ [SgmlsFile, InFile, Reason]),
+ errors;
+ {error, Reason} ->
+ docb_util:message(
+ error,
+ "Cannot parse sgmls output file "
+ "~s, obtained from parsing ~s, "
+ "reason: ~w",
+ [SgmlsFile, InFile, Reason]),
+ errors
+ end,
+ file:close(Fd),
+ case Res of
+ {ok, Tree0} ->
+ verify(Tree0),
+ {ok, Tree0};
+ _Other ->
+ errors
+ end;
+ {error, Reason} ->
+ docb_util:message(error,
+ "Cannot open sgmls output file ~s, "
+ "obtained from parsing ~s, reason: ~w",
+ [SgmlsFile, InFile, Reason]),
+ errors
+ end.
+
+do_parse_sgmls(Fd) ->
+ do_parse_sgmls(Fd, []).
+
+do_parse_sgmls(Fd, Attrs) ->
+ case get_line(Fd) of
+ {attrs, A} ->
+ do_parse_sgmls(Fd, [A|Attrs]);
+ {startTag, Tag} ->
+ {ok, {Tag, Attrs, get_args(Fd)}};
+ Other ->
+ {error, Other}
+ end.
+
+get_args(Fd) ->
+ case get_line(Fd) of
+ {startTag, Tag} ->
+ H = {Tag, [], get_args(Fd)},
+ [H|get_args(Fd)];
+ {dataTag, Str} ->
+ [{pcdata, [], Str}|get_args(Fd)];
+ {attrs, A} ->
+ get_args_attr(Fd, [A]);
+ close ->
+ [];
+ ok ->
+ []
+ end.
+
+get_args_attr(Fd, Attrs) ->
+ case get_line(Fd) of
+ {startTag, Tag} ->
+ H = {Tag, lists:reverse(Attrs), get_args(Fd)},
+ [H|get_args(Fd)];
+ {dataTag, Str} ->
+ [{pcdata, lists:reverse(Attrs), Str}|get_args(Fd)];
+ {attrs, A} ->
+ get_args_attr(Fd, [A|Attrs]);
+ close ->
+ [];
+ ok ->
+ []
+ end.
+
+get_line(Fd) ->
+ Str = io:get_line(Fd, ''),
+ case Str of
+ [$(|T] ->
+ {startTag, tag_name(T)};
+ [$-|T] ->
+ {dataTag, T};
+ [$)|_T] ->
+ close;
+ [$A|T] ->
+ {attrs, attrs(remove_nl(T))};
+ [$?|_T] ->
+ get_line(Fd);
+ [$C|_] ->
+ ok
+ end.
+
+remove_nl([$\n|_]) -> [];
+remove_nl([H|T]) -> [H|remove_nl(T)];
+remove_nl([]) -> [].
+
+%% attrs
+%% splits a string like
+%% AAAAA BBBBB ......
+%% into {"AAA", "BBB", Rest}
+
+attrs(T) ->
+ {X, T1} = get_item(T),
+ {Y, T2} = get_item(T1),
+ T3 = skip_blanks(T2),
+ {X, Y, T3}.
+
+get_item(T) -> get_item(skip_blanks(T), []).
+
+get_item([$ |T], L) -> {lists:reverse(L), [$ |T]};
+get_item([H|T], L) -> get_item(T, [H|L]);
+get_item([], L) -> {lists:reverse(L), []}.
+
+skip_blanks([$ |T]) -> skip_blanks(T);
+skip_blanks(T) -> T.
+
+tag_name(Str) -> tag_name(Str, []).
+
+tag_name([H|T], L) when $A =< H, H =< $Z ->
+ tag_name(T, [H-$A+$a|L]);
+tag_name([$\n], L) ->
+ list_to_atom(lists:reverse(L));
+tag_name([H|T], L) ->
+ tag_name(T, [H|L]).
+
+cat(File) ->
+ case file:open(File, [read]) of
+ {ok, Fd} ->
+ cat1(Fd),
+ file:close(Fd);
+ Other ->
+ Other
+ end.
+
+cat1(Fd) ->
+ case io:get_line(Fd, '') of
+ eof ->
+ eof;
+ Str ->
+ io:format("~s", [Str]),
+ cat1(Fd)
+ end.
+
+%%----------------------------------------------------------------------
+
+verify(Tree) -> verify(Tree, [], 1).
+
+verify({pcdata, Optional, _}, Path, Level) ->
+ verify_optional(Optional, Path, Level);
+verify({Tag, Optional, Args}, Path, Level) when is_list(Args) ->
+ case verify_optional(Optional, Path, Level) of
+ true ->
+ verify_list(Args, [Tag|Path], Level);
+ false ->
+ false
+ end;
+verify(Other, Path, Level) ->
+ verify_error(Other, Path, Level).
+
+verify_error(X, Path, Level) ->
+ docb_util:message(error, "Invalid object found at: ~p level:~w~n~s",
+ [Path, Level, docb_pretty_format:term(X)]),
+ false.
+
+verify_list([H|T], Path, Level) ->
+ case verify(H, Path, Level) of
+ true ->
+ verify_list(T, Path, Level +1);
+ false ->
+ false
+ end;
+verify_list([], _, _) ->
+ true.
+
+verify_optional([{_, _, _}|T], Path, Level) ->
+ verify_optional(T, Path, Level);
+verify_optional([], _Path, _Level) ->
+ true;
+verify_optional(X, Path, Level) ->
+ verify_error(X, Path, Level).
+
+%%----------------------------------------------------------------------
+
+%% pp(File, Opts) -> {ok, OutFile} | errors
+%% Parses the source file and, if successful, prints the resulting tree
+%% structure to a file with the extension ".pp".
+pp(File, Opts) ->
+ case parse(File, Opts) of
+ {ok, Tree} ->
+ OutFile = File ++ ".pp",
+ dump(OutFile, Tree),
+ {ok, OutFile};
+ errors ->
+ errors
+ end.
+
+dump(File, Struct) ->
+ {ok, Stream} = file:open(File, [write]),
+ io:format("Info: Dump on ~p ...", [File]),
+ io:format(Stream, "~n~s~n", [docb_pretty_format:term(Struct)]),
+ io:format(" done.\n"),
+ file:close(Stream).
+
+%%----------------------------------------------------------------------
+
+%% insert_after(Tag, Tree, Obj) -> Tree | {'EXIT', Reason}
+%% Insert an element in a tree structure
+insert_after(Tag, Tree, Obj) ->
+ edit(Tag, Tree, {insert_after, Obj}).
+
+%% edit Op = delete, insert_before, insert_after
+edit(Tag, Tree, Op) ->
+ case catch edit1(Tag, Tree, Op) of
+ error ->
+ docb_util:message(error, "Cannot do ~p to ~w", [Op, Tag]),
+ Tree;
+ Other ->
+ Other
+ end.
+
+edit1(Tag, {Tag, _O, _A}, _Op) ->
+ throw(error);
+edit1(Tag, {Tag1, O, A}, Op) ->
+ {Tag1, O, edit1_list(Tag, A, Op)};
+edit1(_, _, _) ->
+ throw(error).
+
+edit1_list(Tag, [{pcdata, Str}|T], Op) ->
+ [{pcdata, Str}|edit1_list(Tag, T, Op)];
+edit1_list(Tag, [{Tag, O, A}|T], {insert_after, Obj}) ->
+ [{Tag, O, A}, Obj|T];
+edit1_list(Tag, [H|T], Op) ->
+ [H|edit1_list(Tag, T, Op)];
+edit1_list(_Tag, [], _Op) ->
+ [].
+
+%%______________________________________________________________________
+
+%% transform(From, To, Opts, File, Tree) -> void()
+%% Actual transformation of tree structure to desired format.
+transform(From, To, Opts, File, Tree) ->
+ Filter = if
+ To==html; To==kwic ->
+ list_to_atom("docb_tr_" ++ atom_to_list(From) ++
+ [$2|atom_to_list(To)]);
+ true ->
+ list_to_atom("sgml_tr_" ++ atom_to_list(From) ++
+ [$2|atom_to_list(To)])
+ end,
+
+ case catch apply(Filter, transform, [File, Tree, Opts]) of
+
+ %% R5C
+ {'EXIT', {undef, [{Filter, transform, [File, Tree, Opts]}|_]}}->
+ %% No transformation defined
+ finish_transform(Tree, File, Opts, Filter);
+
+ {'EXIT', {undef, {Filter, transform, [File, Tree, Opts]}}} ->
+ %% No transformation defined
+ finish_transform(Tree, File, Opts, Filter);
+
+ {'EXIT', What} ->
+ docb_util:message(error,
+ "Transformation trouble in ~P", [What, 9]),
+ transformation_error;
+
+ {error, Reason} ->
+ docb_util:message(error, Reason),
+ transformation_error;
+
+ {Tree1, Opts1} ->
+ %% transformation returning both new parse and new options
+ finish_transform(Tree1, File, Opts1, Filter);
+
+ Tree1 ->
+ %% transformation returning only new parse
+ finish_transform(Tree1, File, Opts, Filter)
+ end.
+
+finish_transform(Tree, File, Opts, Filter) ->
+ {Str, NewOpts} = pp(Tree, [], 1, Filter, Opts),
+ Extension =
+ case catch apply(Filter, extension, [NewOpts]) of
+ {'EXIT', _} ->
+ apply(Filter, extension, []);
+ Others ->
+ Others
+ end,
+ {ok, Out} =
+ file:open(docb_util:outfile(File, Extension, NewOpts), [write]),
+ put_chars(Out, Str),
+ file:close(Out).
+
+put_chars(Out, Str) -> put_chars(Out, Str, 0).
+
+put_chars(Out, [$\n|Cs], _Pos) ->
+ io:put_chars(Out, [$\n]),
+ put_chars(Out, Cs, 0);
+
+put_chars(Out, [$\011|Cs], Pos) -> % tab
+ TabbedPos = 8*((Pos div 8)+1),
+ Nblanks = TabbedPos - Pos,
+ io:put_chars(Out, lists:duplicate(Nblanks, $ )),
+ put_chars(Out, Cs, Pos+Nblanks);
+
+put_chars(Out, [C|Cs], Pos) when is_integer(C) ->
+ io:put_chars(Out, [C]),
+ put_chars(Out, Cs, Pos+1);
+
+put_chars(Out, [L|Cs], Pos) when is_list(L) ->
+ put_chars(Out, Cs, put_chars(Out, L, Pos));
+
+put_chars(_Out, [], Pos) ->
+ Pos.
+
+pp({Tag, Optional, Args}, TagPath, Level, Filter, Opts) ->
+ TagPath1 = [Tag|TagPath],
+ Optional1 = reduce_optional(Optional),
+
+ %% First try Filter:rule/3. It returns {Return, NewOpts}
+ %% where Return is as from rule/2:
+ Rule_3_result =
+ case catch Filter:rule(TagPath1, {Level,Optional1,Args},Opts) of
+ %% R5C
+ {'EXIT', {undef, [{_, rule, _}|_]}} -> % No rule/3 defined
+ failed;
+
+ {'EXIT', {undef, {_, rule, _}}} -> % No rule/3 defined
+ failed;
+ %% R5C
+ {'EXIT', {function_clause, [{_, rule, _}|_]}} -> % No MATCHING rule/3
+ failed;
+
+ {'EXIT', {function_clause, {_, rule, _}}} -> % No MATCHING rule/3
+ failed;
+
+ {'EXIT', What} ->
+ docb_util:message(error,
+ "Serious Error: ~P", [What, 9]);
+ Others ->
+ Others
+ end,
+ handle_rule_call_result({r3, Rule_3_result}, Filter, TagPath1, Tag,
+ Level, Optional1, Args, Opts).
+
+handle_rule_call_result({r3, failed}, Filter, TagPath1, Tag, Level, Optional1,
+ Args, Opts) ->
+ %% Hmmm, try Filter:rule/2
+ Rule_2_result = (catch Filter:rule(TagPath1, {Level, Optional1, Args})),
+ handle_rule_call_result({r2, Rule_2_result}, Filter, TagPath1, Tag,
+ Level, Optional1, Args, Opts);
+handle_rule_call_result({r3, {Result, NewOpts}}, Filter, TagPath1, Tag, Level,
+ Optional1, Args, _Opts) ->
+ handle_rule_call_result({r2, Result}, Filter, TagPath1, Tag, Level,
+ Optional1, Args, NewOpts);
+handle_rule_call_result({_, {func, F}}, _Filter, _TagPath1, _Tag, _Level,
+ _Optional1, Args, Opts) ->
+ {F(Args), Opts};
+handle_rule_call_result({_, {'EXIT', Why}}, _Filter, TagPath1, _Tag, Level,
+ Optional1, Args, Opts) ->
+ report_error(TagPath1, Why, {Level, Optional1, Args}),
+ {[], Opts};
+handle_rule_call_result({_, {drop, Str}}, _Filter, _TagPath1, _Tag, _Level,
+ _Optional1, _Args, Opts) ->
+ {[Str], Opts};
+handle_rule_call_result({_, {newargs, NewArgs}}, Filter, TagPath1, _Tag, _Level,
+ _Optional1, _Args, Opts) ->
+ {List, NewOpts} = pp_list(NewArgs, TagPath1, 1, Filter, Opts),
+ {[List], NewOpts};
+handle_rule_call_result({_, {newargs, Before, NewArgs, After}}, Filter, TagPath1, _Tag, _Level,
+ _Optional1, _Args, Opts) ->
+ {List, NewOpts} = pp_list(NewArgs, TagPath1, 1, Filter, Opts),
+ {[Before, List, After], NewOpts};
+handle_rule_call_result({_, {Before, After}}, Filter, TagPath1, _Tag, _Level,
+ _Optional1, Args, Opts) when is_list(Before) ->
+ {List, NewOpts} = pp_list(Args, TagPath1, 1, Filter, Opts),
+ {[Before, List, After], NewOpts}.
+
+pp_list([H|T], TagPath, Level, Rules, Opts) ->
+ {Hpp, Hopts} = pp(H, TagPath, Level, Rules, Opts),
+ {Tpp, Tops} = pp_list(T, TagPath, Level + 1, Rules, Hopts),
+ {[Hpp|Tpp], Tops};
+pp_list([], _, _, _, Opts) ->
+ {[], Opts}.
+
+reduce_optional([{_, _, H}|T]) -> [H|reduce_optional(T)];
+reduce_optional([]) -> [].
+
+report_error(Arg1, Cause, Arg2) ->
+ [Tag|_] = Arg1,
+ docb_util:message(error,
+ "Formatting trouble in ~p: ~p", [Tag, Cause]),
+ docb_util:message(error, "Failure in rule(~p, ~p)", [Arg1, Arg2]).
+
+%%----------------------------------------------------------------------
+
+%% include_file(File, Tag) -> {ok, String} | error
+include_file(File, Tag) ->
+ include(File, "%S" ++ Tag, "%E" ++ Tag).
+
+%% include(File, StartTag, StopTag) -> {ok, String} | error
+include(File, "", "") ->
+ case file:open(File, [read]) of
+ {ok, Fd} ->
+ String = include_all(Fd),
+ file:close(Fd),
+ {ok, String};
+ _ ->
+ docb_util:message(error,
+ "Include file ~s not found", [File]),
+ error
+ end;
+include(File, StartTag, StopTag) ->
+ case file:open(File, [read]) of
+ {ok, Fd} ->
+ String = extract(File, Fd, StartTag, StopTag, searching),
+ file:close(Fd),
+ {ok, lists:flatten(String)};
+ _ ->
+ docb_util:message(error,
+ "Include file ~s not found", [File]),
+ error
+ end.
+
+include_all(Fd) ->
+ case io:get_line(Fd, '') of
+ eof ->
+ [];
+ ListOfChars ->
+ lists:append(ListOfChars, include_all(Fd))
+ end.
+
+extract(File, Fd, StartTag, StopTag, State) ->
+ Line=io:get_line(Fd, ''),
+ extract(File, Fd, StartTag, StopTag, State, Line).
+
+extract(File, _, _, _, _, eof) ->
+ docb_util:message(error,
+ "Premature end of file in include file ~p",
+ [File]),
+ [];
+extract(File, Fd, StartTag, StopTag, searching, Line) ->
+ case regexp:match(Line, "^" ++ StartTag) of
+ {match, _Start, _Length} ->
+ extract(File, Fd, StartTag, StopTag, copying);
+ nomatch ->
+ extract(File, Fd, StartTag, StopTag, searching);
+ {error, _Error} ->
+ docb_util:message(error, "Bad syntax in ~s", [File]),
+ []
+ end;
+extract(File, Fd, StartTag, StopTag, copying, Line) ->
+ case regexp:match(Line, "^" ++ StopTag) of
+ {match, _Start, _Length} ->
+ [];
+ nomatch ->
+ [Line|extract(File, Fd, StartTag, StopTag, copying)];
+ {error, _Error} ->
+ docb_util:message(error, "Bad syntax in ~s", [File]),
+ []
+ end.
+
+%%----------------------------------------------------------------------
+
+eval_str(Str) ->
+ case lib:eval_str(Str) of
+ {error, Report} ->
+ docb_util:message(error,
+ "ErlEval failed: ~s (~s)", [Str, Report]);
+ {ok, S} ->
+ io_lib:format("~p~n", [S])
+ end.
diff --git a/lib/docbuilder/src/docb_pretty_format.erl b/lib/docbuilder/src/docb_pretty_format.erl
new file mode 100644
index 0000000000..0c4fb0507b
--- /dev/null
+++ b/lib/docbuilder/src/docb_pretty_format.erl
@@ -0,0 +1,177 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_pretty_format).
+
+-export([term/1]).
+
+%% pretty_format:term(Term) -> PNF list of characters
+%%
+%% Note: this is usually used in expressions like:
+%% io:format('~s\n', [pretty_format:term(Term)]).
+%%
+%% Uses the following simple heuristics:
+%%
+%% 1) Simple tuples are printed across the page.
+%% (Simple means *all* the elements are "flat")
+%% 2) The complex tuple {Arg1, Arg2, Arg3,....} is printed thus:
+%% {Arg1,
+%% Arg2,
+%% Arg3,
+%% ...}
+%% 3) Lists are treated as for tuples.
+%% 4) Lists of printable characters are treated as strings.
+%%
+%% This method seems to work reasonable well for {Tag, ...} type
+%% data structures.
+term(Term) ->
+ element(2, term(Term, 0)).
+
+%% pretty_format:term(Term, Indent} -> {Indent', Chars}
+%% Format <Term> -- use <Indent> to indent the *next* line.
+%% Note: Indent' is a new indentaion level (sometimes printing <Term>
+%% the next line to need an "extra" indent!).
+term([], Indent) ->
+ {Indent, [$[,$]]};
+term(L, Indent) when list(L) ->
+ case is_string(L) of
+ true ->
+ {Indent, io_lib:write_string(L)};
+ false ->
+ case complex_list(L) of
+ true ->
+ write_complex_list(L, Indent);
+ false ->
+ write_simple_list(L, Indent)
+ end
+ end;
+term(T, Indent) when tuple(T) ->
+ case complex_tuple(T) of
+ true ->
+ write_complex_tuple(T, Indent);
+ false ->
+ write_simple_tuple(T, Indent)
+ end;
+term(A, Indent) ->
+ {Indent, io_lib:write(A)}.
+
+%% write_simple_list([H|T], Indent) -> {Indent', Chars}
+write_simple_list([H|T], Indent) ->
+ {_, S1} = term(H, Indent),
+ {_, S2} = write_simple_list_tail(T, Indent),
+ {Indent, [$[,S1|S2]}.
+
+write_simple_list_tail([H|T], Indent) ->
+ {_, S1} = term(H, Indent),
+ {_, S2} = write_simple_list_tail(T, Indent),
+ {Indent, [$,,S1| S2]};
+write_simple_list_tail([], Indent) ->
+ {Indent, "]"};
+write_simple_list_tail(Other, Indent) ->
+ {_, S} = term(Other, Indent),
+ {Indent, [$|,S,$]]}.
+
+%% write_complex_list([H|T], Indent) -> {Indent', Chars}
+write_complex_list([H|T], Indent) ->
+ {I1, S1} = term(H, Indent+1),
+ {_, S2} = write_complex_list_tail(T, I1),
+ {Indent, [$[,S1|S2]}.
+
+write_complex_list_tail([H|T], Indent) ->
+ {I1, S1} = term(H, Indent),
+ {_, S2} = write_complex_list_tail(T, I1),
+ {Indent, [$,,nl_indent(Indent),S1,S2]};
+write_complex_list_tail([], Indent) ->
+ {Indent, "]"};
+write_complex_list_tail(Other, Indent) ->
+ {_, S} = term(Other, Indent),
+ {Indent, [$|,S,$]]}.
+
+%% complex_list(List) -> true | false
+%% Returns true if the list is complex otherwise false.
+complex_list([]) ->
+ false;
+complex_list([H|T]) when is_list(H) ->
+ case is_string(H) of
+ true ->
+ complex_list(T);
+ false ->
+ true
+ end;
+complex_list([H|_]) when is_tuple(H) -> true;
+complex_list(_) -> false.
+
+%% complex_tuple(Tuple) -> true | false
+%% Returns true if the tuple is complex otherwise false.
+complex_tuple(T) ->
+ complex_list(tuple_to_list(T)).
+
+%% write_simple_tuple(Tuple, Indent} -> {Indent', Chars}
+write_simple_tuple({}, Indent) ->
+ {Indent, "{}"};
+write_simple_tuple(Tuple, Indent) ->
+ {_, S} = write_simple_tuple_args(tuple_to_list(Tuple), Indent),
+ {Indent, [${, S, $}]}.
+
+write_simple_tuple_args([X], Indent) ->
+ term(X, Indent);
+write_simple_tuple_args([H|T], Indent) ->
+ {_, SH} = term(H, Indent),
+ {_, ST} = write_simple_tuple_args(T, Indent),
+ {Indent, [SH, $,, ST]}.
+
+%% write_complex_tuple(Tuple, Indent} -> {Indent', Chars}
+write_complex_tuple(Tuple, Indent) ->
+ [H|T] = tuple_to_list(Tuple),
+ {I1, SH} = term(H, Indent+2),
+ {_, ST} = write_complex_tuple_args(T, I1),
+ {Indent, [${, SH, ST, $}]}.
+
+write_complex_tuple_args([X], Indent) ->
+ {_, S} = term(X, Indent),
+ {Indent, [$,, nl_indent(Indent), S]};
+write_complex_tuple_args([H|T], Indent) ->
+ {I1, SH} = term(H, Indent),
+ {_, ST} = write_complex_tuple_args(T, I1),
+ {Indent, [$,, nl_indent(Indent) , SH, ST]};
+write_complex_tuple_args([], Indent) ->
+ {Indent, []}.
+
+%% utilities
+
+nl_indent(I) when I >= 0 ->
+ ["\n"|indent(I)];
+nl_indent(_I) ->
+ [$ ].
+
+indent(I) when I >= 8 ->
+ [$\t|indent(I-8)];
+indent(I) when I > 0 ->
+ [$ |indent(I-1)];
+indent(_) ->
+ [].
+
+is_string([9|T]) ->
+ is_string(T);
+is_string([10|T]) ->
+ is_string(T);
+is_string([H|T]) when H >31, H < 127 ->
+ is_string(T);
+is_string([]) ->
+ true;
+is_string(_) ->
+ false.
diff --git a/lib/docbuilder/src/docb_tr_application2html.erl b/lib/docbuilder/src/docb_tr_application2html.erl
new file mode 100644
index 0000000000..4084cfe6ba
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_application2html.erl
@@ -0,0 +1,288 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_application2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(File, {application, _Attrs, [Header|Rest]}, Opts0) ->
+
+ %% Extract header data
+ Title = docb_html_util:extract_header_data(title, Header),
+
+ case docb_util:an_option(kwicindex_only, Opts0) of
+ false ->
+
+ %% Create the framing HTML document
+ OutFile = docb_util:outfile(File++"_frame", ".html", Opts0),
+ case file:open(OutFile, [write]) of
+ {ok, Fd} ->
+ io:format(Fd,
+"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"
+\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">
+<!-- This document was generated using DocBuilder-" ++ docb_util:version() ++ " -->
+<html>
+<head>
+ <title>~s</title>
+ " ++ docb_util:html_snippet(head, Opts0) ++ "
+</head>
+<frameset cols=\"150, *\">
+ <frame src=\"~s\" name=\"toc\">
+ <frame src=\"~s\" name=\"document\">
+ <noframes>
+ <body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\"
+ vlink=\"#FF00FF\" alink=\"#FF0000\">
+ <p>This documentation requires a browser that can handle frames</p>
+ </body>
+ </noframes>
+</frameset>
+</html>
+",
+ [Title,
+ File++".html", File++"_first.html"]),
+ file:close(Fd)
+ end,
+
+ %% Create the front HTML document
+ docb_main:transform(first, html, Opts0, File ++ "_first",
+ {first, [], [Header|Rest]});
+
+ true ->
+ ok
+ end,
+
+ %% Extract files to include
+ Files = case Rest of
+ [{description, _, _}|NewRest] ->
+ lists:map(fun({include, [{_, _, F}], _}) ->filename:rootname(F) end,
+ NewRest);
+ [{include, _, _}|_NewRest] ->
+ lists:map(fun({include, [{_, _, F}], _}) -> filename:rootname(F) end,
+ Rest)
+ end,
+
+ %% Concat all reference manuals into a *big* parse tree
+ ConcatTree = concat_files(Files, Opts0),
+
+ %% Create the kwic index src file to be put in outdir
+ docb_main:transform(refs, kwic, Opts0, File, {refs,[],ConcatTree}),
+
+ case docb_util:an_option(kwicindex_only, Opts0) of
+ false ->
+
+ %% Create an index
+ docb_main:transform(index, html, Opts0, File ++ "_index",
+ {index, [], [Header|ConcatTree]}),
+ %% Create a cite dictionary
+ docb_main:transform(cite, html, Opts0, File ++ "_cite",
+ {cite, [], [Header|ConcatTree]}),
+
+ %% Create a term dictionary
+ docb_main:transform(term, html, Opts0, File ++ "_term",
+ {term, [], [Header|ConcatTree]}),
+
+ %% Transform each reference page
+ case docb_util:an_option(framework_only, Opts0) of
+ true ->
+ ok;
+ false ->
+ transform_refs(Files,
+ [dict,{part_application,File}|Opts0])
+ end;
+ true ->
+ ok
+ end,
+
+ %% Find all fascicules to be put in the top menu of the table of
+ %% contents
+ Ext = docb_util:lookup_option(src_type, Opts0),
+ Opts2 =
+ case filelib:is_regular("fascicules"++Ext) of
+ true ->
+ case docb_main:parse1("fascicules", Opts0) of
+ {ok, Parse} ->
+ FascData = get_fasc_data(Parse),
+ case lists:keysearch(File, 1, FascData) of
+ {value, {_, _, "YES", _}} ->
+ OrigFile =
+ docb_util:outfile(File++"_frame",
+ ".html", Opts0),
+ EntryFile =
+ docb_util:outfile("index",
+ ".html",Opts0),
+ docb_util:message(info,
+ "Copying ~s to ~s",
+ [OrigFile,EntryFile]),
+ file:copy(OrigFile, EntryFile);
+ _ ->
+ ok
+ end,
+ [{fascdata, FascData}| Opts0];
+ errors ->
+ %% Do not bother
+ docb_util:message(
+ warning,
+ "fascicules~s could not be parsed,"
+ " no index.html created",
+ [Ext]),
+ Opts0
+ end;
+ false ->
+ %% do not bother
+ docb_util:message(warning,
+ "fascicules~s not found, "
+ "no index.html created",
+ [Ext]),
+ Opts0
+ end,
+
+ %% Create ToC parse tree
+ {{toc, [{"FILE", "CDATA", File}], [Header|make_toc(ConcatTree)]},
+ Opts2}.
+
+concat_files(Files, Opts) ->
+ concat_files(Files, [], Opts).
+
+concat_files([File|Rest], Body, Opts) ->
+ case docb_main:parse1(File, Opts) of
+ {ok, Parse} ->
+ NewParse=expand([Parse], File),
+ %% Remove the reference manual header
+ [{Ref, [], [_Hdr| NewBody]}] = NewParse,
+ RefParse = [{Ref, [], NewBody}],
+ lists:append(Body, concat_files(Rest, RefParse, Opts));
+ errors ->
+ errors
+ end;
+concat_files([], Body, _Opts) ->
+ Body.
+
+expand([], _) ->
+ [];
+expand([{pcdata, Attrs, More}|Rest], File) ->
+ [{pcdata, Attrs, More}|expand(Rest, File)];
+expand([{name, Attrs, More}|Rest], File) ->
+ [{name, [{"FILE", "CDATA", File}|Attrs], More}|expand(Rest, File)];
+expand([{module, Attrs, More}|Rest], File) ->
+ [{module, [{"FILE", "CDATA", File}|Attrs], More}|expand(Rest,File)];
+expand([{file, Attrs, More}|Rest], File) ->
+ [{file, [{"FILE", "CDATA", File}|Attrs], More}|expand(Rest, File)];
+expand([{app, Attrs, More}|Rest], File) ->
+ [{app, [{"FILE", "CDATA", File}|Attrs], More}|expand(Rest, File)];
+expand([{lib, Attrs, More}|Rest], File) ->
+ [{lib, [{"FILE", "CDATA", File}|Attrs], More}|expand(Rest, File)];
+expand([{com, Attrs, More}|Rest], File) ->
+ [{com, [{"FILE", "CDATA", File}|Attrs], More}|expand(Rest, File)];
+expand([{Tag, Attrs, More}|Rest], File) ->
+ [{Tag, Attrs, expand(More, File)}|expand(Rest, File)].
+
+transform_refs([], _) ->
+ ok;
+transform_refs([File|Rest], Opts) ->
+ Ext = docb_util:lookup_option(src_type, Opts),
+ docb_util:message(info, "Processing \"~s~s\"", [File, Ext]),
+ docb_main:process(File, Opts),
+ transform_refs(Rest, Opts).
+
+make_toc([]) ->
+ [];
+make_toc([{pcdata, _Attrs, _More}|Rest]) ->
+ make_toc(Rest);
+make_toc([{module, Attrs, More}|Rest]) ->
+ [{module, Attrs, More}|make_toc(Rest)];
+make_toc([{file, Attrs, More}|Rest]) ->
+ [{file, Attrs, More}|make_toc(Rest)];
+make_toc([{app, Attrs, More}|Rest]) ->
+ [{app, Attrs, More}|make_toc(Rest)];
+make_toc([{lib, Attrs, More}|Rest]) ->
+ [{lib, Attrs, More}|make_toc(Rest)];
+make_toc([{com, Attrs, More}|Rest]) ->
+ [{com, Attrs, More}|make_toc(Rest)];
+make_toc([{_Tag, _Attrs, More}|Rest]) ->
+ lists:append(make_toc(More), make_toc(Rest)).
+
+rule([module|_], {_, [File], _}) ->
+ {"<small><a target=\"document\" href=\"" ++
+ docb_html_util:make_anchor_href(File) ++ "\">",
+ "</a></small><br/>\n"};
+
+rule([file|_], {_, [File], _}) ->
+ {"<small><a target=\"document\" href=\"" ++
+ docb_html_util:make_anchor_href(File) ++ "\">",
+ "</a></small><br/>\n"};
+
+rule([app|_], {_, [File], _}) ->
+ {"<small><a target=\"document\" href=\"" ++
+ docb_html_util:make_anchor_href(File) ++ "\">",
+ "</a></small><br/>\n"};
+
+rule([lib|_], {_, [File], _}) ->
+ {"<small><a target=\"document\" href=\"" ++
+ docb_html_util:make_anchor_href(File) ++ "\">",
+ "</a></small><br/>\n"};
+
+rule([com|_], {_, [File], _}) ->
+ {"<small><a target=\"document\" href=\"" ++
+ docb_html_util:make_anchor_href(File) ++ "\">",
+ "</a></small><br/>\n"};
+
+rule([pcdata|_], {_, _, Data}) ->
+ {drop, docb_html_util:pcdata_to_html(Data)};
+
+rule(_, _) ->
+ {drop, ""}.
+
+rule([toc|_], {_Depth, [File], [Header|_]}, Opts) ->
+ case docb_util:lookup_option(fascdata, Opts) of
+ false ->
+ {{docb_html_layout:application_toc_top(
+ docb_html_util:all_header_data(Header),
+ File, Opts),
+ docb_html_layout:part_toc_bot()}, Opts};
+ FascData ->
+ HRefTexts =
+ lists:map(
+ fun({_File, HRef, _Entry, PCText}) ->
+ {HRef, docb_html_util:pcdata_to_html(PCText)}
+ end,
+ FascData),
+ {{docb_html_layout:application_toc_top(
+ docb_html_util:all_header_data(Header),
+ File, Opts, HRefTexts) ++ "\n",
+ docb_html_layout:part_toc_bot()}, Opts}
+ end.
+
+%% Returns: [{File, HRef, Entry, Text}].
+get_fasc_data({fascicules, _, Fascs}) ->
+ lists:map(
+ fun({fascicule, Atts, Trees}) ->
+ AVals = get_avals(Atts),
+ PCText = get_pc_text(Trees),
+ list_to_tuple(lists:append([AVals, [PCText]]))
+ end,
+ Fascs).
+
+get_avals(Atts) ->
+ lists:map(fun(Tuple) ->
+ element(3, Tuple) end,
+ Atts).
+
+get_pc_text([{pcdata, _, Text}]) ->
+ Text.
diff --git a/lib/docbuilder/src/docb_tr_appref2html.erl b/lib/docbuilder/src/docb_tr_appref2html.erl
new file mode 100644
index 0000000000..6b4cc0f815
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_appref2html.erl
@@ -0,0 +1,48 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_appref2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+%% Transform the parse tree. Header data is stored in an extra
+%% argument to make life easier later on.
+transform(_File, {appref,_,[Header|Rest]}, _Opts) ->
+ Data = [{[], [], docb_html_util:all_header_data(Header)}],
+ {appref, Data, [{header,[],[]}|Rest]}.
+
+rule([header|_],_) ->
+ {drop, ""};
+
+rule([app|_],_) ->
+ {"\n<h3>APPLICATION</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([appsummary|_],_) ->
+ {"\n<h3>APPLICATION SUMMARY</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule(TagHistory, TagBody) ->
+ docb_html_ref:rule(TagHistory,TagBody).
+
+rule([appref|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:ref_top(Data, Opts),
+ docb_html_layout:ref_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html_ref:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_chapter2html.erl b/lib/docbuilder/src/docb_tr_chapter2html.erl
new file mode 100644
index 0000000000..185cdc7cc3
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_chapter2html.erl
@@ -0,0 +1,59 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_chapter2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(File, {chapter,_,[Header|Rest]}, Opts) ->
+ Data = [{[], [], docb_html_util:all_header_data(Header)}],
+ Tree = {chapter, Data, [{header,[],[]}|Rest]},
+ ChapterLevel =
+ case docb_util:lookup_option(number, Opts) of
+ false -> none;
+ Value -> Value
+ end,
+ docb_html_util:number(Tree, ChapterLevel, File).
+
+rule([header|_], _) ->
+ {drop, ""};
+
+rule([toc|_], {_,_,ToC}) ->
+ {drop,
+ "\n<h3>Table of Contents</h3>\n" ++
+ docb_html_util:format_toc(ToC) ++ "\n"};
+
+rule([section|_], _) ->
+ {"", ""};
+
+rule([title|Rest], {_,[Number,_File], [{pcdata,_,Title}]}) ->
+ N = integer_to_list(docb_html_util:count_sections(Rest)+1),
+ {drop,"\n<h" ++ N ++ ">" ++ Number ++ " " ++
+ docb_html_util:pcdata_to_html(Title) ++ "</h" ++ N ++ ">\n"};
+
+rule(TagHistory, TagBody) ->
+ docb_html:rule(TagHistory, TagBody).
+
+rule([chapter|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:chapter_top(Data, Opts),
+ docb_html_layout:chapter_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_cite2html.erl b/lib/docbuilder/src/docb_tr_cite2html.erl
new file mode 100644
index 0000000000..4ecbfa4e91
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_cite2html.erl
@@ -0,0 +1,136 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_cite2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(_File, Tree, Opts) ->
+ purge(Tree, Opts).
+
+purge({Tag, Attrs, [Header|Body]}, Opts) ->
+ CiteList = case docb_util:lookup_option({defs,cite}, Opts) of
+ false -> [];
+ Value -> Value
+ end,
+ B1 = purge_body(Body, CiteList),
+ B2 = lists:ukeysort(2, B1),
+ {Tag, Attrs, [Header|B2]}.
+
+purge_body([], _) ->
+ [];
+purge_body([{pcdata,_Attrs,_More}|Rest], CiteList) ->
+ purge_body(Rest, CiteList);
+purge_body([{cite,[{"ID","CDATA",ID}],More}|Rest], CiteList) ->
+ case lists:keysearch(ID, 1, CiteList) of
+ false ->
+ [{cite, [{"NAME","CDATA",ID}, {"ID","CDATA",ID}], More}|
+ purge_body(Rest, CiteList)];
+ {value, {ID, Name, _Description, _Responsible}} ->
+ [{cite, [{"NAME","CDATA",Name}, {"ID","CDATA",ID}], More}|
+ purge_body(Rest, CiteList)];
+ {value, {ID, Name, _Description}} ->
+ [{cite, [{"NAME","CDATA",Name}, {"ID","CDATA",ID}], More}|
+ purge_body(Rest, CiteList)]
+ end;
+purge_body([{_Tag,_Attrs,More}|Rest], CiteList) ->
+ lists:append(purge_body(More, CiteList),
+ purge_body(Rest, CiteList)).
+
+rule([header|_], _) ->
+ {drop, ""};
+
+rule(_, _) ->
+ {drop, ""}.
+
+rule([cite|_], {_,[],[Header]}, Opts) ->
+ HeaderData = docb_html_util:all_header_data(Header),
+ {{docb_html_layout:chapter_top(HeaderData, Opts) ++
+ "\n<center><h1>Bibliography</h1></center>\n",
+ docb_html_layout:chapter_bot(Opts)}, Opts};
+
+rule([cite|_], {_,[],[Header|_]}, Opts) ->
+ HeaderData = docb_html_util:all_header_data(Header),
+ {{docb_html_layout:chapter_top(HeaderData, Opts) ++
+ "\n<center><h1>Bibliography</h1></center>\n<dl>\n",
+ "\n</dl>\n" ++ docb_html_layout:chapter_bot(Opts)}, Opts};
+
+rule([cite|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:chapter_top(Data, Opts) ++
+ "\n<center><h1>Bibliography</h1></center>\n<dl>\n",
+ "\n</dl>\n" ++ docb_html_layout:chapter_bot(Opts)}, Opts};
+
+rule([cite|T], {A, B, [{citedef,C,
+ [{ctitle, [], [{pcdata,[],CTitle}]},
+ {cauthor, [], [{pcdata,[],CAuthor}]},
+ {chowpublished, [],
+ [{pcdata,[],Chowpublished}]}]}]}, Opts) ->
+ CiteDef = CTitle ++ " " ++ CAuthor ++ " " ++ Chowpublished,
+ rule([cite|T], {A,B,[{citedef,C,[{pcdata,[],CiteDef}]}]}, Opts);
+
+rule([cite|_], {_,[Name,ID], [{citedef,[],[{pcdata,[],Def}]}]}, Opts) ->
+ CiteList =
+ case docb_util:lookup_option({defs,cite}, Opts) of
+ false -> [];
+ Value -> Value
+ end,
+ case lists:keysearch(ID, 1, CiteList) of
+ false ->
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ ID ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Def) ++ "\n</dd>\n"}, Opts};
+ {value, {ID, Name, Description, _Responsible}} ->
+ docb_util:message(warning,
+ "Global cite ~s overriding local", [ID]),
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"},
+ Opts};
+ {value, {ID, Name, Description}} ->
+ docb_util:message(warning,
+ "Global cite ~s overriding local", [ID]),
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"}, Opts}
+ end;
+
+rule([cite|_], {_,[Name,ID],_}, Opts) ->
+ CiteList =
+ case docb_util:lookup_option({defs,cite}, Opts) of
+ false -> [];
+ Value -> Value
+ end,
+ case lists:keysearch(ID, 1, CiteList) of
+ false ->
+ docb_util:message(error,
+ "The cite ~s has no definition", [ID]),
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ ID ++ "</strong></a></dt>\n<dd>" ++
+ "??" ++ "\n</dd>\n"}, Opts};
+ {value, {ID, Name, Description, _Responsible}} ->
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"},
+ Opts};
+ {value, {ID, Name, Description}} ->
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"}, Opts}
+ end.
diff --git a/lib/docbuilder/src/docb_tr_comref2html.erl b/lib/docbuilder/src/docb_tr_comref2html.erl
new file mode 100644
index 0000000000..25207dccb4
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_comref2html.erl
@@ -0,0 +1,46 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_comref2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(_File, {comref,_,[Header|Rest]}, _Opts) ->
+ Data = [{[], [], docb_html_util:all_header_data(Header)}],
+ {comref, Data, [{header,[],[]}|Rest]}.
+
+rule([header|_],_) ->
+ {drop,""};
+
+rule([com|_],_) ->
+ {"\n<h3>COMMAND</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([comsummary|_],_) ->
+ {"\n<h3>COMMAND SUMMARY</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule(TagHistory, TagBody) ->
+ docb_html_ref:rule(TagHistory, TagBody).
+
+rule([comref|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:ref_top(Data, Opts),
+ docb_html_layout:ref_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html_ref:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_cref2html.erl b/lib/docbuilder/src/docb_tr_cref2html.erl
new file mode 100644
index 0000000000..06748b8c57
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_cref2html.erl
@@ -0,0 +1,61 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_cref2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(_File, {cref,_,[Header|Rest]}, _Opts) ->
+ Data = [{[], [], docb_html_util:all_header_data(Header)}],
+ {cref, Data, [{header,[],[]}|Rest]}.
+
+rule([header|_],_) ->
+ {drop, ""};
+
+rule([ret|_],_) ->
+ {"",""};
+
+rule([nametext|_],_) ->
+ {" ",""};
+
+rule([name|_], {_,_,[_Ret,{nametext,[],[{pcdata,[],Name}]}]}) ->
+ FName = lists:flatten(docb_html_util:pcdata_to_html(Name)),
+ TName = docb_util:trim(FName),
+ CAnchor = docb_util:fknidx(TName, "/"),
+ {"<A NAME=\"" ++ CAnchor ++ "\"><STRONG><CODE>",
+ "</CODE></STRONG></A><BR>\n"};
+rule([name|T], {I,As,[Ret,{pcdata,[],Name}]}) -> % For SGML DTD
+ rule([name|T], {I,As,[Ret,{nametext,[],[{pcdata,[],Name}]}]});
+
+rule([lib|_],_) ->
+ {"\n<H3>C LIBRARY</H3>\n<DIV CLASS=REFBODY>\n","\n</DIV>\n"};
+
+rule([libsummary|_],_) ->
+ {"\n<H3>C LIBRARY SUMMARY</H3>\n<DIV CLASS=REFBODY>\n","\n</DIV>\n"};
+
+rule(TagHistory, TagBody) ->
+ docb_html_ref:rule(TagHistory, TagBody).
+
+rule([cref|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:ref_top(Data, Opts),
+ docb_html_layout:ref_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html_ref:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_erlref2html.erl b/lib/docbuilder/src/docb_tr_erlref2html.erl
new file mode 100644
index 0000000000..b264c46bce
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_erlref2html.erl
@@ -0,0 +1,46 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_erlref2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(_File, {erlref,_,[Header|Rest]}, _Opts) ->
+ Data = [{[], [], docb_html_util:all_header_data(Header)}],
+ {erlref, Data, [{header,[],[]}|Rest]}.
+
+rule([header|_],_) ->
+ {drop, ""};
+
+rule([module|_],_) ->
+ {"\n<h3>MODULE</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([modulesummary|_],_) ->
+ {"\n<h3>MODULE SUMMARY</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule(TagHistory, TagBody) ->
+ docb_html_ref:rule(TagHistory, TagBody).
+
+rule([erlref|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:ref_top(Data, Opts),
+ docb_html_layout:ref_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html_ref:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_fileref2html.erl b/lib/docbuilder/src/docb_tr_fileref2html.erl
new file mode 100644
index 0000000000..60280543a8
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_fileref2html.erl
@@ -0,0 +1,46 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_fileref2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(_File, {fileref,_,[Header|Rest]}, _Opts) ->
+ Data = [{[], [], docb_html_util:all_header_data(Header)}],
+ {fileref, Data, [{header,[],[]}|Rest]}.
+
+rule([header|_],_) ->
+ {drop, ""};
+
+rule([file|_],_) ->
+ {"\n<h3>FILE</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule([filesummary|_],_) ->
+ {"\n<h3>FILE SUMMARY</h3>\n<div class=\"REFBODY\">\n","\n</div>\n"};
+
+rule(TagHistory, TagBody) ->
+ docb_html_ref:rule(TagHistory, TagBody).
+
+rule([fileref|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:ref_top(Data, Opts),
+ docb_html_layout:ref_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html_ref:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_first2html.erl b/lib/docbuilder/src/docb_tr_first2html.erl
new file mode 100644
index 0000000000..e9ecbe73cb
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_first2html.erl
@@ -0,0 +1,46 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_first2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(_File, Tree, _Opts) ->
+ Tree.
+
+rule([header|_], _) ->
+ {drop, ""};
+
+rule([description|_], _) ->
+ {"", ""};
+
+rule([include|_], _) ->
+ {drop, ""};
+
+rule(TagHistory, TagBody) ->
+ docb_html:rule(TagHistory, TagBody).
+
+rule([first|_], {_,[],[Header|_]}, Opts) ->
+ HeaderData = docb_html_util:all_header_data(Header),
+ {{docb_html_layout:first_top(HeaderData, Opts),
+ docb_html_layout:first_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_index2html.erl b/lib/docbuilder/src/docb_tr_index2html.erl
new file mode 100644
index 0000000000..bbf419f3ef
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_index2html.erl
@@ -0,0 +1,197 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_index2html).
+
+-export([extension/0, transform/3, rule/2]).
+
+extension() ->
+ ".html".
+
+transform(_File0, {index, Attrs, [Header| Trees0]}, _Opts) ->
+ Trees1 = prune_flat(Trees0, false),
+ %%
+ %% Now each element of Trees1 is a tree with tag `name' and
+ %% attribute `File', and with one `pcdata' subtree containing the
+ %% name `Func' of the function. We extract `File' and `Func', and
+ %% create new trees.
+ %%
+ %% `File' is attribute CDATA (from an <include file=...>), and
+ %% `Func' is PCDATA.
+ %%
+ FileFuncs =
+ [{File, RefType, Func} ||
+ {name, [{_, _, File}, {_, _, RefType}|_],
+ [{pcdata, [], Func}]}
+ <- Trees1],
+ Trees2 = new_trees(FileFuncs),
+ {index, Attrs, [Header| Trees2]}.
+
+%% Remove all elements except those with tag equal to `name'.
+%% Within `name' remove all elements except those equal to `pcdata'.
+%% Add attribute `filetype' to `name'.
+%%
+%% Refs: appref, comref, cref, erlref, fileref
+prune_flat([{appref, _Attrs, More}| Rest], _) ->
+ RefType = appref,
+ lists:append(prune_flat(More, RefType), prune_flat(Rest, RefType));
+prune_flat([{comref, _Attrs, More}| Rest], _) ->
+ RefType = comref,
+ lists:append(prune_flat(More, RefType), prune_flat(Rest, RefType));
+prune_flat([{cref, _Attrs, More}| Rest], _) ->
+ RefType = cref,
+ lists:append(prune_flat(More, RefType), prune_flat(Rest, RefType));
+prune_flat([{erlref, _Attrs, More}| Rest], _) ->
+ RefType = erlref,
+ lists:append(prune_flat(More, RefType), prune_flat(Rest, RefType));
+prune_flat([{fileref, _Attrs, More}| Rest], _) ->
+ RefType = fileref,
+ lists:append(prune_flat(More, RefType), prune_flat(Rest, RefType));
+prune_flat([{name, [Attr0|Attrs0], More}| Rest], RefType) ->
+ Attrs = [Attr0, {"FILETYPE", "CDATA", RefType} |
+ Attrs0],
+ [{name, Attrs, keep_pcdata(More)}| prune_flat(Rest, RefType)];
+prune_flat([{pcdata, _, _}| Rest], RefType) -> % special case
+ prune_flat(Rest, RefType);
+prune_flat([{_Tag, _Attrs, More}| Rest], RefType) ->
+ lists:append(prune_flat(More, RefType), prune_flat(Rest, RefType));
+prune_flat([], _) ->
+ [].
+
+keep_pcdata(Trees) ->
+ lists:filter(fun({pcdata, _, _}) -> true;
+ (_) -> false
+ end, Trees).
+
+new_trees(FileFuncs) ->
+ Files0 = [{File, RefType} || {File, RefType, _} <- FileFuncs],
+ Files1 = lists:usort(Files0),
+ FileEntries = [{reffile, File, RefType,
+ [Fu || {Fi, _, Fu} <- FileFuncs, Fi == File]}
+ || {File, RefType} <- Files1],
+ FuncEntries = [{func, Func, RefType, [File]}
+ || {File, RefType, Func} <- FileFuncs],
+ Entries = FileEntries ++ FuncEntries,
+ SortedEntries = sort_entries(Entries),
+ %%
+ %% We create a tree according to the following "dtd":
+ %%
+ %% element index (reffile | funcdef)*
+ %% element reffile (funcdef2)*
+ %% attribute reffile filename CDATA
+ %% attribute reffile filetype CDATA
+ %% element funcdef2 PCDATA
+ %% attribute funcdef2 filename CDATA
+ %% attribute funcdef2 filetype CDATA
+ %% element funcdef PCDATA
+ %% attribute funcdef filename CDATA
+ %% attribute funcdef filetype CDATA
+ %%
+ %% For example:
+ %% <index>
+ %% <reffile filename="mymod" filetype="erlref">
+ %% <funcdef2 filename="mymod" filetype="erlref">myfunca(A)</>
+ %% <funcdef2 filename="mymod" filetype="erlref">myfuncb(A, B)</>
+ %% </>
+ %% <funcdef filename="mymod" filetype="erlref">myfunca(A)</>
+ %% <funcdef filename="mymod" filetype="erlref">myfuncb(A, B)</>
+ %% </>
+ lists:flatmap(
+ fun({reffile, File, RefType, Funcs}) ->
+ %% A reffile tree
+ [{reffile, [{"FILENAME", "CDATA", File},
+ {"FILETYPE", "CDATA", RefType}],
+ [{funcdef2, [{"FILENAME", "CDATA", File},
+ {"FILETYPE", "CDATA", RefType}],
+ [{pcdata, [], Func}]} || Func <- Funcs]}];
+ ({func, Func, RefType, [File]}) ->
+ %% A func tree
+ [{funcdef, [{"FILENAME", "CDATA", File},
+ {"FILETYPE", "CDATA", RefType}],
+ [{pcdata, [], Func}]}]
+ end, SortedEntries).
+
+%% Sorting of entries
+%%
+%% The sorting is based on how names of files and functions are
+%% presented (in a browser).
+%% Requires conversion to "function/2" etc.
+%%
+sort_entries(Entries) ->
+ ExpEntries =
+ lists:map(
+ fun({reffile, File, RefType, Funcs}) ->
+ HFile = filename_sort_order(File),
+ HFuncs = [{funcdef_sort_order(Fu, RefType), Fu} || Fu <- Funcs],
+ {reffile, HFile, File, RefType, lists:sort(HFuncs)};
+ ({func, Func, RefType, [File]}) ->
+ HFunc = funcdef_sort_order(Func, RefType),
+ HFile = filename_sort_order(File),
+ {func, HFunc, Func, RefType, [{HFile, File}]}
+ end, Entries),
+ SortedExpEntries = lists:keysort(2, ExpEntries),
+ lists:map(
+ fun({Tag, _HName, Name, RefType, Vals}) ->
+ NVals = lists:map(fun({_HVal, Val}) -> Val end, Vals),
+ {Tag, Name, RefType, NVals}
+ end, SortedExpEntries).
+
+rule([index| _], _) ->
+ {docb_html_layout:index_top("") ++
+ "<dl>\n",
+ "</dl>\n" ++ docb_html_layout:index_bot()};
+
+rule([header| _], _) ->
+ {drop, ""};
+
+rule([reffile| _], {_, [File, _RefType|_], _}) ->
+ CFile = docb_html_util:attribute_cdata_to_html(File),
+ {"<dt><em>" ++ CFile ++ "</em></dt>\n", ""};
+
+rule([funcdef2| _], {_, [File, RefType|_], [{pcdata, [], FuncDef}]}) ->
+ FFuncDef = lists:flatten(docb_html_util:pcdata_to_html(FuncDef)),
+ TFuncDef = docb_util:trim(FFuncDef),
+ ShortFuncDef = docb_html_util:make_funcdef_short(TFuncDef, RefType),
+ HRef =
+ docb_html_util:make_anchor_href_short(File, TFuncDef, RefType),
+ {drop,
+ "<dd><a href=\"" ++ HRef ++ "\"><code>" ++
+ ShortFuncDef ++ "</code></a></dd>\n"};
+
+rule([funcdef| _], {_, [File, RefType|_], [{pcdata, [], FuncDef}]}) ->
+ FFuncDef = lists:flatten(docb_html_util:pcdata_to_html(FuncDef)),
+ TFuncDef = docb_util:trim(FFuncDef),
+ ShortFuncDef = docb_html_util:make_funcdef_short(TFuncDef, RefType),
+ HRef =
+ docb_html_util:make_anchor_href_short(File, TFuncDef, RefType),
+ CFile = docb_html_util:attribute_cdata_to_html(File),
+ {drop,
+ "<dt><code>" ++ ShortFuncDef ++ "</code></dt>\n"
+ "<dd><a href=\"" ++ HRef ++ "\"><em>" ++
+ CFile ++ "</em></a></dd>\n"};
+
+rule(_, _) ->
+ {drop, ""}.
+
+filename_sort_order(File) ->
+ docb_html_util:html_latin1_sort_order(
+ lists:flatten(
+ docb_html_util:attribute_cdata_to_html(string:strip(File)))).
+
+funcdef_sort_order(FuncDef, RefType) ->
+ docb_html_util:html_latin1_sort_order(
+ docb_html_util:make_anchor_name_short(FuncDef, RefType)).
diff --git a/lib/docbuilder/src/docb_tr_part2html.erl b/lib/docbuilder/src/docb_tr_part2html.erl
new file mode 100644
index 0000000000..dd44c4a8df
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_part2html.erl
@@ -0,0 +1,240 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_part2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(File, {part, _Attrs, [Header| Rest]}, Opts0) ->
+
+ %% Extract header data
+ Title = docb_html_util:extract_header_data(title, Header),
+
+ %% Create the framing HTML document
+ OutFile = docb_util:outfile(File ++ "_frame", ".html", Opts0),
+ case file:open(OutFile, [write]) of
+ {ok, Frame} ->
+ io:format(Frame,
+"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">
+<!-- This document was generated using DocBuilder-" ++ docb_util:version() ++ " -->
+<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">
+<head>
+ <title>~s</title>
+ " ++ docb_util:html_snippet(head, Opts0) ++ "
+</head>
+<frameset cols=\"200, *\">
+ <frame src=\"~s\" name=\"toc\"/>
+ <frame src=\"~s\" name=\"document\"/>
+ <noframes>
+ <body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\"
+ vlink=\"#FF00FF\" alink=\"#FF0000\">
+ <p>This documentation requires a browser that can handle frames</p>
+ </body>
+ </noframes>
+</frameset>
+</html>
+",
+ [Title, File ++ ".html", File ++ "_first.html"]),
+ file:close(Frame)
+ end,
+
+ %% Create the front HTML document
+ docb_main:transform(first, html, Opts0, File ++ "_first",
+ {first, [], [Header| Rest]}),
+
+ %% Extract files to include
+ Files =
+ case Rest of
+ [{description, _, _}| NewRest] ->
+ lists:map(fun({include, [{_, _, F}], _}) -> filename:rootname(F) end,
+ NewRest);
+ [{include, _, _}| _NewRest] ->
+ lists:map(fun({include, [{_, _, F}], _}) -> filename:rootname(F) end, Rest)
+ end,
+
+ %% Concat all chapters into a *big* parse tree
+ %% Also transform them to HTML
+ TransformP = not docb_util:an_option(framework_only, Opts0),
+ TOpts = [dict, {part_application,File}],
+ ConcatTree = concat_files(Files, Opts0, TransformP, TOpts),
+
+ %% Create a cites dictionary
+ docb_main:transform(cite, html, Opts0, File ++ "_cite",
+ {cite, [], [Header| ConcatTree]}),
+
+ %% Create a terms dictionary
+ docb_main:transform(term, html, Opts0, File ++ "_term",
+ {term, [], [Header| ConcatTree]}),
+
+ %% Find all fascicules to be put in the top menu of the table of
+ %% contents
+ Ext = docb_util:lookup_option(src_type, Opts0),
+ Opts2 =
+ case filelib:is_regular("fascicules"++Ext) of
+ true ->
+ case docb_main:parse1("fascicules", Opts0) of
+ {ok, Parse} ->
+ FascData = get_fasc_data(Parse),
+ case lists:keysearch(File, 1, FascData) of
+ {value, {_, _, "YES", _}} ->
+ OrigFile =
+ docb_util:outfile(File++"_frame",
+ ".html", Opts0),
+ EntryFile =
+ docb_util:outfile("index",
+ ".html", Opts0),
+ docb_util:message(info,
+ "Copying ~s to ~s",
+ [OrigFile,EntryFile]),
+ file:copy(OrigFile, EntryFile);
+ _ ->
+ ok
+ end,
+ [{fascdata, FascData}| Opts0];
+ errors ->
+ %% do not bother
+ docb_util:message(
+ warning,
+ "fascicules~s could not be parsed,"
+ " no index.html created~n", [Ext]),
+ Opts0
+ end;
+ _ ->
+ %% do not bother
+ docb_util:message(warning,
+ "fascicules~s not found, "
+ "no index.html created~n",
+ [Ext]),
+ Opts0
+ end,
+
+ %% Create ToC parse tree
+ {{toc, [{"FILE", "CDATA", File}], [Header| ConcatTree]}, Opts2}.
+
+concat_files(Files, Opts, TransformP, TOpts) ->
+ Ext = docb_util:lookup_option(src_type, Opts),
+ concat_files(Files, [], 1, Opts, TransformP, TOpts, Ext).
+
+concat_files([File | Rest], Body, ChLevel, Opts, TP, TOpts, Ext) ->
+ case docb_main:parse1(File, Opts) of
+ {ok, Parse} ->
+ {TopTag, Attrs, [Header = {header, _, HeaderContents} | More]} = Parse,
+ {value,{title,_,Title}} = lists:keysearch(title,1,HeaderContents),
+ NewMore = [{section, [], [{title, [], Title}| More]}],
+ NewParse = {TopTag, Attrs, [Header| NewMore]},
+ if
+ TP ->
+ docb_util:message(info,
+ "Processing \"~s~s\"",
+ [File, Ext]),
+ Opts2 =
+ [html, {number,integer_to_list(ChLevel)}] ++
+ TOpts ++ Opts,
+ docb_main:transform(TopTag, html, Opts2, File,
+ NewParse);
+ true -> ignore
+ end,
+ NumberTree =
+ docb_html_util:number(NewParse,
+ integer_to_list(ChLevel), File),
+ {_, [], [_| NewBody]} = NumberTree,
+ lists:append(Body,
+ concat_files(Rest, NewBody, ChLevel+1, Opts,
+ TP, TOpts, Ext));
+ errors ->
+ throw({error,"Parse error when building chapter "++File})
+ end;
+concat_files([], Body, _ChLevel, _Opts, _TP, _TOpts, _Ext) ->
+ Body.
+
+rule([section| _], _) ->
+ {"", ""};
+
+rule(_, _) ->
+ {drop, ""}.
+
+rule([toc| _], {_Depth, [File], [Header| _]}, Opts) ->
+ case docb_util:lookup_option(fascdata, Opts) of
+ false ->
+ {{docb_html_layout:part_toc_top(
+ docb_html_util:all_header_data(Header), File, Opts),
+ docb_html_layout:part_toc_bot()}, Opts};
+ FascData ->
+ HRefTexts =
+ lists:map(
+ fun({_File, HRef, _Entry, PCText}) ->
+ {HRef, docb_html_util:pcdata_to_html(PCText)}
+ end,
+ FascData),
+ {{docb_html_layout:part_toc_top(
+ docb_html_util:all_header_data(Header),
+ File, Opts, HRefTexts),
+ docb_html_layout:part_toc_bot()}, Opts}
+ end;
+
+rule([title| Rest], {_, [Number, File], [{pcdata, _, Title}]}, Opts) ->
+ N = docb_html_util:count_sections(Rest),
+ OutFile = docb_html_util:make_anchor_href(File),
+ if
+ N == 1 ->
+ {{drop,
+ "<hr/>\n<small>" ++
+ Number ++
+ " <a target=\"document\" href=\"" ++ OutFile ++ "#" ++
+ Number ++ "\">" ++
+ docb_html_util:pcdata_to_html(Title) ++
+ "</a></small><br/>\n"},
+ Opts};
+ N < 3 ->
+ {{drop,
+ "<small>" ++
+ Number ++
+ " <a target=\"document\" href=\"" ++ OutFile ++ "#" ++
+ Number ++ "\">" ++
+ docb_html_util:pcdata_to_html(Title) ++
+ "</a></small><br/>\n"},
+ Opts};
+ true ->
+ {{drop, ""}, Opts}
+ end.
+
+%% Parsed fascicules:
+%% {fascicules,[],
+%% [{fascicule, [{"FILE","CDATA","refman"},
+%% {"HREF","CDATA","refman_frame.html"},
+%% {"ENTRY","TOKEN","YES"}],
+%% [{pcdata, [], "" Reference Manual\\n \n"}]},
+%% Returns: [{File, HRef, Entry, Text}].
+get_fasc_data({fascicules, _, Fascs}) ->
+ lists:map(
+ fun({fascicule, Atts, Trees}) ->
+ AVals = get_avals(Atts),
+ PCText = get_pc_text(Trees),
+ list_to_tuple(lists:append([AVals, [PCText]])) end,
+ Fascs).
+
+get_avals(Atts) ->
+ lists:map(fun(Tuple) ->
+ element(3, Tuple) end,
+ Atts).
+
+get_pc_text([{pcdata, _, Text}]) ->
+ Text.
diff --git a/lib/docbuilder/src/docb_tr_refs2kwic.erl b/lib/docbuilder/src/docb_tr_refs2kwic.erl
new file mode 100644
index 0000000000..dc60c329fc
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_refs2kwic.erl
@@ -0,0 +1,156 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_refs2kwic).
+
+-export([extension/0, transform/3, rule/2]).
+
+%% Output parts of a parsetree that contains a series of reference
+%% manual pages. The tags considered are: module, file, app, com and lib
+%% (and their corresponding *summary tags), and name, fsummary, c, em,
+%% ret and pcdata.
+
+extension() ->
+ ".kwc".
+
+transform(File, Tree, Opts) ->
+ {refs, [], Trees} = Tree,
+ FileTree = {srcfile, [], [{pcdata, [], File}]},
+ AppName = docb_util:lookup_option(name, Opts, "unknown"),
+ AppTree = {appname, [], [{pcdata, [], AppName}]},
+ Vsn = docb_util:lookup_option(vsn, Opts, "unknown"),
+ VsnTree = {appvsn, [], [{pcdata, [], Vsn}]},
+ NewTree = {refs, [], [FileTree, AppTree, VsnTree| Trees]},
+ {NewTree, Opts}.
+
+rule([refs|_],_) ->
+ {"%% Automatically generated. Do not edit.\n", ""};
+
+rule([srcfile| _], _) ->
+ {"{srcfile, \"", "\"}.\n"};
+
+rule([appname| _], _) ->
+ {"{appname, \"", "\"}.\n"};
+
+rule([appvsn| _], _) ->
+ {"{appvsn, \"", "\"}.\n"};
+
+rule([erlref|_ ], _) ->
+ {"", ""};
+
+rule([fileref|_ ], _) ->
+ {"", ""};
+
+rule([appref|_ ], _) ->
+ {"", ""};
+
+rule([comref|_ ], _) ->
+ {"", ""};
+
+rule([cref|_ ], _) ->
+ {"", ""};
+
+rule([module| _], {_, [File], _}) ->
+ {drop, "{module, \"" ++ File ++ "\"}.\n"};
+
+rule([file|_], {_, [File], _}) ->
+ {drop, "{file, \"" ++ File ++ "\"}.\n"};
+
+rule([app|_], {_, [File], _}) ->
+ {drop, "{app, \"" ++ File ++ "\"}.\n"};
+
+rule([com|_], {_, [File], _}) ->
+ {drop, "{com, \"" ++ File ++ "\"}.\n"};
+
+rule([lib|_], {_, [File], _}) ->
+ {drop, "{lib, \"" ++ File ++ "\"}.\n"};
+
+rule([modulesummary|_], _) ->
+ {"{modulesummary, \"", "\"}.\n"};
+
+rule([filesummary|_], _) ->
+ {"{filesummary, \"", "\"}.\n"};
+
+rule([appsummary|_], _) ->
+ {"{appsummary, \"", "\"}.\n"};
+
+rule([comsummary|_], _) ->
+ {"{comsummary, \"", "\"}.\n"};
+
+rule([libsummary|_], _) ->
+ {"{libsummary, \"", "\"}.\n"};
+
+rule([funcs|_ ], _) ->
+ {"", ""};
+
+rule([func|_ ], _) ->
+ {"", ""};
+
+rule([name,func,funcs,cref|_], {_,[_File], [_Ret,{pcdata,[],Name}]}) ->
+ FName = lists:flatten(docb_html_util:pcdata_to_html(Name)),
+ TName = docb_util:trim(FName),
+ case catch docb_util:fknidx(TName, "/") of
+ {'EXIT',_} ->
+ {drop, ["{name, \"", escq(TName), "\"}.\n"]};
+ FuncName ->
+ {drop, ["{name, \"", escq(FuncName), "\"}.\n"]}
+ end;
+
+rule([name,func,funcs,erlref|_], {_,[_File], [{pcdata,[],Name}]}) ->
+ FName = lists:flatten(docb_html_util:pcdata_to_html(Name)),
+ TName = docb_util:trim(FName),
+ case catch docb_util:fknidx(TName, "/") of
+ {'EXIT',_} ->
+ {drop, ["{name, \"", escq(TName), "\"}.\n"]};
+ FuncName ->
+ {drop, ["{name, \"", escq(FuncName), "\"}.\n"]}
+ end;
+
+rule([name, func| _], {_, [_File], [{pcdata, [], Name}]}) ->
+ FName = lists:flatten(docb_html_util:pcdata_to_html(Name)),
+ TName = docb_util:trim(FName),
+ Cmd = case string:tokens(TName, " ") of
+ [Cmd0| _] ->
+ Cmd0;
+ _ ->
+ TName
+ end,
+ {drop, ["{name, \"", escq(Cmd), "\"}.\n"]};
+
+rule([fsummary| _], _) ->
+ {"{fsummary, \"", "\"}.\n"};
+
+rule([c, fsummary|_], _) ->
+ {"", ""};
+
+rule([em, fsummary|_], _) ->
+ {"", ""};
+
+rule([pcdata| _], {_, _, Data}) ->
+ FData = lists:flatten(docb_html_util:pcdata_to_html(Data)),
+ Out = lists:map(fun($\n) -> $ ; (C) -> C end, FData),
+ {drop, escq(Out)};
+
+rule(_, _) ->
+ {drop, ""}.
+
+escq(Cs) ->
+ lists:flatmap(fun($") ->
+ "\\\"";
+ (C) -> [C]
+ end,
+ Cs).
diff --git a/lib/docbuilder/src/docb_tr_report2html.erl b/lib/docbuilder/src/docb_tr_report2html.erl
new file mode 100644
index 0000000000..3386ed972a
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_report2html.erl
@@ -0,0 +1,70 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_report2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+%%
+%% File extension
+%%
+
+extension() ->
+ ".html".
+
+transform(File, {report,_,[Header|Rest]}, Opts) ->
+ Data = [{[], [], docb_html_util:all_header_data(Header)}],
+ Tree = {report, Data, [{header,[],[]}|Rest]},
+ ChapterLevel = case docb_util:lookup_option(number, Opts) of
+ false -> none;
+ Value -> Value
+ end,
+ NumberTree = docb_html_util:number(Tree, ChapterLevel, File),
+ options(NumberTree, Opts).
+
+options(Tree, []) ->
+ Tree;
+options(Tree, [_|Rest]) ->
+ options(Tree, Rest).
+
+rule([header|_], _) ->
+ {drop, ""};
+
+rule([toc|_], {_,_,ToC}) ->
+ {drop, "\n<h3>Table of Contents</h3>\n" ++
+ docb_html_util:format_toc(ToC) ++ "\n"};
+
+rule([section|_], _) ->
+ {"", ""};
+
+rule([title|Rest], {_,[Number,_File], [{pcdata,_,Title}]}) ->
+ N = integer_to_list(docb_html_util:count_sections(Rest)+1),
+ {drop, "\n<h" ++ N ++ ">" ++ Number ++ " " ++
+ docb_html_util:pcdata_to_html(Title) ++ "</h" ++ N ++ ">\n"};
+
+rule([erlinclude|_], {_,[File,Tag],_}) ->
+ docb_html_util:erl_include(File, Tag);
+
+rule(TagHistory, TagBody) ->
+ docb_html:rule(TagHistory, TagBody).
+
+rule([report|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:report_top(Data, Opts),
+ docb_html_layout:report_bot(Opts)}, Opts};
+
+rule(TagHistory, TagBody, Opts) ->
+ docb_html:rule(TagHistory, TagBody, Opts).
diff --git a/lib/docbuilder/src/docb_tr_term2html.erl b/lib/docbuilder/src/docb_tr_term2html.erl
new file mode 100644
index 0000000000..0a993cebb1
--- /dev/null
+++ b/lib/docbuilder/src/docb_tr_term2html.erl
@@ -0,0 +1,126 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_tr_term2html).
+
+-export([extension/0, transform/3, rule/2, rule/3]).
+
+extension() ->
+ ".html".
+
+transform(_File, Tree, Opts) ->
+ purge(Tree, Opts).
+
+purge({Tag, Attrs, [Header|Body]}, Opts) ->
+ TermList = case docb_util:lookup_option({defs,term}, Opts) of
+ false -> [];
+ Value -> Value
+ end,
+ B1 = purge_body(Body, TermList),
+ B2 = lists:ukeysort(2, B1),
+ {Tag, Attrs, [Header|B2]}.
+
+purge_body([], _) ->
+ [];
+purge_body([{pcdata,_Attrs,_More}|Rest], TermList) ->
+ purge_body(Rest, TermList);
+purge_body([{term,[{"ID","CDATA",ID}],More}|Rest], TermList) ->
+ case lists:keysearch(ID, 1, TermList) of
+ false ->
+ [{term,[{"NAME","CDATA",ID},{"ID","CDATA",ID}],More}|
+ purge_body(Rest, TermList)];
+ {value, {ID, Name, _Description, _Responsible}} ->
+ [{term,[{"NAME","CDATA",Name},{"ID","CDATA",ID}],More}|
+ purge_body(Rest, TermList)];
+ {value, {ID, Name, _Description}} ->
+ [{term,[{"NAME","CDATA",Name},{"ID","CDATA",ID}],More}|
+ purge_body(Rest, TermList)]
+ end;
+purge_body([{_Tag,_Attrs,More}|Rest], TermList) ->
+ lists:append(purge_body(More, TermList),
+ purge_body(Rest, TermList)).
+
+rule([header|_], _) ->
+ {drop, ""};
+
+rule(_, _) ->
+ {drop, ""}.
+
+rule([term|_], {_,[],[Header]}, Opts) ->
+ {{docb_html_layout:chapter_top(
+ docb_html_util:all_header_data(Header), Opts) ++
+ "\n<center><h1>Glossary</h1></center>\n",
+ docb_html_layout:chapter_bot(Opts)}, Opts};
+
+rule([term|_], {_,[],[Header|_]},Opts) ->
+ {{docb_html_layout:chapter_top(
+ docb_html_util:all_header_data(Header), Opts) ++
+ "\n<center><h1>Glossary</h1></center>\n<dl>\n",
+ "\n</dl>\n" ++ docb_html_layout:chapter_bot(Opts)}, Opts};
+
+rule([term|_], {_,[Data],_}, Opts) ->
+ {{docb_html_layout:chapter_top(Data, Opts) ++
+ "\n<center><h1>Bibliography</h1></center>\n<dl>\n",
+ "\n</dl>\n" ++ docb_html_layout:chapter_bot(Opts)}, Opts};
+
+rule([term|_], {_,[Name,ID],[{termdef,[],[{pcdata,[],Def}]}]}, Opts) ->
+ TermList = case docb_util:lookup_option({defs,term}, Opts) of
+ false -> [];
+ Value -> Value
+ end,
+ case lists:keysearch(ID, 1, TermList) of
+ false ->
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ ID ++ "</strong></a>\n</dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Def) ++ "\n</dd>\n"}, Opts};
+ {value, {ID, Name, Description, _Responsible}} ->
+ docb_util:message(warning,
+ "Global term ~s overriding local", [ID]),
+ {{drop,"\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"},
+ Opts};
+ {value, {ID, Name, Description}} ->
+ docb_util:message(warning,
+ "Global term ~s overriding local", [ID]),
+ {{drop, "\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"}, Opts}
+ end;
+
+rule([term|_], {_,[Name,ID],_}, Opts) ->
+ TermList = case docb_util:lookup_option({defs,term}, Opts) of
+ false -> [];
+ Value -> Value
+ end,
+ case lists:keysearch(ID, 1, TermList) of
+ false ->
+ docb_util:message(error,
+ "The term ~s has no definition", [ID]),
+ {{drop, "\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ ID ++ "</strong></a></dt>\n<dd>" ++
+ "??" ++ "\n</dd>\n"}, Opts};
+ {value, {ID, Name, Description, _Responsible}} ->
+ {{drop, "\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"},
+ Opts};
+ {value, {ID, Name, Description}} ->
+ {{drop, "\n<dt><a name=\"" ++ ID ++ "\">" ++
+ "<strong>" ++ Name ++ "</strong></a></dt>\n<dd>" ++
+ docb_html_util:pcdata_to_html(Description) ++ "\n</dd>\n"}, Opts}
+ end.
diff --git a/lib/docbuilder/src/docb_transform.erl b/lib/docbuilder/src/docb_transform.erl
new file mode 100644
index 0000000000..a432038adf
--- /dev/null
+++ b/lib/docbuilder/src/docb_transform.erl
@@ -0,0 +1,161 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_transform).
+
+-export([file/1, file/2]).
+
+%% file(File) -> ok | {error, Reason}
+%% file(File, Opts) -> ok | {error, Reason}
+%% File = string(), file name with or without ".xml" extension
+%% Opts = [Opt]
+%% Reason = badfile | {badopt, Term}
+file(File0) ->
+ file(File0, []).
+file(File0, RawOpts) ->
+ File = filename:rootname(File0), % without extension
+ Ext = case filename:extension(File0) of
+ ".xml" -> ".xml";
+ ".sgml" -> ".sgml";
+ "" ->
+ %% If the file is given without extension, we try to
+ %% infer if the source file is XML or SGML.
+ %% SGML is supported *internally within OTP* for
+ %% backwards compatibility reasons.
+ case filelib:is_regular(File++".xml") of
+ true -> ".xml";
+ false -> ".sgml"
+ end;
+ _Ext0 -> % this is probably an error...
+ ".xml"
+ end,
+ case filelib:is_regular(File++Ext) of
+ true ->
+ case parse(RawOpts) of
+ {ok, Opts0} ->
+ {ok, Cwd} = file:get_cwd(),
+ Opts = [{src_type,Ext},
+ {src_dir,Cwd},
+ {src_file,File},
+ {{local_defs,term},[]},
+ {{local_defs,cite},[]} | Opts0],
+ case docb_main:process(File, Opts) of
+ errors -> error;
+ ok -> ok
+ end;
+ Error -> % {error, {badopt,Term}}
+ Error
+ end;
+ false ->
+ {error, badfile}
+ end.
+
+parse(RawOpts) ->
+ parse(RawOpts, []).
+
+%% Officially supported options
+
+parse([{html_mod,Module} | RawOpts], Opts) when is_atom(Module) ->
+ parse(RawOpts, [{html_mod,Module} | Opts]);
+parse([{outdir,Dir} | RawOpts], Opts) when is_list(Dir) ->
+ parse(RawOpts, [{outdir,Dir} | Opts]);
+parse([{number,N} | RawOpts], Opts) when is_integer(N) ->
+ parse(RawOpts, [{number,integer_to_list(N)} | Opts]);
+parse([{number,Nstr} | RawOpts], Opts) -> % list when called from script
+ parse(RawOpts, [{number,Nstr} | Opts]);
+parse([{ptype,Type} | RawOpts], Opts) when Type==unix;
+ Type==windows ->
+ parse(RawOpts, [{ptype,atom_to_list(Type)} | Opts]);
+parse([{ptype,Type} | RawOpts], Opts) -> % list when called from script
+ parse(RawOpts, [{ptype,Type} | Opts]);
+parse([silent | RawOpts], Opts) ->
+ put(option_silent, true),
+ parse(RawOpts, [silent | Opts]);
+parse([{top,Index} | RawOpts], Opts) when is_list(Index) ->
+ parse(RawOpts, [{top,Index} | Opts]);
+parse([{vsn,Vsn} | RawOpts], Opts) when is_list(Vsn) ->
+ parse(RawOpts, [{vsn,Vsn} | Opts]);
+
+parse([{term_defs,File} | RawOpts], Opts) when is_list(File) ->
+ Opts2 = get_defs(term, File, Opts),
+ parse(RawOpts, Opts2);
+parse([{cite_defs,File} | RawOpts], Opts) when is_list(File) ->
+ Opts2 = get_defs(cite, File, Opts),
+ parse(RawOpts, Opts2);
+
+%% OTP internal options (SGML and PDF support etc.)
+
+parse([html | RawOpts], Opts) ->
+ parse(RawOpts, [html | Opts]);
+parse([latex | RawOpts], Opts) ->
+ parse(RawOpts, [latex | Opts]);
+parse([{man,Level} | RawOpts], Opts) -> % Level = 1..9
+ parse(RawOpts, [{man,Level} | Opts]);
+
+parse([{booksty,StyFile} | RawOpts], Opts) -> % "otpA4" | "otpBOOK"
+ parse(RawOpts, [{booksty,StyFile} | Opts]);
+parse([{includepath,Dir} | RawOpts], Opts) ->
+ parse(RawOpts, [{includepath,Dir} | Opts]);
+parse([showpaths | RawOpts], Opts) ->
+ parse(RawOpts, [showpaths | Opts]);
+parse([straight | RawOpts], Opts) ->
+ parse(RawOpts, [straight | Opts]);
+parse([{ent,Ent} | RawOpts], Opts) ->
+ parse(RawOpts, [{ent,Ent} | Opts]);
+
+%% Undocumented options
+
+parse([{name, Name} | RawOpts], Opts) ->
+ parse(RawOpts, [{name, Name} | Opts]);
+parse([framework_only | RawOpts], Opts) ->
+ parse(RawOpts, [framework_only | Opts]);
+parse([kwicindex_only | RawOpts], Opts) ->
+ parse(RawOpts, [kwicindex_only | Opts]);
+
+parse([], Opts) ->
+ {ok, Opts};
+parse([Opt | _RawOpts], _Opts) ->
+ {error, {badopt, Opt}}.
+
+%% Type = term | cite
+get_defs(Type, File, Opts) ->
+ Key = {defs,Type},
+ {PrevDefs, Opts2} =
+ case lists:keysearch(Key, 1, Opts) of
+ {value, {_, Defs0}} ->
+ {Defs0, lists:keydelete(Key, 1, Opts)};
+ false ->
+ {[], Opts}
+ end,
+ NewDefs = case file:consult(File) of
+ {ok, [DefL]} when is_list(DefL) ->
+ DefL;
+ {ok, _Terms} ->
+ docb_util:message(error,
+ "Skipping defs file ~s, does "
+ "not contain one list", [File]),
+ [];
+ {error, Error} ->
+ Expl = lists:flatten(file:format_error(Error)),
+ docb_util:message(error,
+ "Skipping defs file ~s, ~s",
+ [File, Expl]),
+ []
+ end,
+ [{Key,PrevDefs++NewDefs} | Opts2].
+
+
diff --git a/lib/docbuilder/src/docb_util.erl b/lib/docbuilder/src/docb_util.erl
new file mode 100644
index 0000000000..59673ef3a4
--- /dev/null
+++ b/lib/docbuilder/src/docb_util.erl
@@ -0,0 +1,237 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_util).
+
+-export([version/0, old_docb_dir/0, dtd_dir/0]).
+-export([html_snippet/2, html_snippet/3]).
+-export([lookup_option/2, lookup_option/3, lookup_options/2,
+ an_option/2]).
+-export([outfile/3, full_file_name/4]).
+-export([message/2, message/3]).
+-export([ltrim/1, rtrim/1, trim/1]).
+-export([join/2]).
+-export([fknidx/2]).
+
+-include("docb_util.hrl").
+
+%%--DocBuilder info-----------------------------------------------------
+
+%% version() -> string()
+%% Returns the DocBuilder application version.
+version() ->
+ DocbDir = code:lib_dir(docbuilder),
+ case string:tokens(filename:basename(DocbDir), "-") of
+ [_, Vsn] -> Vsn;
+ _ -> "unknown"
+ end.
+
+%% old_docb_dir() -> string()
+%% Returns the root directory of Old_DocBuilder (OTP internal).
+old_docb_dir() ->
+ "/home/otp/sgml/docb".
+
+%% dtd_dir() -> string()
+%% Returns the directory where the XML DTDs are located.
+dtd_dir() ->
+ DocbDir = code:lib_dir(docbuilder),
+ filename:join(DocbDir, "dtd").
+
+%%--User defined HTML snippets------------------------------------------
+
+%% html_snippet(What, Opts) -> HTML
+%% html_snippet(What, Arg, Opts) -> HTML
+%% What = head | seealso
+%% HTML = string()
+html_snippet(What, Opts) ->
+ case lookup_option(html_mod, Opts) of
+ false -> "";
+ Module ->
+ case catch apply(Module, What, []) of
+ HTML when is_list(HTML) ->
+ HTML;
+ {'EXIT', {undef, _}} ->
+ "";
+ {'EXIT', Reason} ->
+ message(warning,
+ "Callback function ~p:~p() => ~p",
+ [Module, What, Reason]),
+ "";
+ Other ->
+ message(warning,
+ "Callback function ~p:~p() => ~p",
+ [Module, What, Other]),
+ ""
+ end
+ end.
+html_snippet(What, Arg, Opts) ->
+ case lookup_option(html_mod, Opts) of
+ false -> "";
+ Module ->
+ case catch apply(Module, What, [Arg]) of
+ HTML when is_list(HTML) ->
+ HTML;
+ {'EXIT', {undef, _}} ->
+ "";
+ {'EXIT', Reason} ->
+ message(warning,
+ "Callback function ~p:~p(~p) => ~p",
+ [Module, What, Arg, Reason]),
+ "";
+ Other ->
+ message(warning,
+ "Callback function ~p:~p(~p) => ~p",
+ [Module, What, Arg, Other]),
+ ""
+ end
+ end.
+
+%%--Option utilities----------------------------------------------------
+
+%% Opts = [{Opt,Value} | Opt]
+
+%% lookup_option(Opt, Opts) -> Value | false
+lookup_option(Opt, Opts) ->
+ case lists:keysearch(Opt, 1, Opts) of
+ {value, {Opt,Value}} -> Value;
+ false -> false
+ end.
+
+%% lookup_option(Opt, Opts, DefaultValue) -> Value | DefaultValue
+lookup_option(Opt, Opts, DefaultValue) ->
+ case lookup_option(Opt,Opts) of
+ false -> DefaultValue;
+ Value -> Value
+ end.
+
+%% lookup_options(Opt, Opts) -> [Value]
+%% Used when the same option can be defined several times and returns
+%% the (possibly empty) list of values.
+lookup_options(Opt, Opts) ->
+ [V || {O, V} <- Opts, O == Opt].
+
+%% an_option(Opt, Opts) -> bool()
+an_option(Opt, Opts) ->
+ lists:member(Opt, Opts).
+
+%%--File handling-------------------------------------------------------
+
+%% outfile(File0, Extension, Opts) -> File
+%% Build the full filename for where to place a resulting file.
+outfile(File0, Extension, Opts) ->
+ File =
+ case regexp:match(File0, "[^/]*\$") of
+ {match,Start,Length} ->
+ string:substr(File0, Start, Length);
+ _ ->
+ File0
+ end,
+ full_file_name(File, Extension, outdir, Opts).
+
+%% full_file_name(File, Extension, What, Opts) -> File'
+%% File = string()
+%% What = outdir | includepath
+%% Prepend the full path name.
+full_file_name(File, Extension, What, Opts) ->
+ Path = lookup_option(What, Opts, ""),
+ full_file_name(File, Extension, Path).
+
+full_file_name(File0, Extension, Path) ->
+ File = case filename:extension(File0) of
+ Extension -> File0;
+ _ -> File0++Extension
+ end,
+
+ case File of
+ [$/|_] -> File;
+ [$~|_] -> File;
+ _ when Path=/="" -> filename:join(Path, File);
+ _ -> File
+ end.
+
+%%--Messages to the user------------------------------------------------
+
+%% message(Class, Format)
+%% message(Class, Format, Values) -> ok
+%% Class = info | warning | error
+%% Format, Values -- as in io:format/2
+%% Prints a warning or error message.
+%% Call as util:message(warning, "~w is undefined", [foo]).
+message(Class, Format) ->
+ message(Class, Format, []).
+message(Class, Format, Values) ->
+ Prefix = case Class of
+ info -> "";
+ warning -> "*** Warning: ";
+ error -> "*** Error: "
+ end,
+ case get(option_silent) of
+ true when Class==warning ->
+ ok;
+ _ ->
+ io:format(Prefix, []),
+ io:format(Format, Values),
+ io:nl()
+ end.
+
+%%--String handling-----------------------------------------------------
+
+%% ltrim(Str) -> Str'
+%% rtrim(Str) -> Str'
+%% trim(Str) -> Str'
+%% Strips whitespace from left, right or both.
+ltrim(Str) ->
+ lists:dropwhile(fun white_space/1, Str).
+rtrim(Str) ->
+ lists:reverse(ltrim(lists:reverse(Str))).
+trim(Str) ->
+ rtrim(ltrim(Str)).
+
+white_space($ ) -> true;
+white_space(C) when C<$ -> true;
+white_space($\n) -> true;
+white_space($\t) -> true;
+white_space(_) -> false.
+
+%% join(Strings, With) -> string()
+join([H1, H2| T], S) ->
+ H1 ++ S ++ join([H2| T], S);
+join([H], _) ->
+ H;
+join([], _) ->
+ [].
+
+%%--Other---------------------------------------------------------------
+
+%% fknidx(FNdef0, Fn_arity_sep) -> string()
+%% Get me the function name and arity.
+fknidx(FNdef0, Fn_arity_sep) ->
+ FNdef = string:strip(FNdef0),
+ case string:tokens(FNdef,"(") of
+ [FNdef] ->
+ %% No parentheses, assume variable: remove nl:s at end,
+ %% and strip blanks.
+ string:strip(string:strip(FNdef, right, $\n));
+ [Name0|Args0] ->
+ [Args1|_] = string:tokens(string:strip(hd(Args0)), "-"),
+ Arity = case Args1 of
+ [$)|_] -> 0;
+ _ ->
+ length(string:tokens(Args1, ","))
+ end,
+ string:strip(Name0)++Fn_arity_sep++integer_to_list(Arity)
+ end.
diff --git a/lib/docbuilder/src/docb_util.hrl b/lib/docbuilder/src/docb_util.hrl
new file mode 100644
index 0000000000..01ef3f7fca
--- /dev/null
+++ b/lib/docbuilder/src/docb_util.hrl
@@ -0,0 +1,34 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+
+%%% For character conversion
+
+-record(in_opts, {expand_entities=false,
+ encode_filter = fun(X) -> X end}).
+-record(out_opts, {escape_chars=false,
+ remove_nl=false,
+ delete_trailing_whitespace=false,
+ delete_trailing_nl=false,
+ compress_white_space=false,
+ escape_filter = fun(X) -> X end}).
+
+
+-define(pcdata_IN, #in_opts{expand_entities=true}).
+-define(rcdata_IN, #in_opts{expand_entities=true}).
+-define(cdata_IN, #in_opts{}).
+
diff --git a/lib/docbuilder/src/docb_xmerl_tree_cb.erl b/lib/docbuilder/src/docb_xmerl_tree_cb.erl
new file mode 100644
index 0000000000..d57f55bff8
--- /dev/null
+++ b/lib/docbuilder/src/docb_xmerl_tree_cb.erl
@@ -0,0 +1,343 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the Licence for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson AB.
+%% Portions created by Ericsson are Copyright 1999-2006, Ericsson AB.
+%% All Rights Reserved.��
+%%
+%% $Id$
+%%
+-module(docb_xmerl_tree_cb).
+
+%% This is the XMerL callback module for exporting XML to the internal
+%% tree format used by DocBuilder.
+%% {Doc, _Misc} = xmerl_scan:file("file.xml", [{validation,true}])
+%% Tree = xmerl:export([Doc], docb_xmerl_tree_cb)
+
+-export(['#xml-inheritance#'/0]).
+
+-export(['#root#'/4,
+ '#text#'/1,
+ '#element#'/5]).
+-include("xmerl.hrl").
+
+%%--Functions used by xmerl---------------------------------------------
+
+'#xml-inheritance#'() ->
+ [].
+
+'#root#'(Data, _Attrs, [], _E) ->
+ Data.
+
+'#text#'(Text) ->
+ Text2 = strip_leading_blanks(Text),
+%% before
+%% case Text2 of
+%% [$\n|T] ->
+%% case is_empty(T) of
+%% true -> [];
+%% false -> {pcdata, [], nl(Text2)}
+%% end;
+%%
+%% _ ->
+%% {pcdata, [], nl(Text2)}
+%% end.
+%% after
+ {pcdata, [], nl(Text2)}.
+
+'#element#'(Tag, Data, Attrs, Parents, _E) when Tag==pre; Tag==code ->
+ [H|T] = reinsert_nl(Data),
+ NewData = [strip_nl(H)|T],
+ NewData2 = case Tag of
+ code ->
+ fix_single_pcdata(NewData);
+ pre ->
+ NewData
+ end,
+ {Tag, attrs(get_dtd(Parents), Tag, Attrs), NewData2};
+'#element#'(Tag, Data, Attrs, Parents, _E) ->
+ NewData = case tag_content(Tag) of
+ no_pcdata -> % remove all pcdata
+ [Dat||
+ Dat <- Data,
+ begin
+ Fun = fun({pcdata,_,_}) -> false;
+ (_) -> true end,
+ Fun(Dat)
+ end];
+ single_pcdata when length(Data)>1 ->
+ %% merge several pcdata's into one single pcdata
+ fix_single_pcdata(Data);
+ _ ->
+ lists:flatten(Data)
+ end,
+ {Tag, attrs(get_dtd(Parents), Tag, Attrs), NewData}.
+
+%%--Internal functions--------------------------------------------------
+
+%% is_empty(Str) -> bool()
+%% Returns true if the string Str only contains blanks, tabs and
+%% newlines, false otherwise.
+%% is_empty("\n" ++ Text) ->
+%% is_empty(Text);
+%% is_empty("\t" ++ Text) ->
+%% is_empty(Text);
+%% is_empty(" " ++ Text) ->
+%% is_empty(Text);
+%% is_empty("") ->
+%% true;
+%% is_empty(_) ->
+%% false.
+
+%% reinsert_nl(L1) -> L2
+%% Workaround for <pre>: Normally empty lines are ignored. However,
+%% Xmerl splits lines whenever it encounters an entity. In the case of
+%% <pre>, this may lead to that we ignores what we think is an empty
+%% line but is actually a line break that should be kept, for example
+%% in this case:
+%% <pre>
+%% <input>some command</input> <-- this line break is lost!
+%% &lt;some result&gt;
+%% </pre>
+%% This function reinserts line breaks where necessary.
+reinsert_nl([[]|T]) ->
+ [{pcdata,[],"\\n"} | reinsert_nl(T)];
+reinsert_nl([H|T]) ->
+ [H | reinsert_nl(T)];
+reinsert_nl([]) ->
+ [].
+
+%% sgmls treats line breaks in a way that DocBuilder relies on and
+%% which must be imitated here. Replace all "\n" with "\\n" and add
+%% "\n" to the end of each text element.
+nl("") ->
+ "\n";
+nl("\n"++Text) ->
+ "\\n"++nl(Text);
+nl([Ch|Text]) ->
+ [Ch|nl(Text)].
+
+
+%% strip_leading_blanks(Str) -> Str
+%% Leading spaces and tabs before a newline are always redundant
+%% and are therefore stripped of here
+%% If no newline is found the original string is returned unchanged
+
+strip_leading_blanks(Str) ->
+ strip_leading_blanks(Str,Str).
+
+strip_leading_blanks([],Str) ->
+ Str;
+strip_leading_blanks([$\s|T],Str) ->
+ strip_leading_blanks(T,Str);
+strip_leading_blanks([$\t|T],Str) ->
+ strip_leading_blanks(T,Str);
+strip_leading_blanks(Rest=[$\n|_],_) ->
+ Rest;
+strip_leading_blanks(_,Str) ->
+ Str.
+
+%% strip_nl(Str) -> Str
+%% The XMerL scan will often result in the contents of <pre> or <code>
+%% starting with a newline, as the format is normally:
+%% <pre>
+%% ..contents..
+%% </pre>
+%% However, this newline must be removed, or the resulting HTML will be
+%% <pre>
+%%
+%% ..content..
+%% </pre>
+strip_nl({pcdata,[],"\\n"++Str}) -> {pcdata,[],Str};
+strip_nl(E) -> E.
+
+get_dtd([]) ->
+ none;
+get_dtd(Parents) ->
+ {DTD, _} = lists:last(Parents),
+ DTD.
+
+%% attrs(DTD, Tag, GivenAttrs) -> AllAttrs
+%% DTD = Tag = atom() DTD and tag name
+%% GivenAttrs = [#xmlAttribute{}]
+%% AllAttrs = [{Name, Type, Val}]
+%% Name = string() (uppercase) Example: "VALIGN"
+%% Type = "CDATA" | "TOKEN"
+%% Val = string() (uppercase if type is "TOKEN", as-is otherwise)
+%% The XMerL scanning of <file>.xml renders only the given attributes.
+%% However, DocBuilder needs also the optional attributes (which not
+%% necessarily have been given), so we add them here, using the default
+%% values according to the DTDs.
+%% NOTE: Uses the information from the DTDs. That is, if some change is
+%% done to the DTDs, also this file must be updated. Ideally, the DTDs
+%% should be parsed automatically in some way.
+%% It can also be noted that this check is superfluous in the case where
+%% all attributes are required (except that the attributes are sorted
+%% in the same order as in the DTD) and where an optional attribute has
+%% type "CDATA" as no sensible default value can be specified in this
+%% case.
+attrs(DTD, Tag, GivenAttrs) ->
+ merge_attrs(Tag, default_attrs(DTD, Tag), GivenAttrs).
+
+merge_attrs(Tag, [{NameA, Type, DefVal}|Default], GivenAttrs) ->
+ Val = case lists:keysearch(NameA, #xmlAttribute.name, GivenAttrs) of
+ {value, #xmlAttribute{value=Val0}} -> Val0;
+ false -> DefVal
+ end,
+ Attr = {attr_name(NameA), Type, attr_val(Type, Val)},
+ [Attr | merge_attrs(Tag, Default, GivenAttrs)];
+merge_attrs(_Tag, [], _GivenAttrs) ->
+ [].
+
+attr_name(Atom) ->
+ string:to_upper(atom_to_list(Atom)).
+
+attr_val("CDATA", Val) -> Val;
+attr_val("TOKEN", Val) -> string:to_upper(Val).
+
+%% Given the DTD and element tag, return a list [{Name, Value}] where
+%% Name (atom) is the name of each possible attribute and
+%% Value (lowercase string) its default value.
+default_attrs(_, cell) ->
+ [{align, "TOKEN", "left"},
+ {valign, "TOKEN", "middle"}];
+default_attrs(_, cite) ->
+ [{id, "CDATA", ""}]; % required
+default_attrs(_, code) ->
+ [{type, "TOKEN", "none"}];
+default_attrs(_, codeinclude) ->
+ [{file, "CDATA", ""}, % required
+ {tag, "CDATA", ""},
+ {type, "TOKEN", "none"}];
+default_attrs(book, contents) ->
+ [{level, "TOKEN", "2"}];
+default_attrs(_, erleval) ->
+ [{expr, "CDATA", ""}]; % required
+default_attrs(report, erlinclude) ->
+ [{file, "CDATA", ""}, % required
+ {tag, "CDATA", ""}]; % required
+default_attrs(_, fascicule) ->
+ [{file, "CDATA", ""}, % required
+ {href, "CDATA", ""}, % required
+ {entry, "TOKEN", "no"}];
+default_attrs(book, header) ->
+ [{titlestyle, "TOKEN", "normal"}];
+default_attrs(_, image) ->
+ [{file, "CDATA", ""}]; % required
+default_attrs(_, include) ->
+ [{file, "CDATA", ""}]; % required
+default_attrs(report, index) ->
+ [{txt, "CDATA", ""}]; % required
+default_attrs(_, list) ->
+ [{type, "TOKEN", "bulleted"}];
+default_attrs(_, marker) ->
+ [{id, "CDATA", ""}]; % required
+default_attrs(book, onepart) ->
+ [{lift, "TOKEN", "no"}];
+default_attrs(book, parts) ->
+ [{lift, "TOKEN", "no"}];
+default_attrs(_, path) ->
+ [{unix, "CDATA", ""},
+ {windows, "CDATA", ""}];
+default_attrs(_, seealso) ->
+ [{marker, "CDATA", ""}]; % required
+default_attrs(report, table) ->
+ [{width, "CDATA", "0"},
+ {colspec, "CDATA", ""}];
+default_attrs(_, table) ->
+ [{align, "TOKEN", "center"}];
+default_attrs(_, term) ->
+ [{id, "CDATA", ""}]; % required
+default_attrs(book, theheader) ->
+ [{tag, "TOKEN", "none"}];
+default_attrs(bookinsidecover, theheader) ->
+ [{tag, "TOKEN", "none"}];
+default_attrs(_, url) ->
+ [{href, "CDATA", ""}]; % required
+default_attrs(_, _) -> [].
+
+%%--Single PCDATA broken into several fix-------------------------------
+
+%% When text contains an entity, then XMERL splits it into two
+%% PCDATA elements, the second starting with the entity.
+%%
+%% Example:
+%% Magnus Fr�berg => [{pcdata,[],"Magnus Fr\n"},{pcdata,[],"�berg\n"}]
+%%
+%% This is not handled by DocBuilder which expects many tags, for
+%% example title and aname, to contain a single PCDATA element. (That
+%% is also what nsgmls returned.)
+
+fix_single_pcdata([{pcdata,[],Str1}, {pcdata,[],Str2}|T]) ->
+ fix_single_pcdata([{pcdata,[],Str1++Str2}|T]);
+fix_single_pcdata(FixedData) ->
+ FixedData.
+
+tag_content(aname) -> single_pcdata;
+tag_content(app) -> single_pcdata;
+tag_content(approved) -> single_pcdata;
+tag_content(appsummary) -> single_pcdata;
+tag_content(b) -> single_pcdata;
+tag_content(c) -> single_pcdata;
+tag_content(cauthor) -> single_pcdata;
+tag_content(cell) -> mixed_content;
+tag_content(checked) -> single_pcdata;
+tag_content(chowpublished) -> single_pcdata;
+tag_content(code) -> single_pcdata; % mixed?
+tag_content(com) -> single_pcdata;
+tag_content(comsummary) -> single_pcdata;
+tag_content(copyright) -> mixed_content;
+tag_content(ctitle) -> single_pcdata;
+tag_content(d) -> mixed_content;
+tag_content(date) -> single_pcdata;
+tag_content(docno) -> single_pcdata;
+tag_content(em) -> mixed_content;
+tag_content(email) -> single_pcdata;
+tag_content(fascicule) -> single_pcdata;
+tag_content(file) -> single_pcdata;
+tag_content(filesummary) -> single_pcdata;
+tag_content(fsummary) -> mixed_content;
+tag_content(headline) -> single_pcdata;
+tag_content(holder) -> single_pcdata;
+tag_content(i) -> single_pcdata;
+tag_content(icaption) -> single_pcdata;
+tag_content(id) -> single_pcdata;
+tag_content(input) -> mixed_content;
+tag_content(item) -> mixed_content;
+tag_content(legalnotice) -> single_pcdata;
+tag_content(lib) -> single_pcdata;
+tag_content(libsummary) -> single_pcdata;
+tag_content(module) -> single_pcdata;
+tag_content(modulesummary) -> single_pcdata;
+tag_content(name) -> single_pcdata;
+tag_content(nametext) -> single_pcdata;
+tag_content(p) -> mixed_content;
+tag_content(pagetext) -> single_pcdata;
+tag_content(path) -> single_pcdata; % mixed?
+tag_content(pre) -> mixed_content;
+tag_content(prepared) -> single_pcdata;
+tag_content(resp) -> single_pcdata;
+tag_content(responsible) -> single_pcdata;
+tag_content(ret) -> single_pcdata;
+tag_content(rev) -> single_pcdata;
+tag_content(seealso) -> single_pcdata; % mixed?
+tag_content(shortdef) -> single_pcdata;
+tag_content(shorttitle) -> single_pcdata;
+tag_content(tag) -> mixed_content;
+tag_content(tcaption) -> single_pcdata;
+tag_content(termdef) -> single_pcdata;
+tag_content(title) -> single_pcdata;
+tag_content(url) -> single_pcdata; % mixed
+tag_content(v) -> single_pcdata;
+tag_content(year) -> single_pcdata;
+tag_content(_) -> no_pcdata.
+
+
diff --git a/lib/docbuilder/src/docb_xmerl_xml_cb.erl b/lib/docbuilder/src/docb_xmerl_xml_cb.erl
new file mode 100644
index 0000000000..089b8f0c7d
--- /dev/null
+++ b/lib/docbuilder/src/docb_xmerl_xml_cb.erl
@@ -0,0 +1,88 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the Licence for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson AB.
+%% Portions created by Ericsson are Copyright 1999-2006, Ericsson AB.
+%% All Rights Reserved.��
+%%
+%% $Id$
+%%
+-module(docb_xmerl_xml_cb).
+
+%% This is the callback module for exporting XHTML to a DocBuilder
+%% erlref or chapter document in XML format.
+%% See docb_edoc_xml_cb.erl for further information.
+%%
+%% The origin of this file is the xmerl module xmerl_otpsgml.erl
+%% written by Ulf Wiger and Richard Carlsson.
+
+-export(['#xml-inheritance#'/0]).
+
+-export(['#root#'/4,
+ '#element#'/5,
+ '#text#'/1]).
+
+-include("xmerl.hrl").
+
+'#xml-inheritance#'() ->
+ [xmerl_xml].
+
+'#root#'(Data, _Attrs, [], _E) ->
+ ["<",DTD,">"] = hd(hd(Data)),
+ ["<?xml version=\"1.0\" encoding=\"latin1\" ?>\n",
+ "<!DOCTYPE "++DTD++" SYSTEM \""++DTD++".dtd\">\n",
+ Data].
+
+'#element#'(Tag, Data, Attrs, _Parents, _E) ->
+ {NewTag, NewAttrs} = convert_tag(Tag, Attrs),
+ xmerl_lib:markup(NewTag, NewAttrs, Data).
+
+'#text#'(Text) ->
+ xmerl_lib:export_text(Text).
+
+%% Utility functions
+
+convert_tag(a, [Attr]) ->
+ case Attr#xmlAttribute.name of
+ href ->
+ Val = Attr#xmlAttribute.value,
+ case is_url(Val) of
+ true ->
+ {url, [Attr]};
+ false ->
+ {seealso, [Attr#xmlAttribute{name=marker}]}
+ end;
+ name ->
+ {marker, [Attr#xmlAttribute{name=id}]}
+ end;
+convert_tag(b, Attrs) -> {em, Attrs};
+convert_tag(blockquote, Attrs) -> {quote, Attrs};
+convert_tag(code, Attrs) -> {c, Attrs};
+convert_tag(dd, Attrs) -> {item, Attrs};
+convert_tag(dl, Attrs) -> {taglist, Attrs};
+convert_tag(dt, Attrs) -> {tag, Attrs};
+convert_tag(li, Attrs) -> {item, Attrs};
+convert_tag(ol, Attrs) -> {list, Attrs};
+convert_tag(strong, Attrs) -> {em, Attrs};
+convert_tag(td, Attrs) -> {cell, Attrs};
+convert_tag(tr, Attrs) -> {row, Attrs};
+convert_tag(tt, Attrs) -> {c, Attrs};
+convert_tag(ul, Attrs) -> {list, Attrs};
+convert_tag(underline, Attrs) -> {em, Attrs};
+convert_tag(Tag, Attrs) -> {Tag, Attrs}.
+
+is_url("http:"++_) -> true;
+is_url("../"++_) -> true;
+is_url(FileRef) ->
+ case filename:extension(FileRef) of
+ "" -> false; % no extension = xml file, DocBuilder resolves
+ _Ext -> true % extension, DocBuilder must not resolve
+ end.
diff --git a/lib/docbuilder/src/docb_xml_check.erl b/lib/docbuilder/src/docb_xml_check.erl
new file mode 100644
index 0000000000..8ae5cd2eac
--- /dev/null
+++ b/lib/docbuilder/src/docb_xml_check.erl
@@ -0,0 +1,44 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_xml_check).
+
+-export([validate/1]).
+
+%% validate(File) -> ok | error | {error, badfile}
+%% File = string(), file name with or without ".xml" extension
+%% If XML validation fails for a file, the error information from
+%% Xmerl is printed to terminal and the function returns error.
+validate(File0) ->
+ File = case filename:extension(File0) of
+ ".xml" -> File0;
+ _ -> File0++".xml"
+ end,
+ case filelib:is_regular(File) of
+ true ->
+ DtdDir = docb_util:dtd_dir(),
+ case catch xmerl_scan:file(File, [{validation,true},
+ {fetch_path,[DtdDir]}]) of
+ {'EXIT', Error} ->
+ io:format("~p~n", [Error]),
+ error;
+ {_Doc, _Misc} ->
+ ok
+ end;
+ false ->
+ {error, badfile}
+ end.
diff --git a/lib/docbuilder/src/docbuilder.app.src b/lib/docbuilder/src/docbuilder.app.src
new file mode 100644
index 0000000000..64c4770964
--- /dev/null
+++ b/lib/docbuilder/src/docbuilder.app.src
@@ -0,0 +1,37 @@
+{application, docbuilder,
+ [{description, "Tool for building HTML documentation"},
+ {vsn, "%VSN%"},
+ {modules, [docb_edoc_xml_cb,
+ docb_gen,
+ docb_html,
+ docb_html_layout,
+ docb_html_ref,
+ docb_html_util,
+ docb_html_util_iso,
+ docb_main,
+ docb_pretty_format,
+ docb_tr_application2html,
+ docb_tr_appref2html,
+ docb_tr_chapter2html,
+ docb_tr_cite2html,
+ docb_tr_comref2html,
+ docb_tr_cref2html,
+ docb_tr_erlref2html,
+ docb_tr_fileref2html,
+ docb_tr_first2html,
+ docb_tr_index2html,
+ docb_tr_part2html,
+ docb_tr_refs2kwic,
+ docb_tr_report2html,
+ docb_tr_term2html,
+ docb_transform,
+ docb_util,
+ docb_xmerl_tree_cb,
+ docb_xmerl_xml_cb,
+ docb_xml_check
+ ]},
+ {registered, []},
+ {applications, [kernel, stdlib]},
+ {env, []}]}.
+
+
diff --git a/lib/docbuilder/src/docbuilder.appup.src b/lib/docbuilder/src/docbuilder.appup.src
new file mode 100644
index 0000000000..54a63833e6
--- /dev/null
+++ b/lib/docbuilder/src/docbuilder.appup.src
@@ -0,0 +1 @@
+{"%VSN%",[],[]}.
diff --git a/lib/docbuilder/test/Makefile b/lib/docbuilder/test/Makefile
new file mode 100644
index 0000000000..080479ee71
--- /dev/null
+++ b/lib/docbuilder/test/Makefile
@@ -0,0 +1,80 @@
+# ``The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved via the world wide web at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+# AB. All Rights Reserved.''
+#
+# $Id$
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+MODULES = \
+ docb_SUITE
+
+ERL_FILES= $(MODULES:%=%.erl)
+
+TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+INSTALL_PROGS= $(TARGET_FILES)
+
+EMAKEFILE=Emakefile
+
+SPEC_FILES=
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/docb_test
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+ERL_MAKE_FLAGS +=
+ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include
+
+EBIN = .
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+.PHONY: make_emakefile
+
+make_emakefile:
+ $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES)\
+ > $(EMAKEFILE)
+
+tests debug opt: make_emakefile
+ erl $(ERL_MAKE_FLAGS) -make
+
+clean:
+ rm -f $(EMAKEFILE)
+ rm -f $(TARGET_FILES)
+ rm -f core
+
+docs:
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+
+release_tests_spec: make_emakefile
+ $(INSTALL_DIR) $(RELSYSDIR)
+ $(INSTALL_DATA) $(SPEC_FILES) $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
+ chmod -f -R u+w $(RELSYSDIR)
+ @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+
+release_docs_spec:
+
+
diff --git a/lib/docbuilder/test/docb_SUITE.erl b/lib/docbuilder/test/docb_SUITE.erl
new file mode 100644
index 0000000000..c871130521
--- /dev/null
+++ b/lib/docbuilder/test/docb_SUITE.erl
@@ -0,0 +1,31 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_SUITE).
+
+-export([all/1,html/1]).
+
+-include("test_server.hrl").
+
+-include_lib("kernel/include/file.hrl").
+
+all(suite) -> [html].
+
+html(suite) -> [];
+html(Config) when is_list(Config) ->
+ ok.
+
diff --git a/lib/docbuilder/test/docb_SUITE_data/cdata_problem.xml b/lib/docbuilder/test/docb_SUITE_data/cdata_problem.xml
new file mode 100755
index 0000000000..b7f6f5376e
--- /dev/null
+++ b/lib/docbuilder/test/docb_SUITE_data/cdata_problem.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+<chapter>
+ <header>
+ <title>�Docbook&ouml; bug</title>
+ <prepared>Matthias Lang</prepared>
+<docno></docno>
+<date>2008-03-31</date>
+ <rev>1.0</rev>
+ </header>
+
+<section><title>This is a title</title>
+ <code><![CDATA[
+ This works
+ ]]></code>
+
+ <code><![CDATA[
+ This does not
+ ]]> </code>
+</section>
+</chapter>
+
diff --git a/lib/docbuilder/vsn.mk b/lib/docbuilder/vsn.mk
new file mode 100644
index 0000000000..4c782f7481
--- /dev/null
+++ b/lib/docbuilder/vsn.mk
@@ -0,0 +1,12 @@
+DOCB_VSN = 0.9.8.6
+
+TICKETS = OTP-8201
+
+TICKETS_0.9.8.5 = OTP-7851
+
+TICKETS_0.9.8.4 = OTP-7236
+
+TICKETS_0.9.8.1 = OTP-7236
+
+
+
diff --git a/lib/docbuilder/xsd/application.xsd b/lib/docbuilder/xsd/application.xsd
new file mode 100755
index 0000000000..eb666cb6c7
--- /dev/null
+++ b/lib/docbuilder/xsd/application.xsd
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.xsd"/>
+ <xs:include schemaLocation="common.header.xsd"/>
+ <xs:element name="application">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element maxOccurs="unbounded" ref="include"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="description">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="include">
+ <xs:complexType>
+ <xs:attribute name="file" use="required"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/appref.xsd b/lib/docbuilder/xsd/appref.xsd
new file mode 100755
index 0000000000..b63839e494
--- /dev/null
+++ b/lib/docbuilder/xsd/appref.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.refs.xsd"/>
+ <!-- Structure -->
+ <xs:element name="appref">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element ref="app"/>
+ <xs:element ref="appsummary"/>
+ <xs:element ref="description"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="section"/>
+ <xs:element ref="funcs"/>
+ </xs:choice>
+ <xs:element ref="authors"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="app" type="xs:string"/>
+ <xs:element name="appsummary" type="xs:string"/>
+ <!--
+ `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd
+ -->
+ <xs:element name="name" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/book.xsd b/lib/docbuilder/xsd/book.xsd
new file mode 100755
index 0000000000..b47962263a
--- /dev/null
+++ b/lib/docbuilder/xsd/book.xsd
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.xsd"/>
+ <xs:include schemaLocation="common.table.xsd"/>
+ <xs:element name="book">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element minOccurs="0" ref="insidecover"/>
+ <xs:element ref="pagetext"/>
+ <xs:element ref="preamble"/>
+ <xs:choice maxOccurs="unbounded">
+ <xs:element ref="applications"/>
+ <xs:element ref="parts"/>
+ <xs:element ref="headline"/>
+ <xs:element ref="pagetext"/>
+ </xs:choice>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="listoffigures"/>
+ <xs:element minOccurs="0" ref="listoftables"/>
+ <xs:element minOccurs="0" ref="listofterms"/>
+ <xs:element minOccurs="0" ref="bibliography"/>
+ <xs:element minOccurs="0" ref="index"/>
+ </xs:sequence>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="header">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="title"/>
+ <xs:element ref="prepared"/>
+ <xs:element minOccurs="0" ref="responsible"/>
+ <xs:element ref="docno"/>
+ <xs:element minOccurs="0" ref="approved"/>
+ <xs:element minOccurs="0" ref="checked"/>
+ <xs:element ref="date"/>
+ <xs:element ref="rev"/>
+ <xs:element minOccurs="0" ref="file"/>
+ <xs:element minOccurs="0" ref="abbreviation"/>
+ </xs:sequence>
+ <xs:attribute name="titlestyle" default="normal">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="special"/>
+ <xs:enumeration value="normal"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="title">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="prepared">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="responsible">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="docno">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="approved">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="checked">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="date">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="rev">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="file">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="abbreviation">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="br"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="pagetext" type="xs:string"/>
+ <xs:element name="preamble">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="preface"/>
+ <xs:element minOccurs="0" ref="contents"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="preface">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="title"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ <xs:element ref="table"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="insidecover">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="br"/>
+ <xs:element ref="theheader"/>
+ <xs:element ref="vfill"/>
+ <xs:element ref="tt"/>
+ <xs:element ref="bold"/>
+ <xs:element ref="include"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="tt">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="br"/>
+ <xs:element ref="theheader"/>
+ <xs:element ref="vfill"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="bold">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="br"/>
+ <xs:element ref="theheader"/>
+ <xs:element ref="vfill"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vfill">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="theheader">
+ <xs:complexType>
+ <xs:attribute name="tag" default="none">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="title"/>
+ <xs:enumeration value="prepared"/>
+ <xs:enumeration value="responsible"/>
+ <xs:enumeration value="docno"/>
+ <xs:enumeration value="approved"/>
+ <xs:enumeration value="checked"/>
+ <xs:enumeration value="date"/>
+ <xs:enumeration value="rev"/>
+ <xs:enumeration value="file"/>
+ <xs:enumeration value="abbreviation"/>
+ <xs:enumeration value="none"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="applications">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="include"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parts">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="title"/>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="include"/>
+ <xs:element ref="onepart"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="lift" default="no">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="yes"/>
+ <xs:enumeration value="no"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="headline" type="xs:string"/>
+ <xs:element name="index">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="listoffigures">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="listoftables">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="listofterms">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="bibliography">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="contents">
+ <xs:complexType>
+ <xs:attribute name="level" default="2">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="0"/>
+ <xs:enumeration value="1"/>
+ <xs:enumeration value="2"/>
+ <xs:enumeration value="3"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="onepart">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="title"/>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element maxOccurs="unbounded" ref="include"/>
+ </xs:sequence>
+ <xs:attribute name="lift" default="no">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="yes"/>
+ <xs:enumeration value="no"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="description">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="include">
+ <xs:complexType>
+ <xs:attribute name="file" use="required"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/chapter.xsd b/lib/docbuilder/xsd/chapter.xsd
new file mode 100755
index 0000000000..4d89baa988
--- /dev/null
+++ b/lib/docbuilder/xsd/chapter.xsd
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.xsd"/>
+ <xs:include schemaLocation="common.header.xsd"/>
+ <xs:include schemaLocation="common.table.xsd"/>
+ <xs:include schemaLocation="common.image.xsd"/>
+ <!-- Structure -->
+ <xs:element name="chapter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ <xs:element ref="br"/>
+ <xs:element ref="image"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="table"/>
+ </xs:choice>
+ <xs:element maxOccurs="unbounded" ref="section"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="section">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="marker"/>
+ <xs:element ref="title"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ <xs:element ref="br"/>
+ <xs:element ref="image"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="table"/>
+ <xs:element ref="section"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/common.entities.xsd b/lib/docbuilder/xsd/common.entities.xsd
new file mode 100755
index 0000000000..52a5d35179
--- /dev/null
+++ b/lib/docbuilder/xsd/common.entities.xsd
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"/>
diff --git a/lib/docbuilder/xsd/common.header.xsd b/lib/docbuilder/xsd/common.header.xsd
new file mode 100755
index 0000000000..bfee4b8bb4
--- /dev/null
+++ b/lib/docbuilder/xsd/common.header.xsd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="header">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="title"/>
+ <xs:element minOccurs="0" ref="shorttitle"/>
+ <xs:element ref="prepared"/>
+ <xs:element minOccurs="0" ref="responsible"/>
+ <xs:element ref="docno"/>
+ <xs:element minOccurs="0" ref="approved"/>
+ <xs:element minOccurs="0" ref="checked"/>
+ <xs:element ref="date"/>
+ <xs:element ref="rev"/>
+ <xs:element minOccurs="0" ref="file"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="title" type="xs:string"/>
+ <xs:element name="shorttitle" type="xs:string"/>
+ <xs:element name="prepared" type="xs:string"/>
+ <xs:element name="responsible" type="xs:string"/>
+ <xs:element name="docno" type="xs:string"/>
+ <xs:element name="approved" type="xs:string"/>
+ <xs:element name="checked" type="xs:string"/>
+ <xs:element name="date" type="xs:string"/>
+ <xs:element name="rev" type="xs:string"/>
+ <xs:element name="file" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/common.image.xsd b/lib/docbuilder/xsd/common.image.xsd
new file mode 100755
index 0000000000..17054eb23c
--- /dev/null
+++ b/lib/docbuilder/xsd/common.image.xsd
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="image">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="icaption">
+ <xs:attribute name="file" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="icaption">
+ <xs:sequence>
+ <xs:element ref="icaption"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="icaption" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/common.refs.xsd b/lib/docbuilder/xsd/common.refs.xsd
new file mode 100755
index 0000000000..58b450669d
--- /dev/null
+++ b/lib/docbuilder/xsd/common.refs.xsd
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ This file contains common stuff for the *ref.dtd files.
+ Note that `name' is defined in each *ref.dtd.
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.xsd"/>
+ <xs:include schemaLocation="common.header.xsd"/>
+ <xs:element name="description">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="funcs">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="func"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="func">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="name"/>
+ <xs:element ref="fsummary"/>
+ <xs:element minOccurs="0" ref="type"/>
+ <xs:element minOccurs="0" ref="desc"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- ELEMENT name is defined in each ref dtd -->
+ <xs:element name="fsummary">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="c"/>
+ <xs:element ref="em"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="type">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element ref="v"/>
+ <xs:element minOccurs="0" ref="d"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="v" type="xs:string"/>
+ <xs:element name="d">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="c"/>
+ <xs:element ref="em"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="desc">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="authors">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element ref="aname"/>
+ <xs:element ref="email"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="aname" type="xs:string"/>
+ <xs:element name="email" type="xs:string"/>
+ <xs:element name="section">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="marker"/>
+ <xs:element ref="title"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/common.table.xsd b/lib/docbuilder/xsd/common.table.xsd
new file mode 100755
index 0000000000..cf63df4317
--- /dev/null
+++ b/lib/docbuilder/xsd/common.table.xsd
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="table">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="row"/>
+ <xs:element ref="tcaption"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="row">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="cell"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="cell">
+ <xs:complexType mixed="true">
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="inline"/>
+ <xs:attribute name="align" default="left">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="left"/>
+ <xs:enumeration value="center"/>
+ <xs:enumeration value="right"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="valign" default="middle">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="top"/>
+ <xs:enumeration value="middle"/>
+ <xs:enumeration value="bottom"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="tcaption" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/common.xsd b/lib/docbuilder/xsd/common.xsd
new file mode 100755
index 0000000000..3d43390bd8
--- /dev/null
+++ b/lib/docbuilder/xsd/common.xsd
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This file contains common stuff for all dtds. -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="block" abstract="true"/>
+ <xs:group name="inline">
+ <xs:sequence>
+ <xs:choice minOccurs="0">
+ <xs:element ref="c"/>
+ <xs:element ref="em"/>
+ <xs:element ref="term"/>
+ <xs:element ref="cite"/>
+ <xs:element ref="br"/>
+ <xs:element ref="path"/>
+ <xs:element ref="seealso"/>
+ <xs:element ref="url"/>
+ <xs:element ref="marker"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:group>
+ <!-- XXX -->
+ <xs:element name="p" substitutionGroup="block">
+ <xs:complexType mixed="true">
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="inline"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="pre" substitutionGroup="block">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="seealso"/>
+ <xs:element ref="url"/>
+ <xs:element ref="input"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="input">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="seealso"/>
+ <xs:element ref="url"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="code" substitutionGroup="block">
+ <xs:complexType mixed="true">
+ <xs:attribute name="type" default="none">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="erl"/>
+ <xs:enumeration value="c"/>
+ <xs:enumeration value="none"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="quote">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="p"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="warning">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="note">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="c" type="xs:string"/>
+ <xs:element name="em">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="c"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- XXX -->
+ <xs:element name="term">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="termdef"/>
+ </xs:sequence>
+ <xs:attribute name="id" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="termdef" type="xs:string"/>
+ <xs:element name="cite">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="citedef"/>
+ </xs:sequence>
+ <xs:attribute name="id" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="citedef">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="ctitle"/>
+ <xs:element ref="cauthor"/>
+ <xs:element ref="chowpublished"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ctitle" type="xs:string"/>
+ <xs:element name="cauthor" type="xs:string"/>
+ <xs:element name="chowpublished" type="xs:string"/>
+ <!-- XXX -->
+ <xs:element name="br">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Path -->
+ <xs:element name="path">
+ <xs:complexType mixed="true">
+ <xs:attribute name="unix" default=""/>
+ <xs:attribute name="windows" default=""/>
+ </xs:complexType>
+ </xs:element>
+ <!-- List -->
+ <xs:element name="list" substitutionGroup="block">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="item"/>
+ </xs:sequence>
+ <xs:attribute name="type" default="bulleted">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="ordered"/>
+ <xs:enumeration value="bulleted"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="taglist" substitutionGroup="block">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element ref="tag"/>
+ <xs:element ref="item"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="tag">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="c"/>
+ <xs:element ref="em"/>
+ <xs:element ref="seealso"/>
+ <xs:element ref="url"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="item">
+ <xs:complexType mixed="true">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:group ref="inline"/>
+ <xs:element ref="block"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <!-- References -->
+ <xs:element name="seealso">
+ <xs:complexType mixed="true">
+ <xs:attribute name="marker" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="url">
+ <xs:complexType mixed="true">
+ <xs:attribute name="href" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="marker">
+ <xs:complexType>
+ <xs:attribute name="id" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- CodeInclude -->
+ <xs:element name="codeinclude" substitutionGroup="block">
+ <xs:complexType>
+ <xs:attribute name="file" use="required"/>
+ <xs:attribute name="tag" default=""/>
+ <xs:attribute name="type" default="none">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="erl"/>
+ <xs:enumeration value="c"/>
+ <xs:enumeration value="none"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <!-- ErlEval -->
+ <xs:element name="erleval" substitutionGroup="block">
+ <xs:complexType>
+ <xs:attribute name="expr" use="required"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/comref.xsd b/lib/docbuilder/xsd/comref.xsd
new file mode 100755
index 0000000000..61df4dd848
--- /dev/null
+++ b/lib/docbuilder/xsd/comref.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.refs.xsd"/>
+ <xs:element name="comref">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element ref="com"/>
+ <xs:element ref="comsummary"/>
+ <xs:element ref="description"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="section"/>
+ <xs:element ref="funcs"/>
+ </xs:choice>
+ <xs:element ref="authors"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="com" type="xs:string"/>
+ <xs:element name="comsummary" type="xs:string"/>
+ <!--
+ `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd
+ -->
+ <xs:element name="name" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/cref.xsd b/lib/docbuilder/xsd/cref.xsd
new file mode 100755
index 0000000000..f1cbeddfff
--- /dev/null
+++ b/lib/docbuilder/xsd/cref.xsd
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.refs.xsd"/>
+ <xs:element name="cref">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element ref="lib"/>
+ <xs:element ref="libsummary"/>
+ <xs:element ref="description"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="section"/>
+ <xs:element ref="funcs"/>
+ </xs:choice>
+ <xs:element ref="authors"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="lib" type="xs:string"/>
+ <xs:element name="libsummary" type="xs:string"/>
+ <!--
+ `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd
+ -->
+ <xs:element name="name">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="ret"/>
+ <xs:element ref="nametext"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ret" type="xs:string"/>
+ <xs:element name="nametext" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/erlref.xsd b/lib/docbuilder/xsd/erlref.xsd
new file mode 100755
index 0000000000..f6011b7bea
--- /dev/null
+++ b/lib/docbuilder/xsd/erlref.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.refs.xsd"/>
+ <xs:element name="erlref">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element ref="module"/>
+ <xs:element ref="modulesummary"/>
+ <xs:element ref="description"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="section"/>
+ <xs:element ref="funcs"/>
+ </xs:choice>
+ <xs:element ref="authors"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="module" type="xs:string"/>
+ <xs:element name="modulesummary" type="xs:string"/>
+ <!--
+ `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd
+ -->
+ <xs:element name="name" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/fascicules.xsd b/lib/docbuilder/xsd/fascicules.xsd
new file mode 100755
index 0000000000..bfdb5bd604
--- /dev/null
+++ b/lib/docbuilder/xsd/fascicules.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Structure -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="fascicules">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="fascicule"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="fascicule">
+ <xs:complexType mixed="true">
+ <xs:attribute name="file" use="required"/>
+ <xs:attribute name="href" use="required"/>
+ <xs:attribute name="entry" default="no">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="yes"/>
+ <xs:enumeration value="no"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/fileref.xsd b/lib/docbuilder/xsd/fileref.xsd
new file mode 100755
index 0000000000..8038f2115f
--- /dev/null
+++ b/lib/docbuilder/xsd/fileref.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.refs.xsd"/>
+ <xs:element name="fileref">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element ref="file"/>
+ <xs:element ref="filesummary"/>
+ <xs:element ref="description"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="section"/>
+ <xs:element ref="funcs"/>
+ </xs:choice>
+ <xs:element ref="authors"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- Note: ELEMENT file is already defined -->
+ <xs:element name="filesummary" type="xs:string"/>
+ <!--
+ `name' is used in common.refs.dtd and must therefore
+ be defined in each *ref. dtd
+ -->
+ <xs:element name="name" type="xs:string"/>
+</xs:schema>
diff --git a/lib/docbuilder/xsd/part.xsd b/lib/docbuilder/xsd/part.xsd
new file mode 100755
index 0000000000..30d6ec0120
--- /dev/null
+++ b/lib/docbuilder/xsd/part.xsd
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:include schemaLocation="common.xsd"/>
+ <xs:include schemaLocation="common.header.xsd"/>
+ <xs:element name="part">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="header"/>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element maxOccurs="unbounded" ref="include"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="description">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="block"/>
+ <xs:element ref="quote"/>
+ <xs:element ref="br"/>
+ <xs:element ref="marker"/>
+ <xs:element ref="warning"/>
+ <xs:element ref="note"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="include">
+ <xs:complexType>
+ <xs:attribute name="file" use="required"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>