File:  [LON-CAPA] / loncom / xml / lonxml.pm
Revision 1.1: download - view: text, annotated - select for diffs
Mon Jun 19 15:52:29 2000 UTC (23 years, 10 months ago) by sakharuk
Branches: MAIN
CVS tags: HEAD
*** empty log message ***

package Apache::lonxml;

use strict;
use HTML::TokeParser;
use Safe;
use Apache::Constants qw(:common);
use Apache::lontexconvert;


#=======================================================   Main subroutine: xmlparse  

sub xmlparse {

    my ($target,$content_file_string,%style_for_target) = @_;
    my $pars = HTML::TokeParser->new(\$content_file_string);
    my $currentstring = '';
    my $finaloutput = ''; 
    my $newarg = '';
    my $tempostring = '';
    my $tempocont = '';
    my $safeeval = new Safe;

#------------------------- Redefinition of the target in the case of compound target
    ($target, my @tenta) = split('&&',$target);
#------------------------------ Stack definition (in stack we have all current tags)

    my @stack = (); 
    my @parstack = ();

#------------------------------------------ Parse input string (content_file_string)
 
    my $token;

    while ($token = $pars->get_token) {
 	if ($token->[0] eq 'T') {
	    $finaloutput .= $token->[1];
            $tempocont .= $token->[1];
	} elsif ($token->[0] eq 'S') {
#------------------------------------------------------------------ add tag to stack 	    
               push (@stack,$token->[1]);
#---------------------------------------------- add parameters list to another stack
	       map {$tempostring .= "$_=$token->[2]->{$_},"} @{$token->[3]};
               push (@parstack,$tempostring);
               $tempostring = '';
               $tempocont = ''; 

               if (exists $style_for_target{$token->[1]}) { 

#--------------------------------------------------------- use style file definition

                   $newarg = $style_for_target{$token->[1]};

                   if (index($newarg,'script') != -1 ) {
                    my $pat = HTML::TokeParser->new(\$newarg);
                    my $tokenpat;
                    my $partstring = '';
                    my $oustring = '';
                    my $outputstring;

                    while  ($tokenpat = $pat->get_token) {
			if ($tokenpat->[0] eq 'T') {
			    $oustring .= $tokenpat->[1];
			} elsif ($tokenpat->[0] eq 'S') {
                            if ($tokenpat->[1] eq 'script') {
                               while  ($tokenpat = $pat->get_token and $tokenpat->[1] ne 'script') {
                                    if ($tokenpat->[0] eq 'S')  {
					$partstring .=  $tokenpat->[4];
				    } elsif ($tokenpat->[0] eq 'T') {
                                        $partstring .=  $tokenpat->[1];
				    } elsif ($tokenpat->[0] eq 'E') {
                                        $partstring .=  $tokenpat->[2];
                                    }
			       }
			      
                                map {$partstring =~ s/\$$_/$token->[2]->{$_}/g; } @{$token->[3]};
                               
                                &run($partstring,$safeeval);
                                $partstring = '';
			    } elsif ($tokenpat->[1] eq 'evaluate') {			       
				$outputstring = &evaluate($tokenpat->[2]{expression},$safeeval);
                                   $oustring .=  $outputstring;
			    } else {
                                   $oustring .= $tokenpat->[4]; 
			    }
			} elsif ($tokenpat->[0] eq 'E' and $tokenpat->[1] ne 'evaluate') {
                             $oustring .= $tokenpat->[1];    
			}
		    }
		    $newarg =  $oustring;
                   } else {
                       map {$newarg =~ s/\$$_/$token->[2]->{$_}/g; } @{$token->[3]};
	           }
		   $finaloutput .= $newarg;
	       } else {
#----------------------------------------------------- use default definition of tag
                   my $sub="start_$token->[1]";
         
                   {
		       no strict 'refs';
                       if (defined (&$sub)) {
                         $currentstring = &$sub($target,$token,\@parstack);
                         $finaloutput .= $currentstring;
                         $currentstring = '';
		       } else {
			   $finaloutput .= $token->[4];
		       }
                       use strict 'refs';    
		   }
	       }              
  	} elsif ($token->[0] eq 'E')  {
               pop @stack; 
               unless (exists $style_for_target{$token->[1]}) {
                     my $sub="end_$token->[1]";
                       {
		         no strict 'refs';
                           if (defined (&$sub)) {
			     $currentstring = &$sub($target,$token,\@parstack);
                             $finaloutput .= $currentstring;
                             $currentstring = '';
		           } else {
                             $finaloutput .= $token->[4];
		           }
			 use strict 'refs';
	               }
	       }
#------------------------------------------------------- end tag from the style file
               if (exists $style_for_target{'/'."$token->[1]"}) {
                   $newarg = $style_for_target{'/'."$token->[1]"};
                   my @very_temp = split(',',@parstack[$#parstack]);
                   map {my @ret= split('=',$_); $newarg =~ s/\$$ret[0]/$ret[1]/g; } @very_temp;
		   $finaloutput .= $newarg; 
	       }
               pop @parstack;
	}
    }
    return $finaloutput;
}


#================================================================== style subroutine 

sub styleparser {

    my ($target,$content_style_string) = @_;

#------------------------------------------------ target redefinition (if necessary) 
    
    my @target_string = '';
    my $element;
   
    ($element,@target_string) = split ('&&',$target);

     map {$content_style_string =~ s/\<(.*)$_\>/\<$1$element\>/g; } @target_string;
   
    $target = $element;
   
#------------------------------------------------- create a table for defined target
#---------------------------------------------- from the information from Style File

    my @value_style = ();
    my $current_key = '';
    my $current_value = '';

    my $pstyle = HTML::TokeParser->new(\$content_style_string);

    my $stoken;

      while ($stoken = $pstyle->get_token) {
#---------------------------------------------------------- start for tag definition
	  if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {
#------------------------------------------------------------------- new key in hash
	     $current_key = $stoken->[2]{name};
             if ($target eq 'meta') {
#-------------------------------------------------- reserved for the metadate output


	     } else {
#-------------------------------------------------------------------- outtext output
		 while ($stoken = $pstyle->get_token and $stoken->[1] ne 'outtext') {
		 }
		 while ($stoken = $pstyle->get_token and $stoken->[0] ne 'S') {
		     $current_value .= $stoken->[1];
		 }
                 while ($stoken->[1] ne 'definetag') {
                      if ($stoken->[0] eq 'S' and $stoken->[1] eq $target) {
			  while ($stoken = $pstyle->get_token) {
		               if ($stoken->[1] ne $target) {
			         if ($stoken->[0] eq 'S') {
			           $current_value .= $stoken->[4];
		                 } 
                                 if ($stoken->[0] eq 'E') {
                                   $current_value .= $stoken->[2];
		                 } 
                                 if ($stoken->[0] eq 'T') {
                                   $current_value .= $stoken->[1]; 
		                 }                 
		               }  else {      
			              last;
		               }
			  }
		      } elsif ($stoken->[0] eq 'S' and $stoken->[1] ne $target) {
		             while ($stoken = $pstyle->get_token and $stoken->[0] ne 'E') {
		             }
		      }

                      while ($stoken = $pstyle->get_token) {
                         if ($stoken->[0] eq 'T') {
                             $current_value .= $stoken->[1];
			 } 
                         if ($stoken->[0] eq 'E') {
			   last;
			 } 
                         if ($stoken->[0] eq 'S') {
			   last;
			 }
		      }	     
    
		 }
	     }
    
	  }    
                    push (@value_style,lc $current_key,$current_value);
                    $current_key = '';
                    $current_value = '';         

      }
  
    my %style_for_target = @value_style;
   
#-------------------------------------------------------------------- check printing
#   while (($current_key,$current_value) = each %style_for_target) {
#       print "$current_key => $current_value\n";
#   }

    return %style_for_target;
  
}



#=============================================================== Subroutine definition
#--------------------------------------------------------------------------------- Run 
        sub evaluate {
	    my ($expression,$safeeval) = @_;
            return $safeeval->reval($expression);
        }

        sub run {
	    my ($code,$safeeval) = @_;
            $safeeval->reval($code);
        }

#===================================================================== TAG SUBROUTINES
#----------------------------------------------------------------------------- <m> tag
        sub start_m {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = "\$out = lontexconvert::converted(\$in = '\$'.\"";     
	    } elsif ($target eq 'tex') {
              $currentstring = "\$";
            }
	   return $currentstring;
	}
        sub end_m {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = "\".'\$') ";    
            } elsif ($target eq 'tex') {
              $currentstring = "\$";
            }
	   return $currentstring;
	}
