#!/bin/sh
#
# Copyright (C) 1998-2007  Hirotsugu Kakugawa. 
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
#

# Generate html pages for DVI files
# Requires: 
#   'convert' in ImageMagic package
#   'awk'

URL="http://www.google.co.jp/search?q=TeX-Guy+Project"

IMAGEFMT=png   # image format
QUALITY=""     # image quality (for "convert" program)
SIZE=1.0       # image file size


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

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

DEFFGCOLOR='#000080'
DEFBGCOLOR='#e0FFe0'


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 "   -png          image format is PNG (default)"
  echo "   -jpg, -jpeg   image format is JPEG"
  echo "   -gif          image format is GIF"
  echo "   -fg COLOR     foreground color [default: ${DEFFGCOLOR}]"
  echo "   -bg COLOR     background color [default: ${DEFBGCOLOR}]"
  echo "   -p PAPER      paper size"
  echo "   -l            landscape"
  echo "   -scale M      set magnification factor for image files"
  echo "   -Large        same as '-scale 1.44'"
  echo "   -large        same as '-scale 1.2'"
  echo "   -small        same as '-scale 0.83'"
  echo "   -tiny         same as '-scale 0.69'"
  echo "   -skip-img        skip generating image files"
  echo "   -latex-toc TOC   LaTeX toc file"
  echo "            (only top page of each chapter appear in thumbnail)"
  echo "   -d DIR   directory for HTML files to be generated" 
  echo "            (current directory is the default)" 
  exit 1
}

printpage()    # Parameter: "p" and "PCOL"
{
  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
}


FILE=""
LATEXTOC=""
SKIPIMG=""
PAPER="A4"
LANDSCAPE="no"
FGCOLOR=${DEFFGCOLOR}
BGCOLOR=${DEFBGCOLOR}


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
    QUALITY="-quality 95"
    ;;
  X-gif)
    IMAGEFMT=gif
    ;;
  X-png)
    IMAGEFMT=png
    ;;
  X-scale)
    SIZE=`echo $2   | awk '{ print (1.0 / $1) }'`
    shift
    ;;
  X-tiny)
    SIZE=1.44
    ;;
  X-small)
    SIZE=1.2
    ;;
  X-normalsize)
    SIZE=1.0
    ;;
  X-large)
    SIZE=`echo 1.20 | awk '{ print (1.0 / $1) }'`
    ;;
  X-Large)
    SIZE=`echo 1.44 | awk '{ print (1.0 / $1) }'`
    ;;
  X-fg)
    FGCOLOR=$2
    shift 
    ;;
  X-bg)
    BGCOLOR=$2
    shift 
    ;;
  X-skip-img)
    SKIPIMG="yes"
    ;;
  X-p)
    PAPER=$2
    shift 
    ;;
  X-l|X-land*)
    LANDSCAPE="yes"
    ;;
  X-d)
    OPTDIR=$2
    if [ ! -d ${OPTDIR} ] ; then
      echo "No such directory: ${OPTDIR}"
      exit 1
    fi
    shift
    ;;
  X-latex-toc)
    LATEXTOC=$2
    shift
    ;;
  *)
    echo "Unknown option:" $1
    usage
    ;;
  esac
  shift
done

SHR1=`echo "${SHR1} ${SIZE}" | awk '{ print ($1 * $2) }'`
SHR2=`echo "${SHR2} ${SIZE}" | awk '{ print ($1 * $2) }'`

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 "DVI2HTML: Making HTML files in directory \"$DIR\"... ($PAGES pages)"


#
# create html directory 
#

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


#
# interrupt
#

trap "rm -f ${DIR}/*.ppm ${DIR}/*.jpg ${DIR}/*.png ${DIR}/*.html; \
      rmdir ${DIR}; \
      echo "Aborted."; \
      exit;"  \
     1 2 3 9 15



#
# create image files
#

echo 'Phase 1. Create image file from DVI.'

