#!/bin/sh
#
#############################################################################
#
# Updates the Doxygen generated documentation files in the source tree.
# If the doxygen command is not installed, it will exit with an error.
# This script can generate Doxygen documentation for all source files or for
# just liblzma API header files.
#
# It is recommended to use this script to update the Doxygen-generated HTML
# files since this will include the package version in the output and,
# in case of liblzma API docs, strip JavaScript files from the output.
#
#############################################################################
#
# Authors: Jia Tan
#          Lasse Collin
#
# This file has been put into the public domain.
# You can do whatever you want with this file.
#
#############################################################################

set -e

if type doxygen > /dev/null 2>&1; then
	:
else
	echo "doxygen/update-doxygen: 'doxygen' command not found." >&2
	echo "doxygen/update-doxygen: Skipping Doxygen docs generation." >&2
	exit 1
fi

if test ! -f Doxyfile; then
	cd `dirname "$0"` || exit 1
	if test ! -f Doxyfile; then
		echo "doxygen/update-doxygen: Cannot find Doxyfile" >&2
		exit 1
	fi
fi

# Get the package version so that it can be included in the generated docs.
PACKAGE_VERSION=`cd .. && sh build-aux/version.sh` || exit 1

# If no arguments are specified, default to generating liblzma API header
# documentation only.
case $1 in
	'' | api)
		# Remove old documentation before re-generating the new.
		rm -rf ../doc/api

		# Generate the HTML documentation by preparing the Doxyfile
		# in stdin and piping the result to the doxygen command.
		# With Doxygen, the last assignment of a value to a tag will
		# override any earlier assignment. So, we can use this
		# feature to override the tags that need to change between
		# "api" and "internal" modes.
		(
			cat Doxyfile
			echo "PROJECT_NUMBER         = $PACKAGE_VERSION"
		) | doxygen -

		# As of Doxygen 1.8.0 - 1.9.6 and the Doxyfile options we use,
		# the output is good without any JavaScript. Unfortunately
		# Doxygen doesn't have an option to disable JavaScript usage
		# completely so we strip it away with the hack below.
		#
		# Omitting the JavaScript code avoids some license hassle
		# as jquery.js is fairly big, it contains more than jQuery
		# itself, and doesn't include the actual license text (it
		# only refers to the MIT license by name).
		echo "Stripping JavaScript from Doxygen output..."
		for F in ../doc/api/*.html
		do
			sed 's/<script [^>]*><\/script>//g
				s/onclick="[^"]*"//g' \
				"$F" > ../doc/api/tmp
			mv -f ../doc/api/tmp "$F"
		done
		rm -f ../doc/api/*.js
		;;

	internal)
		# The docs from internal aren't for distribution so
		# the JavaScript files aren't an issue here.
		rm -rf ../doc/internal
		(
			cat Doxyfile
			echo "PROJECT_NUMBER         = $PACKAGE_VERSION"
			echo 'PROJECT_NAME           = "XZ Utils"'
			echo 'STRIP_FROM_PATH        = ../src'
			echo 'INPUT                  = ../src'
			echo 'HTML_OUTPUT            = internal'
			echo 'EXTRACT_PRIVATE        = YES'
			echo 'EXTRACT_STATIC         = YES'
			echo 'EXTRACT_LOCAL_CLASSES  = YES'
			echo 'SEARCHENGINE           = YES'
		) | doxygen -
		;;

	*)
		echo "doxygen/update-doxygen: Error: mode argument '$1'" \
			"is not supported." >&2
		echo "doxygen/update-doxygen: Supported modes:" >&2
		echo "doxygen/update-doxygen: - 'api' (default):" \
			"liblzma API docs into doc/api" >&2
		echo "doxygen/update-doxygen: - 'internal':"\
			"internal docs into doc/internal" >&2
		exit 1
		;;
esac