#-------------------------------------------------------------------------- <html> tag    
      sub start_html {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_html {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#-------------------------------------------------------------------------- <head> tag
      sub start_head {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_head {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#--------------------------------------------------------------------------- <map> tag
      sub start_map {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_map {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#------------------------------------------------------------------------ <applet> tag
      sub start_applet {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_applet {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#------------------------------------------------------------------------ <select> tag
      sub start_select {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_select {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#------------------------------------------------------------------------ <option> tag
      sub start_option {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_option {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#------------------------------------------------------------------------- <input> tag
      sub start_input {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_input {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#---------------------------------------------------------------------- <textarea> tag
      sub start_textarea {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_textarea {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#-------------------------------------------------------------------------- <form> tag
      sub start_form {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_form {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#------------------------------------------------------------------------- <title> tag
      sub start_title {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    }
	   return $currentstring;
	}
        sub end_title {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#-------------------------------------------------------------------------- <meta> tag
      sub start_meta {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    }
	   return $currentstring;
	}
        sub end_meta {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#-------------------------------------------------------------------------- <body> tag
        sub start_body {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{document} ";  
	    } 
	   return $currentstring;
	}
        sub end_body {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{document}";  
	    } 
	   return $currentstring;
	}
#------------------------------------------------------------------------ <center> tag
        sub start_center {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{center} ";  
	    } 
	   return $currentstring;
	}
        sub end_center {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{center}";  
	    } 
	   return $currentstring;
	}
#----------------------------------------------------------------------------- <b> tag
        sub start_b {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " {\\bf ";  
	    } 
	   return $currentstring;
	}
        sub end_b {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = "}";  
	    } 
	   return $currentstring;
	}
#------------------------------------------------------------------------ <strong> tag
        sub start_strong {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " {\\bf ";  
	    } 
	   return $currentstring;
	}
        sub end_strong {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {

              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = "}";  
	    } 
	   return $currentstring;
	}
#---------------------------------------------------------------------------- <h1> tag
        sub start_h1 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\chapter{ ";
	    } 
           return $currentstring;
	}
        sub end_h1 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <h2> tag
        sub start_h2 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\section{ ";
	    } 
           return $currentstring;
	}
        sub end_h2 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <h3> tag
        sub start_h3 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\subsection{ ";
	    } 
           return $currentstring;
	}
        sub end_h3 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <h4> tag
        sub start_h4 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\subsubsection{ ";
	    } 
           return $currentstring;
	}
        sub end_h4 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <h5> tag
        sub start_h5 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\paragraph{ ";
	    } 
           return $currentstring;
	}
        sub end_h5 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <h6> tag
        sub start_h6 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\subparagraph{ ";
	    } 
           return $currentstring;
	}
        sub end_h6 {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#-------------------------------------------------------------------------- <cite> tag
        sub start_cite {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\it ";
	    } 
           return $currentstring;
	}
        sub end_cite {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#----------------------------------------------------------------------------- <i> tag
        sub start_i {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\it ";
	    } 
           return $currentstring;
	}
        sub end_i {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#----------------------------------------------------------------------- <address> tag
        sub start_address {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\it ";
	    } 
           return $currentstring;
	}
        sub end_address {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#--------------------------------------------------------------------------- <dfn> tag
        sub start_dfn {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\it ";
	    } 
           return $currentstring;
	}
        sub end_dfn {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <tt> tag
        sub start_tt {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\tt ";
	    } 
           return $currentstring;
	}
        sub end_tt {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <kbd> tag
        sub start_kbd {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\tt ";
	    } 
           return $currentstring;
	}
        sub end_kbd {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#-------------------------------------------------------------------------- <code> tag
        sub start_code {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\tt ";
	    } 
           return $currentstring;
	}
        sub end_code {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#---------------------------------------------------------------------------- <em> tag
        sub start_em {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\emph ";
	    } 
           return $currentstring;
	}
        sub end_em {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#----------------------------------------------------------------------------- <q> tag
        sub start_q {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{ \\emph ";
	    } 
           return $currentstring;
	}
        sub end_q {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
		$currentstring .= "}";
	    } 
           return $currentstring;
	}
#----------------------------------------------------------------------------- <p> tag
        sub start_p {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{\\par ";
	    } 
           return $currentstring;
	}
        sub end_p {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }";
            }
           return $currentstring;
	}
#---------------------------------------------------------------------------- <br> tag
        sub start_br {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\\\";
	    } 
           return $currentstring;
	}
        sub end_br {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    }
           return $currentstring;
	}
#--------------------------------------------------------------------------- <big> tag
        sub start_big {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{\\large ";
	    } 
           return $currentstring;
	}
        sub end_big {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }";
            }
           return $currentstring;
	}
