--- loncom/xml/lonxml.pm 2001/05/13 21:40:32 1.75 +++ loncom/xml/lonxml.pm 2001/05/26 17:27:28 1.79 @@ -7,10 +7,11 @@ # 2/21,3/13 Guy # 3/29,5/4 Gerd Kortemeyer # 5/10 Scott Harrison +# 5/26 Gerd Kortemeyer package Apache::lonxml; use vars -qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist); +qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace); use strict; use HTML::TokeParser; use Safe; @@ -34,6 +35,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; @@ -60,6 +64,9 @@ $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=''; if ($ENV{'browser.mathml'}) { @@ -165,6 +172,7 @@ sub xmlparse { my $safehole = new Safe::Hole; $safeeval->permit("entereval"); $safeeval->permit(":base_math"); + $safeeval->permit("sort"); $safeeval->deny(":base_io"); $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); #need to inspect this class of ops @@ -376,6 +384,7 @@ sub callsub { } elsif ($target eq 'modified') { if ($token->[0] eq 'S') { $currentstring = $token->[4]; + $currentstring.=&Apache::edit::handle_insert(); } else { $currentstring = $token->[2]; } @@ -565,6 +574,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; @@ -578,30 +628,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); @@ -642,54 +708,36 @@ sub warning { } } -#Should allow multiple definitions of the same tag name -sub register_insert2 { - my @data = split /\n/, &Apache::lonnet::getfile('/home/httpd/lonTabs/insertlist.tab'); - my $i; - 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); - if ($show eq 'no') { next; } - $insertlist{"$i.tag"} = $tag; - $insertlist{"$i.description"} = $descrip; - $insertlist{"$i.function"} = $function; - } - for (;$i < $#data;$i++) { - my $line = $data[$i]; - my ($tag,@which) = split(/ +/,$line); - for (my $j=0;$j <$#which;$j++) { - if ( $which[$j] eq 'Y' ) { - push(@{ $insertlist{"$tag.which"} },$j); - } - } - } -} - 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); - if ($show eq 'no') { next; } - $insertlist{"$tag.description"} = $descrip; - $insertlist{"$tag.function"} = $function; - push (@order,$tag); + $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 ($tag,@which) = split(/ +/,$line); + my ($mnemonic,@which) = split(/ +/,$line); + my $tag = $insertlist{"$tagnum.tag"}; for (my $j=0;$j <$#which;$j++) { if ( $which[$j] eq 'Y' ) { - push(@{ $insertlist{"$tag.which"} },$order[$j]); + if ($insertlist{"$j.show"} ne 'no') { + push(@{ $insertlist{"$tag.which"} },$j); + } } } + $tagnum++; } } 1;