| #!/bin/sh | |
| # Generate the top-level Info node, given a directory of Info files | |
| # and (optionally) a skeleton file. The output will be suitable for a | |
| # top-level dir file. The skeleton file contains info topic names in the | |
| # order they should appear in the output. There are three special | |
| # lines that alter the behavior: a line consisting of just "--" causes | |
| # the next line to be echoed verbatim to the output. A line | |
| # containing just "%%" causes all the remaining filenames (wildcards | |
| # allowed) in the rest of the file to be ignored. A line containing | |
| # just "!!" exits the script when reached (unless preceded by a line | |
| # containing just "--"). Once the script reaches the end of the | |
| # skeleton file, it goes through the remaining files in the directory | |
| # in order, putting their entries at the end. The script will use the | |
| # ENTRY information in each info file if it exists. Otherwise it will | |
| # make a minimal entry. | |
| # sent by Jeffrey Osier <jeffrey@cygnus.com>, who thinks it came from | |
| # zoo@winternet.com (david d `zoo' zuhn) | |
| # modified 7 April 1995 by Joe Harrington <jh@tecate.gsfc.nasa.gov> to | |
| # take special flags | |
| INFODIR=$1 | |
| if [ $# = 2 ] ; then | |
| SKELETON=$2 | |
| else | |
| SKELETON=/dev/null | |
| fi | |
| skip= | |
| if [ $# -gt 2 ] ; then | |
| echo usage: $0 info-directory [ skeleton-file ] 1>&2 | |
| exit 1 | |
| elif [ -z "${INFODIR}" ] ; then | |
| INFODIR="%%DEFAULT_INFO_DIR%%" | |
| else | |
| true | |
| fi | |
| if [ ! -d ${INFODIR} ] ; then | |
| echo "$0: first argument must specify a directory" | |
| exit 1 | |
| fi | |
| ### output the dir header | |
| echo "-*- Text -*-" | |
| echo "This file was generated automatically by $0." | |
| echo "This version was generated on `date`" | |
| echo "by `whoami`@`hostname` for `(cd ${INFODIR}; pwd)`" | |
| cat << moobler | |
| This is the file .../info/dir, which contains the topmost node of the | |
| Info hierarchy. The first time you invoke Info you start off | |
| looking at that node, which is (dir)Top. | |
| File: dir Node: Top This is the top of the INFO tree | |
| This (the Directory node) gives a menu of major topics. | |
| Typing "q" exits, "?" lists all Info commands, "d" returns here, | |
| "h" gives a primer for first-timers, | |
| "mEmacs<Return>" visits the Emacs topic, etc. | |
| In Emacs, you can click mouse button 2 on a menu item or cross reference | |
| to select it. | |
| * Menu: The list of major topics begins on the next line. | |
| moobler | |
| ### go through the list of files in the skeleton. If an info file | |
| ### exists, grab the ENTRY information from it. If an entry exists | |
| ### use it, otherwise create a minimal dir entry. | |
| ### | |
| ### Then remove that file from the list of existing files. If any | |
| ### additional files remain (ones that don't have a skeleton entry), | |
| ### then generate entries for those in the same way, putting the info for | |
| ### those at the end.... | |
| infofiles=`(cd ${INFODIR}; /bin/ls | grep -v '\-[0-9]*$' | grep -Ev '^dir$|^dir\.info$|^dir\.orig$')` | |
| # echoing gets clobbered by backquotes; we do it the hard way... | |
| lines=`wc $SKELETON | awk '{print $1}'` | |
| line=1 | |
| while [ $lines -ge $line ] ; do | |
| # Read one line from the file. This is so that we can echo lines with | |
| # whitespace and quoted characters in them. | |
| fileline=`awk NR==$line $SKELETON` | |
| # flag fancy features | |
| if [ ! -z "$echoline" ] ; then # echo line | |
| echo "$fileline" | |
| fileline= | |
| echoline= | |
| elif [ "${fileline}" = "--" ] ; then # should we echo the next line? | |
| echoline=1 | |
| elif [ "${fileline}" = "%%" ] ; then # eliminate remaining files from dir? | |
| skip=1 | |
| elif [ "${fileline}" = "!!" ] ; then # quit now | |
| exit 0 | |
| fi | |
| # handle files if they exist | |
| for file in $fileline"" ; do # expand wildcards ("" handles blank lines) | |
| fname= | |
| if [ -z "$echoline" ] && [ ! -z "$file" ] ; then | |
| # Find the file to operate upon. Check both possible names. | |
| infoname=`echo $file | sed 's/\.info$//'` | |
| noext= | |
| ext= | |
| if [ -f ${INFODIR}/$infoname ] ; then | |
| noext=$infoname | |
| fi | |
| if [ -f ${INFODIR}/${infoname}.info ] ; then | |
| ext=${infoname}.info | |
| fi | |
| # If it exists with both names take what was said in the file. | |
| if [ ! -z "$ext" ] && [ ! -z "$noext" ]; then | |
| fname=$file | |
| warn="### Warning: $ext and $noext both exist! Using ${file}. ###" | |
| elif [ ! -z "${noext}${ext}" ]; then | |
| # just take the name if it exists only once | |
| fname=${noext}${ext} | |
| fi | |
| # if we found something and aren't skipping, do the entry | |
| if [ ! -z "$fname" ] ; then | |
| if [ -z "$skip" ] ; then | |
| if [ ! -z "$warn" ] ; then # issue any warning | |
| echo $warn | |
| warn= | |
| fi | |
| entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ | |
| -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$fname` | |
| if [ ! -z "${entry}" ] ; then | |
| echo "${entry}" | |
| else | |
| echo "* ${infoname}: (${infoname})." | |
| fi | |
| fi | |
| # remove the name from the directory listing | |
| infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${fname} / /" -e "s/ / /g"` | |
| fi | |
| fi | |
| done | |
| line=`expr $line + 1` | |
| done | |
| if [ -z "${infofiles}" ] ; then | |
| exit 0 | |
| elif [ $lines -gt 0 ]; then | |
| echo | |
| fi | |
| # Sort remaining files by INFO-DIR-SECTION. | |
| prevsect= | |
| filesectdata=`(cd ${INFODIR}; grep -F INFO-DIR-SECTION /dev/null ${infofiles} | \ | |
| grep -Fv 'INFO-DIR-SECTION Miscellaneous' | \ | |
| sort -t: -k2 -k1 | tr ' ' '_')` | |
| for sectdata in ${filesectdata}; do | |
| file=`echo ${sectdata} | cut -d: -f1` | |
| section=`sed -n -e 's/^INFO-DIR-SECTION //p' ${INFODIR}/${file}` | |
| infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${file} / /" -e "s/ / /g"` | |
| if [ "${prevsect}" != "${section}" ] ; then | |
| if [ ! -z "${prevsect}" ] ; then | |
| echo "" | |
| fi | |
| echo "${section}" | |
| prevsect="${section}" | |
| fi | |
| infoname=`echo $file | sed 's/\.info$//'` | |
| entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ | |
| -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/${file}` | |
| if [ ! -z "${entry}" ] ; then | |
| echo "${entry}" | |
| elif [ ! -d "${INFODIR}/${file}" ] ; then | |
| echo "* ${infoname}: (${infoname})." | |
| fi | |
| done | |
| # Process miscellaneous files. | |
| for file in ${infofiles}; do | |
| if [ ! -z "${prevsect}" ] ; then | |
| echo "" | |
| echo "Miscellaneous" | |
| prevsect="" | |
| fi | |
| infoname=`echo $file | sed 's/\.info$//'` | |
| entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ | |
| -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/${file}` | |
| if [ ! -z "${entry}" ] ; then | |
| echo "${entry}" | |
| elif [ ! -d "${INFODIR}/${file}" ] ; then | |
| echo "* ${infoname}: (${infoname})." | |
| fi | |
| done |