#------------------------------------------------------------------------- <small> tag
        sub start_small {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{\\footnotesize ";
	    } 
           return $currentstring;
	}
        sub end_small {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }";
            }
           return $currentstring;
	}
#---------------------------------------------------------------------- <basefont> tag
      sub start_basefont {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
#-------------------------------------------------------------------------- <font> tag
         sub start_font {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_font {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	} 
#------------------------------------------------------------------------ <strike> tag
        sub start_strike {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{\\underline ";
	    } 
           return $currentstring;
	}
        sub end_strike {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }";
            }
           return $currentstring;
	}
#----------------------------------------------------------------------------- <s> tag
        sub start_s {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{\\underline ";
	    } 
           return $currentstring;
	}
        sub end_s {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }";
            }
           return $currentstring;
	}
#--------------------------------------------------------------------------- <sub> tag
        sub start_sub {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\$_{ ";
	    } 
           return $currentstring;
	}
        sub end_sub {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }\$";
            }
           return $currentstring;
	}
#--------------------------------------------------------------------------- <sup> tag
        sub start_sup {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\$^{ ";
	    } 
           return $currentstring;
	}
        sub end_sup {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }\$";
            }
           return $currentstring;
	}
#---------------------------------------------------------------------------- <hr> tag
        sub start_hr {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "\\hline ";
	    } 
           return $currentstring;
	}
