OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [docbook-apps] how to add a style attribute inside a P element?(Kindle insanity!)


Hi, I need some more help about customizing html output so that I can
change the attribute name and value. I had posted the original
question -- see Bob's reply here.
http://lists.oasis-open.org/archives/docbook-apps/201108/msg00035.html

The case, if you remember was that I wanted to specify for
caption/para that the <p width="-30"  or that the attribute would be
<p style="text-indent:0"

I understand the general logic of Bob's suggested solution but not the
specifics. In fact, my problem may be simply be that I do not
understand how modes work in  XSL here.  My questions are at the end:

In block.xsl I see for para:
**********************************
<xsl:template name="paragraph">
  <xsl:param name="class" select="''"/>
  <xsl:param name="content"/>

  <xsl:variable name="p">
    <p>
      <xsl:choose>
        <xsl:when test="$class != ''">
          <xsl:call-template name="common.html.attributes">
            <xsl:with-param name="class" select="$class"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="locale.html.attributes"/>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:copy-of select="$content"/>
    </p>
  </xsl:variable>

  <xsl:choose>
    <xsl:when test="$html.cleanup != 0">
      <xsl:call-template name="unwrap.p">
        <xsl:with-param name="p" select="$p"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="$p"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
********************

As Bob said (see bottom), <xsl:call-template
name="common.html.attributes"> will in turn apply templates in
mode="class.attribute"
In html.xsl
********************
<!-- Apply common attributes such as class, lang, dir -->
<xsl:template name="common.html.attributes">
  <xsl:param name="inherit" select="0"/>
  <xsl:param name="class" select="local-name(.)"/>
  <xsl:apply-templates select="." mode="common.html.attributes">
    <xsl:with-param name="class" select="$class"/>
    <xsl:with-param name="inherit" select="$inherit"/>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="*" mode="common.html.attributes">
  <xsl:param name="class" select="local-name(.)"/>
  <xsl:param name="inherit" select="0"/>
  <xsl:call-template name="generate.html.lang"/>
  <xsl:call-template name="dir">
    <xsl:with-param name="inherit" select="$inherit"/>
  </xsl:call-template>
  <xsl:apply-templates select="." mode="class.attribute">
*******************<<<<<<<**************calling class.attributes
    <xsl:with-param name="class" select="$class"/>
  </xsl:apply-templates>
  <xsl:call-template name="generate.html.title"/>
</xsl:template>

In that same html.xsl,  here is the mode class.attribute and
accompanying mode class.value
******************
<xsl:template match="*" mode="class.attribute">
  <xsl:param name="class" select="local-name(.)"/>
  <!-- permit customization of class attributes -->
  <!-- Use element name by default -->
  <xsl:attribute name="class">
    <xsl:apply-templates select="." mode="class.value">
      <xsl:with-param name="class" select="$class"/>
    </xsl:apply-templates>
  </xsl:attribute>
</xsl:template>

<xsl:template match="*" mode="class.value">
  <xsl:param name="class" select="local-name(.)"/>
  <!-- permit customization of class value only -->
  <!-- Use element name by default -->
  <xsl:value-of select="$class"/>
</xsl:template>

<xsl:template match="*" mode="width.value">
  <xsl:param name="width" select="local-name(.)"/>
  <!-- permit customization of class value only -->
  <!-- Use element name by default -->
  <xsl:value-of select="$width"/>
</xsl:template>

***********************************

I would expect that in my customization layer I could do this to get a
width=30px attribute.   I have a

XML source:
  <mediaobject role="wide-image-with-caption">
        <imageobject role="html">
            <imagedata role="html" fileref="web-images/wide1.jpg"/>
        </imageobject>
        <!--        contentwidth="500px"
            contentdepth="334px-->
        <caption>
            <para role ="30px">This caption works perfectly in 600x800
but for 1024x768, the second line of the
                caption looks nasty! For every hard problem there is a
solution which is simple,
                obvious and wrong.   </para>
        </caption>
    </mediaobject>

my stab at customization:
    <xsl:template  match="caption/para" mode="class.attributes">
        <xsl:param name="class" select="local-name(.)"/>
          <xsl:param name="width" select="local-name(.)"/>
*******************unsure about this, but following the pattern
        <!-- permit customization of class attributes -->
        <!-- Use element name by default -->
        <xsl:attribute name="class">
            <xsl:apply-templates select="." mode="class.value">
                <xsl:with-param name="class" select="$class"/>
            </xsl:apply-templates>
        </xsl:attribute>
        <xsl:attribute name="width">
            <xsl:apply-templates select="." mode="class.value">
                <xsl:with-param name="width" select="$width"/>
            </xsl:apply-templates>
        </xsl:attribute>
******************* I also tried hardcoding the value like I did here.
 (Both xsl: attributes are
					 uncommmented here, but I tried using only one at a time)
        <xsl:attribute name="width">20px</xsl:attribute>
     <xsl:apply-templates></xsl:apply-templates>
    </xsl:template>


That didn't produce anything different. I realize that hardcoding the
value of the attribute is not the typical case-- Bob mentioned doing
it as a value in the role attribute. But I wanted to try something
easy first. (and in fact, I changed the xpath in the match= to *  just
to see what would happen-- same outcome).

1. When creating a new attribute for output, do you need to create a
separate mode, or can you just use the class.attribute mode?  Do you
also need to create a new mode for value -- I.e. width.value?
2. I'm unclear about which xsl statement is actually supposed to write
the width="" attribute into the output. xsl:apply-templates?
3. I'm using roles for a lot of things here: in the mediaobject and
the imageobject. Is this a potential problem?

Any help on this matter is appreciated.

Robert

******************************************************




