RE: What best graphics format for RTF and HTML, using Jade/DSSSL/DocBook

Subject: RE: What best graphics format for RTF and HTML, using Jade/DSSSL/DocBook
From: "W. Eliot Kimber" <eliot@xxxxxxxxxx>
Date: Sat, 21 Feb 1998 10:45:57 -0600
At 03:52 PM 2/21/98 -0000, Richard Folwell wrote:
>Do I need to put some sort of conditional statement in at this level?
(Seems 
>somewhat counter to the general idea of SGML, to abstract issues like
this, but 
>maybe with graphics this simply is not possible?).  What I would like to
do is 
>something like this:
>
><figure>
><title>A figure</title>
><graphic fileref="diagram"></graphic>
></figure>
>
>and let the formatting backend decide which format file is needed for a 
>particular output type.  This means that the SGML would not have to be
changed 
>if support for a new backend were to be added.  Of course the new graphics 
>formats would need to be generated, but if all the graphics are produced by 
>conversion from a single source, as you suggest, then this should not be a 
>problem.

This is what external data entities are for.  It requires doing three things:

1. Define an appropriate data content notation.
2. Declare entities for each graphic using a public ID
3. Create two entity mapping catalogs, one for each output process,
that map the public IDs to the appropriate version of the graphic
(this logic could also be put into the DSSSL spec, but doing it with
catalogs is probably easier)

For example, you might do something like this:

<!DOCTYPE MyDoc [
 <!NOTATION 
   generic-graphic
   PUBLIC "-//ME//NOTATION Generic Graphic that may be in any format//EN"
 >
 <!ENTITY 
   graphic-1 
   PUBLIC "-//ME//NONSGML Graphic One//EN"
   NDATA generic-graphic
 >
 <!ENTITY 
   graphic-2
   PUBLIC "-//ME//NONSGML Graphic Two//EN"
   NDATA generic-graphic
 >
 <!ELEMENT graphic 
   - O
   EMPTY
 >
 <!ATTLIST graphic
   object 
     ENTITY 
     #REQUIRED
 >
]>
<MyDoc>
<figure>
<title>A figure</title>
<graphic object="graphic-1">
</figure>
</MyDoc>

This gives you the notation and entity declarations. Note that I've
modified your Graphic element so that it points to the entity name using
the attribute "object", rather than pointing to a filename directly.  I
also gave it a declared content of EMPTY since its effective content is the
graphic entity it points to.

For the catalogs, you would have two:

Catalog 1, say "gif-graphics.soc":

-- SGML Open Catalog for GIF versions of graphics --
PUBLIC "-//ME//NONSGML Graphic One//EN"
       "graph1.gif"
PUBLIC "-//ME//NONSGML Graphic Two//EN"
       "graph2.gif"
-- End of SOC catalog --

Catalog 2, say "wmf-graphics.soc":

-- SGML Open Catalog for WMF versions of graphics --
PUBLIC "-//ME//NONSGML Graphic One//EN"
       "graph1.wmf"
PUBLIC "-//ME//NONSGML Graphic Two//EN"
       "graph2.wmf"
-- End of SOC catalog --

Then, when you run Jade, you use the -c flag to pull in the appropriate
catalog:

jade -t sgml -dmydoc-to-html.dsl -c gif-graphics.soc mydoc.sgm > mydoc.html

jade -t rft -dmydoc-to-print.dsl -c wmf-graphics.soc mydoc.sgm

In your DSSSL specs, use the entity-generated-system-id function to get the
system ID defined by the catalog.  You may then need to pull this apart to
get a usable filename or URL.  Here's the function I wrote to decode
generated system IDs (which are in the formal system identifier format
defined by clause A.6 of ISO/IEC 10744:1997, see
"http://www.ornl.gov/sgml/wg4/docs/n1920/html/clause-A.6.html";):

<function>
<funcheader>
<funcname>fsi->filename</funcname>
<description>
<para>Parses a formal system ID into a filename</para>
</description>
<arguments>
<argument><arg>fsi</arg><desc>An FSI (such as returned by generated-system-id)
</desc>
</argument>
</arguments>
</funcheader>
<funcbody>

(define (fsi->filename fsi)
  (let loop ((fsi fsi) (fsitag "") (sysid "") (intag #f))
    (if (equal? fsi "")
      sysid
      (let ((c (substring fsi 0 1)))
        (if intag
          (if (equal? c ">")
            (loop (substring fsi 1 (string-length fsi))
                     (string-append fsitag c) sysid #f)
            (loop (substring fsi 1 (string-length fsi))
                     (string-append fsitag c) sysid intag))
          (if (equal? c "&lt;")
            (loop (substring fsi 1 (string-length fsi)) 
                  fsitag sysid #t)
            (loop (substring fsi 1 (string-length fsi)) 
                  fsitag (string-append sysid c) intag)))))))

Cheers,

E.
--
<Address HyTime=bibloc>
W. Eliot Kimber, Senior Consulting SGML Engineer
Highland Consulting, a division of ISOGEN International Corp.
2200 N. Lamar St., Suite 230, Dallas, TX 95202.  214.953.0004
www.isogen.com
</Address>


 DSSSList info and archive:  http://www.mulberrytech.com/dsssl/dssslist


Current Thread
  • RE: What best graphics format for RTF and HTML, using Jade/DSSSL/DocBook, (continued)
    • Richard Folwell - from mail1.ability.netby web4.ability.net (8.8.5/8.6.12) with ESMTP id LAA05525Sat, 21 Feb 1998 11:08:53 -0500 (EST)
      • Christian Leutloff - from mail1.ability.netby web4.ability.net (8.8.5/8.6.12) with ESMTP id VAA10331Sat, 21 Feb 1998 21:32:47 -0500 (EST)
        • Thomas G. Lockhart - from mail1.ability.netby web4.ability.net (8.8.5/8.6.12) with ESMTP id KAA18966Mon, 23 Feb 1998 10:06:50 -0500 (EST)
        • Norman Walsh - from mail1.ability.netby web4.ability.net (8.8.5/8.6.12) with ESMTP id KAA19526Mon, 23 Feb 1998 10:38:21 -0500 (EST)
    • W. Eliot Kimber - from mail1.ability.netby web4.ability.net (8.8.5/8.6.12) with ESMTP id LAA05962Sat, 21 Feb 1998 11:58:41 -0500 (EST) <=