<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article id="ProjDoc">
  <articleinfo>
    <title>Project Implementation Details</title>
    <author>
      <firstname>Ashley</firstname>
      <othername>J.S</othername>
      <surname>Mills</surname>
      <affiliation>
        <address><email>ashley@ashleymills.com</email></address>
      </affiliation>
    </author>

    <copyright>
      <year>2005</year>
      <holder role="mailto:ashley@ashleymills.com">The University Of Birmingham</holder>
    </copyright>
  </articleinfo>

  <sect1 id="Projdoc-Introduction"><title>Introduction</title>
    <para>
      The documentation system developed by Ashley Mills for The University Of Birmingham during the summer of 2002 can be summarised: 
    </para>

    <itemizedlist>
      <listitem>
        <para>
          The documenation is entirely written in <acronym>XML</acronym> DocBook which is a markup language particularly suited to writing techincal documentation. It has the added benefit that it can be converted into many output formats with freely available tools and style sheets, noteably it can be converted to <acronym>XHTML</acronym> and <acronym>PDF</acronym>. Since DocBook is defined in <acronym>XML</acronym> (An <acronym>SGML</acronym> version is available), the documenation may be validated against a <acronym>DTD</acronym> which enforces consistency.
        </para>
      </listitem>

      <listitem>
        <para>
          The distribution of the documenation is done via <acronym>XHTML</acronym> pages, these are automatically generated from a special <acronym>XML</acronym> file which contains information about the structure of the output tree. The program <command>OutputBuilder</command> is responsible for this as well as generating selected output formats for each item in the documenation. The output tree is customisable to a considerable degree via the special <acronym>XML</acronym> file mentioned.
        </para>
      </listitem>

      <listitem>
        <para>
          The source <acronym>XML</acronym> DocBook files may be situated anywhere on the local machine, <acronym>URI</acronym> support may be added at a later date.
        </para>
      </listitem>
    </itemizedlist>

    <sect2 id="ProjDoc-Introduction-Overview"><title>Overview</title>
      <para>
        The building and maintainance of the documentation project is managed via a number of auxiliary programs glued together with Ant scripts. The diagram below illustrates how the components fit together to automate the building and maintainance of the documentation project:
      </para>
      
      <mediaobject>
        <imageobject>
          <imagedata fileref="files/images/AutomationOverview.png" format="PNG" align="center"/>
        </imageobject>
        <textobject><phrase>A diagrammatic overview of the automated build and maintainance process</phrase></textobject>
      </mediaobject>

      <para>
        The diagram above shows the core components of the documentation system.
      </para>
      
      <itemizedlist>
        <listitem>
          <para>
            The information about each item in the project and the structure of the output tree is stored in the <emphasis>doctree</emphasis> file, illustrated as <filename>doctree.xml</filename>.
          </para>
        </listitem>

        <listitem>
          <para>
            <filename>build.xml</filename> is the main coordinating buildfile, it calls <filename>OutputBuilder.jar</filename> and <command>DoctreeMaintainer.jar</command>.
          </para>
        </listitem>

        <listitem>
          <para>
            <command>DoctreeMaintainer.jar</command> provides a GUI way to maintain <filename>doctree.xml</filename> although maintainance may be performed manually with a text editor.
          </para>
        </listitem>

        <listitem>
          <para>
            <filename>OutputBuilder.jar</filename> parses <filename>doctree.xml</filename> and builds the output tree from the XML DocBook source files using the Ant 'functions'.
          </para>
        </listitem>

        <listitem>
          <para>
            The Ant 'functions' provide aid to <filename>OutputBuilder.jar</filename> in building the output and a class called <filename>HTMLNode.class</filename> within <filename>OutputBuilder.jar</filename> is used to generate the webpages.
          </para>
        </listitem>
      </itemizedlist>
    </sect2>
  </sect1>

  <sect1 id="ProjDoc-doctree"><title>The &quot;doctree&quot; <acronym>XML</acronym> file</title>
    <para>
      The <acronym>XHTML</acronym> distribution pages for the project are automatically built by the &quot;OutputBuilder&quot; program, the information required to do this is provided as an <acronym>XML</acronym> document. The document type is called a &quot;doctree&quot;, which is a euphemism for DOCument-TREE because the document outlines the tree structure the distribution pages should take.
    </para>

    <para>
      The root of the document is <emphasis role="strong">&lt;doctree&gt;</emphasis>. There are two elements used throughout the <emphasis>doctree</emphasis>, <emphasis role="strong">&lt;transnode&gt;</emphasis> and <emphasis role="strong">&lt;leafnode&gt;</emphasis>. The <emphasis>doctree</emphasis> element behaves like a <emphasis>transnode</emphasis> accept it has no parents to link to, the available attributes are the same. The image below illustrates a typical <emphasis>doctree</emphasis>:
    </para>

    <mediaobject>
      <imageobject>
        <imagedata fileref="files/images/ExampleDocTree.png" format="PNG" align="center"/>
      </imageobject>
      <textobject><phrase>An example of a <emphasis>doctree</emphasis></phrase></textobject>
    </mediaobject>

    <para>A representation of the sketch above, in <acronym>XML</acronym>, is shown below:</para>

    <programlisting>
      &lt;doctree id=&quot;index&quot; htmlName=&quot;index.html&quot; name=&quot;Project Home&quot;
      linkParents=&quot;false&quot;  linkChildren=&quot;true&quot; linkSiblings=&quot;false&quot; 
      includeTeaser=&quot;false&quot;&gt;
        &lt;transnode id=&quot;programming&quot; name=&quot;Programming&quot; includeTeaser=&quot;false&quot; 
                      linkParent=&quot;true&quot; linkChildren=&quot;true&quot; linkSiblings=&quot;false&quot;&gt;
          &lt;teaser&gt;
            &lt;p&gt;Contains documentation about various programming languages.&lt;/p&gt;
          &lt;/teaser&gt;

          &lt;leafnode id=&quot;java&quot; name=&quot;Java&quot; srcDir=&quot;src/docs/java&quot;
                       includeTeaser=&quot;true&quot; linkParent=&quot;true&quot; linkSiblings=&quot;true&quot;
                       buildPDF=&quot;true&quot; buildHTML=&quot;true&quot; buildChunkedHTML=&quot;false&quot;
                       includeXML=&quot;true&quot;&gt;
            &lt;teaser&gt;
              &lt;p&gt;Java is an Object oriented language that has very good cross-platform support.&lt;/p&gt;
            &lt;/teaser&gt;
          &lt;/leafnode&gt;

          &lt;leafnode id=&quot;scheme&quot; name=&quot;Scheme&quot; srcDir=&quot;src/docs/scheme&quot;
                       includeTeaser=&quot;true&quot; linkParent=&quot;true&quot; linkSiblings=&quot;true&quot;
                       buildPDF=&quot;true&quot; buildHTML=&quot;true&quot; buildChunkedHTML=&quot;false&quot;
                       includeXML=&quot;true&quot;&gt;
            &lt;teaser&gt;
              &lt;p&gt;
                Scheme is a small and elegant dialect of LISP that was developed in the mid-1970s 
                at the Massachusetts Institute of Technology.
              &lt;/p&gt;
            &lt;/teaser&gt;
          &lt;/leafnode&gt;
        &lt;/transnode&gt;

        &lt;transnode id=&quot;textProcessing&quot; name=&quot;Text Processing&quot; includeTeaser=&quot;false&quot;
                      linkParent=&quot;true&quot; linkChildren=&quot;true&quot; linkSiblings=&quot;false&quot;&gt;
          &lt;teaser&gt;
            &lt;p&gt;Contains documentation about various text processing systems&lt;/p&gt;
          &lt;/teaser&gt;

          &lt;leafnode id=&quot;docbook&quot; name=&quot;DocBook&quot; srcDir=&quot;src/docs/docbooksys&quot;
                       includeTeaser=&quot;true&quot; linkParent=&quot;true&quot; linkSiblings=&quot;true&quot;
                       buildPDF=&quot;true&quot; buildHTML=&quot;true&quot; buildChunkedHTML=&quot;false&quot;
                       includeXML=&quot;true&quot;&gt;
            &lt;teaser&gt;
              &lt;p&gt;
                DocBook is a markup language defined in SGML and XML, it is particularly suited to
                technical documentation.
              &lt;/p&gt;
            &lt;/teaser&gt;

            &lt;body&gt;
              &lt;div class=&quot;content&quot; align=&quot;center&quot;&gt;
                &lt;div align=&quot;left&quot;&gt;
                  &lt;p&gt;
                    More information about DocBook can be found at the OASIS home page:
                    &lt;a href=&quot;http://www.oasis-open.org/committees/docbook&quot;&gt;http://www.oasis-open.org/committees/docbook&lt;/a&gt;
                  &lt;/p&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/body&gt;
          &lt;/leafnode&gt;
        &lt;/transnode&gt;
      &lt;/doctree&gt;
    </programlisting>

    <para>
      When rendered as <acronym>HTML</acronym>, viewed via a <acronym>CSS</acronym> compliant web-browser the web-pages genearted by the <command>OutputBuilder</command> program at the time of writing looked like this (note that only some are shown):
    </para>

    <mediaobject>
      <imageobject>
        <imagedata fileref="files/images/ExampleDocTreeHTMLIndex.png" format="PNG" align="center"/>
      </imageobject>
      <textobject><phrase>The Index page generated using <command>OutputBuilder</command> on the <emphasis>doctree</emphasis> shown above.</phrase></textobject>
    </mediaobject>

    <para/>

    <mediaobject>
      <imageobject>
        <imagedata fileref="files/images/ExampleDocTreeHTMLProg.png" format="PNG" align="center"/>
      </imageobject>
      <textobject><phrase>The &quot;Programming&quot; page generated using <command>OutputBuilder</command> on the <emphasis>doctree</emphasis> shown above.</phrase></textobject>
    </mediaobject>

    <para/>

    <mediaobject>
      <imageobject>
        <imagedata fileref="files/images/ExampleDocTreeHTMLjava.png" format="PNG" align="center"/>
      </imageobject>
      <textobject><phrase>The &quot;Java&quot; page generated using <command>OutputBuilder</command> on the <emphasis>doctree</emphasis> shown above.</phrase></textobject>
    </mediaobject>

    <para>
      The output produced can be changed by modifying the <command>OutputBuilder</command> program and/or modifying the <acronym>CSS</acronym>.
    </para>

    <sect2 id="XMLFile-doctree-Transnode"><title><emphasis role="strong">&lt;transnode&gt;</emphasis></title>
      <para>
        A <emphasis role="strong">&lt;transnode&gt;</emphasis> element represents a transitional node in the <acronym>XHTML</acronym> tree, for example, &quot;Text Processing&quot;. A <emphasis>transnode</emphasis> has a number of attributes that can be specified. To enable an attribute one uses '<replaceable>attributeName</replaceable>=&quot;<replaceable>true</replaceable>&quot;' to disable an attribute one uses '<replaceable>attributeName</replaceable>=&quot;<replaceable>false</replaceable>&quot;'. All the attributes that only take the values 'true' and 'false' must be provided. Some attributes take values other than 'true' or 'false' and unless otherwise specified a value must be provided for them. The attributes for <emphasis>transnode</emphasis> are shown in the table below:
      </para>

      <note><para>Attribute values may only contain plain text, <acronym>XML</acronym> markup is not allowed.</para></note>

      <table frame="all"><title><emphasis role="strong">&lt;transnode&gt;</emphasis> attributes</title>
        <tgroup cols="3">
          <thead>
            <row>
              <entry><emphasis role="strong">Attribute</emphasis></entry>
              <entry><emphasis role="strong">Description</emphasis></entry>
              <entry><emphasis role="strong">Required</emphasis></entry>
            </row>
          </thead>

          <tbody>
            <row>
              <entry><emphasis>id</emphasis></entry>
              <entry>
                The value assigned to the 'id' attribute identifies the the node. The generated webpage will take the name &quot;<emphasis>id</emphasis>home.html&quot; unless the 'htmlName' attribute has been provided. The generated webpage will be placed in a sub-directory named <emphasis>id</emphasis>.
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>name</emphasis></entry>
              <entry>
                The value assigned to the 'name' attribute is used primarily as the title of the generated webpage if the <emphasis role="strong">&lt;title&gt;</emphasis> element has not been provided. A secondary usage is in the creation of hyperlinks between webpages, for example if the 'linkParent' attribute has been set to 'true', the webpage generated for this node will link to the webpage generatef for it's parent and vice-versa. The text of the link will be the value of the 'name' attribute. If the name attribute is omitted, the value of the 'id' attribute will be used as a failsafe. 
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>htmlName</emphasis></entry>
              <entry>
                If the 'htmlName' attribute is provided, the name of the generated webpage will be that specified by the value of the 'htmlName' attribute. If the 'htmlName' attribute is not provided the name of the generated webpage will be created from the value of the 'id' attribute.
              </entry>
              <entry>NO</entry>
            </row>

            <row>
              <entry><emphasis>includeTeaser</emphasis></entry>
              <entry>
                If the 'includeTeaser' attribute is set to 'true' the children of the <emphasis role="strong">&lt;teaser&gt;</emphasis> element will be included in the body of the generated webpage. If the 'includeTeaser' attribute is set to 'false' the children of the <emphasis role="strong">&lt;teaser&gt;</emphasis> element will not be included in the body of the generated webpage.
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>linkParent</emphasis></entry>
              <entry>
                If the 'linkParent' attribute is set to 'true', the webpage generated for the parent of this node will be automatically hyper-linked to the webpage generated for this node and vice-versa. If the 'linkParent' attribute is set to 'false', the webpage generated for this node will not be automatically hyper-linked to the webpage generated for the parent of this node and vice-versa.
              </entry>
              <entry><emphasis>YES</emphasis></entry>
            </row>

            <row>
              <entry><emphasis>linkChildren</emphasis></entry>
              <entry>
                If the 'linkChildren' attribute is set to 'true', the webpages generated for the children of this node will be automatically hyper-linked to from the webpage generated for this node. If the 'linkChildren' attribute is set to 'false', the webpages generated for the children of this node will not be automatically hyper-linked to from the webpage generated for this node.
              </entry>
              <entry><emphasis>YES</emphasis></entry>
            </row>

            <row>
              <entry><emphasis>linkSiblings</emphasis></entry>
              <entry>
                If the 'linkSiblings' attribute is set to 'true', the webpages generated for the siblings of this node will be automatically hyper-linked to from the webpage generated for this node. If the 'linkSiblings' attribute is set to 'false', the webpages generated for the siblings of this node will not be automatically hyper-linked to from the webpage generated for this node. The hyper-links will be placed on the left of the generated webpage.
              </entry>
              <entry><emphasis>YES</emphasis></entry>
            </row>
          </tbody>
        </tgroup>
      </table>
    </sect2>

    <sect2 id="XMLFile-doctree-Leafnode"><title><emphasis role="strong">&lt;leafnode&gt;</emphasis></title>
      <para>
        A <emphasis role="strong">&lt;leafnode&gt;</emphasis> element represents a leaf of the <acronym>XHTML</acronym> tree, for example, &quot;LaTeX&quot;. A <emphasis>leafnode</emphasis> has a number of attributes that can be specified. To enable an attribute one uses '<replaceable>attributeName</replaceable>=&quot;<replaceable>true</replaceable>&quot;' to disable an attribute one uses '<replaceable>attributeName</replaceable>=&quot;<replaceable>false</replaceable>&quot;'. All the attributes that only take the values 'true' and 'false' must be provided. Some attributes take values other than 'true' or 'false' and unless otherwise specified a value must be provided for them. The attributes for <emphasis>leafnode</emphasis> are shown in the table below:
      </para>

      <note><para>Attribute values may only contain plain text, <acronym>XML</acronym> markup is not allowed.</para></note>

      <table frame="all"><title><emphasis role="strong">&lt;leafnode&gt;</emphasis> attributes</title>
        <tgroup cols="3">
          <thead>
            <row>
              <entry><emphasis role="strong">Attribute</emphasis></entry>
              <entry><emphasis role="strong">Description</emphasis></entry>
              <entry><emphasis role="strong">Required</emphasis></entry>
            </row>
          </thead>

          <tbody>
            <row>
              <entry><emphasis>id</emphasis></entry>
              <entry>
                The value assigned to the 'id' attribute identifies the the node. The generated webpage will take the name &quot;<emphasis>id</emphasis>home.html&quot; unless the 'htmlName' attribute has been provided. The generated webpage will be placed in a sub-directory named <emphasis>id</emphasis>.
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>name</emphasis></entry>
              <entry>
                The value assigned to the 'name' attribute is used primarily as the title of the generated webpage if the <emphasis role="strong">&lt;title&gt;</emphasis> element has not been provided. A secondary usage is in the creation of hyperlinks between webpages, for example if the 'linkParent' attribute has been set to 'true', the webpage generated for this node will link to the webpage generatef for it's parent and vice-versa. The text of the link will be the value of the 'name' attribute. If the name attribute is omitted, the value of the 'id' attribute will be used as a failsafe. 
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>htmlName</emphasis></entry>
              <entry>
                If the 'htmlName' attribute is provided, the name of the generated webpage will be that specified by the value of the 'htmlName' attribute. If the 'htmlName' attribute is not provided the name of the generated webpage will be created from the value of the 'id' attribute.
              </entry>
              <entry>NO</entry>
            </row>

            <row>
              <entry><emphasis>includeTeaser</emphasis></entry>
              <entry>
                If the 'includeTeaser' attribute is set to 'true' the children of the <emphasis role="strong">&lt;teaser&gt;</emphasis> element will be included in the body of the generated webpage. If the 'includeTeaser' attribute is set to 'false' the children of the <emphasis role="strong">&lt;teaser&gt;</emphasis> element will not be included in the body of the generated webpage.
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>linkParent</emphasis></entry>
              <entry>
                If the 'linkParent' attribute is set to 'true', the webpage generated for the parent of this node will be automatically hyper-linked to the webpage generated for this node and vice-versa. If the 'linkParent' attribute is set to 'false', the webpage generated for this node will not be automatically hyper-linked to the webpage generated for the parent of this node and vice-versa.
              </entry>
              <entry><emphasis>YES</emphasis></entry>
            </row>

            <row>
              <entry><emphasis>linkSiblings</emphasis></entry>
              <entry>
                If the 'linkSiblings' attribute is set to 'true', the webpages generated for the siblings of this node will be automatically hyper-linked to from the webpage generated for this node. If the 'linkSiblings' attribute is set to 'false', the webpages generated for the siblings of this node will not be automatically hyper-linked to from the webpage generated for this node. The hyper-links will be placed on the right of the generated webpage.
              </entry>
              <entry><emphasis>YES</emphasis></entry>
            </row>

            <row>
              <entry><emphasis>srcDir</emphasis></entry>
              <entry>
                The 'srcDir' attribute specifies the directory of the <acronym>XML</acronym> DocBook source of the item being documented. The item being documented is identified by the 'id' attribute, so the <acronym>XML</acronym> DocBook source file for the item being documented is considered to be <filename>srcDir/id.xml</filename>. This may be omitted if one desires to make a leaf that has no source associated with it. If this is the desired behaviour,  'buildPDF', 'buildHTMl', 'buildChunkedHTML' and 'includeXML' must be set to 'false'.
              </entry>
              <entry><emphasis>NO</emphasis></entry>
            </row>

            <row>
              <entry><emphasis>buildPDF</emphasis></entry>
              <entry>
                If the 'buildPDF' attribute is set to 'true', <acronym>PDF</acronym> will be built from the <acronym>XML</acronym> DocBook source of the item being documented, specified by the 'id' attribute in the directory specified by the 'srcDir' attribute. The outputted <acronym>PDF</acronym> file will  be placed in the output directory as dictated by the structure of the tree and linked to from the webpage generated for the node. If the 'buildPDF' attribute is set to 'false', <acronym>PDF</acronym> output will not be built and hence it will not be linked to from the webpage generated for this node.
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>buildHTML</emphasis></entry>
              <entry>
                If the 'buildHTML' attribute is set to 'true', <acronym>XHTML</acronym> will be built from the <acronym>XML</acronym> DocBook source of the item being documented, specified by the 'id' attribute in the directory specified by the 'srcDir' attribute. The outputted <acronym>XHTML</acronym> file will  be placed in the output directory as dictated by the structure of the tree and linked to from the webpage generated for the node. If the 'buildHTML' attribute is set to 'false', <acronym>XHTML</acronym> output will not be built and hence it will not be linked to from the webpage generated for this node.
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>buildChunkedHTML</emphasis></entry>
              <entry>
                If the 'buildChunkedHTML' attribute is set to 'true', segmented <acronym>XHTML</acronym> files will be built from the <acronym>XML</acronym> DocBook source of the item being documented, specified by the 'id' attribute in the directory specified by the 'srcDir' attribute. The outputted <acronym>XHTML</acronym> files will  be placed in the output directory as dictated by the structure of the tree and placed under the sub-directory <filename>segmentedhtml</filename>. The segmented <acronym>XHTML</acronym> will be linked to via the webpage generated for this node. If the 'buildChunkedHTML' attribute is set to 'false', <acronym>XHTML</acronym> output will not be built and hence it will not be linked to from the webpage generated for this node.
              </entry>
              <entry>YES</entry>
            </row>

            <row>
              <entry><emphasis>includeXML</emphasis></entry>
              <entry>
                If the 'includeXML' attribute is set to 'true', the <acronym>XML</acronym> DocBook source created for the item being documented, specified by the 'id' attribute in the directory specified by the 'srcDir' attribute, will have it's xincludes resolved and the single <acronym>XML</acronym> file generated placed in the output directory as dictated by the structure of the tree. The <acronym>XML</acronym> file will be linked to from the webpage generated for this node. If the 'includeXML' attribute is set to 'false', the <acronym>XML</acronym> DocBook source will not have it's xincludes resolved or be linked to from the webpage generated for this node. 
              </entry>
              <entry>YES</entry>
            </row>
          </tbody>
        </tgroup>
      </table>
    </sect2>

    <sect2 id="ProjDoc-doctree-Common"><title>Common Components</title>
      <para>
        Both <emphasis role="strong">&lt;transnode&gt;</emphasis> and <emphasis role="strong">&lt;leafnode&gt;</emphasis> support nested elements that can be used to provide extended functionality. These nested elements are all optional apart from <emphasis>&lt;teaser&gt;</emphasis> which is mandatory. 
      </para>

      <sect3 id="ProjDoc-doctree-Common-Teaser"><title>&lt;teaser&gt;</title>
        <para>
          The teaser element contains information marked up in <acronym>XHTML</acronym> 1.0 that is used in the generated webpage for this node. The teaser is used by the parent of the node the teaser belongs to, to provide a little information about it's children to the person browsing the web page. It is called a teaser after the terms use in the entertainment world, i.e, it's purpose is to entice the person browsing the webpage into investigating the item it belongs to. If <emphasis>includeTeaser</emphasis> is set to 'true' the webpage generated for the node the teaser belongs to will contain the children of the teaser element wrapped in a left aligned division inside a center aligned division. The teaser shown below:
        </para>

        <programlisting>
          &lt;teaser&gt;
            &lt;p&gt;This is a teaser&lt;/p&gt;
          &lt;/teaser&gt;
        </programlisting>

        <para>Will be output as:</para>

        <programlisting>
          &lt;div class=&quot;content&quot; align=&quot;center&quot;&gt;
            &lt;div align=&quot;left&quot;&gt;
              &lt;p&gt;This is a teaser&lt;/p&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        </programlisting>

        <para>
          In the webpage generated for the node the teaser belongs to, assuming that 'includeTeaser' is set to 'true'. If the parent of the node the teaser belongs to sets 'includeChildren' to 'true', a table will be generated containing links to all the webages generated from the children of that parent, each child will be represented by a new row in the table. The row will have two collumns, the first column will contain the link to the webpage generated for the child, the text of the link will be set to the value of the 'name' attribute of the child. The second column will contain the children of the childs teaser element to serve as a description and teaser to the person browsing the webpage.
        </para>

        <para>
          The teaser is considered mandatory for both transnodes and leafnodes, however, only transnodes can use it to provide information about child nodes since leafnodes have no children.  Both transnodes and leafnodes can have the teaser included in the webpage generated for them by setting the 'includeTeaser' attribute to true.
        </para>
      </sect3>

      <sect3 id="ProjDoc-doctree-Common-Title"><title>&lt;title&gt;</title>
        <para>
          If the <emphasis role="strong">&lt;title&gt;</emphasis> element is present, it's content is used as the title of the webpage generated for the node it belongs to.  The content will be wrapped in a centered division. The value assigned to the <emphasis>name</emphasis> attribute is still used in the link text of links that reference the webpage generated for the node the title element belongs to. This is useful for writing multi-line titles and titles that include inline elements since attribute values may not contain XML markup. The content of the title element must be marked up in <acronym>XHTML</acronym> 1.0. For example, the title element shown below:
        </para>

        <programlisting>
          &lt;title&gt;
            &lt;h1&gt;Title&lt;/h1&gt;
          &lt;/title&gt;
        </programlisting>

        <para>Will be output as:</para>

        <programlisting>
          &lt;div align=&quot;center&quot; class=&quot;content&quot;&gt;
            &lt;h1&gt;Title&lt;/h1&gt;
          &lt;/div&gt;
        </programlisting>

        <para>In the body of the generated webpage.</para>
      </sect3>

      <sect3 id="ProjDoc-doctree-Common-Body"><title>&lt;body&gt;</title>
        <para>
          If the <emphasis role="strong">&lt;body&gt;</emphasis> element is present, it's content is added to the body of the webpage generated for the node the body element belongs to. Only the content of the <emphasis>body</emphasis> element is added, not the <emphasis>body</emphasis> element itself. The content of the body element must be marked up in <acronym>XHTML</acronym> 1.0. For example, the body element shown below:
        </para>

        <programlisting>
          &lt;body&gt;
            &lt;p&gt;Hello&lt;/p&gt;
          &lt;/body&gt;
        </programlisting>

        <para>Will be output as:</para>

        <programlisting>
          &lt;div align=&quot;center&quot;&gt;
            &lt;div class=&quot;content&quot; align=&quot;left&quot;&gt;
              &lt;p&gt;Hello&lt;/p&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        </programlisting>

        <para>In the body of the generated webpage.</para>
      </sect3>

      <sect3 id="ProjDoc-doctree-Common-Left"><title>&lt;left&gt;</title>
        <para>
          If the <emphasis role="strong">&lt;left&gt;</emphasis> element is present, each child of the left element becomes another row in the table of links which appear to the left of the generated webpage. The left element has one attribute: <emphasis>linkBefore</emphasis>. If the 'linkBefore' attribute is set to 'true' the rows generated for each child of the left element will be placed <emphasis>before</emphasis> the automatically generated rows in the link-table that appears on the left of the generated webpage. If the 'linkBefore' attribute is set to 'false' the rows generated for each child of the left element will be placed <emphasis>after</emphasis> the automatically generated rows in the link-table that appears on the left of the generated webpage. If one desires to include multiple paragraphs as one entry, one should wrap them in a <emphasis>div</emphasis> element. The content of the left element must be marked up in <acronym>XHTML</acronym> 1.0.
        </para>
      </sect3>

      <sect3 id="ProjDoc-doctree-Common-Right"><title>&lt;right&gt;</title>
        <para>
          If the <emphasis role="strong">&lt;right&gt;</emphasis> element is present, each child of the right element becomes another row in the table of links which appear to the right of the generated webpage. The right element has one attribute: <emphasis>linkBefore</emphasis>. If the 'linkBefore' attribute is set to 'true' the rows generated for each child of the right element will be placed <emphasis>before</emphasis> the automatically generated rows in the link-table that appears on the right of the generated webpage. If the 'linkBefore' attribute is set to 'false' the rows generated for each child of the right element will be placed <emphasis>after</emphasis> the automatically generated rows in the link-table that appears on the right of the generated webpage. If one desires to include multiple paragraphs as one entry, one should wrap them in a <emphasis>div</emphasis> element. The content of the right element must be marked up in <acronym>XHTML</acronym> 1.0.
        </para>
      </sect3>

      <sect3 id="ProjDoc-doctree-Common-Footer"><title>&lt;footer&gt;</title>
        <para>
          If the <emphasis role="strong">&lt;footer&gt;</emphasis> element is present, the content of the footer element will replace the automatically generated footer of the generated webpage, that is, the automatically generated footer will not be included and the content of the footer element will be added directly to the body of the generated webpage.The content of the footer element must be marked up in <acronym>XHTML</acronym> 1.0. For example the footer element:
        </para>

        <programlisting>
          &lt;footer&gt;
            &lt;div class=&quot;content&quot; align=&quot;center&quot;&gt;
              &lt;p&gt;Created while DRUNK&lt;/p&gt;
            &lt;/div&gt;
          &lt;/footer&gt;
        </programlisting>

        <para>Will be output as:</para>

        <programlisting>
          &lt;div class=&quot;content&quot; align=&quot;center&quot;&gt;
            &lt;p&gt;Created while DRUNK&lt;/p&gt;
          &lt;/div&gt;
        </programlisting>

        <para>In the body of the generated webpage.</para>
      </sect3>
    </sect2>

    <sect2 id="ProjDoc-doctree-Special"><title>Special Components</title>
      <para>
        It was found that the automation system lacked the ability to produce some of the output tree and so some of the output tree had to be built via the startup Ant scipt. This was considered to be bad practice since the doctree file should contain all the information required to build the output tree. A simple parsing of the output tree with <filename>OutputBuilder.jar</filename> should produce <emphasis>all</emphasis> of the output. In order to overcome the limitations of the doctree a special element was created called, ahem, <emphasis role="strong">&lt;special&gt;</emphasis>.
      </para>

      <para>
        The <emphasis role="strong">&lt;special</emphasis> element provides the user with the ability to copy files and directories and to create directories. This means that any part of the output tree that cannot be created via a leaf or a transnode can simply be copied from the source directory.  This is practical and less time-expensive than modifying the doctree declaration to include a new kind of node or something.
      </para>

      <para>
        The <emphasis role="strong">&lt;special&gt;</emphasis> element may only be used at the root level, i.e as a direct child of the <emphasis role="strong">&lt;doctree&gt;</emphasis> element, like this:
      </para>

      <programlisting>
        &lt;doctree&gt;
          &lt;transnode...
          &lt;transode...
          &lt;leafnode...
          &lt;title...
          &lt;body...
          &lt;special&gt;
            ...
          &lt;/special&gt;
        &lt;/doctree&gt;
      </programlisting>

      <para>The three elements that may be nested within the special element are shown below.</para>

      <sect3 id="ProjDoc-doctree-Special-CopyFile"><title><emphasis role="strong">&lt;copyFile&gt;</emphasis></title>
        <para>
          The <emphasis role="strong">&lt;copyFile&gt;</emphasis> element is used to copy a file, it has two attributes. 'file' specifies the source file, 'tofile' specifies the destination file. An example is shown below:
        </para>

        <programlisting>
          &lt;special&gt;
            &lt;copyFile file=&quot;src/jimmy.css&quot; tofile=&quot;build/jimmy.css&quot;/&gt;
          &lt;/special&gt;
        </programlisting>

        <para>
          Would copy the file <filename>src/jimmy.css</filename> to <filename>build/jimmy.css</filename>. The file will only be copied if it is more recent than the destination file or if the destination file does not exist.
        </para>
      </sect3>

      <sect3 id="ProjDoc-doctree-Special-CopyDir"><title><emphasis role="strong">&lt;copyDir&gt;</emphasis></title>
        <para>
          The <emphasis role="strong">&lt;copyDir&gt;</emphasis> element is used to copy a directory, it has two attributes. 'dir' specifies the source directory, 'todir' specifies the destination directory. An example is shown below:
        </para>

        <programlisting>
          &lt;special&gt;
            &lt;copyFile dir=&quot;src/images&quot; todir=&quot;build/images&quot;/&gt;
          &lt;/special&gt;
        </programlisting>

        <para>Would copy the directory <filename>src/images</filename> to <filename>build/images</filename>.</para>
      </sect3>

      <sect3 id="ProjDoc-doctree-Special-MkDir"><title><emphasis role="strong">&lt;mkdir&gt;</emphasis></title>
        <para>
          The <emphasis role="strong">&lt;mkdir&gt;</emphasis> element is used to make a directory, it has one attriute 'dir' which specifies the directory to create. An example is shown below:
        </para>

        <programlisting>
          &lt;special&gt;
            &lt;mkdir dir=&quot;build/special&quot;/&gt;
          &lt;/special&gt;
        </programlisting>

        <para>
          Would create the directory <filename>build/special</filename> if it did not exist.
        </para>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="ProjDoc-MainBuild"><title>The main <filename>build.xml</filename> file</title>
    <para>
      The main <filename>build.xml</filename> file is shown below:
    </para>

    <programlisting>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project name=&quot;Documentation Project&quot; default=&quot;all&quot; basedir=&quot;.&quot;&gt;
  &lt;target name=&quot;all&quot; description=&quot;Builds all the items in the project and the HTML distribution pages&quot;&gt;
    &lt;!-- Load in properties --&gt;
    &lt;loadproperties srcFile=&quot;ant.properties&quot;/&gt;

    &lt;!-- Execute the outputBuilder --&gt;
    &lt;java jar=&quot;OutputBuilder.jar&quot; fork=&quot;true&quot;&gt;
      &lt;arg line=&quot;doctree.xml&quot;/&gt;
    &lt;/java&gt;
  &lt;/target&gt;

  &lt;target name=&quot;maintain&quot; description=&quot;Loads DoctreeMaintainer&quot;&gt;
    &lt;java jar=&quot;DoctreeMaintainer.jar&quot; fork=&quot;true&quot;&gt;
      &lt;arg line=&quot;doctree.xml&quot;/&gt;
    &lt;/java&gt;
  &lt;/target&gt;

  &lt;target name=&quot;clean&quot; description=&quot;Deletes the output directory&quot;&gt;
    &lt;loadproperties srcFile=&quot;ant.properties&quot;/&gt;
    &lt;delete dir=&quot;${build}&quot; includeEmptyDirs=&quot;true&quot;/&gt;
  &lt;/target&gt;
