Diff for /loncom/xml/lonxml.pm between versions 1.2 and 1.6

version 1.2, 2000/06/23 20:40:06 version 1.6, 2000/06/29 13:58:23
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Style Parser Module   # XML Parser Module 
 #  #
 # last modified 06/23/00 by Alexander Sakharuk  # last modified 06/26/00 by Alexander Sakharuk
   
 package Apache::lonstyleparser;   package Apache::lonxml; 
   
 use strict;  use strict;
 use HTML::TokeParser;  use HTML::TokeParser;
   use Safe;
 #============================================================= style subroutine   use Apache::style;
   use Apache::lontexconvert;
 sub styleparser {  use Apache::londefdef;
   use Apache::run;
   my ($target,$content_style_string) = @_;  #==================================================   Main subroutine: xmlparse  
   
 #------------------------------------------- target redefinition (if necessary)   sub xmlparse {
       
   my @target_string = '';   my ($target,$content_file_string,%style_for_target) = @_;
   my $element;   my $pars = HTML::TokeParser->new(\$content_file_string);
       my $currentstring = '';
   ($element,@target_string) = split ('&&',$target);   my $finaloutput = ''; 
    my $newarg = '';
   map {$content_style_string =~ s/\<(.*)$_\>/\<$1$element\>/g; } @target_string;   my $tempostring = '';
       my $tempocont = '';
   $target = $element;   my $safeeval = new Safe;
       $safeeval->permit("entereval");
 #-------------------------------------------- create a table for defined target  #-------------------- Redefinition of the target in the case of compound target
 #----------------------------------------- from the information from Style File  
    ($target, my @tenta) = split('&&',$target);
   my @value_style = ();  
   my $current_key = '';  #------------------------- Stack definition (in stack we have all current tags)
   my $current_value = '';  
   my $stoken;   my @stack = (); 
   my $flag;                     my @parstack = ();
   my $iele;  
   #------------------------------------- Parse input string (content_file_string)
   my $pstyle = HTML::TokeParser->new(\$content_style_string);   
    my $token;
   while ($stoken = $pstyle->get_token) {   
 #----------------------------------------------------- start for tag definition   while ($token = $pars->get_token) {
    if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {     if ($token->[0] eq 'T') {
 #-------------------------------------------------------------- new key in hash       $finaloutput .= $token->[1];
     $current_key = $stoken->[2]{name};       $tempocont .= $token->[1];
     $flag = 0;     } elsif ($token->[0] eq 'S') {
 #-------------------------------------------------------------- metadata output  #------------------------------------------------------------- add tag to stack    
     if ($target eq 'meta') {       push (@stack,$token->[1]);
      while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') {   #----------------------------------------- add parameters list to another stack
        if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') {       map {$tempostring .= "$_=$token->[2]->{$_},"} @{$token->[3]};
         while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') {       push (@parstack,$tempostring);
     $current_value .= $stoken->[1];       $tempostring = '';
         }       
        }       if (exists $style_for_target{$token->[1]}) {
      }  #       print "Style for $token->[1] is " .$style_for_target{$token->[1]}."\n";
     } else {  #---------------------------------------------------- use style file definition
 #--------------------------------------------------------------- outtext output  
      while ($stoken = $pstyle->get_token and $stoken->[1] ne 'outtext') {         $newarg = $style_for_target{$token->[1]};
    if ($stoken->[1] eq 'definetag') {         
      $flag = 1;         if (index($newarg,'script') != -1 ) {
              last;   my $pat = HTML::TokeParser->new(\$newarg);
    my $tokenpat = '';
    my $partstring = '';
    my $oustring = '';
    my $outputstring;
     
    while  ($tokenpat = $pat->get_token) {
      if ($tokenpat->[0] eq 'T') {
   #     print "evaluating $tokenpat->[4]\n";
        $oustring .= &Apache::run::evaluate($tokenpat->[1],$safeeval);
      } 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]};
   #       print "want to use run\n";       
          &Apache::run::run($partstring,$safeeval);
          
          $partstring = '';
        } else {
   #       print "evaluating $tokenpat->[4]\n";
          $oustring .= &Apache::run::evaluate($tokenpat->[4],$safeeval);
        }
      } elsif ($tokenpat->[0] eq 'E' and $tokenpat->[1] ne 'evaluate') {
   #     print "hereish\n";
        $oustring .= $tokenpat->[1];    
    }     }
       }   }
      if ($flag == 0) {    $newarg =  $oustring;
        while ($stoken = $pstyle->get_token and $stoken->[0] ne 'S') {         } else {
     $current_value .= $stoken->[1];   map {$newarg =~ s/\$$_/$token->[2]->{$_}/g; } @{$token->[3]};
        }         }
       while ($stoken->[1] ne 'definetag') {         $finaloutput .= $newarg;
        if ($stoken->[0] eq 'S' and $stoken->[1] eq $target) {       } else {
  while ($stoken = $pstyle->get_token) {         # use default definition of tag
  if ($stoken->[1] ne $target) {         my $sub="start_$token->[1]";
    if ($stoken->[0] eq 'S') {         {
        my $flagelem = 0;   no strict 'refs';
                for (my $i=$#value_style-1;$i>0;$i=$i-2) {   if (defined (&$sub)) {
    if ($stoken->[1] eq $value_style[$i]) {     $currentstring = &$sub($target,$token,\@parstack);
        $flagelem = 1;     $finaloutput .= $currentstring;
                        $iele = $i+1;     $currentstring = '';
                        last;   } else {
    }     $finaloutput .= $token->[4];
        }  
        if ($flagelem == 0) {  
          $current_value .= $stoken->[4];  
             } else {  
    $current_value .= $value_style[$iele];  
        }  
    }   
            if ($stoken->[0] eq 'E') {  
        my $flagelem = 0;  
                for (my $i=$#value_style-1;$i>0;$i=$i-2) {  
    if ('/'.$stoken->[1] eq $value_style[$i]) {  
        $flagelem = 1;  
                        $iele = $i+1;  
                        last;  
    }  
        }  
        if ($flagelem == 0) {  
                  $current_value .= $stoken->[2];  
             } else {  
    $current_value .= $value_style[$iele];  
        }  
    }   
            if ($stoken->[0] eq 'T') {  
              $current_value .= $stoken->[1];   
    }                   
  }  else {        
  last;  
  }   }
         }   use strict 'refs';    
        } elsif ($stoken->[0] eq 'S' and $stoken->[1] ne $target) {         }
   my $tempotempo = $stoken->[1];       }              
    while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempotempo) {     } 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';
        }         }
   
        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;  
  }  
        }       
       
       }  
      }       }
     }       #---- end tag from the style file
            if (exists $style_for_target{'/'."$token->[1]"}) {
    }             $newarg = $style_for_target{'/'."$token->[1]"};
    $current_value =~ s/(\s)+/$1/g;         if (index($newarg,'script') != -1 ) {
      if ($current_value ne ' ' and $current_value ne '' ) {             my $pat = HTML::TokeParser->new(\$newarg);
        push (@value_style,lc $current_key,$current_value);           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; 
          print "want to use run\n";
                  &Apache::run::run($partstring,$safeeval);
          
                  $partstring = '';
        } elsif ($tokenpat->[1] eq 'evaluate') {
          $outputstring = &Apache::run::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 {
            my @very_temp = split(',',$parstack[$#parstack]);
            map {my @ret= split('=',$_); $newarg =~ s/\$$ret[0]/$ret[1]/g; } @very_temp;
          }
          
          $finaloutput .= $newarg; 
      }       }
      $current_key = '';       pop @parstack;
      $current_value = '';              }
    }
   }     return $finaloutput;
   my %style_for_target = @value_style;     
 #--------------------------------------------------------------- check printing  
 #  while (($current_key,$current_value) = each %style_for_target) {  
 #       print "$current_key => $current_value\n";  
 #  }  
 #---------------------------------------------------------------- return result  
   return %style_for_target;   
 }  }
   
 1;  1;

Removed from v.1.2  
changed lines
  Added in v.1.6


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