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

version 1.2, 2000/06/23 20:40:06 version 1.7, 2000/06/29 18:52:54
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   sub register {
     my $space;
 sub styleparser {    my @taglist;
     my $temptag;
   my ($target,$content_style_string) = @_;    ($space,@taglist) = @_;
     foreach $temptag (@taglist) {
       $Apache::lonxml::alltags{$temptag}=$space;
     }
   }
   
 #------------------------------------------- target redefinition (if necessary)   use Apache::style;
       use Apache::lontexconvert;
   my @target_string = '';  use Apache::run;
   my $element;  use Apache::londefdef;
      use Apache::scripttag;
   ($element,@target_string) = split ('&&',$target);  #==================================================   Main subroutine: xmlparse  
   
   map {$content_style_string =~ s/\<(.*)$_\>/\<$1$element\>/g; } @target_string;  sub xmlparse {
      
   $target = $element;   my ($target,$content_file_string,%style_for_target) = @_;
       my $pars = HTML::TokeParser->new(\$content_file_string);
 #-------------------------------------------- create a table for defined target   my $currentstring = '';
 #----------------------------------------- from the information from Style File   my $finaloutput = ''; 
    my $newarg = '';
   my @value_style = ();   my $tempostring = '';
   my $current_key = '';   my $safeeval = new Safe;
   my $current_value = '';   $safeeval->permit("entereval");
   my $stoken;  #-------------------- Redefinition of the target in the case of compound target
   my $flag;                    
   my $iele;   ($target, my @tenta) = split('&&',$target);
   
   my $pstyle = HTML::TokeParser->new(\$content_style_string);  #------------------------- Stack definition (in stack we have all current tags)
   
   while ($stoken = $pstyle->get_token) {   my @stack = (); 
 #----------------------------------------------------- start for tag definition   my @parstack = ();
    if ($stoken->[0] eq 'S' and $stoken->[1] eq 'definetag') {  
 #-------------------------------------------------------------- new key in hash  #------------------------------------- Parse input string (content_file_string)
     $current_key = $stoken->[2]{name};   
     $flag = 0;   my $token;
 #-------------------------------------------------------------- metadata output   
     if ($target eq 'meta') {   while ($token = $pars->get_token) {
      while ($stoken = $pstyle->get_token and $stoken->[1] ne 'definetag') {      if ($token->[0] eq 'T') {
        if ($stoken->[0] eq 'S' and $stoken->[1] eq 'meta') {       $finaloutput .= &Apache::run::evaluate($token->[1],$safeeval,'');
         while ($stoken = $pstyle->get_token and $stoken->[1] ne 'meta') {     } elsif ($token->[0] eq 'S') {
     $current_value .= $stoken->[1];       # add tag to stack    
         }       push (@stack,$token->[1]);
        # add parameters list to another stack
        map {$tempostring .= "my \$$_=\"$token->[2]->{$_}\";"} @{$token->[3]};
        push (@parstack,$tempostring);
        $tempostring = '';
        
        if (exists $style_for_target{$token->[1]}) {
          #print "Style for $token->[1] is " .$style_for_target{$token->[1]}."\n";
          # use style file definition
   
          $newarg = $style_for_target{$token->[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') {
      $partstring = $tokenpat->[1];
    } elsif ($tokenpat->[0] eq 'S') {
      my $sub="start_$tokenpat->[1]";
      $partstring = &callsub($sub, $target, $tokenpat, \@parstack)
    } elsif ($tokenpat->[0] eq 'E') {
      my $sub="end_$tokenpat->[1]";
      $partstring = &callsub($sub, $target, $tokenpat, \@parstack)
    }
           # generate the my mechanism
    # map {$partstring =~ s/\$$_/$token->[2]->{$_}/g; } @{$token->[3]};
    print "Temp: $parstack[$#parstack]\n";
    $oustring .= &Apache::run::evaluate($partstring,$safeeval,$parstack[$#parstack]);
        }         }
          $finaloutput .= $oustring;
        } else {
          my $sub="start_$token->[1]";
          #print "use default definition of tag $sub\n";
          my $result = &callsub($sub, $target, $token, \@parstack);
          $finaloutput .= &Apache::run::evaluate($result,$safeeval,$parstack[$#parstack]);
        }              
      } 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]";
          $finaloutput .= callsub($sub, $target, $token, \@parstack);
      }       }
     } else {       #---- end tag from the style file
 #--------------------------------------------------------------- outtext output       if (exists $style_for_target{'/'."$token->[1]"}) {
      while ($stoken = $pstyle->get_token and $stoken->[1] ne 'outtext') {         $newarg = $style_for_target{'/'."$token->[1]"};
    if ($stoken->[1] eq 'definetag') {         if (index($newarg,'script') != -1 ) {
      $flag = 1;           my $pat = HTML::TokeParser->new(\$newarg);
              last;           my $tokenpat;
    }           my $partstring = '';
       }           my $oustring = '';
      if ($flag == 0) {            my $outputstring;
        while ($stoken = $pstyle->get_token and $stoken->[0] ne 'S') {    
     $current_value .= $stoken->[1];           while  ($tokenpat = $pat->get_token) {
        }     if ($tokenpat->[0] eq 'T') {
       while ($stoken->[1] ne 'definetag') {       $oustring .= $tokenpat->[1];
        if ($stoken->[0] eq 'S' and $stoken->[1] eq $target) {     } elsif ($tokenpat->[0] eq 'S') {
  while ($stoken = $pstyle->get_token) {               if ($tokenpat->[1] eq 'script') {
  if ($stoken->[1] ne $target) {                 while  ($tokenpat = $pat->get_token and $tokenpat->[1] ne 'script') {
    if ($stoken->[0] eq 'S') {   if ($tokenpat->[0] eq 'S')  {
        my $flagelem = 0;     
                for (my $i=$#value_style-1;$i>0;$i=$i-2) {     $partstring .=  $tokenpat->[4];
    if ($stoken->[1] eq $value_style[$i]) {   } elsif ($tokenpat->[0] eq 'T') {
        $flagelem = 1;     $partstring .=  $tokenpat->[1];
                        $iele = $i+1;   } elsif ($tokenpat->[0] eq 'E') {
                        last;     $partstring .=  $tokenpat->[2];
    }   }
        }  
        if ($flagelem == 0) {  
          $current_value .= $stoken->[4];  
             } else {  
    $current_value .= $value_style[$iele];  
        }         }
    }          
            if ($stoken->[0] eq 'E') {                 my @tempor_list = split(',',$parstack[$#parstack]);
        my $flagelem = 0;                 my @te_kl = ();
                for (my $i=$#value_style-1;$i>0;$i=$i-2) {                 my %tempor_hash = ();
    if ('/'.$stoken->[1] eq $value_style[$i]) {                 map {(my $onete,my $twote) = split('=',$_); push (@te_kl,$onete); 
        $flagelem = 1;                      $tempor_hash{$onete} = $twote} @tempor_list;
                        $iele = $i+1;                 map {$partstring =~ s/\$$_/$tempor_hash{$_}/g; } @te_kl; 
                        last;         print "want to use run\n";
    }                 &Apache::run::run($partstring,$safeeval);
        }         
        if ($flagelem == 0) {                 $partstring = '';
                  $current_value .= $stoken->[2];       } elsif ($tokenpat->[1] eq 'evaluate') {
             } else {         $outputstring = &Apache::run::evaluate($tokenpat->[2]{expression},$safeeval);
    $current_value .= $value_style[$iele];         $oustring .=  $outputstring;
        }       } else {
    }          $oustring .= $tokenpat->[4]; 
            if ($stoken->[0] eq 'T') {       }
              $current_value .= $stoken->[1];      } elsif ($tokenpat->[0] eq 'E' and $tokenpat->[1] ne 'evaluate') {
    }                                $oustring .= $tokenpat->[1];    
  }  else {        
  last;  
  }  
         }  
        } elsif ($stoken->[0] eq 'S' and $stoken->[1] ne $target) {  
   my $tempotempo = $stoken->[1];  
    while ($stoken = $pstyle->get_token and $stoken->[1] ne $tempotempo) {  
    }     }
            }
    $newarg =  $oustring;
          } else {
            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;
   }
   
        while ($stoken = $pstyle->get_token) {  sub callsub {
         if ($stoken->[0] eq 'T') {    my ($sub,$target,$token,@parstack)=@_;
           $current_value .= $stoken->[1];    my $currentstring='';
  }     {
         if ($stoken->[0] eq 'E') {      no strict 'refs';
   last;      if (my $space=$Apache::lonxml::alltags{$token->[1]}) {
  }         #print "Calling sub $sub in $space \n";
         if ($stoken->[0] eq 'S') {        $sub="$space\:\:$sub";
   last;        $currentstring = &$sub($target,$token,\@parstack);
  }      } else {
        }             #print "NOT Calling sub $sub\n";
             if (defined($token->[4])) {
    $currentstring = $token->[4];
         } else {
    $currentstring = $token->[2];
       }        }
      }  
     }      }
           use strict 'refs';
    }        }
    $current_value =~ s/(\s)+/$1/g;    return $currentstring;
      if ($current_value ne ' ' and $current_value ne '' ) {    
        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 result  
   return %style_for_target;   
 }  }
   
 1;  1;

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


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