#!/bin/sh
#
#                          T e X 2 a r c h
#
#                          by Aaron Lauda
#                   http://www.dpmms.cam.ac.uk/~al366
#
#    	    	      Version = 2.0 (2004-11-21)';
#
#
# This program converts all of the diagrams in a LaTeX document to gif files 
# using the textogif program on each diagram.  The HTML image tag for each  
# converted diagram is saved into an auxillery file.  Using this file the 
# program also makes a web page that has the LaTeX code for each diagram 
# togeter with the gif file.
#
# The program takes two arguements the first the name of the LaTeX document
# that is to be converted and the root name for the family of gif diagrams 
# that is output.  For instance:
#          ./TeX2arch-2.0.sh FILE.tex DIAGRAMFAM 
# The gifs that the program generates will be called DIAGRAMFAM1, DIAGRAMFAM2,
# etc. If these arguements are not given on the command line the program 
# request this information.
#
# The program works by locating diagrams inside the square bracket enviornment
#             \[ Diagram code \]
# The program does not work if diagrams are inside the double dollar sign 
# enviornment.  This can be used to select which diagrams in the source 
# document are converted. 

 

##---------------------------------------------------------------##
##GATHERS INFORMATION ABOUT FILES UNLESS THE ARGUEMENTS ARE GIVEN

 if [ "$#" -le "0" ]
  then
   echo "**** WHAT IS THE NAME OF THE LATEX FILE WHOSE ****"
   echo "**** DIAGRAMS YOU WOULD LIKE TO CONVERT TO HTML? ****"
   read SOURCE
  else
   SOURCE=$1
 fi

 if [ "$#" -le "1" ]
  then
   echo ""
   echo "**** WHAT WOULD YOU LIKE TO CALL THE FAMILY ****"
   echo "****OF GIF FILES THAT THE PROGRAM WILL GENERATE ****"
   echo "****FOR EXAMPLE, Diagram1, Diagram2, Diagram3, ... ****"
   read DIAGRAM_FILE
  else
   DIAGRAM_FILE=$2
 fi
##---------------------------------------------------------------##



##---------------------------------------------------------------##
##SETS A VARIABLE TO THE VALUE OF DATE WITH THE CLOCK
##SO THAT PROGRAM CAN RUN IN PARELLEL WITHOUT OVERWRITING 
##THE TEMPORARY FILES 
    TIME=`date | awk '{ print $4 }'`
##---------------------------------------------------------------##


##---------------------------------------------------------------##
## COUNTS THE NUMBER OF DIAGRAMS IN THE FILE BY COUNTING
## THE NUMBER OF LINES WITH A "\]" IN IT

  grep '\\\]' $SOURCE > _TEMP_FORMAT2$TIME
  NUM_DIAGRAMS=`wc -l _TEMP_FORMAT2$TIME | awk '{ print $1 }'`
##---------------------------------------------------------------##


##---------------------------------------------------------------##
##FEEDBACK AND DISPLAY THE NUMBER OF DIAGRAMS IN THE SOURCE FILE   
   echo ""
   echo "**** IT WILL JUST TAKE A FEW MINUTES ****"
   echo "**** THE PROGRAM IS CONVERTING A TOTAL OF $NUM_DIAGRAMS DIAGRAMS ****"
   echo ""
##---------------------------------------------------------------##


##---------------------------------------------------------------##
##PREPROCESSES THE DOCUMENT TO REDUCE ERRORS AND NAMES
##TEMPORARY FILES BASED ON THE NUMBER OF LINES IN DOCUMENT
##SO THAT THE PROGRAM CAN RUN IN PARALLEL ON DIFFERENT 
##DOCUMENTS WITHOUT OVERWRITING THE TEMP FILES
   sed 's/\\\[/\
\\\[/g' $SOURCE >> _TEMP_FORMAT$TIME
  sed 's/\\\]/\\\]\
/g' _TEMP_FORMAT$TIME > _TEMP_FORMAT2$TIME
 rm _TEMP_FORMAT$TIME
##---------------------------------------------------------------##



##---------------------------------------------------------------##
##SETS A VARIABLE TO THE NUMBER OF LINES IN A FILE AFTER IT HAS 
##BEEN FORMATTED
    NEW_LINES=`wc -l _TEMP_FORMAT2$TIME | awk '{ print $1 }'`
