#!/bin/sh

# Script to check for catalogs, stylesheets, XSL processors and all
# the other stuff necessary to convert the XML documentation.

_xsltwrapper="xsltproc.sh"
_xmllintwrapper="xmllint.sh"

echo "Searching for XML catalogs..."
for _try_catalog in \
  /etc/xml/catalog \
  /usr/share/sgml/docbook/xml-dtd-4.1.2/xmlcatalog \
  /usr/share/apps/ksgmltools2/customization/en/catalog \
  /usr/share/sgml/catalog \
  /usr/local/share/sgml/catalog \
  /usr/lib/sgml/catalog \
  /usr/local/lib/sgml/catalog \
  /usr/share/docbook-xml42/catalog.xml \
  /usr/share/sgml/docbook/xmlcatalog
do
  if test -f "$_try_catalog"
  then
    _catalog=$_try_catalog
    break
  fi
done

if test -n "$_catalog"
then
  echo "Found XML catalog at $_catalog"
  _xmlcatalog="export SGML_CATALOG_FILES=$_catalog"
else
  echo "No XML catalog found."
fi

echo "Searching for DTD..."
for _try_dtd in \
  /usr/share/sgml/docbook/dtd/xml/4.1.2/docbookx.dtd \
  /usr/share/docbook-xml42/docbookx.dtd \
  /usr/share/sgml/docbook/xml-dtd-4.1.2*/docbookx.dtd \
  /usr/share/sgml/docbook/xml-dtd-4.2/docbookx.dtd \
  /usr/share/xml/docbook/schema/dtd/4.2/docbookx.dtd \
  /usr/share/sgml/docbook/dtd/4.2/docbookx.dtd \
  /usr/share/xml/docbook/4.*/docbookx.dtd 
do
  if test -f "$_try_dtd"
  then
    _dtd=$_try_dtd
    break
  fi
done

if test -z "$_dtd"
then
  _dtd=http://www.docbook.org/xml/4.3/docbookx.dtd
  echo "Not found. Using fallback web version ($_dtd)."
  _web_dtd=yes
  _web_needed=yes
else
  echo "Found docbookx.dtd at $_dtd"
fi

echo "Searching for profiling/profile.xsl..."
for _try_profile_xsl in \
  /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/profiling/profile.xsl \
  /usr/share/sgml/docbook/yelp/docbook/html/profiling/profile.xsl \
  /usr/local/share/sgml/docbook/stylesheet/xsl/nwalsh/profiling/profile.xsl \
  /usr/local/share/sgml/docbook/yelp/docbook/profiling/profile.xsl \
  /usr/share/docbook-xsl/profiling/profile.xsl \
  /usr/share/sgml/docbook/xsl-stylesheets*/profiling/profile.xsl
do
  if test -f "$_try_profile_xsl"
  then
    _profile_xsl=$_try_profile_xsl
    break
  fi
done

if test -z "$_profile_xsl"
then
  _profile_xsl=http://docbook.sourceforge.net/release/xsl/current/profiling/profile.xsl
  echo "Not found. Using fallback web-version ($_profile_xsl)."
  _web_profile_xsl=yes
  _web_needed=yes
else
  echo "Found profile.xsl at $_profile_xsl"
fi

echo "Searching for stylesheets..."
echo "Searching for html/chunk.xsl..."
for _try_chunk_xsl in \
  /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/chunk.xsl \
  /usr/share/sgml/docbook/yelp/docbook/html/chunk.xsl \
  /usr/local/share/sgml/docbook/stylesheet/xsl/nwalsh/html/chunk.xsl \
  /usr/local/share/sgml/docbook/yelp/docbook/html/chunk.xsl \
  /usr/share/docbook-xsl/html/chunk.xsl \
  /usr/share/sgml/docbook/xsl-stylesheets*/html/chunk.xsl
do
  if test -f "$_try_chunk_xsl"
  then
    _chunk_xsl=$_try_chunk_xsl
    break
  fi
done

if test -z "$_chunk_xsl"
then
  _chunk_xsl=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/chunk.xsl
  echo "Not found. Using fallback web version ($_chunk_xsl)"
  _web_chunk_xsl=yes
  _web_needed=yes
else
  echo "Found chunk.xsl at $_chunk_xsl"
fi

