]> granicus.if.org Git - docbook-dsssl/commitdiff
Add support for sorting glossary entries
authorBob Stayton <bobs@sagehill.net>
Sat, 6 Jan 2007 18:14:40 +0000 (18:14 +0000)
committerBob Stayton <bobs@sagehill.net>
Sat, 6 Jan 2007 18:14:40 +0000 (18:14 +0000)
xsl/fo/glossary.xsl
xsl/fo/param.ent
xsl/fo/param.xweb

index 00f44e8cf0febbaaa3ea070785cb1d61affaf9af..4fc922416581a7861dd341103260fa33ebca951e 100644 (file)
@@ -1,4 +1,8 @@
 <?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:fo="http://www.w3.org/1999/XSL/Format"
                 version='1.0'>
     </xsl:choose>
   </xsl:variable>
 
+  <xsl:variable name="language">
+    <xsl:call-template name="l10n.language"/>
+  </xsl:variable>
+
   <fo:block id="{$id}">
     <xsl:call-template name="glossary.titlepage"/>
   </fo:block>
         <fo:list-block provisional-distance-between-starts="{$width}"
                        provisional-label-separation="{$glossterm.separation}"
                        xsl:use-attribute-sets="normal.para.spacing">
-          <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+          <xsl:choose>
+            <xsl:when test="$glossary.sort != 0">
+              <xsl:apply-templates select="$entries" mode="glossary.as.list">
+                <xsl:sort lang="{$language}"
+                          select="translate(glossterm, &lowercase;, 
+                                            &uppercase;)"/>
+              </xsl:apply-templates>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+            </xsl:otherwise>
+          </xsl:choose>
         </fo:list-block>
       </xsl:if>
     </xsl:when>
     <xsl:when test="$presentation = 'blocks'">
       <xsl:apply-templates select="$divs" mode="glossary.as.blocks"/>
-      <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+      <xsl:choose>
+        <xsl:when test="$glossary.sort != 0">
+          <xsl:apply-templates select="$entries" mode="glossary.as.blocks">
+            <xsl:sort lang="{$language}"
+                      select="translate(glossterm, &lowercase;, 
+                                        &uppercase;)"/>
+          </xsl:apply-templates>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+        </xsl:otherwise>
+      </xsl:choose>
     </xsl:when>
     <xsl:when test="$glossary.as.blocks != 0">
       <xsl:apply-templates select="$divs" mode="glossary.as.blocks"/>
-      <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+      <xsl:choose>
+        <xsl:when test="$glossary.sort != 0">
+          <xsl:apply-templates select="$entries" mode="glossary.as.blocks">
+            <xsl:sort lang="{$language}"
+                      select="translate(glossterm, &lowercase;, 
+                                        &uppercase;)"/>
+          </xsl:apply-templates>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+        </xsl:otherwise>
+      </xsl:choose>
     </xsl:when>
     <xsl:otherwise>
       <xsl:apply-templates select="$divs" mode="glossary.as.list">
         <fo:list-block provisional-distance-between-starts="{$width}"
                        provisional-label-separation="{$glossterm.separation}"
                        xsl:use-attribute-sets="normal.para.spacing">
-          <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+          <xsl:choose>
+            <xsl:when test="$glossary.sort != 0">
+              <xsl:apply-templates select="$entries" mode="glossary.as.list">
+                <xsl:sort lang="{$language}"
+                          select="translate(glossterm, &lowercase;, 
+                                            &uppercase;)"/>
+              </xsl:apply-templates>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+            </xsl:otherwise>
+          </xsl:choose>
         </fo:list-block>
       </xsl:if>
     </xsl:otherwise>
     <xsl:attribute name="language">
       <xsl:call-template name="l10n.language"/>
     </xsl:attribute>
+
     <xsl:attribute name="format">
       <xsl:call-template name="page.number.format">
         <xsl:with-param name="master-reference" select="$master-reference"/>
     </xsl:choose>
   </xsl:variable>
 
