blob: 1350025503a1fc02ddf4328ebabb047ba7305eab [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="Apache Forrest" name="Generator">
<meta name="Forrest-version" content="0.8-dev">
<meta name="Forrest-skin-name" content="pelt">
<title>Menus and Linking (v0.8-dev)</title>
<link type="text/css" href="../skin/basic.css" rel="stylesheet">
<link media="screen" type="text/css" href="../skin/screen.css" rel="stylesheet">
<link media="print" type="text/css" href="../skin/print.css" rel="stylesheet">
<link type="text/css" href="../skin/profile.css" rel="stylesheet">
<script src="../skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="../skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="../skin/fontsize.js" language="javascript" type="text/javascript"></script>
<link rel="shortcut icon" href="../favicon.ico">
</head>
<body onload="init()">
<script type="text/javascript">ndeSetTextSize();</script>
<div id="top">
<!--+
|breadtrail
+-->
<div class="breadtrail">
<a href="http://www.apache.org/">apache</a> &gt; <a href="http://forrest.apache.org/">forrest</a><script src="../skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
</div>
<!--+
|header
+-->
<div class="header">
<!--+
|start group logo
+-->
<div class="grouplogo">
<a href="http://www.apache.org/"><img class="logoImage" alt="Apache" src="../images/apache-forrest.png" title="The Apache Software Foundation"></a>
</div>
<!--+
|end group logo
+-->
<!--+
|start Project Logo
+-->
<div class="projectlogo">
<a href="http://forrest.apache.org/"><img class="logoImage" alt="Forrest" src="../images/project-logo.gif" title="Apache Forrest"></a>
</div>
<!--+
|end Project Logo
+-->
<!--+
|start Search
+-->
<div class="searchbox">
<form action="http://www.google.com/search" method="get" class="roundtopsmall">
<input value="forrest.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp;
<input name="Search" value="Search" type="submit">
</form>
</div>
<!--+
|end search
+-->
<!--+
|start Tabs
+-->
<ul id="tabs">
<li>
<a class="unselected" href="../index.html">Welcome</a>
</li>
<li>
<a class="unselected" href="../contrib.html">Developers</a>
</li>
<li class="current">
<a class="selected" href="../versions/index.html">Versioned Docs</a>
</li>
<li>
<a class="unselected" href="../pluginDocs/index.html">Plugins</a>
</li>
<li>
<a class="unselected" href="../tools/index.html">Tools</a>
</li>
</ul>
<!--+
|end Tabs
+-->
</div>
</div>
<div id="main">
<div id="publishedStrip">
<!--+
|start Subtabs
+-->
<div id="level2tabs">
<a class="unselected" href="../docs_0_70/index.html">0.70 (current)</a><a class="selected" href="../docs_0_80/index.html">0.80-dev (under development)</a><a class="unselected" href="../docs_0_60/index.html">0.60 (past)</a>
</div>
<!--+
|end Endtabs
+-->
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<!--+
|breadtrail
+-->
<div class="breadtrail">
&nbsp;
</div>
<!--+
|start Menu, mainarea
+-->
<!--+
|start Menu
+-->
<div id="menu">
<div onclick="SwitchMenu('menu_selected_1.1', '../skin/')" id="menu_selected_1.1Title" class="menutitle" style="background-image: url('../skin/images/chapter_open.gif');">0.80-dev</div>
<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
<div class="menuitem">
<a href="../docs_0_80/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/your-project.html">Using Forrest</a>
</div>
<div onclick="SwitchMenu('menu_1.1.3', '../skin/')" id="menu_1.1.3Title" class="menutitle">How-To</div>
<div id="menu_1.1.3" class="menuitemgroup">
<div class="menuitem">
<a href="../docs_0_80/howto/index.html">Overview</a>
</div>
<div onclick="SwitchMenu('menu_1.1.3.2', '../skin/')" id="menu_1.1.3.2Title" class="menutitle">Install Forrest</div>
<div id="menu_1.1.3.2" class="menuitemgroup">
<div class="menuitem">
<a href="../docs_0_80/build.html" title="Build and install the current unreleased version">Building Forrest from Source</a>
</div>
</div>
<div class="menuitem">
<a href="../docs_0_80/upgrading_08.html">Upgrading to 0.8</a>
</div>
<div class="menuitem">
<a href="">Use Forrest</a>
</div>
<div onclick="SwitchMenu('menu_1.1.3.5', '../skin/')" id="menu_1.1.3.5Title" class="menutitle">Customize Forrest</div>
<div id="menu_1.1.3.5" class="menuitemgroup">
<div class="menuitem">
<a href="../docs_0_80/sitemap-explain.html">Sitemaps explained</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/howto-custom-html-source.html">Custom html source</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/project-sitemap.html">Project sitemap</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/howto-editcss.html">Edit CSS (WYSIWYG)</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/howto-pdf-tab.html" title="Generate one pdf-document for all pages of a tab">Create tab PDF</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/howto-corner-images.html">CSS corner SVG</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.1.3.6', '../skin/')" id="menu_1.1.3.6Title" class="menutitle">Integrate Forrest with tools</div>
<div id="menu_1.1.3.6" class="menuitemgroup">
<div class="menuitem">
<a href="../docs_0_80/howto/howto-forrest-from-maven.html">Maven Integration</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/catalog.html">Using DTD Catalogs</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.1.3.7', '../skin/')" id="menu_1.1.3.7Title" class="menutitle">Extend Forrest</div>
<div id="menu_1.1.3.7" class="menuitemgroup">
<div class="menuitem">
<a href="../docs_0_80/howto/howto-buildPlugin.html">Build a Plugin</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/skin-package.html">Package new Skins</a>
</div>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/howto-asf-mirror.html">Download mirror</a>
</div>
<div onclick="SwitchMenu('menu_1.1.3.9', '../skin/')" id="menu_1.1.3.9Title" class="menutitle">Adding Documentation</div>
<div id="menu_1.1.3.9" class="menuitemgroup">
<div class="menuitem">
<a href="../howto-howto.html" title="Instructions for writing a new howto-document">Write a How-to</a>
</div>
<div onclick="SwitchMenu('menu_1.1.3.9.2', '../skin/')" id="menu_1.1.3.9.2Title" class="menutitle">Multipage HowTo</div>
<div id="menu_1.1.3.9.2" class="menuitemgroup">
<div class="menuitem">
<a href="../docs_0_80/howto/multi/howto-multi.html">Introduction</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/multi/step1.html">Step 1</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/multi/step2.html">Step 2</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/multi/step3.html">Step 3</a>
</div>
</div>
</div>
</div>
<div class="menuitem">
<a href="../docs_0_80/faq.html">FAQs</a>
</div>
<div onclick="SwitchMenu('menu_selected_1.1.5', '../skin/')" id="menu_selected_1.1.5Title" class="menutitle" style="background-image: url('../skin/images/chapter_open.gif');">Background</div>
<div id="menu_selected_1.1.5" class="selectedmenuitemgroup" style="display: block;">
<div class="menupage">
<div class="menupagetitle">Menus and Linking</div>
</div>
<div class="menuitem">
<a href="../docs_0_80/searching.html">Search Options in Forrest</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/locationmap.html">Locationmap</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/sitemap-ref.html">Sitemap Reference</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/skins.html" title="About default skins, their naming and features">Skins</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/status-themes.html">Dispatcher versus Skins</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/cap.html">Sourcetype Action</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/validation.html">XML validation and entity resolution</a>
</div>
</div>
<div class="menuitem">
<a href="../docs_0_80/changes.html">Changes</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/glossary.html">Glossary</a>
</div>
<div onclick="SwitchMenu('menu_1.1.8', '../skin/')" id="menu_1.1.8Title" class="menutitle">Reference docs</div>
<div id="menu_1.1.8" class="menuitemgroup">
<div onclick="SwitchMenu('menu_1.1.8.1', '../skin/')" id="menu_1.1.8.1Title" class="menutitle">DTD documentation</div>
<div id="menu_1.1.8.1" class="menuitemgroup">
<div class="menuitem">
<a href="../dtdx/dtd-docs.html">Overview</a>
</div>
<div class="menuitem">
<a href="../dtdx/document-v20.dtdx.html">document-v20</a>
</div>
<div class="menuitem">
<a href="../dtdx/howto-v20.dtdx.html">howto-v20</a>
</div>
<div class="menuitem">
<a href="../dtdx/faq-v20.dtdx.html">faq-v20</a>
</div>
<div class="menuitem">
<a href="../dtdx/document-v13.dtdx.html">document-v13</a>
</div>
<div class="menuitem">
<a href="../dtdx/howto-v13.dtdx.html">howto-v13</a>
</div>
<div class="menuitem">
<a href="../dtdx/faq-v13.dtdx.html">faq-v13</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.1.8.2', '../skin/')" id="menu_1.1.8.2Title" class="menutitle">Doc samples</div>
<div id="menu_1.1.8.2" class="menuitemgroup">
<div class="menuitem">
<a href="../dtdx/document-v13.html">document-v13</a>
</div>
<div class="menuitem">
<a href="../dtdx/document-v20.html">document-v20</a>
</div>
</div>
</div>
<div onclick="SwitchMenu('menu_1.1.9', '../skin/')" id="menu_1.1.9Title" class="menutitle">Older Docs</div>
<div id="menu_1.1.9" class="menuitemgroup">
<div class="menuitem">
<a href="../docs_0_80/primer.html">Forrest Primer</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/libre-intro.html">Libre</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/dreams.html">Dream list</a>
</div>
<div class="menuitem">
<a href="../docs_0_80/howto/cvs-ssh/howto-cvs-ssh.html">CVS over SSH</a>
</div>
</div>
</div>
<div id="credit">
<hr>
This is documentation for development version v0.8
(<a href="http://forrest.apache.org/versions/">More</a>)</div>
<div id="roundbottom">
<img style="display: none" class="corner" height="15" width="15" alt="" src="../skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
<!--+
|alternative credits
+-->
<div id="credit2">
<a href="http://apachecon.com/2007/EU/"><img border="0" title="ApacheCon Europe 2007" alt="ApacheCon Europe 2007 - logo" src="http://apache.org/ads/ApacheCon/2007-europe-125x125.png" style="width: 125px;height: 125px;"></a><a href="http://people.apache.org/calendar.html#200711"><img border="0" title="ApacheCon US 2007" alt="ApacheCon US 2007 - logo" src="http://apache.org/ads/ApacheCon/2007-usa-125x125.png" style="width: 125px;height: 125px;"></a>
</div>
</div>
<!--+
|end Menu
+-->
<!--+
|start content
+-->
<div id="content">
<div title="Portable Document Format" class="pdflink">
<a class="dida" href="linking.pdf"><img alt="PDF -icon" src="../skin/images/pdfdoc.gif" class="skin"><br>
PDF</a>
</div>
<div class="trail">Font size:
&nbsp;<input value="Reset" class="resetfont" title="Reset text" onclick="ndeSetTextSize('reset'); return false;" type="button">
&nbsp;<input value="-a" class="smallerfont" title="Shrink text" onclick="ndeSetTextSize('decr'); return false;" type="button">
&nbsp;<input value="+a" class="biggerfont" title="Enlarge text" onclick="ndeSetTextSize('incr'); return false;" type="button">
</div>
<h1>Menus and Linking</h1>
<div id="motd-area">
This is documentation for development version v0.8
(<a href="http://forrest.apache.org/versions/">More</a>)</div>
<div id="minitoc-area">
<ul class="minitoc">
<li>
<a href="#intro">Introduction</a>
</li>
<li>
<a href="#site">site.xml</a>
</li>
<li>
<a href="#menu_generation">Generating Menus</a>
<ul class="minitoc">
<li>
<a href="#tabs-external">Tabs for External Resources</a>
</li>
<li>
<a href="#selecting-entries">Selecting menu entries</a>
</li>
<li>
<a href="#other-menu-selection">Alternative menu selection mechanisms.</a>
<ul class="minitoc">
<li>
<a href="#dir-menu-selection">Directory-based selection</a>
</li>
<li>
<a href="#book-menu-selection">Specifying menus with book.xml</a>
</li>
</ul>
</li>
<li>
<a href="#tab-selection">Selecting the current tab</a>
</li>
<li>
<a href="#tab-site">Configuring the interaction between tabs.xml and site.xml</a>
</li>
</ul>
</li>
<li>
<a href="#toc-generation">Table of Contents Generation</a>
</li>
<li>
<a href="#linking">Linking systems</a>
<ul class="minitoc">
<li>
<a href="#direct-linking">Direct linking</a>
</li>
<li>
<a href="#indirect-linking">Indirect linking</a>
<ul class="minitoc">
<li>
<a href="#resolve-site-uris">Resolving site: URIs</a>
</li>
<li>
<a href="#resolve-ext-uris">ext: URIs: linking to external URLs</a>
</li>
<li>
<a href="#source-uris">Theory: source URIs</a>
</li>
<li>
<a href="#future-schemes">Future schemes</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#concept">Concept</a>
</li>
<li>
<a href="#implementation">Implementation</a>
</li>
</ul>
</div>
<a name="N1000D"></a><a name="intro"></a>
<h2 class="underlined_10">Introduction</h2>
<div class="section">
<p>
This document describes Forrest's internal URI space; how it is managed
with the "<span class="codefrag">site.xml</span>" configuration file, how menus are generated, and how
various link schemes (site: and ext:) operate. An overview of the
implementation is also provided.
</p>
<p>
While reading this document, bear in mind that the Cocoon
<a href="../docs_0_80/sitemap-ref.html">Sitemap</a> is handling the processing.
The sitemaps are resolving the site: URIs and then matching them to
determine how to process each. In general, you can use the power of the
Cocoon Sitemap to handle certain difficult linking and menu situations
(for example see this <a href="../docs_0_80/faq.html#tab-index">FAQ</a>).
</p>
</div>
<a name="N10025"></a><a name="site"></a>
<h2 class="underlined_10">site.xml</h2>
<div class="section">
<p>
The "<span class="codefrag">site.xml</span>" configuration file is what we would call a "site map" if
Cocoon hadn't already claimed that term. The "<span class="codefrag">site.xml</span>" is a loosely
structured XML file, acting as a map of the site's contents. It provides
a unique identifier (an XPath address) for "nodes" of information in the
website. A "node" of site information can be:
</p>
<ul>
<li>A category of information, like "the user guide". A category may
correspond to a directory, but that is not required.</li>
<li>A specific page, e.g. "the FAQ page"</li>
<li>A specific section in a page, e.g. the "general" section of the FAQ
page (identified by <span class="codefrag">id="general"</span> attribute)</li>
</ul>
<p>
In addition to providing fine-grained addressing of site info, the <span class="codefrag">site.xml</span>
allows <em>metadata</em> to be associated with each node, using
attributes or child elements. Most commonly, a <span class="codefrag">label</span>
attribute is used to provide a text description of the node.
</p>
<p>
There are currently two applications of <span class="codefrag">site.xml</span>
</p>
<dl>
<dt>
<a href="#menu_generation">Menu generation</a>
</dt>
<dd>
<span class="codefrag">site.xml</span> is used to generate the menus for the HTML website.</dd>
<dt>
<a href="#indirect-linking">Indirect linking</a>
</dt>
<dd>
<span class="codefrag">site.xml</span> provides a basic aliasing mechanism for linking, e.g. one
can write &lt;link href="site:changes"&gt; from anywhere in the site, and
link to the "changes" information node (translated to changes.html).
More on this below.</dd>
</dl>
<p>
Here is a sample <span class="codefrag">site.xml</span> ...
</p>
<pre class="code">
&lt;?xml version="1.0"?&gt;
&lt;site label="Forrest" href="" tab="home"
xmlns="http://apache.org/forrest/linkmap/1.0"&gt;
&lt;about label="About"&gt;
&lt;index label="Index" href="index.html"/&gt;
&lt;license label="License" href="license.html"/&gt;
&lt;your-project label="Using Forrest" href="your-project.html"&gt;
&lt;new_content_type href="#adding_new_content_type"/&gt;
&lt;/your-project&gt;
&lt;linking label="Linking" href="linking.html"/&gt;
&lt;changes label="Changes" href="changes.html"/&gt;
&lt;todo label="Todo" href="todo.html"/&gt;
&lt;live-sites label="Live sites" href="live-sites.html"/&gt;
&lt;/about&gt;
&lt;community label="Community" href="community/" tab="community"&gt;
&lt;index label="About" href="index.html"/&gt;
&lt;howto-samples label="How-To Samples" href="howto/" tab="howto"&gt;
&lt;overview label="Overview" href="index.html"/&gt;
&lt;single-page label="Single Page" href="v10/howto-v10.html"/&gt;
&lt;multi-page label="Multi-Page" href="multi/"&gt;
&lt;intro label="Intro" href="howto-multi.html"/&gt;
&lt;step1 label="Step 1" href="step1.html"/&gt;
&lt;step2 label="Step 2" href="step2.html"/&gt;
&lt;/multi-page&gt;
&lt;/howto-samples&gt;
&lt;/community&gt;
&lt;references label="References"&gt;
&lt;gump label="Apache Gump" href="http://gump.apache.org/"/&gt;
&lt;cocoon label="Apache Cocoon" href="http://cocoon.apache.org/"/&gt;
&lt;/references&gt;
&lt;external-refs&gt;
&lt;mail-archive href="http://marc.theaimsgroup.com"/&gt;
&lt;xml.apache.org href="http://xml.apache.org/"&gt;
&lt;commons href="commons/"&gt;
&lt;resolver href="components/resolver/"/&gt;
&lt;/commons&gt;
&lt;fop href="fop/"/&gt;
&lt;batik href="batik/"/&gt;
&lt;/xml.apache.org&gt;
&lt;mail&gt;
&lt;semantic-linking href="http://marc.theaimsgroup.com/?l=forrest-dev
&amp;amp;m=103097808318773&amp;amp;w=2"/&gt;
&lt;/mail&gt;
&lt;cool-uris href="www.w3.org/Provider/Style/URI.html"/&gt;
&lt;uri-rfc href="http://zvon.org/tmRFC/RFC2396/Output/index.html"/&gt;
&lt;/external-refs&gt;
&lt;/site&gt;
</pre>
<p>
As you can see, things are quite free-form. The rules are as follows:
</p>
<ul>
<li>The root element must be "site", and normal content should be in the
namespace <span class="codefrag">http://apache.org/forrest/linkmap/1.0</span> (Feel
free to mix in your own content (RDF, dublin core, etc) under new
namespaces)</li>
<li>Element names are used as identifiers. The "<span class="codefrag">foo</span>" in
"<span class="codefrag">site:foo</span>" must therefore be a valid NMTOKEN.</li>
<li>Elements with <span class="codefrag">href</span> attributes can be used as identifiers
in "<span class="codefrag">site:</span>" URIs</li>
<li>Relative href attribute contents are "accumulated" by prepending hrefs
from ancestor nodes</li>
<li>Elements without <span class="codefrag">label</span> attributes (and their children)
are not displayed in the menu.</li>
<li>Elements below <span class="codefrag">external-refs</span> are mapped to the
"<span class="codefrag">ext:</span>" scheme. So "<span class="codefrag">ext:commons/resolver/</span>" becomes
"<span class="codefrag">http://xml.apache.org/commons/resolver/</span>"</li>
</ul>
<p>
See another <a href="../docs_0_80/faq.html#site-xml">explained example</a>.
Also remember to look at the comprehensive example with Forrest's own
documentation.
</p>
</div>
<a name="N100B4"></a><a name="menu_generation"></a>
<h2 class="underlined_10">Generating Menus</h2>
<div class="section">
<p>
Two files are used to define a site's tabs and menu (<span class="codefrag">site.xml</span> and
<span class="codefrag">tabs.xml</span>). Both files are located in
<span class="codefrag">src/documentation/content/xdocs/</span>
</p>
<p>
Assume that our <span class="codefrag">tabs.xml</span> looks like this:
</p>
<pre class="code">
&lt;tabs ...&gt;
&lt;tab id="home" label="Home" dir=""/&gt;
&lt;tab id="community" label="Community" dir="community" indexfile="mailLists.html"/&gt;
&lt;tab id="howto" label="How-Tos" dir="community/howto"/&gt;
&lt;/tabs&gt;
</pre>
<p>
Using the "<span class="codefrag">site.xml</span>" listed above, we would get these menus:
</p>
<p>
<img alt="Menu generated from site.xml" src="images/menu.png">
&nbsp;&nbsp;&nbsp;
<img alt="Community menu generated from site.xml" src="images/menu2.png">
&nbsp;&nbsp;&nbsp;
<img alt="Howto menu generated from site.xml" src="images/menu3.png">
</p>
<p>
When using the "<span class="codefrag">dir</span>" attribute as above the value of the
"<span class="codefrag">indexfile</span>" parameter is appended to the value of the
"<span class="codefrag">dir</span>" attribute (together with a preceding '/'). For
example, the link for the community tab above is
<span class="codefrag">community/mailLists.html</span>. Note that
"<span class="codefrag">indexfile</span>" defaults to "<span class="codefrag">index.html</span>" if no
value is supplied. Therefore the link for the howto tab is
<span class="codefrag">community/howto/index.html</span>
</p>
<a name="N100FD"></a><a name="tabs-external"></a>
<h3 class="underlined_5">Tabs for External Resources</h3>
<p>
A tab can refer to an external resource by using the
"<span class="codefrag">href</span>" attribute instead of the "<span class="codefrag">dir</span>"
attribute. The value of "<span class="codefrag">href</span>" should be the URI of the
resource you wish to link to. For example:
</p>
<pre class="code">
&lt;tab id="apache" label="XML Apache" href="http://xml.apache.org/"/&gt;
</pre>
<p>
Unlike the "<span class="codefrag">dir</span>" attribute, the value of
"<span class="codefrag">href</span>" is left unmodified by Forrest unless it is
root-relative and obviously specifies a directory (ends in '/'). In
which case /index.html will be added.
</p>
<a name="N1011D"></a><a name="selecting-entries"></a>
<h3 class="underlined_5">Selecting menu entries</h3>
<p>
Forrest decides which menu entries to display, by examining the
"<span class="codefrag">tab</span>" attributes in the <span class="codefrag">site.xml</span> file. The children of all <span class="codefrag">site.xml</span>
entries with a "<span class="codefrag">tab</span>" which is equal to that of the
current page, are added to the menu, whilst the element itself forms
the root of that part of the menu (see the "<span class="codefrag">community</span>"
element in the example below). Child elements that have a different
"<span class="codefrag">tab</span>" attribute value will appear in the menu for their
parents, and will also form the root of a new menu for a tab with the
appropriate name (see the "<span class="codefrag">howto-samples</span>" element below).
</p>
<p>
Consider our <span class="codefrag">site.xml</span> example:
</p>
<pre class="code">
&lt;site label="Forrest" href="" <strong>tab="home"</strong>
xmlns="http://apache.org/forrest/linkmap/1.0"&gt;
&lt;about label="About"&gt;
&lt;index label="Index" href="index.html"/&gt;
&lt;license label="License" href="license.html"/&gt;
&lt;your-project label="Using Forrest" href="your-project.html"&gt;
&lt;new_content_type href="#adding_new_content_type"/&gt;
&lt;/your-project&gt;
&lt;linking label="Linking" href="linking.html"/&gt;
....
&lt;/about&gt;
&lt;community label="Community" href="community/" <strong>tab="community"</strong>&gt;
&lt;index label="About" href="index.html"/&gt;
&lt;howto-samples label="How-To Samples" href="howto/" <strong>tab="howto"</strong>&gt;
&lt;overview label="Overview" href="index.html"/&gt;
&lt;single-page label="Single Page" href="v10/howto-v10.html"/&gt;
&lt;multi label="Multi-Page" href="multi/"&gt;
&lt;intro label="Intro" href="howto-multi.html"/&gt;
&lt;step1 label="Step 1" href="step1.html"/&gt;
...</pre>
<p>
Every <span class="codefrag">site.xml</span> node can potentially have a "<span class="codefrag">tab</span>" attribute. If
unspecified, nodes inherit the "<span class="codefrag">tab</span>" of their parent.
Thus everything in the <strong>&lt;about&gt;</strong> section has an
implicit <span class="codefrag">tab="home" </span>attribute.
</p>
<div class="note">
<div class="label">Note</div>
<div class="content">
You can see this by viewing your site's
<a href="../abs-menulinks">abs-menulinks</a> pipeline in a
browser.
</div>
</div>
<p>
Say that the user is viewing the <span class="codefrag">linking.html</span> page. The
<strong>&lt;linking&gt;</strong> node has an implicit tab value of
"<span class="codefrag">home</span>". Forrest will select <em>all nodes with
tab="home"</em> and put them in the menu.
</p>
<a name="N10177"></a><a name="other-menu-selection"></a>
<h3 class="underlined_5">Alternative menu selection mechanisms.</h3>
<p>
The "<span class="codefrag">tab</span>" attribute-based scheme for selecting a menu's
entries is not the only one, although it is the most flexible. Here we
describe a few alternatives.
</p>
<a name="N10183"></a><a name="dir-menu-selection"></a>
<h4>Directory-based selection</h4>
<p>
In this scheme, each tab corresponds to a directory within the site.
All content below that directory is included in the menu.
</p>
<p>
<img alt="Directory-based site menu" src="images/dir-menu.png">
&nbsp;&nbsp;&nbsp;
<img alt="community/ directory menu" src="images/dir-menu2.png">
&nbsp;&nbsp;&nbsp;
<img alt="community/howto/ directory menu" src="images/dir-menu3.png">
</p>
<p>
To use this scheme:
</p>
<ul>
<li>Edit <span class="codefrag">forrest.properties</span> and set
<span class="codefrag">project.menu-scheme=directories</span>
</li>
<li>Remove the "<span class="codefrag">id</span>" attributes from <span class="codefrag">tabs.xml</span>
entries.</li>
</ul>
<a name="N101B3"></a><a name="book-menu-selection"></a>
<h4>Specifying menus with book.xml</h4>
<p>
Historically, menus in Forrest have been generated from a
<span class="codefrag">book.xml</span> file, one per directory. This mechanism is
still available, and if a <span class="codefrag">book.xml</span> is found, it will be
used in preference to the menu generated by the <span class="codefrag">site.xml</span> file. The
<span class="codefrag">book.xml</span> files can use "<span class="codefrag">site:</span>" URIs to
ease the maintenance burden that led to obsolescence of book.xml
files. In general, however, we recommend that users avoid
<span class="codefrag">book.xml</span> files.
</p>
<a name="N101D0"></a><a name="tab-selection"></a>
<h3 class="underlined_5">Selecting the current tab</h3>
<p>
The tab selection algorithm is quite simple: the tab with the
"<span class="codefrag">id</span>" which matches that of the current <span class="codefrag">site.xml</span> node is
"selected". However the interaction of <span class="codefrag">tabs.xml</span> and <span class="codefrag">site.xml</span> while powerful, can
be complex to establish.
</p>
<a name="N101E6"></a><a name="tab-site"></a>
<h3 class="underlined_5">Configuring the interaction between tabs.xml and site.xml</h3>
<p>
This is a collection of tips to assist with getting your menus and
tabs to properly display.
</p>
<ul>
<li>
See the various notes above, not repeated in this list of tips.
</li>
<li>
View your site's
<a href="../abs-menulinks">abs-menulinks</a> pipeline in a
browser. This is part of the internal Cocoon machinery, but like
other sitemap resources, it is useful to view them to assist with
debugging.
</li>
<li>
The Forrest website also accompanies your software release
in the <span class="codefrag">site-author</span> directory, so
inspect its <span class="codefrag">tabs.xml</span> and <span class="codefrag">site.xml</span> to see how it is done. Also see the
'forrest seed site' example. It is not as complex as the Forrest website.
</li>
<li>
When you are fiddling with your attributes, change one thing at a time
and document what you have changed.</li>
<li>
The value of the tab @id attribute cannot begin with a digit.
Likewise, element names in <span class="codefrag">tabs.xml</span> and <span class="codefrag">site.xml</span> cannot begin with a digit.
</li>
<li>
Add label attributes to <span class="codefrag">site.xml</span> elements to make the menus show.
With nested elements in <span class="codefrag">site.xml</span> if the outer element does not have a label
attribute then the inner elements will not be displayed.
</li>
<li>
To cause tabs and menu items to be highlighted, there need to be
corresponding elements in <span class="codefrag">site.xml</span> that have href attributes which match
the relevant path.
See
<a href="http://www.mail-archive.com/user%40forrest.apache.org/msg01750.html">email explanation</a>.
</li>
<li>
When the tab points to a directory, then to make the tab highlighted
when selected, you need an element which matches index.html within the
group of elements that define the menus for this tab in the <span class="codefrag">site.xml</span>
file. That element can be without a label attribute, so that it doesn't
display as a menu item. However doing that causes that tab's menus
to be collapsed.
</li>
<li>
Q: The tab link in my site assumes that 'index.html'
is present in the linked-to directory. How do I fix this?
A: In <span class="codefrag">tabs.xml</span> use @href instead of @dir attribute and omit the trailing '/'.
Which file to serve is then a concern of the sitemap.
See more at the <a href="../docs_0_80/faq.html#tab-index">FAQ</a>.
</li>
</ul>
</div>
<a name="N10239"></a><a name="toc-generation"></a>
<h2 class="underlined_10">Table of Contents Generation</h2>
<div class="section">
<p>
Each page can have an automatically generated table of contents. This is
created from the titles of each section in your xdoc. By default only
sections up to two levels deep are included and the table of contents is
displayed at the top of the page. However, you can configure this
behaviour in <span class="codefrag">src/documentation/skinconf.xml</span> using the
"<span class="codefrag">toc</span>" element.
</p>
<pre class="code">
&lt;toc level="2" location="page"/&gt;
</pre>
<ul>
<li>
<strong><span class="codefrag">level</span></strong> - is the depth to which you
want your table of contents to go. Setting it to "3" will therefore
include sections nested to 3 levels. Setting this to "0" will result in
no table of contents being generated.</li>
<li>
<strong><span class="codefrag">location</span></strong> - indicates where you
want the table of contents to be rendered. It can be set to one of
three values:
<ul>
<li>
<span class="codefrag">page</span> - the table of contents will be rendered
at the top of the body of your page</li>
<li>
<span class="codefrag">menu</span> - the table of contents will be rendered
in the menu to the left of the body of the page</li>
<li>
<span class="codefrag">menu, page</span> - table of contents will be rendered
in both the page and the menu positions</li>
</ul>
</li>
</ul>
</div>
<a name="N1026D"></a><a name="linking"></a>
<h2 class="underlined_10">Linking systems</h2>
<div class="section">
<a name="N10273"></a><a name="direct-linking"></a>
<h3 class="underlined_5">Direct linking</h3>
<p>
In earlier versions of Forrest (and in similar systems), there has
been only one URI space: that of the generated site. If <span class="codefrag">index.xml</span> wants to
link to <span class="codefrag">todo.xml</span> then <span class="codefrag">index.xml</span> would use
</p>
<pre class="code">
&lt;a href="todo.html"&gt;to-do list&lt;a&gt;
</pre>
<p>
The theoretical problem with this is that the content producer should
not know or care how Forrest is going to render the source. A URI
should only <em>identify</em> a resource, not specify it's type
[<a href="http://marc.theaimsgroup.com/?l=forrest-dev&m=103097808318773&w=2">mail ref</a>] and
[<a href="http://www.w3.org/Provider/Style/URI.html">cool URIs</a>]. In fact, as Forrest
typically renders to multiple output formats (HTML and PDF), links in
one of them (here, the PDF) are likely to break.
</p>
<a name="N10298"></a><a name="indirect-linking"></a>
<h3 class="underlined_5">Indirect linking</h3>
<p>
Forrest's solution is simple: instead of &lt;a href="todo.html"&gt;,
write &lt;a href="site:todo"&gt; where:
</p>
<dl>
<dt>site</dt>
<dd>is a URI "scheme"; a namespace that restricts
the syntax and semantics of the rest of the URI
[<a href="http://zvon.org/tmRFC/RFC2396/Output/index.html">rfc2396</a>]. The semantics of "site" are
"this identifier locates something in the site's XML sources".</dd>
<dt>todo</dt>
<dd>identifies the content in <span class="codefrag">todo.xml</span> by reference to a
"node" of content declared in <span class="codefrag">site.xml</span>
</dd>
</dl>
<p>
We call this indirect, or <em>semantic</em> linking because instead of
linking to a physical representation (todo.html), we've linked to the
"idea" of "the todo file". It doesn't matter where it physically
lives; that will be sorted out by Forrest.
</p>
<a name="N102BF"></a><a name="resolve-site-uris"></a>
<h4>Resolving site: URIs</h4>
<p>
So how does "<span class="codefrag">site:todo</span>" get resolved? A full answer is
provided in the <a href="#implementation">implementation</a>
section. Essentially, the "<span class="codefrag">todo</span>" part has
"<span class="codefrag">/site//</span>" prepended, and "<span class="codefrag">/@href</span>"
appended, to form the string "<span class="codefrag">/site//todo/@href</span>". This
is then used as an XPath expression in <span class="codefrag">site.xml</span> to identify the string
replacement, in this case "<span class="codefrag">todo.html</span>"
</p>
<p>
Thus by modifying the XPath prefix and suffix, almost any XML format
can be accommodated.
</p>
<div class="note">
<div class="label">Note</div>
<div class="content">
Actually, the XPath is applied to XML generated dynamically from
<span class="codefrag">site.xml</span>. The generated XML has each "@href" fully expanded
("absolutized") and dot-dots (..) added as needed ("relativized").
</div>
</div>
<p>
Notice that the "//" allows us any degree of specificity when
linking. In the sample <span class="codefrag">site.xml</span> above, both
"<span class="codefrag">site:new_content_type</span>" and
"<span class="codefrag">site:about/your-project/new_content_type</span>" identify the
same node. It is up to you to decide how specific to make links. One
nice benefit of link "ambiguity" is that <span class="codefrag">site.xml</span> can be reorganized
without breaking links. For example, "new_content_type" currently
identifies a node in "your-project". By leaving that fact
unspecified in "<span class="codefrag">site:new_content_type</span>" we are free to
make "new_content_type" its own XML file, or a node in another file,
in another category.
</p>
<a name="N102FD"></a><a name="resolve-ext-uris"></a>
<h4>ext: URIs: linking to external URLs</h4>
<p>
The "<span class="codefrag">ext:</span>" scheme was created partly to demonstrate the
ease with which new schemes can be defined, and partly for practical
use. The "<span class="codefrag">ext:</span>" URIs identify nodes in <span class="codefrag">site.xml</span> below the
&lt;external-refs&gt; node. By convention, nodes here link to URLs
outside the website, and are not listed in the menu generated from
the <span class="codefrag">site.xml</span> file.
</p>
<p>
Here is a <span class="codefrag">site.xml</span> snippet illustrating "<span class="codefrag">external-refs</span>":
</p>
<pre class="code">
&lt;site&gt;
...
&lt;external-refs&gt;
&lt;mail-archive href="http://marc.theaimsgroup.com"/&gt;
&lt;xml.apache.org href="http://xml.apache.org/"&gt;
&lt;commons href="commons/"&gt;
&lt;resolver href="components/resolver/"/&gt;
&lt;/commons&gt;
&lt;/xml.apache.org&gt;
...
&lt;/external-refs&gt;
&lt;/site&gt;
</pre>
<p>
As an example, &lt;a href="ext:commons/resolver"&gt; generates the
link
<a href="http://xml.apache.org/commons/components/resolver/">http://xml.apache.org/commons/components/resolver/</a>
</p>
<p>
The general rules of <span class="codefrag">site.xml</span> and "<span class="codefrag">site:</span>" linking apply.
Specifically, the "@href" aggregation makes defining large numbers
of related URLs easy.
</p>
<a name="N10330"></a><a name="source-uris"></a>
<h4>Theory: source URIs</h4>
<p>
The "<span class="codefrag">site:</span>" URIs like "<span class="codefrag">site:todo</span>" are
examples of "<em>source</em>" URIs, in contrast to the more usual
<span class="codefrag">foo.html</span> style URIs, which we here call
"<em>destination</em>" URIs. This introduces an important concept:
that the "<em>source</em>" URI space exists and is independent of
that of the generated site. Furthermore, URIs (i.e. links) are
first-class objects, on par with XML documents, in that just as XML
content is transformed, so are the links. Within the source URI
space, we can have all sorts of interesting schemes (person: mail:
google: java: etc). These will all be translated into plain old
"<span class="codefrag">http:</span>" or relative URIs in the destination URI space,
just like exotic XML source formats are translated into plain old
HTML in the output.
</p>
<a name="N1034F"></a><a name="future-schemes"></a>
<h4>Future schemes</h4>
<p>
So far, the "<span class="codefrag">site:</span>" and "<span class="codefrag">ext:</span>" schemes are
defined. To give you some ideas on other things we'd like to
implement (and wouldd welcome help to implement) here are a few
possibilities.
</p>
<table class="ForrestTable" cellspacing="1" cellpadding="4">
<tr>
<th colspan="1" rowspan="1">Scheme</th>
<th colspan="1" rowspan="1">Example "From"</th>
<th colspan="1" rowspan="1">Example "To"</th>
<th colspan="1" rowspan="1">Description</th>
</tr>
<tr>
<td colspan="1" rowspan="1">java</td>
<td colspan="1" rowspan="1">java:org.apache.proj.SomeClass</td>
<td colspan="1" rowspan="1"><span class="codefrag">../../apidocs/org/apache/proj/SomeClass.html</span>
</td>
<td colspan="1" rowspan="1">
Links to documentation for a Java class (typically generated by
<span class="codefrag">javadoc</span>).
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">mail</td>
<td colspan="1" rowspan="1">mail::&lt;Message-Id&gt;</td>
<td colspan="1" rowspan="1"><span class="codefrag">http://marc.theaimsgroup.com?t=12345678</span>
</td>
<td colspan="1" rowspan="1">
Links to an email, identified by its <span class="codefrag">Message-Id</span>
header. Any mail archive website could be used.
</td>
</tr>
<tr>
<td colspan="1" rowspan="1">search</td>
<td colspan="1" rowspan="1">search:&lt;searchterm&gt;</td>
<td colspan="1" rowspan="1"><span class="codefrag">http://www.google.com/search?q=searchterm</span>
</td>
<td colspan="1" rowspan="1">Link to set of results from a search engine</td>
</tr>
<tr>
<td colspan="1" rowspan="1">person</td>
<td colspan="1" rowspan="1">person:JT, person:JT/blog etc</td>
<td colspan="1" rowspan="1"><span class="codefrag">mailto:jefft&lt;at&gt;apache.org</span>,
<span class="codefrag">http://www.webweavertech.com/jefft/weblog/</span>
</td>
<td colspan="1" rowspan="1">
A "<span class="codefrag">person:</span>" scheme could be used, say, to insert an
automatically obfuscated email address, or link to a URI in some
way associated with that person.
</td>
</tr>
</table>
<p>
There are even more possibilities in specific environments. In an
intranet, a "<span class="codefrag">project:XYZ</span>" scheme could identify company
project pages. In a project like <a href="http://ant.apache.org/">Apache
Ant</a>, each Task could be identified with
<span class="codefrag">task:&lt;taskname&gt;</span>, e.g.
<span class="codefrag">task:pathconvert</span>.
</p>
</div>
<a name="N103FB"></a><a name="concept"></a>
<h2 class="underlined_10">Concept</h2>
<div class="section">
<p>
The "<span class="codefrag">site:</span>" scheme and associated ideas for <span class="codefrag">site.xml</span> were
originally described in <a href="http://marc.theaimsgroup.com/?l=forrest-dev&m=103444028129281&w=2">the 'linkmap' RT
email</a> to the forrest-dev list (RT means 'random thought'; a
Cocoon invention). Only section 2 has been implemented, and there is
still significant work required to implement the full system described.
In particular, there is much scope for automating the creation of <span class="codefrag">site.xml</span>
(section 4). However, what is currently implemented gains most of the
advantages of the system.
</p>
</div>
<a name="N10412"></a><a name="implementation"></a>
<h2 class="underlined_10">Implementation</h2>
<div class="section">
<p>
Full details on the implementation of
<a href="../docs_0_80/sitemap-ref.html#linkrewriting_impl">link rewriting</a> and
<a href="../docs_0_80/sitemap-ref.html#menu_generation_impl">menu generation</a> are
available in the <a href="../docs_0_80/sitemap-ref.html">Sitemap Reference</a>
</p>
</div>
</div>
<!--+
|end content
+-->
<div class="clearboth">&nbsp;</div>
</div>
<div id="footer">
<!--+
|start bottomstrip
+-->
<div class="lastmodified">
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<div class="copyright">
Copyright &copy;
2002-2007 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
</div>
<!--+
|end bottomstrip
+-->
</div>
</body>
</html>