Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > d9c1887ff364dc87e282490223567c41 > files > 120

ocaml-pxp-1.2.1-1mdv2010.0.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<link rel="Start" href="index.html">
<link rel="previous" href="Intro_preprocessor.html">
<link rel="Up" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
<link title="Index of values" rel=Appendix href="index_values.html">
<link title="Index of class methods" rel=Appendix href="index_methods.html">
<link title="Index of classes" rel=Appendix href="index_classes.html">
<link title="Index of class types" rel=Appendix href="index_class_types.html">
<link title="Index of modules" rel=Appendix href="index_modules.html">
<link title="Index of module types" rel=Appendix href="index_module_types.html">
<link title="Pxp_types" rel="Chapter" href="Pxp_types.html">
<link title="Pxp_document" rel="Chapter" href="Pxp_document.html">
<link title="Pxp_dtd" rel="Chapter" href="Pxp_dtd.html">
<link title="Pxp_tree_parser" rel="Chapter" href="Pxp_tree_parser.html">
<link title="Pxp_core_types" rel="Chapter" href="Pxp_core_types.html">
<link title="Pxp_ev_parser" rel="Chapter" href="Pxp_ev_parser.html">
<link title="Pxp_event" rel="Chapter" href="Pxp_event.html">
<link title="Pxp_dtd_parser" rel="Chapter" href="Pxp_dtd_parser.html">
<link title="Pxp_codewriter" rel="Chapter" href="Pxp_codewriter.html">
<link title="Pxp_marshal" rel="Chapter" href="Pxp_marshal.html">
<link title="Pxp_yacc" rel="Chapter" href="Pxp_yacc.html">
<link title="Pxp_reader" rel="Chapter" href="Pxp_reader.html">
<link title="Intro_trees" rel="Chapter" href="Intro_trees.html">
<link title="Intro_extensions" rel="Chapter" href="Intro_extensions.html">
<link title="Intro_namespaces" rel="Chapter" href="Intro_namespaces.html">
<link title="Intro_events" rel="Chapter" href="Intro_events.html">
<link title="Intro_resolution" rel="Chapter" href="Intro_resolution.html">
<link title="Intro_getting_started" rel="Chapter" href="Intro_getting_started.html">
<link title="Intro_advanced" rel="Chapter" href="Intro_advanced.html">
<link title="Intro_preprocessor" rel="Chapter" href="Intro_preprocessor.html">
<link title="Example_readme" rel="Chapter" href="Example_readme.html"><link title="The readme processor" rel="Section" href="#1_Thereadmeprocessor">
<link title="The readme DTD" rel="Subsection" href="#2_ThereadmeDTD">
<link title="The readme converter to HTML" rel="Subsection" href="#2_ThereadmeconvertertoHTML">
<link title="The readme converter to ASCII" rel="Subsection" href="#2_ThereadmeconvertertoASCII">
<link title="The main program" rel="Subsection" href="#2_Themainprogram">
<title>PXP Reference : Example_readme</title>
</head>
<body>
<div class="navbar"><a href="Intro_preprocessor.html">Previous</a>
&nbsp;<a href="index.html">Up</a>
&nbsp;</div>
<center><h1>Example_readme</h1></center>
<br>
<br>
<a name="1_Thereadmeprocessor"></a>
<h1>The <code class="code">readme</code> processor</h1>
<p>


<p>

The task of the <code class="code">readme</code> processor is to convert a document conforming
to the XML DTD "readme.dtd" into an HTML document or a text document.
This example especially demonstrates how to use node extensions to add
custom methods to nodes (see <a href="Intro_extensions.html"><code class="code"><span class="constructor">Intro_extensions</span></code></a>), and how to use the
object-oriented feature of late binding so that every node type
behaves differently.
<p>

Note that the converter code dates back from 1999. Nowadays I would
probably have written it as a purely functional transformer. This
task is now left to the reader...
<p>

<a name="2_ThereadmeDTD"></a>
<h2>The <code class="code">readme</code> DTD</h2>
<p>

The motivation for <code class="code">readme</code> was that I often wrote two versions of
files such as README and INSTALL explaining aspects of a distributed
software archive; one version was ASCII-formatted, the other was
written in HTML. Maintaining both versions meant double amount of
work, and changes of one version could be forgotten in the other
version. To improve this situation I invented the <code class="code">readme</code> DTD which
allows me to maintain only one source written as XML document, and to
generate both the ASCII and the HTML version from it
<p>

In this section, I explain only the DTD. The <code class="code">readme</code> DTD is
contained in the PXP distribution together with the two converters to
produce ASCII and HTML.
<p>

The documents have a simple structure: There are up to three levels of nested
sections, paragraphs, item lists, footnotes, hyperlinks, and text emphasis. The
outermost element has usually the type <code class="code">readme</code>, it is
declared by
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;readme&nbsp;(sect1+)&gt;<br>
&lt;!<span class="constructor">ATTLIST</span>&nbsp;readme<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;<span class="constructor">CDATA</span>&nbsp;<span class="keywordsign">#</span><span class="constructor">REQUIRED</span>&gt;<br>
</code><pre></pre>
<p>

This means that this element contains one or more sections of the first level
(element type <code class="code">sect1</code>), and that the element has a required
attribute <code class="code">title</code> containing character data (<code class="code"><span class="constructor">CDATA</span></code>). Note that
<code class="code">readme</code> elements must not contain text data.
<p>

