]> granicus.if.org Git - docbook-dsssl/commitdiff
Handle links across dbhtml-specified relative directories correctly
authorNorman Walsh <ndw@nwalsh.com>
Mon, 25 Mar 2002 13:00:01 +0000 (13:00 +0000)
committerNorman Walsh <ndw@nwalsh.com>
Mon, 25 Mar 2002 13:00:01 +0000 (13:00 +0000)
xsl/html/autotoc.xsl
xsl/html/chunk-common.xsl
xsl/html/pi.xsl

index ff52ad63806e741130bc85e774fae6d5c7753d31..58d05e370556a49d4c0c1833930afb3aa2386468 100644 (file)
@@ -13,6 +13,7 @@
      ******************************************************************** -->
 
 <xsl:template name="href.target">
+  <xsl:param name="context" select="."/>
   <xsl:param name="object" select="."/>
   <xsl:text>#</xsl:text>
   <xsl:call-template name="object.id">
@@ -36,6 +37,8 @@
 </xsl:variable>
 
 <xsl:template name="set.toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="toc.title">
     <p>
       <b>
@@ -71,7 +74,9 @@
         <div class="toc">
           <xsl:copy-of select="$toc.title"/>
           <xsl:element name="{$toc.list.type}">
-            <xsl:apply-templates select="$nodes" mode="toc"/>
+            <xsl:apply-templates select="$nodes" mode="toc">
+              <xsl:with-param name="toc-context" select="$toc-context"/>
+            </xsl:apply-templates>
           </xsl:element>
         </div>
       </xsl:if>
@@ -80,6 +85,8 @@
 </xsl:template>
 
 <xsl:template name="division.toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="toc.title">
     <p>
       <b>
         <div class="toc">
           <xsl:copy-of select="$toc.title"/>
           <xsl:element name="{$toc.list.type}">
-            <xsl:apply-templates select="$nodes" mode="toc"/>
+            <xsl:apply-templates select="$nodes" mode="toc">
+              <xsl:with-param name="toc-context" select="$toc-context"/>
+            </xsl:apply-templates>
           </xsl:element>
         </div>
       </xsl:if>
 </xsl:template>
 
 <xsl:template name="component.toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="toc.title">
     <p>
       <b>
         <div class="toc">
           <xsl:copy-of select="$toc.title"/>
           <xsl:element name="{$toc.list.type}">
-            <xsl:apply-templates select="$nodes" mode="toc"/>
+            <xsl:apply-templates select="$nodes" mode="toc">
+              <xsl:with-param name="toc-context" select="$toc-context"/>
+            </xsl:apply-templates>
           </xsl:element>
         </div>
       </xsl:if>
 </xsl:template>
 
 <xsl:template name="section.toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="toc.title">
     <p>
       <b>
         <div class="toc">
           <xsl:copy-of select="$toc.title"/>
           <xsl:element name="{$toc.list.type}">
-            <xsl:apply-templates select="$nodes" mode="toc"/>
+            <xsl:apply-templates select="$nodes" mode="toc">
+              <xsl:with-param name="toc-context" select="$toc-context"/>
+            </xsl:apply-templates>
           </xsl:element>
         </div>
       </xsl:if>
 <!-- ==================================================================== -->
 
 <xsl:template name="subtoc">
+  <xsl:param name="toc-context" select="."/>
   <xsl:param name="nodes" select="NOT-AN-ELEMENT"/>
 
   <xsl:variable name="subtoc">
     <xsl:element name="{$toc.list.type}">
-      <xsl:apply-templates mode="toc" select="$nodes"/>
+      <xsl:apply-templates mode="toc" select="$nodes">
+        <xsl:with-param name="toc-context" select="$toc-context"/>
+      </xsl:apply-templates>
     </xsl:element>
   </xsl:variable>
 
 
     <a>
       <xsl:attribute name="href">