echo "Searching for html/docbook.xsl..."
for _try_docbook_xsl in \
  /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/docbook.xsl \
  /usr/share/sgml/docbook/yelp/docbook/html/docbook.xsl \
  /usr/local/share/sgml/docbook/stylesheet/xsl/nwalsh/html/docbook.xsl \
  /usr/local/share/sgml/docbook/yelp/docbook/html/docbook.xsl \
  /usr/share/docbook-xsl/html/docbook.xsl \
  /usr/share/sgml/docbook/xsl-stylesheets*/html/docbook.xsl
do
  if test -f "$_try_docbook_xsl"
  then
    _docbook_xsl=$_try_docbook_xsl
    break
  fi
done

if test -z "$_docbook_xsl"
then
  _docbook_xsl=http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
  echo "Not found. Using fallback web version ($_docbook_xsl)"
  _web_docbook_xsl=yes
  _web_needed=yes
else
  echo "Found docbook.xsl at $_docbook_xsl"
fi

cat > stylesheets/profile.xsl << EOF
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>
<!-- **************************************************
     This file is generated automatically. DO NOT EDIT.
     ************************************************** -->

  <xsl:import
      href="$_profile_xsl" />

  <!-- Generate DocBook instance with correct DOCTYPE -->
  <xsl:output method="xml" encoding="utf-8"
    doctype-public="-//OASIS//DTD DocBook XML V4.3//EN"
    doctype-system="http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"/>
</xsl:stylesheet>
EOF

cat > stylesheets/html-chunk.xsl << EOF
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- **************************************************
     This file is generated automatically. DO NOT EDIT.
     ************************************************** -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <xsl:import
      href="$_chunk_xsl"/>
  <xsl:include href="html-common.xsl"/>

</xsl:stylesheet>
EOF

cat > stylesheets/html-single.xsl << EOF
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- **************************************************
     This file is generated automatically. DO NOT EDIT.
     ************************************************** -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <xsl:import 
      href="$_docbook_xsl"/>
  <xsl:include href="html-common.xsl"/>

</xsl:stylesheet>
EOF

echo "Looking for a valid XSLT processor..."
# Checks for xsltproc, then checks for the Saxon processor (it needs Java).
# Also checks for Jade/OpenJade.
#FIXME: Add support for the xalan/xalan2 XSLT processors.

if xsltproc --version &> /dev/null
then
  if test -z "$_web_needed"
  then
    echo "Found xsltproc & all required resources, ready to start build process."
  else
    echo "ERROR: Found xsltproc but some stylesheets were not on your system."
    echo "Please check that you've installed docbook-xsl and docbook-xml and "
    echo "and if necessary, make sure that ./configure is looking for them in "
    echo "the right places."
    echo "If all else fails... you can continue from here, but you'll need "
    echo "an open connection to the internet, every time you build, there'll "
    echo "probably be some downloading."
    if test -n "$_catalog"
    then
      echo "I found a catalog ($_catalog), and I'll use this to resolve to "
      echo "local resources wherever I can."
    else
      echo "I didn't find a catalog, so I won't be able to resolve any of "
      echo "these urls to local resources."
    fi
  fi

  if test -n "$_catalog"
  then
    _xsltcommand="xsltproc --catalogs --stringparam l10n.gentext.default.language \"\$4\" --stringparam profile.lang \"\$4\" -o \$1 \$2 \$3"
  else
    _xsltcommand="xsltproc --stringparam l10n.gentext.default.language \"\$4\" --stringparam profile.lang \"\$4\" -o \$1 \$2 \$3"
  fi
fi


# xsltproc not found.
# Now try to find a good Java virtual machine.
# FIXME: We need more checks for Java virtual machines.
if test -z "$_xsltcommand"
then
  #FIXME: Add more suitable machines!!!
  for _try_java in java gij-3.3 gij-3.2 gij-3.1 gij-3.0 gij
  do
    if $_try_java --version > /dev/null 2>&1 || $_try_java -version > /dev/null 2>&1
    then
      _java=$_try_java
      break
    fi
  done
  if test -z "$_java"
  then
    echo "Java VM not found."
  else
    # Try to find the right jar files for classpath.
    # This must not trigger on something like saxon-fop-6.4.4.jar.
    for _try_saxon_jar in \
      /usr/share/java/saxon-[0-9]*.jar \
      /usr/local/share/java/saxon-[0-9]*.jar \
      /usr/share/java/saxon.jar \
      /usr/local/share/java/saxon.jar
    do
      if test -f "$_try_saxon_jar"
      then
        _saxon_jar=$_try_saxon_jar
        #Don't break to find the _latest_ saxon.jar.
      fi
    done
    if test -n "$_saxon_jar"
    then
      if test -z "$_fake_chunk_xsl"
      then
