Annotation of loncom/xml/run.pm, revision 1.16

1.2       albertel    1: package Apache::run;
1.1       sakharuk    2: 
1.10      albertel    3: sub evaluateold {
1.4       albertel    4:   my ($expression,$safeeval,$decls) = @_;
1.15      albertel    5: # print "inside2 evaluate $decls with $expression<br />\n";
1.3       albertel    6: # gerd's old method interpolates unset vars
1.5       albertel    7: # $safeeval->reval('return qq('.$expression.');');
                      8:   unless (defined $expression) { return ''; }
1.7       albertel    9:   my $result = '';
                     10:   $@='';
1.9       sakharuk   11:   $safeeval->reval('$_=q|'.$expression.'|;');
1.7       albertel   12:   if ($@ eq '') {
1.9       sakharuk   13:     $safeeval->reval('{'.$decls.'$_=~s/(\$[A-Za-z]\w*)/(defined(eval($1))?eval($1):$1)/ge;}');
1.7       albertel   14:     if ($@ eq '') {
                     15:       $result = $safeeval->reval('return $_;');
                     16:     } else {
1.10      albertel   17:       &Apache::lonxml::error("substitution on:$expression:with:$decls:caused");
1.7       albertel   18:     }
                     19:   } else {
                     20:     &Apache::lonxml::error("defining:$expression:caused");
                     21:   }
                     22:   if ($@ ne '') {&Apache::lonxml::error($@);}
1.10      albertel   23:   return $result
                     24: }
                     25: 
1.11      albertel   26: $Apache::run::EVALUATE_STRING=<<'ENDEVALUATE';  
                     27:   my %oldexpressions=();
                     28:   while (!$oldexpressions{$_}) {
                     29:     $oldexpressions{$_}=1;
1.13      www        30:     $_ =~s/((?:\$|\&)(?:[\#|\$]*[A-Za-z][\w]*|\{[A-Za-z][\w]*\}))([\[\{][^\$\&\]\}]+[\]\}])*?(\([^\$\&\)]+\))*?(?=[^\[\{\(]|$)/eval(defined(eval($1.$2))?eval('$1.$2.$3'):'$1.$2.$3')/seg;
1.11      albertel   31:   }
                     32: ENDEVALUATE
                     33: 
1.10      albertel   34: sub evaluate {
                     35:   my ($expression,$safeeval,$decls) = @_;
                     36:   unless (defined $expression) { return ''; }
1.16    ! albertel   37:   if (!$Apache::lonxml::evaluate) { return $expression; }
1.10      albertel   38:   my $result = '';
                     39:   $@='';
1.11      albertel   40:   print $decls
                     41:   $safeeval->reval('{'.$decls.';$_=<<\'EXPRESSION\';'."\n".$expression.
                     42: 		   "\n".'EXPRESSION'."\n".$EVALUATE_STRING.'}');
                     43: #  $safeeval->reval('{'.$decls.';<< &evaluate(q|'.$expression.'|);}');
1.10      albertel   44:   if ($@ eq '') {
                     45:     $result = $safeeval->reval('return $_;');
1.13      www        46:     chomp $result;
1.10      albertel   47:   } else {
                     48:     &Apache::lonxml::error("substitution on:$expression:with:$decls:caused $@");
                     49:   }  
1.7       albertel   50:   return $result
1.2       albertel   51: }
                     52: 
                     53: sub run {
                     54:   my ($code,$safeeval) = @_;
1.3       albertel   55: #  print "inside run\n";
1.7       albertel   56:   $@='';
1.14      albertel   57:   my (@result)=$safeeval->reval($code);
1.7       albertel   58:   if ($@ ne '') { 
                     59:     &Apache::lonxml::error(":$code:caused"); 
                     60:     &Apache::lonxml::error($@); 
                     61:   }
1.14      albertel   62:   if ( $#result < '1') {
                     63:     return $result[0];
                     64:   } else {
                     65:     &Apache::lonxml::debug("<b>Got lots results</b>:$#result:");
                     66:     return (@result);
                     67:   }
1.2       albertel   68: }
                     69: 
                     70: 1;
                     71: __END__;

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