| <?xml version="1.0"?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <!-- |
| site-to-xhtml.xsl is the final stage in HTML page production. It merges HTML from |
| document-to-html.xsl, tab-to-menu.xsl and book-to-menu.xsl, and adds the site header, |
| footer, searchbar, css etc. As input, it takes XML of the form: |
| |
| <site> |
| <div class="menu"> |
| ... |
| </div> |
| <div class="tab"> |
| ... |
| </div> |
| <div class="content"> |
| ... |
| </div> |
| </site> |
| |
| --> |
| <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
| xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"> |
| <xsl:variable name="config" select="//skinconfig"/> |
| <!-- If true, a txt link for this page will not be generated --> |
| <xsl:variable name="disable-txt-link" select="//skinconfig/disable-txt-link"/> |
| <!-- If true, a PDF link for this page will not be generated --> |
| <xsl:variable name="disable-pdf-link" select="//skinconfig/disable-pdf-link"/> |
| <!-- If true, a "print" link for this page will not be generated --> |
| <xsl:variable name="disable-print-link" select="//skinconfig/disable-print-link"/> |
| <!-- If true, an XML link for this page will not be generated --> |
| <xsl:variable name="disable-xml-link" select="//skinconfig/disable-xml-link"/> |
| <!-- If true, a POD link for this page will not be generated --> |
| <xsl:variable name="disable-pod-link" select="//skinconfig/disable-pod-link"/> |
| <!-- Get the location where to generate the minitoc --> |
| <xsl:variable name="minitoc-location" select="//skinconfig/toc/@location"/> |
| <xsl:param name="path"/> |
| <xsl:include href="dotdots.xsl"/> |
| <xsl:include href="pathutils.xsl"/> |
| <xsl:include href="renderlogo.xsl"/> |
| <!-- Path (..'s) to the root directory --> |
| <xsl:variable name="root"> |
| <xsl:call-template name="dotdots"> |
| <xsl:with-param name="path" select="$path"/> |
| </xsl:call-template> |
| </xsl:variable> |
| <!-- Source filename (eg 'foo.xml') of current page --> |
| <xsl:variable name="filename"> |
| <xsl:call-template name="filename"> |
| <xsl:with-param name="path" select="$path"/> |
| </xsl:call-template> |
| </xsl:variable> |
| <!-- Path of Lucene search results page (relative to $root) --> |
| <xsl:param name="lucene-search" select="'lucene-search.html'"/> |
| <xsl:variable name="filename-noext"> |
| <xsl:call-template name="filename-noext"> |
| <xsl:with-param name="path" select="$path"/> |
| </xsl:call-template> |
| </xsl:variable> |
| <!-- Whether to obfuscate email links --> |
| <xsl:variable name="obfuscate-mail-links" select="//skinconfig/obfuscate-mail-links"/> |
| <!-- If true, the font size script will not be rendered --> |
| <xsl:variable name="disable-font-script" select="//skinconfig/disable-font-script"/> |
| <!-- If true, an the images on all external links will not be added --> |
| <xsl:variable name="disable-external-link-image" select="//skinconfig/disable-external-link-image"/> |
| <xsl:variable name="skin-img-dir" select="concat(string($root), 'skin/images')"/> |
| <xsl:variable name="spacer" select="concat($root, 'skin/images/spacer.gif')"/> |
| <xsl:template name="breadcrumbs"> |
| <xsl:if test="(//skinconfig/trail/link1/@name)and(//skinconfig/trail/link1/@name!='')"><a href="{//skinconfig/trail/link1/@href}"> |
| <xsl:value-of select="//skinconfig/trail/link1/@name"/></a> |
| </xsl:if> |
| <xsl:if test="(//skinconfig/trail/link2/@name)and(//skinconfig/trail/link2/@name!='')"> > <a href="{//skinconfig/trail/link2/@href}"> |
| <xsl:value-of select="//skinconfig/trail/link2/@name"/></a> |
| </xsl:if> |
| <xsl:if test="(//skinconfig/trail/link3/@name)and(//skinconfig/trail/link3/@name!='')"> > <a href="{//skinconfig/trail/link3/@href}"> |
| <xsl:value-of select="//skinconfig/trail/link3/@name"/></a> |
| </xsl:if> |
| <script type="text/javascript" language="JavaScript" src="{$root}skin/breadcrumbs.js"/> |
| </xsl:template> |
| <xsl:template match="site"> |
| <html> |
| <head> |
| <title><xsl:value-of select="div[@class='content']/table/tr/td/h1"/></title> |
| <xsl:if test="//skinconfig/favicon-url"><link rel="shortcut icon"> |
| <xsl:attribute name="href"> |
| <xsl:value-of select="concat($root,//skinconfig/favicon-url)"/> |
| </xsl:attribute></link> |
| </xsl:if> |
| </head> |
| <body> |
| <xsl:if test="//skinconfig/group-url"> |
| <xsl:call-template name="renderlogo"> |
| <xsl:with-param name="name" select="//skinconfig/group-name"/> |
| <xsl:with-param name="url" select="//skinconfig/group-url"/> |
| <xsl:with-param name="logo" select="//skinconfig/group-logo"/> |
| <xsl:with-param name="root" select="$root"/> |
| <xsl:with-param name="description" select="//skinconfig/group-description"/> |
| </xsl:call-template> |
| </xsl:if> |
| <xsl:call-template name="renderlogo"> |
| <xsl:with-param name="name" select="//skinconfig/project-name"/> |
| <xsl:with-param name="url" select="//skinconfig/project-url"/> |
| <xsl:with-param name="logo" select="//skinconfig/project-logo"/> |
| <xsl:with-param name="root" select="$root"/> |
| <xsl:with-param name="description" select="//skinconfig/project-description"/> |
| </xsl:call-template> |
| <xsl:comment>================= start Tabs ==================</xsl:comment> |
| <xsl:apply-templates select="div[@class='tab']"/> |
| <xsl:comment>================= end Tabs ==================</xsl:comment> |
| <xsl:comment>================= start Menu items ==================</xsl:comment> |
| <xsl:apply-templates select="div[@class='menu']"/> |
| <xsl:comment>================= end Menu items ==================</xsl:comment> |
| <xsl:comment>================= start Content==================</xsl:comment> |
| <xsl:apply-templates select="div[@class='content']"/> |
| <xsl:comment>================= end Content==================</xsl:comment> |
| <xsl:comment>================= start Footer ==================</xsl:comment> |
| <xsl:choose> |
| <xsl:when test="$config/copyright-link"><a> |
| <xsl:attribute name="href"> |
| <xsl:value-of select="$config/copyright-link"/> |
| </xsl:attribute> |
| Copyright © <xsl:value-of select="$config/year"/> |
| <xsl:call-template name="current-year"> |
| <xsl:with-param name="copyrightyear" select="$config/year"/> |
| </xsl:call-template>  |
| <xsl:value-of select="$config/vendor"/></a> |
| </xsl:when> |
| <xsl:otherwise> |
| Copyright © <xsl:value-of select="$config/year"/> |
| <xsl:call-template name="current-year"> |
| <xsl:with-param name="copyrightyear" select="$config/year"/> |
| </xsl:call-template>  |
| <xsl:value-of select="$config/vendor"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| All rights reserved. |
| <script language="JavaScript" type="text/javascript"><![CDATA[<!-- |
| document.write(" - "+"Last Published: " + document.lastModified); |
| // -->]]></script> |
| <xsl:if test="//skinconfig/host-logo and not(//skinconfig/host-logo = '')"><a href="{//skinconfig/host-url}"> |
| <xsl:call-template name="renderlogo"> |
| <xsl:with-param name="name" select="//skinconfig/host-name"/> |
| <xsl:with-param name="url" select="//skinconfig/host-url"/> |
| <xsl:with-param name="logo" select="//skinconfig/host-logo"/> |
| <xsl:with-param name="root" select="$root"/> |
| </xsl:call-template></a> |
| </xsl:if> |
| <xsl:if test="$filename = 'index.html' and //skinconfig/credits"> |
| <xsl:for-each select="//skinconfig/credits/credit[not(@role='pdf')]"> |
| <xsl:call-template name="renderlogo"> |
| <xsl:with-param name="name" select="name"/> |
| <xsl:with-param name="url" select="url"/> |
| <xsl:with-param name="logo" select="image"/> |
| <xsl:with-param name="root" select="$root"/> |
| <xsl:with-param name="width" select="width"/> |
| <xsl:with-param name="height" select="height"/> |
| </xsl:call-template> |
| </xsl:for-each> |
| </xsl:if><a href="http://validator.w3.org/check/referer"> |
| <img class="skin" border="0" |
| src="http://www.w3.org/Icons/valid-html401" |
| alt="Valid HTML 4.01!" height="31" width="88"/></a> |
| </body> |
| </html> |
| </xsl:template> |
| <!-- Add links to any standards-compliance logos --> |
| <xsl:template name="compliancy-logos"> |
| <xsl:if test="$filename = 'index.html' and //skinconfig/disable-compliance-links = 'false'"><a href="http://validator.w3.org/check/referer"> |
| <img class="logoImage" |
| src="{$skin-img-dir}/valid-html401.png" |
| alt="Valid HTML 4.01!" title="Valid HTML 4.01!" height="31" width="88" border="0"/></a><a href="http://jigsaw.w3.org/css-validator/check/referer"> |
| <img class="logoImage" |
| src="{$skin-img-dir}/vcss.png" |
| alt="Valid CSS!" title="Valid CSS!" height="31" width="88" border="0"/></a> |
| </xsl:if> |
| </xsl:template> |
| <!-- Generates the PDF link --> |
| <xsl:template match="div[@id='skinconf-pdflink']"> |
| <xsl:if test="not($config/disable-pdf-link) or $disable-pdf-link = 'false'"> |
| <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.pdf" class="dida"> |
| <img class="skin" src="{$skin-img-dir}/pdfdoc.gif" alt="PDF"/> |
| <br/> |
| PDF</a> |
| </td> |
| </xsl:if> |
| </xsl:template> |
| <!-- Generates the TXT link --> |
| <xsl:template match="div[@id='skinconf-txtlink']"> |
| <xsl:if test="$disable-txt-link = 'false'"> |
| <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.txt" class="dida"> |
| <img class="skin" src="{$skin-img-dir}/txtdoc.png" alt="TXT"/> |
| <br/> |
| TXT</a> |
| </td> |
| </xsl:if> |
| </xsl:template> |
| <!-- Generates the POD link --> |
| <xsl:template match="div[@id='skinconf-podlink']"> |
| <xsl:if test="$disable-pod-link = 'false'"> |
| <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.pod" class="dida"> |
| <img class="skin" src="{$skin-img-dir}/poddoc.png" alt="POD"/> |
| <br/> |
| POD</a> |
| </td> |
| </xsl:if> |
| </xsl:template> |
| <!-- Generates the XML link --> |
| <xsl:template match="div[@id='skinconf-xmllink']"> |
| <xsl:if test="$disable-xml-link = 'false'"> |
| <td align="center" width="40" nowrap="nowrap"><a href="{$filename-noext}.xml" class="dida"> |
| <img class="skin" src="{$skin-img-dir}/xmldoc.gif" alt="XML"/> |
| <br/> |
| XML</a> |
| </td> |
| </xsl:if> |
| </xsl:template> |
| <!-- Generates the "printer friendly version" link --> |
| <xsl:template match="div[@id='skinconf-printlink']"> |
| <xsl:if test="$disable-print-link = 'false'"> |
| <script type="text/javascript" language="Javascript"> |
| function printit() { |
| if (window.print) { |
| window.focus(); |
| window.print(); |
| } |
| } |
| |
| var NS = (navigator.appName == "Netscape"); |
| var VERSION = parseInt(navigator.appVersion); |
| if (VERSION > 3) { |
| document.write('<td align="center" width="40" nowrap="nowrap">'); |
| document.write(' <a href="javascript:printit()" class="dida">'); |
| document.write(' <img class="skin" src="{$skin-img-dir}/printer.gif" alt="Print this Page"/><br />'); |
| document.write(' print</a>'); |
| document.write('</td>'); |
| } |
| </script> |
| </xsl:if> |
| </xsl:template> |
| <!-- handle all obfuscating mail links and disabling external link images --> |
| <xsl:template match="a"> |
| <xsl:choose> |
| <xsl:when test="$obfuscate-mail-links='true' and starts-with(@href, 'mailto:') and contains(@href, '@')"> |
| <xsl:variable name="mailto-1" select="substring-before(@href,'@')"/> |
| <xsl:variable name="mailto-2" select="substring-after(@href,'@')"/> |
| <xsl:variable name="obfuscation" select="normalize-space(//skinconfig/obfuscate-mail-value)"/><a href="{$mailto-1}{$obfuscation}{$mailto-2}"> |
| <xsl:apply-templates/></a> |
| </xsl:when> |
| <xsl:when test="not($disable-external-link-image='true') and contains(@href, ':') and not(contains(@href, //skinconfig/group-url)) and not(contains(@href, //skinconfig/project-url))"><a href="{@href}" class="external"> |
| <xsl:apply-templates/></a> |
| </xsl:when> |
| <xsl:otherwise> |
| <!-- xsl:copy-of makes sure we copy <a href> as well as <a name> |
| or any other <a ...> forms --> |
| <xsl:copy-of select="."/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| <xsl:template match="div[@id='skinconf-toc-page']"> |
| <xsl:if test="$config/toc"> |
| <xsl:if test="contains($minitoc-location,'page')"> |
| <xsl:if test="(count(//tocitems/tocitem) >= $config/toc/@min-sections) or (//tocitems/@force = 'true')"> |
| <xsl:call-template name="minitoc"> |
| <xsl:with-param name="tocroot" select="//tocitems"/> |
| </xsl:call-template> |
| </xsl:if> |
| </xsl:if> |
| </xsl:if> |
| </xsl:template> |
| <xsl:template name="minitoc"> |
| <xsl:param name="tocroot"/> |
| <xsl:if test="(count($tocroot/tocitem) >= $config/toc/@min-sections) or ($tocroot/@force = 'true')"> |
| <xsl:if test="contains($config/toc/@location,'page')"> |
| <ul class="minitoc"> |
| <xsl:for-each select="$tocroot/tocitem"> |
| <li><a href="{@href}"> |
| <xsl:value-of select="@title"/></a> |
| <xsl:if test="@level<//skinconfig/toc/@max-depth+1"> |
| <xsl:call-template name="minitoc"> |
| <xsl:with-param name="tocroot" select="."/> |
| </xsl:call-template> |
| </xsl:if></li> |
| </xsl:for-each> |
| </ul> |
| </xsl:if> |
| </xsl:if> |
| </xsl:template> |
| <xsl:template name="html-meta"> |
| <meta name="Generator" content="Apache Forrest"/> |
| <meta name="Forrest-version"> |
| <xsl:attribute name="content"> |
| <xsl:value-of select="//info/forrest-version"/> |
| </xsl:attribute> |
| </meta> |
| <meta name="Forrest-skin-name"> |
| <xsl:attribute name="content"> |
| <xsl:value-of select="//info/project-skin"/> |
| </xsl:attribute> |
| </meta> |
| </xsl:template> |
| <!-- meta information from v 2.0 documents |
| FIXME: the match is really inefficient --> |
| <xsl:template name="meta-data"> |
| <xsl:for-each select="//meta-data/meta"> |
| <xsl:element name="meta"> |
| <xsl:attribute name="name"> |
| <xsl:value-of select="@name"/> |
| </xsl:attribute> |
| <xsl:attribute name="content"> |
| <xsl:value-of select="."/> |
| </xsl:attribute> |
| <xsl:if test="@xml:lang"> |
| <xsl:attribute name="lang"> |
| <xsl:value-of select="@xml:lang"/> |
| </xsl:attribute> |
| </xsl:if> |
| </xsl:element> |
| </xsl:for-each> |
| </xsl:template> |
| <xsl:template name="feedback"> |
| <div id="feedback"> |
| <xsl:value-of select="$config/feedback"/> |
| <xsl:choose> |
| <xsl:when test="$config/feedback/@href and not($config/feedback/@href='')"><a id="feedbackto"> |
| <xsl:attribute name="href"> |
| <xsl:value-of select="$config/feedback/@href"/> |
| <xsl:value-of select="$path"/> |
| </xsl:attribute> |
| <xsl:value-of select="$config/feedback/@to"/></a> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="$config/feedback/@to"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </div> |
| </xsl:template> |
| <xsl:template match="node()|@*" priority="-1"> |
| <xsl:copy> |
| <xsl:apply-templates select="@*"/> |
| <xsl:apply-templates/> |
| </xsl:copy> |
| </xsl:template> |
| <!-- inception year copyright management --> |
| <xsl:template name="current-year"> |
| <!-- Displays the current year after the inception year (in the copyright i.e: 2002-2005) |
| - the copyright year (2005 by default) can be indicated in the copyrightyear parameter, |
| - the year format (yyyy by default) can be indicated in the dateformat parameter, |
| - the dates separator (- by default) can be indicated in the dateseparator parameter. |
| For instance the following call will format the year on 2 digits and separates the dates |
| with / |
| (copyright 02/05) |
| <xsl:call-template name="current-year"> |
| <xsl:with-param name="copyrightyear" select="'02'"/> |
| <xsl:with-param name="dateformat" select="'yy'"/> |
| <xsl:with-param name="dateseparator" select="'/'"/> |
| </xsl:call-template> |
| Warning, to enable inception year, inception attribute must be set to "true" in copyright/year/@inception |
| --> |
| <xsl:param name="copyrightyear">2005</xsl:param> |
| <xsl:param name="dateformat">yyyy</xsl:param> |
| <xsl:param name="dateseparator">-</xsl:param> |
| <xsl:if test="$copyrightyear[@inception = 'true']"> |
| <xsl:variable name="tz" select='java:java.util.SimpleTimeZone.new(0,"GMT+00:00")' /> |
| <xsl:variable name="formatter" select="java:java.text.SimpleDateFormat.new($dateformat)"/> |
| <xsl:variable name="settz" select="java:setTimeZone($formatter, $tz)" /> |
| <xsl:variable name="date" select="java:java.util.Date.new()"/> |
| <xsl:variable name="year" select="java:format($formatter, $date)"/> |
| <xsl:if test="$copyrightyear != $year"> |
| <xsl:value-of select="$dateseparator"/> |
| <xsl:value-of select="$year"/> |
| </xsl:if> |
| </xsl:if> |
| </xsl:template> |
| </xsl:stylesheet> |