-        <xsl:call-template name="href.target"/>
+        <xsl:call-template name="href.target">
+          <xsl:with-param name="context" select="$toc-context"/>
+        </xsl:call-template>
       </xsl:attribute>
       <xsl:apply-templates select="." mode="title.markup"/>
     </a>
 </xsl:template>
 
 <xsl:template match="book|setindex" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="part|reference
                                          |preface|chapter|appendix
                                          |article
 </xsl:template>
 
 <xsl:template match="part|reference" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="appendix|chapter|article
                                          |index|glossary|bibliography
                                          |preface|reference|refentry
 </xsl:template>
 
 <xsl:template match="preface|chapter|appendix|article" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="section|sect1|bridgehead"/>
   </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="sect1" mode="toc">
+  <xsl:param name="toc-context" select="."/>
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="sect2|bridgehead"/>
   </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="sect2" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="sect3|bridgehead"/>
   </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="sect3" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="sect4|bridgehead"/>
   </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="sect4" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="sect5|bridgehead"/>
   </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="sect5" mode="toc">
-  <xsl:call-template name="subtoc"/>
+  <xsl:param name="toc-context" select="."/>
+
+  <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
+  </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="section" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
     <xsl:with-param name="nodes" select="section|bridgehead"/>
   </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="bridgehead" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:if test="$bridgehead.in.toc != 0">
-    <xsl:call-template name="subtoc"/>
+    <xsl:call-template name="subtoc">
+      <xsl:with-param name="toc-context" select="$toc-context"/>
+    </xsl:call-template>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="bibliography|glossary" mode="toc">
-  <xsl:call-template name="subtoc"/>
+  <xsl:param name="toc-context" select="."/>
+
+  <xsl:call-template name="subtoc">
+    <xsl:with-param name="toc-context" select="$toc-context"/>
+  </xsl:call-template>
 </xsl:template>
 
 <xsl:template match="index" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <!-- If the index tag is empty, don't point at it from the TOC -->
   <xsl:if test="* or $generate.index">
-    <xsl:call-template name="subtoc"/>
+    <xsl:call-template name="subtoc">
+      <xsl:with-param name="toc-context" select="$toc-context"/>
+    </xsl:call-template>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="refentry" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:variable name="refmeta" select=".//refmeta"/>
   <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
   <xsl:variable name="refnamediv" select=".//refnamediv"/>
 </xsl:template>
 
 <xsl:template match="title" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <a>
     <xsl:attribute name="href">
       <xsl:call-template name="href.target">
 </xsl:template>
 
 <xsl:template name="manual-toc">
+  <xsl:param name="toc-context" select="."/>
   <xsl:param name="tocentry"/>
 
   <!-- be careful, we don't want to change the current document to the other tree! -->
 <!-- ==================================================================== -->
 
 <xsl:template name="list.of.titles">
+  <xsl:param name="toc-context" select="."/>
   <xsl:param name="titles" select="'table'"/>
   <xsl:param name="nodes" select=".//table"/>
 
       </p>
 
       <xsl:element name="{$toc.list.type}">
-        <xsl:apply-templates select="$nodes" mode="toc"/>
+        <xsl:apply-templates select="$nodes" mode="toc">
+          <xsl:with-param name="toc-context" select="$toc-context"/>
+        </xsl:apply-templates>
       </xsl:element>
     </div>
   </xsl:if>
 </xsl:template>
 
 <xsl:template match="figure|table|example|equation" mode="toc">
+  <xsl:param name="toc-context" select="."/>
+
   <xsl:element name="{$toc.listitem.type}">
     <xsl:variable name="label">
       <xsl:apply-templates select="." mode="label.markup"/>
index 0d9eaca50b49a8bf5c20a6eedd9a05571d64b9bf..ed45dcc6ec7d210596dcf1b11d899b8153023ceb 100644 (file)
     </xsl:choose>
   </xsl:variable>
 
-  <xsl:variable name="dir">
-    <xsl:call-template name="dbhtml-dir"/>
-  </xsl:variable>
-
   <xsl:choose>
     <xsl:when test="$ischunk='0'">
       <!-- if called on something that isn't a chunk, walk up... -->
 
     <xsl:when test="not($recursive) and $filename != ''">
       <!-- if this chunk has an explicit name, use it -->
-      <xsl:if test="$dir != ''">
-        <xsl:value-of select="$dir"/>
-        <xsl:text>/</xsl:text>
-      </xsl:if>
+      <xsl:call-template name="dbhtml-dir"/>
       <xsl:value-of select="$filename"/>
     </xsl:when>
 
 
 <!-- ==================================================================== -->
 
