2003-04-17 Moritz Schulte <moritz@g10code.com>
[libgcrypt.git] / scripts / db2any
1 #!/bin/sh
2 # db2any - Docbook to html/ps/info rendering
3 #
4 #       Copyright (C) 2000, 2001 Free Software Foundation, Inc
5 #
6 # This is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19 #
20 # Note: This requires a Posix shell
21 #
22 # $Id$
23
24 pgm="db2any"
25 version="0.7.3"
26
27 usage () {
28     echo 'usage: db2any [--help] [options] filename' >&2
29     exit 1
30 }
31
32 show_banner () {
33         cat <<EOF
34 $pgm $version
35 Copyright (C) 2001 Free Software Foundation, Inc.
36 This is free software; see the source for copying conditions.  There is NO
37 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
38
39 EOF
40 }
41
42 show_help () {
43     show_banner
44     cat <<EOF
45 usage: db2any [options] docbookfile
46
47 Options:
48     --mode    select the mode (one of: ${all_modes})
49     --help
50     --nosplit
51     --copyfiles
52     --systemcheck
53     --verbose
54     --draft
55     --manvolume n
56     --usestyle  file
57     --ignore-xref      [not yet implemented]
58
59 EOF
60     exit 0
61 }
62
63 # a list of all possible stylesheet locations
64 stylesheet_dirs='
65 /usr/local/lib/dsssl/stylesheets/docbook
66 /usr/local/share/dsssl/stylesheets/docbook
67 /usr/local/lib/sgml/stylesheet/dsssl/docbook/nwalsh
68 /usr/local/share/sgml/stylesheet/dsssl/docbook/nwalsh
69 /usr/lib/dsssl/stylesheets/docbook
70 /usr/share/dsssl/stylesheets/docbook
71 /usr/lib/sgml/stylesheet/dsssl/docbook/nwalsh
72 /usr/share/sgml/stylesheet/dsssl/docbook/nwalsh
73 /usr/lib/sgml/stylesheets/nwalsh-modular
74 /usr/share/sgml/stylesheets/nwalsh-modular
75 '
76
77 all_modes="check tex html man texinfo"
78 input=
79 verbose=no
80 draft=no
81 nosplit=no
82 copyfiles=no
83 systemcheck_only=no
84 mode=none
85 manvolume="man"
86 usestyle=""
87 expected_args=1
88 ignore_xref=no
89 while test "`echo $1 | head -c1`" = "-"; do
90     case $1 in
91       --version)
92         echo "$pgm $version"
93         exit 0
94         ;;
95       --help|-h|-help)
96         show_help
97         exit 0
98         ;;
99       --nosplit)
100         nosplit=yes
101         ;;
102       --copyfiles)
103         copyfiles=yes
104         ;;
105       --systemcheck)
106         systemcheck_only=yes
107         expected_args=0
108         ;;
109       --mode)
110         shift
111         if [ $# = 0 ]; then
112            echo "$pgm: missing argument for --mode" >&2
113            exit 1
114         fi
115         mode="$1"
116         ;;
117       --manvolume)
118         shift
119         if [ $# = 0 ]; then
120            echo "$pgm: missing argument for --manvolume" >&2
121            exit 1
122         fi
123         manvolume="$1"
124         ;;
125       --usestyle)
126         shift
127         if [ $# = 0 ]; then
128            echo "$pgm: missing argument for --usestyle" >&2
129            exit 1
130         fi
131         usestyle="$1"
132         ;;
133       --verbose)
134         verbose=yes
135         ;;
136       --draft)
137         draft=yes
138         ;;
139       --ignore-xref)
140         ignore_xref=yes
141         ;;
142       --)
143         shift
144         break
145         ;;
146       *)
147         echo "$pgm: invalid option $1" >&2
148         exit 1
149         ;;
150     esac
151     shift
152 done
153
154 if [ $# = $expected_args ]; then
155     if [ $# = 1 ]; then
156        input="$1"
157     fi
158 else
159    usage
160 fi
161
162 # check the mode
163 case "$mode" in
164     html|HTML)
165         mode=html
166         ;;
167     tex|TEX|TeX|dvi)
168         mode=dvi
169         ;;
170     man|MAN)
171         mode=man
172         ;;
173     texi|TEXI|texinfo|TEXINFO)
174         mode=texinfo
175         ;;
176     check)
177         ;;
178     none)
179         if [ $systemcheck_only != yes ]; then
180             echo "$pgm: no mode specified; use one of: ${all_modes}" >&2
181             exit 1
182         fi
183         ;;
184     *)
185         echo "$pgm: invalid mode $mode" >&2
186         echo "$pgm: valid modes are: ${all_modes}"  >&2
187         exit 1
188         ;;
189 esac
190
191 if [ -n $usestyle ]; then
192    if [ ! -f $usestyle ]; then
193       echo "$pgm: cannot access local stylesteet" >&2
194       exit 1
195    fi
196 fi
197
198 #######################################
199 #   Options are all parsed here       #
200 #######################################
201
202 # check whether the given program is availbale in the path
203 check_prog () {
204     tmp="$1"
205     save_ifs="$IFS"; IFS=":"
206     for i in $PATH; do
207         test -z "$i" && i=.
208         if test -f $i/$tmp; then
209              IFS="$save_ifs"
210              return 0
211         fi
212     done
213     IFS="$save_ifs"
214     return 1
215 }
216
217
218 # Figure out all what we need to know about the system we are
219 # running on and where the Docbook tools are installed.
220 # Tell about it when running in verbose mode.
221 do_systemcheck () {
222     # look for Jade
223     jade_version=`jade -v </dev/null 2>&1 | \
224                    sed -n 's/.*:I:.*Jade version "\([0-9.]*\)"/\1/p'`
225     if [ -z "$jade_version" ]; then
226         echo "$pgm: error: jade not found" >&2
227         exit 1
228     fi
229     [ $verbose = yes ] && echo "$pgm: Jade version $jade_version found" >&2
230
231     # look for JadeTeX
232     if ! jadetex -v 2>/dev/null | grep -q '^TeX' ; then
233         echo "$pgm: error: jadetex not found" >&2
234         exit 1
235     fi
236
237     # look for the docbook-to-man script. Fixme: we should check that it
238     # it is a recent version.
239     if ! docbook-to-man 2>&1 | grep -q '^usage' ; then
240         echo "$pgm: error: docbook-to-man not found" >&2
241         exit 1
242     fi
243     [ $verbose = yes ] && echo "$pgm: docbook-to-man found" >&2
244
245     # look for the docbook-to-texi scripts.
246     if ! check_prog docbook2texi ;  then
247         echo "$pgm: error: docbook2texi not found" >&2
248         exit 1
249     fi
250     [ $verbose = yes ] && echo "$pgm: docbook2texi found" >&2
251     if ! sgml2xml -v /dev/null 2>&1 | grep 'SP version' >/dev/null 2>&1 ; then
252         echo "$pgm: error: sgml2xml not found" >&2
253         exit 1
254     fi
255     [ $verbose = yes ] && echo "$pgm: sgml2xml found" >&2
256
257     # figure out where our stylesheets are
258     tex_stylesheet=none
259     for d in ${stylesheet_dirs}; do
260         file=${d}/print/docbook.dsl
261         if [ -f $file ]; then
262             tex_stylesheet=$file
263             break
264         fi
265     done
266     [ $verbose = yes ] && echo "$pgm: TeX stylesheet: ${tex_stylesheet}" >&2
267     html_stylesheet=none
268     for d in ${stylesheet_dirs}; do
269         file=${d}/html/docbook.dsl
270         if [ -f $file ]; then
271             html_stylesheet=$file
272             break
273         fi
274     done
275     [ $verbose = yes ] && echo "$pgm: HTML stylesheet: ${html_stylesheet}" >&2
276     if [ $tex_stylesheet = none -o $html_stylesheet = none ]; then
277         echo "$pgm: error: stylesheets not found" >&2
278         exit 1
279     fi
280
281 }
282
283
284 # Render the docbook as HTML
285 render_html () {
286     output="`basename $input| sed 's/\.sgml$//'`.html"
287
288     if [ -n "$usestyle" ]; then
289         tmpstyle="`pwd`/`basename $usestyle`-html.tmp"
290         if [ ! -f $tmpstyle -o $usestyle -nt $tmpstyle ]; then
291             sed "s%@DOCBOOK_DSL@%$html_stylesheet%" $usestyle > $tmpstyle
292         fi
293     else
294         tmpstyle="$tex_stylesheet"
295     fi
296
297
298     # --nosplts creates just one HTML file
299     if test $nosplit = yes; then
300         echo "running jade on '$input' ..." >&2
301         jade -D . -d $tmpstyle -t sgml -i html -V nochunks $input > $output
302         echo "$output created"
303         return 0
304     fi
305
306     # Make sure that we have a html subdir
307     if test -d html ; then
308         :
309     else
310         if mkdir html; then
311             echo "'html' directory created" >&2
312         else
313             echo "failed to create 'html' directory" >&2
314             exit 1
315         fi
316     fi
317
318     outputdir="html/`basename $input| sed 's/\.sgml$//'`"
319
320     if test -d $outputdir ; then
321         :
322     else
323         if mkdir $outputdir; then
324             echo "'$outputdir' created" >&2
325         else
326             echo "failed to create '$outputdir'" >&2
327             exit 1
328         fi
329     fi
330     echo "creating html pages in '$outputdir' ..." >&2
331     if test "$input" = "`basename $input`"; then
332         inp="../../$input"
333     else
334         inp="$input"
335     fi
336
337     [ $verbose = yes ] && echo "running jade on '$inp' ..." >&2
338     (cd $outputdir && jade -D . -t sgml -i html -d $tmpstyle $inp )
339     [ $verbose = yes ] && echo "html version in '$outputdir' created" >&2
340
341     # break out all filerefs and copy them to the outputdirectory
342     # fixme: handling of path components is wrong
343     if test $copyfiles = yes; then
344         echo "looking for filerefs ..." >&2
345         for file in `nsgmls -i html $input \
346                         | awk '/^AFILEREF[ \t]+CDATA/ {print $3}'`; do
347             d=$outputdir/`basename $file`
348             if cat $file > $outputdir/`basename $file` ; then
349                 echo "  $file -> $d" >&2
350             fi
351         done
352     fi
353
354     mainfile=`ls $outputdir/${doctype}* | head -1`
355
356     # create a html index file for it, so that we can more easy
357     # find the rendred pages
358     cat > $output <<EOF
359 <html><title>$output</title>
360 <body>
361
362 <a href="$mainfile">$mainfile</a>
363
364 </body>
365 </html>
366 EOF
367
368     [ $verbose = yes ] && echo "$output created with link to '$mainfile'" >&2
369 }
370
371
372 # This function expects the source file in $texfile and
373 # the name of the logfle in $logfile
374 run_jadetex () {
375     [ -f $logfile ] && rm $logfile
376     jadetex $texfile
377     if ! tail $logfile | grep -q '^Output written on'; then
378         echo "JadeTeX failed" >&2
379         exit 1
380     fi
381 }
382
383 # Render the docbook to DVI
384 render_dvi () {
385     output="`basename $input| sed 's/\.sgml$//'`.dvi"
386     texfile="`basename $input| sed 's/\.sgml$//'`.tex"
387     logfile="`basename $input| sed 's/\.sgml$//'`.log"
388     auxfile="`basename $input| sed 's/\.sgml$//'`.aux"
389
390     if [ -n "$usestyle" ]; then
391         tmpstyle="`basename $usestyle`-tex.tmp"
392         if [ ! -f $tmpstyle -o $usestyle -nt $tmpstyle ]; then
393             sed "s%@DOCBOOK_DSL@%$tex_stylesheet%" $usestyle > $tmpstyle
394         fi
395     else
396         tmpstyle="$tex_stylesheet"
397     fi
398     [ $verbose = yes ] && echo "running jade on '$input' ..." >&2
399     jade -D . -t tex -i tex -d $tmpstyle -o $texfile $input
400     if ! tail $texfile | grep -q '\\endFOT{}'; then
401         echo "Jade failed" >&2
402         exit 1
403     fi
404
405     # Better delete the aux file first
406     [ -f $auxfile ] && rm $auxfile
407     # The first run won't get the references right, so we have to
408     # run it 2 or 3 times.  JadeTex doesn't indicate whether a third
409     # run is required, so we do it always.
410     run_jadetex
411     if [ $draft = no ]; then
412         if tail -100 $logfile \
413            | grep -q '^LaTeX Warning: There were undefined references'; then
414            echo 'running JadeTeX a second and third 2time' >&2
415            run_jadetex
416            run_jadetex
417         fi
418     fi
419
420     [ $verbose = yes ] && echo "$output created as '$output'" >&2
421 }
422
423 # Render the docbook to troff
424 render_man () {
425     output="`basename $input| sed 's/\.sgml$//'`.$manvolume"
426
427     [ $verbose = yes ] && echo "running docbook-to-man on '$input' ..." >&2
428     docbook-to-man $input > $output
429     [ $verbose = yes ] && echo "man page '$output' created" >&2
430 }
431
432 # Render the docbook to texinfo
433 render_texinfo () {
434     output="`basename $input| sed 's/\.sgml$/.texi/'`"
435     tmpxml="`basename $input| sed 's/\.sgml$/.xml/'`"
436
437     [ $verbose = yes ] && echo "running sgml2xml on '$input' ..." >&2
438     sgml2xml -x lower $input > $tmpxml
439     [ $verbose = yes ] && echo "running docbook2texi on '$tmpxml' ..." >&2
440     docbook2texi $tmpxml | sed 's,--,---,' >$output
441     rm $tmpxml 
442     [ $verbose = yes ] && echo "texinfo '$output' created" >&2
443
444 }
445
446 #######################################
447 #        main function                #
448 #######################################
449
450 do_systemcheck
451 [ $systemcheck_only = yes ] && exit 0
452
453 if [ ! -f "$input" ]; then
454     input="$input.sgml"
455     if [ ! -f "$input" ]; then
456         echo "$pgm: '$input': no such file" >&2
457         exit 1
458     fi
459 fi
460
461 # grep the document type
462 doctype=`grep -i '\<doctype' $input|awk 'NR==1 {print $2}'| tr '[A-Z]' '[a-z]'`
463 if test -z "$doctype"; then
464     echo "$pgm: error: no DOCTYPE declaration found" >&2
465     exit 1
466 fi
467 [ $verbose = yes ] &&  echo "$input: DOCTYPE is '$doctype'" >&2
468
469 case $mode in
470     check)
471         nsgmls -vs $input
472         exit $?
473         ;;
474     html)
475         render_html
476         ;;
477     dvi)
478         render_dvi
479         ;;
480     man)
481         render_man
482         ;;
483     texinfo)
484         render_texinfo
485         ;;
486 esac
487
488
489 exit 0