+  <xsl:variable name="language">
+    <xsl:call-template name="l10n.language"/>
+  </xsl:variable>
+
   <xsl:if test="title or info/title">
     <xsl:apply-templates select="(title|info/title)[1]" mode="list.title.mode"/>
   </xsl:if>
       <fo:list-block provisional-distance-between-starts="{$width}"
                      provisional-label-separation="{$glossterm.separation}"
                      xsl:use-attribute-sets="normal.para.spacing">
-        <xsl:apply-templates mode="glossary.as.list" select="glossentry"/>
+        <xsl:choose>
+          <xsl:when test="$glossary.sort != 0">
+            <xsl:apply-templates select="glossentry" mode="glossary.as.list">
+              <xsl:sort lang="{$language}"
+                        select="translate(glossterm, &lowercase;, 
+                                          &uppercase;)"/>
+            </xsl:apply-templates>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:apply-templates select="glossentry" mode="glossary.as.list"/>
+          </xsl:otherwise>
+        </xsl:choose>
       </fo:list-block>
     </xsl:when>
     <xsl:when test="$presentation = 'blocks'">
-      <xsl:apply-templates mode="glossary.as.blocks" select="glossentry"/>
+      <xsl:choose>
+        <xsl:when test="$glossary.sort != 0">
+          <xsl:apply-templates select="glossentry" mode="glossary.as.blocks">
+            <xsl:sort lang="{$language}"
+                      select="translate(glossterm, &lowercase;, 
+                                        &uppercase;)"/>
+          </xsl:apply-templates>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select="glossentry" mode="glossary.as.blocks"/>
+        </xsl:otherwise>
+      </xsl:choose>
     </xsl:when>
     <xsl:when test="$glosslist.as.blocks != 0">
-      <xsl:apply-templates mode="glossary.as.blocks" select="glossentry"/>
+      <xsl:choose>
+        <xsl:when test="$glossary.sort != 0">
+          <xsl:apply-templates select="glossentry" mode="glossary.as.blocks">
+            <xsl:sort lang="{$language}"
+                      select="translate(glossterm, &lowercase;, 
+                                        &uppercase;)"/>
+          </xsl:apply-templates>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select="glossentry" mode="glossary.as.blocks"/>
+        </xsl:otherwise>
+      </xsl:choose>
     </xsl:when>
     <xsl:otherwise>
       <fo:list-block provisional-distance-between-starts="{$width}"
                      provisional-label-separation="{$glossterm.separation}"
                      xsl:use-attribute-sets="normal.para.spacing">
-        <xsl:apply-templates mode="glossary.as.list" select="glossentry"/>
+        <xsl:choose>
+          <xsl:when test="$glossary.sort != 0">
+            <xsl:apply-templates select="glossentry" mode="glossary.as.list">
+              <xsl:sort lang="{$language}"
+                        select="translate(glossterm, &lowercase;, 
+                                          &uppercase;)"/>
+            </xsl:apply-templates>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:apply-templates select="glossentry" mode="glossary.as.list"/>
+          </xsl:otherwise>
+        </xsl:choose>
       </fo:list-block>
     </xsl:otherwise>
   </xsl:choose>
     </xsl:choose>
   </xsl:variable>
 
+  <xsl:variable name="language">
+    <xsl:call-template name="l10n.language"/>
+  </xsl:variable>
+
   <xsl:if test="$glossary.collection = ''">
     <xsl:message>
       <xsl:text>Warning: processing automatic glossary </xsl:text>
           <fo:list-block provisional-distance-between-starts="{$width}"
                          provisional-label-separation="{$glossterm.separation}"
                          xsl:use-attribute-sets="normal.para.spacing">
