Diff for /loncom/xml/lonxml.pm between versions 1.1 and 1.3

version 1.1, 2000/06/19 15:52:29 version 1.3, 2000/06/26 21:35:20
Line 1 Line 1
 package Apache::lonxml;  # The LearningOnline Network with CAPA
   # XML Parser Module 
   #
   # last modified 06/26/00 by Alexander Sakharuk
   
   package Apache::lonxmlparser; 
   
 use strict;  use strict;
 use HTML::TokeParser;  use HTML::TokeParser;
 use Safe;  use Safe;
 use Apache::Constants qw(:common);  use Apache::lonstyleparser;
 use Apache::lontexconvert;  use Apache::lontexconvert;
   use Apache::londefaulttags;
   #==================================================   Main subroutine: xmlparse  
 #=======================================================   Main subroutine: xmlparse    
   
 sub xmlparse {  sub xmlparse {
   
     my ($target,$content_file_string,%style_for_target) = @_;   my ($target,$content_file_string,%style_for_target) = @_;
     my $pars = HTML::TokeParser->new(\$content_file_string);   my $pars = HTML::TokeParser->new(\$content_file_string);
     my $currentstring = '';   my $currentstring = '';
     my $finaloutput = '';    my $finaloutput = ''; 
     my $newarg = '';   my $newarg = '';
     my $tempostring = '';   my $tempostring = '';
     my $tempocont = '';   my $tempocont = '';
     my $safeeval = new Safe;   my $safeeval = new Safe;
   
 #------------------------- Redefinition of the target in the case of compound target  #-------------------- 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 = ();    ($target, my @tenta) = split('&&',$target);
     my @parstack = ();  
   
 #------------------------------------------ Parse input string (content_file_string)  
    
     my $token;  
   
     while ($token = $pars->get_token) {  #------------------------- Stack definition (in stack we have all current tags)
   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]}) {    my @stack = (); 
    my @parstack = ();
   
 #--------------------------------------------------------- use style file definition  #------------------------------------- Parse input string (content_file_string)
    
                    $newarg = $style_for_target{$token->[1]};   my $token;
   
                    if (index($newarg,'script') != -1 ) {  
                     my $pat = HTML::TokeParser->new(\$newarg);  
                     my $tokenpat;  
                     my $partstring = '';  
                     my $oustring = '';  
                     my $outputstring;  
   
                     while  ($tokenpat = $pat->get_token) {   while ($token = $pars->get_token) {
  if ($tokenpat->[0] eq 'T') {    if ($token->[0] eq 'T') {
     $oustring .= $tokenpat->[1];      $finaloutput .= $token->[1];
  } elsif ($tokenpat->[0] eq 'S') {      $tempocont .= $token->[1];
                             if ($tokenpat->[1] eq 'script') {    } elsif ($token->[0] eq 'S') {
                                while  ($tokenpat = $pat->get_token and $tokenpat->[1] ne 'script') {  #------------------------------------------------------------- add tag to stack    
                                     if ($tokenpat->[0] eq 'S')  {    push (@stack,$token->[1]);
  $partstring .=  $tokenpat->[4];  #----------------------------------------- add parameters list to another stack
     } elsif ($tokenpat->[0] eq 'T') {    map {$tempostring .= "$_=$token->[2]->{$_},"} @{$token->[3]};
                                         $partstring .=  $tokenpat->[1];    push (@parstack,$tempostring);
     } elsif ($tokenpat->[0] eq 'E') {    $tempostring = '';
                                         $partstring .=  $tokenpat->[2];  
                                     }     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]};               map {$partstring =~ s/\$$_/$token->[2]->{$_}/g; } @{$token->[3]};
                                                                 
                                 &run($partstring,$safeeval);               &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  
   
                $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')  {
   # Put here check for correct final tag (to avoid existence of starting tag only)
           
        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]"};
          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];
                        }
          }
   
                  my @tempor_list = split(',',$parstack[$#parstack]);
                  my @te_kl = ();
                  my %tempor_hash = ();
                  map {(my $onete,my $twote) = split('=',$_); push (@te_kl,$onete); 
                       $tempor_hash{$onete} = $twote} @tempor_list;
                  map {$partstring =~ s/\$$_/$tempor_hash{$_}/g; } @te_kl; 
                                  
                  &run($partstring,$safeeval);
   
                  $partstring = '';
        } elsif ($tokenpat->[1] eq 'evaluate') {
           $outputstring = &evaluate($tokenpat->[2]{expression},$safeeval);
                   $oustring .=  $outputstring;
      } else {       } else {
 #-------------------------------------------------------------------- outtext output                  $oustring .= $tokenpat->[4]; 
  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;  
  }  
       }       
       
  }  
      }       }
         } elsif ($tokenpat->[0] eq 'E' and $tokenpat->[1] ne 'evaluate') {
   }                   $oustring .= $tokenpat->[1];    
                     push (@value_style,lc $current_key,$current_value);    }
                     $current_key = '';           }
                     $current_value = '';                        $newarg =  $oustring;
          } else {
       }           my @very_temp = split(',',@parstack[$#parstack]);
              map {my @ret= split('=',$_); $newarg =~ s/\$$ret[0]/$ret[1]/g; } @very_temp;
     my %style_for_target = @value_style;         }
      
 #-------------------------------------------------------------------- check printing         $finaloutput .= $newarg; 
 #   while (($current_key,$current_value) = each %style_for_target) {       }
 #       print "$current_key => $current_value\n";       pop @parstack;
 #   }    }
    }
     return %style_for_target;   return $finaloutput;
     
 }  }
   
   
   
 #=============================================================== 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;  1;
 __END__  __END__

Removed from v.1.1  
changed lines
  Added in v.1.3


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