#----------------------------------------------------------------------------- <a> tag
        sub start_a {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
	    }
           return $currentstring;
	}
        sub end_a {
	    my ($target,$token,$stackref) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
                my  $tempor_var = $stackref->[$#$stackref];
		if (index($tempor_var,'name') != -1 ) {
		    $tempor_var =~ s/name=([^,]*),/$1/g;
	        $currentstring .= " \\label{$tempor_var}";
	        } elsif (index($tempor_var,'href') != -1 ) {
		    $tempor_var =~ s/href=([^,]*),/$1/g;
	        $currentstring .= " \\ref{$tempor_var}";
	        }
            }
           return $currentstring;
	}
#---------------------------------------------------------------------------- <li> tag
        sub start_li {
	    my ($target,$token,$stackref) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
                my  $tempor_var = $stackref->[$#$stackref-1];
                if (index($tempor_var,'circle') != -1 ) {
	          $currentstring .= " \\item[o] ";
	        } elsif (index($tempor_var,'square') != -1 ) {
	               $currentstring .= " \\item[$\Box$] ";
	        } else {
		    $currentstring .= " \\item ";
	        }  
	    } 
	   return $currentstring;
	}
        sub end_li {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } 
	   return $currentstring;
	}
#----------------------------------------------------------------------------- <u> tag
        sub start_u {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[4];
	    } elsif ($target eq 'tex') {
		$currentstring .= "{\\underline ";
	    } 
           return $currentstring;
	}
        sub end_u {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
	       $currentstring .= $token->[2];
	    } elsif ($target eq 'tex') {
	        $currentstring .= " }";
            }
           return $currentstring;
	}
#---------------------------------------------------------------------------- <ul> tag
        sub start_ul {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{itemize} ";  
	    } 
	   return $currentstring;
	}
        sub end_ul {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{itemize}";  
	    } 
	   return $currentstring;
	}
#-------------------------------------------------------------------------- <menu> tag
        sub start_menu {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{itemize} ";  
	    } 
	   return $currentstring;
	}
        sub end_menu {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{itemize}";  
	    } 
	   return $currentstring;
	}
#--------------------------------------------------------------------------- <dir> tag
        sub start_dir {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{itemize} ";  
	    } 
	   return $currentstring;
	}
        sub end_dir {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{itemize}";  
	    } 
	   return $currentstring;
	}
#---------------------------------------------------------------------------- <ol> tag
        sub start_ol {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{enumerate} ";  
	    } 
	   return $currentstring;
	}
        sub end_ol {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{enumerate}";  
	    } 
	   return $currentstring;
	}
#---------------------------------------------------------------------------- <dl> tag
        sub start_dl {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{description} ";  
	    } 
	   return $currentstring;
	}
        sub end_dl {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{description}";  
	    } 
	   return $currentstring;
	}
#---------------------------------------------------------------------------- <dt> tag
        sub start_dt {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = "\\item[ ";  
	    } 
	   return $currentstring;
	}
        sub end_dt {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } elsif ($target eq 'tex') {
              $currentstring = "]";  
	    } 
	   return $currentstring;
	}
#---------------------------------------------------------------------------- <dd> tag
        sub start_dd {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } 
	   return $currentstring;
	}
        sub end_dd {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];    
            } 
	   return $currentstring;
	}
#------------------------------------------------------------------------- <table> tag
        sub start_table {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[4];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\begin{tabular} ";  
	    } 
	   return $currentstring;
	}
        sub end_table {
	    my ($target,$token) = @_;
            my $currentstring = '';
            if ($target eq 'web') {
              $currentstring = $token->[2];     
	    } elsif ($target eq 'tex') {
              $currentstring = " \\end{tabular}";  
	    } 
	   return $currentstring;
	}

1;
__END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>