-            <xsl:for-each select="$collection//glossentry">
-              <xsl:variable name="cterm" select="glossterm"/>
-              <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
-                <xsl:apply-templates select="." mode="auto-glossary-as-list"/>
-              </xsl:if>
-            </xsl:for-each>
+            <xsl:choose>
+              <xsl:when test="$glossary.sort != 0">
+                <xsl:for-each select="$collection//glossentry">
+                  <xsl:sort lang="{$language}"
+                            select="translate(glossterm, &lowercase;, 
+                                              &uppercase;)"/>
+                  <xsl:variable name="cterm" select="glossterm"/>
+                  <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+                    <xsl:apply-templates select="." 
+                                         mode="auto-glossary-as-list"/>
+                  </xsl:if>
+                </xsl:for-each>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:for-each select="$collection//glossentry">
+                  <xsl:variable name="cterm" select="glossterm"/>
+                  <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+                    <xsl:apply-templates select="." 
+                                         mode="auto-glossary-as-list"/>
+                  </xsl:if>
+                </xsl:for-each>
+              </xsl:otherwise>
+            </xsl:choose>
           </fo:list-block>
         </xsl:when>
-        <xsl:when test="$presentation = 'blocks'">
-          <xsl:for-each select="$collection//glossentry">
-            <xsl:variable name="cterm" select="glossterm"/>
-            <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
-              <xsl:apply-templates select="." mode="auto-glossary-as-blocks"/>
-            </xsl:if>
-          </xsl:for-each>
-        </xsl:when>
-        <xsl:when test="$glossary.as.blocks != 0">
-          <xsl:for-each select="$collection//glossentry">
-            <xsl:variable name="cterm" select="glossterm"/>
-            <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
-              <xsl:apply-templates select="." mode="auto-glossary-as-blocks"/>
-            </xsl:if>
-          </xsl:for-each>
+        <xsl:when test="$presentation = 'blocks' or
+                        $glossary.as.blocks != 0">
+          <xsl:choose>
+            <xsl:when test="$glossary.sort != 0">
+              <xsl:for-each select="$collection//glossentry">
+                <xsl:sort lang="{$language}"
+                          select="translate(glossterm, &lowercase;, 
+                                            &uppercase;)"/>
+                <xsl:variable name="cterm" select="glossterm"/>
+                <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+                  <xsl:apply-templates select="." 
+                                       mode="auto-glossary-as-blocks"/>
+                </xsl:if>
+              </xsl:for-each>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:for-each select="$collection//glossentry">
+                <xsl:variable name="cterm" select="glossterm"/>
+                <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+                  <xsl:apply-templates select="." 
+                                       mode="auto-glossary-as-blocks"/>
+                </xsl:if>
+              </xsl:for-each>
+            </xsl:otherwise>
+          </xsl:choose>
         </xsl:when>
         <xsl:otherwise>
           <fo:list-block provisional-distance-between-starts="{$width}"
                          provisional-label-separation="{$glossterm.separation}"
                          xsl:use-attribute-sets="normal.para.spacing">
-            <xsl:for-each select="$collection//glossentry">
-              <xsl:variable name="cterm" select="glossterm"/>
-              <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
-                <xsl:apply-templates select="." mode="auto-glossary-as-list"/>
-              </xsl:if>
-            </xsl:for-each>
+            <xsl:choose>
+              <xsl:when test="$glossary.sort != 0">
+                <xsl:for-each select="$collection//glossentry">
+                  <xsl:sort lang="{$language}"
+                            select="translate(glossterm, &lowercase;, 
+                                              &uppercase;)"/>
+                  <xsl:variable name="cterm" select="glossterm"/>
+                  <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+                    <xsl:apply-templates select="." 
+                                         mode="auto-glossary-as-list"/>
+                  </xsl:if>
+                </xsl:for-each>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:for-each select="$collection//glossentry">
+                  <xsl:variable name="cterm" select="glossterm"/>
+                  <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+                    <xsl:apply-templates select="." 
+                                         mode="auto-glossary-as-list"/>
+                  </xsl:if>
+                </xsl:for-each>
+              </xsl:otherwise>
+            </xsl:choose>
           </fo:list-block>
         </xsl:otherwise>
       </xsl:choose>
 
 <xsl:template match="book/glossary[@role='auto']|
                      part/glossary[@role='auto']|
