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