Re: TOC for man

Top Page
Attachments:
Message as email
+ (text/plain)
+ mansfor (text/plain)
+ (text/plain)
Delete this message
Reply to this message
Author: Eric \"Shubes\"
Date:  
To: Main PLUG discussion list
Subject: Re: TOC for man
Well, I did it. Attached is the current mansfor script. It runs only on rpm
based distros, so it's far from universal. It also uses the dialog package,
but if that's not installed it will attempt to yum it for you. As a result
of these dependencies, I doubt that it would be very easily ported to debian
or BSD (sorry about that), but I wouldn't mind seeing that happen.

It's GPL'd, so do with it as you please within those limitations. If you
have any suggestions or comments, I'll be happy to hear them.

Thanks for everyone's input and help.

--
-Eric 'shubes'
#!/bin/sh
#
# Copyright (C) 2007 Eric Shubert
# Eric 'shubes' <>
#
########################################################################
#
# script for listing/selecting man pages for a package
#
########################################################################
#
# change log
# 02/15/07 shubes - created
#
########################################################################
## if dialog is not installed, offer to install it if yum is available
#
a2_check_dialog(){

which rpm >/dev/null 2>&1

if [ $? != "0" ]; then
echo "$me only runs on rpm based distros, sorry."
exit 1
fi

which dialog >/dev/null 2>&1

if [ $? != "0" ]; then
  which yum >/dev/null 2>&1
  if [ $? != "0" ]; then
    echo "dialog is not installed and neither is yum, so I can't install it."
    echo "Please install dialog manually and try again."
    exit 1
  else
    echo -n "dialog is not installed, would you like to install it? [y]|n : "
    read REPLY
    case $REPLY in
      "y" | "yes" | "" )
        sudo yum -y install dialog
        if [ $? != "0" ]; then
          echo "$me - installation of dialog failed, exiting."
          exit 1
        fi
        ;;
      * )
        echo "I can't do my thing without dialog installed, sorry."
        exit 1
        ;;
    esac
  fi
fi
}


########################################################################
## get package names into a sorted list
#
a3_get_package_list(){

if [ ! -z "$sregex" ]; then
pkgs="`rpm -qa | grep \"$sregex\"`"
fi

for pkg in $pkg $pkgs; do
echo $pkg >> $tempdial
done
}

########################################################################
## package(s) found, so process the request
#
a5_process_request(){

pkglist=`sort <$tempdial`
captpkgs="Packages: "
items=0

if [ -z "$sect" ]; then
sectexp="."
else
sectexp="[$sect]"
fi

for pkg in $pkglist; do
  manfiles=`rpm -ql $pkg | grep man/man$sectexp/`
  if [ $? == "0" ]; then
    b54_process_each_package
  fi
done


if [ -s $tempmenu ]; then
b56_show_the_menu
else
echo "There are no man pages available for $pkglist $msgsect $sect"
fi
}

########################################################################
## build the man pages for the package into the menu list
#
b54_process_each_package(){

if (($W_MENU_HEIGHT > 5 )); then
  W_MENU_HEIGHT=$(($W_MENU_HEIGHT - 1))
  CAPTION="${CAPTION}${captpkgs}${pkg} "
  captpkgs="\n          "
else
  CAPTION="${CAPTION}."
fi


for manfilename in $manfiles; do
c545_each_package_manpage
done
}

########################################################################
## build a menu entry for the man page
#
c545_each_package_manpage(){

items=$(($items + 1))
manfile=${manfilename##/[^/]*/man/man[$MANSECTS]/}
mantemp=${manfile%.[^.]*}
manname=${mantemp%.[$MANSECTS]}
mansect=${mantemp#$manname.}
found=""

while read whatpage whatsect whatdash whatdesc; do
  whatsect=`echo $whatsect | tr -d "()"`
  if [ "$whatpage" == "$manname" ] \
        && [ "$whatsect" == "$mansect" ]; then
    found=0
    break
  fi
done <<!EOF!
`whatis $manname`
!EOF!


if [ "$found" ]; then
echo "\"${whatpage} $whatsect\" \"$whatdesc\"" >>$tempmenu
else
echo "\"${manname} $mansect\" \"-- No Description Available --\"" >>$tempmenu
fi
}

########################################################################
## there's something to show, so show the menu
#
b56_show_the_menu(){

CAPTION="$CAPTION\n manpage Sec#        Description\n"


if (($items < $W_MENU_HEIGHT )); then
W_HEIGHT=$(($W_HEIGHT - $W_MENU_HEIGHT + $items ))
W_MENU_HEIGHT=$items
fi

while true; do
c565_process_menu
done
}

########################################################################
## invoke the dialog command to display the menu, then check selection
#
c565_process_menu(){

${DIALOG:=dialog} --clear \
      --help-button \
      --help-label Sections \
      --ok-label Man \
      --title "Menu of man pages" \
      --menu "$CAPTION" \
            $W_HEIGHT $W_WIDTH $W_MENU_HEIGHT \
      --file $tempmenu \
      2>$tempdial


case $? in
  0 )
    read manpage section <$tempdial
    man $section $manpage
    ;;
  1 )
#   No or Cancel button was pressed
    break
    ;;
  2 )
