<?xml version="1.0" encoding="UTF-8"?>
<!--
  Copyright 2002-2004 The Apache Software Foundation

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.2//EN" "http://apache.org/forrest/dtd/document-v12.dtd">

<document>
  <header>
    <title>Using Forrest</title>
    <subtitle>A tutorial on how to use Forrest in your own projects</subtitle>
    <version>$Revision: 1.35 $</version>
  </header>

  <body>
    <section id="intro">
      <title>Introduction</title>
      <p>
        This tutorial will lead you through the process of installing Forrest, and using
        it to create a new project, or add Forrest-based docs to an existing project.
      </p>
    </section>

   <section id="installing">
     <title>Installing Forrest</title>
     <p>
       <link href="site:about/download">Download</link> the latest release of Forrest, or
       if you want to try the development version, <link href="site:getting-involved/build">build
       Forrest</link> from source.
     </p>
     <p>
     After downloading and extracting forrest, you need to add environment variables.  In Unix/Linux:
     </p>
     <source>
~/apache-forrest-0.5.1$ export FORREST_HOME=`pwd`
~/apache-forrest-0.5.1$ export PATH=$PATH:$FORREST_HOME/bin
     </source>
     <p>
     In Windows, go to "My Computer", "Properties", "Advanced", "Environment Variables" and add:
     <code>FORREST_HOME</code> as <code>C:\full\path\to\apache-forrest-0.5.1</code> and
     <code>PATH</code> as <code>%PATH%;%FORREST_HOME%\bin</code>
     </p>
     <p>
       To see what the forrest command can do, type 'forrest -projecthelp'
       </p>
     <source>
Apache Forrest.  Run 'forrest -projecthelp' to list options

ANT_OPTS is 
Buildfile: /home/jeff/apache/xml/xml-forrest/build/dist/shbat/bin/../forrest.build.xml

    *=======================================================*
    |                 Forrest Site Builder                  |
    |                        0.5-dev                        |
    |             $Date: 2004/02/26 08:01:12 $              |
    *=======================================================*
  
             Call this through the 'forrest' command
  
Main targets:

 backcopy   If anything has been edited in build/webapps, copies them back to src/documentation
 overrides  Prints a summary of which files a project is overriding
 run        Run Jetty with configuration set by the jetty.run property
 seed       Seeds a directory with a template project doc structure
 site       Generates a static HTML website for this project
 validate   Validates XML doc files in the project
 war        Generates a dynamic servlet-based website (an packaged .war file)
 webapp     Generates a dynamic servlet-based website (an unpackaged webapp)

Default target: site
      </source>
      <p>
        As 'site' is the default target, just running 'forrest' without options will
        generate a "static HTML website". For example, typing 'forrest' in the
       xml-forrest directory would build Forrest's own website. But we're going to be
       building a new site, so read on.
      </p>
    </section>

    <section id="seeding_new">
      <title>Seeding a new project</title>
      <p>
        'Seeding' a project is our own arborial term for adding a template
        documentation set to your project, which you can then customize.
      </p>
      <p>
        To try this out, create a completely new directory, and type 'forrest seed':
      </p>
      <source>
~/apache/xml-mysite$ forrest seed
Apache Forrest.  Run 'forrest -projecthelp' to list options

Buildfile: /home/..../xml-forrest/build/dist/shbat/bin/../forrest.build.xml

init-props:
Loading project specific properties from
/home/jeff/apache/xml-mysite/forrest.properties

echo-settings:

check-contentdir:

ensure-nocontent:

seed:
Expanding: /home/jeff/apache/xml/xml-forrest/build/dist/shbat/fresh-site.zip
           into /home/jeff/apache/xml-mysite

-------------------------------
~~ Template project created! ~~

Here is an outline of the generated files:

