| 1 | #!/bin/sh -e |
| 2 | # gendocs.sh -- generate a GNU manual in many formats. This script is |
| 3 | # mentioned in maintain.texi. See the help message below for usage details. |
| 4 | |
| 5 | scriptversion=2010-11-29.11 |
| 6 | |
| 7 | # Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software |
| 8 | # Foundation, Inc. |
| 9 | # |
| 10 | # This program is free software: you can redistribute it and/or modify |
| 11 | # it under the terms of the GNU General Public License as published by |
| 12 | # the Free Software Foundation; either version 3 of the License, or |
| 13 | # (at your option) any later version. |
| 14 | # |
| 15 | # This program is distributed in the hope that it will be useful, |
| 16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | # GNU General Public License for more details. |
| 19 | # |
| 20 | # You should have received a copy of the GNU General Public License |
| 21 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 22 | # |
| 23 | # Original author: Mohit Agarwal. |
| 24 | # Send bug reports and any other correspondence to bug-texinfo@gnu.org. |
| 25 | # |
| 26 | # The latest version of this script, and the companion template, is |
| 27 | # available from Texinfo CVS: |
| 28 | # http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh |
| 29 | # http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template |
| 30 | # |
| 31 | # An up-to-date copy is also maintained in Gnulib (gnu.org/software/gnulib). |
| 32 | |
| 33 | prog=`basename "$0"` |
| 34 | srcdir=`pwd` |
| 35 | |
| 36 | scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh" |
| 37 | templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template" |
| 38 | |
| 39 | : ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="} |
| 40 | : ${MAKEINFO="makeinfo"} |
| 41 | : ${TEXI2DVI="texi2dvi -t @finalout"} |
| 42 | : ${DVIPS="dvips"} |
| 43 | : ${DOCBOOK2HTML="docbook2html"} |
| 44 | : ${DOCBOOK2PDF="docbook2pdf"} |
| 45 | : ${DOCBOOK2PS="docbook2ps"} |
| 46 | : ${DOCBOOK2TXT="docbook2txt"} |
| 47 | : ${GENDOCS_TEMPLATE_DIR="."} |
| 48 | : ${TEXI2HTML="texi2html"} |
| 49 | unset CDPATH |
| 50 | unset use_texi2html |
| 51 | |
| 52 | version="gendocs.sh $scriptversion |
| 53 | |
| 54 | Copyright 2010 Free Software Foundation, Inc. |
| 55 | There is NO warranty. You may redistribute this software |
| 56 | under the terms of the GNU General Public License. |
| 57 | For more information about these matters, see the files named COPYING." |
| 58 | |
| 59 | usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE |
| 60 | |
| 61 | Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source. |
| 62 | See the GNU Maintainers document for a more extensive discussion: |
| 63 | http://www.gnu.org/prep/maintain_toc.html |
| 64 | |
| 65 | Options: |
| 66 | -s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi} |
| 67 | -o OUTDIR write files into OUTDIR, instead of manual/. |
| 68 | --email ADR use ADR as contact in generated web pages. |
| 69 | --docbook convert to DocBook too (xml, txt, html, pdf and ps). |
| 70 | --html ARG pass indicated ARG to makeinfo or texi2html for HTML targets. |
| 71 | --texi2html use texi2html to generate HTML targets. |
| 72 | --help display this help and exit successfully. |
| 73 | --version display version information and exit successfully. |
| 74 | |
| 75 | Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\" |
| 76 | |
| 77 | Typical sequence: |
| 78 | cd PACKAGESOURCE/doc |
| 79 | wget \"$scripturl\" |
| 80 | wget \"$templateurl\" |
| 81 | $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\" |
| 82 | |
| 83 | Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR |
| 84 | to override). Move all the new files into your web CVS tree, as |
| 85 | explained in the Web Pages node of maintain.texi. |
| 86 | |
| 87 | Please use the --email ADDRESS option to specify your bug-reporting |
| 88 | address in the generated HTML pages. |
| 89 | |
| 90 | MANUAL-TITLE is included as part of the HTML <title> of the overall |
| 91 | manual/index.html file. It should include the name of the package being |
| 92 | documented. manual/index.html is created by substitution from the file |
| 93 | $GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the |
| 94 | generic template for your own purposes.) |
| 95 | |
| 96 | If you have several manuals, you'll need to run this script several |
| 97 | times with different MANUAL values, specifying a different output |
| 98 | directory with -o each time. Then write (by hand) an overall index.html |
| 99 | with links to them all. |
| 100 | |
| 101 | If a manual's Texinfo sources are spread across several directories, |
| 102 | first copy or symlink all Texinfo sources into a single directory. |
| 103 | (Part of the script's work is to make a tar.gz of the sources.) |
| 104 | |
| 105 | You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML, and |
| 106 | DVIPS to control the programs that get executed, and |
| 107 | GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is |
| 108 | looked for. With --docbook, the environment variables DOCBOOK2HTML, |
| 109 | DOCBOOK2PDF, DOCBOOK2PS, and DOCBOOK2TXT are also respected. |
| 110 | |
| 111 | By default, makeinfo and texi2dvi are run in the default (English) |
| 112 | locale, since that's the language of most Texinfo manuals. If you |
| 113 | happen to have a non-English manual and non-English web site, see the |
| 114 | SETLANG setting in the source. |
| 115 | |
| 116 | Email bug reports or enhancement requests to bug-texinfo@gnu.org. |
| 117 | " |
| 118 | |
| 119 | calcsize() |
| 120 | { |
| 121 | size=`ls -ksl $1 | awk '{print $1}'` |
| 122 | echo $size |
| 123 | } |
| 124 | |
| 125 | MANUAL_TITLE= |
| 126 | PACKAGE= |
| 127 | EMAIL=webmasters@gnu.org # please override with --email |
| 128 | htmlarg= |
| 129 | outdir=manual |
| 130 | srcfile= |
| 131 | |
| 132 | while test $# -gt 0; do |
| 133 | case $1 in |
| 134 | --email) shift; EMAIL=$1;; |
| 135 | --help) echo "$usage"; exit 0;; |
| 136 | --version) echo "$version"; exit 0;; |
| 137 | -s) shift; srcfile=$1;; |
| 138 | -o) shift; outdir=$1;; |
| 139 | --docbook) docbook=yes;; |
| 140 | --html) shift; htmlarg=$1;; |
| 141 | --texi2html) use_texi2html=1;; |
| 142 | -*) |
| 143 | echo "$0: Unknown option \`$1'." >&2 |
| 144 | echo "$0: Try \`--help' for more information." >&2 |
| 145 | exit 1;; |
| 146 | *) |
| 147 | if test -z "$PACKAGE"; then |
| 148 | PACKAGE=$1 |
| 149 | elif test -z "$MANUAL_TITLE"; then |
| 150 | MANUAL_TITLE=$1 |
| 151 | else |
| 152 | echo "$0: extra non-option argument \`$1'." >&2 |
| 153 | exit 1 |
| 154 | fi;; |
| 155 | esac |
| 156 | shift |
| 157 | done |
| 158 | |
| 159 | # For most of the following, the base name is just $PACKAGE |
| 160 | base=$PACKAGE |
| 161 | |
| 162 | if test -n "$srcfile"; then |
| 163 | # but here, we use the basename of $srcfile |
| 164 | base=`basename "$srcfile"` |
| 165 | case $base in |
| 166 | *.txi|*.texi|*.texinfo) base=`echo "$base"|sed 's/\.[texinfo]*$//'`;; |
| 167 | esac |
| 168 | PACKAGE=$base |
| 169 | elif test -s "$srcdir/$PACKAGE.texinfo"; then |
| 170 | srcfile=$srcdir/$PACKAGE.texinfo |
| 171 | elif test -s "$srcdir/$PACKAGE.texi"; then |
| 172 | srcfile=$srcdir/$PACKAGE.texi |
| 173 | elif test -s "$srcdir/$PACKAGE.txi"; then |
| 174 | srcfile=$srcdir/$PACKAGE.txi |
| 175 | else |
| 176 | echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2 |
| 177 | exit 1 |
| 178 | fi |
| 179 | |
| 180 | if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then |
| 181 | echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2 |
| 182 | echo "$0: it is available from $templateurl." >&2 |
| 183 | exit 1 |
| 184 | fi |
| 185 | |
| 186 | case $outdir in |
| 187 | /*) abs_outdir=$outdir;; |
| 188 | *) abs_outdir=$srcdir/$outdir;; |
| 189 | esac |
| 190 | |
| 191 | echo Generating output formats for $srcfile |
| 192 | |
| 193 | cmd="$SETLANG $MAKEINFO -o $PACKAGE.info \"$srcfile\"" |
| 194 | echo "Generating info files... ($cmd)" |
| 195 | eval "$cmd" |
| 196 | mkdir -p "$outdir/" |
| 197 | tar czf "$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info* |
| 198 | info_tgz_size=`calcsize "$outdir/$PACKAGE.info.tar.gz"` |
| 199 | # do not mv the info files, there's no point in having them available |
| 200 | # separately on the web. |
| 201 | |
| 202 | cmd="$SETLANG ${TEXI2DVI} \"$srcfile\"" |
| 203 | echo "Generating dvi ... ($cmd)" |
| 204 | eval "$cmd" |
| 205 | |
| 206 | # now, before we compress dvi: |
| 207 | echo Generating postscript... |
| 208 | ${DVIPS} $PACKAGE -o |
| 209 | gzip -f -9 $PACKAGE.ps |
| 210 | ps_gz_size=`calcsize $PACKAGE.ps.gz` |
| 211 | mv $PACKAGE.ps.gz "$outdir/" |
| 212 | |
| 213 | # compress/finish dvi: |
| 214 | gzip -f -9 $PACKAGE.dvi |
| 215 | dvi_gz_size=`calcsize $PACKAGE.dvi.gz` |
| 216 | mv $PACKAGE.dvi.gz "$outdir/" |
| 217 | |
| 218 | cmd="$SETLANG ${TEXI2DVI} --pdf \"$srcfile\"" |
| 219 | echo "Generating pdf ... ($cmd)" |
| 220 | eval "$cmd" |
| 221 | pdf_size=`calcsize $PACKAGE.pdf` |
| 222 | mv $PACKAGE.pdf "$outdir/" |
| 223 | |
| 224 | cmd="$SETLANG $MAKEINFO -o $PACKAGE.txt --no-split --no-headers \"$srcfile\"" |
| 225 | echo "Generating ASCII... ($cmd)" |
| 226 | eval "$cmd" |
| 227 | ascii_size=`calcsize $PACKAGE.txt` |
| 228 | gzip -f -9 -c $PACKAGE.txt >"$outdir/$PACKAGE.txt.gz" |
| 229 | ascii_gz_size=`calcsize "$outdir/$PACKAGE.txt.gz"` |
| 230 | mv $PACKAGE.txt "$outdir/" |
| 231 | |
| 232 | html_split() |
| 233 | { |
| 234 | opt="--split=$1 $htmlarg --node-files" |
| 235 | cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\"" |
| 236 | echo "Generating html by $1... ($cmd)" |
| 237 | eval "$cmd" |
| 238 | split_html_dir=$PACKAGE.html |
| 239 | ( |
| 240 | cd ${split_html_dir} || exit 1 |
| 241 | ln -sf ${PACKAGE}.html index.html |
| 242 | tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html |
| 243 | ) |
| 244 | eval html_$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"` |
| 245 | rm -f "$outdir"/html_$1/*.html |
| 246 | mkdir -p "$outdir/html_$1/" |
| 247 | mv ${split_html_dir}/*.html "$outdir/html_$1/" |
| 248 | rmdir ${split_html_dir} |
| 249 | } |
| 250 | |
| 251 | if test -z "$use_texi2html"; then |
| 252 | opt="--no-split --html -o $PACKAGE.html $htmlarg" |
| 253 | cmd="$SETLANG $MAKEINFO $opt \"$srcfile\"" |
| 254 | echo "Generating monolithic html... ($cmd)" |
| 255 | rm -rf $PACKAGE.html # in case a directory is left over |
| 256 | eval "$cmd" |
| 257 | html_mono_size=`calcsize $PACKAGE.html` |
| 258 | gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz" |
| 259 | html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"` |
| 260 | mv $PACKAGE.html "$outdir/" |
| 261 | |
| 262 | cmd="$SETLANG $MAKEINFO --html -o $PACKAGE.html $htmlarg \"$srcfile\"" |
| 263 | echo "Generating html by node... ($cmd)" |
| 264 | eval "$cmd" |
| 265 | split_html_dir=$PACKAGE.html |
| 266 | ( |
| 267 | cd ${split_html_dir} || exit 1 |
| 268 | tar -czf "$abs_outdir/${PACKAGE}.html_node.tar.gz" -- *.html |
| 269 | ) |
| 270 | html_node_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node.tar.gz"` |
| 271 | rm -f "$outdir"/html_node/*.html |
| 272 | mkdir -p "$outdir/html_node/" |
| 273 | mv ${split_html_dir}/*.html "$outdir/html_node/" |
| 274 | rmdir ${split_html_dir} |
| 275 | else |
| 276 | cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $htmlarg \"$srcfile\"" |
| 277 | echo "Generating monolithic html... ($cmd)" |
| 278 | rm -rf $PACKAGE.html # in case a directory is left over |
| 279 | eval "$cmd" |
| 280 | html_mono_size=`calcsize $PACKAGE.html` |
| 281 | gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz" |
| 282 | html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"` |
| 283 | mv $PACKAGE.html "$outdir/" |
| 284 | |
| 285 | html_split node |
| 286 | html_split chapter |
| 287 | html_split section |
| 288 | fi |
| 289 | |
| 290 | echo Making .tar.gz for sources... |
| 291 | d=`dirname $srcfile` |
| 292 | ( |
| 293 | cd "$d" |
| 294 | srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null` || true |
| 295 | tar cvzfh "$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles |
| 296 | ) |
| 297 | texi_tgz_size=`calcsize "$outdir/$PACKAGE.texi.tar.gz"` |
| 298 | |
| 299 | if test -n "$docbook"; then |
| 300 | cmd="$SETLANG $MAKEINFO -o - --docbook \"$srcfile\" > ${srcdir}/$PACKAGE-db.xml" |
| 301 | echo "Generating docbook XML... ($cmd)" |
| 302 | eval "$cmd" |
| 303 | docbook_xml_size=`calcsize $PACKAGE-db.xml` |
| 304 | gzip -f -9 -c $PACKAGE-db.xml >"$outdir/$PACKAGE-db.xml.gz" |
| 305 | docbook_xml_gz_size=`calcsize "$outdir/$PACKAGE-db.xml.gz"` |
| 306 | mv $PACKAGE-db.xml "$outdir/" |
| 307 | |
| 308 | cmd="${DOCBOOK2HTML} -o $split_html_db_dir \"${outdir}/$PACKAGE-db.xml\"" |
| 309 | echo "Generating docbook HTML... ($cmd)" |
| 310 | eval "$cmd" |
| 311 | split_html_db_dir=html_node_db |
| 312 | ( |
| 313 | cd ${split_html_db_dir} || exit 1 |
| 314 | tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html |
| 315 | ) |
| 316 | html_node_db_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"` |
| 317 | rm -f "$outdir"/html_node_db/*.html |
| 318 | mkdir -p "$outdir/html_node_db" |
| 319 | mv ${split_html_db_dir}/*.html "$outdir/html_node_db/" |
| 320 | rmdir ${split_html_db_dir} |
| 321 | |
| 322 | cmd="${DOCBOOK2TXT} \"${outdir}/$PACKAGE-db.xml\"" |
| 323 | echo "Generating docbook ASCII... ($cmd)" |
| 324 | eval "$cmd" |
| 325 | docbook_ascii_size=`calcsize $PACKAGE-db.txt` |
| 326 | mv $PACKAGE-db.txt "$outdir/" |
| 327 | |
| 328 | cmd="${DOCBOOK2PS} \"${outdir}/$PACKAGE-db.xml\"" |
| 329 | echo "Generating docbook PS... ($cmd)" |
| 330 | eval "$cmd" |
| 331 | gzip -f -9 -c $PACKAGE-db.ps >"$outdir/$PACKAGE-db.ps.gz" |
| 332 | docbook_ps_gz_size=`calcsize "$outdir/$PACKAGE-db.ps.gz"` |
| 333 | mv $PACKAGE-db.ps "$outdir/" |
| 334 | |
| 335 | cmd="${DOCBOOK2PDF} \"${outdir}/$PACKAGE-db.xml\"" |
| 336 | echo "Generating docbook PDF... ($cmd)" |
| 337 | eval "$cmd" |
| 338 | docbook_pdf_size=`calcsize $PACKAGE-db.pdf` |
| 339 | mv $PACKAGE-db.pdf "$outdir/" |
| 340 | fi |
| 341 | |
| 342 | echo "Writing index file..." |
| 343 | if test -z "$use_texi2html"; then |
| 344 | CONDS="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\ |
| 345 | /%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d" |
| 346 | else |
| 347 | CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d" |
| 348 | fi |
| 349 | curdate=`$SETLANG date '+%B %d, %Y'` |
| 350 | sed \ |
| 351 | -e "s!%%TITLE%%!$MANUAL_TITLE!g" \ |
| 352 | -e "s!%%EMAIL%%!$EMAIL!g" \ |
| 353 | -e "s!%%PACKAGE%%!$PACKAGE!g" \ |
| 354 | -e "s!%%DATE%%!$curdate!g" \ |
| 355 | -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \ |
| 356 | -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \ |
| 357 | -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \ |
| 358 | -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \ |
| 359 | -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \ |
| 360 | -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \ |
| 361 | -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \ |
| 362 | -e "s!%%PDF_SIZE%%!$pdf_size!g" \ |
| 363 | -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \ |
| 364 | -e "s!%%ASCII_SIZE%%!$ascii_size!g" \ |
| 365 | -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \ |
| 366 | -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \ |
| 367 | -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \ |
| 368 | -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \ |
| 369 | -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \ |
| 370 | -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \ |
| 371 | -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \ |
| 372 | -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \ |
| 373 | -e "s,%%SCRIPTURL%%,$scripturl,g" \ |
| 374 | -e "s!%%SCRIPTNAME%%!$prog!g" \ |
| 375 | -e "$CONDS" \ |
| 376 | $GENDOCS_TEMPLATE_DIR/gendocs_template >"$outdir/index.html" |
| 377 | |
| 378 | echo "Done, see $outdir/ subdirectory for new files." |
| 379 | |
| 380 | # Local variables: |
| 381 | # eval: (add-hook 'write-file-hooks 'time-stamp) |
| 382 | # time-stamp-start: "scriptversion=" |
| 383 | # time-stamp-format: "%:y-%02m-%02d.%02H" |
| 384 | # time-stamp-end: "$" |
| 385 | # End: |