1 #!/bin/sh 2 # Id: gen-dir-node,v 1.3 2004/04/11 17:56:47 karl 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 (at] cygnus.com>, who thinks it came from 19 # zoo (at] winternet.com (david d `zoo' zuhn) 20 21 # modified 7 April 1995 by Joe Harrington <jh (at] tecate.gsfc.nasa.gov> to 22 # take special flags 23 24 INFODIR=$1 25 if [ $# = 2 ] ; then 26 SKELETON=$2 27 else 28 SKELETON=/dev/null 29 fi 30 31 skip= 32 33 if [ $# -gt 2 ] ; then 34 echo usage: $0 info-directory [ skeleton-file ] 1>&2 35 exit 1 36 elif [ -z "${INFODIR}" ] ; then 37 INFODIR="%%DEFAULT_INFO_DIR%%" 38 else 39 true 40 fi 41 42 if [ ! -d ${INFODIR} ] ; then 43 echo "$0: first argument must specify a directory" 44 exit 1 45 fi 46 47 ### output the dir header 48 echo "-*- Text -*-" 49 echo "This file was generated automatically by $0." 50 echo "This version was generated on `date`" 51 echo "by `whoami`@`hostname` for `(cd ${INFODIR}; pwd)`" 52 53 cat << moobler 54 \Id: gen-dir-node,v 1.3 2004/04/11 17:56:47 karl Exp 55 This is the file .../info/dir, which contains the topmost node of the 56 Info hierarchy. The first time you invoke Info you start off 57 looking at that node, which is (dir)Top. 58 59 File: dir Node: Top This is the top of the INFO tree 60 61 This (the Directory node) gives a menu of major topics. 62 Typing "q" exits, "?" lists all Info commands, "d" returns here, 63 "h" gives a primer for first-timers, 64 "mEmacs<Return>" visits the Emacs topic, etc. 65 66 In Emacs, you can click mouse button 2 on a menu item or cross reference 67 to select it. 68 69 * Menu: The list of major topics begins on the next line. 70 71 moobler 72 73 ### go through the list of files in the skeleton. If an info file 74 ### exists, grab the ENTRY information from it. If an entry exists 75 ### use it, otherwise create a minimal dir entry. 76 ### 77 ### Then remove that file from the list of existing files. If any 78 ### additional files remain (ones that don't have a skeleton entry), 79 ### then generate entries for those in the same way, putting the info for 80 ### those at the end.... 81 82 infofiles=`(cd ${INFODIR}; /bin/ls | grep -v '\-[0-9]*$' | egrep -v '^dir$|^dir\.info$|^dir\.orig$')` 83 84 # echoing gets clobbered by backquotes; we do it the hard way... 85 lines=`wc $SKELETON | awk '{print $1}'` 86 line=1 87 while [ $lines -ge $line ] ; do 88 # Read one line from the file. This is so that we can echo lines with 89 # whitespace and quoted characters in them. 90 fileline=`awk NR==$line $SKELETON` 91 92 # flag fancy features 93 if [ ! -z "$echoline" ] ; then # echo line 94 echo "$fileline" 95 fileline= 96 echoline= 97 elif [ "${fileline}" = "--" ] ; then # should we echo the next line? 98 echoline=1 99 elif [ "${fileline}" = "%%" ] ; then # eliminate remaining files from dir? 100 skip=1 101 elif [ "${fileline}" = "!!" ] ; then # quit now 102 exit 0 103 fi 104 105 # handle files if they exist 106 for file in $fileline"" ; do # expand wildcards ("" handles blank lines) 107 108 fname= 109 110 if [ -z "$echoline" ] && [ ! -z "$file" ] ; then 111 # Find the file to operate upon. Check both possible names. 112 infoname=`echo $file | sed 's/\.info$//'` 113 noext= 114 ext= 115 if [ -f ${INFODIR}/$infoname ] ; then 116 noext=$infoname 117 fi 118 if [ -f ${INFODIR}/${infoname}.info ] ; then 119 ext=${infoname}.info 120 fi 121 122 # If it exists with both names take what was said in the file. 123 if [ ! -z "$ext" ] && [ ! -z "$noext" ]; then 124 fname=$file 125 warn="### Warning: $ext and $noext both exist! Using ${file}. ###" 126 elif [ ! -z "${noext}${ext}" ]; then 127 # just take the name if it exists only once 128 fname=${noext}${ext} 129 fi 130 131 # if we found something and aren't skipping, do the entry 132 if [ ! -z "$fname" ] ; then 133 if [ -z "$skip" ] ; then 134 135 if [ ! -z "$warn" ] ; then # issue any warning 136 echo $warn 137 warn= 138 fi 139 140 entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ 141 -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$fname` 142 if [ ! -z "${entry}" ] ; then 143 echo "${entry}" 144 else 145 echo "* ${infoname}: (${infoname})." 146 fi 147 fi 148 149 # remove the name from the directory listing 150 infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${fname} / /" -e "s/ / /g"` 151 152 fi 153 154 fi 155 156 done 157 158 line=`expr $line + 1` 159 done 160 161 if [ -z "${infofiles}" ] ; then 162 exit 0 163 elif [ $lines -gt 0 ]; then 164 echo 165 fi 166 167 # Sort remaining files by INFO-DIR-SECTION. 168 prevsect= 169 filesectdata=`(cd ${INFODIR}; fgrep INFO-DIR-SECTION /dev/null ${infofiles} | \ 170 fgrep -v 'INFO-DIR-SECTION Miscellaneous' | \ 171 sort -t: -k2 -k1 | tr ' ' '_')` 172 for sectdata in ${filesectdata}; do 173 file=`echo ${sectdata} | cut -d: -f1` 174 section=`sed -n -e 's/^INFO-DIR-SECTION //p' ${INFODIR}/${file}` 175 infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${file} / /" -e "s/ / /g"` 176 177 if [ "${prevsect}" != "${section}" ] ; then 178 if [ ! -z "${prevsect}" ] ; then 179 echo "" 180 fi 181 echo "${section}" 182 prevsect="${section}" 183 fi 184 185 infoname=`echo $file | sed 's/\.info$//'` 186 entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ 187 -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/${file}` 188 if [ ! -z "${entry}" ] ; then 189 echo "${entry}" 190 elif [ ! -d "${INFODIR}/${file}" ] ; then 191 echo "* ${infoname}: (${infoname})." 192 fi 193 done 194 195 # Process miscellaneous files. 196 for file in ${infofiles}; do 197 if [ ! -z "${prevsect}" ] ; then 198 echo "" 199 echo "Miscellaneous" 200 prevsect="" 201 fi 202 203 infoname=`echo $file | sed 's/\.info$//'` 204 entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ 205 -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/${file}` 206 207 if [ ! -z "${entry}" ] ; then 208 echo "${entry}" 209 elif [ ! -d "${INFODIR}/${file}" ] ; then 210 echo "* ${infoname}: (${infoname})." 211 fi 212 done 213