clean and mode-less param switching ideas

View: New views
3 Messages — Rating Filter:   Alert me  

clean and mode-less param switching ideas

by Shane Handford :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Does anyone have any ideas on how I could affect global stylesheet
params such as body.font.family for different sections of my output?

eg. a book in two parts - first and second parts use separate fonts.

saxon:assign is too risky and unpredictable.

I rather not recreate templates with modes to switch the font.

I'm probably going to fork out my code to use a different param based on
context.  Just wondering if anyone has any other suggestions.

Thanks !

~Shane

---------------------------------------------------------------------
To unsubscribe, e-mail: docbook-apps-unsubscribe@...
For additional commands, e-mail: docbook-apps-help@...


RE: clean and mode-less param switching ideas

by David Cramer (Tech Pubs) :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

You could put a <xsl:choose> inside the param and have different
<xsl:when>s for different contexts.

David

> -----Original Message-----
> From: Shane Handford [mailto:shandford@...]
> Sent: Wednesday, June 24, 2009 12:08 PM
> To: docbook-apps@...
> Subject: [docbook-apps] clean and mode-less param switching ideas
>
> Does anyone have any ideas on how I could affect global
> stylesheet params such as body.font.family for different
> sections of my output?
>
> eg. a book in two parts - first and second parts use separate fonts.
>
> saxon:assign is too risky and unpredictable.
>
> I rather not recreate templates with modes to switch the font.
>
> I'm probably going to fork out my code to use a different
> param based on context.  Just wondering if anyone has any
> other suggestions.
>
> Thanks !
>
> ~Shane
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: docbook-apps-unsubscribe@...
> For additional commands, e-mail:
> docbook-apps-help@...
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: docbook-apps-unsubscribe@...
For additional commands, e-mail: docbook-apps-help@...


Re: clean and mode-less param switching ideas

by Bob Stayton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

This can be done using a customization of the template named
'set.flow.properties' as well as a couple of attribute-sets.  Generally, the
body font is set in only a few places in an FO file.  The root.properties
attribute-set puts the font-family property on the fo:root element, which
makes it the font for all text not otherwise specified.   That means it is
applied to all page-sequences, unless one of them overrides it.  Setting the
font-family property on an fo:flow start tag in a page-sequence will
override the root font value.

First, let me mention that when resetting the XSL-FO font-family property,
just setting it to a new font name is generally not sufficient for handling
symbols.  Most fonts don't have all the symbols.  So the font-family
property should be set to a comma-separated font list that adds at least the
Symbol font, and possibly others.  The DocBook stylesheets use an internal
param named 'body.fontset' for that reason.  See this doc for more info:

http://www.sagehill.net/docbookxsl/SpecialChars.html#fontFamilyList

So I would suggest you create new params 'alt.body.font.family' and
'alt.body.fontset' to specify the font name and font list, respectively.
Then you can use the new fontset in the customized templates and
attribute-sets.

Here is a sample customization that detects when a part element has a
role="part2" attribute and changes the font.  You can change the test to
whatever criteria you use.

<xsl:param name="alt.body.font.family">Helvetica</xsl:param>

<xsl:param name="alt.body.fontset">
  <xsl:value-of select="$alt.body.font.family"/>
  <xsl:if test="$alt.body.font.family != ''
                and $symbol.font.family  != ''">,</xsl:if>
    <xsl:value-of select="$symbol.font.family"/>
</xsl:param>

<xsl:template name="set.flow.properties">
  <xsl:param name="element" select="local-name(.)"/>
  <xsl:param name="master-reference" select="''"/>

  <!-- This template is called after each <fo:flow> starts. -->
  <!-- Customize this template to set attributes on fo:flow -->

  <!-- remove -draft from reference -->
  <xsl:variable name="pageclass">
    <xsl:choose>
      <xsl:when test="contains($master-reference, '-draft')">
        <xsl:value-of select="substring-before($master-reference,
'-draft')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$master-reference"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <xsl:choose>
    <xsl:when test="$fop.extensions != 0 or $passivetex.extensions != 0">
      <!-- body.start.indent does not work well with these processors -->
    </xsl:when>
    <xsl:when test="starts-with($pageclass, 'body') or
                    starts-with($pageclass, 'lot') or
                    starts-with($pageclass, 'front') or
                    $element = 'preface' or
                    (starts-with($pageclass, 'back') and
                    $element = 'appendix')">
      <xsl:attribute name="start-indent">
        <xsl:value-of select="$body.start.indent"/>
      </xsl:attribute>
      <xsl:attribute name="end-indent">
        <xsl:value-of select="$body.end.indent"/>
      </xsl:attribute>
    </xsl:when>
  </xsl:choose>

<!-- Add this test to change the font-family for a special flow -->
  <xsl:if test="ancestor::part[@role = 'part2']">
    <xsl:attribute name="font-family">
      <xsl:value-of select="$alt.body.fontset"/>
    </xsl:attribute>
  </xsl:if>

</xsl:template>

<!-- The following changes handle the header and footer font, since those
       are in the static content and not inside fo:flow -->

<xsl:attribute-set name="footer.content.properties">
  <xsl:attribute name="font-family">
    <xsl:choose>
      <xsl:when test="ancestor::part[@role = 'part2']">
        <xsl:value-of select="$alt.body.fontset"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$body.fontset"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:attribute>
</xsl:attribute-set>

<xsl:attribute-set name="header.content.properties">
  <xsl:attribute name="font-family">
    <xsl:choose>
      <xsl:when test="ancestor::part[@role = 'part2']">
        <xsl:value-of select="$alt.body.fontset"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$body.fontset"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:attribute>
</xsl:attribute-set>

There are a few other attribute-sets that use $body.fontset, such as
footnotes.  If you want complete coverage, check out the fo/param.xsl file
and use similar xsl:choose statements for the font-family in those
attribute-sets as well.

Bob Stayton
Sagehill Enterprises
bobs@...


----- Original Message -----
From: "Shane Handford" <shandford@...>
To: <docbook-apps@...>
Sent: Wednesday, June 24, 2009 10:07 AM
Subject: [docbook-apps] clean and mode-less param switching ideas


> Does anyone have any ideas on how I could affect global stylesheet params
> such as body.font.family for different sections of my output?
>
> eg. a book in two parts - first and second parts use separate fonts.
>
> saxon:assign is too risky and unpredictable.
>
> I rather not recreate templates with modes to switch the font.
>
> I'm probably going to fork out my code to use a different param based on
> context.  Just wondering if anyone has any other suggestions.
>
> Thanks !
>
> ~Shane
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: docbook-apps-unsubscribe@...
> For additional commands, e-mail: docbook-apps-help@...
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: docbook-apps-unsubscribe@...
For additional commands, e-mail: docbook-apps-help@...