#!/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
\$Id: gen-dir-node,v 1.1 2013-01-02 01:00:25 karl Exp $
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]*$' | egrep -v '^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}; fgrep INFO-DIR-SECTION /dev/null ${infofiles} | \
	      fgrep -v '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