On Wed, Aug 3, 2011 at 12:01 PM, Bob Stayton <bobs@sagehill.net> wrote:
> Hi Robert,
> The mechanism in the stylesheet that lets you customize class attributes can
> also be used to add other attributes such as style or width.  Most element
> templates include something like this:
>
> <xsl:apply-templates select="." mode="class.attribute">
>
> If not, then it has this:
>
> <xsl:call-template name="common.html.attributes">
>
> which in turn applies templates in mode="class.attribute".  The default
> template in that mode is in html/html.xsl:
>
> <xsl:template match="*" mode="class.attribute">
>  <xsl:param name="class" select="local-name(.)"/>
>  <!-- permit customization of class attributes -->
>  <!-- Use element name by default -->
>  <xsl:attribute name="class">
>   <xsl:apply-templates select="." mode="class.value">
>     <xsl:with-param name="class" select="$class"/>
>   </xsl:apply-templates>
>  </xsl:attribute>
> </xsl:template>
>
> As you can see, that template generates an attribute whose name is "class"
> and whose value is determined using mode="class.value", which is the mode I
> usually advise people to customize when they need to change the class value
> for an element.
>
> But you could expand this template to include additional <xsl:attribute>
> elements to generate additional attributes, such as style or width.  Since
> this is a mode, you can write separate templates for each element that needs
> to generate different extra attributes, using the match attribute on the
> template to select a specific XPath pattern.  How you determine the values
> from your content is up to you.  As Nic suggests, role attribute could be
> used.
>
> Bob Stayton
> Sagehill Enterprises
> bobs@sagehill.net
>
>
> ----- Original Message ----- From: "Nic Gibson" <nicg@corbas.net>
> To: "Robert Nagle" <idiotprogrammer@gmail.com>
> Cc: <docbook-apps@lists.oasis-open.org>
> Sent: Wednesday, August 03, 2011 9:28 AM
> Subject: Re: [docbook-apps] how to add a style attribute inside a P element?
> (Kindle insanity!)
>
>
> Hi Robert
>
> I've been doing some of the same things you are doing here. I'm not
> convinced that are right about the Kindle indenting (I'm looking at some
> titles I worked on and we've used css classes for the indent and it's
> working just fine).
>
> For the width, I postprocess. I'm working on a set of scripts for a client
> at the moment that takes an EPUB and does some mappings for the Kindle. I
> may be able to make them available to you (the client is often happy for
> code written for them to be put into the public domain).
>
> There is no reason why you couldn't do both the things you are discussing
> here using a customisation though. You could use a template that operates on
> role attributes perhaps.
>
> nic
>
> On 3 Aug 2011, at 12:47, Robert Nagle wrote:
>
>> To add to my remarks:
>>
>> one common Kindle formatting example is to output
>>
>> to <p width=75"> or  <p width=-20">
>>
>> so it would be nice if we could have a general way to add an attribute
>> like "width" in some cases.
>>
>> (I don't know if it would validate as XHTML though).
>>
>> rj
>>
>> On Wed, Aug 3, 2011 at 6:36 AM, Robert Nagle <idiotprogrammer@gmail.com>
>> wrote:
>>>
>>> I'm outputting a lot of epub and frequently I need to massage the
>>> output so that the epub can be converted into the Kindle format.
>>>
>>> One inherent problem with kindlegen is that it strips out most CSS
>>> code and instead adds some formatting attributes inside individual
>>> elements.
>>>
>>> One example. You cannot turn off indenting in Kindle unless you
>>> hardcode something like <p style="text-indent:0">
>>>
>>> So I do post-processing, I would have to do a global search and replace:
>>>
>>>   Change <p class="no-indent"> to <p style="text-indent:0"> in all
>>> instances.
>>>   Change <div class="caption"><p> to <div.caption><p
>>> style="text-indent:0"> in all instances.
>>>   Change <p class="pullquote"> to <p style="text-indent:0"> in all
>>> instances.
>>>
>>> I wouldn't even know how to get started to do this in customization
>>> layer.
>>>
>>> I've seen this discussion
>>>
>>> http://markmail.org/search/?q=class.attribute&q=list%3Aorg.oasis-open.lists.docbook-apps#query:class.attribute%20list%3Aorg.oasis-open.lists.docbook-apps%20from%3A%22Bob%20Stayton%22+page:1+mid:7jfjygrqiz5pc7bs+state:results
>>> where css.decoration is mentioned as well as custom class values
>>> http://www.sagehill.net/docbookxsl/HtmlCustomEx.html#CustomClassValues
>>>
>>> I think the section on "custom class values" seems relevant, but I
>>> can't follow the example.
>>>
>>> YOu would need to add a custom attribute to these elements (style) as
>>> well as values (text-indent:0).
>>>
>>> Do you have an idea about how to attack this problem? Thanks.
>>>
>>> --
>>> Robert Nagle
>>> 6121 Winsome Ln #56C, Houston TX 77057-5581
>>> (H) 713 893 3424/ (W) 832-251-7522 Carbon Neutral Since Jan 2010
>>> http://www.robertnagle.info
>>>
>>
>>
>>
>> --
>> Robert Nagle
>> 6121 Winsome Ln #56C, Houston TX 77057-5581
>> (H) 713 893 3424/ (W) 832-251-7522 Carbon Neutral Since Jan 2010
>> http://www.robertnagle.info
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: docbook-apps-unsubscribe@lists.oasis-open.org
>> For additional commands, e-mail: docbook-apps-help@lists.oasis-open.org
>>
>
> Nic Gibson
> Corbas Consulting
> Digital Publishing Consultancy and Training
> http://www.corbas.co.uk, +44 (0)7718 906817
>
>
>


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]