1#!/bin/sh 2# $Id: gen-dir-node,v 1.1 2004/10/28 18:14:11 zooey Exp $ 3# Generate the top-level Info node, given a directory of Info files 4# and (optionally) a skeleton file. The output will be suitable for a 5# top-level dir file. The skeleton file contains info topic names in the 6# order they should appear in the output. There are three special 7# lines that alter the behavior: a line consisting of just "--" causes 8# the next line to be echoed verbatim to the output. A line 9# containing just "%%" causes all the remaining filenames (wildcards 10# allowed) in the rest of the file to be ignored. A line containing 11# just "!!" exits the script when reached (unless preceded by a line 12# containing just "--"). Once the script reaches the end of the 13# skeleton file, it goes through the remaining files in the directory 14# in order, putting their entries at the end. The script will use the 15# ENTRY information in each info file if it exists. Otherwise it will 16# make a minimal entry. 17 18# sent by Jeffrey Osier <jeffrey@cygnus.com>, who thinks it came from 19# zoo@winternet.com (david d `zoo' zuhn) 20 21# modified 7 April 1995 by Joe Harrington <jh@tecate.gsfc.nasa.gov> to 22# take special flags 23 24INFODIR=$1 25if [ $# = 2 ] ; then 26 SKELETON=$2 27else 28 SKELETON=/dev/null 29fi 30 31skip= 32 33if [ $# -gt 2 ] ; then 34 echo usage: $0 info-directory [ skeleton-file ] 1>&2 35 exit 1 36else 37 true 38fi 39 40if [ ! -d ${INFODIR} ] ; then 41 echo "$0: first argument must specify a directory" 42 exit 1 43fi 44 45### output the dir header 46echo "-*- Text -*-" 47echo "This file was generated automatically by $0." 48echo "This version was generated on `date`" 49echo "by `whoami`@`hostname` for `(cd ${INFODIR}; pwd)`" 50 51cat << moobler 52 53This is the file .../info/dir, which contains the topmost node of the 54Info hierarchy. The first time you invoke Info you start off 55looking at that node, which is (dir)Top. 56 57File: dir Node: Top This is the top of the INFO tree 58 This (the Directory node) gives a menu of major topics. 59 Typing "d" returns here, "q" exits, "?" lists all INFO commands, "h" 60 gives a primer for first-timers, "mTexinfo<Return>" visits Texinfo topic, 61 etc. 62 Or click mouse button 2 on a menu item or cross reference to select it. 63 --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) --- 64 65* Menu: The list of major topics begins on the next line. 66 67moobler 68 69### go through the list of files in the skeleton. If an info file 70### exists, grab the ENTRY information from it. If an entry exists 71### use it, otherwise create a minimal dir entry. 72### 73### Then remove that file from the list of existing files. If any 74### additional files remain (ones that don't have a skeleton entry), 75### then generate entries for those in the same way, putting the info for 76### those at the end.... 77 78infofiles=`(cd ${INFODIR}; ls | egrep -v '\-|^dir$|^dir\.info$|^dir\.orig$')` 79 80# echoing gets clobbered by backquotes; we do it the hard way... 81lines=`wc $SKELETON | awk '{print $1}'` 82line=1 83while [ $lines -ge $line ] ; do 84 # Read one line from the file. This is so that we can echo lines with 85 # whitespace and quoted characters in them. 86 fileline=`awk NR==$line $SKELETON` 87 88 # flag fancy features 89 if [ ! -z "$echoline" ] ; then # echo line 90 echo "$fileline" 91 fileline= 92 echoline= 93 elif [ "${fileline}" = "--" ] ; then # should we echo the next line? 94 echoline=1 95 elif [ "${fileline}" = "%%" ] ; then # eliminate remaining files from dir? 96 skip=1 97 elif [ "${fileline}" = "!!" ] ; then # quit now 98 exit 0 99 fi 100 101 # handle files if they exist 102 for file in $fileline"" ; do # expand wildcards ("" handles blank lines) 103 104 fname= 105 106 if [ -z "$echoline" -a ! -z "$file" ] ; then 107 108 # Find the file to operate upon. Check both possible names. 109 infoname=`echo $file | sed 's/\.info$//'` 110 noext= 111 ext= 112 if [ -f ${INFODIR}/$infoname ] ; then 113 noext=$infoname 114 fi 115 if [ -f ${INFODIR}/${infoname}.info ] ; then 116 ext=${infoname}.info 117 fi 118 119 # If it exists with both names take what was said in the file. 120 if [ ! -z "$ext" -a ! -z "$noext" ]; then 121 fname=$file 122 warn="### Warning: $ext and $noext both exist! Using ${file}. ###" 123 elif [ ! \( -z "$ext" -a -z "$noext" \) ]; then 124 # just take the name if it exists only once 125 fname=${noext}${ext} 126 fi 127 128 # if we found something and aren't skipping, do the entry 129 if [ ! -z "$fname" ] ; then 130 if [ -z "$skip" ] ; then 131 132 if [ ! -z "$warn" ] ; then # issue any warning 133 echo $warn 134 warn= 135 fi 136 137 entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ 138 -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$fname` 139 if [ ! -z "${entry}" ] ; then 140 echo "${entry}" 141 else 142 echo "* ${infoname}: (${fname})." 143 fi 144 fi 145 146 # remove the name from the directory listing 147 infofiles=`echo ${infofiles} | sed -e "s/ ${fname} / /" \ 148 -e "s/^${fname} //" \ 149 -e "s/ ${fname}$//"` 150 151 fi 152 153 fi 154 155 done 156 157 line=`expr $line + 1` 158done 159 160if [ -z "${infofiles}" ] ; then 161 exit 0 162else 163 echo 164fi 165 166for file in ${infofiles}; do 167 case $file in 168 *.gz) zcat=zcat; file=`echo $file|sed 's/\.gz$//'`; gz=.gz;; 169 *) zcat=cat; gz=;; 170 esac 171 infoname=`echo $file | sed 's/\.info$//'` 172 entry=`$zcat ${INFODIR}/${file}$gz \ 173 |sed -e '1,/START-INFO-DIR-ENTRY/d' \ 174 -e '/END-INFO-DIR-ENTRY/,$d'` 175 176 if [ ! -z "${entry}" ] ; then 177 echo "${entry}" 178 else 179 echo "* ${infoname}: (${file})." 180 fi 181done 182