--- loncom/xml/lonxml.pm 2003/08/06 14:30:01 1.268 +++ loncom/xml/lonxml.pm 2003/08/21 15:51:41 1.273 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.268 2003/08/06 14:30:01 bowersj2 Exp $ +# $Id: lonxml.pm,v 1.273 2003/08/21 15:51:41 sakharuk Exp $ # # Copyright Michigan State University Board of Trustees # @@ -69,6 +69,7 @@ use Safe::Hole(); use Math::Cephes(); use Math::Random(); use Opcode(); +use POSIX qw(strftime); sub register { @@ -477,24 +478,25 @@ sub htmlclean { } sub latex_special_symbols { - my ($current_token,$stack,$parstack,$where)=@_; + my ($string,$where)=@_; if ($where eq 'header') { - $current_token =~ s/(\\|_|\^)/ /g; - $current_token =~ s/(\$|%|\#|&|\{|\})/\\$1/g; + $string =~ s/(\\|_|\^)/ /g; + $string =~ s/(\$|%|\#|&|\{|\})/\\$1/g; + $string =~ s/_/ /g; } else { - $current_token=~s/\\ /\\char92 /g; - $current_token=~s/\^/\\char94 /g; - $current_token=~s/\~/\\char126 /g; - $current_token=~s/(&[^A-Za-z\#])/\\$1/g; - $current_token=~s/([^&])\#/$1\\#/g; - $current_token=~s/(\$|_|{|})/\\$1/g; - $current_token=~s/\\char92 /\\texttt{\\char92}/g; - $current_token=~s/(>|<)/\$$1\$/g; #more or less - if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit - if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space - if ($current_token eq '%.') {$current_token = '\%.';} #persent at the end of statement + $string=~s/\\ /\\char92 /g; + $string=~s/\^/\\char94 /g; + $string=~s/\~/\\char126 /g; + $string=~s/(&[^A-Za-z\#])/\\$1/g; + $string=~s/([^&])\#/$1\\#/g; + $string=~s/(\$|_|{|})/\\$1/g; + $string=~s/\\char92 /\\texttt{\\char92}/g; + $string=~s/(>|<)/\$$1\$/g; #more or less + if ($string=~m/\d%/) {$string =~ s/(\d)%/$1\\%/g;} #percent after digit + if ($string=~m/\s%/) {$string =~ s/(\s)%/$1\\%/g;} #percent after space + if ($string eq '%.') {$string = '\%.';} #percent at the end of statement } - return $current_token; + return $string; } sub inner_xmlparse { @@ -584,7 +586,7 @@ sub inner_xmlparse { if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) { #Style file definitions should be correct if ($target eq 'tex' && ($Apache::lonxml::usestyle)) { - $result=&latex_special_symbols($result,$stack,$parstack); + $result=&latex_special_symbols($result); } } @@ -952,83 +954,105 @@ sub store_counter { } sub get_all_text { - my($tag,$pars)= @_; - &Apache::lonxml::debug("Got a ".ref($pars)); - my $gotfullstack=1; - if (ref($pars) ne 'ARRAY') { - $gotfullstack=0; - $pars=[$pars]; - } - my $depth=0; - my $token; - my $result=''; - if ( $tag =~ m:^/: ) { - my $tag=substr($tag,1); - #&Apache::lonxml::debug("have:$tag:"); - my $top_empty=0; - while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) { - while (($depth >=0) && ($token = $$pars[-1]->get_token)) { - #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd); - if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { - $result.=$token->[1]; - } elsif ($token->[0] eq 'PI') { - $result.=$token->[2]; - } elsif ($token->[0] eq 'S') { - if ($token->[1] =~ /^$tag$/i) { $depth++; } - $result.=$token->[4]; - } elsif ($token->[0] eq 'E') { - if ( $token->[1] =~ /^$tag$/i) { $depth--; } - #skip sending back the last end tag - if ($depth > -1) { $result.=$token->[2]; } else { - $$pars[-1]->unget_token($token); - } - } - } - if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; } - if (($depth >=0) && ($#$pars > 0) ) { - pop(@$pars); - pop(@Apache::lonxml::pwd); - } - } - if ($top_empty && $depth >= 0) { - #never found the end tag ran out of text, throw error send back blank - &error('Never found end tag for <'.$tag.'>'); - if ($gotfullstack) { - my $newstring=''.$result; - &Apache::lonxml::newparser($pars,\$newstring); - } - $result=''; - } - } else { - while ($#$pars > -1) { - while ($token = $$pars[-1]->get_token) { - #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); - if (($token->[0] eq 'T')||($token->[0] eq 'C')|| - ($token->[0] eq 'D')) { - $result.=$token->[1]; - } elsif ($token->[0] eq 'PI') { - $result.=$token->[2]; - } elsif ($token->[0] eq 'S') { - if ( $token->[1] =~ /^$tag$/i) { - $$pars[-1]->unget_token($token); last; - } else { - $result.=$token->[4]; - } - } elsif ($token->[0] eq 'E') { - $result.=$token->[2]; - } - } - if (($#$pars > 0) ) { - pop(@$pars); - pop(@Apache::lonxml::pwd); - } else { last; } - } - } - if ($result =~ m||) { - $Apache::lonxml::usestyle=1; - } - #&Apache::lonxml::debug("Exit:$result:"); - return $result + my($tag,$pars,$style)= @_; + &Apache::lonxml::debug("Got a ".ref($pars)); + my $gotfullstack=1; + if (ref($pars) ne 'ARRAY') { + $gotfullstack=0; + $pars=[$pars]; + } + &Apache::lonxml::debug("Got a ".ref($style)); + if (ref($style) ne 'HASH') { + $style={}; + } else { + &Apache::lonhomework::showhash(%$style); + } + my $depth=0; + my $token; + my $result=''; + if ( $tag =~ m:^/: ) { + my $tag=substr($tag,1); + #&Apache::lonxml::debug("have:$tag:"); + my $top_empty=0; + while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) { + while (($depth >=0) && ($token = $$pars[-1]->get_token)) { + #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd); + if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { + $result.=$token->[1]; + } elsif ($token->[0] eq 'PI') { + $result.=$token->[2]; + } elsif ($token->[0] eq 'S') { + if ($token->[1] =~ /^$tag$/i) { $depth++; } + if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; } + if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; } + $result.=$token->[4]; + } elsif ($token->[0] eq 'E') { + if ( $token->[1] =~ /^$tag$/i) { $depth--; } + #skip sending back the last end tag + if ($depth == 0 && exists($$style{'/'.$token->[1]})) { + my $string= + ''. + $$style{'/'.$token->[1]}. + $token->[2]. + ''; + &Apache::lonxml::newparser($pars,\$string); + #&Apache::lonxml::debug("reParsing $string"); + next; + } + if ($depth > -1) { + $result.=$token->[2]; + } else { + $$pars[-1]->unget_token($token); + } + } + } + if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; } + if (($depth >=0) && ($#$pars > 0) ) { + pop(@$pars); + pop(@Apache::lonxml::pwd); + } + } + if ($top_empty && $depth >= 0) { + #never found the end tag ran out of text, throw error send back blank + &error('Never found end tag for <'.$tag. + '> current string
'.
+		   &HTML::Entities::encode($result).
+		   '
'); + if ($gotfullstack) { + my $newstring=''.$result; + &Apache::lonxml::newparser($pars,\$newstring); + } + $result=''; + } + } else { + while ($#$pars > -1) { + while ($token = $$pars[-1]->get_token) { + #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); + if (($token->[0] eq 'T')||($token->[0] eq 'C')|| + ($token->[0] eq 'D')) { + $result.=$token->[1]; + } elsif ($token->[0] eq 'PI') { + $result.=$token->[2]; + } elsif ($token->[0] eq 'S') { + if ( $token->[1] =~ /^$tag$/i) { + $$pars[-1]->unget_token($token); last; + } else { + $result.=$token->[4]; + } + if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; } + if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; } + } elsif ($token->[0] eq 'E') { + $result.=$token->[2]; + } + } + if (($#$pars > 0) ) { + pop(@$pars); + pop(@Apache::lonxml::pwd); + } else { last; } + } + } + #&Apache::lonxml::debug("Exit:$result:"); + return $result } sub newparser { @@ -1115,8 +1139,10 @@ sub storefile { if (my $fh=Apache::File->new('>'.$file)) { print $fh $contents; $fh->close(); + return 1; } else { - &warning("Unable to save file $file"); + &warning("Unable to save file $file"); + return 0; } } @@ -1220,7 +1246,9 @@ sub handler { # unless ($ENV{'request.state'} eq 'published') { if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) { - &storefile($file,$ENV{'form.filecont'}); + if (&storefile($file,$ENV{'form.filecont'})) { + $request->print("Updated: ". strftime("%d %b %H:%M:%S",localtime())." "); + } } } my %mystyle; @@ -1460,7 +1488,7 @@ sub whichuser { my ($symb,$courseid,$domain,$name,$publicuser); if (defined($ENV{'form.grade_symb'})) { my $tmp_courseid=$ENV{'form.grade_courseid'}; - my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid); + my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid); if ($allowed) { $symb=$ENV{'form.grade_symb'}; $courseid=$ENV{'form.grade_courseid'};