-<xsl:template name="href.target">
+<xsl:template name="href.target.uri">
   <xsl:param name="object" select="."/>
   <xsl:variable name="ischunk">
     <xsl:call-template name="chunk">
   </xsl:if>
 </xsl:template>
 
+<xsl:template name="href.target">
+  <xsl:param name="context" select="."/>
+  <xsl:param name="object" select="."/>
+
+  <xsl:variable name="href.to.uri">
+    <xsl:call-template name="href.target.uri">
+      <xsl:with-param name="object" select="$object"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:variable name="href.from.uri">
+    <xsl:call-template name="href.target.uri">
+      <xsl:with-param name="object" select="$context"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:variable name="href.to">
+    <xsl:call-template name="trim.common.uri.paths">
+      <xsl:with-param name="uriA" select="$href.to.uri"/>
+      <xsl:with-param name="uriB" select="$href.from.uri"/>
+      <xsl:with-param name="return" select="'A'"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:variable name="href.from">
+    <xsl:call-template name="trim.common.uri.paths">
+      <xsl:with-param name="uriA" select="$href.to.uri"/>
+      <xsl:with-param name="uriB" select="$href.from.uri"/>
+      <xsl:with-param name="return" select="'B'"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:variable name="depth">
+    <xsl:call-template name="count.uri.path.depth">
+      <xsl:with-param name="filename" select="$href.from"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:variable name="href">
+    <xsl:call-template name="copy-string">
+      <xsl:with-param name="string" select="'../'"/>
+      <xsl:with-param name="count" select="$depth"/>
+    </xsl:call-template>
+    <xsl:value-of select="$href.to"/>
+  </xsl:variable>
+
+<!--
+  <xsl:message>
+    <xsl:text>In </xsl:text>
+    <xsl:value-of select="name(.)"/>
+    <xsl:text> (</xsl:text>
+    <xsl:value-of select="$href.from"/>
+    <xsl:text>,</xsl:text>
+    <xsl:value-of select="$depth"/>
+    <xsl:text>) </xsl:text>
+    <xsl:value-of select="name($object)"/>
+    <xsl:text> href=</xsl:text>
+    <xsl:value-of select="$href"/>
+  </xsl:message>
+-->
+
+  <xsl:value-of select="$href"/>
+</xsl:template>
+
 <!-- ==================================================================== -->
 
 <xsl:template name="html.head">
index d3da3d90c794a94e0b1d122de641b6c3de5f6bf4..cec5d162b9114c5a1da8f8a4d55df9837d66b2c9 100644 (file)
@@ -43,6 +43,7 @@
   </xsl:call-template>
 </xsl:template>
 
+<!--
 <xsl:template name="dbhtml-dir">
   <xsl:param name="pis" select="./processing-instruction('dbhtml')"/>
   <xsl:call-template name="dbhtml-attribute">
     <xsl:with-param name="attribute">dir</xsl:with-param>
   </xsl:call-template>
 </xsl:template>
+-->
+
+<xsl:template name="dbhtml-dir">
+  <xsl:param name="context" select="."/>
+
+  <!-- directories are now inherited from previous levels -->
+
+  <xsl:variable name="ppath">
+    <xsl:if test="$context/parent::*">
+      <xsl:call-template name="dbhtml-dir">
+        <xsl:with-param name="context" select="$context/parent::*"/>
+      </xsl:call-template>
+    </xsl:if>
+  </xsl:variable>
+
+  <xsl:variable name="path">
+    <xsl:call-template name="dbhtml-attribute">
+      <xsl:with-param name="pis" select="$context/processing-instruction('dbhtml')"/>
+      <xsl:with-param name="attribute">dir</xsl:with-param>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:choose>
+    <xsl:when test="$path = ''">
+      <xsl:if test="$ppath != ''">
+        <xsl:value-of select="$ppath"/>
+      </xsl:if>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:if test="$ppath != ''">
+        <xsl:value-of select="$ppath"/>
+        <xsl:text>/</xsl:text>
+      </xsl:if>
+      <xsl:value-of select="$path"/>
+      <xsl:text>/</xsl:text>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
 
 <!-- ==================================================================== -->