doclib: added encoding options for doxygen
[senf.git] / doclib / doxygen.sh
1 #!/bin/bash -e
2
3 do_html_cleanup()
4 {
5     sed -e 's/id="current"/class="current"/' \
6         | tidy -ascii -q --wrap 0 --show-warnings no --fix-uri no \
7         | sed -e 's/name="\([^"]*\)"\([^>]*\) id="\1"/name="\1"\2/g' \
8         | xsltproc --novalid --nonet --html --stringparam topdir "$reltopdir" \
9               "$base/html-munge.xsl" -
10 }
11
12 ###########################################################################
13
14 name="`basename "$0"`"; #`"
15 base="`dirname "$0"`"; base="`cd "$base"; pwd`" #`"
16
17 TEMP=`getopt -n $name -o '' -l html,tagfile,tagfile-name:,tagfiles:,output-dir:,html-dir:  -- "$@"`
18 if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
19 eval set -- "$TEMP"
20
21 tagxsl="$base/tag-munge.xsl"
22
23 html="NO"; tagfile="NO"; tagfile_name=""; tagfiles=""; output_dir="doc"; html_dir="html"
24
25 while true; do
26     case "$1" in
27         --html) 
28             html="YES" ; shift ;;
29         --tagfile) 
30             tagfile="YES" ; shift ;;
31         --tagfile-name) 
32             tagfile_name="$2"; shift 2 ;;
33         --tagfiles) 
34             for f in $2; do
35                 f="`readlink -mn "$f"`" #`"
36                 tagfiles="$tagfiles${tagfiles:+ }$f"
37             done
38             shift 2
39             ;;
40         --output-dir)
41             output_dir="$2"; shift 2 ;;
42         --html-dir)
43             html_dir="$2"; shift 2 ;;
44         --)
45             shift; break ;;
46         *)
47             echo "Internal error: $*"; exit 1 ;;
48     esac
49 done
50
51 if [ -z "$1" ]; then
52     cat <<EOF
53 Usage:
54     $name
55         [--html]
56         [--tagfile]
57         [--tagfile-name=<name>]
58         [--tagfiles=<files>]
59         [--output-dir=<dir>]
60         [--html-dir=<dir>]
61             <doxyfile-or-dir>
62 EOF
63     exit 1
64 fi
65
66 if [ "$tagfile" = "YES" -a -z "$tagfile_name" ]; then
67     echo "--tagfile-name is required with --tagfile"
68     exit 1
69 fi
70
71 doxydir="$1"
72
73 if [ -f "$doxydir" ]; then
74     doxydir="`dirname "$doxydir"`" #`"
75 fi
76
77 doxydir="`readlink -mn "$doxydir"`" #`"
78
79 ###########################################################################
80
81 # Create relative path from absolute directory $1 to absolute path $2
82 relpath()
83 {
84     local src="${1#/}"
85     local dst="${2#/}"
86     while true; do
87         srcd="${src%%/*}"
88         dstd="${dst%%/*}"
89         if [ "$srcd" = "$dstd" ]; then
90             src="${src#$srcd}"; src="${src#/}"
91             dst="${dst#$dstd}"; dst="${dst#/}"
92         else
93             break
94         fi
95     done
96     rel="`echo "$src" | sed -e "s/[^\/]*/../g"`/$dst" # `"
97     echo "${rel%/}"
98 }
99
100 # Log executed commands
101 cmd()
102 {
103     echo "+" "$@"
104     "$@"
105 }
106
107 html_cleanup()
108 {
109     mv "$1" "${1}.orig"
110     do_html_cleanup <"${1}.orig" >"$1"
111 }
112
113 ###########################################################################
114
115 ## Find $TOPDIR
116
117 cd "$doxydir"
118 while [ ! -r "SConstruct" -a "`pwd`" != "/" ]; do cd ..; done
119 if [ ! -r "SConstruct" ]; then
120     echo "topdir not found"
121     exit 1;
122 fi
123 TOPDIR="`pwd`";
124 reltopdir="`relpath "$doxydir/$output_dir/$html_dir" "$TOPDIR"`" #`"
125 cd "$doxydir"
126
127
128 ## Remove tagfile_name from list of tagfiles
129
130 if [ -n "$tagfile_name" ]; then 
131     tagfile_name="`readlink -mn "$output_dir/$tagfile_name"`" #`"
132     x="$tagfiles"; tagfiles=""
133     for f in $x; do
134         if [ "$f" != "$tagfile_name" ]; then
135             tagfiles="$tagfiles${tagfiles:+ }$f"
136         fi
137     done
138 fi
139
140 ## Call doxygen proper
141
142 generate_tagfile=""
143 if [ "$tagfile" = "YES" ]; then
144     generate_tagfile="$tagfile_name"
145 fi
146 export TOPDIR html tagfile tagfile_name tagfiles output_dir html_dir generate_tagfile
147
148 cmd ${DOXYGEN:-doxygen}
149
150
151 ## Clean up tagfile, if generated
152
153 if [ "$tagfile" = "YES" ]; then
154     mv "$tagfile_name" "${tagfile_name}.orig"
155     cmd xsltproc --novalid --nonet -o "$tagfile_name" "$tagxsl" "${tagfile_name}.orig"
156 fi
157
158
159 ## Call installdox
160
161 if [ -n "$tagfiles" ]; then
162     args=""
163     for f in $tagfiles; do
164         n="`basename "$f"`" #`"
165         d="`dirname "$f"`" #`"
166         url="`relpath "$doxydir/$output_dir/$html_dir" "$d/$html_dir"`" #`"
167         args="$args${args:+ }-l $n@$url"
168     done
169
170     (
171         cd "./$output_dir/$html_dir"
172         cmd "./installdox" $args
173     )
174 fi
175
176
177 ## Postprocess html files, if generated
178
179 if [ "$html" = "YES" ]; then
180     for h in "$doxydir/$output_dir/$html_dir"/*.html; do
181         cmd html_cleanup "$h"
182     done
183 fi