diff options
Diffstat (limited to 'doc/src/sgml/stylesheet-html-common.xsl')
-rw-r--r-- | doc/src/sgml/stylesheet-html-common.xsl | 439 |
1 files changed, 439 insertions, 0 deletions
diff --git a/doc/src/sgml/stylesheet-html-common.xsl b/doc/src/sgml/stylesheet-html-common.xsl new file mode 100644 index 0000000..a368e0e --- /dev/null +++ b/doc/src/sgml/stylesheet-html-common.xsl @@ -0,0 +1,439 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE xsl:stylesheet [ +<!ENTITY % common.entities SYSTEM "http://docbook.sourceforge.net/release/xsl/current/common/entities.ent"> +%common.entities; +]> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0" + xmlns="http://www.w3.org/1999/xhtml"> + +<!-- + This file contains XSLT stylesheet customizations that are common to + all HTML output variants (chunked and single-page). + --> + +<!-- Parameters --> +<xsl:param name="make.valid.html" select="1"></xsl:param> +<xsl:param name="generate.id.attributes" select="1"></xsl:param> +<xsl:param name="make.graphic.viewport" select="0"/> +<xsl:param name="link.mailto.url">pgsql-docs@lists.postgresql.org</xsl:param> +<xsl:param name="toc.max.depth">2</xsl:param> +<xsl:param name="website.stylesheet" select="0"/> +<xsl:param name="custom.css.source"> + <xsl:if test="$website.stylesheet = 0">stylesheet.css.xml</xsl:if> +</xsl:param> +<xsl:param name="html.stylesheet"> + <xsl:if test="not($website.stylesheet = 0)">https://www.postgresql.org/media/css/docs-complete.css</xsl:if> +</xsl:param> + + +<!-- + The below allows the stylesheets provided by the website to be applied fully + to the generated HTML. + --> +<xsl:template name="body.attributes"> + <xsl:attribute name="id">docContent</xsl:attribute> + <xsl:attribute name="class">container-fluid col-10</xsl:attribute> +</xsl:template> + +<!-- Change display of some elements --> + +<xsl:template match="command"> + <xsl:call-template name="inline.monoseq"/> +</xsl:template> + +<xsl:template match="confgroup" mode="bibliography.mode"> + <span> + <xsl:call-template name="common.html.attributes"/> + <xsl:call-template name="id.attribute"/> + <xsl:apply-templates select="conftitle/text()" mode="bibliography.mode"/> + <xsl:text>, </xsl:text> + <xsl:apply-templates select="confdates/text()" mode="bibliography.mode"/> + <xsl:copy-of select="$biblioentry.item.separator"/> + </span> +</xsl:template> + +<xsl:template match="isbn" mode="bibliography.mode"> + <span> + <xsl:call-template name="common.html.attributes"/> + <xsl:call-template name="id.attribute"/> + <xsl:text>ISBN </xsl:text> + <xsl:apply-templates mode="bibliography.mode"/> + <xsl:copy-of select="$biblioentry.item.separator"/> + </span> +</xsl:template> + + +<!-- table of contents configuration --> + +<xsl:param name="generate.toc"> +appendix toc,title +article/appendix nop +article toc,title +book toc,title +chapter toc,title +part toc,title +preface toc,title +qandadiv toc +qandaset toc +reference toc,title +sect1 toc +sect2 toc +sect3 toc +sect4 toc +sect5 toc +section toc +set toc,title +</xsl:param> + +<xsl:param name="generate.section.toc.level" select="1"></xsl:param> + +<!-- include refentry under sect1 in tocs --> +<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|refentry + |bridgehead[$bridgehead.in.toc != 0]"/> + </xsl:call-template> +</xsl:template> + + +<!-- Put index "quicklinks" (A | B | C | ...) at the top of the bookindex page. --> + +<!-- from html/autoidx.xsl --> + +<xsl:template name="generate-basic-index"> + <xsl:param name="scope" select="NOTANODE"/> + + <xsl:variable name="role"> + <xsl:if test="$index.on.role != 0"> + <xsl:value-of select="@role"/> + </xsl:if> + </xsl:variable> + + <xsl:variable name="type"> + <xsl:if test="$index.on.type != 0"> + <xsl:value-of select="@type"/> + </xsl:if> + </xsl:variable> + + <xsl:variable name="terms" + select="//indexterm + [count(.|key('letter', + translate(substring(&primary;, 1, 1), + &lowercase;, + &uppercase;)) + [&scope;][1]) = 1 + and not(@class = 'endofrange')]"/> + + <xsl:variable name="alphabetical" + select="$terms[contains(concat(&lowercase;, &uppercase;), + substring(&primary;, 1, 1))]"/> + + <xsl:variable name="others" select="$terms[not(contains(concat(&lowercase;, + &uppercase;), + substring(&primary;, 1, 1)))]"/> + + <!-- pgsql-docs: added xmlns:xlink, autoidx.xsl doesn't include xlink in + exclude-result-prefixes. Without our customization that just leads to a + single xmlns:xlink in this div, but because we emit it it otherwise + gets pushed down to the elements output by autoidx.xsl --> + <div class="index" xmlns:xlink="http://www.w3.org/1999/xlink"> + <p class="indexdiv-quicklinks"> + <a href="#indexdiv-Symbols"> + <xsl:call-template name="gentext"> + <xsl:with-param name="key" select="'index symbols'"/> + </xsl:call-template> + </a> + <xsl:apply-templates select="$alphabetical[count(.|key('letter', + translate(substring(&primary;, 1, 1), + &lowercase;,&uppercase;))[&scope;][1]) = 1]" + mode="index-div-quicklinks"> + <xsl:with-param name="position" select="position()"/> + <xsl:with-param name="scope" select="$scope"/> + <xsl:with-param name="role" select="$role"/> + <xsl:with-param name="type" select="$type"/> + <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/> + </xsl:apply-templates> + </p> + <!-- pgsql-docs: end added stuff --> + + <xsl:if test="$others"> + <xsl:choose> + <xsl:when test="normalize-space($type) != '' and + $others[@type = $type][count(.|key('primary', &primary;)[&scope;][1]) = 1]"> + <!-- pgsql-docs: added id attribute here for linking to it --> + <div class="indexdiv" id="indexdiv-Symbols"> + <h3> + <xsl:call-template name="gentext"> + <xsl:with-param name="key" select="'index symbols'"/> + </xsl:call-template> + </h3> + <dl> + <xsl:apply-templates select="$others[count(.|key('primary', &primary;)[&scope;][1]) = 1]" + mode="index-symbol-div"> + <xsl:with-param name="position" select="position()"/> + <xsl:with-param name="scope" select="$scope"/> + <xsl:with-param name="role" select="$role"/> + <xsl:with-param name="type" select="$type"/> + <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/> + </xsl:apply-templates> + </dl> + </div> + </xsl:when> + <xsl:when test="normalize-space($type) != ''"> + <!-- Output nothing, as there isn't a match for $other using this $type --> + </xsl:when> + <xsl:otherwise> + <!-- pgsql-docs: added id attribute here for linking to it --> + <div class="indexdiv" id="indexdiv-Symbols"> + <h3> + <xsl:call-template name="gentext"> + <xsl:with-param name="key" select="'index symbols'"/> + </xsl:call-template> + </h3> + <dl> + <xsl:apply-templates select="$others[count(.|key('primary', + &primary;)[&scope;][1]) = 1]" + mode="index-symbol-div"> + <xsl:with-param name="position" select="position()"/> + <xsl:with-param name="scope" select="$scope"/> + <xsl:with-param name="role" select="$role"/> + <xsl:with-param name="type" select="$type"/> + <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/> + </xsl:apply-templates> + </dl> + </div> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + + <xsl:apply-templates select="$alphabetical[count(.|key('letter', + translate(substring(&primary;, 1, 1), + &lowercase;,&uppercase;))[&scope;][1]) = 1]" + mode="index-div-basic"> + <xsl:with-param name="position" select="position()"/> + <xsl:with-param name="scope" select="$scope"/> + <xsl:with-param name="role" select="$role"/> + <xsl:with-param name="type" select="$type"/> + <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/> + </xsl:apply-templates> + </div> +</xsl:template> + +<xsl:template match="indexterm" mode="index-div-basic"> + <xsl:param name="scope" select="."/> + <xsl:param name="role" select="''"/> + <xsl:param name="type" select="''"/> + + <xsl:variable name="key" + select="translate(substring(&primary;, 1, 1), + &lowercase;,&uppercase;)"/> + + <xsl:if test="key('letter', $key)[&scope;] + [count(.|key('primary', &primary;)[&scope;][1]) = 1]"> + <div class="indexdiv"> + <!-- pgsql-docs: added id attribute here for linking to it --> + <xsl:attribute name="id"> + <xsl:value-of select="concat('indexdiv-', $key)"/> + </xsl:attribute> + + <xsl:if test="contains(concat(&lowercase;, &uppercase;), $key)"> + <h3> + <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/> + </h3> + </xsl:if> + <dl> + <xsl:apply-templates select="key('letter', $key)[&scope;] + [count(.|key('primary', &primary;) + [&scope;][1])=1]" + mode="index-primary"> + <xsl:with-param name="position" select="position()"/> + <xsl:with-param name="scope" select="$scope"/> + <xsl:with-param name="role" select="$role"/> + <xsl:with-param name="type" select="$type"/> + <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/> + </xsl:apply-templates> + </dl> + </div> + </xsl:if> +</xsl:template> + +<!-- pgsql-docs --> +<xsl:template match="indexterm" mode="index-div-quicklinks"> + <xsl:param name="scope" select="."/> + <xsl:param name="role" select="''"/> + <xsl:param name="type" select="''"/> + + <xsl:variable name="key" + select="translate(substring(&primary;, 1, 1), + &lowercase;,&uppercase;)"/> + + <xsl:if test="key('letter', $key)[&scope;] + [count(.|key('primary', &primary;)[&scope;][1]) = 1]"> + <xsl:if test="contains(concat(&lowercase;, &uppercase;), $key)"> + | + <a> + <xsl:attribute name="href"> + <xsl:value-of select="concat('#indexdiv-', $key)"/> + </xsl:attribute> + <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/> + </a> + </xsl:if> + </xsl:if> +</xsl:template> + + +<!-- upper case HTML anchors for backward compatibility --> + +<xsl:template name="object.id"> + <xsl:param name="object" select="."/> + <xsl:choose> + <xsl:when test="$object/@id"> + <xsl:value-of select="translate($object/@id, &lowercase;, &uppercase;)"/> + </xsl:when> + <xsl:when test="$object/@xml:id"> + <xsl:value-of select="$object/@xml:id"/> + </xsl:when> + <xsl:when test="$generate.consistent.ids != 0"> + <!-- Make $object the current node --> + <xsl:for-each select="$object"> + <xsl:text>id-</xsl:text> + <xsl:number level="multiple" count="*"/> + </xsl:for-each> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="generate-id($object)"/> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + + +<!-- Add an id link to each section heading. --> + +<!-- from html/sections.xsl --> +<xsl:template name="section.heading"> + <xsl:param name="section" select="."/> + <xsl:param name="level" select="1"/> + <xsl:param name="allow-anchors" select="1"/> + <xsl:param name="title"/> + <xsl:param name="class" select="'title'"/> + + <xsl:variable name="id"> + <xsl:choose> + <!-- Make sure the subtitle doesn't get the same id as the title --> + <xsl:when test="self::subtitle"> + <xsl:call-template name="object.id"> + <xsl:with-param name="object" select="."/> + </xsl:call-template> + </xsl:when> + <!-- if title is in an *info wrapper, get the grandparent --> + <xsl:when test="contains(local-name(..), 'info')"> + <xsl:call-template name="object.id"> + <xsl:with-param name="object" select="../.."/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="object.id"> + <xsl:with-param name="object" select=".."/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <!-- HTML H level is one higher than section level --> + <xsl:variable name="hlevel"> + <xsl:choose> + <!-- highest valid HTML H level is H6; so anything nested deeper + than 5 levels down just becomes H6 --> + <xsl:when test="$level > 5">6</xsl:when> + <xsl:otherwise> + <xsl:value-of select="$level + 1"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml"> + <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute> + <xsl:if test="$css.decoration != '0'"> + <xsl:if test="$hlevel<3"> + <xsl:attribute name="style">clear: both</xsl:attribute> + </xsl:if> + </xsl:if> + <xsl:if test="$allow-anchors != 0"> + <xsl:call-template name="anchor"> + <xsl:with-param name="node" select="$section"/> + <xsl:with-param name="conditional" select="0"/> + </xsl:call-template> + </xsl:if> + <xsl:copy-of select="$title"/> + <!-- pgsql-docs: begin --> + <xsl:call-template name="pg.id.link"> + <xsl:with-param name="object" select="$section"/> + </xsl:call-template> + <!-- pgsql-docs: end --> + </xsl:element> +</xsl:template> + + +<!-- Add an id link after the last term of a varlistentry. --> + +<!-- overrides html/lists.xsl --> +<xsl:template match="varlistentry/term"> + <xsl:apply-imports/> + + <!-- Add the link after the last term --> + <xsl:if test="position() = last()"> + <xsl:call-template name="pg.id.link"> + <xsl:with-param name="object" select="parent::varlistentry"/> + </xsl:call-template> + </xsl:if> +</xsl:template> + + +<!-- Create a link pointing to an id within the document --> +<xsl:template name="pg.id.link"> + <xsl:param name="object" select="."/> + <xsl:choose> + <xsl:when test="$object/@id or $object/@xml:id"> + <xsl:text> </xsl:text> + <a> + <xsl:attribute name="href"> + <xsl:text>#</xsl:text> + <xsl:call-template name="object.id"> + <xsl:with-param name="object" select="$object"/> + </xsl:call-template> + </xsl:attribute> + <xsl:attribute name="class"> + <xsl:text>id_link</xsl:text> + </xsl:attribute> + <xsl:text>#</xsl:text> + </a> + </xsl:when> + <xsl:otherwise> + <!-- Only complain about varlistentries if at least one entry in + the list has an id --> + <xsl:if test="name($object) != 'varlistentry' + or $object/parent::variablelist/varlistentry[@id]"> + <xsl:message terminate="yes"> + <xsl:text>ERROR: id attribute missing on <</xsl:text> + <xsl:value-of select ="name($object)"/> + <xsl:text>> element under </xsl:text> + <xsl:for-each select="$object/ancestor::*"> + <xsl:text>/</xsl:text> + <xsl:value-of select ="name(.)"/> + <xsl:if test="@id|@xml:id"> + <xsl:text>[@</xsl:text> + <xsl:value-of select ="name(@id|@xml:id)"/> + <xsl:text> = '</xsl:text> + <xsl:value-of select ="@id"/> + <xsl:text>']</xsl:text> + </xsl:if> + </xsl:for-each> + </xsl:message> + </xsl:if> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +</xsl:stylesheet> |