#   Help button was pressed, if present
    d5656_show_sections
    ;;
  3 )
#   Extra button was pressed, if present
    break
    ;;
  -1 )
#   errors occured, or exited via the ESC key
    break
    ;;
  * )
#   undefined return code
    break
    ;;
esac
}


########################################################################
## show help screen with section descriptions
#
d5656_show_sections(){

if [ ! -f $temphelp ]; then
echo "# Topic" >$temphelp
echo "1 Commands available to users" >>$temphelp
echo "2 Unix and C system calls" >>$temphelp
echo "3 C library routines for C programs" >>$temphelp
echo "4 Special file names" >>$temphelp
echo "5 File formats and conventions for Linux" >>$temphelp
echo "6 Games" >>$temphelp
echo "7 Word processing packages" >>$temphelp
echo -n "8 System administration commands, processes" >>$temphelp
fi

$DIALOG --clear  \
      --exit-label Back \
      --title "man Sections" \
      --textbox $temphelp 13 49 \
      2>$tempdial
}


########################################################################
## show usage and exit
#
q01_usage_exit(){

echo "usage: $me [section] ... {-s regex | package_name} [package_name] ..."
exit 1
}

########################################################################
## main execution begins here
#

me=`basename $0`
myver=v0.1
MANSECTS="1-8"
sect=""
pkg=""
msgnf=""
msgsect=""
CAPTION=""
W_HEIGHT=$((${LINES:-24} - 3))
W_WIDTH=$((${COLUMNS:-80} - 4))
W_MENU_HEIGHT=$(($W_HEIGHT - 7))

if [ -z "$1" ]; then
  q01_usage_exit
else
  while (( "$#" )); do
    case $1 in
      "-h" )
        q01_usage_exit
        ;;
      [$MANSECTS] )
        sect="$sect$1"
        msgsect=" in section(s)"
        shift
        ;;
      "-s" )
        if [ -z "$2" ]; then
          echo "$me - regex parameter not supplied"
          q01_usage_exit
        else
          sregex="$2"
          msgmatch="matching"
          CAPTION="Matching: ${2}\n"
          W_MENU_HEIGHT=$(($W_MENU_HEIGHT - 1))
          shift 2
        fi
        ;;
      * )
        pkgver=`rpm -q $1 2>/dev/null`
        if [ $? == "0" ]; then
          pkg="$pkg $pkgver"
          shift
        else
          echo "Package $1 is not installed"
          exit 1
        fi
        ;;
    esac
  done
fi


a2_check_dialog

# set a temp file for the working scratch, menu and help
tempdial=`tempfile 2>/dev/null` || tempdial=/tmp/$me.dial.$$
tempmenu=`tempfile 2>/dev/null` || tempmenu=/tmp/$me.menu.$$
temphelp=`tempfile 2>/dev/null` || temphelp=/tmp/$me.help.$$

# make sure the temp files are deleted when we're done
trap "rm -f $tempdial $tempmenu $temphelp" 0 1 2 5 15

a3_get_package_list

if [ -s $tempdial ]; then
a5_process_request
else
echo "No package(s)$pkg found $msgmatch $sregex"
fi

exit 0
---------------------------------------------------
PLUG-discuss mailing list -
To subscribe, unsubscribe, or to change you mail settings:
http://lists.PLUG.phoenix.az.us/mailman/listinfo/plug-discuss