The three levels of sections are declared as follows:
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;sect1&nbsp;(title,(sect2<span class="keywordsign">|</span>p<span class="keywordsign">|</span>ul)+)&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;sect2&nbsp;(title,(sect3<span class="keywordsign">|</span>p<span class="keywordsign">|</span>ul)+)&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;sect3&nbsp;(title,(p<span class="keywordsign">|</span>ul)+)&gt;<br>
</code><pre></pre>
<p>

Every section has a <code class="code">title</code> element as first subelement. After
the title an arbitrary but non-empty sequence of inner sections, paragraphs and
item lists follows. Note that the inner sections must belong to the next higher
section level; <code class="code">sect3</code> elements must not contain inner
sections because there is no next higher level.
<p>

Obviously, all three declarations allow paragraphs (<code class="code">p</code>) and item
lists (<code class="code">ul</code>). The definition can be simplified at this point by using
a parameter entity:
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ENTITY</span>&nbsp;%&nbsp;p.like&nbsp;<span class="string">"p|ul"</span>&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;sect1&nbsp;(title,(sect2|%p.like;)+)&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;sect2&nbsp;(title,(sect3|%p.like;)+)&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;sect3&nbsp;(title,(%p.like;)+)&gt;<br>
</code><pre></pre>
<p>

Here, the entity <code class="code">p.like</code> is nothing but a macro abbreviating the same
sequence of declarations; if new elements on the same level as <code class="code">p</code> and
<code class="code">ul</code> are later added, it is sufficient only to change the entity
definition. Note that there are some restrictions on the usage of
entities in this context; most important, entities containing a left
parenthesis must also contain the corresponding right parenthesis.
<p>

Note that the entity <code class="code">p.like</code> is a <b>parameter</b> entity, i.e. the
<code class="code"><span class="constructor">ENTITY</span></code> declaration contains a percent sign, and the entity is
referred to by <code class="code">%p.like;</code>. This kind of entity must be used to
abbreviate parts of the DTD; the <b>general</b> entities declared without
percent sign and referred to as <code class="code"><span class="keywordsign">&amp;</span>amp;name;</code> are not allowed in this
context.
<p>

