This file is part of the DITA Open Toolkit project hosted on
Sourceforge.net. See the accompanying license.txt file for
applicable licenses.
(c) Copyright IBM Corp. 2007, 2009 All Rights Reserved.
Updates:
20090421 robander: Updated so that "flagrules" in all templates
specifies a default. Can simplify calls from other XSL
to these templates, with a slight trade-off in processing
time. Default for "conflictexist" simplifies XSL
elsewhere with no processing trade-off.
========== Flagging with flags & revisions ==========
Single template to set flag variables, generate props and revision flagging, and output
contents. Can be used by any element that does not use any markup between flags and contents.
Single template to set the background style, flag based on props and revisions, and output
contents. Can be used by any element that does not use any markup between flags and contents.
Flags - based on audience, product, platform, and otherprops in the source
AND prop elements in the val file:
Flag the text with the artwork from the val file & insert the ALT text from the val file.
For multiple attr values, output each flag in turn.
<xsl:template name="getrules-parent"><xsl:variable name="domains"><xsl:value-of select="normalize-space(ancestor::*[contains(@class,' topic/topic ')][1]/@domains)"/></xsl:variable><xsl:variable name="props"><xsl:if test="contains($domains, 'a(props')"><xsl:value-of select="normalize-space(substring-before(substring-after($domains,'a(props'), ')'))"/></xsl:if></xsl:variable><!-- Test for the flagging attributes on the parent.
If found and if the filterfile name was passed in,
call 'gen-prop' with the values to use. Otherwise return --><xsl:if test="../@audience and not($FILTERFILE='')"><xsl:call-template name="gen-prop"><xsl:with-param name="flag-att" select="'audience'"/><xsl:with-param name="flag-att-val" select="../@audience"/></xsl:call-template></xsl:if><xsl:if test="../@platform and not($FILTERFILE='')"><xsl:call-template name="gen-prop"><xsl:with-param name="flag-att" select="'platform'"/><xsl:with-param name="flag-att-val" select="../@platform"/></xsl:call-template></xsl:if><xsl:if test="../@product and not($FILTERFILE='')"><xsl:call-template name="gen-prop"><xsl:with-param name="flag-att" select="'product'"/><xsl:with-param name="flag-att-val" select="../@product"/></xsl:call-template></xsl:if><xsl:if test="../@otherprops and not($FILTERFILE='')"><xsl:call-template name="gen-prop"><xsl:with-param name="flag-att" select="'otherprops'"/><xsl:with-param name="flag-att-val" select="../@otherprops"/></xsl:call-template></xsl:if><xsl:if test="../@rev and not(@rev) and not($FILTERFILE='')"><xsl:call-template name="gen-prop"><xsl:with-param name="flag-att" select="'rev'"/><xsl:with-param name="flag-att-val" select="../@rev"/></xsl:call-template></xsl:if><xsl:if test="not($props='') and not($FILTERFILE='')"><xsl:call-template name="ext-getrules-parent"><xsl:with-param name="props" select="$props"/></xsl:call-template></xsl:if></xsl:template>
<xsl:template name="gen-prop"><xsl:param name="flag-att"/><!-- attribute name --><xsl:param name="flag-att-val"/><!-- content of attribute --><!-- Determine the first flag value, which is the value before the first space --><xsl:variable name="firstflag"><xsl:choose><xsl:when test="contains($flag-att-val,' ')"><xsl:value-of select="substring-before($flag-att-val,' ')"/></xsl:when><xsl:otherwise><!-- no space, one value --><xsl:value-of select="$flag-att-val"/></xsl:otherwise></xsl:choose></xsl:variable><!-- Determine the other flag values, after the first space --><xsl:variable name="moreflags"><xsl:choose><xsl:when test="contains($flag-att-val,' ')"><xsl:value-of select="substring-after($flag-att-val,' ')"/></xsl:when><xsl:otherwise/><!-- no space, one value --></xsl:choose></xsl:variable><xsl:choose><!-- Ensure there's an image to get, otherwise don't insert anything --><xsl:when test="$flag-att='rev' and $FILTERDOC/val/revprop[@val=$firstflag][@action='flag']"><xsl:copy-of select="$FILTERDOC/val/revprop[@val=$firstflag][@action='flag']"/></xsl:when><xsl:when test="$FILTERDOC/val/prop[@att=$flag-att][@val=$firstflag][@action='flag']"><xsl:copy-of select="$FILTERDOC/val/prop[@att=$flag-att][@val=$firstflag][@action='flag']"/></xsl:when><!-- Added by William on 2009-06-01 for flag process start--><xsl:when test="$FILTERDOC/val/prop[@att=$flag-att][not(@val=$firstflag)][@action='flag']"><xsl:for-each select="$FILTERDOC/val/prop[@att=$flag-att][not(@val=$firstflag)][@action='flag']"><!-- get the val --><xsl:variable name="val"><xsl:apply-templates select="." mode="getVal"/></xsl:variable><!-- get the backcolor --><xsl:variable name="backcolor"><xsl:apply-templates select="." mode="getBgcolor"/></xsl:variable><!-- get the color --><xsl:variable name="color"><xsl:apply-templates select="." mode="getColor"/></xsl:variable><!-- get the style --><xsl:variable name="style"><xsl:apply-templates select="." mode="getStyle"/></xsl:variable><!-- get child node --><xsl:variable name="childnode"><xsl:apply-templates select="." mode="getChildNode"/></xsl:variable><!-- get the location of schemekeydef.xml --><xsl:variable name="KEYDEF-FILE"><xsl:value-of select="concat($WORKDIR,$PATH2PROJ,'schemekeydef.xml')"/></xsl:variable><!--keydef.xml contains the val --><xsl:if test="(document($KEYDEF-FILE, /)//*[@keys=$val])"><!-- copy needed elements --><xsl:apply-templates select="(document($KEYDEF-FILE, /)//*[@keys=$val])" mode="copy-element"><xsl:with-param name="att" select="$flag-att"/><xsl:with-param name="bgcolor" select="$backcolor"/><xsl:with-param name="fcolor" select="$color"/><xsl:with-param name="style" select="$style"/><xsl:with-param name="value" select="$val"/><xsl:with-param name="flag" select="$firstflag"/><xsl:with-param name="childnodes" select="$childnode"/></xsl:apply-templates></xsl:if></xsl:for-each></xsl:when><!-- Added by William on 2009-06-01 for flag process end--><xsl:otherwise/><!-- that flag not active --></xsl:choose><!-- keep testing other values --><xsl:choose><xsl:when test="string-length($moreflags)>0"><!-- more values - call it again with remaining values --><xsl:call-template name="gen-prop"><xsl:with-param name="flag-att"><xsl:value-of select="$flag-att"/></xsl:with-param><xsl:with-param name="flag-att-val"><xsl:value-of select="$moreflags"/></xsl:with-param></xsl:call-template></xsl:when><xsl:otherwise/><!-- no more values --></xsl:choose></xsl:template>
Template
*copy-element
Documentation
Description
Added by William on 2009-06-01 for flag process start
<xsl:template match="*" mode="copy-element"><xsl:param name="att"/><xsl:param name="bgcolor"/><xsl:param name="fcolor"/><xsl:param name="style"/><xsl:param name="value"/><xsl:param name="flag"/><xsl:param name="cvffilename" select="@source"/><xsl:param name="childnodes"/><!--get the location of dita.xml.properties--><xsl:variable name="PROPERTIES-FILE"><xsl:value-of select="concat($WORKDIR,$PATH2PROJ,'subject_scheme.dictionary')"/></xsl:variable><!-- get the scheme list --><!-- check CURRENT File --><xsl:variable name="editedFileName"><xsl:call-template name="checkFile"><xsl:with-param name="in" select="$CURRENTFILE"/></xsl:call-template></xsl:variable><xsl:variable name="schemeList"><xsl:apply-templates select="document($PROPERTIES-FILE,/)//*[@key=$editedFileName]" mode="check"/></xsl:variable><!-- scheme list contains the scheme file --><xsl:if test="contains($schemeList, $cvffilename)"><!-- get the path of scheme file --><xsl:variable name="submfile"><xsl:value-of select="$cvffilename"/><xsl:text>.subm</xsl:text></xsl:variable><xsl:variable name="cvffilepath"><xsl:value-of select="concat($WORKDIR,$PATH2PROJ,$submfile)"/></xsl:variable><xsl:if test="document($cvffilepath,/)//*[@keys=$value]//*[@keys=$flag]"><!-- copy the child node for flag and just copy the first element whose keys=$flag--><!--xsl:for-each select="document($cvffilepath,/)//*[@keys=$value]/*"--><xsl:for-each select="document($cvffilepath,/)//*[@keys=$value]//*[@keys=$flag][1]"><xsl:element name="prop"><xsl:attribute name="att"><xsl:value-of select="$att"/></xsl:attribute><xsl:attribute name="val"><xsl:value-of select="@keys"/></xsl:attribute><xsl:attribute name="action"><xsl:value-of select="'flag'"/></xsl:attribute><xsl:attribute name="backcolor"><xsl:value-of select="$bgcolor"/></xsl:attribute><xsl:attribute name="color"><xsl:value-of select="$fcolor"/></xsl:attribute><xsl:attribute name="style"><xsl:value-of select="$style"/></xsl:attribute><xsl:copy-of select="$childnodes"/></xsl:element></xsl:for-each></xsl:if></xsl:if></xsl:template>
<xsl:template name="checkFile"><xsl:param name="in"/><xsl:choose><xsl:when test="starts-with($in, '.\')"><xsl:value-of select="substring-after($in, '.\')"/></xsl:when><!-- The file dir passed in by ant cannot by none --><xsl:when test="starts-with($in, './')"><xsl:value-of select="substring-after($in, './')"/></xsl:when><xsl:otherwise><xsl:value-of select="$in"/></xsl:otherwise></xsl:choose></xsl:template>
<xsl:template name="revstyle"><xsl:param name="flagrules"><xsl:call-template name="getrules"/></xsl:param><xsl:param name="revvalue"/><xsl:choose><xsl:when test="not($flagrules)"><!-- $flagrules was not passed in, so the call must be looking for the deprecated template --><xsl:call-template name="revstyle-deprecated"/></xsl:when><xsl:when test="exsl:node-set($flagrules)/revprop[@color or @backcolor]"><xsl:variable name="conflictexist"><xsl:call-template name="conflict-check"><xsl:with-param name="flagrules" select="$flagrules"/></xsl:call-template></xsl:variable><font><xsl:call-template name="gen-style"/><xsl:apply-templates/></font></xsl:when><xsl:otherwise><xsl:variable name="revcolor"><xsl:call-template name="find-active-rev-style"><!-- get 1st active rev color --><xsl:with-param name="allrevs" select="$revvalue"/></xsl:call-template></xsl:variable><xsl:choose><xsl:when test="string-length($revcolor)>0"><!-- if there's a value, there's an active color --><font><xsl:attribute name="color"><xsl:value-of select="$revcolor"/></xsl:attribute><xsl:apply-templates/></font></xsl:when><xsl:otherwise><xsl:apply-templates/><!-- no active rev color - just apply templates --></xsl:otherwise></xsl:choose></xsl:otherwise></xsl:choose></xsl:template>
<xsl:template name="start-revision-flag"><xsl:param name="flagrules"><xsl:call-template name="getrules"/></xsl:param><xsl:variable name="biditest"><xsl:call-template name="bidi-area"/></xsl:variable><xsl:choose><xsl:when test="not($flagrules)"><!-- $flagrules was not passed in, so the call must be looking for the deprecated template --><xsl:call-template name="start-revision-flag-deprecated"/></xsl:when><xsl:when test="$biditest='bidi'"><xsl:choose><xsl:when test="exsl:node-set($flagrules)/revprop[startflag or endflag]"><!-- new ditaval standard --><xsl:call-template name="end-revflagit"><xsl:with-param name="flagrules" select="$flagrules"/></xsl:call-template></xsl:when><xsl:otherwise><!-- old ditaval standard --><xsl:call-template name="start-rev-art"><!-- BIDI, use English end graphic for start of change--><xsl:with-param name="deltaname" select="'deltaend.gif'"/></xsl:call-template></xsl:otherwise></xsl:choose></xsl:when><xsl:otherwise><xsl:choose><xsl:when test="exsl:node-set($flagrules)/revprop[startflag or endflag]"><!-- new ditaval standard --><xsl:call-template name="start-revflagit"><xsl:with-param name="flagrules" select="$flagrules"/></xsl:call-template></xsl:when><xsl:otherwise><!-- old ditaval standard --><xsl:call-template name="start-rev-art"><!-- Not BIDI, use English start graphic --><xsl:with-param name="deltaname" select="'delta.gif'"/></xsl:call-template></xsl:otherwise></xsl:choose></xsl:otherwise></xsl:choose></xsl:template>
<xsl:template name="end-revision-flag"><xsl:param name="flagrules"><xsl:call-template name="getrules"/></xsl:param><xsl:variable name="biditest"><xsl:call-template name="bidi-area"/></xsl:variable><xsl:choose><xsl:when test="not($flagrules)"><!-- $flagrules was not passed in, so the call must be looking for the deprecated template --><xsl:call-template name="end-revision-flag-deprecated"/></xsl:when><xsl:when test="$biditest='bidi'"><xsl:choose><xsl:when test="exsl:node-set($flagrules)/revprop[startflag or endflag]"><!-- new ditaval standard --><xsl:call-template name="start-revflagit"><xsl:with-param name="flagrules" select="$flagrules"/></xsl:call-template></xsl:when><xsl:otherwise><!-- old ditaval standard --><xsl:call-template name="end-rev-art"><!-- BIDI, use English start graphic for end of change--><xsl:with-param name="deltaname" select="'delta.gif'"/></xsl:call-template></xsl:otherwise></xsl:choose></xsl:when><xsl:otherwise><xsl:choose><xsl:when test="exsl:node-set($flagrules)/revprop[startflag or endflag]"><!-- new ditaval standard --><xsl:call-template name="end-revflagit"><xsl:with-param name="flagrules" select="$flagrules"/></xsl:call-template></xsl:when><xsl:otherwise><!-- old ditaval standard --><xsl:call-template name="end-rev-art"><!-- Not BIDI, use English end graphic --><xsl:with-param name="deltaname" select="'deltaend.gif'"/></xsl:call-template></xsl:otherwise></xsl:choose></xsl:otherwise></xsl:choose></xsl:template>
<xsl:template name="find-active-rev-flag"><xsl:param name="allrevs"/><!-- Determine the first rev value, which is the value before the first space --><xsl:variable name="firstrev"><xsl:choose><xsl:when test="contains($allrevs,' ')"><xsl:value-of select="substring-before($allrevs,' ')"/></xsl:when><xsl:otherwise><!-- no space, one value --><xsl:value-of select="$allrevs"/></xsl:otherwise></xsl:choose></xsl:variable><!-- Determine the other rev value, after the first space --><xsl:variable name="morerevs"><xsl:choose><xsl:when test="contains($allrevs,' ')"><xsl:value-of select="substring-after($allrevs,' ')"/></xsl:when><xsl:otherwise/><!-- no space, one value --></xsl:choose></xsl:variable><xsl:choose><xsl:when test="$FILTERDOC/val/revprop[@val=$firstrev][@action='flag']"><xsl:value-of select="1"/><!-- rev active --></xsl:when><xsl:otherwise><!-- rev not active --><!-- keep testing other values --><xsl:choose><xsl:when test="string-length($morerevs)>0"><!-- more values - call it again with remaining values --><xsl:call-template name="find-active-rev-flag"><xsl:with-param name="allrevs"><xsl:value-of select="$morerevs"/></xsl:with-param></xsl:call-template></xsl:when><xsl:otherwise><!-- no more values - none found --><xsl:value-of select="0"/></xsl:otherwise></xsl:choose></xsl:otherwise></xsl:choose></xsl:template>
Template
find-active-rev-style
Documentation
Description
Use @rev to find the first active styled revision.
Return color setting when active.
Return null for non-active.
<xsl:template name="find-active-rev-style"><xsl:param name="allrevs"/><!-- Determine the first rev value, which is the value before the first space --><xsl:variable name="firstrev"><xsl:choose><xsl:when test="contains($allrevs,' ')"><xsl:value-of select="substring-before($allrevs,' ')"/></xsl:when><xsl:otherwise><!-- no space, one value --><xsl:value-of select="$allrevs"/></xsl:otherwise></xsl:choose></xsl:variable><!-- Determine the other rev value, after the first space --><xsl:variable name="morerevs"><xsl:choose><xsl:when test="contains($allrevs,' ')"><xsl:value-of select="substring-after($allrevs,' ')"/></xsl:when><xsl:otherwise/><!-- no space, one value --></xsl:choose></xsl:variable><xsl:choose><xsl:when test="$FILTERDOC/val/revprop[@val=$firstrev]/@style"><!-- rev active --><xsl:value-of select="$FILTERDOC/val/revprop[@val=$firstrev]/@style"/></xsl:when><xsl:otherwise><!-- rev not active --><!-- keep testing other values --><xsl:choose><xsl:when test="string-length($morerevs)>0"><!-- more values - call it again with remaining values --><xsl:call-template name="find-active-rev-style"><xsl:with-param name="allrevs"><xsl:value-of select="$morerevs"/></xsl:with-param></xsl:call-template></xsl:when><xsl:otherwise/><!-- no more values - none found --></xsl:choose></xsl:otherwise></xsl:choose></xsl:template>
<xsl:template match="prop|revprop" mode="conflict-check"><xsl:param name="color"/><xsl:param name="backcolor"/><xsl:choose><xsl:when test="(@color and @color!='' and $color!='' and $color!=@color)or(@backcolor and @backcolor!='' and $backcolor!='' and $backcolor!=@backcolor)"><xsl:value-of select="'true'"/></xsl:when><xsl:when test="following-sibling::*"><xsl:apply-templates select="following-sibling::*[1]" mode="conflict-check"><xsl:with-param name="color" select="@color"/><xsl:with-param name="backcolor" select="@backcolor"/></xsl:apply-templates></xsl:when><xsl:otherwise><xsl:value-of select="'false'"/></xsl:otherwise></xsl:choose></xsl:template>
Template
gen-style
Documentation
Description
Currently, gen-style is never called without conflictexist in the OT
code, so the default is never used. If we replace the default with the
default code used elsewhere, then most or all calls to gen-style can be
simplified.
<xsl:template name="gen-style"><xsl:param name="flagrules"><xsl:call-template name="getrules"/></xsl:param><xsl:param name="conflictexist"><xsl:call-template name="conflict-check"><xsl:with-param name="flagrules" select="$flagrules"/></xsl:call-template></xsl:param><xsl:variable name="validstyle"><!-- This variable is used to prevent using pre-OASIS or unrecognized ditaval styles --><xsl:if test="$conflictexist='false' and exsl:node-set($flagrules)/*[@style]"><xsl:choose><xsl:when test="exsl:node-set($flagrules)/*/@style='italics'">YES</xsl:when><xsl:when test="exsl:node-set($flagrules)/*/@style='bold'">YES</xsl:when><xsl:when test="exsl:node-set($flagrules)/*/@style='underline'">YES</xsl:when><xsl:when test="exsl:node-set($flagrules)/*/@style='double-underline'">YES</xsl:when><xsl:when test="exsl:node-set($flagrules)/*/@style='overline'">YES</xsl:when></xsl:choose></xsl:if></xsl:variable><xsl:choose><xsl:when test="$conflictexist='true' and $FILTERDOC/val/style-conflict[@foreground-conflict-color or @background-conflict-color]"><xsl:apply-templates select="." mode="ditamsg:conflict-text-style-applied"/><xsl:attribute name="style"><xsl:if test="$FILTERDOC/val/style-conflict[@foreground-conflict-color]"><xsl:text>color:</xsl:text><xsl:value-of select="$FILTERDOC/val/style-conflict/@foreground-conflict-color"/><xsl:text>;</xsl:text></xsl:if><xsl:if test="$FILTERDOC/val/style-conflict[@background-conflict-color]"><xsl:text>background-color:</xsl:text><xsl:value-of select="$FILTERDOC/val/style-conflict/@background-conflict-color"/><xsl:text>;</xsl:text></xsl:if></xsl:attribute></xsl:when><xsl:when test="$conflictexist='false' and (exsl:node-set($flagrules)/*[@color or @backcolor] or $validstyle='YES')"><xsl:attribute name="style"><xsl:if test="exsl:node-set($flagrules)/*[@color]"><xsl:text>color:</xsl:text><xsl:value-of select="exsl:node-set($flagrules)/*[@color]/@color"/><xsl:text>;</xsl:text></xsl:if><xsl:if test="exsl:node-set($flagrules)/*[@backcolor]"><xsl:text>background-color:</xsl:text><xsl:value-of select="exsl:node-set($flagrules)/*[@backcolor]/@backcolor"/><xsl:text>;</xsl:text></xsl:if><xsl:if test="exsl:node-set($flagrules)/*/@style='italics'"><xsl:text>font-style:italic;</xsl:text></xsl:if><xsl:if test="exsl:node-set($flagrules)/*/@style='bold'"><xsl:text>font-weight:bold;</xsl:text></xsl:if><xsl:if test="exsl:node-set($flagrules)/*/@style='underline' or exsl:node-set($flagrules)/*/@style='double-underline'"><!-- For double-underline, style="border-bottom: 3px double;" seems to work
in some cases, but not in all. For now, treat it as underline. --><xsl:text>text-decoration:underline;</xsl:text></xsl:if><xsl:if test="exsl:node-set($flagrules)/*/@style='overline'"><xsl:text>text-decoration:overline;</xsl:text></xsl:if></xsl:attribute></xsl:when></xsl:choose></xsl:template>
<xsl:template match="prop" mode="end-flagit"><xsl:choose><!-- Ensure there's an image to get, otherwise don't insert anything --><xsl:when test="endflag/@imageref"><xsl:variable name="imgsrc" select="endflag/@imageref"/><img><xsl:attribute name="src"><xsl:if test="string-length($PATH2PROJ) > 0"><xsl:value-of select="$PATH2PROJ"/></xsl:if><!--
<xsl:call-template name="get-file-name">
<xsl:with-param name="file-path" select="$imgsrc"/>
</xsl:call-template>
--><xsl:value-of select="$imgsrc"/></xsl:attribute><xsl:if test="endflag/alt-text"><xsl:attribute name="alt"><xsl:value-of select="endflag/alt-text"/></xsl:attribute></xsl:if></img></xsl:when><xsl:when test="endflag/alt-text"><xsl:value-of select="endflag/alt-text"/></xsl:when><!-- not necessary to add logic for @img. original ditaval does not support end flag. --><xsl:otherwise/><!-- that flag not active --></xsl:choose><xsl:apply-templates select="preceding-sibling::prop[1]" mode="end-flagit"/></xsl:template>