&lt;/project&gt;
    </programlisting>

    <para>
      It is a very simple build file that when ran normally executes the <filename>OutputBuilder.jar</filename> on the file <filename>doctree.xml</filename> (the filename can be changed if desired). It also provides a target called <emphasis>maintain</emphasis> which when invoked from the command line like:
    </para>

    <screen><userinput><command>ant</command> maintain</userinput></screen>

    <para>
      Will execute the <filename>DoctreeMaintainer.jar</filename> program in order to edit the <filename>doctree.xml</filename> file. (the filename can be changed if desired).
    </para>

    <para>A <emphasis>clean</emphasis> target is provided which deletes the build directory. It is invoked like this:</para>

    <screen><userinput><command>ant</command> clean</userinput></screen>
  </sect1>

  <sect1 id="ProjDoc-DoctreeMaintainer"><title><filename>DoctreeMaintainer.jar</filename></title>
    <para>
      <filename>DoctreeMaintainer.jar</filename> provides a <acronym>GUI</acronym> interface to editing the <filename>doctree.xml</filename> file. It is built from the Java files located in <filename>src/maintainer</filename> by running Ant on the <filename>build.xml</filename> file in that directory. It is invoked like:
    </para>

    <screen><userinput><command>ant</command> maintain</userinput></screen>

    <para>From the main Ant build file or from the command line like this:</para>

    <screen><userinput><command>java</command> <option>-jar</option> <filename>DoctreeMaintainer.jar</filename> <replaceable>doctree.xml</replaceable></userinput></screen>

    <para>
      <filename>doctree.xml</filename> can be replaced by any other doctree file. A screenshot of the DoctreeMaintainer in action is shown below:
    </para>

    <mediaobject>
      <imageobject>
        <imagedata fileref="files/images/DoctreeMaintainerInAction.png" format="PNG" align="center"/>
      </imageobject>
      <textobject><phrase>The DoctreeMaintaner in action</phrase></textobject>
    </mediaobject>

    <para>
      As you can see, usage is pretty self-explanitory, one selects the nodes from the list of nodes in the drop down box at the bottom and the information about that node is loaded whereupon one may make changes to the node and save those changes. When a node is loaded, only the fields pertinent to that type of node are editable.
    </para>

    <para>
      One may create a new node by selecting the transnode that one would like the new node to be a child of and then clicking on &quot;New 'transnode'&quot; or &quot;New 'leafnode'&quot; according to the desired result. One may only create new nodes from a transnode since leafnodes cannot have children. After creating the new node and filling in the required fields, one should click on &quot;save&quot; to save the changes.
    </para>
      
    <para>
      One may delete nodes, but only leafnodes, or transnodes without children. If one wants to delete a transnode, one should delete it's children first.
    </para>

    <para>
      The checkboxes correspond to attributes that may be set to 'true' or 'false'. A tick indicates a value of 'true' and no tick indicates a value of 'false'. When one clicks the save button the information about the node being displayed is saved.
    </para>

    <para>
      The text areas contain the wrappers for the various elements already. These will not be saved to the file when clicking 'save' unless the wrapper contains some content. The content must be marked up in <acronym>XHTML</acronym> 1.0 as dictated by the doctree file format. If the text area has any content it will be added directly to the node hence the need for the wrapping with the tags for the elements like &lt;teaser&gt; and so on. Bare this in mind when using the tool.
    </para>

    <para>
      Every time the DoctreeMaintainer is ran, it creates a backup of the doctree file it is editing, the name of this backup file is the word 'BACKUP' plus the system date plus the name of the original doctree file, an example is shown below:
    </para>

    <programlisting><filename>BACKUP-Thu-Sep-19-16-53-03-BST-2002-doctree.xml</filename></programlisting>

    <para>
      If one desires to turn off this behaviour one has to edit the file <filename>src/maintainer/DoctreeMaintain.java</filename>.
    </para>

    <sect2 id="ProjDoc-DoctreeMaintainer-Source"><title>Source Code</title>
      <para><filename>DoctreeMaintainer.jar</filename> contains the following classes:</para>

        <itemizedlist>
          <listitem>
            <para>
              <filename>ClearTextControlForTextArea.class</filename>, provides the means to clear the text of a textArea, used as an <emphasis>actionListener</emphasis> for the textArea 'Clear' buttons.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>ClearTextControlForTextField.class</filename>, provides the means to clear the text of a textField, used as an <emphasis>actionListener</emphasis> for the textField 'Clear' buttons.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>DeleteControl.class</filename>, provides the means to delete an element, used as an <emphasis>actionListener</emphasis> for the 'Delete' button.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>DoctreeMaintainer.class</filename>, the main class for the program. Contains the entry point to the program. Initialises the GUI.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>ExitControl.class</filename>, provides the means to exit the program, used as an <emphasis>actionListener</emphasis> for the 'Exit' button.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>ItemSelectControl.class</filename>, controls the loading of a nodes content into the <acronym>GUI</acronym> when a node is selected from the drop-down box on the <acronym>GUI</acronym>. Disables any features not pertinent to the particular type of node selected.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>ItemSelectRenderer.class</filename>, each item in the drop-down box on the <acronym>GUI</acronym> used to select a node is actually a node. This element renders the appearance of the node so that a String is displayed indicating the type of node selected. The 'id' of any ancestors are appended to the String and finally the 'id' of the node appended so that the string displays the 'location' of the node in the output tree.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>NewLeafnodeControl.class</filename>, controls the creation of a new 'leafnode', sets defaults upon creation and adds the node to the drop-down box on the <acronym>GUI</acronym> then selects it.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>NewTransnodeControl.class</filename>, controls the creation of a new 'transnode', sets defaults upon creation and adds the node to the drop-down box on the <acronym>GUI</acronym> then selects it.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>PasteTextControlForTextArea.class</filename>, provides the means to paste text into a textArea, used as an <emphasis>actionListener</emphasis> for the textArea 'Paste' buttons.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>PasteTextControlForTextField.class</filename>, provides the means to paste text into a textField, used as an <emphasis>actionListener</emphasis> for the textField 'Paste' buttons.
            </para>
          </listitem>

          <listitem>
            <para>
              <filename>SaveControl.class</filename>, controls the saving of the infomation about a node in the <acronym>GUI</acronym> to the doctree file.
            </para>
          </listitem>
        </itemizedlist>
    </sect2>
  </sect1>

  <sect1 id="ProjDoc-OutputBuilder"><title><filename>OutputBuilder.jar</filename></title>
    <para>
      <filename>OutputBuilder.jar</filename> is used to transverse the doctree file to produce the output tree. It is built from the Java files located in <filename>src/outputbuilder</filename> by running Ant on the <filename>build.xml</filename> file in that directory. It is invoked, either from the ant file by typing <screen><userinput>ant</userinput></screen> in the root directory of the documentation project that contains the <filename>build.xml</filename> file, or by executing: 
    </para>

    <screen><userinput><command>java</command> <option>-jar</option> <filename>OutputBuilder.jar</filename> <replaceable>docree.xml</replaceable></userinput></screen>

    <para>
      This will automatically transverse the doctree file and build all the output it is directed to build.
    </para>

    <sect2 id="ProjDoc-OutputBuilder-Source"><title><filename>Source Code</filename></title>
      <para><filename>OutputBuilder.jar</filename> contains two Java classes.</para>

      <sect3 id="ProjDoc-OutputBuilder-Source-OutputBuilder"><title><filename>OutputBuilder.class</filename></title>
        <para>
          <filename>OutputBuilder.class</filename> is the program that transverses the doctree file, it uses the ant functions to build specified output formats for items in the project and uses the <filename>HTMLNode.class</filename> to build the <acronym>XHTML</acronym> distribution webpages.
        </para>
      </sect3>

      <sect3 id="ProjDoc-OutputBuilder-Source-HTMLNode"><title><filename>HTMLNode.class</filename></title>
        <para>
          <filename>HTMLNode.class</filename> provides <filename>OutputBuilder.class</filename> with the ability to create <acronym>XHTML</acronym> web pages in a programmatic manner. <ulink url="files/htmlnodeapi/index.html">The <filename>HTMLNode</filename> <acronym>API</acronym> is online here.</ulink>
        </para>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="ProjDoc-AntFunctions"><title>The Ant Functions</title>
    <para>
      <filename>OutputBuilder.jar</filename> uses a number of 'functions' written as Ant scripts to perform certain actions like building specific output formats for items being documented. The functions used are:
    </para>

    <itemizedlist>
      <listitem>
        <para>
          <filename>BuildChunkedHTML.xml</filename>, builds segmented <acronym>XHTML</acronym> output for an item.
        </para>
      </listitem>

      <listitem>
        <para>
          <filename>BuildHTML.xml</filename>, builds standard <acronym>XHTML</acronym> output for an item.
        </para>
      </listitem>

      <listitem>
        <para>
          <filename>BuildPDF.xml</filename>, builds <acronym>PDF</acronym> output for an item.
        </para>
      </listitem>

      <listitem>
        <para>
          <filename>CopyDirectory.xml</filename>, provides the ability to copy a directory.
        </para>
      </listitem>

      <listitem>
        <para>
          <filename>CopyFile.xml</filename>, provides the ability to copy a file.
        </para>
      </listitem>

      <listitem>
        <para>
          <filename>CopyXMLFiles.xml</filename>, copies the <acronym>XML</acronym> source file(s) of an item to a single <acronym>XML</acronym> file in the output directory with xincludes resolved.
        </para>
      </listitem>

      <listitem>
        <para>
          <filename>MakeDirectory.xml</filename>, provides the ability to create a directory.
        </para>
      </listitem>
    </itemizedlist>

    <para>
      The parameters these 'functions' take are explained in the function source codes. The functions are not called directory but instead, they are invoked from <filename>OutputBuilder.jar</filename> via targets in a project, this is the purpose of the file <filename>AntFunctions.xml</filename> which looks like this:
    </para>

    <programlisting>
