| <!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.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> > <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"> |
| <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="selected" href="../docs_0_70/index.html">0.70 (current)</a><a class="unselected" 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"> |
| |
| |
| </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.70</div> |
| <div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;"> |
| <div class="menuitem"> |
| <a href="../docs_0_70/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/faq.html">FAQs</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/changes.html">Changes</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/todo.html">Todo</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/your-project.html">Using Forrest</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/validation.html">XML Validation</a> |
| </div> |
| <div class="menupage"> |
| <div class="menupagetitle">Menus and Linking</div> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/searching.html">Searching</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/skins.html">Default Skins</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/skin-package.html">Skin Packages</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/views.html">Views-dev</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/forrest-contract.html">Our Contract</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/compliance.html">Standards Compliance</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.14', '../skin/')" id="menu_1.1.14Title" class="menutitle">How-To</div> |
| <div id="menu_1.1.14" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-howto.html">Write a How-to</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-asf-mirror.html">Download mirror</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-pdf-tab.html">Create tab PDF</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-editcss.html">Edit CSS (WYSIWYG)</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-corner-images.html">CSS corner SVG</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-forrest-from-maven.html">Maven Integration</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-buildPlugin.html">Build a Plugin</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-custom-html-source.html">Custom html source</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.14.10', '../skin/')" id="menu_1.1.14.10Title" class="menutitle">Multipage HowTo</div> |
| <div id="menu_1.1.14.10" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/multi/howto-multi.html">Introduction</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/multi/step1.html">Step 1</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/multi/step2.html">Step 2</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/multi/step3.html">Step 3</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.14.11', '../skin/')" id="menu_1.1.14.11Title" class="menutitle">Views</div> |
| <div id="menu_1.1.14.11" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-view-install.html">Install views</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-view-dsl.html">forrest:view DSL</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/howto-view-contracts.html">contract implementations</a> |
| </div> |
| </div> |
| </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 href="../docs_0_70/build.html">Building Forrest</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/catalog.html">Using DTD Catalogs</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/sitemap-ref.html">Sitemap Reference</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/project-sitemap.html">Project sitemap</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/cap.html">Sourcetype Action</a> |
| </div> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/upgrading_07.html">Upgrading to 0.7</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.17', '../skin/')" id="menu_1.1.17Title" class="menutitle">Reference docs</div> |
| <div id="menu_1.1.17" class="menuitemgroup"> |
| <div onclick="SwitchMenu('menu_1.1.17.1', '../skin/')" id="menu_1.1.17.1Title" class="menutitle">DTD documentation</div> |
| <div id="menu_1.1.17.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.17.2', '../skin/')" id="menu_1.1.17.2Title" class="menutitle">Doc samples</div> |
| <div id="menu_1.1.17.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.18', '../skin/')" id="menu_1.1.18Title" class="menutitle">Older Docs</div> |
| <div id="menu_1.1.18" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../docs_0_70/primer.html">Forrest Primer</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/libre-intro.html">Libre</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/dreams.html">Dream list</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../docs_0_70/howto/cvs-ssh/howto-cvs-ssh.html">CVS over SSH</a> |
| </div> |
| </div> |
| </div> |
| <div id="credit"> |
| <hr> |
| This is documentation for current version v0.7 |
| (<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: |
| <input value="Reset" class="resetfont" title="Reset text" onclick="ndeSetTextSize('reset'); return false;" type="button"> |
| <input value="-a" class="smallerfont" title="Shrink text" onclick="ndeSetTextSize('decr'); return false;" type="button"> |
| <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 version v0.7 |
| (<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> |
| </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="#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 <link href="site:v0.70//changes"> 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"> |
| <?xml version="1.0"?> |
| <site label="Forrest" href="" tab="home" |
| xmlns="http://apache.org/forrest/linkmap/1.0"> |
| |
| <about label="About"> |
| <index label="Index" href="index.html"/> |
| <license label="License" href="license.html"/> |
| <your-project label="Using Forrest" href="your-project.html"> |
| <new_content_type href="#adding_new_content_type"/> |
| </your-project> |
| <linking label="Linking" href="linking.html"/> |
| <changes label="Changes" href="changes.html"/> |
| <todo label="Todo" href="todo.html"/> |
| <live-sites label="Live sites" href="live-sites.html"/> |
| </about> |
| |
| <community label="Community" href="community/" tab="community"> |
| <index label="About" href="index.html"/> |
| <howto-samples label="How-To Samples" href="howto/" tab="howto"> |
| <overview label="Overview" href="index.html"/> |
| <single-page label="Single Page" href="v10/howto-v10.html"/> |
| <multi-page label="Multi-Page" href="multi/"> |
| <intro label="Intro" href="howto-multi.html"/> |
| <step1 label="Step 1" href="step1.html"/> |
| <step2 label="Step 2" href="step2.html"/> |
| </multi-page> |
| </howto-samples> |
| </community> |
| |
| <references label="References"> |
| <gump label="Apache Gump" href="http://gump.apache.org/"/> |
| <cocoon label="Apache Cocoon" href="http://cocoon.apache.org/"/> |
| </references> |
| |
| <external-refs> |
| <mail-archive href="http://marc.theaimsgroup.com"/> |
| <xml.apache.org href="http://xml.apache.org/"> |
| <commons href="commons/"> |
| <resolver href="components/resolver/"/> |
| </commons> |
| <fop href="fop/"/> |
| <batik href="batik/"/> |
| </xml.apache.org> |
| |
| <mail> |
| <semantic-linking href="http://marc.theaimsgroup.com/?l=forrest-dev |
| &amp;m=103097808318773&amp;w=2"/> |
| </mail> |
| <cool-uris href="www.w3.org/Provider/Style/URI.html"/> |
| <uri-rfc href="http://zvon.org/tmRFC/RFC2396/Output/index.html"/> |
| |
| </external-refs> |
| </site> |
| </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_70/faq.html#site-xml">explained example</a>. |
| </p> |
| </div> |
| |
| |
| <a name="N100A9"></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"> |
| <tabs ...> |
| <tab id="home" label="Home" dir=""/> |
| <tab id="community" label="Community" dir="community" indexfile="mailLists.html"/> |
| <tab id="howto" label="How-Tos" dir="community/howto"/> |
| </tabs> |
| </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"> |
| <img alt="Community menu generated from site.xml" src="images/menu2.png"> |
| <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="N100F0"></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"> |
| <tab id="apache" label="XML Apache" href="http://xml.apache.org/"/> |
| </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="N10110"></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"> |
| <site label="Forrest" href="" <strong>tab="home"</strong> |
| xmlns="http://apache.org/forrest/linkmap/1.0"> |
| |
| <about label="About"> |
| <index label="Index" href="index.html"/> |
| <license label="License" href="license.html"/> |
| <your-project label="Using Forrest" href="your-project.html"> |
| <new_content_type href="#adding_new_content_type"/> |
| </your-project> |
| <linking label="Linking" href="linking.html"/> |
| .... |
| </about> |
| |
| <community label="Community" href="community/" <strong>tab="community"</strong>> |
| <index label="About" href="index.html"/> |
| <howto-samples label="How-To Samples" href="howto/" <strong>tab="howto"</strong>> |
| <overview label="Overview" href="index.html"/> |
| <single-page label="Single Page" href="v10/howto-v10.html"/> |
| <multi label="Multi-Page" href="multi/"> |
| <intro label="Intro" href="howto-multi.html"/> |
| <step1 label="Step 1" href="step1.html"/> |
| ...</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><about></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><linking></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="N1016A"></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="N10176"></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"> |
| <img alt="community/ directory menu" src="images/dir-menu2.png"> |
| <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="N101A6"></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="N101C3"></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="N101D9"></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> |
| 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. |
| </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_70/faq.html#tab-index">FAQ</a>. |
| </li> |
| |
| </ul> |
| </div> |
| |
| |
| <a name="N10225"></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"> |
| <toc level="2" location="page"/> |
| </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="N1025A"></a><a name="linking"></a> |
| <h2 class="underlined_10">Linking systems</h2> |
| <div class="section"> |
| <a name="N10260"></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"> |
| <a href="todo.html">to-do list<a> |
| </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="N10285"></a><a name="indirect-linking"></a> |
| <h3 class="underlined_5">Indirect linking</h3> |
| <p> |
| Forrest's solution is simple: instead of <a href="todo.html">, |
| write <a href="site:v0.70//todo"> 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="N102AC"></a><a name="resolve-site-uris"></a> |
| <h4>Resolving site: URIs</h4> |
| <p> |
| So how does "<span class="codefrag">site:v0.70//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:v0.70//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="N102EA"></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 |
| <external-refs> 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"> |
| <site> |
| ... |
| <external-refs> |
| <mail-archive href="http://marc.theaimsgroup.com"/> |
| <xml.apache.org href="http://xml.apache.org/"> |
| <commons href="commons/"> |
| <resolver href="components/resolver/"/> |
| </commons> |
| </xml.apache.org> |
| ... |
| </external-refs> |
| </site></pre> |
| <p> |
| As an example, <a href="ext:commons/resolver"> |
| 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="N1031D"></a><a name="source-uris"></a> |
| <h4>Theory: source URIs</h4> |
| <p> |
| The "<span class="codefrag">site:</span>" URIs like "<span class="codefrag">site:v0.70//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="N1033C"></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::<Message-Id></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:<searchterm></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<at>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:<taskname></span>, e.g. <span class="codefrag">task:pathconvert</span>. |
| </p> |
| </div> |
| |
| <a name="N103DF"></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="N103F6"></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_70/sitemap-ref.html#linkrewriting_impl">link rewriting</a> and |
| <a href="../docs_0_70/sitemap-ref.html#menu_generation_impl">menu generation</a> are available in |
| the <a href="../docs_0_70/sitemap-ref.html">Sitemap Reference</a> |
| </p> |
| </div> |
| |
| |
| </div> |
| <!--+ |
| |end content |
| +--> |
| <div class="clearboth"> </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 © |
| 2002-2007 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a> |
| </div> |
| <!--+ |
| |end bottomstrip |
| +--> |
| </div> |
| </body> |
| </html> |