#!/bin/sh

# Generate html pages for DVI files

# Requires: 'convert' program (in ImageMagic package)



IMAGEFMT=gif   # image format
SIZE=1.0       # image file size
QUOLITY=""     # image quolity ("convert" program)


MODE=cx     # printer mode name
SHR1=1      # shrink factor of image files #1
SHR2=4.5    # shrink factor of image files #2

#MODE=ljfour # printer mode name
#SHR1=2      # shrink factor of image files #1
#SHR2=9      # shrink factor of image files #2


DATE=`date +%y%m%d-%H%m`
OPTDIR=""

usage()
{
  echo "Usage: dvi2html [options] dvi-file [options for dvi2img]" 
  echo "dvi2html uses dvi2img to generate image files." 
  echo "options:" 
  echo "   -jpg, -jpeg   image format is JPEG"
  echo "   -gif          image format is GIF"
  echo "   -png          image format is PNG"
  echo "   -latex-toc TOC   LaTeX toc file"
  echo "            (only top page of each chapter appear in thumbnail)"
  echo "   -skip-img        skip generating image files"
  echo "   -d DIR   directory for HTML files to be generated" 
  echo "            (current directory is the default)" 
  echo "   -small   generate small image files"
  echo "   -large   generate large image files"
  echo "   -Large   generate very large image files"
  exit 1
}



FILE=""
LATEXTOC=""
SKIPIMG=""

while [ $# -ne 0 ] ; do
  if [ `expr X$1 : X-` -eq 0 ]; then
    FILE=$1
    shift
    break
  fi
  case X$1 in
  X-jpg|X-jpeg)
    IMAGEFMT=jpg
    QUOLITY="-quolity 95"
    ;;
  X-gif)
    IMAGEFMT=gif
    ;;
  X-png)
    IMAGEFMT=png
    ;;
  X-latex-toc)
    LATEXTOC=$2
    shift
    ;;
  X-small)
    SIZE=1.2
    ;;
  X-normalsize)
    SIZE=1.0
    ;;
  X-large)
    SIZE=0.83
    ;;
  X-Large)
    SIZE=0.69
    ;;
  X-skip-img)
    SKIPIMG="yes"
    ;;
  X-d)
    OPTDIR=$2
    if [ ! -d ${OPTDIR} ] ; then
      echo "No such directory: ${OPTDIR}"
      exit 1
    fi
    shift
    ;;
  *)
    echo "Unknown option:" $1
    usage
    ;;
  esac
  shift
done

SHR1=`echo "${SHR1} * ${SIZE}" | bc`


if [ X$FILE = X ] ; then
  echo "dvi2html: No DVI files." 
  usage
fi

ARGS=$*
if [ ! -f ${FILE} ] ; then
  echo "dvi2html: cannot read: " ${FILE}
  exit 1
fi


PAGES=`dvipages ${FILE}`
DOCNAME=`basename ${FILE} | sed 's/\..*$//'`

if [ X$OPTDIR = X ] ; then
  DIR=`basename ${FILE} | sed 's/\..*$//'`
else
  DIR=${OPTDIR}
fi



PAGELIST=""
p=1 
while [ $p -le ${PAGES} ] 
do
  PAGELIST="${PAGELIST} $p"
  p=`expr $p + 1`
done

PAGELISTTN=""
case X${LATEXTOC} in
X)
  PAGELISTTN=${PAGELIST}
  ;;
*)
  if [ ! -f  ${LATEXTOC} ] ; then
    echo "LaTeX TOC file not found: ${LATEXTOC}"
    exit 1
  fi
  PAGELISTTN=`cat ${LATEXTOC} \
                | grep '^\\\contentsline[ ]*' \
                | grep '{chapter}' \
                | sed 's/^.*{\([0-9][0-9]*\)}$/\1/' `
  PAGELISTTN="1 ${PAGELISTTN}"
  ;;
esac

  # echo ${PAGELIST}; 
  # echo ${PAGELISTTN}; 
  # exit





#
# banner
#

echo "Making files in $DIR... ($PAGES pages)"


#
# create html directory 
#

if [ ! -d ${DIR} ] ; then
  mkdir ${DIR}
fi


#
# create image files
#