The <code class="code">title</code> element specifies the title of the section in
which it occurs. The title is given as character data, optionally interspersed
with line breaks (<code class="code">br</code>):
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;title&nbsp;(<span class="keywordsign">#</span><span class="constructor">PCDATA</span><span class="keywordsign">|</span>br)*&gt;<br>
</code><pre></pre>
<p>

Compared with the <code class="code">title</code> <b>attribute</b> of the <code class="code">readme</code> element, this
element allows inner markup (i.e. <code class="code">br</code>) while attribute values do not:
It is an error if an attribute value contains the left angle bracket &lt;
literally such that it is impossible to include inner elements.
<p>

The paragraph element <code class="code">p</code> has a structure similar to
<code class="code">title</code>, but it allows more inner elements:
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ENTITY</span>&nbsp;%&nbsp;text&nbsp;<span class="string">"br|code|em|footnote|a"</span>&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;p&nbsp;(<span class="keywordsign">#</span><span class="constructor">PCDATA</span>|%text;)*&gt;<br>
</code><pre></pre>
<p>

Line breaks do not have inner structure, so they are declared as being empty:
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;br&nbsp;<span class="constructor">EMPTY</span>&gt;<br>
</code><pre></pre>
<p>

This means that really nothing is allowed within <code class="code">br</code>; you must always
write <code class="code">&lt;br&gt;&lt;/br&gt;</code> or abbreviated <code class="code">&lt;br/&gt;</code>.
<p>

Code samples should be marked up by the <code class="code">code</code> tag; emphasized
text can be indicated by <code class="code">em</code>:
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;code&nbsp;(<span class="keywordsign">#</span><span class="constructor">PCDATA</span>)&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;em&nbsp;(<span class="keywordsign">#</span><span class="constructor">PCDATA</span>|%text;)*&gt;<br>
</code><pre></pre>
<p>

That <code class="code">code</code> elements are not allowed to contain further markup
while <code class="code">em</code> elements do is a design decision by the author of
the DTD.
<p>

Unordered lists simply consists of one or more list items, and a list item may
contain paragraph-level material:
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;ul&nbsp;(li+)&gt;<br>
<br>
&lt;!<span class="constructor">ELEMENT</span>&nbsp;li&nbsp;(%p.like;)*&gt;<br>
</code><pre></pre>
<p>

Footnotes are described by the text of the note; this text may contain
text-level markup. There is no mechanism to describe the numbering scheme of
footnotes, or to specify how footnote references are printed.
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;footnote&nbsp;(<span class="keywordsign">#</span><span class="constructor">PCDATA</span>|%text;)*&gt;<br>
</code><pre></pre>
<p>

Hyperlinks are written as in HTML. The anchor tag contains the text
describing where the link points to, and the <code class="code">href</code> attribute is the
pointer (as URL). There is no way to describe locations of "hash
marks". If the link refers to another <code class="code">readme</code> document, the attribute
<code class="code">readmeref</code> should be used instead of <code class="code">href</code>.  The reason is that the
converted document has usually a different system identifier (file
name), and the link to a converted document must be converted, too.
<p>

<pre></pre><code class="code">&lt;!<span class="constructor">ELEMENT</span>&nbsp;a&nbsp;(<span class="keywordsign">#</span><span class="constructor">PCDATA</span>)*&gt;<br>
&lt;!<span class="constructor">ATTLIST</span>&nbsp;a&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;href&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">CDATA</span>&nbsp;<span class="keywordsign">#</span><span class="constructor">IMPLIED</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readmeref&nbsp;<span class="constructor">CDATA</span>&nbsp;<span class="keywordsign">#</span><span class="constructor">IMPLIED</span><br>
&gt;<br>
</code><pre></pre>
<p>

Note that although it is only sensible to specify one of the two attributes,
the DTD has no means to express this restriction.
<p>

So far the DTD. Finally, here is a sample document for it:
<p>

<pre></pre><code class="code">&lt;?xml&nbsp;version=<span class="string">"1.0"</span>&nbsp;encoding=<span class="string">"ISO-8859-1"</span><span class="keywordsign">?&gt;</span><br>
&lt;!<span class="constructor">DOCTYPE</span>&nbsp;readme&nbsp;<span class="constructor">SYSTEM</span>&nbsp;<span class="string">"readme.dtd"</span>&gt;<br>
&lt;readme&nbsp;title=<span class="string">"How&nbsp;to&nbsp;use&nbsp;the&nbsp;readme&nbsp;converters"</span>&gt;<br>
&nbsp;&nbsp;&lt;sect1&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;<span class="constructor">Usage</span>&lt;/title&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">The</span>&nbsp;&lt;em&gt;readme&lt;/em&gt;&nbsp;converter&nbsp;is&nbsp;invoked&nbsp;on&nbsp;the&nbsp;command&nbsp;line&nbsp;by:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;code&gt;readme&nbsp;[&nbsp;-text&nbsp;<span class="keywordsign">|</span>&nbsp;-html&nbsp;]&nbsp;input.xml&lt;/code&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Here</span>&nbsp;is&nbsp;a&nbsp;list&nbsp;<span class="keyword">of</span>&nbsp;options:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;code&gt;-text&lt;/code&gt;:&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;specifies&nbsp;that&nbsp;<span class="constructor">ASCII</span>&nbsp;output&nbsp;should&nbsp;be&nbsp;produced&lt;/p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;code&gt;-html&lt;/code&gt;:&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;specifies&nbsp;that&nbsp;<span class="constructor">HTML</span>&nbsp;output&nbsp;should&nbsp;be&nbsp;produced&lt;/p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">The</span>&nbsp;input&nbsp;file&nbsp;must&nbsp;be&nbsp;given&nbsp;on&nbsp;the&nbsp;command&nbsp;line.&nbsp;<span class="constructor">The</span>&nbsp;converted&nbsp;output&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printed&nbsp;<span class="keyword">to</span>&nbsp;&lt;em&gt;stdout&lt;/em&gt;.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br>
&nbsp;&nbsp;&lt;/sect1&gt;<br>
&nbsp;&nbsp;&lt;sect1&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;<span class="constructor">Author</span>&lt;/title&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">The</span>&nbsp;program&nbsp;has&nbsp;been&nbsp;written&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href=<span class="string">"mailto:gerd@gerd-stolpmann.de"</span>&gt;<span class="constructor">Gerd</span>&nbsp;<span class="constructor">Stolpmann</span>&lt;/a&gt;.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br>
&nbsp;&nbsp;&lt;/sect1&gt;<br>
&lt;/readme&gt;<br>
</code><pre></pre>
<p>

<a name="2_ThereadmeconvertertoHTML"></a>
<h2>The <code class="code">readme</code> converter to HTML</h2>
<p>

The converter from <code class="code">readme</code> documents to HTML documents follows
strictly the approach to define one extension class per element
type. The generated HTML code is structurally similar to the <code class="code">readme</code>
source, because of this most elements can be converted in the
following straigh-forward way: Given the input element
<p>

<code class="code">&lt;e&gt;content&lt;/e&gt;</code>
<p>

the conversion text is the concatenation of a computed prefix, the
recursively converted content, and a computed suffix.
<p>

Only one element type cannot be handled by this scheme:
<code class="code">footnote</code>. Footnotes are collected while they are found in the input
text, and they are printed after the main text has been converted and
printed.
<p>

Now we comment to source code of the <code class="code">to_html.ml</code> converter.
<p>

<a name="3_Header"></a>
<h3>Header</h3>
<p>

<pre></pre><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">Pxp_types</span><br>
<span class="keyword">open</span>&nbsp;<span class="constructor">Pxp_document</span><br>
<span class="keyword">open</span>&nbsp;<span class="constructor">Pxp_dtd</span>.<span class="constructor">Entity</span><br>
</code><pre></pre>
<p>

<a name="3_Typedeclarations"></a>
<h3>Type declarations</h3>
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;<span class="keyword">type</span>&nbsp;footnote_printer&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;footnote_to_html&nbsp;:&nbsp;store_type&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;out_channel&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
<br>
<span class="keyword">and</span>&nbsp;store_type&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;alloc_footnote&nbsp;:&nbsp;footnote_printer&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;print_footnotes&nbsp;:&nbsp;out_channel&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

For comments see the implementations below.
<p>

<a name="3_Theclassstoreoftypestoretype"></a>
<h3>The class <code class="code">store</code> of type <code class="code">store_type</code> </h3>
<p>

The <code class="code">store</code> is a container for footnotes. You can add a footnote by
invoking <code class="code">alloc_footnote</code>; the argument is an object of the class
<code class="code">footnote_printer</code>, the method returns the number of the footnote. The
interesting property of a footnote is that it can be converted to
HTML, so a <code class="code">footnote_printer</code> is an object with a method
<code class="code">footnote_to_html</code>. The class <code class="code">footnote</code> which is defined below has a
compatible method <code class="code">footnote_to_html</code> such that objects created from it
can be used as <code class="code">footnote_printer</code>s.
<p>

The other method, <code class="code">print_footnotes</code> prints the footnotes as
definition list, and is typically invoked after the main material of the page
has already been printed. Every item of the list is printed by
<code class="code">footnote_to_html</code>.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;store&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;footnotes&nbsp;=&nbsp;(&nbsp;[]&nbsp;:&nbsp;(int&nbsp;*&nbsp;footnote_printer)&nbsp;list&nbsp;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;next_footnote_number&nbsp;=&nbsp;1<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;alloc_footnote&nbsp;n&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;number&nbsp;=&nbsp;next_footnote_number&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_footnote_number&nbsp;&lt;-&nbsp;number+1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footnotes&nbsp;&lt;-&nbsp;footnotes&nbsp;@&nbsp;[&nbsp;number,&nbsp;n&nbsp;];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;print_footnotes&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;footnotes&nbsp;&lt;&gt;&nbsp;[]&nbsp;<span class="keyword">then</span>&nbsp;<span class="keyword">begin</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;hr&nbsp;align=left&nbsp;noshade=noshade&nbsp;width=\"30%\"&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;dl&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">List</span>.iter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;(_,n)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;<span class="keywordsign">#</span>&nbsp;footnote_to_html&nbsp;(self&nbsp;:&nbsp;<span class="keywordsign">#</span>store_type&nbsp;:&gt;&nbsp;store_type)&nbsp;ch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footnotes;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;/dl&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

<a name="3_Thefunctionescapehtml"></a>
<h3>The function <code class="code">escape_html</code></h3>
<p>

This function converts the characters &lt;, &gt;, &amp;, and " to their HTML
representations. For example, 
<p>

<pre></pre><code class="code">&nbsp;escape_html&nbsp;<span class="string">"&lt;&gt;"</span>&nbsp;=&nbsp;<span class="string">"&amp;lt;&amp;gt;"</span>&nbsp;</code><pre></pre>
<p>

Other characters are left unchanged.
<p>

<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;escape_html&nbsp;s&nbsp;=<br>
&nbsp;&nbsp;<span class="constructor">Str</span>.global_substitute<br>
&nbsp;&nbsp;&nbsp;&nbsp;(<span class="constructor">Str</span>.regexp&nbsp;<span class="string">"&lt;\\|&gt;\\|&amp;\\|\"\\|@\\|:"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;<span class="constructor">Str</span>.matched_string&nbsp;s&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"&lt;"</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">"&amp;lt;"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">"&gt;"</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">"&amp;gt;"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">"&amp;"</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">"&amp;amp;"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">"\""</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">"&amp;quot;"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">"@"</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">"&amp;#64;"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">":"</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">"&amp;#58;"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">assert</span>&nbsp;<span class="keyword">false</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;s<br>
</code><pre></pre>
<p>

Note (of 2009): There is also the Ocamlnet function
<code class="code"><span class="constructor">Netencoding</span>.<span class="constructor">Html</span>.encode</code> one can use. It has a special XML mode.
<p>

<a name="3_Thevirtualclassshared"></a>
<h3>The virtual class <code class="code">shared</code></h3>
<p>

This virtual class is the abstract superclass of the extension classes
shown below. It defines the standard methods <code class="code">clone</code>, <code class="code">node</code>, and
<code class="code">set_node</code>, and declares the type of the virtual method
<code class="code">to_html</code>. This method recursively traverses the whole element tree,
and prints the converted HTML code to the output channel passed as
second argument. The first argument is the reference to the global
<code class="code">store</code> object which collects the footnotes.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;<span class="keyword">virtual</span>&nbsp;shared&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;---&nbsp;default_ext&nbsp;---&nbsp;*)</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;node&nbsp;=&nbsp;(<span class="constructor">None</span>&nbsp;:&nbsp;shared&nbsp;node&nbsp;option)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;clone&nbsp;=&nbsp;{&lt;&nbsp;&gt;}&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;node&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;node&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">assert</span>&nbsp;<span class="keyword">false</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;n&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;n<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_node&nbsp;n&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;&lt;-&nbsp;<span class="constructor">Some</span>&nbsp;n<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;---&nbsp;virtual&nbsp;---&nbsp;*)</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;<span class="keyword">virtual</span>&nbsp;to_html&nbsp;:&nbsp;store&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;out_channel&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

For an introduction into extension classes see <a href="Intro_extensions.html"><code class="code"><span class="constructor">Intro_extensions</span></code></a>.
<p>

<a name="3_Theclassonlydata"></a>
<h3>The class <code class="code">only_data</code></h3>
<p>

This class defines <code class="code">to_html</code> such that the character data of the
current node is converted to HTML. Note that <code class="code">self</code> is an extension
object (of type <a href="Pxp_document.extension.html"><code class="code"><span class="constructor">Pxp_document</span>.extension</code></a>), <code class="code">self <span class="keywordsign">#</span> node</code> is the node
object (of type <a href="Pxp_document.node.html"><code class="code"><span class="constructor">Pxp_document</span>.node</code></a>), and <code class="code">self <span class="keywordsign">#</span> node <span class="keywordsign">#</span> data</code>
returns the character data of the node (see
<a href="Pxp_document.node.html#METHODdata"><code class="code"><span class="constructor">Pxp_document</span>.node.data</code></a>).
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;only_data&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(escape_html&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;data))<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

<a name="3_Theclassreadme"></a>
<h3>The class <code class="code">readme</code></h3>
<p>

This class converts elements of type <code class="code">readme</code> to HTML. Such an
element is (by definition) always the root element of the document. First, the
HTML header is printed; the <code class="code">title</code> attribute of the element
determines the title of the HTML page. Some aspects of the HTML page can be
configured by setting certain parameter entities, for example the background
color, the text color, and link colors. After the header, the
<code class="code">body</code> tag, and the headline have been printed, the contents
of the page are converted by invoking <code class="code">to_html</code> on all
children of the current node (which is the root node). Then, the footnotes are
appended to this by telling the global <code class="code">store</code> object to print
the footnotes. Finally, the end tags of the HTML pages are printed.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;readme&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;output&nbsp;header&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;<span class="string">"&lt;!DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;\"-//W3C//DTD&nbsp;HTML&nbsp;3.2&nbsp;Final//EN\"&gt;"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;<span class="string">"&lt;!--&nbsp;WARNING!&nbsp;This&nbsp;is&nbsp;a&nbsp;generated&nbsp;file,&nbsp;do&nbsp;not&nbsp;edit!&nbsp;--&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;title&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;attribute&nbsp;<span class="string">"title"</span>&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Value</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;s<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">assert</span>&nbsp;<span class="keyword">false</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_header&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:header"</span>)&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_trailer&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:trailer"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_bgcolor&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:bgcolor"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">"white"</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_textcolor&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:textcolor"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_alinkcolor&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:alinkcolor"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_vlinkcolor&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:vlinkcolor"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_linkcolor&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:linkcolor"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;html_background&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;replacement_text<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;dtd&nbsp;<span class="keywordsign">#</span>&nbsp;par_entity&nbsp;<span class="string">"readme:html:background"</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">WF_error</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;html&gt;&lt;header&gt;&lt;title&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(escape_html&nbsp;title);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;/title&gt;&lt;/header&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;body&nbsp;"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">List</span>.iter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;(name,value)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;value&nbsp;&lt;&gt;&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">then</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(name&nbsp;^&nbsp;<span class="string">"=\""</span>&nbsp;^&nbsp;escape_html&nbsp;value&nbsp;^&nbsp;<span class="string">"\"&nbsp;"</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;<span class="string">"bgcolor"</span>,&nbsp;&nbsp;&nbsp;&nbsp;html_bgcolor;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"text"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html_textcolor;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"link"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html_linkcolor;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"alink"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html_alinkcolor;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"vlink"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html_vlinkcolor;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;html_header;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;h1&gt;"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(escape_html&nbsp;title);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;/h1&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;process&nbsp;main&nbsp;content:&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">List</span>.iter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;n&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;n&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_html&nbsp;store&nbsp;ch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;sub_nodes);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;now&nbsp;process&nbsp;footnotes&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;store&nbsp;<span class="keywordsign">#</span>&nbsp;print_footnotes&nbsp;ch;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;trailer&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;html_trailer;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;/html&gt;\n"</span>;<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

This class is an example how to access the value of an attribute: The
value is determined by invoking <code class="code">self <span class="keywordsign">#</span> node <span class="keywordsign">#</span> attribute <span class="string">"title"</span></code> (see
<a href="Pxp_document.node.html#METHODattribute"><code class="code"><span class="constructor">Pxp_document</span>.node.attribute</code></a>). As this attribute has been declared
as CDATA and as being required, the value has always the form <code class="code"><span class="constructor">Value</span>
s</code> where <code class="code">s</code> is the string value of the attribute. Attribute values
have type <a href="Pxp_types.html#TYPEatt_value"><code class="code"><span class="constructor">Pxp_types</span>.att_value</code></a>.
<p>

You can also see how entity contents can be accessed. A parameter
entity object can be looked up by <code class="code">self <span class="keywordsign">#</span> node <span class="keywordsign">#</span> dtd <span class="keywordsign">#</span> par_entity
<span class="string">"name"</span></code> (see <a href="Pxp_dtd.dtd.html#METHODpar_entity"><code class="code"><span class="constructor">Pxp_dtd</span>.dtd.par_entity</code></a>), and by invoking
<a href="Pxp_dtd.Entity.html#VALreplacement_text"><code class="code"><span class="constructor">Pxp_dtd</span>.<span class="constructor">Entity</span>.replacement_text</code></a> the value of the entity is returned
after inner parameter and character entities have been processed. Note
that you must use <a href="Pxp_dtd.dtd.html#METHODgen_entity"><code class="code"><span class="constructor">Pxp_dtd</span>.dtd.gen_entity</code></a> instead of <code class="code">par_entity</code> to
access general entities.
<p>

<a name="3_Theclassessectionsect1sect2andsect3"></a>
<h3>The classes <code class="code">section</code>, <code class="code">sect1</code>, <code class="code">sect2</code>, and <code class="code">sect3</code></h3>
<p>

As the conversion process is very similar, the conversion classes of the three
section levels are derived from the more general <code class="code">section</code>
class. The HTML code of the section levels only differs in the type of the
headline, and because of this the classes describing the section levels can be
computed by replacing the class argument <code class="code">the_tag</code> of
<code class="code">section</code> by the HTML name of the headline tag.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;section&nbsp;the_tag&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;tag&nbsp;=&nbsp;the_tag<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;sub_nodes&nbsp;=&nbsp;self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;sub_nodes&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;sub_nodes&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title_node&nbsp;::&nbsp;rest&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(<span class="string">"&lt;"</span>&nbsp;^&nbsp;tag&nbsp;^&nbsp;<span class="string">"&gt;\n"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title_node&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_html&nbsp;store&nbsp;ch;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(<span class="string">"\n&lt;/"</span>&nbsp;^&nbsp;tag&nbsp;^&nbsp;<span class="string">"&gt;"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">List</span>.iter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;n&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;n&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_html&nbsp;store&nbsp;ch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rest<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">assert</span>&nbsp;<span class="keyword">false</span><br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
<br>
<span class="keyword">class</span>&nbsp;sect1&nbsp;=&nbsp;section&nbsp;<span class="string">"h1"</span><br>
<span class="keyword">class</span>&nbsp;sect2&nbsp;=&nbsp;section&nbsp;<span class="string">"h3"</span><br>
<span class="keyword">class</span>&nbsp;sect3&nbsp;=&nbsp;section&nbsp;<span class="string">"h4"</span><br>
</code><pre></pre>
<p>

Section elements are converted to HTML by printing a headline and then
converting the contents of the element recursively. More precisely,
the first sub-element is always a <code class="code">title</code> element, and the other
elements are the contents of the section. This structure is declared
in the DTD, and it is guaranteed that the document matches the
DTD. Because of this the title node can be separated from the rest
without any checks.
<p>

Both the title node, and the body nodes are then converted to HTML by
calling <code class="code">to_html</code> on them.
<p>

<a name="3_Theclassesmaptagpemulandli"></a>
<h3>The classes <code class="code">map_tag</code>, <code class="code">p</code>, <code class="code">em</code>, <code class="code">ul</code>, and <code class="code">li</code> </h3>
<p>

Several element types are converted to HTML by simply mapping them to
corresponding HTML element types. The class <code class="code">map_tag</code> implements this,
and the class argument <code class="code">the_target_tag</code> determines the tag name to map
to. The output consists of the start tag, the recursively converted
inner elements, and the end tag.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;map_tag&nbsp;the_target_tag&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;target_tag&nbsp;=&nbsp;the_target_tag<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(<span class="string">"&lt;"</span>&nbsp;^&nbsp;target_tag&nbsp;^&nbsp;<span class="string">"&gt;\n"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">List</span>.iter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;n&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;n&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_html&nbsp;store&nbsp;ch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;sub_nodes);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(<span class="string">"\n&lt;/"</span>&nbsp;^&nbsp;target_tag&nbsp;^&nbsp;<span class="string">"&gt;"</span>);<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
<br>
<span class="keyword">class</span>&nbsp;p&nbsp;=&nbsp;map_tag&nbsp;<span class="string">"p"</span><br>
<span class="keyword">class</span>&nbsp;em&nbsp;=&nbsp;map_tag&nbsp;<span class="string">"b"</span><br>
<span class="keyword">class</span>&nbsp;ul&nbsp;=&nbsp;map_tag&nbsp;<span class="string">"ul"</span><br>
<span class="keyword">class</span>&nbsp;li&nbsp;=&nbsp;map_tag&nbsp;<span class="string">"li"</span><br>
</code><pre></pre>
<p>

<a name="3_Theclassbr"></a>
<h3>The class <code class="code">br</code></h3>
<p>

Element of type <code class="code">br</code> are mapped to the same HTML type. Note that HTML
forbids the end tag of <code class="code">br</code>.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;br&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;br&gt;\n"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">List</span>.iter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;n&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;n&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_html&nbsp;store&nbsp;ch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;sub_nodes);<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

<a name="3_Theclasscode"></a>
<h3>The class <code class="code">code</code></h3>
<p>

The <code class="code">code</code> type is converted to a <code class="code">pre</code> section (preformatted
text). As the meaning of tabs is unspecified in HTML, tabs are
expanded to spaces.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;code&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;data&nbsp;=&nbsp;self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;data&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;convert&nbsp;tabs&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;l&nbsp;=&nbsp;<span class="constructor">String</span>.length&nbsp;data&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;preprocess&nbsp;i&nbsp;column&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;this&nbsp;is&nbsp;very&nbsp;ineffective&nbsp;but&nbsp;comprehensible:&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;i&nbsp;&lt;&nbsp;l&nbsp;<span class="keyword">then</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;data.[i]&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'\t'</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;n&nbsp;=&nbsp;8&nbsp;-&nbsp;(column&nbsp;<span class="keyword">mod</span>&nbsp;8)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">String</span>.make&nbsp;n&nbsp;<span class="string">'&nbsp;'</span>&nbsp;^&nbsp;preprocess&nbsp;(i+1)&nbsp;(column&nbsp;+&nbsp;n)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'\n'</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"\n"</span>&nbsp;^&nbsp;preprocess&nbsp;(i+1)&nbsp;0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;c&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">String</span>.make&nbsp;1&nbsp;c&nbsp;^&nbsp;preprocess&nbsp;(i+1)&nbsp;(column&nbsp;+&nbsp;1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">""</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;p&gt;&lt;pre&gt;"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(escape_html&nbsp;(preprocess&nbsp;0&nbsp;0));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;/pre&gt;&lt;/p&gt;"</span>;<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

<a name="3_Theclassa"></a>
<h3>The class <code class="code">a</code></h3>
<p>

Hyperlinks, expressed by the <code class="code">a</code> element type, are converted to the
HTML <code class="code">a</code> type. If the target of the hyperlink is given by <code class="code">href</code>, the
URL of this attribute can be used directly. Alternatively, the target
can be given by <code class="code">readmeref</code> in which case the ".html" suffix must be
added to the file name.
<p>

Note that within <code class="code">a</code> only #PCDATA is allowed, so the contents can be
converted directly by applying <code class="code">escape_html</code> to the character data
contents.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;a&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;a&nbsp;"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;href&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;attribute&nbsp;<span class="string">"href"</span>&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Value</span>&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;escape_html&nbsp;v<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Valuelist</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">assert</span>&nbsp;<span class="keyword">false</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Implied_value</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">begin</span>&nbsp;<span class="keyword">match</span>&nbsp;self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;attribute&nbsp;<span class="string">"readmeref"</span>&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Value</span>&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;escape_html&nbsp;v&nbsp;^&nbsp;<span class="string">".html"</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Valuelist</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">assert</span>&nbsp;<span class="keyword">false</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Implied_value</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">""</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;href&nbsp;&lt;&gt;&nbsp;<span class="string">""</span>&nbsp;<span class="keyword">then</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(<span class="string">"href=\""</span>&nbsp;&nbsp;^&nbsp;href&nbsp;^&nbsp;<span class="string">"\""</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&gt;"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(escape_html&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;data));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;<span class="string">"&lt;/a&gt;"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

<a name="3_Theclassfootnote"></a>
<h3>The class <code class="code">footnote</code></h3>
<p>

The <code class="code">footnote</code> class has two methods: <code class="code">to_html</code> to convert the
footnote reference to HTML, and <code class="code">footnote_to_html</code> to convert the
footnote text itself.
<p>

The footnote reference is converted to a local hyperlink; more
precisely, to two anchor tags which are connected with each other. The
text anchor points to the footnote anchor, and the footnote anchor
points to the text anchor.
<p>

The footnote must be allocated in the <code class="code">store</code> object. By allocating
the footnote, you get the number of the footnote, and the text of the
footnote is stored until the end of the HTML page is reached when the
footnotes can be printed. The <code class="code">to_html</code> method stores simply the
object itself, such that the <code class="code">footnote_to_html</code> method is invoked on
the same object that encountered the footnote.
<p>

The <code class="code">to_html</code> method only allocates the footnote, and prints the
reference anchor, but it does not print nor convert the contents of the
note. This is deferred until the footnotes actually get printed, i.e. the
recursive call of <code class="code">to_html</code> on the sub nodes is done by
<code class="code">footnote_to_html</code>
<p>

Note that this technique does not work if you make another footnote
within a footnote; the second footnote gets allocated but not printed.
<p>

<pre></pre><code class="code"><span class="keyword">class</span>&nbsp;footnote&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">object</span>&nbsp;(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">inherit</span>&nbsp;shared<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;footnote_number&nbsp;=&nbsp;0<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;number&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;store&nbsp;<span class="keywordsign">#</span>&nbsp;alloc_footnote&nbsp;(self&nbsp;:&nbsp;<span class="keywordsign">#</span>shared&nbsp;:&gt;&nbsp;footnote_printer)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;foot_anchor&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"footnote"</span>&nbsp;^&nbsp;string_of_int&nbsp;number&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;text_anchor&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"textnote"</span>&nbsp;^&nbsp;string_of_int&nbsp;number&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footnote_number&nbsp;&lt;-&nbsp;number;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(&nbsp;<span class="string">"&lt;a&nbsp;name=\""</span>&nbsp;^&nbsp;text_anchor&nbsp;^&nbsp;<span class="string">"\"&nbsp;href=\"#"</span>&nbsp;^&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foot_anchor&nbsp;^&nbsp;<span class="string">"\"&gt;["</span>&nbsp;^&nbsp;string_of_int&nbsp;number&nbsp;^&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"]&lt;/a&gt;"</span>&nbsp;)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;footnote_to_html&nbsp;store&nbsp;ch&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;prerequisite:&nbsp;we&nbsp;are&nbsp;in&nbsp;a&nbsp;definition&nbsp;list&nbsp;&lt;dl&gt;...&lt;/dl&gt;&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;foot_anchor&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"footnote"</span>&nbsp;^&nbsp;string_of_int&nbsp;footnote_number&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;text_anchor&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"textnote"</span>&nbsp;^&nbsp;string_of_int&nbsp;footnote_number&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(<span class="string">"&lt;dt&gt;&lt;a&nbsp;name=\""</span>&nbsp;^&nbsp;foot_anchor&nbsp;^&nbsp;<span class="string">"\"&nbsp;href=\"#"</span>&nbsp;^&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text_anchor&nbsp;^&nbsp;<span class="string">"\"&gt;["</span>&nbsp;^&nbsp;string_of_int&nbsp;footnote_number&nbsp;^&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"]&lt;/a&gt;&lt;/dt&gt;\n&lt;dd&gt;"</span>);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">List</span>.iter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;n&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;n&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_html&nbsp;store&nbsp;ch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(self&nbsp;<span class="keywordsign">#</span>&nbsp;node&nbsp;<span class="keywordsign">#</span>&nbsp;sub_nodes);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_string&nbsp;ch&nbsp;(<span class="string">"\n&lt;/dd&gt;"</span>)<br>
&nbsp;<br>
&nbsp;&nbsp;<span class="keyword">end</span><br>
</code><pre></pre>
<p>

<a name="3_Thespecificationofthedocumentmodel"></a>
<h3>The specification of the document model</h3>
<p>

This code sets up the hash table that connects element types with the
exemplars of the extension classes that convert the elements to HTML.
See <a href="Intro_extensions.html#bindext"><i>How to bind extension classes to element types</i></a> for comments, and 
<a href="Pxp_document.html#VALmake_spec_from_alist"><code class="code"><span class="constructor">Pxp_document</span>.make_spec_from_alist</code></a> for the function definition.
<p>

<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;tag_map&nbsp;=<br>
&nbsp;&nbsp;make_spec_from_alist<br>
&nbsp;&nbsp;&nbsp;&nbsp;~data_exemplar:(<span class="keyword">new</span>&nbsp;data_impl&nbsp;(<span class="keyword">new</span>&nbsp;only_data))<br>
&nbsp;&nbsp;&nbsp;&nbsp;~default_element_exemplar:(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;no_markup))<br>
&nbsp;&nbsp;&nbsp;&nbsp;~element_alist:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;<span class="string">"readme"</span>,&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;readme));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"sect1"</span>,&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;sect1));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"sect2"</span>,&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;sect2));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"sect3"</span>,&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;sect3));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"title"</span>,&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;no_markup));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"p"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;p));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"br"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;br));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"code"</span>,&nbsp;&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;code));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"em"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;em));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"ul"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;ul));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"li"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;li));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"footnote"</span>,&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;footnote&nbsp;:&nbsp;<span class="keywordsign">#</span>shared&nbsp;:&gt;&nbsp;shared));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"a"</span>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">new</span>&nbsp;element_impl&nbsp;(<span class="keyword">new</span>&nbsp;a));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;()<br>
</code><pre></pre>
<p>

