]> granicus.if.org Git - docbook-dsssl/commitdiff
Add templates for generating CSS files and links to them.
authorBob Stayton <bobs@sagehill.net>
Thu, 10 Dec 2009 22:34:22 +0000 (22:34 +0000)
committerBob Stayton <bobs@sagehill.net>
Thu, 10 Dec 2009 22:34:22 +0000 (22:34 +0000)
xsl/html/html.xsl

index b12a33ac5b6bbfb25c4747c118220b3c2e34ec02..1f420598a2c5841119b16be16b72912f8cb96af8 100644 (file)
   </xsl:choose>
 </xsl:template>
 
+<!-- ==================================================================== -->
+<!-- Insert link to css or insert literal CSS in head element -->
+<xsl:template name="generate.css">
+  <xsl:choose>
+    <xsl:when test="$generate.css.header = 0">
+      <xsl:call-template name="generate.css.links"/>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:call-template name="generate.css.headers"/>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.css.headers">
+  <xsl:call-template name="generate.default.css.header"/>
+  <xsl:call-template name="generate.custom.css.header"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.header">
+  <xsl:if test="$make.clean.html != 0 and 
+                $docbook.css.source != ''">
+    <!-- Select default file relative to stylesheet -->
+    <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+    <xsl:call-template name="output.css.header">
+      <xsl:with-param name="css.node" select="$css.node"/>
+    </xsl:call-template>
+  </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.header">
+  <xsl:if test="$custom.css.source != ''">
+    <!-- Select custom file relative to document -->
+    <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+    <xsl:call-template name="output.css.header">
+      <xsl:with-param name="css.node" select="$css.node"/>
+    </xsl:call-template>
+  </xsl:if>
+</xsl:template>
+
+<xsl:template name="output.css.header">
+  <xsl:param name="css.node"/> 
+
+  <xsl:choose>
+    <xsl:when test="count($css.node) = 0">
+    </xsl:when>
+    <xsl:otherwise>
+      <style type="text/css">
+        <xsl:copy-of select="$css.node/text()"/>
+      </style>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="generate.css.links">
+  <xsl:call-template name="generate.default.css.link"/>
+  <xsl:call-template name="generate.custom.css.link"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.link">
+  <xsl:if test="$make.clean.html != 0 and 
+                $docbook.css.link != 0 and
+                $docbook.css.source != ''">
+    <xsl:variable name="filename">
+      <xsl:call-template name="css.output.filename">
+        <xsl:with-param name="src" select="$docbook.css.source"/>
+      </xsl:call-template>
+    </xsl:variable>
+
+    <xsl:call-template name="make.css.link">
+      <xsl:with-param name="css.filename" select="$filename"/>
+    </xsl:call-template>
+  </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.link">
+  <xsl:if test="$custom.css.source != ''">
+    <xsl:variable name="filename">
+      <xsl:call-template name="css.output.filename">
+        <xsl:with-param name="src" select="$custom.css.source"/>
+      </xsl:call-template>
+    </xsl:variable>
+
+    <xsl:call-template name="make.css.link">
+      <xsl:with-param name="css.filename" select="$filename"/>
+    </xsl:call-template>
+  </xsl:if>
+</xsl:template>
+
+<!-- a CSS link reference must take into account the relative
+     path to a CSS file when chunked HTML is output to more than one directory -->
+<xsl:template name="make.css.link">
+  <xsl:param name="css.filename" select="''"/>
+
+  <xsl:variable name="href.to.uri" select="$css.filename"/>
+
+  <xsl:variable name="href.from.uri">
+    <xsl:call-template name="href.target.uri">
+      <xsl:with-param name="object" select="."/>
+    </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>href is <xsl:value-of select="$href"/></xsl:message>
+
+  <xsl:if test="string-length($css.filename) != 0">
+    <link rel="stylesheet" 
+          type="text/css"
+          href="{$href}"/>
+  </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="generate.css.files">
+  <xsl:call-template name="generate.default.css.file"/>
+  <xsl:call-template name="generate.custom.css.file"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.file">
+  <xsl:if test="$make.clean.html != 0 and 
+                $generate.css.header = 0 and
+                $docbook.css.source != ''">
+    <!-- Select default file relative to stylesheet -->
+    <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+    <xsl:call-template name="generate.css.file">
+      <xsl:with-param name="src" select="$docbook.css.source"/>
+      <xsl:with-param name="css.node" select="$css.node"/>
+    </xsl:call-template>
+  </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.file">
+  <xsl:if test="$custom.css.source != '' and
+                $generate.css.header = 0">
+    <!-- Select custom file relative to document -->
+    <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+    <xsl:call-template name="generate.css.file">
+      <xsl:with-param name="src" select="$custom.css.source"/>
+      <xsl:with-param name="css.node" select="$css.node"/>
+    </xsl:call-template>
+  </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.css.file">
+  <xsl:param name="css.node"/> 
+  <xsl:param name="src" select="''"/> 
+
+  <xsl:variable name="css.text" select="$css.node/text()"/>
+
+  <xsl:choose>
+    <xsl:when test="count($css.node) = 0">
+      <xsl:message>
+        <xsl:text>ERROR: no root element for CSS source file'</xsl:text>
+        <xsl:value-of select="$src"/>
+        <xsl:text>'.</xsl:text>
+      </xsl:message>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:variable name="filename">
+        <xsl:call-template name="css.output.pathname">
+          <xsl:with-param name="src" select="$src"/>
+          <xsl:with-param name="content" select="$css.node"/>
+        </xsl:call-template>
+      </xsl:variable>
+
+      <xsl:call-template name="write.text.chunk">
+        <xsl:with-param name="filename" select="$filename"/>
+        <xsl:with-param name="content" select="$css.text"/>
+      </xsl:call-template>
+
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template name="css.output.filename">
+  <xsl:param name="content"/>
+  <xsl:param name="src" select="''"/>
+  
+  <xsl:variable name="candidate">
+    <xsl:choose>
+      <xsl:when test="string-length($src) = 0">
+        <xsl:message>
+          <xsl:text>ERROR: missing CSS input filename.</xsl:text>
+        </xsl:message>
+      </xsl:when>
+      <xsl:when test="substring($src,string-length($src)-3) = '.xml'">
+        <xsl:value-of select="substring($src, 1, string-length($src) - 4)"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:value-of select="$src"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+  <xsl:value-of select="$candidate"/>
+</xsl:template>
+
+<xsl:template name="css.output.pathname">
+  <xsl:param name="content"/>
+  <xsl:param name="src" select="''"/>
+
+  <xsl:variable name="file">
+    <xsl:call-template name="css.output.filename">
+      <xsl:with-param name="content" select="$content"/>
+      <xsl:with-param name="src" select="$src"/>
+    </xsl:call-template>
+  </xsl:variable>
+
+  <xsl:variable name="path" select="concat($base.dir, $file)"/>
+  <xsl:value-of select="$path"/>
+  
+</xsl:template>
+
 </xsl:stylesheet>