#!/bin/sh # $Id: gen-dir-node,v 1.1.1.2 1998/03/22 20:43:12 law Exp $ # 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 , who thinks it came from # zoo@winternet.com (david d `zoo' zuhn) # modified 7 April 1995 by Joe Harrington 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 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 "d" returns here, "q" exits, "?" lists all INFO commands, "h" gives a primer for first-timers, "mTexinfo" visits Texinfo topic, etc. Or click mouse button 2 on a menu item or cross reference to select it. --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) --- * 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}; ls | 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" -a ! -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" -a ! -z "$noext" ]; then fname=$file warn="### Warning: $ext and $noext both exist! Using ${file}. ###" elif [ ! \( -z "$ext" -a -z "$noext" \) ]; 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}: (${fname})." fi fi # remove the name from the directory listing infofiles=`echo ${infofiles} | sed -e "s/ ${fname} / /" \ -e "s/^${fname} //" \ -e "s/ ${fname}$//"` fi fi done line=`expr $line + 1` done if [ -z "${infofiles}" ] ; then exit 0 else echo fi for file in ${infofiles}; do case $file in *.gz) zcat=zcat; file=`echo $file|sed 's/\.gz$//'`; gz=.gz;; *) zcat=cat; gz=;; esac infoname=`echo $file | sed 's/\.info$//'` entry=`$zcat ${INFODIR}/${file}$gz \ |sed -e '1,/START-INFO-DIR-ENTRY/d' \ -e '/END-INFO-DIR-ENTRY/,$d'` if [ ! -z "${entry}" ] ; then echo "${entry}" else echo "* ${infoname}: (${file})." fi done