&lt;project name=&quot;AntFunctions&quot; default=&quot;usage&quot; basedir=&quot;.&quot;&gt;
  &lt;target name=&quot;buildHTML&quot;&gt;
    &lt;ant antfile=&quot;BuildHTML.xml&quot;/&gt;
  &lt;/target&gt;

  &lt;target name=&quot;buildChunkedHTML&quot;&gt;
    &lt;ant antfile=&quot;BuildChunkedHTML.xml&quot;/&gt;
  &lt;/target&gt;

  &lt;target name=&quot;buildPDF&quot;&gt;
    &lt;ant antfile=&quot;BuildPDF.xml&quot;/&gt;
  &lt;/target&gt;

  &lt;target name=&quot;copyXMLFiles&quot;&gt;
    &lt;ant antfile=&quot;CopyXmlFiles.xml&quot;/&gt;
  &lt;/target&gt;

  &lt;target name=&quot;makeDirectory&quot;&gt;
    &lt;ant antfile=&quot;MakeDirectory.xml&quot;/&gt;
  &lt;/target&gt;

  &lt;target name=&quot;copyFile&quot;&gt;
    &lt;ant antfile=&quot;CopyFile.xml&quot;/&gt;
  &lt;/target&gt;

  &lt;target name=&quot;copyDirectory&quot;&gt;
    &lt;ant antfile=&quot;CopyDirectory.xml&quot;/&gt;
  &lt;/target&gt;

  &lt;target name=&quot;usage&quot;&gt;
    &lt;echo&gt;Provides some 'function' calls to be used by other programs.&lt;/echo&gt;
  &lt;/target&gt;