if [ X$SKIPIMG = X ] ; then

  rm -f ${DIR}/*.ppm ${DIR}/*.jpg ${DIR}/*.gif ${DIR}/*.png

  echo 'DVI -> PPM ... '

  DVI2PPMOPT="-${MODE} -verbose -aa 4 -allpages "
  echo "Big Images"
  dvi2ppm ${ARGS} ${DVI2PPMOPT} -ofile ${DIR}/L%p.ppm -s ${SHR1} ${FILE}
  echo "Small Images"
  dvi2ppm ${ARGS} ${DVI2PPMOPT} -ofile ${DIR}/S%p.ppm -s ${SHR2} ${FILE}

  echo 'PPM ->' ${IMAGEFMT} '...' | tr a-z A-Z
  for p in ${PAGELIST}
  do
    convert ${QUOLITY} ${DIR}/L${p}.ppm ${DIR}/L${p}.${IMAGEFMT}
    convert ${QUOLITY} ${DIR}/S${p}.ppm ${DIR}/S${p}.${IMAGEFMT}
    #ppmquant 256 ${DIR}/L${p}.ppm | ppmtogif -interlace  > ${DIR}/L${p}.gif
    #ppmquant 256 ${DIR}/S${p}.ppm | ppmtogif -interlace  > ${DIR}/S${p}.gif
  done
  rm -f ${DIR}/*.ppm

fi


#
# create index.html (frame version)
#

echo "Maiking index.html..."
HTML=${DIR}/index.html

if [ -f ${HTML} ] ; then
  mv ${HTML} ${HTML}-${DATE}
fi

rm -f ${HTML}
touch ${HTML}
cat <<__EOF__ >> ${HTML}
<HTML>
<HEAD>
<TITLE>
__EOF__
echo ${DOCNAME}   >> ${HTML}
cat <<__EOF__ >> ${HTML}
</TITLE>
</HEAD>
<FRAMESET COLS="20%,*" BORDER="10">
  <FRAME SRC="indexv.html" NAME="thumb">
  <FRAME SRC="page1.html" NAME="page">
</FRAMESET>
<NOFRAMES>
<BODY BGCOLOR=#e0FFe0 TEXT=#000080 LINK=#a000ff VLINK=#0020ff>
<A HREF="index-nf.html">[Page with no frame]</A>
</BODY>
</NOFRAMES>
</HTML>
__EOF__


#
# create indexv.html
#

echo "Maiking indexv.html..."
HTML=${DIR}/indexv.html
rm -f ${HTML}
touch ${HTML}
cat <<__EOF__ >> ${HTML}
<HTML>
<HEAD>
<TITLE>
__EOF__
echo ${DOCNAME}   >> ${HTML}
cat <<__EOF__ >> ${HTML}
</TITLE>
</HEAD>
<BODY BGCOLOR=#e0FFe0 TEXT=#000080 LINK=#a000ff VLINK=#0020ff>
<TABLE BORDER=0 ALIGN=CENTER>
__EOF__

for p in ${PAGELISTTN}
do
  echo "<TR><TD><A HREF=\"page"$p".html\" TARGET=\"page\">"  >> ${HTML}
  echo "          <IMG SRC=\""S$p.${IMAGEFMT}"\">"           >> ${HTML}
  echo "        </A></TD></TR>"                              >> ${HTML}
done
d=`expr \( $p - 1 \) % 4`
if [ $d -ne 0 ] ; then
  echo "</TR>" >> ${HTML}
fi

cat <<__EOF__ >> ${HTML}
</TABLE>
</P>
</BODY>
</HTML>
__EOF__


#
# create index-nf.html (no frame version)
#

echo "Maiking index-nf.html..."
HTML=${DIR}/index-nf.html
if [ -f ${HTML} ] ; then
  mv ${HTML} ${HTML}-${DATE}
fi

rm -f ${HTML}
touch ${HTML}
cat <<__EOF__ >> ${HTML}
<HTML>
<HEAD>
<TITLE>
__EOF__
echo ${DOCNAME}   >> ${HTML}
cat <<__EOF__ >> ${HTML}
</TITLE>
</HEAD>
<BODY BGCOLOR=#e0FFe0 TEXT=#000080 LINK=#a000ff VLINK=#0020ff>
<P ALIGN=CENTER>
<TABLE BORDER=0 CELLPADDING=10 ALIGN=CENTER>
__EOF__

for p in ${PAGELISTTN}
do
  d=`expr \( $p - 1 \) % 5`
  if [ $d -eq 0 ] ; then
    if [ $p -gt 1 ] ; then
      echo "</TR>" >> ${HTML}
    fi
    echo "<TR>"    >> ${HTML}
  fi
  echo "<TD><A HREF=\"page"$p".html\"><IMG SRC=\""S$p.${IMAGEFMT}"\"></A></TD>" >> ${HTML}
done
d=`expr \( $p - 1 \) % 4`
if [ $d -ne 0 ] ; then
  echo "</TR>" >> ${HTML}
fi

cat <<__EOF__ >> ${HTML}
</TABLE>
</P>
</BODY>
</HTML>
__EOF__



#
# create page*.html files
#

rm -f ${DIR}page*.html
PCOL=0

pagemove()
{
  pp=`expr $p - 1`
  if [ $pp -ne 0 ] ; then
    echo "[<A HREF=\"page"$pp".html\">Prev</A>]" >> ${HTML}
  else
    echo "[----]" >> ${HTML}
  fi
  np=`expr $p + 1`
  if [ $np -ne ${PAGES} ] ; then
    echo "[<A HREF=\"page"$np".html\">Next</A>]" >> ${HTML}
  else
    echo "[----]" >> ${HTML}
  fi
}

printpage()
{
  if [ $PCOL -gt 70 ] ; then
    echo ""
    PCOL=0
  fi
  echo -n "[$p] "
  PCOL=`expr $PCOL + 4`
  ppp=$p
  while [ $ppp -ge 10 ] 
  do
    PCOL=`expr $PCOL + 1`
    ppp=`expr $ppp / 10`
  done
}

PCOL=0
for p in $PAGELIST
do
  printpage
  HTML=${DIR}/page$p.html
  rm -f ${HTML}
  touch ${HTML}
  cat <<__EOF__ >> ${HTML}
<HTML>
<HEAD>
<TITLE>
__EOF__
echo ${DOCNAME}: page $p  >> ${HTML}
cat <<__EOF__ >> ${HTML}
</TITLE>
</HEAD>
<BODY BGCOLOR=#e0FFe0 TEXT=#000080 LINK=#a000ff VLINK=#0020ff>
__EOF__
  echo "${DOCNAME}: Page $p <BR>" >> ${HTML}
  pagemove
  echo "<P ALIGN=CENTER>" >> ${HTML}
  echo "<IMG SRC=\"L"$p".${IMAGEFMT}\">" >> ${HTML}
  echo "</P>"    >> ${HTML}
  pagemove
  echo "</BODY>" >> ${HTML}
  echo "</HTML>" >> ${HTML}
done
echo ""
PCOL=0


echo "done."


# done