##---------------------------------------------------------------##
   



##---------------------------------------------------------------##
##INITIALIZE HTML FILE
echo "<html>" >>  ${DIAGRAM_FILE}-Tutorial.html
echo "<head>" >>  ${DIAGRAM_FILE}-Tutorial.html
echo "<TITLE> HTML conversion of $SOURCE </TITLE>" \
              >> ${DIAGRAM_FILE}-Tutorial.html
echo "</head> ">> ${DIAGRAM_FILE}-Tutorial.html
echo "<body> <BODY bgcolor="'#'FFFFFF">" >> ${DIAGRAM_FILE}-Tutorial.html
echo >> ${DIAGRAM_FILE}-Tutorial.html
echo >> ${DIAGRAM_FILE}-Tutorial.html
##---------------------------------------------------------------##


##---------------------------------------------------------------##
 ##INITIALIZING VARIABLES
    TICKER=1
    TICKER2=1
    PRINTER_CHECK="0"
    NUM_ERRORS=0
    END_HEADERS=0
##---------------------------------------------------------------##


##---------------------------------------------------------------##
##BUILDS LATEX FILE AND HTML FILE

  while [ "$TICKER" -le "$NEW_LINES" ] ##keep going untill the end of file
 do    
    ##SET A VARIABLE AND A TEMP FILE TO A SPECIFIC LINE 
    ##IN FILE THAT IS ITERATED UNTIL THE END OF THE FILE   
    head -$TICKER _TEMP_FORMAT2$TIME | tail -1 > _TEMP$TIME

    ##TELLS PROGRAM WHERE DIAGRAM BEGINS. NOTE THAT A
    ##DIAGRAM IS GUARENTEED TO BEGIN AT THE START OF LINE
    ##DUE TO THE PREPROCESSING OF THE DOCUMENT
    BEGIN_DIAGRAM=`egrep '^.\[' _TEMP$TIME` 
    
    ##TELLS PROGRAM WHERE DIAGRAM ENDS
    END_DIAGRAM=`grep '\\\\]' _TEMP$TIME`           
    
    ##TELLS PROGRAM IF DIAGRAM STARTS AND ENDS ON SAME LINE
    ##OR IF ITS HAS \[ (text) SO THAT THE PROGRAM KNOWS TO PRINT
    ##THE TEXT AFTER THE BRACKET        
      sed 's/\\\[//g' _TEMP$TIME \
           | sed 's/\\\]//g' > _TEMP2$TIME
     LAST_LINE2=`egrep "[a-z|A-Z|0-9]"  _TEMP2$TIME` 
     

   ##REMOVES TEMPORARY FILE USED DURING THE SCRIPT
    rm _TEMP$TIME
                                   
    

    ##TELLS PROGRAM WHERE THE DOCUMENT BEGINS
    ##SO THAT IT CAN COPY ALL OF THE RELIVANT 
    ##HEADERS FROM THE LATEX DOCUMENT
    SNATCH_HEADERS=`grep \begin{document} _TEMP2$TIME`
    
    
    if [ "$SNATCH_HEADERS" != "" ]
    then
	  ##STORES THE LINE NUMBER  
	  ##THAT THE HEADERS END
          END_HEADERS=`expr $TICKER - 1`
    fi

   ##TURNS ON THE PRINTER IF IT IS THE START OF A DIAGRAM
   if [ "$BEGIN_DIAGRAM" != "" ]
   then
         PRINTER_CHECK="1"
	 
             
             ##SET UP LATEX FILE
        head -$END_HEADERS _TEMP_FORMAT2$TIME >> $DIAGRAM_FILE$TICKER2.tex
	     echo "\pagestyle{empty}" >> $DIAGRAM_FILE$TICKER2.tex
	     echo " " >> $DIAGRAM_FILE$TICKER2.tex
	     echo " " >> $DIAGRAM_FILE$TICKER2.tex
	     echo "\begin{document}" >> $DIAGRAM_FILE$TICKER2.tex
	     echo " " >> $DIAGRAM_FILE$TICKER2.tex
	     echo " " >> $DIAGRAM_FILE$TICKER2.tex
	     echo " " >> $DIAGRAM_FILE$TICKER2.tex
	     echo "\begin{displaymath}" >> $DIAGRAM_FILE$TICKER2.tex

	     ##ADD BEGINNING OF CODE TO HTML FILE
	     echo  >> ${DIAGRAM_FILE}-Tutorial.html
	     echo  >> ${DIAGRAM_FILE}-Tutorial.html
	     echo "<P>" >> ${DIAGRAM_FILE}-Tutorial.html
	     echo "Diagram $TICKER2" >> ${DIAGRAM_FILE}-Tutorial.html
	     echo ' <TABLE BORDER="0" CELLPADDING="2" CELLSPACING="2"/>' \
		        >> ${DIAGRAM_FILE}-Tutorial.html
	     echo "  <TR>"  >> ${DIAGRAM_FILE}-Tutorial.html 
	     echo "  <TD>" >> ${DIAGRAM_FILE}-Tutorial.html
	     echo "   <UL>" >> ${DIAGRAM_FILE}-Tutorial.html
	 	  
   fi

   ##PRINTS IF LINE IS PART OF A DIAGRAM
   if [ "$PRINTER_CHECK" != "0" ]
   then
        ##IF IT IS NOT IN THE EXPECTED FORMAT THEN PRINT THE
        ##LINE BUT NOT THE BRACKETS
        if [ "$LAST_LINE2" != "" ] 
        then
        echo $LAST_LINE2 >> $DIAGRAM_FILE$TICKER2.tex 
        echo "     <BR> $LAST_LINE2" >> ${DIAGRAM_FILE}-Tutorial.html
       fi
   fi


   ##TURNS OFF PRINTER IF DIAGRAM ENVIORNMENT HAS ENDED
   if [ "$END_DIAGRAM" != "" ]
   then       
	    PRINTER_CHECK="0"

	    ##CLOSE LATEX FILE
	    echo " \end{displaymath}" >> $DIAGRAM_FILE$TICKER2.tex
	    echo " " >> $DIAGRAM_FILE$TICKER2.tex
	    echo " " >> $DIAGRAM_FILE$TICKER2.tex
	    echo " " >> $DIAGRAM_FILE$TICKER2.tex
	    echo "\end{document}" >> $DIAGRAM_FILE$TICKER2.tex

	    ##ADD END OF CODE TO HTML FILE
	    echo "    </UL> " >> ${DIAGRAM_FILE}-Tutorial.html
	    echo "   </TD>" >> ${DIAGRAM_FILE}-Tutorial.html
	    echo "   <TD>" >> ${DIAGRAM_FILE}-Tutorial.html
	    echo '<IMG ALIGN="CENTER" HEIGHT=2 WIDTH=110 SRC="blank.gif">' \
		       >> ${DIAGRAM_FILE}-Tutorial.html
	    echo '<IMG  ALIGN="" SRC="'$DIAGRAM_FILE$TICKER2.gif'">' \
		       >> ${DIAGRAM_FILE}-Tutorial.html
	    echo "   </TD>" >> ${DIAGRAM_FILE}-Tutorial.html
	    echo "  </TR>" >> ${DIAGRAM_FILE}-Tutorial.html
	    echo " </TABLE>" >> ${DIAGRAM_FILE}-Tutorial.html
	    echo " </P>" >> ${DIAGRAM_FILE}-Tutorial.html
	    echo  >> ${DIAGRAM_FILE}-Tutorial.html

	
           ##GETS RID OF ANNOYING CHARACTERS LIKE ^M THAT SHOW UP FROM
           ##COPYING FILES FROM A WINDOWS PROGRAM
	     dos2unix $DIAGRAM_FILE$TICKER2.tex 


           ##CONVERTS THE FILES INTO .GIF FORMAT
	   ##AND OUTPUTS THE STANDARD ERROR TO 
           ##A TEMPORARY FILE TO BE PROCESSED.  
           ##NOTE THAT texttogif SENDS THE HTML
           ##CODE TO THE STANDARD ERROR
             textogif $DIAGRAM_FILE$TICKER2.tex 2> _TEMP2$TIME
	     
           ##CLEAN UP WASTE FILES
	     rm $DIAGRAM_FILE$TICKER2.tex

	   ##IF NO ERROR OCCURED THEN THE HTML IS REDIRECTED
	    
           ##CHECKS THAT THE TEXTOGIF PROGRAM WAS ABLE TO GENERATE
           ##A GIF FILE FOR THE CURRENT DIAGRAM 
             ERROR_CHECK=`egrep '^<img' _TEMP2$TIME `
	     
           ##IF TEXTOGIF WAS SUCESSFUL SAVE THE IMAGE TAG INTO A FILE     
           if [ "$ERROR_CHECK" != "" ]
	     then
	        tail -1 _TEMP2$TIME >> ${DIAGRAM_FILE}HTML
             
             ##OTHERWISE PRINT ERROR MESSAGE TO FILE		
	     else
		NUM_ERRORS=`expr $NUM_ERRORS + 1` #keeps track of errors

		##SEND ERROR MESSAGE TO SCREEN
		echo "" 
		echo "*********************************************"
		echo "*********************************************" 
		echo "Diagram number $TICKER2 generated an error!!!"
		echo "See line $TICKER of the LaTeX document."
		echo "*********************************************"
		echo "*********************************************"
                echo ""

		##STORE A RECORD OF THE ERROR IN THE FILE ENDING IN HTML
                echo \
        "---Diagram Number $TICKER2 generated an error!!---see line $TICKER" \
		     >> ${DIAGRAM_FILE}HTML

	     ##PUT A MESSAGE INTO THE ACTUAL .html FILE ABOUT THE ERROR
	     echo "<H1>Diagram Number $TICKER2 generated an error!!</h1>"  \
		        >> ${DIAGRAM_FILE}-Tutorial.html
	     echo "<P> <-- THE GIF FOR THE ABOVE DIAGRAM COULD NOT BE MADE."  \
                        >> ${DIAGRAM_FILE}-Tutorial.html
             echo "IT MUST HAVE A COMMAND THAT THE LATEX ENVIORNMENT" \
	                >> ${DIAGRAM_FILE}-Tutorial.html
             echo "THE PROGRAM USES COULD NOT INTERPRET. -->" \
                        >> ${DIAGRAM_FILE}-Tutorial.html
	     echo "See line $TICKER of the LaTeX document.</P>" \
		        >> ${DIAGRAM_FILE}-Tutorial.html
             fi 
     
	  	    
      ##UPDATE TICKER THAT COUNTS THE NUMBER OF DIAGRAMS     
      TICKER2=`expr $TICKER2 + 1`
	
   fi
   
    ##UPDATES TICKER THAT COUNTS THE LINE NUMBERS
    ##IN THE ORIGINAL FILE                                 
    TICKER=`expr $TICKER + 1`            
 done


   ##REMOVES SOME TEMPORARY FILES AND EXTRA LATEX 
   ##FILES USED DURING THE SCRIPT
    rm _TEMP_FORMAT2$TIME
    rm _TEMP2$TIME
    rm  $DIAGRAM_FILE*.log
    rm  $DIAGRAM_FILE*.aux
