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