sobota, 1 listopada 2008

SVG, Docbook i Firefox

Zaczęło się od tego, że chciałem wstawić ilustrację w formacie SVG do dokumentu redagowanego w Docbooku. Jakoś tak:

<figure id='r1' >
<title>Osie (środkowy węzeł <literal>p</literal> jest węzłem kontekstowym)</title>
<mediaobject >
<imageobject>
<imagedata width='90%' format="SVG" fileref="document-axes.svg" />
</imageobject>
</mediaobject>
</figure>

W pliku PDF wygenerowanym FOPem ilustracja wygląda OK. W dokumencie HTML oglądanym w FF 2.0.0.16 wygląda dziwnie: wyświetlany jest tylko fragment rysunku a z boku pojawia się pasek do przewijania (scrollbar). I nie idzie tego się pozbyć...

Zaktualizowałem zatem Firefoxa do wersji 3.0.3. Teraz rysunek jest wyświetlany prawidłowo. Opera 9.27 nie pokazuje go wcale, ale jeżeli pominie się atrybut width, to rysunek jest wyświetlany prawidłowo. Skoro tak to wymyśliłem sobie coś takiego:

<figure id='r1' >
<title>Osie (środkowy węzeł <literal>p</literal> jest węzłem kontekstowym)</title>
<mediaobject >
<imageobject>
<imagedata width='90%' format="SVG" fileref="document-axes.svg" />
</imageobject>
<caption condition='html'><para>Na wypadek gdyby powyższy rysunek
był niewidoczny tu jest wersja <ulink url="document-axes.png">w formacie PNG</ulink>
</para></caption>
</mediaobject>
</figure>

Powyższa uwaga w pliku PDF jest bez sensu. Na szczęście łatwo się go pozbyć, bo w Docbooku zaimplementowano warunkowe przetwarzanie dokumentu (profiling). Następujące kilkanaście atrybutów może być używanych do tego celu:

Nazwa atrybutu Opis Parameter XSL
arch Computer or chip architecture, such as i386. profile.arch
audience Intended audience of the content, such as instructor. profile.audience
condition General purpose conditional attribute, with no preassigned semantics. profile.condition
conformance Standards conformance, such as lsb (Linux Standards Base). profile.conformance
lang Language code, such as de_DE. profile.lang
os Operating system. profile.os
revision Editorial revision, such as v2.1. profile.revision
revisionflag Revision status of the element, such as changed. This attribute has a fixed set of values to choose from. profile.revisionflag
role General purpose attribute, with no preassigned semantics. Use with caution for profiling. profile.role
security Security level, such as high. profile.security
status Editorial or publication status, such as InDevelopment or draft. profile.status
userlevel Level of user experience, such as beginner. profile.userlevel
vendor Product vendor, such as apache. profile.vendor
wordsize Word size (width in bits) of the computer architecture, such as 64bit. Added in DocBook version 4.4. profile.wordsize

Teraz po wpisaniu <caption condition='html'> ... </caption> do dokumentu należy uruchomić procesor XSLT z odpowiednią wartością parametru (podanego w trzeciej kolumnie tabeli). Mówiąc konkretnie:


## Transformacja za pomocą xsltproc xml2xhtml
xsltproc --stringparam chunker.output.doctype-public "-//W3C//DTD XHTML 1.0 Strict//EN" \
--stringparam chunker.output.doctype-system http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" \
--stringparam profile.condition "html" -o plik.xhtml szablon.xsl plik.xml

## albo za pomocą procesora saxon:
saxon -o plik.fo plik.xml szablon.xsl profile.condition="pdf"

Do tego zamiast standardowego arkusza XSL-ROOT/xhtml/chunk.xsl (XSL-ROOT oznacza katalog główny dystrybucji arkuszy XSL Docbook) należy w przypadku zamiany na XHTML uruchomić XSL-ROOT/xhtml/profile-chunk.xsl. Podobnie zamieniając XML na FO/PDF należy uruchomić XSL-ROOT/fo/profile-docbook.xsl zamiast XSL-ROOT/fo/docbook.xsl. Oczywiście ww. arkusze są uruchamiane pośrednio, poprzez arkusz dopasowujący nastawy XSL Docbook do moich potrzeb. Początek tego arkusza wygląda zatem następująco:

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
version="1.0" >
<xsl:import href="/usr/local/sgml/stylesheets/xmldocbook/1.72.0/xhtml/profile-docbook.xsl"/>
<!-- itd ... -->

Teraz jest tak: plik PDF jest OK. Plik XHTML nie do końca--nie widać wpisu Na wypadek gdyby powyższy rysunek.... Zasłania go rysunek; co ciekawe identycznie wygląda to w Firefoksie i Operze (tzn. identycznie nic nie widać). Relewantny fragment pliku XHTML wygląda następująco:

<div class="figure">
<a id="r1"></a> <p class="title">
<b>Rysunek 1. Osie (środkowy węzeł <code class="literal">p</code> jest węzłem kontekstowym)</b> </p>
<div class="figure-contents">
<div class="mediaobject">
<object data="document-axes.svg" type="image/svg+xml" width="90%"/>
<div class="caption">
<p>Na wypadek gdyby powyższy rysunek był niewidoczny tu jest wersja
<a href="document-axes.jpg">w formacie JPG</a> </p>
</div> </div> </div> </div>

Jeżeli się wstawi element object do elementu p, to tekst się pojawia... Ale żeby object był wewnątrz akapitu to trzeba zmienić relewantne szablony XSL Docbook; w tym przypadku nie aż tak trywialne zadanie... Poddałem się i uwagę dodałem w formie akapitu pod pod rysunkiem. Ostatecznie wygląda to tak.

Dopisane 2 listopada 2008: Wzmiankowany dokument wyświetla się w programie Exploder czy jakoś tak, tzw. czołowej firmy zupełnie kuriozalnie, mianowicie do połowy (tj. do rysunku). W związku z tym nawet ostrzeżenie: Na wypadek gdyby powyższy rysunek był niewidoczny tu jest wersja... nie jest wyświetlane, ani link do pliku PNG, ani nic po rysunku. Ci to zawsze potrafią zaskoczyć.

Firma owa uparła się bowiem ignorować standardy a wciskać na siłę swoje szajsowe rozwiązania typu VML czy jakiś EMF. Ich sprawa...

1 komentarz: