The "menugen.sh" script automatically generates HTML documentation based on information contained in a control file which specifies parent-child relationships between pages.

"menugen" provides the user with the ability to easily maintain and modify groups of web pages. This program creates a standard "look-and-feel" for user supplied WWW content using server side includes. It therefore assumes the web server, where these pages will be offered, supports server side includes.

To use "menugen", the user should create content and store it in files called "XXXXXXXX.content.shtml", where XXXXXXXX is some prefix file name defined by the user. "menugen" creates menus, links, headers, titles, footers, contact info links, etc, based on information stored in a user defined relationship file. The relationship file is assumed to be in the same directory with the "XXXXXXXX.content.shtml" files and is called "menugen.dat".

"menugen" allows users to modify the "look-and-feel" of all files in a directory by storing configuration information such as colors, font sizes, title info, etc in a file called "menugen.cfg".

The "-c" option will create a file called "menugen.cfg" if it does not already exist. If it does exist it will not overwrite it. To recreate the "menugen.cfg" file, you will first have to remove it. The "menugen.cfg" file contains user modifiable parameters such as font colors, font sizes background color, title and contact information.

One of the values defined in the "menugen.cfg" file is called "THEME". This is a title which is displayed at the top of every page. The title can be a two part title separated by a colon (:). The part of the title to the left of the colon will be displayed in a larger text. The part of the title to the right of the colon will be displayed in italics and a smaller text. All values in the configuration file may be changed to suit the users particular needs. The "menugen.cfg" file MUST be executeable.

The "menugen" program creates a menu file for each page which contains the relationships between each page, its parent page, and its child pages. The links displayed on the menu by default are that of the parent and children of each page. The "-g" option causes the grandchildren of each page to also be included in the menu.

Normally, if the static menu bar file exists, it is not overwritten in order to preserve any user customization of that file. However the "-S" option will cause the static menubar file to be overwritten with the default values. The static menu bar file is "staticbar.shtml".

The datafile describes the relationships between all the web pages in the current directory. The relationship between the pages is maintained via parent/child references. By default the relationships are read from a file called "menugen.dat" in the current directory. The "-f" option allows the user to specify a different file name. The datafile has the following format:

PARENT<space><space><space><space><space><space> CURRENT<space><space><space><space><space><space> SHORT DESCRIPTION

PARENT and CURRENT are file name prefixes and are usually limited to 8 characters or less. TAB characters between the fields is mandatory. PARENT is the parent of the CURRENT page. The SHORT DESCRIPTION is a description of the CURRENT page. An example of datafile would be:

NULL            index           Home Page
index           child1          Child 1 of index
index           child2          Child 2 of index
index           child3          Child 3 of index
child1          child11         Child 1 of child1
child1          child12         Child 2 of child1
child1          child13         Child 3 of child1
child1          child14         Child 4 of child1
child2          child21         Child 1 of child2
child2          child22         Child 2 of child2
child2          child23         Child 3 of child2
child3          child31         Child 1 of child3
child3          child32         Child 2 of child3

In this example, the page "index" has three child pages called "child1", "child2", and "child3". The menu on the "index" page would reference these three pages. The page "child1" has four child pages called "child11", "child12", "child13", "child14". The menu on the "child1" page would reference these four pages. And so on for child pages "child2" and "child3".

The "-?" option displays a list of all available options and a description of each option.

Most graphical web browsers will show hypertext links as underlined text of a different color than normal text. When this program creates the menu bars, the links are configured NOT to have underlines. If you want the links in the menu bars to have underlines, use the "-u" option.



#!/usr/bin/ksh93
################################################################
if [ -s "./menugen.cfg" ]
then
    if [ ! -x "./menugen.cfg" ]
    then
        if ! chmod 755 "./menugen.cfg"
        then
            echo "Unable to make \"menugen.cfg\" executable"
            exit 6
        fi
    fi
    . ./menugen.cfg
fi
THEME="${THEME:-'Default Theme: Default Subtheme'}"
CLR_TEXT="${CLR_TEXT:-'#000000'}"
CLR_BACKGRD="${CLR_BACKGRD:-'#FFFFFF'}"
CLR_LINK="${CLR_LINK:-'#0000FF'}"
CLR_ALINK="${CLR_ALINK:-'#777700'}"
CLR_VLINK="${CLR_VLINK:-'#770000'}"
CLR_MENUBORDER="${CLR_MENUBORDER:-'#ABADC9'}"
CLR_MENUBG="${CLR_MENUBG:-'#DDDDDD'}"
CLR_MENUTEXT="${CLR_MENUTEXT:-'#000000'}"
SIZ_BASEFONT="${SIZ_BASEFONT:-'4'}"
CONTACT_NAME="${CONTACT_NAME:-'Dana French'}"
CONTACT_EMAIL="${CONTACT_EMAIL:-'dfrench@mtxia.com'}"
DATAFILE="menugen.dat"
GRANDCHILD="0"
HTMLFILES="0"
MENUPOS="left"
################################################################
syntax()
{
    [ "_${1}" != "_" ] && ( echo ""; echo "${1}" )
    echo ""
    echo "Syntax: menugen [-g] [-S] [-u] [-f datafile] | -c | -C | -h"
    echo "        -c = Create a default \"menugen.cfg\" file"
    echo "        -C = Overwrite \"menugen.cfg\" file, even if it already exists"
    echo "        -g = Show grandchild links in menus"
    echo "        -R = Position menu box on Right side of page"
    echo "        -S = If the static menu bar exists, overwrite it with the default"
    echo "        -f = Use data file specified by value \"datafile\""
    echo "        -u = Underline Menu Links"
    echo "        -n = Generate .html files"
    echo "        -h = Display help file"
    echo ""
}
################################################################
mkconfig()
{
  if [ -f "./menugen.cfg" ]
  then
      echo "\"menugen.cfg\" file already exists, not overwritten"
      return 1
  fi
  echo "THEME=\"Default Theme: Default Subtheme\"       # Title displayed at top of every page" > ./menugen.cfg
  echo "CLR_TEXT=\"#000000\"            # Text color (default=#000000)" >> ./menugen.cfg
  echo "CLR_BACKGRD=\"#FFFFFF\"         # Background color (default=#FFFFFF)" >> ./menugen.cfg
  echo "CLR_LINK=\"#0000FF\"            # Link color (default=#0000FF)" >> ./menugen.cfg
  echo "CLR_ALINK=\"#777700\"           # Active Link color (default=#777700)" >> ./menugen.cfg
  echo "CLR_VLINK=\"#770000\"           # Viewed Link color (default=#770000)" >> ./menugen.cfg
  echo "CLR_MENUBORDER=\"#ABADC9\"      # Menu Border color (default=#ABADC9)" >> ./menugen.cfg
  echo "CLR_MENUBG=\"#DDDDDD\"          # Menu Background color (default=#DDDDDD)" >> ./menugen.cfg
  echo "CLR_MENUTEXT=\"#000000\"                # Menu Text color (default=#000000)" >> ./menugen.cfg
  echo "SIZ_BASEFONT=\"4\"              # Base Font Size (default=4)" >> ./menugen.cfg
  echo "CONTACT_NAME=\"Dana French\"    # Person responsible for this Page (default=Dana French)" >> ./menugen.cfg
  echo "CONTACT_EMAIL=\"dfrench@mtxia.com\"     # Email address of person responsible for this page (default=dfrench@mtxia.com)" >> ./menugen.cfg
  chmod 755 ./menugen.cfg
  echo "\"menugen.cfg\" file was created in the current directory."
  return 0
}
################################################################
mg_footer()
{
  echo "
<!-- Begin included file \"footer.shtml\" -->
  <P><!--#include file=\"hr.shtml\" --></P>
  
  <P>
  <FONT Size=\"2\">
  <ADDRESS>
  For information regarding this page, contact
  <A Href=\"mailto:${CONTACT_EMAIL}\">
  ${CONTACT_NAME} ( ${CONTACT_EMAIL} )</A>
  </ADDRESS>
  </FONT>
  </P>
  
<!-- End included file \"footer.shtml\" -->
"
}
################################################################
mg_hr()
{
  echo "
<!-- Begin included horizontal rule file \"hr.shtml\" -->
  
  <TABLE Border=\"0\" Width=\"100%\" Cellspacing=\"0\" Cellpadding=\"0\">
  <TR><TD Bgcolor=\"${CLR_MENUBORDER}\"><FONT Size=\"1\"> </FONT></TD></TR></TABLE>
  
<!-- End included horizontal rule file \"hr.shtml\" -->
"
}
################################################################
mg_staticbar()
{
  echo "
<!-- Begin included static linkbar file \"staticbar.shtml\" -->
"
 
  if [ "_${UNDERLINE}" != "_1" ]
  then
      echo "
  <STYLE>
  <!--
        A { Color:${CLR_MENUTEXT}; text-decoration:none; }
        A:hover { text-decoration:underline;color:${CLR_MENUTEXT}; }
  //-->
  </STYLE>
"
  fi

  echo "  
  <P>
  <TABLE Border=\"0\" Cellspacing=\"5\" Cellpadding=\"0\" Align=\"right\"><TR><TD Bgcolor=\"white\">
  <TABLE Border=\"0\" Width=\"100%\" Cellspacing=\"0\" Cellpadding=\"1\" Align=\"left\"><TR><TD Bgcolor=\"${CLR_MENUBORDER}\">
  <TABLE Border=\"0\" Width=\"100%\" Cellspacing=\"0\" Cellpadding=\"5\" Align=\"left\">
  <P>
    <TR>
      <TD Bgcolor=\"${CLR_MENUBG}\" Align=\"left\" Valign=\"top\">
        <FONT Size=\"2\" Color=\"${CLR_MENUTEXT}\"><STRONG>
  <A Href=\"http://www.txu.com\"> TXU </A>
   | <A Href=\"http://eperf.tu.com\"> Documentation </A>
   | <A Href=\"http://www.mtxia.com\"> Mt Xia </A>
        </STRONG></FONT>
      </TD>
    </TR>
  </P>
  </TABLE>
  </TD></TR></TABLE>
  </TD></TR></TABLE>
  </P>
"
  
  if [ "_${UNDERLINE}" != "_1" ]
  then
      echo "
  <STYLE>
  <!--
        A { Color:${CLR_LINK}; text-decoration:underline; }
        A:hover { text-decoration:underline;color:${CLR_LINK}; }
  //-->
  </STYLE>
"
  fi

  echo "  
<!-- End included static linkbar file \"staticbar.shtml\" -->
"
}
################################################################
mg_titlebar()
{
  THEME1="${THEME}"
  THEME2=" "
  if echo "${THEME}" | grep ":" > /dev/null 2>&1
  then
      THEME1="${THEME%%:*}"
      THEME2="${THEME#*:}"
  fi

  echo "
<!-- Begin included file \"titlebar.shtml\" -->
  
  <P><FONT Size=\"6\" Color=\"#000000\">
  <BR><STRONG>${THEME1}:</STRONG></FONT>
  <FONT Size=\"4\" Color=\"#000000\"><STRONG><I>${THEME2}</I></STRONG></FONT>
  <BR><!--#include file=\"hr.shtml\" --></P>

<!-- End included file \"titlebar.shtml\" -->
"
}
################################################################