##---------------------------------------------------------------##



##---------------------------------------------------------------##
##CLOSE HTML FILE

echo >> ${DIAGRAM_FILE}-Tutorial.html
echo >> ${DIAGRAM_FILE}-Tutorial.html
echo "</body>" >> ${DIAGRAM_FILE}-Tutorial.html
echo "</html>" >> ${DIAGRAM_FILE}-Tutorial.html

##---------------------------------------------------------------##




##---------------------------------------------------------------##
##FEEDBACK AND REPORT NUMBER OF ERRORS
echo "" 
echo "*************** ALL TAKEN CARE OF ********************"
echo "THE GIF FILES HAVE BEEN SAVED AS ${DIAGRAM_FILE}(num).gif"
echo "THE IMAGE TAGS FOR EACH .gif HAVE BEEN SAVED IN ${DIAGRAM_FILE}HTML"
echo "A WEB ARCHIVE WITH THE CODE AND DIAGRAM HAS BEEN SAVED IN ${DIAGRAM_FILE}-Tutorial.html"
echo
echo "**** NUMBER OF DIAGRAMS PROGRAM ATTEMPTED TO CONVERT= `expr $TICKER2 - 1` ****"
echo "**** THE TOTAL NUMBER OF ERRORS = $NUM_ERRORS ****"
echo "FOR A LIST OF THE DIAGRAMS THAT HAD AN ERROR SEE ${DIAGRAM_FILE}HTML "
echo
##---------------------------------------------------------------##

