#!/bin/bash report_failure () { echo " **** failed to complete **** " exit 1 } htmlify_python_file () { pygmentize -f html -O full,style=vs $1 > $1.html } build_python_interface () { pushd ../python_examples mkdir build cd build || report_failure cmake ../../tools/python || report_failure make -j4 install || report_failure # Check if we should run all the python examples to make sure they # work without generating an error. if [ $1 == "test-python" ] then cd .. FILES=`ls *.py` for f in $FILES do python $f > /dev/null || report_failure done fi popd } add_links_between_example_programs() { EXT=$3 # Get the list of example program filenames pushd $1 > /dev/null FILES=`ls *.$EXT` popd > /dev/null # Now run sed on all the htmlified example programs to add the links between them. for f in $FILES do #escape the . in the filename escaped_name=`echo $f | sed -e 's/\./\\\./g'` pushd $1 > /dev/null # get a list of all the html example files that contain the name matching_html_files=`grep -e "\b$escaped_name\b" -l *.$EXT | sed -e "s/\.$EXT\b/.$EXT.html/g"` popd > /dev/null # now actually run sed to add the links pushd $2 > /dev/null if [ -n "$matching_html_files" ] then sed -i -e "s/\b$escaped_name\b/$escaped_name<\/a>/g" $matching_html_files fi popd > /dev/null done } htmlify_cmake () { echo "" > $1.html; echo $1 >> $1.html; echo "
" >> $1.html;

#  line 1: make comments green
#  line 2: add links into the add_subdirectory directives
#  line 3: make literal quotes red
#  line 4: make the directives show up blue
#  line 5: make variable names show up purple
    sed -e "s/^\([ ]*#.*\)/\1<\/font>/" \
        -e "s/add_subdirectory\([ ]*\)(\([ ]*\)\([^ ]*\)\([ ]*\)\([^ )]*\)/add_subdirectory\1(\2\3\4\5<\/a>/"  \
        -e "s/\"\([^\"]*\)\"/\"\1<\/font>\"/g"  \
        -e "s/^\([ ]*[^( ]*[ ]*\)(/\1<\/font>(/" \
        -e "s/{\([^}]*\)}/\{\1<\/font>}/g"  \
        $1 >> $1.html;

    echo "