&lt;/project&gt;
    </programlisting>

    <para>
      The <filename>OutputBuilder</filename> program loads in this file as an Ant project and then invokes the targets programmatically, this is explained in more detail in the source code for OutputBuilder.
    </para>

    <sect2 id="ProjDoc-AntFunctions-Properties"><title><filename>ant.properties</filename></title>
      <para>
        Each of the functions loads in a properties file which defines common properties called <filename>ant.properties</filename>, this is shown below:
      </para>

      <programlisting>
#basic properties for the build
lib=lib
src=src/doc
build=build
fo.output.stylesheet=lib/docbook-xsl/fo/customfo.xsl
xhtml.output.stylesheet=lib/docbook-xsl/xhtml/customdocbook.xsl
xhtml.chunked.output.stylesheet=lib/docbook-xsl/xhtml/customchunk.xsl
graphics.prefix=../build
      </programlisting>

      <para>This provides a way to modify certain properties used in the build process.</para>
    </sect2>
  </sect1>

  <sect1 id="ProjDoc-CVS-Component"><title>The <acronym>CVS</acronym> component</title>
    <para>
      The project is in <acronym>CVS</acronym>. The <acronym>CVS</acronym> repository is one directory up from the documentation source tree. The repository only contains projects for this tutorial system. Each project was individually checked into the repository, this was considered appropriate since an automated procedure would require either the specification of the location of the new project, which would therefore be as time consuming as checking the project in manually, or a standard location for projects that is scanned by some program and any new directories added as new projects, which would be too restrictive and problematic.
    </para>

    <para>
      The build file shown below updates the source tree from the <acronym>CVS</acronym> repository and then calls the standard build process to rebuild the projects, this is efficient since <acronym>CVS</acronym> will only update when changes have been made and hence the build process will only rebuild when changes have been made.
    </para>

    <programlisting>
&lt;project name=&quot;project update&quot; default=&quot;updateandbuild&quot;&gt;
  &lt;target name=&quot;updateandbuild&quot; depends=&quot;update, build&quot;/&gt;

  &lt;!-- updates the source tree to the latest from CVS--&gt;
  &lt;target name=&quot;update&quot;&gt;
    &lt;cvs command=&quot;checkout&quot; cvsRoot=&quot;/bham/htdocs/supportweb/documentation/tutorials/cvsrepos&quot; package=&quot;.&quot; dest=&quot;/bham/htdocs/supportweb/documentation/tutorials/docsystem/src/doc/tutorials/&quot;/&gt;
  &lt;/target&gt;

  &lt;!-- calls the build file that generates the rendered output --&gt;
  &lt;target name=&quot;build&quot;&gt;
    &lt;ant dir=&quot;docsystem&quot; antfile=&quot;build.xml&quot;/&gt;
  &lt;/target&gt;
&lt;/project&gt;
    </programlisting>
  </sect1>
</article>