-                    /glossary[@role='auto']" priority="2.5">
+                     /glossary[@role='auto']" priority="2.5">
   <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
 
   <xsl:variable name="master-reference">
   <xsl:param name="width" select="$glossterm.width"/>
   <xsl:param name="terms" select="."/>
 
+  <xsl:variable name="language">
+    <xsl:call-template name="l10n.language"/>
+  </xsl:variable>
+
   <xsl:variable name="preamble"
                 select="*[not(self::title
                             or self::subtitle
   <fo:list-block provisional-distance-between-starts="{$width}"
                  provisional-label-separation="{$glossterm.separation}"
                  xsl:use-attribute-sets="normal.para.spacing">
-    <xsl:for-each select="glossentry">
-      <xsl:variable name="cterm" select="glossterm"/>
-      <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
-        <xsl:apply-templates select="." mode="auto-glossary-as-list"/>
-      </xsl:if>
-    </xsl:for-each>
+    <xsl:choose>
+      <xsl:when test="$glossary.sort != 0">
+        <xsl:for-each select="glossentry">
+          <xsl:sort lang="{$language}"
+                    select="translate(glossterm, &lowercase;, &uppercase;)"/>
+          <xsl:variable name="cterm" select="glossterm"/>
+          <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+            <xsl:apply-templates select="." mode="auto-glossary-as-list"/>
+          </xsl:if>
+        </xsl:for-each>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:for-each select="glossentry">
+          <xsl:variable name="cterm" select="glossterm"/>
+          <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+            <xsl:apply-templates select="." mode="auto-glossary-as-list"/>
+          </xsl:if>
+        </xsl:for-each>
+      </xsl:otherwise>
+    </xsl:choose>
   </fo:list-block>
 </xsl:template>
 
 <xsl:template match="glossdiv" mode="auto-glossary-as-blocks">
   <xsl:param name="terms" select="."/>
 
+  <xsl:variable name="language">
+    <xsl:call-template name="l10n.language"/>
+  </xsl:variable>
+
   <xsl:variable name="preamble"
                 select="*[not(self::title
                             or self::subtitle
 
   <xsl:apply-templates select="$preamble"/>
 
-  <xsl:for-each select="glossentry">
-    <xsl:variable name="cterm" select="glossterm"/>
-    <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
-      <xsl:apply-templates select="." mode="auto-glossary-as-blocks"/>
-    </xsl:if>
-  </xsl:for-each>
+  <xsl:choose>
+    <xsl:when test="$glossary.sort != 0">
+      <xsl:for-each select="glossentry">
+        <xsl:sort lang="{$language}"
+                  select="translate(glossterm, &lowercase;, &uppercase;)"/>
+        <xsl:variable name="cterm" select="glossterm"/>
+        <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+          <xsl:apply-templates select="." mode="auto-glossary-as-blocks"/>
+        </xsl:if>
+      </xsl:for-each>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:for-each select="glossentry">
+        <xsl:variable name="cterm" select="glossterm"/>
+        <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+          <xsl:apply-templates select="." mode="auto-glossary-as-blocks"/>
+        </xsl:if>
+      </xsl:for-each>
+    </xsl:otherwise>
+  </xsl:choose>
+
 </xsl:template>
 
 <xsl:template match="glossentry" mode="auto-glossary-as-blocks">
   <xsl:param name="width" select="$glossterm.width"/>
 
   <xsl:variable name="entries" select="glossentry"/>
+
+  <xsl:variable name="language">
+    <xsl:call-template name="l10n.language"/>
+  </xsl:variable>
+
   <xsl:variable name="preamble"
                 select="*[not(self::title
                             or self::subtitle
   <fo:list-block provisional-distance-between-starts="{$width}"
                  provisional-label-separation="{$glossterm.separation}"
                  xsl:use-attribute-sets="normal.para.spacing">