" >> $1.html; } htmlify_python() { FILES=`\ls $1/*.py` for i in $FILES do htmlify_python_file ${i} rm ${i} done } get_short_revision_number() { RESULT=`hg log -r $1 | grep changeset | awk '{print $2}' | sed -e 's/:.*//'` } get_last_modified_date() { RESULT=`hg log $1 -l1 --template '{date|date}\n' | awk '{ print $2" "$3", " $5}'` } makedocs () { COUNTER_FILE=.current_release_number MINOR_COUTNER_FILE=.current_minor_release_number REVNUM_FILE=.logger_revnum # figure out the short number that identifies this particular changeset get_short_revision_number `cat $REVNUM_FILE` LOGGER_REVNUM=$RESULT XSLT_OPTIONS="--nodtdattr --nonet --novalid" DATE_TODAY=`date --date= "+%b %d, %Y"`; # The revision number we are currently at CHANGESET_ID=`hg id -i | sed -e 's/\+//'` get_short_revision_number $CHANGESET_ID REVISION=$RESULT MAJOR_NUM=`cat $COUNTER_FILE` MINOR_NUM=`cat $MINOR_COUTNER_FILE` if [ "$1" = "makerel" ] then RELEASE=${MAJOR_NUM}.${MINOR_NUM} else RELEASE=${MAJOR_NUM}.`echo ${MINOR_NUM}+1|bc`-RC fi; # get XML versions of the change logs BASE_LOGGER_REVNUM=`echo $LOGGER_REVNUM - 1000 | bc` NEXT_LOGGER_REVNUM=`echo $LOGGER_REVNUM + 1 | bc` echo Getting the mercurial change logs for revisions $NEXT_LOGGER_REVNUM:$REVISION hg log -v ../dlib --style=xml -r$NEXT_LOGGER_REVNUM:$REVISION > docs/log.txt || report_failure echo Getting the mercurial change logs for revisions $BASE_LOGGER_REVNUM:$LOGGER_REVNUM hg log -v ../dlib --style=xml -r$BASE_LOGGER_REVNUM:$LOGGER_REVNUM > docs/old_log.txt || report_failure # grab a clean copy of the repository rm -rf docs/cache rm -rf docs/web rm -rf docs/chm/docs rm -rf cache.$$ hg archive cache.$$ || report_failure # put the stuff we need into the docs/cache folder mkdir docs/cache mv cache.$$/dlib docs/cache/ mv cache.$$/examples docs/cache/ mv cache.$$/python_examples docs/cache/ mv cache.$$/tools docs/cache/ rm -rf cache.$$ echo "#ifndef DLIB_REVISION_H" > docs/cache/dlib/revision.h echo "// Version: " $RELEASE >> docs/cache/dlib/revision.h echo "// Date: " `date` >> docs/cache/dlib/revision.h echo "// Mercurial Revision ID: " $CHANGESET_ID >> docs/cache/dlib/revision.h echo "#define DLIB_MAJOR_VERSION " $MAJOR_NUM >> docs/cache/dlib/revision.h echo "#define DLIB_MINOR_VERSION " $MINOR_NUM >> docs/cache/dlib/revision.h echo "#endif" >> docs/cache/dlib/revision.h rm -rf docs/web rm -rf docs/chm/docs mkdir docs/web mkdir docs/chm/docs echo Creating HTML version of the source htmlify --title "dlib C++ Library - " -i docs/cache -o htmltemp.$$ add_links_between_example_programs docs/cache/examples htmltemp.$$/examples cpp echo Copying files around... cp -r htmltemp.$$/dlib docs/web cp -r htmltemp.$$/dlib docs/chm/docs cp -r htmltemp.$$/examples/* docs/web cp -r htmltemp.$$/examples/* docs/chm/docs rm -rf htmltemp.$$ # Create python docs. If we are making a release then stop immediately if # the python docs can't be created (this happens if the .so file isn't compiled) if [ "$1" = "makerel" ] then build_python_interface test-python sphinx-build -b html docs/python sphinx.$$ || report_failure else if [ "$1" != "fast" ] then build_python_interface no-test-python fi; sphinx-build -b html docs/python sphinx.$$ fi; cp -r sphinx.$$ docs/web/python mv sphinx.$$ docs/chm/docs/python cp docs/cache/dlib/test/makefile docs/web/dlib/test cp docs/cache/dlib/test/makefile docs/chm/docs/dlib/test cp docs/cache/dlib/test/CMakeLists.txt docs/web/dlib/test cp docs/cache/dlib/test/CMakeLists.txt docs/chm/docs/dlib/test cp docs/cache/dlib/CMakeLists.txt docs/web/dlib cp docs/cache/dlib/CMakeLists.txt docs/chm/docs/dlib mkdir docs/web/examples || report_failure cp docs/cache/examples/CMakeLists.txt docs/web/examples mkdir docs/chm/docs/examples || report_failure cp docs/cache/examples/CMakeLists.txt docs/chm/docs/examples cp docs/cache/python_examples/*.py docs/chm/docs/ cp docs/cache/python_examples/*.py docs/web/ htmlify_python docs/chm/docs/ htmlify_python docs/web/ add_links_between_example_programs docs/cache/python_examples docs/chm/docs py add_links_between_example_programs docs/cache/python_examples docs/web py cp docs/*.gif docs/web cp docs/*.gif docs/chm/docs cp docs/ml_guide.svg docs/web cp docs/ml_guide.svg docs/chm/docs cp -r docs/guipics docs/web cp -r docs/guipics docs/chm/docs cp docs/*.html docs/web cp docs/*.html docs/chm/docs cp docs/*.png docs/web cp docs/*.ico docs/web cp docs/*.png docs/chm/docs cp docs/*.ico docs/chm/docs cd docs/chm/docs || report_failure htmlify_cmake dlib/CMakeLists.txt; htmlify_cmake examples/CMakeLists.txt; htmlify_cmake dlib/test/CMakeLists.txt; cd ../../.. || report_failure cd docs/web || report_failure htmlify_cmake dlib/CMakeLists.txt; htmlify_cmake examples/CMakeLists.txt; htmlify_cmake dlib/test/CMakeLists.txt; cd ../.. || report_failure find docs/web docs/chm -name "CMakeLists.txt" | xargs rm # generate the HTML docs echo Generate HTML docs from XML and XSLT style sheet FILES=`\ls docs/*.xml | grep -v main_menu.xml` for i in $FILES do # The last modified date for these files should always be the release date (regardless of when the actual xml files were modified). if [ "${i}" = "docs/release_notes.xml" -o ${i} = "docs/old_release_notes.xml" \ -o ${i} = "docs/change_log.xml" -o ${i} = "docs/old_change_log.xml" \ -o ${i} = "docs/index.xml" ] then DATE=$DATE_TODAY else get_last_modified_date ${i} DATE=$RESULT fi; #make web version cat docs/stylesheet.xsl | sed -e 's/"is_chm">[^<]*/"is_chm">false/' -e "s/_CURRENT_RELEASE_/$RELEASE/" -e "s/_LAST_MODIFIED_DATE_/$DATE/" \ > docs/stylesheet.$$.xsl OUT_FILE=$(echo ${i} | sed -e "s/\.xml/\.html/" | sed -e "s/docs\//docs\/web\//") xsltproc $XSLT_OPTIONS -o $OUT_FILE docs/stylesheet.$$.xsl ${i} #make chm version cat docs/stylesheet.xsl | sed -e 's/"is_chm">[^<]*/"is_chm">true/' -e "s/_CURRENT_RELEASE_/$RELEASE/" -e "s/_LAST_MODIFIED_DATE_/$DATE/" \ > docs/stylesheet.$$.xsl OUT_FILE=$(echo ${i} | sed -e "s/\.xml/\.html/" | sed -e "s/docs\//docs\/chm\/docs\//") xsltproc $XSLT_OPTIONS -o $OUT_FILE docs/stylesheet.$$.xsl ${i} rm docs/stylesheet.$$.xsl done # Delete doc type header stuff # FILES=`find docs/chm docs/web -iname "*.html" -type f` # for i in $FILES # do # sed -e '/ temp.$$; # mv temp.$$ ${i}; # done echo Generating sitemap cd docs/web || report_failure find . -name "*.html" | awk '{ print "http://dlib.net" substr($1,2)}' > sitemap.txt # make the main index have a 301 redirect. Use php to do this echo '' > index.php cat index.html >> index.php rm index.html cd ../.. } ./testenv || report_failure # build all the html documentation makedocs $1 # now make the table of contents for the chm file echo Generating the table of contents for the chm file xsltproc -o docs/chm/Table\ of\ Contents.hhc docs/chm/htmlhelp_stylesheet.xsl docs/chm/toc.xml