--- loncom/xml/lonxml.pm 2001/07/27 18:16:22 1.104 +++ loncom/xml/lonxml.pm 2001/08/10 16:22:23 1.110 @@ -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 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 { '

Course Discussion of Resource

'; my $idx; for ($idx=1;$idx<=$contrib{'version'};$idx++) { - my $message=$contrib{$idx.':message'}; - $message=~s/\n/\
/g; - $discussion.='

'.$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.='
'; } @@ -132,6 +164,7 @@ sub fontsettings() { sub registerurl { my $forcereg=shift; if ($Apache::lonxml::registered) { return ''; } + $Apache::lonxml::registered=1; if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { my $hwkadd=''; if ($ENV{'REQUEST_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { @@ -169,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)'); @@ -197,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); } @@ -280,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)([^\>\/]*)\>/\<$1$2 \/\>/gis; + $output=~s/\<\/(br|hr|img)\>//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?'); @@ -808,7 +864,9 @@ SIMPLECONTENT

- + +
ENDFOOTER $result=~s/(\]*\>)/$1$editheader/is; @@ -839,7 +897,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'}); } } @@ -859,6 +917,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); }