--- loncom/xml/lonxml.pm 2001/05/10 19:10:25 1.73 +++ loncom/xml/lonxml.pm 2001/05/28 18:27:46 1.80 @@ -7,14 +7,18 @@ # 2/21,3/13 Guy # 3/29,5/4 Gerd Kortemeyer # 5/10 Scott Harrison +# 5/26 Gerd Kortemeyer +# 5/27 H. K. Ng package Apache::lonxml; use vars -qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate); +qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace); use strict; use HTML::TokeParser; use Safe; use Safe::Hole; +use Math::Trig; +use Math::Cephes qw(j0 j1 jn jv y0 y1 yn yv); use Opcode; sub register { @@ -34,6 +38,9 @@ use Apache::run; use Apache::londefdef; use Apache::scripttag; use Apache::edit; +use Apache::lonnet; +use Apache::File; + #================================================== Main subroutine: xmlparse #debugging control, to turn on debugging modify the correct handler $Apache::lonxml::debug=0; @@ -57,6 +64,11 @@ $metamode = 0; # turns on and of run::evaluate actually derefencing var refs $evaluate = 1; +# data structure for eidt mode, determines what tags can go into what other tags +%insertlist=(); + +#stores the list of active tag namespaces +@namespace=(); sub xmlbegin { my $output=''; @@ -163,8 +175,55 @@ sub xmlparse { my $safehole = new Safe::Hole; $safeeval->permit("entereval"); $safeeval->permit(":base_math"); + $safeeval->permit("sort"); $safeeval->deny(":base_io"); +# $safe->share_from('Math::Trig',['acsc','asin','acos','atan']); $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); + $safehole->wrap(\&Math::Trig::acsc,$safeeval,'&acsc'); + $safehole->wrap(\&Math::Trig::acosec,$safeeval,'&acosec'); + $safehole->wrap(\&Math::Trig::asec,$safeeval,'&asec'); + $safehole->wrap(\&Math::Trig::acot,$safeeval,'&acot'); + $safehole->wrap(\&Math::Trig::acotan,$safeeval,'&acotan'); + $safehole->wrap(\&Math::Trig::acsch,$safeeval,'&acsch'); + $safehole->wrap(\&Math::Trig::acosech,$safeeval,'&acosech'); + $safehole->wrap(\&Math::Trig::asech,$safeeval,'&asech'); + $safehole->wrap(\&Math::Trig::acoth,$safeeval,'&acoth'); + $safehole->wrap(\&Math::Trig::acotanh,$safeeval,'&acotanh'); + $safehole->wrap(\&Math::Trig::asin,$safeeval,'&asin'); + $safehole->wrap(\&Math::Trig::acos,$safeeval,'&acos'); + $safehole->wrap(\&Math::Trig::atan,$safeeval,'&atan'); + $safehole->wrap(\&Math::Trig::asinh,$safeeval,'&asinh'); + $safehole->wrap(\&Math::Trig::acosh,$safeeval,'&acosh'); + $safehole->wrap(\&Math::Trig::atanh,$safeeval,'&atanh'); + $safehole->wrap(\&Math::Trig::atan2,$safeeval,'&atan2'); + $safehole->wrap(\&Math::Trig::csc,$safeeval,'&csc'); + $safehole->wrap(\&Math::Trig::cosec,$safeeval,'&cosec'); + $safehole->wrap(\&Math::Trig::sec,$safeeval,'&sec'); + $safehole->wrap(\&Math::Trig::cot,$safeeval,'&cot'); + $safehole->wrap(\&Math::Trig::cotan,$safeeval,'&cotan'); + $safehole->wrap(\&Math::Trig::csch,$safeeval,'&csch'); + $safehole->wrap(\&Math::Trig::cosech,$safeeval,'&cosech'); + $safehole->wrap(\&Math::Trig::sech,$safeeval,'&sech'); + $safehole->wrap(\&Math::Trig::coth,$safeeval,'&coth'); + $safehole->wrap(\&Math::Trig::cotanh,$safeeval,'&cptanh'); + $safehole->wrap(\&Math::Trig::deg2rad,$safeeval,'°2rad'); + $safehole->wrap(\&Math::Trig::deg2grad,$safeeval,'°2grad'); + $safehole->wrap(\&Math::Trig::grad2deg,$safeeval,'&grad2deg'); + $safehole->wrap(\&Math::Trig::grad2rad,$safeeval,'&grad2rad'); + $safehole->wrap(\&Math::Trig::rad2deg,$safeeval,'&rad2deg'); + $safehole->wrap(\&Math::Trig::rad2grad,$safeeval,'&rad2grad'); + $safehole->wrap(\&Math::Trig::pi,$safeeval,'&pi'); + $safehole->wrap(\&Math::Cephes::erf,$safeeval,'&erf'); + $safehole->wrap(\&Math::Cephes::erfc,$safeeval,'&erfc'); + $safehole->wrap(\&Math::Cephes::j0,$safeeval,'&j0'); + $safehole->wrap(\&Math::Cephes::j1,$safeeval,'&j1'); + $safehole->wrap(\&Math::Cephes::jn,$safeeval,'&jn'); + $safehole->wrap(\&Math::Cephes::jv,$safeeval,'&jv'); + $safehole->wrap(\&Math::Cephes::y0,$safeeval,'&y0'); + $safehole->wrap(\&Math::Cephes::y1,$safeeval,'&y1'); + $safehole->wrap(\&Math::Cephes::yn,$safeeval,'&yn'); + $safehole->wrap(\&Math::Cephes::yv,$safeeval,'&yv'); + #need to inspect this class of ops # $safeeval->deny(":base_orig"); $safeinit .= ';$external::target='.$target.';'; @@ -365,14 +424,16 @@ sub callsub { &Apache::lonxml::debug("nodefalt:$nodefault:"); if ($currentstring eq '' && $nodefault eq '') { if ($target eq 'edit') { + &Apache::lonxml::debug("doing default edit for $token->[1]"); if ($token->[0] eq 'S') { - $currentstring = &Apache::edit::tag_start($token,$target); + $currentstring = &Apache::edit::tag_start($target,$token); } elsif ($token->[0] eq 'E') { - $currentstring = &Apache::edit::tag_end($token,$target); + $currentstring = &Apache::edit::tag_end($target,$token); } } elsif ($target eq 'modified') { if ($token->[0] eq 'S') { $currentstring = $token->[4]; + $currentstring.=&Apache::edit::handle_insert(); } else { $currentstring = $token->[2]; } @@ -562,6 +623,47 @@ ENDSCRIPT return $result; } +sub storefile { + my ($file,$contents)=@_; + if (my $fh=Apache::File->new('>'.$file)) { + print $fh $contents; + $fh->close(); + } +} + +sub inserteditinfo { + my ($result,$filecontents)=@_; + unless ($filecontents) { + $filecontents=(< + + + Title of Document Goes Here + + + + + Body of Document Goes Here + + + +SIMPLECONTENT + } + my $editheader='Edit below
'; + my $editfooter=(< + +
+ +
+ +
+ENDFOOTER + $result=~s/(\]*\>)/$1$editheader/is; + $result=~s/(\<\/body\>)/$editfooter/is; + return $result; +} + sub handler { my $request=shift; @@ -575,30 +677,46 @@ sub handler { $request->content_type('text/html'); } -# $request->print(< -# -#Just test -# -# -#ENDHEADER -# &Apache::lonhomework::send_header($request); $request->send_http_header; return OK if $request->header_only; my $file=&Apache::lonnet::filelocation("",$request->uri); +# +# Edit action? Save file. +# + unless ($ENV{'request.state'} eq 'published') { + if ($ENV{'form.savethisfile'}) { + &storefile($file,$ENV{'form.filecont'}); + } + } my %mystyle; my $result = ''; my $filecontents=&Apache::lonnet::getfile($file); if ($filecontents == -1) { - &Apache::lonxml::error(" Unable to find $file"); + $result=(< + +File not found + + +File not found: $file + + +ENDNOTFOUND $filecontents=''; } else { $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle); } +# +# Edit action? Insert editing commands +# + unless ($ENV{'request.state'} eq 'published') { + $result=&inserteditinfo($result,$filecontents); + } + $request->print($result); writeallows($request->uri); @@ -612,7 +730,7 @@ sub debug { } sub error { - if ($Apache::lonxml::debug eq 1) { + if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { print "ERROR:".$_[0]."
\n"; } else { print "An Error occured while processing this resource. The instructor has been notified.
"; @@ -626,10 +744,10 @@ sub error { &Apache::lonmsg::user_normal_msg($user,$domain,"Error in $ENV{'request.filename'}",$_[0]); } } - + #FIXME probably shouldn't have me get everything forever. &Apache::lonmsg::user_normal_msg('albertel','msu',"Error in $ENV{'request.filename'}",$_[0]); - #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]); + #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]); } } @@ -639,6 +757,38 @@ sub warning { } } +sub register_insert { + my @data = split /\n/, &Apache::lonnet::getfile('/home/httpd/lonTabs/insertlist.tab'); + my $i; + my $tagnum=0; + my @order; + for ($i=0;$i < $#data; $i++) { + my $line = $data[$i]; + if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; } + if ( $line =~ /TABLE/ ) { last; } + my ($tag,$descrip,$function,$show) = split(/,/, $line); + $insertlist{"$tagnum.tag"} = $tag; + $insertlist{"$tagnum.description"} = $descrip; + $insertlist{"$tagnum.function"} = $function; + $insertlist{"$tagnum.show"}= $show; + $tagnum++; + } + $i++; #skipping TABLE line + $tagnum = 0; + for (;$i < $#data;$i++) { + my $line = $data[$i]; + my ($mnemonic,@which) = split(/ +/,$line); + my $tag = $insertlist{"$tagnum.tag"}; + for (my $j=0;$j <$#which;$j++) { + if ( $which[$j] eq 'Y' ) { + if ($insertlist{"$j.show"} ne 'no') { + push(@{ $insertlist{"$tag.which"} },$j); + } + } + } + $tagnum++; + } +} 1; __END__