#!/bin/bash # $Id: install.sh 7942 2008-03-26 06:08:08Z xmldoc $ # $Source$ # # install.sh - Set up user environment for a XML/XSLT distribution # This is as an interactive installer for updating your # environment to use an XML/XSLT distribution such as the DocBook # XSL Stylesheets. Its main purpose is to configure your # environment with XML catalog data and schema "locating rules" # data provided in the XML/XSLT distribution. # # Although this installer was created for the DocBook project, it # is a general-purpose tool that can be used with any XML/XSLT # distribution that provides XML/SGML catalogs and locating rules. # # This script is mainly intended to make things easier for you if # you want to install a particular XML/XSLT distribution that has # not (yet) been packaged for your OS distro (Debian, Fedora, # whatever), or to use "snapshot" or development releases # # It works by updating your shell startup file (e.g., .bashrc and # .cshrc) and .emacs file and by finding or creating a writable # CatalogManager.properties file to update. # # It makes backup copies of any files it touches, and also # generates a uninstall.sh script for reverting its changes. # # In the same directory where it is located, it expects to find # the following four files: # - locatingrules.xml # - catalog.xml # - catalog # - .urilist # And if it's unable to locate a CatalogManager.properties file in # your environment, it expects to find an "example" one in the # same directory as itself, which it copies over to your # ~/.resolver directory. # # If the distribution contains any executables, change the value # of the thisBinDir to a colon-separated list of the pathnames of # the directories that contain those executables. # mydir is the "canonical" absolute pathname for install.sh mydir=$(cd -P $(dirname $0) && pwd -P) || exit 1 thisLocatingRules=$mydir/locatingrules.xml thisXmlCatalog=$mydir/catalog.xml thisSgmlCatalog=$mydir/catalog # .urilist file contains a list of pairs of local pathnames and # URIs to test for catalog resolution thisUriList=$mydir/.urilist exampleCatalogManager=$mydir/.CatalogManager.properties.example thisCatalogManager=$HOME/.resolver/CatalogManager.properties # thisBinDir directory is a colon-separated list of the pathnames # to all directories that contain executables provided with the # distribution (for example, the DocBook XSL Stylesheets # distribution contains a "docbook-xsl-update" convenience script # for rsync'ing up to the latest docbook-xsl snapshot). The # install.sh script adds the value of thisBinDir to your PATH # environment variable thisBinDir=$mydir/tools/bin emit_message() { echo "$1" 1>&2 } if [ ! "${*#--batch}" = "$*" ]; then batchmode="Yes"; else batchmode="No"; emit_message if [ ! "$1" = "--test" ]; then emit_message "NOTE: For non-interactive installs/uninstalls, use --batch" if [ ! "$1" = "--uninstall" ]; then emit_message fi fi fi osName="Unidentified" if uname -s | grep -qi "cygwin"; then osName="Cygwin" fi classPathSeparator=":" if [ "$osName" = "Cygwin" ]; then thisJavaXmlCatalog=$(cygpath -m $thisXmlCatalog) classPathSeparator=";" else thisJavaXmlCatalog=$thisXmlCatalog fi main() { removeOldFiles checkRoot updateCatalogManager checkForResolver writeDotFiles updateUserStartupFiles updateUserDotEmacs writeUninstallFile writeTestFile printExitMessage } removeOldFiles() { rm -f $mydir/.profile.incl rm -f $mydir/.cshrc.incl rm -f $mydir/.emacs.el } checkRoot() { if [ $(id -u) == "0" ]; then cat 1>&2 <<EOF WARNING: This install script is meant to be run as a non-root user, but you are running it as root. EOF read -s -n1 -p "Are you sure you want to continue? [No] " emit_message "$REPLY" case $REPLY in [yY]) emit_message ;; *) emit_message "OK, exiting without making changes." exit ;; esac fi return 0 } updateCatalogManager() { # - finds or creates a writable CatalogManager.properties file # # - adds the catalog.xml file for this distribution to the # CatalogManager.properties file found if [ -z "$CLASSPATH" ]; then cat 1>&2 <<EOF NOTE: There is no CLASSPATH variable set in your environment. No attempt was made to find a CatalogManager.properties file. Using $thisCatalogManager instead EOF else # split CLASSPATH in a list of pathnames by replacing all separator # characters with spaces if [ "$osName" = "Cygwin" ]; then pathnames=$(echo $CLASSPATH | tr ";" " ") else pathnames=$(echo $CLASSPATH | tr ":" " ") fi for path in $pathnames; do if [ "$osName" = "Cygwin" ]; then path=$(cygpath -u $path) fi # strip out trailing slash from pathname path=$(echo $path | sed 's/\/$//') # find CatalogManager.properties file if [ -f $path/CatalogManager.properties ]; then existingCatalogManager=$path/CatalogManager.properties break fi done fi # end of CLASSPATH check if [ -w "$existingCatalogManager" ]; then # existing CatalogManager.properties was found and it is # writable, so use it myCatalogManager=$existingCatalogManager else if [ -f "$existingCatalogManager" ]; then # a non-writable CatalogManager.properties exists, so emit a # note saying that it won't be used cat 1>&2 <<EOF NOTE: $existingCatalogManager file found, but you don't have permission to write to it. Will instead use: $thisCatalogManager EOF else # CLASSPATH is set, but no CatalogManager.properties found if [ -n "$CLASSPATH" ]; then cat 1>&2 <<EOF NOTE: No CatalogManager.properties found from CLASSPATH. Will instead use: $thisCatalogManager EOF fi fi if [ "$batchmode" = "Yes" ]; then emit_message fi # end of check for existing writable CatalogManager.properties if [ -f $thisCatalogManager ]; then myCatalogManager=$thisCatalogManager else REPLY="" if [ ! "$batchmode" = "Yes" ]; then emit_message read -s -n1 -p "Create $thisCatalogManager file? [Yes] " emit_message "$REPLY" emit_message fi case $REPLY in [nNqQ]) emitNoChangeMsg ;; *) if [ ! -d "${thisCatalogManager%/*}" ]; then mkdir -p ${thisCatalogManager%/*} fi cp $mydir/.CatalogManager.properties.example $thisCatalogManager || exit 1 emit_message "NOTE: Created the following file:" emit_message " $thisCatalogManager" myCatalogManager=$thisCatalogManager ;; esac # end of creating "private" CatalogManager.properties fi # end of check for "private" CatalogManager.properties fi # end of check finding/creating writable CatalogManager.properties if [ -n "$myCatalogManager" ]; then etcXmlCatalog= catalogsLine=$(grep "^catalogs=" $myCatalogManager) if [ -f /etc/xml/catalog ] && [ "$osName" != "Cygwin" ] \ && [ "${catalogsLine#*/etc/xml/catalog*}" = "$catalogsLine" ]; then cat 1>&2 <<EOF WARNING: /etc/xml/catalog exists but was not found in: $myCatalogManager If /etc/xml/catalog file has content, you probably should reference it in: $myCatalogManager This installer can automatically add it for you, but BE WARNED that once it has been added, the uninstaller for this distribution CANNOT REMOVE IT automatically during uninstall. If you no longer want it included, you will need to remove it manually. EOF REPLY="" if [ ! "$batchmode" = "Yes" ]; then read -s -n1 -p "Add /etc/xml/catalog to $myCatalogManager? [Yes] " emit_message "$REPLY" fi case $REPLY in [nNqQ]) emit_message ;; *) etcXmlCatalog=/etc/xml/catalog ;; esac fi catalogBackup="$myCatalogManager.$$.bak" if [ ! -w "${myCatalogManager%/*}" ]; then emit_message emit_message "WARNING: ${myCatalogManager%/*} directory is not writable." emit_message emitNoChangeMsg else REPLY="" if [ ! "$batchmode" = "Yes" ]; then emit_message emit_message "Add $thisJavaXmlCatalog" read -s -n1 -p "to $myCatalogManager file? [Yes] " emit_message "$REPLY" emit_message fi case $REPLY in [nNqQ]) emitNoChangeMsg ;; *) if [ "$catalogsLine" ] ; then if [ "${catalogsLine#*$thisJavaXmlCatalog*}" != "$catalogsLine" ]; then emit_message "NOTE: $thisJavaXmlCatalog" emit_message " already in:" emit_message " $myCatalogManager" else mv $myCatalogManager $catalogBackup || exit 1 sed "s#^catalogs=\(.*\)\$#catalogs=$thisJavaXmlCatalog;\1;$etcXmlCatalog#" $catalogBackup \ | sed 's/;\+/;/' | sed 's/;$//' > $myCatalogManager || exit 1 emit_message "NOTE: Successfully updated the following file:" emit_message " $myCatalogManager" emit_message " Backup written to:" emit_message " $catalogBackup" fi else mv $myCatalogManager $catalogBackup || exit 1 cp $catalogBackup $myCatalogManager echo "catalogs=$thisJavaXmlCatalog;$etcXmlCatalog" \ | sed 's/;\+/;/' | sed 's/;$//' >> $myCatalogManager || exit 1 emit_message "NOTE: \"catalogs=\" line added to $myCatalogManager." emit_message " Backup written to $catalogBackup" fi ;; esac # end of backing up and updating CatalogManager.properties fi fi # end of CatalogManager.properties updates if [ "$osName" = "Cygwin" ]; then myCatalogManager=$(cygpath -m $myCatalogManager) fi return 0 } writeDotFiles() { while read; do echo "$REPLY" >> $mydir/.profile.incl done <<EOF # $thisBinDir is not in PATH, so add it if [ "\${PATH#*$thisBinDir*}" = "\$PATH" ]; then PATH="$thisBinDir:\$PATH" export PATH fi if [ -z "\$XML_CATALOG_FILES" ]; then XML_CATALOG_FILES="$thisXmlCatalog" else # $thisXmlCatalog is not in XML_CATALOG_FILES, so add it if [ "\${XML_CATALOG_FILES#*$thisXmlCatalog*}" = "\$XML_CATALOG_FILES" ]; then XML_CATALOG_FILES="$thisXmlCatalog \$XML_CATALOG_FILES" fi fi # /etc/xml/catalog exists but is not in XML_CATALOG_FILES, so add it if [ -f /etc/xml/catalog ] && \ [ "\${XML_CATALOG_FILES#*/etc/xml/catalog*}" = "\$XML_CATALOG_FILES" ]; then XML_CATALOG_FILES="\$XML_CATALOG_FILES /etc/xml/catalog" fi export XML_CATALOG_FILES if [ -z "\$SGML_CATALOG_FILES" ]; then SGML_CATALOG_FILES="$thisSgmlCatalog" else # $thisSgmlCatalog is not in SGML_CATALOG_FILES, so add it if [ "\${SGML_CATALOG_FILES#*$thisSgmlCatalog}" = "\$SGML_CATALOG_FILES" ]; then SGML_CATALOG_FILES="$thisSgmlCatalog:\$SGML_CATALOG_FILES" fi fi # /etc/sgml/catalog exists but is not in SGML_CATALOG_FILES, so add it if [ -f /etc/sgml/catalog ] && \ [ "\${SGML_CATALOG_FILES#*/etc/sgml/catalog*}" = "\$SGML_CATALOG_FILES" ]; then SGML_CATALOG_FILES="\$SGML_CATALOG_FILES:/etc/sgml/catalog" fi export SGML_CATALOG_FILES EOF while read; do echo "$REPLY" >> $mydir/.cshrc.incl done <<EOF # $thisBinDir is not in PATH, so add it if ( "\\\`echo \$PATH | grep -v $thisBinDir\\\`" != "" ) then setenv PATH "$thisBinDir:\$PATH" endif if ( ! $\?XML_CATALOG_FILES ) then setenv XML_CATALOG_FILES "$thisXmlCatalog" # $thisXmlCatalog is not in XML_CATALOG_FILES, so add it else if ( "\\\`echo \$XML_CATALOG_FILES | grep -v $thisXmlCatalog\\\`" != "" ) then setenv XML_CATALOG_FILES "$thisXmlCatalog \$XML_CATALOG_FILES" endif endif # /etc/xml/catalog exists but is not in XML_CATALOG_FILES, so add it if ( -f /etc/xml/catalog && "\\\`echo \$XML_CATALOG_FILES | grep -v /etc/xml/catalog\\\`" != "" ) then setenv XML_CATALOG_FILES "\$XML_CATALOG_FILES /etc/xml/catalog" endif endif if ( ! $\?SGML_CATALOG_FILES ) then setenv SGML_CATALOG_FILES "$thisSgmlCatalog" else if ( "\\\`echo \$SGML_CATALOG_FILES | grep -v $thisSgmlCatalog\\\`" != "" ) then setenv SGML_CATALOG_FILES "$thisSgmlCatalog:\$SGML_CATALOG_FILES" endif endif # /etc/SGML/catalog exists but is not in SGML_CATALOG_FILES, so add it if ( -f /etc/sgml/catalog && "\\\`echo \$SGML_CATALOG_FILES | grep -v /etc/sgml/catalog\\\`" != "" ) then setenv SGML_CATALOG_FILES {\$SGML_CATALOG_FILES}:/etc/sgml/catalog endif EOF if [ -n "$myCatalogManager" ]; then myCatalogManagerDir=${myCatalogManager%/*} while read; do echo "$REPLY" >> $mydir/.profile.incl done <<EOF if [ -z "\$CLASSPATH" ]; then CLASSPATH="$myCatalogManagerDir" else # $myCatalogManagerDir is not in CLASSPATH, so add it if [ "\${CLASSPATH#*$myCatalogManagerDir*}" = "\$CLASSPATH" ]; then CLASSPATH="$myCatalogManagerDir$classPathSeparator\$CLASSPATH" fi fi export CLASSPATH EOF while read; do echo "$REPLY" >> $mydir/.cshrc.incl done <<EOF if ( ! $\?CLASSPATH ) then setenv CLASSPATH "$myCatalogManagerDir" # $myCatalogManagerDir is not in CLASSPATH, so add it else if ( "\\\`echo \$CLASSPATH | grep -v $myCatalogManagerDir\\\`" != "" ) then setenv CLASSPATH "$myCatalogManagerDir$classPathSeparator\$CLASSPATH" endif endif EOF fi while read; do echo "$REPLY" >> $mydir/.emacs.el done <<EOF (add-hook 'nxml-mode-hook (lambda () (setq rng-schema-locating-files-default (append '("$thisLocatingRules") rng-schema-locating-files-default )))) EOF return 0 } updateUserStartupFiles() { if [ ! "$batchmode" = "Yes" ]; then cat 1>&2 <<EOF NOTE: To source your environment correctly for using the catalog files in this distribution, you need to update one or more of your shell startup files. This installer can automatically make the necessary changes. Or, if you prefer, you can make the changes manually. EOF else emit_message fi # if running csh or tcsh, target .cshrc and .tcshrc files for # update; otherwise, target .bash_* and .profiles parent=$(ps -p $PPID | grep "/") if [ "${parent#*csh}" != "$parent" ] || [ "${parent#*tcsh}" != "$parent" ]; then myStartupFiles=".cshrc .tcshrc" appendLine="source $mydir/.cshrc.incl" else myStartupFiles=".bash_profile .bash_login .profile .bashrc" appendLine=". $mydir/.profile.incl" fi for file in $myStartupFiles; do if [ -f "$HOME/$file" ]; then dotFileBackup=$HOME/$file.$$.bak REPLY="" if [ ! "$batchmode" = "Yes" ]; then read -s -n1 -p "Update $HOME/$file? [Yes] " emit_message "$REPLY" fi case $REPLY in [nNqQ]) cat 1>&2 <<EOF NOTE: No change made to $HOME/$file. You either need to add the following line to it, or manually source the shell environment for this distribution each time you want use it. $appendLine EOF ;; *) lineExists="$(grep "$appendLine" $HOME/$file )" if [ ! "$lineExists" ]; then mv $HOME/$file $dotFileBackup || exit 1 cp $dotFileBackup $HOME/$file || exit 1 echo "$appendLine" >> $HOME/$file || exit 1 cat 1>&2 <<EOF NOTE: Successfully updated the following file: $HOME/$file Backup written to: $dotFileBackup EOF else cat 1>&2 <<EOF NOTE: The following file already contains information for this distribution, so I did not update it. $HOME/$file EOF fi ;; esac fi done if [ -z "$dotFileBackup" ]; then if [ ! "$batchmode" = "Yes" ]; then emit_message fi cat 1>&2 <<EOF NOTE: No shell startup files updated. You can source the environment for this distribution manually, each time you want to use it, by typing the following. $appendLine EOF fi } updateUserDotEmacs() { if [ -f $thisLocatingRules ]; then cat 1>&2 <<EOF NOTE: This distribution includes a "schema locating rules" file for Emacs/nXML. To use it, you should update either your .emacs or .emacs.el file. This installer can automatically make the necessary changes. Or, if you prefer, you can make the changes manually. EOF emacsAppendLine="(load-file \"$mydir/.emacs.el\")" myEmacsFile= for file in .emacs .emacs.el; do if [ -f "$HOME/$file" ]; then myEmacsFile=$HOME/$file break fi done if [ ! -f "$myEmacsFile" ]; then REPLY="" if [ ! "$batchmode" = "Yes" ]; then read -s -n1 -p "No .emacs or .emacs.el file. Create one? [No] " emit_message "$REPLY" emit_message fi case $REPLY in [yY]) myEmacsFile=$HOME/.emacs touch $myEmacsFile ;; *) cat 1>&2 <<EOF NOTE: No Emacs changes made. To use this distribution with, Emacs/nXML, you can create a .emacs file and manually add the following line to it, or you can run it as a command within Emacs. $emacsAppendLine EOF ;; esac fi if [ -n "$myEmacsFile" ]; then REPLY="" if [ ! "$batchmode" = "Yes" ]; then read -s -n1 -p "Update $myEmacsFile? [Yes] " emit_message "$REPLY" emit_message fi case $REPLY in [nNqQ]) cat 1>&2 <<EOF NOTE: No change made to $myEmacsFile. To use this distribution with Emacs/nXML, you can manually add the following line to your $myEmacsFile, or you can run it as a command within Emacs. $emacsAppendLine EOF ;; *) lineExists="$(grep "$emacsAppendLine" $myEmacsFile)" if [ ! "$lineExists" ]; then dotEmacsBackup=$myEmacsFile.$$.bak mv $myEmacsFile $dotEmacsBackup || exit 1 cp $dotEmacsBackup $myEmacsFile || exit 1 echo "$emacsAppendLine" >> $myEmacsFile || exit 1 cat 1>&2 <<EOF NOTE: Successfully updated the following file: $myEmacsFile Backup written to: $dotEmacsBackup EOF else cat 1>&2 <<EOF NOTE: The following file already contains information for this distribution, so I did not update it. $myEmacsFile EOF fi ;; esac fi fi } uninstall() { if [ ! "$batchmode" = "Yes" ]; then cat 1>&2 <<EOF NOTE: To "uninstall" this distribution, the changes made to your CatalogManagers.properties, startup files, and/or .emacs file need to be reverted. This uninstaller can automatically revert them. Or, if you prefer, you can revert them manually. EOF fi if [ "$osName" = "Cygwin" ]; then thisXmlCatalog=$thisJavaXmlCatalog fi # make "escaped" version of PWD to use with sed and grep escapedPwd=$(echo $mydir | sed "s#/#\\\\\/#g") # check to see if a non-empty value for catalogManager was fed # to uninstaller. if [ -n ${1#--catalogManager=} ]; then myCatalogManager=${1#--catalogManager=} catalogBackup="$myCatalogManager.$$.bak" catalogsLine=$(grep "^catalogs=" $myCatalogManager) if [ "$catalogsLine" ] ; then if [ "${catalogsLine#*$thisXmlCatalog*}" != "$catalogsLine" ]; then REPLY="" if [ ! "$batchmode" = "Yes" ]; then read -s -n1 -p "Revert $myCatalogManager? [Yes] " emit_message "$REPLY" fi case $REPLY in [nNqQ]*) cat 1>&2 <<EOF NOTE: No change made to $myCatalogManager. You need to manually remove the following path from the "catalog=" line. $thisXmlCatalog EOF ;; *) mv $myCatalogManager $catalogBackup || exit 1 sed "s#^catalogs=\(.*\)$thisXmlCatalog\(.*\)\$#catalogs=\1\2#" $catalogBackup \ | sed 's/;\+/;/' | sed 's/;$//' | sed 's/=;/=/' > $myCatalogManager || exit 1 cat 1>&2 <<EOF NOTE: Successfully updated the following file: $myCatalogManager Backup written to: $catalogBackup EOF ;; esac else emit_message "NOTE: No data for this distribution found in:" emit_message " $myCatalogManager" emit_message fi else cat 1>&2 <<EOF NOTE: No data for this distribution was found in the following file, so I did not revert it. $myCatalogManager EOF fi fi if [ -n "$myEmacsFile" ]; then # check to see if a non-empty value for --dotEmacs file was fed # to uninstaller. if [ -n ${2#--dotEmacs=} ]; then myEmacsFile=${2#--dotEmacs=} revertLine="(load-file \"$escapedPwd\/\.emacs\.el\")" loadLine="$(grep "$revertLine" "$myEmacsFile")" if [ -n "$loadLine" ]; then emit_message REPLY="" if [ ! "$batchmode" = "Yes" ]; then read -s -n1 -p "Revert $myEmacsFile? [Yes] " emit_message "$REPLY" fi case $REPLY in [nNqQ]*) cat 1>&2 <<EOF NOTE: No change made to $myEmacsFile. You need to manually remove the following line. (load-file \"$mydir/.emacs.el\") EOF ;; *) dotEmacsBackup=$myEmacsFile.$$.bak sed -e "/$revertLine/d" -i".$$.bak" $myEmacsFile || exit 1 cat 1>&2 <<EOF NOTE: successfully reverted the following file: $myEmacsFile Backup written to: $dotEmacsBackup EOF ;; esac else emit_message "NOTE: No data for this distribution found in:" emit_message " $myEmacsFile" fi fi fi # check all startup files myStartupFiles=".bash_profile .bash_login .profile .bashrc .cshrc .tcshrc" for file in $myStartupFiles; do if [ -e "$HOME/$file" ]; then case $file in .tcshrc|.cshrc) revertLine="source $mydir/.cshrc.incl" revertLineEsc="source $escapedPwd\/\.cshrc\.incl" ;; *) revertLine=". $mydir/.profile.incl" revertLineEsc="\. $escapedPwd\/\.profile\.incl" ;; esac lineExists="$(grep "$revertLineEsc" $HOME/$file )" if [ "$lineExists" ]; then REPLY="" if [ ! "$batchmode" = "Yes" ]; then read -s -n1 -p "Update $HOME/$file? [Yes] " emit_message "$REPLY" fi case $REPLY in [nNqQ]*) cat 1>&2 <<EOF NOTE: No change made to $HOME/$file. You need to manually remove the following line from it. $revertLine EOF ;; *) dotFileBackup=$HOME/$file.$$.bak sed -e "/$revertLineEsc/d" -i".$$.bak" $HOME/$file || exit 1 cat 1>&2 <<EOF NOTE: Successfully updated the following file: $HOME/$file Backup written to: $dotFileBackup EOF ;; esac else emit_message "NOTE: No data for this distribution found in:" emit_message " $HOME/$file" emit_message fi fi done removeOldFiles emit_message "Done. Deleted uninstall.sh file." rm -f $mydir/test.sh || exit 1 rm -f $mydir/uninstall.sh || exit 1 } writeUninstallFile() { uninstallFile=$mydir/uninstall.sh echo '#!/bin/bash' > $uninstallFile || exit 1 echo 'mydir=$(cd -P $(dirname $0) && pwd -P)' >> $uninstallFile || exit 1 echo "\$mydir/install.sh \\" >> $uninstallFile || exit 1 echo " --uninstall \\" >> $uninstallFile || exit 1 echo " --catalogManager=$myCatalogManager \\" >> $uninstallFile || exit 1 echo " --dotEmacs='$myEmacsFile' \\" >> $uninstallFile || exit 1 echo ' $@' >> $uninstallFile || exit 1 chmod 755 $uninstallFile || exit 1 } writeTestFile() { testFile=$mydir/test.sh echo "#!/bin/bash" > $testFile || exit 1 echo 'mydir=$(cd -P $(dirname $0) && pwd -P)' >> $testFile || exit 1 echo '$mydir/install.sh --test' >> $testFile || exit 1 chmod 755 $testFile || exit 1 } printExitMessage() { cat 1>&2 <<EOF To source your shell environment for this distribution, type the following: $appendLine EOF } checkForResolver() { resolverResponse="$(java org.apache.xml.resolver.apps.resolver uri -u foo 2>/dev/null)" if [ -z "$resolverResponse" ]; then cat 1>&2 <<EOF NOTE: Your environment does not seem to contain the Apache XML Commons Resolver; without that, you can't use XML catalogs with Java applications. For more information, see the "How to use a catalog file" section in Bob Stayton's "DocBook XSL: The Complete Guide" http://sagehill.net/docbookxsl/UseCatalog.html EOF fi } emitNoChangeMsg() { cat 1>&2 <<EOF NOTE: No changes were made to CatalogManagers.properties. To provide your Java tools with XML catalog information for this distribution, you will need to make the appropriate changes manually. EOF } testCatalogs() { if [ ! -f "$thisXmlCatalog" ]; then cat 1>&2 <<EOF FATAL: $thisXmlCatalog file needed but not found. Stopping. EOF exit fi if [ -z "$XML_CATALOG_FILES" ]; then emit_message emit_message "WARNING: XML_CATALOG_FILES not set. Not testing with xmlcatalog." else xmlCatalogResponse="$(xmlcatalog 2>/dev/null)" if [ -z "$xmlCatalogResponse" ]; then cat 1>&2 <<EOF WARNING: Cannot locate the "xmlcatalog" command. Make sure that you have libxml2 and its associated utilities installed. http://xmlsoft.org/ EOF else emit_message "Testing with xmlcatalog..." # read in pathname-uri pairs from .urilist file while read pair; do if [ ! "${pair%* *}" = "." ]; then path=$mydir/${pair%* *} else path=$mydir/ fi uri=${pair#* *} emit_message emit_message " Tested: $uri" for catalog in $XML_CATALOG_FILES; do response="$(xmlcatalog $catalog $uri| grep -v "No entry")" if [ -n "$response" ]; then if [ "$response" = "$path" ]; then emit_message " Result: $path" break else emit_message " Result: FAILED" fi fi done done < $mydir/.urilist fi fi if [ -z "$CLASSPATH" ]; then emit_message emit_message "NOTE: CLASSPATH not set. Not testing with Apache XML Commons Resolver." else if [ "$(checkForResolver)" ]; then checkForResolver else emit_message emit_message "Testing with Apache XML Commons Resolver..." # read in pathname-uri pairs from .urilist file while read pair; do if [ ! "${pair%* *}" = "." ]; then path=$mydir/${pair%* *} else path=$mydir/ fi uri=${pair#* *} emit_message emit_message " Tested: $uri" if [ ${uri%.dtd} != $uri ]; then response="$(java org.apache.xml.resolver.apps.resolver system -s $uri | grep "Result")" else response="$(java org.apache.xml.resolver.apps.resolver uri -u $uri | grep "Result")" fi if [ "$response" ]; then if [ "${response#*$path}" != "$response" ]; then emit_message " Result: $path" else emit_message " Result: FAILED" fi echo fi done < $mydir/.urilist fi fi } # get opts and execute appropriate function case $1 in *-uninstall) uninstall $2 $3 $4 ;; *-test) testCatalogs ;; *) main ;; esac # Copyright # --------- # Copyright 2005-2007 Michael(tm) Smith <smith@sideshowbarker.net> # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without # restriction, including without limitation the rights to use, copy, # modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # vim: number
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 26953 | Paul Allen | Move //guest/perforce_software/p4convert to //guest/perforce_software/p4convert/main | ||
//guest/perforce_software/p4convert/docs/docbook-xsl-ns-1.78.1/install.sh | |||||
#2 | 14806 | Paul Allen | Update docs and add +w. | ||
#1 | 13920 | Paul Allen | copy part 2 (no errors) | ||
//guest/paul_allen/p4convert-maven/docs/docbook-xsl-ns-1.78.1/install.sh | |||||
#1 | 13895 | Paul Allen | Copying using p4convert-docbook | ||
//guest/perforce_software/doc_build/main/docbook-xsl-ns-1.78.1/install.sh | |||||
#1 | 12728 | eedwards |
Upgrade ANT doc build infrastructure to assemble PDFs: - remove non-namespaced DocBook source and add namespaced DocBook source. - add Apache FOP 1.1 - copy fonts, images, XSL into _build, establishing new asset structure. The original structure remains until all guides using it can be upgraded, and several other issues can be resolved. - updated build.xml to allow for per-target build properties. - upgraded the P4SAG to use the new infrastructure. - tweaked admonition presentation in PDFs to remove admonition graphics, and resemble closely the presentation used in the new HTML layout, including the same colors. With these changes, building PDFs involves using a shell, navigating into the guide's directory (just P4SAG for now), and executing "ant pdf". Issues still to be resolved: - PDF generation encounters several warnings about missing fonts (bold versions of Symbol and ZapfDingbats), and a couple of locations where the page content exceeds the defined content area. - Due to issues within Apache FOP, PDF generation emits a substantial amount of output that is not easily suppressed without losing important warning information. - Apache FOP's interface to ANT does not expose a way to set the font base directory. The current configuration does work under Mac OSX, but further testing on Windows will need to be done to determine if the relative paths defined continue to work. The workaround is for Windows users to customize the fop-config.xml to provide absolute system paths to the required fonts. - HTML generation needs further browser testing, and exhibits broken navigation on iOS browsers within the TOC sidebar. - A number of PDF and HTML presentation tweaks still need to be made, for example: sidebars, gui* DocBook tags, whitespace, section separation, etc. |