forrest-svn mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cross...@apache.org
Subject svn commit: r160895 [22/28] - in forrest/site/0.7: ./ docs/ docs/howto/ docs/images/ docs/plugins/
Date Mon, 11 Apr 2005 14:59:16 GMT
Added: forrest/site/0.7/docs/libre-intro.html
URL: http://svn.apache.org/viewcvs/forrest/site/0.7/docs/libre-intro.html?view=auto&rev=160895
==============================================================================
--- forrest/site/0.7/docs/libre-intro.html (added)
+++ forrest/site/0.7/docs/libre-intro.html Mon Apr 11 07:58:59 2005
@@ -0,0 +1,1069 @@
+<!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.7-dev">
+<meta name="Forrest-skin-name" content="pelt">
+<meta-data></meta-data>
+<title>Libre QuickStart (v0.7)</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:');" value="Search the site with google:" size="25" name="q" id="query" type="text">&nbsp; 
+                    <input name="Search" value="Search" type="submit">
+</form>
+</div>
+<!--+
+    |end search
+    +-->
+<!--+
+    |start Tabs
+    +-->
+<ul id="tabs">
+<li>
+<a class="base-not-selected" href="../index.html">Welcome</a>
+</li>
+<li>
+<a class="base-not-selected" href="../contrib.html">Project</a>
+</li>
+<li class="current">
+<a class="base-selected" href="../docs/index.html">0.7 Docs</a>
+</li>
+<li>
+<a class="base-not-selected" href="../docs/howto/index.html">0.7 How-To</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs">
+<a class="base-not-selected" href="..">Core</a> | <a class="base-not-selected" href="..">ForrestBot</a> | <a class="base-not-selected" href="..">ForrestBar</a>
+</div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript" language="JavaScript"><!--
+              document.write("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');">Documentation</div>
+<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
+<div class="menuitem">
+<a title="" href="../docs/index.html">Overview</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/faq.html">FAQs</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/changes.html">Changes</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/todo.html">Todo</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/your-project.html">Using Forrest</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/validation.html">XML Validation</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/linking.html">Menus and Linking</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/searching.html">Searching</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/skins.html">Default Skins</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/skin-package.html">Skin Packages</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/plugins/usingPlugins.html">Plugins</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/views.html">Views-dev</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/forrest-contract.html">Our Contract</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/compliance.html">Standards Compliance</a>
+</div>
+<div onclick="SwitchMenu('menu_1.1.15', '../skin/')" id="menu_1.1.15Title" class="menutitle">Advanced Topics</div>
+<div id="menu_1.1.15" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/build.html">Building Forrest</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/catalog.html">Using DTD Catalogs</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/sitemap-ref.html">Sitemap Reference</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/project-sitemap.html">Project sitemap</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/plugins/pluginInfrastructure.html">Plugin Infrastructure</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/cap.html">Sourcetype Action</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.16', '../skin/')" id="menu_1.1.16Title" class="menutitle">Other versions</div>
+<div id="menu_1.1.16" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs.html">Overview</a>
+</div>
+<div class="menuitem">
+<a title="" href="http://forrest.apache.org/docs/../0.8/">0.8-dev</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/index.html">0.7 (current)</a>
+</div>
+<div class="menuitem">
+<a title="" href="http://forrest.apache.org/docs/../0.6/">0.6</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.17', '../skin/')" id="menu_1.1.17Title" class="menutitle">Upgrading</div>
+<div id="menu_1.1.17" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/upgrading_07.html">Upgrading to 0.7</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/upgrading_06.html">Upgrading to 0.6</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.18', '../skin/')" id="menu_1.1.18Title" class="menutitle">SubProjects</div>
+<div id="menu_1.1.18" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/forrestbar.html">ForrestBar</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/forrestbot.html">Forrestbot</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/forrestbot-web-interface.html">Forrestbot Webapp</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.19', '../skin/')" id="menu_1.1.19Title" class="menutitle">Reference docs</div>
+<div id="menu_1.1.19" class="menuitemgroup">
+<div onclick="SwitchMenu('menu_1.1.19.1', '../skin/')" id="menu_1.1.19.1Title" class="menutitle">DTD documentation</div>
+<div id="menu_1.1.19.1" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/dtd-docs.html">Overview</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/document-v20.dtdx.html">document-v20</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/howto-v20.dtdx.html">howto-v20</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/faq-v20.dtdx.html">faq-v20</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/document-v13.dtdx.html">document-v13</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/howto-v13.dtdx.html">howto-v13</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/faq-v13.dtdx.html">faq-v13</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.19.2', '../skin/')" id="menu_1.1.19.2Title" class="menutitle">Doc samples</div>
+<div id="menu_1.1.19.2" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/document-v13.html">document-v13</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/document-v20.html">document-v20</a>
+</div>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_selected_1.1.20', '../skin/')" id="menu_selected_1.1.20Title" class="menutitle" style="background-image: url('../skin/images/chapter_open.gif');">Older Docs</div>
+<div id="menu_selected_1.1.20" class="selectedmenuitemgroup" style="display: block;">
+<div class="menuitem">
+<a title="" href="../docs/primer.html">Forrest Primer</a>
+</div>
+<div class="menupage">
+<div class="menupagetitle">Libre</div>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/dreams.html">Dream list</a>
+</div>
+</div>
+</div>
+<div id="credit">
+<hr>
+    This is documentation for current release v0.7
+   (<a href="http://forrest.apache.org/docs.html">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>
+<!--+
+    |end Menu
+    +-->
+<!--+
+    |start content
+    +-->
+<div id="content">
+<div title="Portable Document Format" class="pdflink">
+<a class="dida" href="libre-intro.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>Libre QuickStart</h1>
+<div class="abstract">This document is the current full documentation on the "libre"
+      generator that was implanted into xml-forrest.</div>
+<div id="motd-area">
+    This is documentation for current release v0.7
+   (<a href="http://forrest.apache.org/docs.html">More</a> ...)</div>
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#Intro">Intro</a>
+</li>
+<li>
+<a href="#Using+Libre+now+%280.0+alfa%29">Using Libre now (0.0 alfa)</a>
+<ul class="minitoc">
+<li>
+<a href="#Generated+Output">Generated Output</a>
+</li>
+<li>
+<a href="#Contents">libre.xml Contents</a>
+<ul class="minitoc">
+<li>
+<a href="#Building+Blocks">Building Blocks</a>
+</li>
+</ul>
+</li>
+<li>
+<a href="#Important+Side+Effects">Important Side Effects</a>
+<ul class="minitoc">
+<li>
+<a href="#No+libre.xml">No libre.xml</a>
+</li>
+<li>
+<a href="#No+Duplicates">No Duplicates</a>
+</li>
+</ul>
+</li>
+<li>
+<a href="#Example+Constructs">Example Constructs</a>
+<ul class="minitoc">
+<li>
+<a href="#Sorting+your+files+or+your+menu+entries%3F">Sorting your files or your menu entries?</a>
+</li>
+<li>
+<a href="#Naming+your+files+or+asking+them+their+name%3F">Naming your files or asking them their name?</a>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li>
+<a href="#Next+Libre+%280.1%29">Next Libre (0.1)</a>
+<ul class="minitoc">
+<li>
+<a href="#Itches">Itches</a>
+</li>
+<li>
+<a href="#Upcoming+Features">Upcoming Features</a>
+<ul class="minitoc">
+<li>
+<a href="#Combinations+of+filter+logic">Combinations of filter logic</a>
+</li>
+<li>
+<a href="#Separating+property-retrieval+from+formatting+and%0A++++++++++++testing">Separating property-retrieval from formatting and
+            testing</a>
+</li>
+<li>
+<a href="#Replace+the+introspection+with+semantically+richer+named%0A++++++++++++properties+to+read.">Replace the introspection with semantically richer named
+            properties to read.</a>
+</li>
+</ul>
+</li>
+<li>
+<a href="#Avalonising">Avalonising</a>
+</li>
+<li>
+<a href="#Unresolved+Discussions">Unresolved Discussions</a>
+</li>
+</ul>
+</li>
+<li>
+<a href="#Libre+Design">Libre Design</a>
+<ul class="minitoc">
+<li>
+<a href="#Dependencies">Dependencies</a>
+</li>
+</ul>
+</li>
+</ul>
+</div> 
+    
+<a name="N10010"></a><a name="Intro"></a>
+<h2 class="underlined_10">Intro</h2>
+<div class="section">
+<div class="frame warning">
+<div class="label">Warning</div>
+<div class="content">This document is still relevant for ideas and potential
+        solutions. However, the experimental code for Libre was removed from
+        the scratchpad on 2003-04-18 during spring cleaning. If you want to
+        resurrect it, then use the cvs tag "before_libre_departure".
+      </div>
+</div>
+<p>The libre idea was born out of the cocoon book.xml itch. The actual
+        need to start scratching was introduced by the higher volume of
+        book.xml-editing-work that came along with the cocoon documentation and
+        xml-forrest efforts.</p>
+<p>The single idea behind it in fact is trying to automatically generate
+        part of the navigation tree which is held now in the different book.xml 's.
+        This automation effort however is held back by the lack of meta-data you can
+        extract from the filesystem itself. This is why the libre approach still
+        requires you to add this extra metadata using some libre.xml file. This
+        libre.xml however has the following main advantages over the book.xml:</p>
+<ul> 
+        
+<li>The settings are 'inherited' down the directory tree, so you do not
+          need a libre.xml on each directory level. You only need it to change
+          the subdir traversing strategy from its parent dir.</li> 
+        
+<li>It combines some 'filesystem-introspection'-like declarations
+          that are used in run-time filtering, sorting and attributing decisions.
+          Introspection strategies are currently based on either (1) reading properties
+          of the java.io.File object at hand, or (2) executing xpath expressions on the
+          pointed at XML file. </li> 
+      
+</ul>
+</div> 
+    
+<a name="N10029"></a><a name="Using+Libre+now+%280.0+alfa%29"></a>
+<h2 class="underlined_10">Using Libre now (0.0 alfa)</h2>
+<div class="section">
+<div class="frame warning">
+<div class="label">Warning</div>
+<div class="content">Disclaimer: most of what you read below is 'how it was intended'
+        . To what extent that matches the actual execution process is largely dependent
+        on my programming skills and thoroughness of testing. <br>In other words:
+        don't expect a thing unless you've seen it work. (at this time)</div>
+</div>
+<a name="N10034"></a><a name="Generated+Output"></a>
+<h3 class="underlined_5">Generated Output</h3>
+<p>The XML output that comes out of the generator largely follows this
+          example:</p>
+<pre class="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;collection xmlns="http://outerx.org/yer/hierarchy/0.1"&gt;
+  &lt;collection label="content"&gt;
+    &lt;collection label="xdocs"&gt;
+      &lt;item label="dreams.xml" 
+               href="src\documentation\content\xdocs\dreams.xml" 
+               title="Forrest dream list"/&gt;
+      &lt;item label="faq.xml" 
+               href="src\documentation\content\xdocs\faq.xml"/&gt;
+      &lt;item label="book.xml" 
+               href="src\documentation\content\xdocs\book.xml"/&gt;
+      &lt;item label="contrib.xml" 
+               href="src\documentation\content\xdocs\contrib.xml" 
+               title="Contribution to Forrest"/&gt;
+      &lt;item label="mail-archives.xml" 
+               href="src\documentation\content\xdocs\mail-archives.xml" 
+               title="Mail Archives"/&gt;
+      &lt;item label="mail-lists.xml" 
+               href="src\documentation\content\xdocs\mail-lists.xml" 
+               title="Mailing Lists"/&gt;
+      &lt;item label="license.xml" 
+               href="src\documentation\content\xdocs\license.xml" 
+               title="The Apache Software License"/&gt;
+      &lt;item label="index.xml" 
+               href="src\documentation\content\xdocs\index.xml" 
+               title="Welcome to Forrest"/&gt;
+      &lt;item label="who.xml" 
+               href="src\documentation\content\xdocs\who.xml" 
+               title="Who we are"/&gt;
+    &lt;/collection&gt;
+  &lt;/collection&gt;
+&lt;/collection&gt;</pre>
+<p>And it's not getting any harder in fact: only 2 elements,
+          <span class="codefrag">&lt;collection&gt;</span> and <span class="codefrag">&lt;item&gt;</span> and that should
+          do. The first maps to a menu-group in the navigation, guess what the second
+          maps to?</p>
+<p>The number and value (and its meaning) of the attributes on these
+          elements are specified in the libre.xml file.</p>
+<a name="N1004E"></a><a name="Contents"></a>
+<h3 class="underlined_5">libre.xml Contents</h3>
+<p>That libre.xml file follows the
+          src/resources/schema/dtd/libre-v10.dtd. In fact the current release allows for
+          some extra elements (I'll explain where) and some unrestricted attribute CDATA
+          types that cause some extensible xml output resp. some java-introspection to be
+          triggered. So basically the DTD will be limiting you more than the runtime
+          interpretation. (future versions will try to narrow this down seriously, main
+          reason is that a more elaborate DTD allows for more XML-editor assistance in
+          editing the files.)</p>
+<p>The dtd:</p>
+<pre class="code">&lt;!ELEMENT libre (entry | auto)*&gt;
+&lt;!ELEMENT entry (label?, href?)&gt;
+&lt;!ATTLIST entry
+  location CDATA #REQUIRED
+&gt;
+&lt;!ELEMENT auto (filter?, sorter?, label?, href?)&gt;
+&lt;!ELEMENT label (xpath | property)&gt;
+&lt;!ELEMENT href (xpath | property)&gt;
+&lt;!ELEMENT filter (xpath | property)&gt;
+&lt;!ATTLIST filter
+  logic (inverse | normal) "normal"
+  clear (yes | no) "no"
+&gt;
+&lt;!ELEMENT sorter (xpath | property)&gt;
+&lt;!ATTLIST sorter
+  order (ascending | descending) "ascending"
+  clear (yes | no) "no"
+&gt;
+&lt;!ELEMENT xpath EMPTY&gt;
+&lt;!ATTLIST xpath
+  expression CDATA #REQUIRED
+&gt;
+&lt;!ELEMENT property EMPTY&gt;
+&lt;!ATTLIST property
+  name CDATA #REQUIRED
+  mask CDATA #IMPLIED
+  regex CDATA #IMPLIED
+  substitute CDATA #IMPLIED
+&gt;</pre>
+<a name="N10060"></a><a name="Building+Blocks"></a>
+<h4>Building Blocks</h4>
+<p>The following elements get the following meaning when interpreted
+            by the LibreConfigBuilder</p>
+<pre class="code">&lt;libre xmlns="http://outerx.org/libre/config/0.1"&gt;</pre>
+<ul> 
+            
+<li>This is one of those libre.xml files, that will configure how
+              items are filteres, sorted and attributed</li> 
+          
+</ul>
+<pre class="code">&lt;entry location="[relative location path]" /&gt;</pre>
+<ul> 
+            
+<li>Allows to manually sort out specific files or directories.</li>
+            
+            
+<li>Comparable to standard book.xml behaviour, except for the fact
+              that </li> 
+          
+<ul> 
+            
+<li>libre doesn't yet support external hrefs (should be easy
+              though)</li> 
+            
+<li>there is no difference between <span class="codefrag">&lt;menu&gt;</span> and
+              <span class="codefrag">&lt;menu-item&gt;</span>, there just is <span class="codefrag">&lt;entry&gt;</span>. It
+              will become a <span class="codefrag">&lt;collection&gt;</span> or <span class="codefrag">&lt;item&gt;</span> in
+              the output based on the fact if the location points to a directory resp. a
+              file.</li> 
+            
+<li>For locations that point to a filter it doesn't make sense, but
+              when it points to a directory it is nested <span class="codefrag">&lt;filter&gt;</span> and
+              <span class="codefrag">&lt;sort&gt;</span> elements get inherited down to the next level. </li> 
+          
+</ul> 
+          
+</ul>
+<div class="frame fixme">
+<div class="label">Fixme (mpo)</div>
+<div class="content">This last remarks actually means (1) I need to
+            update the DTD to reflect this and (2) check the code for actually doing
+            this.</div>
+</div>
+<pre class="code">&lt;auto&gt;</pre>
+<ul> 
+            
+<li>Automatically generates more <span class="codefrag">&lt;collection&gt;</span>
+              and <span class="codefrag">&lt;item&gt;</span> elements in the output, based on the
+              specifications of the nested elements: <span class="codefrag">&lt;filter&gt;</span> (which
+              resources?) and <span class="codefrag">&lt;sort&gt;</span> (in which order?).</li> 
+          
+</ul>
+<pre class="code">&lt;filter logic="inverse" clear="no"&gt;</pre>
+<ul> 
+            
+<li>This element wraps a so-called AttributeReader (there are
+              currently two of them: <span class="codefrag">&lt;xpath&gt;</span> and
+              <span class="codefrag">&lt;property&gt;</span>)</li> 
+            
+<li>The AttributeReader is going to specify which
+              information-element is going to be retrieved from the file or directory it is
+              pointing at. Depending on which one is used this wrapping filter will test for
+              presence or regex match of the resource being read. Based on the outcome of
+              this test (true or false) the passed file will be accepted or not in the
+              list.</li> 
+            
+<li>This wrapping filter element allows to inverse the
+              acceptance-logic (accept what normally should be rejected and vice versa).</li>
+            
+            
+<li>Using the <span class="codefrag">clear="yes"</span> attribute stops the
+              inheritance of the used filter strategy from the parent directory. Instead the
+              default filter strategy (which is to accept all files) is slided in at this
+              level.</li> 
+          
+</ul>
+<pre class="code">&lt;sort order="descending" clear="no"&gt;</pre>
+<ul> 
+            
+<li>This element wraps a so called AttributeReader (there are
+              currently two of them: <span class="codefrag">&lt;xpath&gt;</span> and
+              <span class="codefrag">&lt;property&gt;</span>).</li> 
+            
+<li>The AttributeReader is going to specify which
+              information-element is going to be retrieved from the file or directory it is
+              pointing at. This information element will be considered to be a simple
+              Key-String and <span class="codefrag">&lt;collection&gt;</span> and <span class="codefrag">&lt;item&gt;</span>
+              elements in the output will appear in the order defined by the alphabetic
+              sorting of these keys.</li> 
+            
+<li>This wrapping sort element allows to reverse the order.
+              (z-&gt;a instead of a-&gt;z)</li> 
+            
+<li>Using the <span class="codefrag">clear="yes"</span> attribute stops the
+              inheritance of the used sort strategy from the parent directory. Instead the
+              default sort strategy (which is to use default filesystem sorting, alphabetic
+              on filename) is slided in at this level.</li> 
+          
+</ul>
+<pre class="code">&lt;label&gt;, &lt;href&gt;, &lt;YOURTAG&gt;.... {AttributeDefinitions}</pre>
+<ul> 
+            
+<li>The remainder of the elements inside the
+              <span class="codefrag">&lt;auto&gt;</span> tag specify the attributes that need to be applied to
+              the generated <span class="codefrag">&lt;collection&gt;</span> and <span class="codefrag">&lt;item&gt;</span>
+              elements in the output: <span class="codefrag">&lt;item label=".." href=".." YOURTAG=".."
+              /&gt;</span>
+</li> 
+            
+<li>There is currently only support for adding attributes, not
+              nested elements.</li> 
+            
+<li>These elements all wrap a so called AttributeReader (there are
+              currently two of them: &lt;xpath&gt; and &lt;property&gt;)</li> 
+            
+<li>In these cases the wrapped AttributeReader is going to specify
+              which information-element is going to be retrieved from the file or directory
+              it is pointing at. This information element will be considered to be a simple
+              String-value that gets slided in as the corresponding output attribute
+              value.</li> 
+          
+</ul>
+<pre class="code">&lt;xpath expression="/document/header/title/text()"&gt;</pre>
+<ul> 
+            
+<li>This element specifies an xpath AttributeReader to use inside
+              <span class="codefrag">&lt;filter&gt;</span>, <span class="codefrag">&lt;sort&gt;</span> or
+              {AttributeDefinitions}.</li> 
+            
+<li>It allows to specify an xpath expression that should result in
+              one single text node to be returned when applied to the root node of the xml
+              file at the location of any given entry. The contents of this text-node is the
+              string value to sort (<span class="codefrag">&lt;sort&gt;</span> usage) or to fill in the
+              specified attribute (<span class="codefrag">&lt;label&gt;</span>, <span class="codefrag">&lt;href&gt;</span>...
+              use). When inside a <span class="codefrag">&lt;filter&gt;</span>: the presence of the node
+              results in passing the test.</li> 
+          
+</ul>
+<div class="frame warning">
+<div class="label">Warning</div>
+<div class="content">This currently breaks for non xml (<span class="codefrag">*.gif</span>)
+            files, so get your filter right please, and in the mean time: sorry for not
+            being able to use it in the filter yet <span class="codefrag">:-(</span>.</div>
+</div>
+<pre class="code">&lt;property name="path" regex="(\.[\\/])*(.*)" substitute="$2"/&gt;
+&lt;property name="name"  mask="CVS"/&gt;</pre>
+<ul> 
+            
+<li>This element specifies an xpath AttributeReader to use inside
+              <span class="codefrag">&lt;filter&gt;</span>, <span class="codefrag">&lt;sort&gt;</span> or
+              {AttributeDefinitions}.</li> 
+            
+<li>It allows to specify a JavaBean-like property to read (this
+              introspection behavior will probably not survive the future release) on the
+              file at the 'location' of any given entry. The (object-)value of this property
+              is automatically converted to a String (toString()) that becomes the value to
+              sort (<span class="codefrag">&lt;sort&gt;</span> usage) or to fill in the specified attribute
+              (<span class="codefrag">&lt;label&gt;</span>, <span class="codefrag">&lt;href&gt;</span>... use). When inside a
+              <span class="codefrag">&lt;filter&gt;</span>, the test passes if the read property is not null
+              or "".</li> 
+            
+<li>Furthermore this element allows to express more elaborate
+              true-false tests (filter use) or regex substitution (other use)
+              attributes:</li> 
+          
+<ul> 
+            
+<li>combination of @regex with @substitute accounts for a
+              s/{regex}/{substitute}/ kind of operation on the string property.</li> 
+            
+<li>while @mask or @regex by their own (filter use) allow for a
+              glob-mask or regex test to be applied on the read property.</li> 
+          
+</ul> 
+          
+</ul>
+<a name="N1016C"></a><a name="Important+Side+Effects"></a>
+<h3 class="underlined_5">Important Side Effects</h3>
+<p>There are some things that libre is doing that you should be aware of.</p>
+<a name="N10175"></a><a name="No+libre.xml"></a>
+<h4>No libre.xml</h4>
+<p>When using an <span class="codefrag">&lt;auto&gt; </span>section, the filter will
+            NEVER accept the <span class="codefrag">libre.xml</span> file to be in the generated output. You
+            can however include a manual <span class="codefrag">&lt;entry&gt;</span> to point to the
+            <span class="codefrag">libre.xml</span> file if needed.</p>
+<a name="N1018B"></a><a name="No+Duplicates"></a>
+<h4>No Duplicates</h4>
+<p>You can combine multiple <span class="codefrag">&lt;entry&gt;</span> and
+            <span class="codefrag">&lt;auto&gt;</span> elements after each other. The system will make sure
+            that the resulting list of <span class="codefrag">&lt;collection&gt;</span> and
+            <span class="codefrag">&lt;item&gt;</span> will not contain duplicates. So the filters in
+            <span class="codefrag">&lt;auto&gt;</span> sections lower down the <span class="codefrag">libre.xml</span> file
+            can include already accepted files or directories, they will only show up once
+            in the output.</p>
+<a name="N101A8"></a><a name="Example+Constructs"></a>
+<h3 class="underlined_5">Example Constructs</h3>
+<p>Adding sorting and filtering to the filesystem with libre becomes a
+          subtle play with editable filesystem properties, smart XML content and
+          <span class="codefrag">libre.xml</span> configs. This should be considered as the 'extended'
+          contract between the following roles in the documentation system: the one
+          choosing (or creating) the DTDs, the one applying those to create content and
+          give the resulting files a name, the one that sets up the directories to store
+          those files and writes the <span class="codefrag">libre.xml</span> files.</p>
+<a name="N101B7"></a><a name="Sorting+your+files+or+your+menu+entries%3F"></a>
+<h4>Sorting your files or your menu entries?</h4>
+<p>In every case the very pragmatic approach can become something
+            like this:</p>
+<pre class="code">+ content
+  + xdocs
+    + 010Topic
+      + 010Foo
+      + 111Bar
+    + 050Aspect
+    + NotInList</pre>
+<p>In combination with something that lives by the introduced
+            alphabetic order, but yet hides the ugly number-prefixes:</p>
+<pre class="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;!DOCTYPE libre PUBLIC "-//Outerthought//DTD Libre Configuration V0.1//EN" "libre-v01.dtd" &gt;
+&lt;libre xmlns="http://outerx.org/libre/config/0.1"&gt;
+  &lt;auto&gt;
+    &lt;filter logic="normal"&gt;
+      &lt;property name="name" regex="\d{3}(.*)"/&gt;
+    &lt;/filter&gt;
+    &lt;label&gt;
+      &lt;property name="name" regex="\d{3}(.*)" substitute="$1"/&gt;
+    &lt;/label&gt;
+  &lt;/auto&gt;
+&lt;/libre&gt;</pre>
+<p>Will produce an automatic list of entries (collections and items
+            in the output) that </p>
+<ul> 
+            
+<li>
+<span class="codefrag">&lt;filter&gt;</span>: only resources which name starts
+              with a 3-digit pattern</li> 
+            
+<li>No <span class="codefrag">&lt;sort&gt;</span>: in their natural filesystem order
+              assured by the digit-prefix</li> 
+            
+<li>
+<span class="codefrag">&lt;label&gt;</span>: hold a label attribute that strips
+              of the ugly number prefix</li> 
+          
+</ul>
+<p>Of course the advantage over book.xml only comes when more menu
+            items should be easily slided in later on, and/or deeply nested directory
+            structures can all benefit from this same filenaming/sorting strategy.</p>
+<a name="N101E5"></a><a name="Naming+your+files+or+asking+them+their+name%3F"></a>
+<h4>Naming your files or asking them their name?</h4>
+<p>Given the poor expressiveness of the filesystem, the labels that
+            need to show up in the menu can hardly remain the filenames they are now
+            (specially if we're adding these ugly number prefixes). Instead we can sign a
+            contract with the content writer to also provide the navigation system with a
+            sensible name for his entry using XML metadata that the system will pick up
+            using an xpath expression.</p>
+<pre class="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;!DOCTYPE libre PUBLIC "-//Outerthought//DTD Libre Configuration V0.1//EN" "libre-v01.dtd" &gt;
+&lt;libre xmlns="http://outerx.org/libre/config/0.1"&gt;
+  &lt;entry location="dreams.xml" &gt;
+      &lt;label&gt;
+         &lt;xpath expression="/document/header/title/text()"/&gt;
+      &lt;/label&gt;
+  &lt;/entry&gt;
+  &lt;auto&gt;
+    &lt;filter&gt;
+      &lt;property name="name" regex="\.xml$" /&gt;
+    &lt;/filter&gt;
+    &lt;sorter&gt;
+         &lt;xpath expression="/document/header/title/text()"/&gt;
+    &lt;/sorter&gt;
+      &lt;label&gt;
+          &lt;xpath expression="/document/header/title/text()"/&gt;
+      &lt;/label&gt;
+  &lt;/auto&gt;
+&lt;/libre&gt;</pre>
+</div> 
+    
+<a name="N101F5"></a><a name="Next+Libre+%280.1%29"></a>
+<h2 class="underlined_10">Next Libre (0.1)</h2>
+<div class="section">
+<div class="frame note">
+<div class="label">Note</div>
+<div class="content">Next libre is in fact largely in your hands... just drop
+        the forrest-dev <a href="http://forrest.apache.org/mail-lists.html">mail list</a>
+        a line, and see what happens...</div>
+</div>
+<a name="N10202"></a><a name="Itches"></a>
+<h3 class="underlined_5">Itches</h3>
+<p>There is quite a number of fast code patches that can/need to
+          happen</p>
+<ul> 
+          
+<li>package renaming and restructuring (ideas welcome, but not top of
+            mind)</li> 
+          
+<li>on same level: possible xmlns and/or elms/atts renaming on the
+            generated output and the libre.xml file</li> 
+          
+<li>when compiling you currently get 4 stupid deprecation warnings
+            that should be removed, in fact:</li> 
+          
+<li>LibreConfigHelper has a silly test in it to switch to own parser
+            and resolver if there is no avalon component manager in the neighborhoud
+            (historical reason is the testing outside cocoon with the command line util,
+            which should become some kind of avalon based junit task: if you have a clue
+            how to start this, throw it at us please.)</li> 
+          
+<li>xpath property reader needs to survive working on a non-xml
+            document (by returning nothing rather then breaking on the exception)</li> 
+          
+<li>general robustness and resilience towards
+            mis-configurations</li> 
+          
+<li>filestreams need to get closed and avalon resources need to be
+            released properly</li> 
+          
+<li>caching at the level of the generator needs to be set up</li> 
+          
+<li>in fact general performance has not been subject to loads of
+            early optimizations :-P</li> 
+        
+</ul>
+<a name="N1022A"></a><a name="Upcoming+Features"></a>
+<h3 class="underlined_5">Upcoming Features</h3>
+<p>More importantly however there is a major set of new features that
+          is waiting to get in there. It all boils down in fact to having a more
+          expressive libre.xml file... some of the thoughts:</p>
+<a name="N10233"></a><a name="Combinations+of+filter+logic"></a>
+<h4>Combinations of filter logic</h4>
+<p>Some itching stuff:</p>
+<ul> 
+            
+<li>logic="inverse" on the &lt;filter&gt; element seems a bit
+              awkward</li> 
+            
+<li>
+<em>n</em>th degree of slickness in the regexes will only bring
+              us so far, combinatory filter logic seems to be the way to go...:</li> 
+          
+</ul>
+<pre class="code">&lt;!ELEMENT filter (xpath | property | and | or | not)&gt;
+&lt;!ELEMENT not    (xpath | property | and | or | not)&gt;
+&lt;!ELEMENT and    (xpath | property | and | or | not)+&gt;
+&lt;!ELEMENT or     (xpath | property | and | or | not)+&gt;</pre>
+<p>So we can make up some richer:</p>
+<pre class="code">
+&lt;filter&gt;
+  &lt;not&gt;
+      &lt;and&gt;
+      &lt;xpath .../&gt;
+      &lt;not&gt;&lt;property ..../&gt;&lt;/not&gt;
+      &lt;or&gt;
+         ...
+      &lt;/or&gt;
+    &lt;/and&gt;
+  &lt;/not&gt;
+&lt;/filter&gt;
+    </pre>
+<a name="N10253"></a><a name="Separating+property-retrieval+from+formatting+and%0A++++++++++++testing"></a>
+<h4>Separating property-retrieval from formatting and
+            testing</h4>
+<p>Playing around with the attributes in
+            <span class="codefrag">&lt;property&gt;</span>:</p>
+<ul> 
+            
+<li>poses hard to explain combinatory effects (@regex with
+              @substitute vs without, @regex can't be combined with @mask, different
+              behaviour inside &lt;filter&gt;== test or &lt;sort&gt;==formatting)</li> 
+            
+<li>which in fact are hard (if not impossible) to rule out by
+              modifying the DTD</li> 
+            
+<li>makes you wonder why it's not available on the &lt;xpath&gt;
+              ?</li> 
+          
+</ul>
+<p>So maybe an example more down the lines of the following would be
+            easier to use:</p>
+<pre class="code">&lt;label&gt;&lt;!-- same applies for the sort context --&gt;
+  &lt;regexformatter exp="..." substitute="...."&gt;
+    &lt;property name="absoluteLocation" /&gt;
+  &lt;/regexformatter&gt;
+&lt;/label&gt;</pre>
+<p>Allowing the formatter to be used around the xpath reader as well.
+            And opening up the possibility to maybe format other stuff than Strings:
+            <span class="codefrag">&lt;dateformat format="dd/mmm/yy"&gt; </span>
+</p>
+<p>It would also clearly distinguish the semantical difference of
+            applying a test in the <span class="codefrag">&lt;filter&gt;</span> context:</p>
+<pre class="code">&lt;filter&gt;
+  &lt;regextest match="..."&gt;
+    &lt;property ... /&gt;
+  &lt;/regextest&gt;
+&lt;/filter&gt;</pre>
+<p>And more logically introduce other tests like <span class="codefrag">&lt;globtest
+            match="..."&gt;</span> or <span class="codefrag">&lt;availabletest&gt;</span> or...</p>
+<a name="N1028B"></a><a name="Replace+the+introspection+with+semantically+richer+named%0A++++++++++++properties+to+read."></a>
+<h4>Replace the introspection with semantically richer named
+            properties to read.</h4>
+<p>Currently the <span class="codefrag">&lt;property
+            name="someJavaBeanProp"&gt;</span> is applied in a java introspection for the
+            <span class="codefrag">getSomeJavaBeanProp()</span> on the <span class="codefrag">java.io.File</span> object that
+            is actually representing the node in the hierarchy at any given time. The DTD
+            declares the attribute as of type CDATA. These decisions however:</p>
+<ul> 
+            
+<li>lead to a lesser user guidance for the libre.xml writer using
+              an XML (and DTD) savvy editor </li> 
+            
+<li>leads to assuming the <span class="codefrag">libre.xml</span> editor has access
+              to and knows how to interpret jdk javadoc</li> 
+            
+<li>leads to poor semantical support and thus more possible RUNTIME
+              errors for those just filling in some valid CDATA value that is not mapping any
+              getter.</li> 
+            
+<li>leads to confusion for all, since who actually knows the subtle
+              difference between all the get*Path methods on java.io.File?</li> 
+          
+</ul>
+<p>So the big idea here would be to go for an upfront declared list
+            of sensible and clearly defined properties that we would like to
+            read... Today's ideas about that list:</p>
+<ul> 
+            
+<li>name</li> 
+            
+<li>isDirectory (isCollection?)</li> 
+            
+<li>abs and relPath (or abs/rel Location? why would we need
+              abs?)</li> 
+            
+<li>canRead</li> 
+            
+<li>canWrite</li> 
+            
+<li>lastModified</li> 
+            
+<li>length</li> 
+          
+</ul>
+<p>The DTD would then list the possible attributeValues.</p>
+<a name="N102CF"></a><a name="Avalonising"></a>
+<h3 class="underlined_5">Avalonising</h3>
+<p>There are a number of perceived opportunities in taking up a
+          stronger dependecy towards Avalon. Some of the possibilities become clear when
+          looking into the current design...</p>
+<ul> 
+          
+<li>Currently the EntryFactory is a abstract factory, the factory
+            part could be done by an Avalon Component manager. Which would also allow the
+            EntryFactory to become a cleaner component interface then it is now.</li> 
+          
+<li>Some investigation/feedback on the current hacker-way of using
+            the Composables could be nice</li> 
+          
+<li>The current cli part in the package is only there for testing
+            (avoiding the cocoon webapp cycle when developing/testing) it should be
+            replaced by a more formal test class that actually would take up the role
+            (probably delegate to ECM or the like) of the componentmanager to give the
+            HierarchyReader the (avalon) environment he needs.</li> 
+        
+</ul>
+<a name="N102E5"></a><a name="Unresolved+Discussions"></a>
+<h3 class="underlined_5">Unresolved Discussions</h3>
+<ul> 
+          
+<li>do we need support for nested elements inside
+            <span class="codefrag">&lt;item&gt;</span> output (retrieved by e.g. xpath expressions)?</li> 
+          
+<li>do we need an extra <span class="codefrag">&lt;constant&gt;</span> like
+            attributereader that would allow like book.xml to add fixed values for
+            expressed attributes</li> 
+          
+<li>clear set out inheritance rules, just doing 'something' now
+            :-(</li> 
+          
+<li>votes on needed file properties to replace the current (limiting
+            and semantically poor) Java-introspection</li> 
+        
+</ul>
+</div> 
+    
+<a name="N10302"></a><a name="Libre+Design"></a>
+<h2 class="underlined_10">Libre Design</h2>
+<div class="section">
+<p> So why is that silly 'yer' package name in there? Yer originally was
+        some all-hierarchy-structures to SAX event thing, and since some of that is in
+        here as well, we kind of picked that idea up out of the dustbin.</p>
+<p>So reflecting the current packagenames we kind of have these sets of
+        responsibilities</p>
+<ul> 
+        
+<li>
+<em>*.yer.hierarchy</em>: describe in a formal way how hierarchies
+          should be built up in order to have them dumped to XML using the
+          HierarchyReader.</li> 
+        
+<li>
+<em>*.yer.use.cocoon</em>:house of the generator. It basically just
+          gets a reader and subscribes the next ContentHandler in the cocoon pipeline to
+          the HierarchyReader that it is using.</li> 
+        
+<li>
+<em>*.yer.impl</em>: hold the different implementations of the
+          *.yer.hierarchy API </li> 
+        
+<li>
+<em>*.yer.impl.fs</em>: (only current impl) Build the described
+          filesystem oriented implementation of the hierarchy. It is using the libre
+          configuration strategy.</li> 
+        
+<li>
+<em>*.yer.libre</em>: provide a generic strategy for adding
+          filtering, sorting and attributing information to a hierarchy through the use
+          of XML config files (in an XML configuration/declarative manner)</li> 
+      
+</ul>
+<p>... hope this somewhat clarifies how things have been setup for
+        now.</p>
+<a name="N1032D"></a><a name="Dependencies"></a>
+<h3 class="underlined_5">Dependencies</h3>
+<ul> 
+          
+<li>The regex stuff inside libre adds the dependency upon the oro
+            package. Basically I failed to find substitution support inside the regex
+            package (which is already in cocoon) in a timeframe comparable to just get on
+            with this using oro.</li> 
+          
+<li>The HierarchyGenerator is the first one in the chain (and the
+            last in fact) that actually needs the cocoon package (at least it was intended
+            this way, could be that there are some glitches on this statement)</li> 
+          
+<li>There is a sort of false dependency on Avalon right now (some
+            Composables in there, no real container stuff though). As expressed higher
+            there are some plans to stronger benefit from this dependency. </li> 
+        
+</ul>
+</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-2005 The Apache Software Foundation.</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>

Propchange: forrest/site/0.7/docs/libre-intro.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/site/0.7/docs/libre-intro.pdf
URL: http://svn.apache.org/viewcvs/forrest/site/0.7/docs/libre-intro.pdf?view=auto&rev=160895
==============================================================================
Binary file - no diff available.

Propchange: forrest/site/0.7/docs/libre-intro.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: forrest/site/0.7/docs/linking.html
URL: http://svn.apache.org/viewcvs/forrest/site/0.7/docs/linking.html?view=auto&rev=160895
==============================================================================
--- forrest/site/0.7/docs/linking.html (added)
+++ forrest/site/0.7/docs/linking.html Mon Apr 11 07:58:59 2005
@@ -0,0 +1,963 @@
+<!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.7-dev">
+<meta name="Forrest-skin-name" content="pelt">
+<meta-data></meta-data>
+<title>Menus and Linking (v0.7)</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:');" value="Search the site with google:" size="25" name="q" id="query" type="text">&nbsp; 
+                    <input name="Search" value="Search" type="submit">
+</form>
+</div>
+<!--+
+    |end search
+    +-->
+<!--+
+    |start Tabs
+    +-->
+<ul id="tabs">
+<li>
+<a class="base-not-selected" href="../index.html">Welcome</a>
+</li>
+<li>
+<a class="base-not-selected" href="../contrib.html">Project</a>
+</li>
+<li class="current">
+<a class="base-selected" href="../docs/index.html">0.7 Docs</a>
+</li>
+<li>
+<a class="base-not-selected" href="../docs/howto/index.html">0.7 How-To</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs">
+<a class="base-not-selected" href="..">Core</a> | <a class="base-not-selected" href="..">ForrestBot</a> | <a class="base-not-selected" href="..">ForrestBar</a>
+</div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript" language="JavaScript"><!--
+              document.write("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');">Documentation</div>
+<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
+<div class="menuitem">
+<a title="" href="../docs/index.html">Overview</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/faq.html">FAQs</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/changes.html">Changes</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/todo.html">Todo</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/your-project.html">Using Forrest</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/validation.html">XML Validation</a>
+</div>
+<div class="menupage">
+<div class="menupagetitle">Menus and Linking</div>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/searching.html">Searching</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/skins.html">Default Skins</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/skin-package.html">Skin Packages</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/plugins/usingPlugins.html">Plugins</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/views.html">Views-dev</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/forrest-contract.html">Our Contract</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/compliance.html">Standards Compliance</a>
+</div>
+<div onclick="SwitchMenu('menu_1.1.15', '../skin/')" id="menu_1.1.15Title" class="menutitle">Advanced Topics</div>
+<div id="menu_1.1.15" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/build.html">Building Forrest</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/catalog.html">Using DTD Catalogs</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/sitemap-ref.html">Sitemap Reference</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/project-sitemap.html">Project sitemap</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/plugins/pluginInfrastructure.html">Plugin Infrastructure</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/cap.html">Sourcetype Action</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.16', '../skin/')" id="menu_1.1.16Title" class="menutitle">Other versions</div>
+<div id="menu_1.1.16" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs.html">Overview</a>
+</div>
+<div class="menuitem">
+<a title="" href="http://forrest.apache.org/docs/../0.8/">0.8-dev</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/index.html">0.7 (current)</a>
+</div>
+<div class="menuitem">
+<a title="" href="http://forrest.apache.org/docs/../0.6/">0.6</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.17', '../skin/')" id="menu_1.1.17Title" class="menutitle">Upgrading</div>
+<div id="menu_1.1.17" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/upgrading_07.html">Upgrading to 0.7</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/upgrading_06.html">Upgrading to 0.6</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.18', '../skin/')" id="menu_1.1.18Title" class="menutitle">SubProjects</div>
+<div id="menu_1.1.18" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/forrestbar.html">ForrestBar</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/forrestbot.html">Forrestbot</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/forrestbot-web-interface.html">Forrestbot Webapp</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.19', '../skin/')" id="menu_1.1.19Title" class="menutitle">Reference docs</div>
+<div id="menu_1.1.19" class="menuitemgroup">
+<div onclick="SwitchMenu('menu_1.1.19.1', '../skin/')" id="menu_1.1.19.1Title" class="menutitle">DTD documentation</div>
+<div id="menu_1.1.19.1" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/dtd-docs.html">Overview</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/document-v20.dtdx.html">document-v20</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/howto-v20.dtdx.html">howto-v20</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/faq-v20.dtdx.html">faq-v20</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/document-v13.dtdx.html">document-v13</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/howto-v13.dtdx.html">howto-v13</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/faq-v13.dtdx.html">faq-v13</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.19.2', '../skin/')" id="menu_1.1.19.2Title" class="menutitle">Doc samples</div>
+<div id="menu_1.1.19.2" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/document-v13.html">document-v13</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/document-v20.html">document-v20</a>
+</div>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.1.20', '../skin/')" id="menu_1.1.20Title" class="menutitle">Older Docs</div>
+<div id="menu_1.1.20" class="menuitemgroup">
+<div class="menuitem">
+<a title="" href="../docs/primer.html">Forrest Primer</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/libre-intro.html">Libre</a>
+</div>
+<div class="menuitem">
+<a title="" href="../docs/dreams.html">Dream list</a>
+</div>
+</div>
+</div>
+<div id="credit">
+<hr>
+    This is documentation for current release v0.7
+   (<a href="http://forrest.apache.org/docs.html">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>
+<!--+
+    |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 current release v0.7
+   (<a href="http://forrest.apache.org/docs.html">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>
+</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>
+</div>
+
+    
+<a name="N1001A"></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="#semantic_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> ... a modified version from Forrest's
+        own <a href="http://forrest.apache.org/">website</a>:
+      </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>
+</div>
+
+    
+<a name="N100A6"></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="N100ED"></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="N1010D"></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="frame 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="N10167"></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="N10173"></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="N101A3"></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="N101C0"></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". If you experience any problems, try to add a 
+          <span class="codefrag">&lt;foo label="Foo" href="index.html"/&gt;</span> to the
+          <span class="codefrag">site.xml</span> configuration.
+        </p>
+</div>
+
+    
+<a name="N101D7"></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="N1020C"></a><a name="linking"></a>
+<h2 class="underlined_10">Linking systems</h2>
+<div class="section">
+<a name="N10212"></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;link href="todo.html"&gt;to-do list&lt;link&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="N10237"></a><a name="indirect-linking"></a>
+<h3 class="underlined_5">Indirect linking</h3>
+<p>
+          Forrest's solution is simple: instead of &lt;link href="todo.html"&gt;,
+          write &lt;link 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="N1025E"></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="frame 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="N1029C"></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;link href="ext:commons/resolver"&gt;
+            generates the link
+            <a href="http://xml.apache.org/commons/components/resolver/">http://xml.apache.org/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="N102CF"></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="N102EE"></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="N10391"></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="N103A8"></a><a name="implementation"></a>
+<h2 class="underlined_10">Implementation</h2>
+<div class="section">
+<p>Full details on the implementation of
+      <a href="../docs/sitemap-ref.html#linkrewriting_impl">link rewriting</a> and
+      <a href="../docs/sitemap-ref.html#menu_generation_impl">menu generation</a> are available in
+      the <a href="../docs/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-2005 The Apache Software Foundation.</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>

Propchange: forrest/site/0.7/docs/linking.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/site/0.7/docs/linking.pdf
URL: http://svn.apache.org/viewcvs/forrest/site/0.7/docs/linking.pdf?view=auto&rev=160895
==============================================================================
Binary file - no diff available.

Propchange: forrest/site/0.7/docs/linking.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf



Mime
View raw message