--- loncom/xml/lonxml.pm 2001/08/06 19:44:54 1.105 +++ loncom/xml/lonxml.pm 2001/08/11 20:16:10 1.111 @@ -13,12 +13,14 @@ # 6/12,6/13 H. K. Ng # 6/16 Gerd Kortemeyer # 7/27 H. K. Ng +# 8/7,8/9,8/10,8/11 Gerd Kortemeyer package Apache::lonxml; use vars qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace); use strict; use HTML::TokeParser; +use HTML::TreeBuilder; use Safe; use Safe::Hole; use Math::Cephes qw(:trigs :hypers :bessels erf erfc); @@ -95,6 +97,12 @@ sub xmlbegin { sub xmlend { my $discussion=''; if ($ENV{'request.course.id'}) { + my $crs='/'.$ENV{'request.course.id'}; + if ($ENV{'request.course.sec'}) { + $crs.='_'.$ENV{'request.course.sec'}; + } + $crs=~s/\_/\//g; + my $seeid=&Apache::lonnet::allowed('rin',$crs); my $symb=&Apache::lonnet::symbread(); if ($symb) { my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'}, @@ -105,13 +113,37 @@ sub xmlend { '
'.$contrib{$idx.':sendername'}.' at '.
- $contrib{$idx.':senderdomain'}.' ('.
+ my $hidden=($contrib{'hidden'}=~/\.$idx\./);
+ unless (($hidden) && (!$seeid)) {
+ my $message=$contrib{$idx.':message'};
+ $message=~s/\n/\
/g;
+ if ($message) {
+ if ($hidden) {
+ $message=''.$message.'';
+ }
+ my $sender='Anonymous';
+ if ((!$contrib{$idx.':anonymous'}) || ($seeid)) {
+ $sender=$contrib{$idx.':sendername'}.' at '.
+ $contrib{$idx.':senderdomain'};
+ if ($contrib{$idx.':anonymous'}) {
+ $sender.=' (anonymous)';
+ }
+ if ($seeid) {
+ if ($hidden) {
+ $sender.=' Make Visible';
+ } else {
+ $sender.=' Hide';
+ }
+ }
+ }
+ $discussion.='
'.$sender.' ('. localtime($contrib{$idx.':timestamp'}). '):
'.$message. - ''; + ''; + } + } } $discussion.=''; } @@ -170,6 +202,8 @@ ENDPARM menu.currentStale=0; menu.clearbut(3,1); menu.switchbutton + (6,3,'catalog.gif','catalog','info','catalog_info()'); + menu.switchbutton (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)'); menu.switchbutton (8,2,'fdbk.gif','feedback','on this','gopost("/adm/feedback",currentURL)'); @@ -198,7 +232,7 @@ ENDPARM menu.clearbut(7,3); menu.menucltim=menu.setTimeout( 'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+ - 'clearbut(9,1);clearbut(9,2);clearbut(9,3);', + 'clearbut(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3)', 2000); } @@ -281,6 +315,27 @@ sub xmlparse { return $finaloutput; } +sub htmlclean { + my ($raw,$full)=@_; + + my $tree = HTML::TreeBuilder->new; + $tree->ignore_unknown(0); + + $tree->parse($raw); + + my $output= $tree->as_HTML(undef,' '); + + $output=~s/\<(br|hr|img|meta|allow)([^\>\/]*)\>/\<$1$2 \/\>/gis; + $output=~s/\<\/(br|hr|img|meta|allow)\>//gis; + unless ($full) { + $output=~s/\<[\/]*(body|head|html)\>//gis; + } + + $tree = $tree->delete; + + return $output; +} + sub inner_xmlparse { my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_; &Apache::lonxml::debug('Reentrant parser starting, again?'); @@ -722,6 +777,9 @@ sub parstring { sub writeallows { my $thisurl='/res/'.&Apache::lonnet::declutter(shift); + if ($ENV{'httpref.'.$thisurl}) { + $thisurl=$ENV{'httpref.'.$thisurl}; + } my $thisdir=$thisurl; $thisdir=~s/\/[^\/]+$//; my %httpref=(); @@ -809,7 +867,9 @@ SIMPLECONTENT ENDFOOTER $result=~s/(\]*\>)/$1$editheader/is; @@ -840,7 +900,7 @@ sub handler { # Edit action? Save file. # unless ($ENV{'request.state'} eq 'published') { - if ($ENV{'form.savethisfile'}) { + if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) { &storefile($file,$ENV{'form.filecont'}); } } @@ -860,6 +920,11 @@ sub handler { ENDNOTFOUND $filecontents=''; } else { + unless ($ENV{'request.state'} eq 'published') { + if ($ENV{'form.attemptclean'}) { + $filecontents=&htmlclean($filecontents,1); + } + } $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle); }