-    <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+    <xsl:choose>
+      <xsl:when test="$glossary.sort != 0">
+        <xsl:apply-templates select="$entries" mode="glossary.as.list">
+          <xsl:sort lang="{$language}"
+                    select="translate(glossterm, &lowercase;, 
+                                      &uppercase;)"/>
+        </xsl:apply-templates>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+      </xsl:otherwise>
+    </xsl:choose>
   </fo:list-block>
 </xsl:template>
 
@@ -583,13 +785,16 @@ GlossEntry ::=
           <xsl:when test="$glossentry.show.acronym = 'primary'">
             <xsl:choose>
               <xsl:when test="acronym|abbrev">
-                <xsl:apply-templates select="acronym|abbrev" mode="glossary.as.list"/>
+                <xsl:apply-templates select="acronym|abbrev" 
+                                     mode="glossary.as.list"/>
                 <xsl:text> (</xsl:text>
-                <xsl:apply-templates select="glossterm" mode="glossary.as.list"/>
+                <xsl:apply-templates select="glossterm" 
+                                     mode="glossary.as.list"/>
                 <xsl:text>)</xsl:text>
               </xsl:when>
               <xsl:otherwise>
-                <xsl:apply-templates select="glossterm" mode="glossary.as.list"/>
+                <xsl:apply-templates select="glossterm" 
+                                     mode="glossary.as.list"/>
               </xsl:otherwise>
             </xsl:choose>
           </xsl:when>
@@ -599,7 +804,8 @@ GlossEntry ::=
 
             <xsl:if test="acronym|abbrev">
               <xsl:text> (</xsl:text>
-              <xsl:apply-templates select="acronym|abbrev" mode="glossary.as.list"/>
+              <xsl:apply-templates select="acronym|abbrev" 
+                                   mode="glossary.as.list"/>
               <xsl:text>)</xsl:text>
             </xsl:if>
           </xsl:when>
@@ -754,11 +960,26 @@ GlossEntry ::=
                             or self::subtitle
                             or self::glossentry)]"/>
 
+  <xsl:variable name="language">
+    <xsl:call-template name="l10n.language"/>
+  </xsl:variable>
+
   <xsl:call-template name="glossdiv.titlepage"/>
 
   <xsl:apply-templates select="$preamble"/>
 
-  <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+  <xsl:choose>
+    <xsl:when test="$glossary.sort != 0">
+      <xsl:apply-templates select="$entries" mode="glossary.as.blocks">
+        <xsl:sort lang="{$language}"
+                  select="translate(glossterm, &lowercase;, 
+                                    &uppercase;)"/>
+      </xsl:apply-templates>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+    </xsl:otherwise>
+  </xsl:choose>
 </xsl:template>
 
 <!--
index aa3e51b3d893ac870541e3334c6f3a24f129ec12..8f8c316ef55f81895349f4fe2310e487ce061711 100644 (file)
 <!ENTITY insert.link.page.number SYSTEM "../params/insert.link.page.number.xml">
 <!ENTITY index.method SYSTEM "../params/index.method.xml">
 <!ENTITY reference.autolabel SYSTEM "../params/reference.autolabel.xml">
+<!ENTITY glossary.sort SYSTEM "../params/glossary.sort.xml">
index e794c62cc5bd544e1f5c63d9cbcae1eb502905b9..50800aad621871b19fe9d8246428732a6710c346 100644 (file)
@@ -218,6 +218,7 @@ generate.section.toc.level;
 &glossary.as.blocks;
 &glosslist.as.blocks;
 &glossentry.show.acronym;
+&glossary.sort;
 </reference>
 
 <reference id="misc"><title>Miscellaneous</title>
@@ -633,6 +634,7 @@ around all these parameters.</para>
 <src:fragref linkend="generate.toc.frag"/>
 <src:fragref linkend="glossary.as.blocks.frag"/>
 <src:fragref linkend="glossary.collection.frag"/>
+<src:fragref linkend="glossary.sort.frag"/>
 <src:fragref linkend="glossentry.show.acronym.frag"/>
 <src:fragref linkend="glosslist.as.blocks.frag"/>
 <src:fragref linkend="glossterm.auto.link.frag"/>