| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 | <?xml version='1.0'?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                xmlns:exsl="http://exslt.org/common"                xmlns:ng="http://docbook.org/docbook-ng"                xmlns:db="http://docbook.org/ns/docbook"                xmlns:xlink="http://www.w3.org/1999/xlink"                exclude-result-prefixes="db ng exsl xlink"                version='1.0'><!-- ********************************************************************     $Id: endnotes.xsl 8703 2010-07-06 20:57:06Z nwalsh $     ********************************************************************     This file is part of the XSL DocBook Stylesheet distribution.     See ../README or http://docbook.sf.net/release/xsl/current/ for     copyright and other information.     ******************************************************************** --><!-- ==================================================================== --><!-- * --><!-- * The templates in this file handle elements whose contents can't --><!-- * be displayed completely within the main text flow in output, but --><!-- * instead need to be displayed "out of line". Those elements are: --><!-- * --><!-- *   - elements providing annotative text (annotation|alt|footnote) --><!-- *   - elements pointing at external resources (ulink, link, and --><!-- *     any elements with xlink:href attributes; and imagedata, --><!-- *     audiodata, and videodata - which (using their fileref --><!-- *     attribute) reference external files --><!-- * --><!-- * Within this stylesheet, the above are collectively referred to as --><!-- * a "notesources". This stylesheet handles those notesources in --><!-- * this way: --><!-- * --><!-- * 1. Constructs a numbered in-memory index of all unique "earmarks“ --><!-- *    of all notesources in the document. For each link, the --><!-- *    earmark is the value of its url or xlink:href attribute; for --><!-- *    each imagedata|audiodata|videodata: the value of its fileref --><!-- *    attribute; for each annotative element: its content. --><!-- * --><!-- *    Notesources with the same earmark are assigned the same --><!-- *    number. --><!-- * --><!-- *    By design, that index excludes any element whose string value --><!-- *    is identical to the value of its url xlink:href attribute). --><!-- * --><!-- * 2. Puts a numbered marker inline to mark the place where the --><!-- *    notesource occurs in the main text flow. --><!-- * --><!-- * 3. Generates a numbered endnotes list (titled NOTES in English) --><!-- *    at the end of the man page, with the contents of each --><!-- *    notesource. --><!-- * --><!-- * Note that table footnotes are not listed in the endnotes list, --><!-- * and are not handled by this stylesheet (they are instead handled --><!-- * by the table.xsl stylesheet). --><!-- * --><!-- * Also, we don't get notesources in *info sections or Refmeta or --><!-- * Refnamediv or Indexterm, because, in manpages output, contents of --><!-- * those are either suppressed or are displayed out of document --><!-- * order - for example, the Info/Author content gets moved to the --><!-- * end of the page. So, if we were to number notesources in the --><!-- * Author content, it would "throw off" the numbering at the --><!-- * beginning of the main text flow. --><!-- * --><!-- * And for the record, one reason we don't use xsl:key to index the --><!-- * earmarks is that we need to get and check the sets of --><!-- * earmarks for uniqueness per-Refentry (not per-document). --><!-- * --><!-- * FIXME: --><!-- * as with "repeat" URLS, alt instances that have the same string value --><!-- * as preceding ones (likely to occur for repeat acroynyms and --><!-- * abbreviations) should be listed only once in the endnotes list, --><!-- * and numbered accordingly inline; split man.indent.width into --><!-- * man.indent.width.value (default 4) and man.indent.width.units --><!-- * (default n); also, if the first child of notesource is some block --><!-- * content other than a (non-formal) paragraph, the current code --><!-- * will probably end up generating a blank line after the --><!-- * corresponding number in the endnotes list... we should probably --><!-- * try to instead display the title of that block content there (if --><!-- * there is one: e.g., the list title, admonition title, etc.) --><!-- ==================================================================== --><xsl:template name="get.all.earmark.indexes.in.current.document">  <!-- * Here we create a tree to hold indexes of all earmarks in -->  <!-- * the current document. If the current document contains -->  <!-- * multiple refentry instances, then this tree will contain -->  <!-- * multiple indexes. -->  <xsl:if test="$man.endnotes.are.numbered != 0">    <!-- * Only create earmark indexes if user wants numbered endnotes -->    <xsl:for-each select="//refentry">      <earmark.index>        <xsl:attribute name="idref">          <xsl:value-of select="generate-id()"/>        </xsl:attribute>        <xsl:for-each            select=".//*[self::*[@xlink:href]                    or self::ulink                    or self::imagedata                    or self::audiodata                    or self::videodata                    or self::footnote[not(ancestor::table)]                    or self::annotation                    or self::alt]                    [(node()                      or self::imagedata                      or self::audiodata                      or self::videodata                      )                    and not(ancestor::refentryinfo)                    and not(ancestor::info)                    and not(ancestor::docinfo)                    and not(ancestor::refmeta)                    and not(ancestor::refnamediv)                    and not(ancestor::indexterm)                    and not(. = @url)                    and not(. = @xlink:href)                    and not(@url =                    preceding::ulink[node()                    and not(ancestor::refentryinfo)                    and not(ancestor::info)                    and not(ancestor::docinfo)                    and not(ancestor::refmeta)                    and not(ancestor::refnamediv)                    and not(ancestor::indexterm)                    and (generate-id(ancestor::refentry)                    = generate-id(current()))]/@url)                    and not(@xlink:href =                    preceding::*[@xlink:href][node()                    and not(ancestor::refentryinfo)                    and not(ancestor::info)                    and not(ancestor::docinfo)                    and not(ancestor::refmeta)                    and not(ancestor::refnamediv)                    and not(ancestor::indexterm)                    and (generate-id(ancestor::refentry)                    = generate-id(current()))]/@xlink:href)                    and not(@fileref =                    preceding::*[@fileref][                    not(ancestor::refentryinfo)                    and not(ancestor::info)                    and not(ancestor::docinfo)                    and not(ancestor::refmeta)                    and not(ancestor::refnamediv)                    and not(ancestor::indexterm)                    and (generate-id(ancestor::refentry)                    = generate-id(current()))]/@fileref)]">          <earmark>            <xsl:attribute name="id">              <xsl:value-of select="generate-id()"/>            </xsl:attribute>            <xsl:attribute name="number">              <xsl:value-of select="position()"/>            </xsl:attribute>            <xsl:if test="@url|@xlink:href|@fileref">              <!-- * Only add a uri attribute if the notesource is -->              <!-- * a link or an element that references an external -->              <!-- * (an imagedata, audiodata, or videodata element) -->              <xsl:attribute name="uri">                <xsl:value-of select="@url|@xlink:href|@fileref"/>              </xsl:attribute>            </xsl:if>            <xsl:copy>              <xsl:copy-of select="node()"/>            </xsl:copy>          </earmark>        </xsl:for-each>      </earmark.index>    </xsl:for-each>  </xsl:if></xsl:template><!-- ==================================================================== --><xsl:template match="*[@xlink:href]|ulink  |imagedata|audiodata|videodata  |footnote[not(ancestor::table)]  |annotation|alt">  <xsl:variable name="refname" select="ancestor::refentry/refnamediv[1]/refname[1]"/>  <xsl:variable name="all.earmark.indexes.in.current.document.rtf">    <xsl:call-template name="get.all.earmark.indexes.in.current.document"/>  </xsl:variable>  <xsl:variable name="all.earmark.indexes.in.current.document"                select="exsl:node-set($all.earmark.indexes.in.current.document.rtf)"/>  <xsl:variable name="all.earmarks.in.current.refentry.rtf">    <!-- * get the set of all earmarks for the ancestor Refentry of -->    <!-- * this notesource -->    <xsl:copy-of        select="$all.earmark.indexes.in.current.document/earmark.index                [@idref =                generate-id(current()/ancestor::refentry)]/earmark"/>  </xsl:variable>  <xsl:variable name="all.earmarks.in.current.refentry"                select="exsl:node-set($all.earmarks.in.current.refentry.rtf)"/>  <!-- * identify the earmark for the current element -->  <xsl:variable name="earmark">    <xsl:choose>      <xsl:when test="@url|@xlink:href">        <xsl:value-of select="@url|@xlink:href"/>      </xsl:when>      <xsl:when test="@fileref">        <xsl:value-of select="@fileref"/>      </xsl:when>      <xsl:otherwise>        <xsl:value-of select="generate-id()"/>      </xsl:otherwise>    </xsl:choose>  </xsl:variable>  <xsl:variable name="notesource.number">    <!-- * Get the number for this notesource -->    <!-- * -->    <!-- * If this is an imagedata, audiodata, or videodata element -->    <!-- * OR if it's a non-empty element AND its string value is not -->    <!-- * equal to the value of its url or xlink:href attribute (if -->    <!-- * it has one) AND user wants endnotes numbered, only then -->    <!-- * do we output a number for it -->    <xsl:if test="(self::imagedata or      self::audiodata or      self::videodata or      (node()      and not(. = @url)      and not(. = @xlink:href))      )      and $man.endnotes.are.numbered != 0">      <!-- * To select the number for this notesource, we -->      <!-- * check the index of all earmarks for the current refentry -->      <!-- * and find the number of the indexed earmark which matches -->      <!-- * this notesource's earmark. -->      <!-- * Note that multiple notesources may share the same -->      <!-- * numbered earmark; in that case, they get the same number. -->      <!-- * -->      <xsl:choose>        <xsl:when test="self::ulink or          self::*[@xlink:href] or          self::imagedata or          self::audiodata or          self::videodata">          <xsl:value-of select="$all.earmarks.in.current.refentry/earmark[@uri = $earmark]/@number"/>        </xsl:when>        <xsl:otherwise>          <xsl:value-of select="$all.earmarks.in.current.refentry/earmark[@id  = $earmark]/@number"/>        </xsl:otherwise>      </xsl:choose>    </xsl:if>  </xsl:variable>  <xsl:variable name="notesource.contents">    <xsl:choose>      <!-- * check to see if the element is empty or not -->      <xsl:when test="node()">        <!-- * this is a non-empty node, so process its contents -->        <xsl:apply-templates/>        <xsl:if test="../footnote or ../annotation">          <!-- * if this element is a footnote or annotation, we need to -->          <!-- * do some further checking on it, so we can emit warnings -->          <!-- * about potential problems -->        <xsl:for-each select="node()">          <xsl:if test="local-name() != 'para' and                        local-name() != 'simpara' and                        local-name() !=''">            <!-- * for each node we find as a child of a footnote or -->            <!-- * annotation, if it's not a para or a text node, emit a -->            <!-- * warning... because in manpages output, we can't render -->            <!-- * block-level child content of an endnote properly unless -->            <!-- * it's wrapped in a para that has some "prefatory" text -->            <xsl:variable name="parent-name" select="local-name(..)"/>            <xsl:variable name="endnote-number">              <xsl:call-template name="pad-string">                <!-- * endnote number may be 2 digits, so pad it with a space -->                <!-- * if we have only 1 digit -->                <xsl:with-param name="padVar" select="concat('#',$notesource.number)"/>                <xsl:with-param name="length" select="3"/>              </xsl:call-template>            </xsl:variable>            <xsl:call-template name="log.message">              <xsl:with-param name="level">Warn</xsl:with-param>              <xsl:with-param name="source" select="$refname"/>              <xsl:with-param name="context-desc">                <xsl:text>endnote </xsl:text>                <xsl:value-of select="$endnote-number"/>              </xsl:with-param>              <xsl:with-param name="message">                <xsl:text>Bad: </xsl:text>                <xsl:value-of select="$parent-name"/>                 <!-- * figure out which occurance of this element type this -->                <!-- * instance is and output a number in square brackets so -->                <!-- * that end-user can know which element to fix -->                <xsl:text>[</xsl:text>                <xsl:value-of select="count(preceding::*[local-name() = $parent-name]) + 1"/>                <xsl:text>]</xsl:text>                <xsl:text> in source</xsl:text>              </xsl:with-param>            </xsl:call-template>            <xsl:call-template name="log.message">              <xsl:with-param name="level">Note</xsl:with-param>              <xsl:with-param name="source" select="$refname"/>              <xsl:with-param name="context-desc">                <xsl:text>endnote </xsl:text>                <xsl:value-of select="$endnote-number"/>              </xsl:with-param>              <xsl:with-param name="message">                <xsl:text>Has: </xsl:text>                <xsl:value-of select="$parent-name"/>                 <xsl:text>/</xsl:text>                <xsl:value-of select="local-name(.)"/>              </xsl:with-param>            </xsl:call-template>            <xsl:call-template name="log.message">              <xsl:with-param name="level">Note</xsl:with-param>              <xsl:with-param name="source" select="$refname"/>              <xsl:with-param name="context-desc">                <xsl:text>endnote </xsl:text>                <xsl:value-of select="$endnote-number"/>              </xsl:with-param>              <xsl:with-param name="message">                <xsl:text>Fix: </xsl:text>                <xsl:value-of select="$parent-name"/>                 <xsl:text>/</xsl:text>                <xsl:text>para/</xsl:text>                <xsl:value-of select="local-name(.)"/>              </xsl:with-param>            </xsl:call-template>          </xsl:if>        </xsl:for-each>      </xsl:if>      </xsl:when>      <xsl:otherwise>        <!-- * Otherwise this is an empty link or an empty imagedata, -->        <!-- * audiodata, or videodata element, so we just get the -->        <!-- * value of its url, xlink:href, or fileref attribute. -->        <xsl:if test="$man.hyphenate.urls = 0          and $man.break.after.slash = 0">          <!-- * Add hyphenation suppression in URL output only if -->          <!-- * break.after.slash is also non-zero -->          <xsl:call-template name="suppress.hyphenation"/>          <xsl:text>\%</xsl:text>        </xsl:if>        <xsl:value-of select="$earmark"/>      </xsl:otherwise>    </xsl:choose>  </xsl:variable>  <xsl:if test="self::ulink or self::*[@xlink:href]">    <xsl:variable name="link.wrapper">      <xsl:value-of select="normalize-space($notesource.contents)"/>    </xsl:variable>    <xsl:text>\m[blue]</xsl:text>    <!-- * This is a hyperlink, so we need to determine if the user wants -->    <!-- * font formatting applied to it, and if so, what font -->    <xsl:choose>      <xsl:when test="$man.font.links = 'B'">        <xsl:call-template name="bold">          <xsl:with-param name="node" select="exsl:node-set($link.wrapper)"/>          <xsl:with-param name="context" select="."/>        </xsl:call-template>      </xsl:when>      <xsl:when test="$man.font.links = 'I'">        <xsl:call-template name="italic">          <xsl:with-param name="node" select="exsl:node-set($link.wrapper)"/>          <xsl:with-param name="context" select="."/>        </xsl:call-template>      </xsl:when>      <xsl:when test="$man.font.links = ''">        <!-- * if man.font.links is empty, user doesn't want links -->        <!-- * underlined, so just display content -->        <xsl:value-of select="$notesource.contents"/>      </xsl:when>      <xsl:otherwise>        <!-- * otherwise the user has specified an unsupported value for -->        <!-- * man.font.links, so emit a warning and don't apply any font -->        <!-- * formatting -->        <xsl:message>          <xsl:call-template name="log.message">            <xsl:with-param name="level">Warn</xsl:with-param>            <xsl:with-param name="source" select="$refname"/>            <xsl:with-param name="context-desc">              <xsl:text>link font</xsl:text>            </xsl:with-param>            <xsl:with-param name="message">              <xsl:text>invalid $man.font.links value: </xsl:text>              <xsl:text>'</xsl:text>              <xsl:value-of select="$man.font.links"/>              <xsl:text>'</xsl:text>            </xsl:with-param>          </xsl:call-template>        </xsl:message>        <xsl:value-of select="$notesource.contents"/>      </xsl:otherwise>    </xsl:choose>    <xsl:text>\m[]</xsl:text>  </xsl:if>  <xsl:if test="$notesource.number != ''">    <!-- * Format the number by placing it in square brackets. -->    <!-- * Also, set the number in font-size -2, and superscripted (\u -->    <!-- * means to move up half a line vertically) -->    <xsl:text>\&\s-2\u[</xsl:text>    <xsl:value-of select="$notesource.number"/>    <xsl:text>]\d\s+2</xsl:text>    <!-- * Revert superscripting (\d means to move down half a line), and -->    <!-- * move the font-size back to what it was before. -->    <!-- * Note that the reason for the \& before the opening bracket -->    <!-- * is to prevent any possible linebreak from being introduced -->    <!-- * between the opening bracket and the following text. -->  </xsl:if></xsl:template><!-- ==================================================================== --><xsl:template name="endnotes.list">  <!-- We have stored earmark indexes for all refentry instances in the -->  <!-- current document, with the ID for each index being the same ID as -->  <!-- its corresponding refentry; so we now need to get the ID for the -->  <!-- current refentry so we can grab its corresponding earmark index -->  <xsl:variable name="current.refentry.id">    <xsl:value-of select="generate-id(.)"/>  </xsl:variable>  <xsl:variable name="endnotes.rtf">    <xsl:variable name="all.earmark.indexes.in.current.document.rtf">      <xsl:call-template  name="get.all.earmark.indexes.in.current.document"/>    </xsl:variable>    <xsl:variable name="all.earmark.indexes.in.current.document"                  select="exsl:node-set($all.earmark.indexes.in.current.document.rtf)"/>      <xsl:copy-of          select="$all.earmark.indexes.in.current.document/earmark.index                  [@idref = $current.refentry.id]/earmark"/>  </xsl:variable>  <xsl:variable name="endnotes" select="exsl:node-set($endnotes.rtf)"/>  <!-- * check to see if we have actually found any content to use as -->  <!-- * endnotes; if we have, we generate the endnotes list, if not, -->  <!-- * we do nothing -->  <xsl:if test="$endnotes/node()">    <xsl:call-template name="format.endnotes.list">      <xsl:with-param name="endnotes" select="$endnotes"/>    </xsl:call-template>  </xsl:if></xsl:template><!-- ==================================================================== --><xsl:template name="format.endnotes.list">  <xsl:param name="endnotes"/>  <!-- * ======= make the endnotes-list section heading ============= -->  <xsl:call-template name="make.subheading">    <xsl:with-param name="title">      <xsl:choose>        <!-- * if user has specified a heading, use that -->        <xsl:when test="$man.endnotes.list.heading != ''">          <xsl:value-of select="$man.endnotes.list.heading"/>        </xsl:when>        <xsl:otherwise>          <!-- * otherwise, get localized heading from gentext -->          <!-- * (in English, NOTES) -->          <xsl:call-template name="gentext">            <xsl:with-param name="key" select="'Notes'"/>          </xsl:call-template>        </xsl:otherwise>      </xsl:choose>    </xsl:with-param>  </xsl:call-template>  <!-- * ================ process each earmark ====================== -->  <xsl:for-each select="$endnotes/earmark">    <!-- * make paragraph with hanging indent, and starting with a -->    <!-- * number in the form " 1." (padded to $man.indent.width - 1) -->    <xsl:text>.IP</xsl:text>    <xsl:text> "</xsl:text>    <xsl:variable name="endnote.number">      <xsl:value-of select="@number"/>      <xsl:text>.</xsl:text>    </xsl:variable>    <xsl:call-template name="pad-string">      <xsl:with-param name="padVar" select="$endnote.number"/>      <!-- FIXME: the following assumes that $man.indent.width is in -->      <!-- en's; also, this should probably use $list.indent instead -->      <xsl:with-param name="length" select="$man.indent.width - 1"/>    </xsl:call-template>    <xsl:text>"</xsl:text>    <xsl:if test="not($list-indent = '')">      <xsl:text> </xsl:text>      <xsl:value-of select="$list-indent"/>    </xsl:if>    <xsl:text>
</xsl:text>    <!-- * ========================================================= -->    <!-- *           print the notesource/endnote contents -->    <!-- * ========================================================= -->    <xsl:choose>      <xsl:when test="*/node()">        <!-- * if the earmark has non-empty child content, then -->        <!-- * its corresponding notesource is either a link or -->        <!-- * an instance of annotative text, so we want to -->        <!-- * display that content -->        <xsl:choose>          <xsl:when test="*/node()[name(.)!='']">            <!-- * if node is not text only, then process it as-is -->            <xsl:apply-templates select="*/node()"/>          </xsl:when>          <xsl:otherwise>            <!-- * otherwise node is text-only, so normalize it -->            <xsl:value-of select="normalize-space(*/node())"/>          </xsl:otherwise>        </xsl:choose>      </xsl:when>      <xsl:otherwise>        <!-- * otherwise, this earmark has empty content, -->        <!-- * which means its corresponding notesource is an -->        <!-- * imagedata, audiodata, or videodata instance; in -->        <!-- * that case, we use the value of the notesource's -->        <!-- * @fileref attribute (which is stored in the -->        <!-- * earmark uri attribute) as the "contents" for -->        <!-- * this endnote/notesource -->        <xsl:call-template name="display.uri">          <xsl:with-param name="uri" select="@uri"/>        </xsl:call-template>      </xsl:otherwise>    </xsl:choose>    <xsl:text>
</xsl:text>    <!-- * ========================================================= -->    <!-- *           print the URL for links -->    <!-- * ========================================================= -->    <!-- * In addition to the notesource contents, if the -->    <!-- * notesource is a link, we display the URL for the link. -->    <!-- * But for notesources that are imagedata, audiodata, or -->    <!-- * videodata instances, we don't want to (re)display the -->    <!-- * URL for those here, because for those elements, the -->    <!-- * notesource contents are the URL (the value of the -->    <!-- * @fileref attribute), and we have already rendered them. -->    <!-- * -->    <!-- * We know an earmark is a link if it has non-empty child -->    <!-- * content and a uri attribute; so we check for that -->    <!-- * condition here. -->    <xsl:if test="*/node() and @uri">      <xsl:text>.RS</xsl:text>      <xsl:if test="not($list-indent = '')">        <xsl:text> </xsl:text>        <xsl:value-of select="$list-indent"/>      </xsl:if>      <xsl:text>
</xsl:text>      <!-- * Add hyphenation suppression in URL output only if -->      <!-- * $break.after.slash is also non-zero -->      <xsl:if test="$man.hyphenate.urls = 0                    and $man.break.after.slash = 0">        <xsl:call-template name="suppress.hyphenation"/>        <xsl:text>\%</xsl:text>      </xsl:if>      <xsl:call-template name="display.uri">        <xsl:with-param name="uri" select="@uri"/>      </xsl:call-template>      <xsl:text>
</xsl:text>      <xsl:text>.RE</xsl:text>      <xsl:text>
</xsl:text>    </xsl:if>  </xsl:for-each></xsl:template><xsl:template name="display.uri">  <xsl:param name="uri"/>  <xsl:choose>    <xsl:when test="contains($uri, ':')">      <!-- * if this URI contains a colon character, it’s probably -->      <!-- * an absolute URI with a scheme, so we output it as-is -->      <xsl:value-of select="$uri"/>    </xsl:when>    <xsl:otherwise>      <!-- * otherwise this is probably not an absolute URI, so we -->      <!-- * need to prepend $man.base.url.for.relative.links to -->      <!-- * give the URI some "context" in man-page output -->      <xsl:value-of        select="concat($man.base.url.for.relative.links, $uri)"/>    </xsl:otherwise>  </xsl:choose></xsl:template></xsl:stylesheet>
 |