for OPT in "$@"
do
    case "${OPT}" in
        "-c") mkconfig; exit 3;;
        "-C") rm -f "./menugen.cfg"; mkconfig; exit 5;;
        "-h") syntax | more - "/usr/local/sh/README.menugen"; exit 4;;
        "-g") GRANDCHILD="1";;
        "-R") MENUPOS="right";;
        "-S") rm -f "./staticbar.shtml";;
        "-f") DATAFILE="${2}";;
        "-n") HTMLFILES="1";;
        "-u") UNDERLINE="1";;
        "-?") syntax "Help"; exit 2;;
    esac
    if [ "_${DATAFILE}" = "_" -o ! -s "${DATAFILE}" ]
    then
        syntax "Invalid data file name"
        exit 1
    fi
    shift 2>/dev/null
done

if [ ! -s "${DATAFILE}" ]
then
    syntax "Invalid data file"
    exit 1
fi

echo "${DATAFILE} will be used to define pages and relationships"
[ "_${GRANDCHILD}" = "_1" ] && echo "Grandchild links will be shown on menus"

[ ! -f "./staticbar.shtml" ] && mg_staticbar > ./staticbar.shtml
mg_titlebar > ./titlebar.shtml
mg_hr > ./hr.shtml
mg_footer > ./footer.shtml