#        _xsltcommand="cd \$1 && if test \"\`dirname \$2 | head -c 1\`\" = \".\" ; then $_java  -classpath $_saxon_jar com.icl.saxon.StyleSheet \$_IN_DIR/\$3 \$_IN_DIR/\$2 ; else $_java  -classpath $_saxon_jar com.icl.saxon.StyleSheet \$_IN_DIR/\$3 \$2 ;fi"
	_xsltcommand="
if test \"\`dirname \$2 | head -c 1\`\" = \".\"
then
  _STYLESHEET=\$_IN_DIR/\$2
else
  _STYLESHEET=\$2
fi

if test -d \$1
then
  _DIRNAME=\"\$1\"
  _OUTPUT=\"\"
else
  _DIRNAME=\"\`dirname \$1\`\"
  _OUTPUT=\"-o \`basename \$1\`\"
fi

cd \$_DIRNAME &&
  java  -classpath /usr/share/java/saxon.jar com.icl.saxon.StyleSheet \$_OUTPUT \$_IN_DIR/\$3 \$_STYLESHEET
  "

        echo "Found the Saxon XSLT Processor ($_saxon_jar), using Java VM '$_java'."
      else
        echo "Found the Saxon XSLT processor but no stylesheets on your system."
        echo "Saxon is unusable without stylesheets."
      fi
    fi
  fi
fi



if test -z "$_xsltcommand"
then
  # Java not found.
  # now try openjade/jade.
  for _try_jade in jade openjade
  do
    if command -v $_try_jade > /dev/null
    then
      _jade=$_try_jade
      break
    fi
  done
  if test -n "$_jade"
  then
    echo "xsltproc and Saxon XSLT processors not found."
    echo "I will try to use OpenJade or Jade (using '$_jade')."
    echo "They aren't (currently) fully supported, however."
    for _try_docbook_dsl in \
      /usr/share/sgml/docbook/stylesheet/dsssl/modular/html/docbook.dsl \
      /usr/local/share/sgml/docbook/stylesheet/dsssl/modular/html/docbook.dsl
    do
      if test -f "$_try_docbook_dsl"
      then
        _docbook_dsl=$_try_docbook_dsl
        break
      fi
    done
    for _try_xml_dcl in \
      /usr/share/sgml/declaration/xml.dcl \
      /usr/local/share/sgml/declaration/xml.dcl
    do
      if test -f "$_try_xml_dcl"
      then
        _xml_dcl=$_try_xml_dcl
        break
      fi
    done
      if test "x$_docbook_dsl" = "x" -o "x$_xml_dcl" = "x"
      then
  	echo "One of the files docbook.dsl and xml.dcl or both of them weren't found."
  	echo "Bailing out."
  	exit 1
      fi
    _xsltcommand="cd \$1 && $_jade -t xml -d $_docbook_dsl $_xml_dcl \$_IN_DIR/\$3"
  else
    echo "No valid XSLT processor found."
    echo "Bailing out."
    exit 1
  fi
fi



cat > $_xsltwrapper << EOF
#!/bin/sh
# **************************************************
# This file is generated automatically. DO NOT EDIT.
# **************************************************
# This is a small wrapper script around many ways to call the XSLT processor.
# It accepts 4 arguments: <output_dir> <stylesheet_name> <main XML file name> <lang>
_IN_DIR=\`pwd\`

$_xmlcatalog
$_xsltcommand
EOF

chmod +x $_xsltwrapper


echo "Searching for XML checker..."
for _try_xmllint in xmllint
do
  if command -v $_try_xmllint > /dev/null 2>&1
  then
    echo "Found $_try_xmllint"
    if test -n "$_catalog"
    then
      _xmllint_command="$_try_xmllint --noout --noent --postvalid --catalogs \$*"
    else
      _xmllint_command="$_try_xmllint --noout --noent --postvalid \$*"
    fi
    break
  fi
done

if test -z "$_xmllint_command"
then
  echo "Not found"
  _xmllint_command=true
fi

cat > $_xmllintwrapper << EOF
#!/bin/sh
# **************************************************
# This file is generated automatically. DO NOT EDIT.
# **************************************************
# This is a small wrapper for XML lintian programs.
$_xmlcatalog
$_xmllint_command
EOF

chmod +x $_xmllintwrapper