if [ X$SKIPIMG = X ] ; then
  rm -f ${DIR}/*.ppm ${DIR}/*.jpg ${DIR}/*.gif ${DIR}/*.png

  DVI2PPMOPT="-${MODE} -verbose -aa 4 -allpages -${PAPER}"
  if [ X-${LANDSCAPE} = "X-yes" ] ; then
    DVI2PPMOPT="${DVI2PPMOPT} -land"
  fi
  echo "Phase 1.1. Making page images in PPM..."
  dvi2ppm ${ARGS} ${DVI2PPMOPT} -ofile ${DIR}/L%p.ppm -s ${SHR1} ${FILE}
  echo "Phase 1.2. Making thumbnail images in PPM..."
  dvi2ppm ${ARGS} ${DVI2PPMOPT} -ofile ${DIR}/S%p.ppm -s ${SHR2} ${FILE}

  UIMGFMT=`echo ${IMAGEFMT} | tr a-z A-Z`
  echo 'Phase 1.3. Converting PPM to' ${UIMGFMT} '...'
  PCOL=0
  for p in ${PAGELIST}
  do
    printpage 
    convert ${QUALITY} ${DIR}/L${p}.ppm ${DIR}/L${p}.${IMAGEFMT}
    convert ${QUALITY} ${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
  echo '   Done.'
else
  echo '   Skipped.'
fi



credit()
{
  echo "<BR>Generated by <A HREF=\"${URL}\">DVI2HTML</A>" >> ${HTML}
}


#
# create index.html (frame version)
#

echo "Phase 2. Create HTML files."

echo "Phase 2.1. 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="5">
  <FRAME SRC="indexv.html" NAME="thumb">
  <FRAME SRC="page1.html" NAME="page">
</FRAMESET>
<NOFRAMES>
__EOF__

echo "<BODY BGCOLOR=${BGCOLOR} TEXT=${FGCOLOR}\
 LINK=${FGCOLOR} VLINK=${FGCOLOR}>"  >> ${HTML}

cat <<__EOF__ >> ${HTML}
<A HREF="index-nf.html" target="_top">[Page with no frame]</A>
</BODY>
</NOFRAMES>
</HTML>
__EOF__



#
# create indexv.html
#

echo "Phase 2.2 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>
__EOF__
echo "<BODY BGCOLOR=${BGCOLOR} TEXT=${FGCOLOR}\
 LINK=${FGCOLOR} VLINK=${FGCOLOR}>"  >> ${HTML}

for p in ${PAGELISTTN}
do
  echo "<P><A HREF=\"page$p.html\" TARGET=\"page\">"        >> ${HTML}
  echo "       <IMG SRC=\"S$p.${IMAGEFMT}\" BORDER=0></A>"  >> ${HTML}
done

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



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

echo "Phase 2.3. 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>
__EOF__
echo "<BODY BGCOLOR=${BGCOLOR} TEXT=${FGCOLOR}\
 LINK=${FGCOLOR} VLINK=${FGCOLOR}>"  >> ${HTML}

for p in ${PAGELISTTN}
do
  echo "<A HREF=\"page$p.html\">"                   >> ${HTML}
  echo "  <IMG SRC=\"S$p.${IMAGEFMT}\" BORDER=0></A>" >> ${HTML}
done
credit
cat <<__EOF__ >> ${HTML}
</BODY>
</HTML>
__EOF__



#
# create page*.html files
#

echo "Phase 2.4. Maiking HTML file for each page..."

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
  echo "[<A HREF=\"page1.html\">Top</A>]"            >> ${HTML}
  echo "[<A HREF=\"page"${PAGES}".html\">Last</A>]"  >> ${HTML}
  echo "[<A HREF=\"index-nf.html\" target="_top">Index</A>]" >> ${HTML}
}


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>
__EOF__
echo "<BODY BGCOLOR=${BGCOLOR} TEXT=${FGCOLOR}\
 LINK=${FGCOLOR} VLINK=${FGCOLOR}>"  >> ${HTML}
  echo "Page $p <BR>" >> ${HTML}
  pagemove
  echo "<P ALIGN=CENTER>" >> ${HTML}
  np=`expr $p + 1`
  if [ $np -le ${PAGES} ] ; then
    echo "<A HREF=\"page"$np".html\">" >> ${HTML}
    echo "<IMG SRC=\"L$p.${IMAGEFMT}\" BORDER=0>" >> ${HTML}
    echo "</A>"    >> ${HTML}
  else
    echo "<IMG SRC=\"L$p.${IMAGEFMT}\" BORDER=0>" >> ${HTML}
  fi
  echo "</P>"    >> ${HTML}
  pagemove
  credit
  echo "</BODY>" >> ${HTML}
  echo "</HTML>" >> ${HTML}
done
echo ""
PCOL=0


echo "Done."


# done