################################################################

while read PARENTID1 PAGEID1 PAGENAME1
do
  echo ""

  grep "^${PAGEID1}     " ${DATAFILE} > /tmp/tmp1${$}.out
  PARENTNAME=`grep "    ${PARENTID1}    " ${DATAFILE} | head -1 | sed -e "s/            /:/g;s/ /:/g" | cut -d":" -f3`

  echo "${PARENTNAME}"
  echo "    ${PAGENAME1}" | tr '[a-z]' '[A-Z]'

  if echo "${PARENTID1}" | grep "^#" > /dev/null 2>&1
  then
      continue
  fi

  if [[ "_${MENUPOS}" = "_right" ]]
  then

  echo "
<HTML>
<!-- PARENTID1=\"${PARENTID1}\" -->
<!-- PAGEID1=\"${PAGEID1}\" -->
<!-- PAGENAME1=\"${PAGENAME1}\" -->
<HEAD>
<TITLE>${PAGENAME1} - ${THEME}</TITLE>
</HEAD>
<BODY Bgcolor=\"${CLR_BACKGRD}\" Text=\"${CLR_TEXT}\" Link=\"${CLR_LINK}\" Alink=\"${CLR_ALINK}\" Vlink=\"${CLR_VLINK}\">
<BASEFONT Size=\"${SIZ_BASEFONT}\">
<!--#include file=\"staticbar.shtml\" -->
<!--#include file=\"titlebar.shtml\" -->
<TABLE Cellspacing=\"0\" Cellpadding=\"0\" Border=\"0\">
<P><TR><TD Width=\"100%\" Valign="top">
<P><H2>${PAGENAME1}</H2></P>
<P><HR></P>
</TD><TD Align=\"right\" Valign=\"top\" rowspan=\"2\">
<!--#include file=\"${PAGEID1##*/}.menu.shtml\" -->
</TD></TR></P>
" > "${PAGEID1/#*\///tmp/}.shtml"

  else

  echo "
<HTML>
<!-- PARENTID1=\"${PARENTID1}\" -->
<!-- PAGEID1=\"${PAGEID1}\" -->
<!-- PAGENAME1=\"${PAGENAME1}\" -->
<HEAD>
<TITLE>${PAGENAME1} - ${THEME}</TITLE>
</HEAD>
<BODY Bgcolor=\"${CLR_BACKGRD}\" Text=\"${CLR_TEXT}\" Link=\"${CLR_LINK}\" Alink=\"${CLR_ALINK}\" Vlink=\"${CLR_VLINK}\">
<BASEFONT Size=\"${SIZ_BASEFONT}\">
<!--#include file=\"staticbar.shtml\" -->
<!--#include file=\"titlebar.shtml\" -->
<!--#include file=\"${PAGEID1##*/}.menu.shtml\" -->
<P><H2>${PAGENAME1}</H2></P>
<P><HR></P>
" > "${PAGEID1/#*\///tmp/}.shtml"

  fi

################################################################
  echo "
<!-- Begin included menu file \"${PAGEID1}.menu.shtml\" -->
" > "${PAGEID1/#*\///tmp/}.menu.shtml"

  if [ "_${UNDERLINE}" != "_1" ]
  then
      echo "
<STYLE>
<!--
        A { Color:${CLR_MENUTEXT}; text-decoration:none; }
        A:hover { text-decoration:underline;color:${CLR_MENUTEXT}; }
//-->
</STYLE>
" >> "${PAGEID1/#*\///tmp/}.menu.shtml"
  fi

echo "  
<P Align=\"right\">
<TABLE Border=\"0\" Width=\"20%\" Cellspacing=\"5\" Cellpadding=\"0\" Align=\"left\"><TR><TD Bgcolor=\"white\">
<TABLE Border=\"0\" Width=\"100%\" Cellspacing=\"0\" Cellpadding=\"1\" Align=\"left\"><TR><TD Bgcolor=\"${CLR_MENUBORDER}\">
<TABLE Border=\"0\" Width=\"100%\" Cellspacing=\"0\" Cellpadding=\"5\" Align=\"left\">
<P>
  <TR>
    <TD Bgcolor=\"${CLR_MENUBG}\" Align=\"left\" Valign=\"top\">
      <FONT Size=\"2\" Color=\"${CLR_MENUTEXT}\">
<I>Current:</I><STRONG>${PAGENAME1}</STRONG>
<BR><A Href=\"${PARENTID1}.shtml\"><I>Previous:</I>${PARENTNAME}</A>
" >> "${PAGEID1/#*\///tmp/}.menu.shtml"

if [ "_${PARENTNAME}" != "_Home Page" ]
then
    echo "<BR><A Href=\"index.shtml\">Home Page</A>" >> "${PAGEID1/#*\///tmp/}.menu.shtml"
fi
echo "<BR>" >> "${PAGEID1/#*\///tmp/}.menu.shtml"

  while read PARENTID2 PAGEID2 PAGENAME2
  do

    LINK="${PAGEID2}.shtml"
    if echo "${PAGEID2}" | grep "#" > /dev/null 2>&1
    then
        LINK=`echo "${PAGEID2}"`
    fi

echo "        ${PAGENAME2}"

    echo "<BR><A Href=\"${LINK}\">${PAGENAME2}</A>" >> "${PAGEID1/#*\///tmp/}.menu.shtml"
    grep "^${PAGEID2}   " ${DATAFILE} > /tmp/tmp2${$}.out
    if [ "_${GRANDCHILD}" = "_1" ]
    then
      ICNT=0
      echo "<FONT Size=\"1\">" >> "${PAGEID1/#*\///tmp/}.menu.shtml"
      while read PARENTID3 PAGEID3 PAGENAME3
      do
        ICNT="1"

        LINK="${PAGEID3}.shtml"
        if echo "${PAGEID3}" | grep "#" > /dev/null 2>&1
        then
            LINK=`echo "${PARENTID3}.shtml${PAGEID3}"`
        fi

echo "            ${PAGENAME3}"

        echo "  <LI> <A Href=\"${LINK}\">${PAGENAME3}</A></LI>" >> "${PAGEID1/#*\///tmp/}.menu.shtml"
      done < /tmp/tmp2${$}.out
      echo "</FONT>" >> "${PAGEID1}.menu.shtml"
      [ "_${ICNT}" != "_0" ] && echo "<BR>" >> "${PAGEID1/#*\///tmp/}.menu.shtml"
    fi
  done < /tmp/tmp1${$}.out

################################################################
echo "
      </FONT>
    </TD>
  </TR>
</P>
</TABLE>
</TD></TR></TABLE>
</TD></TR></TABLE>
</P>
" >> "${PAGEID1/#*\///tmp/}.menu.shtml"

  if [ "_${UNDERLINE}" != "_1" ]
  then
      echo "
<STYLE>
<!--
        A { Color:${CLR_LINK}; text-decoration:underline; }
        A:hover { text-decoration:underline;color:${CLR_LINK}; }
//-->
</STYLE>
" >> "${PAGEID1/#*\///tmp/}.menu.shtml"
  fi

echo "
<!-- End included menu file \"${PAGEID1}.menu.shtml\" -->
" >> "${PAGEID1/#*\///tmp/}.menu.shtml"

################################################################

if [[ "_${MENUPOS}" = "_right" ]]
then
  echo "
<P><TR><TD>
<!--#include file=\"${PAGEID1}.content.shtml\" -->
</TD></TR></P>
</TABLE>
</P>
" >> "${PAGEID1/#*\///tmp/}.shtml"

else

  echo "
<!--#include file=\"${PAGEID1}.content.shtml\" -->
" >> "${PAGEID1/#*\///tmp/}.shtml"

fi

echo "<!--#include file=\"footer.shtml\" -->
</BODY>
</HTML>
" >> "${PAGEID1/#*\///tmp/}.shtml"


  if [[ ${HTMLFILES} -eq  1 ]]
  then
    echo "
<HTML>
<!-- PARENTID1=\"${PARENTID1}\" -->
<!-- PAGEID1=\"${PAGEID1}\" -->
<!-- PAGENAME1=\"${PAGENAME1}\" -->
<HEAD>
<TITLE>${PAGENAME1} - ${THEME}</TITLE>
</HEAD>
<BODY Bgcolor=\"${CLR_BACKGRD}\" Text=\"${CLR_TEXT}\" Link=\"${CLR_LINK}\" Alink=\"${CLR_ALINK}\" Vlink=\"${CLR_VLINK}\">
<BASEFONT Size=\"${SIZ_BASEFONT}\">
" > "${PAGEID1/#*\///tmp/}.html"
    cat "staticbar.shtml"  >> "${PAGEID1/#*\///tmp/}.html"
    cat "titlebar.shtml"  >> "${PAGEID1/#*\///tmp/}.html"
    cat "hr.shtml"  >> "${PAGEID1/#*\///tmp/}.html"


    if [[ "_${MENUPOS}" = "_right" ]]
    then

        echo "
<TABLE Cellspacing=\"0\" Cellpadding=\"0\" Border=\"0\">
<P><TR><TD Width=\"100%\">
<P><H2>${PAGENAME1}</H2></P>
<P><HR></P>
</TD><TD Align=\"right\" Valign=\"top\" rowspan=\"2\">
" >> "${PAGEID1}.html"
        cat "${PAGEID1}.menu.shtml"  >> "${PAGEID1/#*\///tmp/}.html"
        echo "
</TD></TR></P>
<P><TR><TD>
" >> "${PAGEID1/#*\///tmp/}.html"

        cat "${PAGEID1}.content.shtml"  >> "${PAGEID1/#*\///tmp/}.html"

        echo "
</TD></TR></P>
</TABLE>
</P>
" >> "${PAGEID1/#*\///tmp/}.html"

    else

        cat "${PAGEID1}.menu.shtml"  >> "${PAGEID1/#*\///tmp/}.html"

        echo "<P><H2>${PAGENAME1}</H2></P>
<P><HR></P>
" >> "${PAGEID1/#*\///tmp/}.html"

        cat "${PAGEID1}.content.shtml"  >> "${PAGEID1/#*\///tmp/}.html"
    fi
    cat "hr.shtml"  >> "${PAGEID1/#*\///tmp/}.html"
    cat "footer.shtml"  >> "${PAGEID1/#*\///tmp/}.html"

    echo "</BODY></HTML>" >> "${PAGEID1/#*\///tmp/}.html"

  fi

done < ${DATAFILE}

rm -f /tmp/tmp1${$}.out
rm -f /tmp/tmp2${$}.out