<a name="2_ThereadmeconvertertoASCII"></a>
<h2>The <code class="code">readme</code> converter to ASCII</h2>
<p>

This converter is quite similar to the HTML converter, and not presented
here. The source code is part of the PXP source tarball, however.
<p>

<a name="2_Themainprogram"></a>
<h2>The main program</h2>
<p>

<pre></pre><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">Pxp_types</span><br>
<span class="keyword">open</span>&nbsp;<span class="constructor">Pxp_document</span><br>
<span class="keyword">open</span>&nbsp;<span class="constructor">Pxp_tree_parser</span><br>
<br>
<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;print_error&nbsp;e&nbsp;=<br>
&nbsp;&nbsp;prerr_endline(string_of_exn&nbsp;e)<br>
<br>
<br>
<span class="keyword">let</span>&nbsp;run&nbsp;f&nbsp;a&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;f&nbsp;a&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;print_error&nbsp;e<br>
<br>
<br>
<span class="keyword">let</span>&nbsp;convert_to_html&nbsp;filename&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;document&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;parse_document_entity<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;default_config&nbsp;<span class="keyword">with</span>&nbsp;encoding&nbsp;=&nbsp;<span class="keywordsign">`</span><span class="constructor">Enc_iso88591</span>&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(from_file&nbsp;filename)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">To_html</span>.tag_map<br>
&nbsp;&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;root&nbsp;=&nbsp;document&nbsp;<span class="keywordsign">#</span>&nbsp;root&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;store&nbsp;=&nbsp;<span class="keyword">new</span>&nbsp;<span class="constructor">To_html</span>.store&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;root&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_html&nbsp;store&nbsp;stdout<br>
<br>
<br>
<span class="keyword">let</span>&nbsp;convert_to_text&nbsp;filename&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;document&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;parse_document_entity<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default_config<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(from_file&nbsp;filename)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">To_text</span>.tag_map<br>
&nbsp;&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;root&nbsp;=&nbsp;document&nbsp;<span class="keywordsign">#</span>&nbsp;root&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;store&nbsp;=&nbsp;<span class="keyword">new</span>&nbsp;<span class="constructor">To_text</span>.store&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;box&nbsp;=&nbsp;<span class="keyword">new</span>&nbsp;<span class="constructor">To_text</span>.box&nbsp;79&nbsp;79&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;root&nbsp;<span class="keywordsign">#</span>&nbsp;extension&nbsp;<span class="keywordsign">#</span>&nbsp;to_box&nbsp;store&nbsp;box;<br>
&nbsp;&nbsp;box&nbsp;<span class="keywordsign">#</span>&nbsp;output&nbsp;0&nbsp;0&nbsp;stdout<br>
<br>
<br>
<span class="keyword">let</span>&nbsp;main()&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;want_html&nbsp;=&nbsp;ref&nbsp;<span class="keyword">false</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;want_text&nbsp;=&nbsp;ref&nbsp;<span class="keyword">false</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;filename&nbsp;=&nbsp;ref&nbsp;<span class="constructor">None</span>&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="constructor">Arg</span>.parse<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;<span class="string">"-html"</span>,&nbsp;<span class="constructor">Arg</span>.<span class="constructor">Set</span>&nbsp;want_html,&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"&nbsp;&nbsp;convert&nbsp;file&nbsp;to&nbsp;html"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"-text"</span>,&nbsp;<span class="constructor">Arg</span>.<span class="constructor">Set</span>&nbsp;want_text,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"&nbsp;&nbsp;convert&nbsp;file&nbsp;to&nbsp;text"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;!filename&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;filename&nbsp;:=&nbsp;<span class="constructor">Some</span>&nbsp;s<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;(<span class="constructor">Arg</span>.<span class="constructor">Bad</span>&nbsp;<span class="string">"Multiple&nbsp;arguments&nbsp;not&nbsp;allowed."</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"usage:&nbsp;readme&nbsp;[&nbsp;-text&nbsp;|&nbsp;-html&nbsp;]&nbsp;input.xml&nbsp;&gt;output"</span>;<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;fn&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;!filename&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prerr_endline&nbsp;<span class="string">"readme:&nbsp;no&nbsp;input"</span>;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;s<br>
&nbsp;&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;!want_html,&nbsp;!want_text&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">true</span>,&nbsp;<span class="keyword">false</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run&nbsp;convert_to_html&nbsp;fn<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keyword">false</span>,&nbsp;<span class="keyword">true</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run&nbsp;convert_to_text&nbsp;fn<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prerr_endline&nbsp;(<span class="string">"readme:&nbsp;Please&nbsp;select&nbsp;exactly&nbsp;one&nbsp;output&nbsp;format"</span>)<br>
<br>
<span class="keyword">let</span>&nbsp;()&nbsp;=<br>
&nbsp;&nbsp;main()<br>
</code><pre></pre>
<p>


<br>
</body></html>