version 1.207, 2002/10/21 20:31:06
|
version 1.213, 2002/11/07 19:33:52
|
Line 148 $Apache::lonxml::request='';
|
Line 148 $Apache::lonxml::request='';
|
$Apache::lonxml::counter=0; |
$Apache::lonxml::counter=0; |
$Apache::lonxml::counter_changed=0; |
$Apache::lonxml::counter_changed=0; |
|
|
|
#internal check on whether to look at style defs |
|
$Apache::lonxml::usestyle=1; |
|
|
sub xmlbegin { |
sub xmlbegin { |
my $output=''; |
my $output=''; |
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
Line 528 sub xmlparse {
|
Line 531 sub xmlparse {
|
# do we have a course style file? |
# do we have a course style file? |
# |
# |
|
|
if ($ENV{'request.course.id'}) { |
if ($ENV{'request.course.id'} && $ENV{'request.state'} ne 'construct') { |
my $bodytext= |
my $bodytext= |
$ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'}; |
$ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'}; |
if ($bodytext) { |
if ($bodytext) { |
Line 630 sub inner_xmlparse {
|
Line 633 sub inner_xmlparse {
|
# add parameters list to another stack |
# add parameters list to another stack |
push (@$parstack,&parstring($token)); |
push (@$parstack,&parstring($token)); |
&increasedepth($token); |
&increasedepth($token); |
if (exists $$style_for_target{$token->[1]}) { |
if ($Apache::lonxml::usestyle && |
if ($Apache::lonxml::redirection) { |
exists($$style_for_target{$token->[1]})) { |
$Apache::lonxml::outputstack['-1'] .= |
$Apache::lonxml::usestyle=0; |
&recurse($$style_for_target{$token->[1]},$target,$safeeval, |
my $string=$$style_for_target{$token->[1]}. |
$style_for_target,@$parstack); |
'<LONCAPA_INTERNAL_TURN_STYLE_ON />'; |
} else { |
&Apache::lonxml::newparser($pars,\$string); |
$finaloutput .= &recurse($$style_for_target{$token->[1]},$target, |
|
$safeeval,$style_for_target,@$parstack); |
|
} |
|
} else { |
} else { |
$result = &callsub("start_$token->[1]", $target, $token, $stack, |
$result = &callsub("start_$token->[1]", $target, $token, $stack, |
$parstack, $pars, $safeeval, $style_for_target); |
$parstack, $pars, $safeeval, $style_for_target); |
Line 656 sub inner_xmlparse {
|
Line 656 sub inner_xmlparse {
|
} |
} |
} |
} |
|
|
if (exists($$style_for_target{'/'."$token->[1]"})) { |
if ($Apache::lonxml::usestyle && |
if ($Apache::lonxml::redirection) { |
exists($$style_for_target{'/'."$token->[1]"})) { |
$Apache::lonxml::outputstack['-1'] .= |
$Apache::lonxml::usestyle=0; |
&recurse($$style_for_target{'/'."$token->[1]"}, |
my $string=$$style_for_target{'/'.$token->[1]}. |
$target,$safeeval,$style_for_target,@$parstack); |
'<LONCAPA_INTERNAL_TURN_STYLE_ON />'; |
} else { |
&Apache::lonxml::newparser($pars,\$string); |
$finaloutput .= &recurse($$style_for_target{'/'."$token->[1]"}, |
|
$target,$safeeval,$style_for_target, |
|
@$parstack); |
|
} |
|
} else { |
} else { |
$result = &callsub("end_$token->[1]", $target, $token, $stack, |
$result = &callsub("end_$token->[1]", $target, $token, $stack, |
$parstack, $pars,$safeeval, $style_for_target); |
$parstack, $pars,$safeeval, $style_for_target); |
Line 702 sub inner_xmlparse {
|
Line 698 sub inner_xmlparse {
|
&end_tag($stack,$parstack,$token); |
&end_tag($stack,$parstack,$token); |
} |
} |
} |
} |
pop @$pars; |
if ($#$pars > -1) { |
pop @Apache::lonxml::pwd; |
pop @$pars; |
|
pop @Apache::lonxml::pwd; |
|
} |
} |
} |
|
|
# if ($target eq 'meta') { |
# if ($target eq 'meta') { |
Line 717 sub inner_xmlparse {
|
Line 715 sub inner_xmlparse {
|
return $finaloutput; |
return $finaloutput; |
} |
} |
|
|
sub recurse { |
|
my @innerstack = (); |
|
my @innerparstack = (); |
|
my ($newarg,$target,$safeeval,$style_for_target,@parstack) = @_; |
|
my @pat = (); |
|
&newparser(\@pat,\$newarg); |
|
my $tokenpat; |
|
my $partstring = ''; |
|
my $output=''; |
|
my $decls=''; |
|
&Apache::lonxml::debug("Recursing"); |
|
while ( $#pat > -1 ) { |
|
while ($tokenpat = $pat[$#pat]->get_token) { |
|
if (($tokenpat->[0] eq 'T') || ($tokenpat->[0] eq 'C') || ($tokenpat->[0] eq 'D') ) { |
|
if ($metamode<1) { $partstring=$tokenpat->[1]; } |
|
} elsif ($tokenpat->[0] eq 'PI') { |
|
if ($metamode<1) { $partstring=$tokenpat->[2]; } |
|
} elsif ($tokenpat->[0] eq 'S') { |
|
push (@innerstack,$tokenpat->[1]); |
|
push (@innerparstack,&parstring($tokenpat)); |
|
&increasedepth($tokenpat); |
|
$partstring = &callsub("start_$tokenpat->[1]", $target, $tokenpat, |
|
\@innerstack, \@innerparstack, \@pat, |
|
$safeeval, $style_for_target); |
|
} elsif ($tokenpat->[0] eq 'E') { |
|
#clear out any tags that didn't end |
|
while ($tokenpat->[1] ne $innerstack[$#innerstack] |
|
&& ($#innerstack > -1)) { |
|
my $lasttag=$innerstack[-1]; |
|
if ($tokenpat->[1] =~ /^$lasttag$/i) { |
|
&Apache::lonxml::warning('Using tag </'.$tokenpat->[1].'> as end tag to <'.$innerstack[-1].'>'); |
|
last; |
|
} else { |
|
&Apache::lonxml::warning('Found tag </'.$tokenpat->[1].'> when looking for </'.$innerstack[-1].'> in file'); |
|
&end_tag(\@innerstack,\@innerparstack,$tokenpat); |
|
} |
|
} |
|
$partstring = &callsub("end_$tokenpat->[1]", $target, $tokenpat, |
|
\@innerstack, \@innerparstack, \@pat, |
|
$safeeval, $style_for_target); |
|
} else { |
|
&Apache::lonxml::error("Unknown token event :$tokenpat->[0]:$tokenpat->[1]:"); |
|
} |
|
#pass both the variable to the style tag, and the tag we |
|
#are processing inside the <definedtag> |
|
if ( $partstring ne "" ) { |
|
if ( $#parstack > -1 ) { |
|
if ( $#innerparstack > -1 ) { |
|
$decls= $parstack[$#parstack].$innerparstack[$#innerparstack]; |
|
} else { |
|
$decls= $parstack[$#parstack]; |
|
} |
|
} else { |
|
if ( $#innerparstack > -1 ) { |
|
$decls=$innerparstack[$#innerparstack]; |
|
} else { |
|
$decls=''; |
|
} |
|
} |
|
$output .= &Apache::run::evaluate($partstring,$safeeval,$decls); |
|
$partstring = ''; |
|
} |
|
if ($tokenpat->[0] eq 'E') { pop @innerstack;pop @innerparstack; |
|
&decreasedepth($tokenpat);} |
|
} |
|
pop @pat; |
|
pop @Apache::lonxml::pwd; |
|
} |
|
&Apache::lonxml::debug("Exiting Recursing"); |
|
return $output; |
|
} |
|
|
|
sub callsub { |
sub callsub { |
my ($sub,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($sub,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $currentstring=''; |
my $currentstring=''; |
Line 841 sub callsub {
|
Line 767 sub callsub {
|
if ($token->[0] eq 'S') { |
if ($token->[0] eq 'S') { |
$currentstring = $token->[4]; |
$currentstring = $token->[4]; |
$currentstring.=&Apache::edit::handle_insert(); |
$currentstring.=&Apache::edit::handle_insert(); |
|
} elsif ($token->[0] eq 'E') { |
|
$currentstring = $token->[2]; |
|
$currentstring.=&Apache::edit::handle_insertafter($token->[1]); |
} else { |
} else { |
$currentstring = $token->[2]; |
$currentstring = $token->[2]; |
} |
} |
Line 859 sub setup_globals {
|
Line 788 sub setup_globals {
|
$errorcount=0; |
$errorcount=0; |
$warningcount=0; |
$warningcount=0; |
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::default_homework_loaded=0; |
|
$Apache::lonxml::usestyle=1; |
&init_counter(); |
&init_counter(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::extlinks=(); |
@Apache::lonxml::extlinks=(); |
Line 1043 sub get_all_text_unbalanced {
|
Line 973 sub get_all_text_unbalanced {
|
} elsif ($token->[0] eq 'E') { |
} elsif ($token->[0] eq 'E') { |
$result.=$token->[2]; |
$result.=$token->[2]; |
} |
} |
if ($result =~ /(.*)$tag(.*)/) { |
if ($result =~ /(.*)\Q$tag\E(.*)/s) { |
&Apache::lonxml::debug('Got a winner with leftovers ::'.$2); |
&Apache::lonxml::debug('Got a winner with leftovers ::'.$2); |
&Apache::lonxml::debug('Result is :'.$1); |
&Apache::lonxml::debug('Result is :'.$1); |
$result=$1; |
$result=$1; |
Line 1077 sub store_counter {
|
Line 1007 sub store_counter {
|
|
|
sub get_all_text { |
sub get_all_text { |
my($tag,$pars)= @_; |
my($tag,$pars)= @_; |
|
&Apache::lonxml::debug("Got a ".ref($pars)); |
|
if (ref($pars) ne 'ARRAY') { |
|
$pars=[$pars]; |
|
} |
my $depth=0; |
my $depth=0; |
my $token; |
my $token; |
my $result=''; |
my $result=''; |
if ( $tag =~ m:^/: ) { |
if ( $tag =~ m:^/: ) { |
my $tag=substr($tag,1); |
my $tag=substr($tag,1); |
# &Apache::lonxml::debug("have:$tag:"); |
#&Apache::lonxml::debug("have:$tag:"); |
while (($depth >=0) && ($token = $pars->get_token)) { |
while (($depth >=0) && ($#$pars > -1)) { |
# &Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]"); |
while (($depth >=0) && ($token = $$pars[-1]->get_token)) { |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
#&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd); |
$result.=$token->[1]; |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
} elsif ($token->[0] eq 'PI') { |
$result.=$token->[1]; |
$result.=$token->[2]; |
} elsif ($token->[0] eq 'PI') { |
} elsif ($token->[0] eq 'S') { |
$result.=$token->[2]; |
if ($token->[1] =~ /^$tag$/i) { $depth++; } |
} elsif ($token->[0] eq 'S') { |
$result.=$token->[4]; |
if ($token->[1] =~ /^$tag$/i) { $depth++; } |
} elsif ($token->[0] eq 'E') { |
$result.=$token->[4]; |
if ( $token->[1] =~ /^$tag$/i) { $depth--; } |
} elsif ($token->[0] eq 'E') { |
#skip sending back the last end tag |
if ( $token->[1] =~ /^$tag$/i) { $depth--; } |
if ($depth > -1) { $result.=$token->[2]; } else { |
#skip sending back the last end tag |
$pars->unget_token($token); |
if ($depth > -1) { $result.=$token->[2]; } else { |
|
$$pars[-1]->unget_token($token); |
|
} |
} |
} |
} |
} |
|
if (($depth >=0) && ($#$pars > 0) ) { |
|
pop(@$pars); |
|
pop(@Apache::lonxml::pwd); |
|
} |
} |
} |
} else { |
} else { |
while ($token = $pars->get_token) { |
while ($#$pars > -1) { |
# &Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); |
while ($token = $$pars[-1]->get_token) { |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
#&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); |
$result.=$token->[1]; |
if (($token->[0] eq 'T')||($token->[0] eq 'C')|| |
} elsif ($token->[0] eq 'PI') { |
($token->[0] eq 'D')) { |
$result.=$token->[2]; |
$result.=$token->[1]; |
} elsif ($token->[0] eq 'S') { |
} elsif ($token->[0] eq 'PI') { |
if ( $token->[1] =~ /^$tag$/i) { |
$result.=$token->[2]; |
$pars->unget_token($token); last; |
} elsif ($token->[0] eq 'S') { |
} else { |
if ( $token->[1] =~ /^$tag$/i) { |
$result.=$token->[4]; |
$$pars[-1]->unget_token($token); last; |
} |
} else { |
} elsif ($token->[0] eq 'E') { |
$result.=$token->[4]; |
$result.=$token->[2]; |
} |
|
} elsif ($token->[0] eq 'E') { |
|
$result.=$token->[2]; |
|
} |
|
} |
|
if (($#$pars > 0) ) { |
|
pop(@$pars); |
|
pop(@Apache::lonxml::pwd); |
|
} else { last; } |
} |
} |
} |
|
} |
} |
# &Apache::lonxml::debug("Exit:$result:"); |
if ($result =~ m|<LONCAPA_INTERNAL_TURN_STYLE_ON />|) { |
|
$Apache::lonxml::usestyle=1; |
|
} |
|
#&Apache::lonxml::debug("Exit:$result:"); |
return $result |
return $result |
} |
} |
|
|
Line 1381 sub error {
|
Line 1331 sub error {
|
&Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_)); |
&Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_)); |
#notify course |
#notify course |
if ( $ENV{'request.course.id'} ) { |
if ( $ENV{'request.course.id'} ) { |
my $users=$ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}; |
my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1); |
my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'}); |
my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'}); |
foreach my $user (split /\,/, $users) { |
foreach (keys %users) { |
($user,my $domain) = split /:/, $user; |
my ($user,$domain) = split(/:/, $_); |
&Apache::lonmsg::user_normal_msg($user,$domain, |
&Apache::lonmsg::user_normal_msg($user,$domain, |
"Error [$declutter]",join('<br />',@_)); |
"Error [$declutter]",join('<br />',@_)); |
} |
} |
Line 1404 sub warning {
|
Line 1354 sub warning {
|
} |
} |
|
|
sub get_param { |
sub get_param { |
my ($param,$parstack,$safeeval,$context) = @_; |
my ($param,$parstack,$safeeval,$context,$case_insensitive) = @_; |
if ( ! $context ) { $context = -1; } |
if ( ! $context ) { $context = -1; } |
my $args =''; |
my $args =''; |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( ! $args ) { return undef; } |
if ( ! $args ) { return undef; } |
if ( $args =~ /my \$$param=\"/ ) { |
if ( $case_insensitive ) { |
return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' |
if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) { |
} else { |
return &Apache::run::run("{$args;".'return $'.$param.'}', |
return undef; |
$safeeval); #' |
} |
} else { |
|
return undef; |
|
} |
|
} else { |
|
if ( $args =~ /my \$\Q$param\E=\"/ ) { |
|
return &Apache::run::run("{$args;".'return $'.$param.'}', |
|
$safeeval); #' |
|
} else { |
|
return undef; |
|
} |
|
} |
} |
} |
|
|
sub get_param_var { |
sub get_param_var { |
my ($param,$parstack,$safeeval,$context) = @_; |
my ($param,$parstack,$safeeval,$context,$case_insensitive) = @_; |
if ( ! $context ) { $context = -1; } |
if ( ! $context ) { $context = -1; } |
my $args =''; |
my $args =''; |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $args !~ /my \$$param=\"/ ) { return undef; } |
if ($case_insensitive) { |
|
if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) { |
|
return undef; |
|
} |
|
} elsif ( $args !~ /my \$\Q$param\E=\"/ ) { return undef; } |
my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' |
my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' |
if ($value =~ /^[\$\@\%]/) { |
if ($value =~ /^[\$\@\%]/) { |
return &Apache::run::run("return $value",$safeeval,1); |
return &Apache::run::run("return $value",$safeeval,1); |