/                        # /home/jeff/apache/xml-mysite
/status.xml              # List of project developers, todo list and change log
/forrest.properties      # Optional file describing your site layout
/src/documentation/      # Doc-specific files
/src/documentation/skinconf.xml    # Info about your project used by the skin
/src/documentation/content/        # Site content.
/src/documentation/content/xdocs   # XML content.
/src/documentation/content/xdocs/index.xml # Home page
/src/documentation/content/xdocs/site.xml  # Navigation file for site structure
/src/documentation/content/xdocs/tabs.xml  # Skin-specific 'tabs' file.
/src/documentation/content/*.html,pdf      # Static content files
/src/documentation/resources/images        # Project images (logos, etc)


What to do now?

- Try rendering this template to HTML by typing 'forrest'. View the generated
  HTML in a browser to make sure everything works.
- Edit status.xml and src/documentation/skinconf.xml and customize for your
  project.
- Start adding content in xdocs/, remembering to add new files to site.xml
- Provide any feedback to forrest-dev@xml.apache.org

Thanks for using Apache Forrest
-------------------------------
    

BUILD SUCCESSFUL
Total time: 8 seconds
      </source>
      <note>
        As you've probably begun to notice, we like to document things right in the
        script, on the theory that people only read online docs when desperate :)
      </note>
      <p>
        You now have a template documentation structure all set up:
      </p>
      <source>
jeff@expresso:~/apache/xml-mysite$ tree
.
|-- forrest-targets.ent
|-- forrest.properties
|-- src
|   `-- documentation
|       |-- README.txt
|       |-- content
|       |   |-- hello.pdf
|       |   |-- test1.html
|       |   |-- test2.html
|       |   `-- xdocs
|       |       |-- index.xml
|       |       |-- samples
|       |       |   |-- ehtml-sample.ehtml
|       |       |   |-- faq.xml
|       |       |   |-- ihtml-sample.ihtml
|       |       |   |-- index.xml
|       |       |   |-- sample.xml
|       |       |   |-- sample2.xml
|       |       |   |-- sdocbook.xml
|       |       |   |-- subdir
|       |       |   |   |-- book-sample.xml
|       |       |   |   `-- index.xml
|       |       |   `-- wiki-sample.cwiki
|       |       |-- site.xml
|       |       `-- tabs.xml
|       |-- resources
|       |   `-- images
|       |       |-- group-logo.gif
|       |       |-- group.svg
|       |       |-- icon.png
|       |       |-- project-logo.gif
|       |       `-- project.svg
|       `-- skinconf.xml
`-- status.xml
      </source>
      <p>
        To render this to HTML, type 'forrest'. You should have a HTML site rendered
        into the <code>build/site</code> directory:
      </p>
      <figure src="images/new-project.png" height="356" width="500" alt="New project"/>
    </section>
    <section id="seeding_existing">
      <title>Seeding an existing project</title>
      <p>
        In the section above, we have run 'forrest seed' in an empty directory. If you
        have an existing codebase which you wish to add Forrest docs to, run 'forrest
        seed' in your project base directory, and the Forrest doc structure will be
        grafted onto your project.
      </p>
      <p>
        If your project already has XML documentation, it may be easier to tell
        Forrest where the XML lives, rather than rearrange your project directories to
        accommodate Forrest. This can be done by editing
        <code>forrest.properties</code> (consult
        the <link href="#Changing_the_layout">Changing the layout</link>
        section for more details).
      </p>
    </section>
    <section id="customizing">
      <title>Customizing your project</title>
      <p>
        Having seeded a project with template docs, you will now want to customize it
        to your project's needs. Here we will deal with configuring the skin, and
        changing the project layout.
      </p>
      <section id="skinconf.xml">
        <title>Configuring the Forrest skin: skinconf.xml</title>

        <p>
          Most Forrest skins can be customized through a single XML file,
          <code>src/documentation/skinconf.xml</code>, which (minus its DTD) looks
          like this:
        </p>
<source><![CDATA[
<skinconfig>
  <!-- Do we want to disable the Google search box? -->
  <disable-search>false</disable-search>
  <!-- Do we want to disable the print link? If enabled, valid HTML 4.0.1 -->
  <disable-print-link>true</disable-print-link>  
  <!-- Do we want to disable the PDF link? -->
  <disable-pdf-link>false</disable-pdf-link>
  <!-- Do we want to disable the xml source link? -->
  <disable-xml-link>true</disable-xml-link>
  <!-- Do we want to disable w3c compliance links? -->
  <disable-compliance-links>false</disable-compliance-links>

  <searchsite-domain>mydomain</searchsite-domain>  
  <searchsite-name>MyProject</searchsite-name>  

  <!-- mandatory project logo
       skin: forrest-site renders it at the top -->
  <project-name>MyProject</project-name>
  <project-description>MyProject Description</project-description>
  <project-url>http://myproj.mygroup.org/</project-url>
  <project-logo>images/project.png</project-logo>
  <!-- Alternative static image:
  <project-logo>images/project-logo.gif</project-logo> -->

  <!-- optional group logo
       skin: forrest-site renders it at the top-left corner -->
  <group-name>MyGroup</group-name>
  <group-description>MyGroup Description</group-description>
  <group-url>http://mygroup.org</group-url>
  <group-logo>images/group.png</group-logo>
  <!-- Alternative static image:
  <group-logo>images/group-logo.gif</group-logo> -->

  <!-- optional host logo (e.g. sourceforge logo)
       skin: forrest-site renders it at the bottom-left corner -->
  <host-url></host-url>
  <host-logo></host-logo>

  <!-- The following are used to construct a copyright statement -->
  <year>2003</year>
  <vendor>The Acme Software Foundation.</vendor>

  <!-- Some skins use this to form a 'breadcrumb trail' of links. If you don't
  want these, set the attributes to blank. The DTD purposefully requires them.
  -->
  <trail>
    <link1 name="myGroup" href="http://www.apache.org/"/>
    <link2 name="myProject" href="http://xml.apache.org/"/>
    <link3 name="" href=""/>
  </trail>

  <!-- Configure how many "section" levels need to be included in the
  generated Table of Contents (TOC). By default, if no toc element is provided
  below, then 2 levels are included. Level 0 does not generate any TOC at all.
  -->
  <toc level="2"/>

  <!-- Credits are typically rendered as a set of small clickable images in the
  page footer -->
  <credits>
    <credit>
      <name>Built with Apache Forrest</name>
      <url>http://xml.apache.org/forrest/</url>
      <image>images/built-with-forrest-button.png</image>
      <width>88</width>
      <height>31</height>
    </credit>
    <!-- A credit with @role='pdf' will have its name and url displayed in the
    PDF page's footer. -->
  </credits>

</skinconfig>
]]></source>
        <p>
          Customise this file for your project. The <code>images/</code> directory
          mentioned in 'project-logo' and 'group-logo' elements correspond to the
          <code>src/documentation/resources/images</code> directory (this mapping is done
          in the sitemap).
        </p>
        <p>
          Having edited this file (and ensured it is valid XML!), re-run the 'forrest'
          command in the site root, and the site should be updated.
        </p>
      </section>
      <section id="Changing_the_layout">
        <title>Changing the layout: forrest.properties</title>
        <p>
          For a simple site, Forrest's default directory layout may seem rather
          cumbersome.  Forrest allows you to place files anywhere you want in your
          project, so long as you tell Forrest where you have placed the major file
          types.
        </p>
        <p>
          The <code>forrest.properties</code> file is what maps from your directory
          layout to Forrest's. If you generated your site with 'forrest seed', you
          should have one pre-written, with all the entries commented out. The relevant
          <code>forrest.properties</code> entries (with default values) are:
        </p>
        <source>
# Properties that must be set to override the default locations
#
# Parent properties must be set. This usually means uncommenting
# project.content-dir if any other property using it is uncommented

#project.status=status.xml
#project.content-dir=src/documentation
#project.conf-dir=${project.content-dir}/conf
#project.sitemap-dir=${project.content-dir}
#project.xdocs-dir=${project.content-dir}/content/xdocs
#project.resources-dir=${project.content-dir}/resources
#project.stylesheets-dir=${project.resources-dir}/stylesheets
#project.images-dir=${project.resources-dir}/images
#project.schema-dir=${project.resources-dir}/schema
#project.skins-dir=${project.content-dir}/skins
#project.skinconf=${project.content-dir}/skinconf.xml
#project.lib-dir=${project.content-dir}/lib
#project.classes-dir=${project.content-dir}/classes
       </source>
       <p>
         For example, if you wish to keep XML documentation in src/xdocs rather than
         <code>src/documentation/content/xdocs</code> simply change the 'project.xdocs-dir'
         definition:
       </p>
       <source>
         project.xdocs-dir=src/xdocs
       </source>
       <p>
         Say we wish to emulate the nice and simple <link
           href="http://maven.apache.org/">Maven</link> format:
       </p>
       <p xml:space="preserve">
         /xdocs
         /xdocs/images
         /xdocs/stylesheets
       </p>
       <p>Here are the required property definitions:</p>
       <source>
project.content-dir=xdocs
project.sitemap-dir=${project.content-dir}
project.xdocs-dir=${project.content-dir}
project.stylesheets-dir=${project.content-dir}/stylesheets
project.images-dir=${project.content-dir}/images
project.skinconf=${project.content-dir}/skinconf.xml
         </source>
         <note>
           Internally, Forrest rearranges the specified directory into the default
           <code>src/documentation/content/xdocs</code> structure. In the layout above, we have
           overlapping directories, so you will end up with duplicate files. This small
           glitch doesn't usually cause problems; just always remember that all links
           are resolved through the sitemap.
         </note>
       </section>

     </section>


    <section id="adding_content">
      <title>Adding content</title>
      <p>
        Now you can start adding content of your own, in
        <code>src/documentation/content/xdocs</code>
      </p>
      <section id="site.xml">
        <title>site.xml</title>
        <p>
          Whenever adding a new file, you should add an entry to the project's
          <code>site.xml</code> file. site.xml is like a site index, and is rendered as
          the vertical column of links in the default skin.  Have a look at Forrest's own
          xdocs for an example.  More detailed info about site.xml is provided in <link
            href="site:linking">Menus and Linking</link>.
        </p>
      </section>
      <section id="tabs.xml">
        <title>tabs.xml</title>
        <p>
          The <code>tabs.xml</code> file is used to produce the 'tabs' in the top-left
          corner of the default skin.
        </p>
        <figure src="images/tabs.png" alt="Tabs"/>
        <p>
          Tabs allow users to quickly jump to sections of your site.  See the
          <link href="site:menu_generation">menu generation</link> documentation
          for more details, and again, consult Forrest's own docs for a usage
          example.
        </p>
        <p>You can have one or two levels of tabs. The images above show a 
        single level. However, you can create a second level that
        will only be displayed when its parent tab is selected. For example,
        the <code>tabs.xml</code> snippet below will display either one or
        two rows of tabs, depending on which of the top level tabs is selected.
        The first row will have two tabs, one labelled <code>How-Tos</code>, the
        other labelled <code>Apache XML Projects</code>. When the 
        <code>How-Tos</code> tab is selected there will
        be no second row of tabs. However, when the <code>Apache XML
        Projects</code> tab is selected, a second row of tabs will be displayed
        below the first.</p>
        <source><![CDATA[
  <tab label="How-Tos" dir="community/howto/"/>
  <tab label="Apache XML Projects" href="http://xml.apache.org">
    <tab label="Forrest" href="http;//xml.apache.org/forrest"/>
    <tab label="Xerces" href="http;//xml.apache.org/xerces"/>
  </tab>
]]></source>
      </section>
      <section id="images">
        <title>Images</title>
        <p>
          Images usually go in <code>src/documentation/resources/images/</code>
          The default sitemap
          maps this directory to <code>images/</code>, so image tags will typically look
          like &lt;figure src="images/project-logo.png" alt="Project Logo"/&gt; 
        </p>
      </section>
    </section>


    <section id="sitemap.xmap">
      <title>Advanced customizations: sitemap.xmap</title>
      <p>
        The Cocoon sitemap is a set of rules for generating content (HTML, PDFs etc)
        from XML sources. Forrest has a default sitemap, which is adequate for
        everyday sites (like the <link href="ext:forrest">Forrest site</link> itself).
      </p>
      <p>
        Sometimes, one needs to go beyond the default set of rules. This is where
        Forrest really shines, because its Cocoon backend allows virtually any
        processing pipeline to be defined. For example, one can:
      </p>
      <ul>
        <li>Transform custom XML content types with XSLT stylesheets</li>
        <li>Generate PNG or JPEG images from <link
            href="http://www.w3.org/TR/SVG/">SVG</link> XML files.
          (<strong>Update:</strong> Forrest's sitemap now does this natively).</li>
        <li>Integrate external XML feeds (eg RSS) into your site's content
          (<strong>Update:</strong> See issues.xmap for an example.</li>
        <li>Merge XML sources via aggregation, or make content from large XML
          sources available as "virtual" files.
          (<strong>Update:</strong>: Forrest's default sitemap defines a whole-site HTML
          and PDF, available as <code>site.html</code> and <code>site.pdf</code>.</li>
        <li>Read content from exotic sources like <link
            href="http://www.rpbourret.com/xml/XMLDBLinks.htm">XML
            databases</link></li>
        <li>Integrate any of <link href="ext:cocoon">Cocoon's</link> vast array
          of capabilities.  The possibilities are best appreciated by
          downloading the latest Cocoon distribution and playing with the
          samples.</li>
      </ul>
      <p>
        If your site defines its own sitemap, it must perform all the operations of
        the Forrest default.  To get started, simply copy the Forrest sitemaps from
        <code>xml-forrest/src/resources/conf/*.xmap</code> into your
        <code>src/documentation</code> directory (or wherever
        <code>${project.sitemap-dir}</code> points to).
      </p>
      <p>
        The sitemap syntax is described in the <link
          href="ext:cocoon/sitemap">Cocoon sitemap docs</link>.  The Forrest
        sitemap is broken into multiple files. The main one is
        <strong>sitemap.xmap</strong>, which delegates to others.  See the <link
          href="site:sitemap-ref">Sitemap Reference</link> for a tour of the
        default sitemap.
      </p>
      <section id="adding_new_content_type">
        <title>Example: Adding a new content type</title>
        <p>
          Say that <code>download.xml</code> lists downloads for a certain package. It would be
          best to represent download information in a custom XML format:
        </p>
        <source><![CDATA[<!DOCTYPE document
          PUBLIC "-//Acme//DTD Download Documentation V1.0//EN" "downloads.dtd">
<document> 
  <header>
    <title>Downloading Binaries</title>
  </header>
  <body>
    <section>
      <title>Downloading binaries</title>
      <p>
        Here are the binaries for FooProject
      </p>
      <release version="0.9.13" date="2002-10-11">
        <downloads>
          <file
            url="http://prdownloads.sf.net/aft/fooproj-0.9.13-bin.zip?download"
            name="fooproj-0.9.13-bin.zip"
            size="5738322"/>
          <file
            url="http://prdownloads.sf.net/aft/fooproj-0.9.13-src.zip?download"
            name="fooproj-0.9.13-src.zip"
            size="10239777"/>
        </downloads>
      </release>
      <release version="0.9.12" date="2002-10-08">
        <downloads>
          <file
            url="http://prdownloads.sf.net/aft/fooproj-0.9.12-src.zip?download"
            name="fooproj-0.9.12-src.zip"
            size="10022737"/>
         </downloads>
       </release>
    </section>
    <section>
      <title>Getting FooProject from CVS</title>
      <p>....</p>
    </section>
  </body>
</document>]]></source>
        <p>This should be placed in your content directory, typically
          <code>src/documentation/content/xdocs</code>, and an entry added to
          site.xml.</p>
        <p>
          To handle these special tags, one would write a stylesheet to convert
          them to regular documentv12 format. Here is such a stylesheet,
          download2document.xsl:
        </p>
        <source><![CDATA[
<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="release">
    <section>
      <title>Version <xsl:value-of select="@version"/> (released
          <xsl:value-of select="@date"/>)</title>
      <table>
        <tr><th>File</th><th>Size</th></tr>
        <xsl:apply-templates select="downloads/*"/>
      </table>
    </section>
  </xsl:template>

  <xsl:template match="file">
    <tr>
      <td><link href="{@url}"><xsl:value-of select="@name"/></link></td>
      <td><xsl:value-of
           select="format-number(@size div (1024*1024), '##.##')"/> MB</td>
    </tr>
  </xsl:template>


  <xsl:template match="@* | node() | comment()">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

]]></source>
          <p>
            Place this in the default stylesheets directory,
            <code>src/documentation/resources/stylesheets</code> (or wherever
            ${project.stylesheets-dir} points).
          </p>
          <p>
            Now the sitemap has to be modified to transform our custom format
            into doc-v12.  The <link href="site:sitemap-ref">Sitemap
              Reference</link> provides details on how the sitemap works, and
            how it can be customized for specific projects.  Specifically, the
            part to read is <link href="site:sitemap-ref/forrest_xmap">the
              forrest.xmap section</link>.  We have to register our new DTD and
            associate a transformation with it.
          </p>
          <ol>
            <li>Override <code>forrest.xmap</code> in your project by copying
              $FORREST_HOME/context/forrest.xmap to your project's
              src/documentation/ directory.</li>
            <li>
              <p>Edit <code>forrest.xmap</code>, locate the
                <code>sourcetype</code> action, and register the new document
                type:</p>
              <source><![CDATA[
<sourcetype name="download">
  <document-declaration public-id="-//Acme//DTD Download Documentation V1.0//EN" />
</sourcetype>]]></source>
            </li>
            <li>
              <p>Locate where the sourcetype action is used, and add a
                <code>when</code> clause to handle the conversion for our
                document type:</p>
              <source><![CDATA[
<map:when test="download">
  <map:transform
    src="resources/stylesheets/download2document.xsl" />
</map:when>]]></source>
            </li>
          </ol>
            <section id="new_dtd">
              <title>Registering a new DTD</title>
              <p>
                 By default, Forrest requires that all XML files be valid: i.e.
                 they must have a DOCTYPE declaration and associated DTD, and
                 validate against it.  Our new 'downloads' document type is no
                 exception.  The <link href="site:validation">XML
                   Validation</link> section continues this example, showing how
                 to register a new document type.  Briefly, this involves:
               </p>
               <ul>
                 <li>Creating a new DTD or (in our case) extending an existing
                   one</li>
                 <li>Putting the new DTD in
                   <code>${project.schema-dir}/dtd</code></li>
                 <li>Adding a mapping from the DOCTYPE public id to the DTD
                   location, in the catalog file,
                   <code>${project.schema-dir}/catalog.xcat</code>.  Eg:
                   <code>PUBLIC "-//Acme//DTD Download Documentation V1.0//EN"
                     "dtd/download-v11.dtd"</code></li>
               </ul>
               <p>
                 Please read <link href="site:validation">XML Validation</link>
                 for the full story.
               </p>
            </section>
          </section>
          <section id="integrating_rss">
            <title>Example: integrating external RSS content</title>
            <p>Similar to the previous example, we can integrate RSS into our
              site by overriding and editing the sitemap.  As described in <link
                href="site:sitemap-ref/source_pipelines">the 'source pipelines'
                section of sitemap reference</link>, Forrest's
              <code>sitemap.xmap</code> delegates source
              handling to various subsitemaps in a <code>**.xml</code> block.
              We can add another *.xml matcher in this section, just before the
              catch-all subsitemap:
            </p>
            <source><![CDATA[<map:match pattern="site.xml">
    <map:mount uri-prefix="" src="aggregate.xmap" check-reload="yes" />
  </map:match>]]>
  <strong><![CDATA[
<map:match pattern="weblog.xml">
  <map:generate src="http://blogs.cocoondev.org/stevenn/index.rss"/>
  <map:transform src="resources/stylesheets/rssissues2document.xsl"/>
  <map:call resource="skinit">
    <map:parameter name="type" value="document2html"/>
    <map:parameter name="path" value="weblog.xml"/>
  </map:call>
</map:match>]]></strong><![CDATA[

  <!-- Default source types -->
  <map:mount uri-prefix="" src="forrest.xmap" check-reload="yes" />

</map:match>]]></source>
            <p>(You will want to rename and customize
              <code>rssissues2document.xsl</code> to your needs)</p>

          </section>
      </section>

      <section id="skins">
        <title>Forrest skins</title>
        <p>
          As Forrest separates content from presentation, we can plug in different
          "skins" to instantly change a site's look &amp; feel.  Forrest provides one
          primary skin, <code>forrest-site</code>, and a handful of others in various
          states of maintenance.
        </p>
        <p>
          To change the skin, edit the <code>forrest.properties</code> file, and
          change the following entry:
        </p>
        <source>
project.skin=forrest-site
        </source>
        <!--
        <note>
          The mechanism for defining which skin to use will change in the future from
          Ant @token@ values to Cocoon input module values.
        </note>
        -->
        <section id="new_skin">
          <title>Defining a new skin</title>
          <p>
            Projects can define their own skin, in the
            <code>src/documentation/skins</code> directory (or wherever
            <code>${project.skins-dir}</code> points). The default sitemap assumes a
            certain skin layout, so the easiest way to create a new skin is by
            copying an existing Forrest skin.  For example, copy
            <code>xml-forrest/src/resources/skins/template</code> to
            <code>src/documentation/skins/myskin</code>, and add
            <code>project.skin=myskin</code> to forrest.properties.
          </p>
          <p>
            In addition, when using a project-specific skin it is a good idea to
            also use a project-specific sitemap.  This is to protect your skin
            from changes in the Forrest default sitemap.  While the sitemap-skin
            contract (expressed as XSLT parameters) is now fairly stable, this
            should not be relied on.
          </p>
          <p>
            The two most interesting XSLT stylesheets involved are:
          </p>
          <dl>
            <dt>xslt/html/document2html.xsl</dt>
            <dd>
              This stylesheet is applied to individual documentv11 XML files, and
              converts them to HTML suitable for embedding in a larger HTML page.
            </dd>
            <dt>xslt/html/site2xhtml.xsl</dt>
            <dd>
              This stylesheet generates the final HTML file from an intermediate
              'site' format produced by the other stylesheets. It defines the general
              layout, and adds the header and footer.
            </dd>
          </dl>
          <p>
            Typically there is a lot of commonality between skins.  XSLT
            provides an 'import' mechanism whereby one XSLT can extend another.
            Forrest XSLTs typically 'import' from a common base:
          </p>
          <source><![CDATA[
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="../../../common/xslt/html/document2html.xsl"/>

  ]]><strong>... overrides of default templates ...</strong><![CDATA[ 
</xsl:stylesheet>]]></source>
          <p>In order to use this feature in your custom skins you must copy
          the common skin from the forrest distribution into your custom skins 
          directory (see <code>xml-forrest/src/resources/skins/common</code>).
          This will protect your skin from changes in the Forrest common skin,
          but you must remember to update this skin in order to take advantage
          of new features added by the Forrest team.</p>
          <p>This is particularly relevant for menu rendering (book2menu.xsl),
            where the common stylesheet does the 'logic' of which item is
            selected, and overriding stylesheets define the presentation.</p>
        </section>
      </section>

    <section id="webapp">
      <title>Interactive Forrest: developing docs faster</title>
      <p>
        In comparison to simpler tools like <link
          href="ext:anakia">Anakia</link>, Cocoon's command-line mode (and hence
        Forrest) is painfully slow.  As the <link href="site:dreams">dream
          list</link> notes, Forrest was originally intended to be used for
        dynamic sites, and the Cocoon crawler used only to create static
        snapshots for mirroring.  This section describes how, by developing with
        a "live" Forrest webapp instance, Forrest-based doc development can be
        faster and easier than comparable tools.
      </p>
      <section id="forrest_run">
        <title>Running as a webapp</title>
        <p>
          Type <code>forrest run</code> in your project root to start Forrest's
          built-in Jetty web server.  Once it has started, point your browser at
          <link href="http://localhost:8888">http://localhost:8888</link>, which
          should show your website, rendered on demand as each page is clicked.
        </p>
        <p>Alternatively if you wish to run Forrest from within an existing
          servlet container, type <code>forrest webapp</code> to build an open
          webapp in <code>build/webapp/</code>.
        </p>
        <section id="using_webapp">
          <title>Using the webapp</title>
          <p>
            With the setup above, you can edit the XML files in
            <code>build/webapp/content/xdocs</code> and see the changes immediately
            in the browser.
          </p>
          <p>
            To get the edited content back to its home directory, either copy it
            once you have finished editing (with the <code>forrest
              backcopy</code> command), or symlink the
            <code>src/documentation/content/xdocs</code> directory to
            <code>build/webapp/content/xdocs</code>.
          </p>

          <note>In the future, we are hoping that Forrest will be able to work with
            <em>in-place</em> content, eliminating the step of copying everything
            into the <code>build/</code> directory.  There are also suggestions for making
            webapp-based content generation the primary technique. Future
            directions like these are debated on 
            the forrest-dev <link href="site:mail-lists">mail list</link>.
            Please join if you have any suggestions.
          </note>
        </section>
      </section>
    </section>
    <section id="invoking_from_ant">
      <title>Invoking Forrest from Ant</title>
      <p>
        Established Java projects which use Ant will typically wish to subsume
        Forrest's build targets ('site', 'webapp', 'validate' etc) into their
        own build system, to provide a unified interface for users.  This
        section describes how to invoke Forrest operations from an external
        Ant build file.
      </p>
      <p>
        Here are the targets that can be included in a project's build.xml
        file to invoke Forrest:
      </p>
      <source><![CDATA[
        <target name="site" description="Generates static HTML documentation">
          <ant antfile="${forrest.home}/forrest.antproxy.xml" target="site"/>
        </target>

        <target name="webapp"
          description="Generates an unpackaged webapp of the website">
          <ant antfile="${forrest.home}/forrest.antproxy.xml" target="webapp"/>
        </target>

        <target name="war"
          description="Generates a .war file containing the website">
          <ant antfile="${forrest.home}/forrest.antproxy.xml" target="war"/>
        </target>

        <target name="validate" description="Validates XML documentation files">
          <ant antfile="${forrest.home}/forrest.antproxy.xml" target="validate"/>
        </target>
        ]]></source>
      <note>
        Always use <code>forrest.antproxy.xml</code>, not
        <code>forrest.build.xml</code>.  The <code>forrest.antproxy.xml</code>
        script invokes <code>forrest.build.xml</code> using Forrest's own
        bundled version of Ant.
      </note>
      <p>
        You'll notice that these targets require <code>${forrest.home}</code>
        to be set.  <code>${forrest.home}</code> must point to the user's
        shbat distribution of Forrest.  Thus we need a mechanism for the user
        to inform the build script of their Forrest's location.  Typically
        this is done by setting a property in a properties file like
        <code>project.properties</code>, but can also be done by looking for the
        <code>FORREST_HOME</code> environment variable.
      </p>
      <p>
        Forrest comes with an Ant snippet file,
        <code>forrest-targets.ent</code> that supplies the targets listed
        above, as well as searching for a <code>${forrest.home}</code>
        definition in a number of likely places:
      </p>
      <ul>
        <li>In the <code>FORREST_HOME</code> environment variable.</li>
        <li>In the <code>project.properties</code> file.</li>
        <li>In the <code>build.properties</code> file.</li>
        <li>In the <code>ant.properties</code> file.</li>
        <li>In the <code>.ant.properties</code> file.</li>
      </ul>
      <p>
        <code>forrest-targets.ent</code> also prints out an informative error
        message if <code>${forrest.home}</code> cannot be resolved.
      </p>
      <p>
        <code>forrest-targets.ent</code> is supplied as part of the template
        Forrest project (<code>'forrest seed'</code>).  The comments at the
        top describe how to use it in a project's build.xml.  Typical usage
        is:
      </p>
      <source><![CDATA[
        <!DOCTYPE project [
        <!ENTITY forrest-targets SYSTEM "file:./forrest-targets.ent">
        ]>

        <project .... >

          ....

          <!-- Include Forrest targets -->
          &forrest-targets;

        </project>
        ]]></source>
      <p>
        Having done this, the Forrest targets (<code>site, webapp, war,
          validate</code>) are automatically added to your project.  
      </p>
      <note>
        Take care if you set forrrest.home using <code>build.properties</code>
        because if your build already reads build.properties then the forrest
        targets will not be able to re-set the forrest.home property.
      </note>
    </section>
  </body>
</document>
