--- loncom/xml/lonxml.pm 2002/03/21 22:10:31 1.160 +++ loncom/xml/lonxml.pm 2002/05/21 02:26:53 1.171 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.160 2002/03/21 22:10:31 www Exp $ +# $Id: lonxml.pm,v 1.171 2002/05/21 02:26:53 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -60,16 +60,16 @@ package Apache::lonxml; use vars -qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace); +qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $prevent_entity_encode); use strict; -use HTML::TokeParser; -use HTML::TreeBuilder; -use HTML::Entities; -use Safe; -use Safe::Hole; -use Math::Cephes qw(:trigs :hypers :bessels erf erfc); -use Math::Random qw(:all); -use Opcode; +use HTML::LCParser(); +use HTML::TreeBuilder(); +use HTML::Entities(); +use Safe(); +use Safe::Hole(); +use Math::Cephes(); +use Math::Random(); +use Opcode(); sub register { my ($space,@taglist) = @_; @@ -90,15 +90,15 @@ sub deregister { } use Apache::Constants qw(:common); -use Apache::lontexconvert; -use Apache::style; -use Apache::run; -use Apache::londefdef; -use Apache::scripttag; -use Apache::edit; -use Apache::lonnet; -use Apache::File; -use Apache::loncommon; +use Apache::lontexconvert(); +use Apache::style(); +use Apache::run(); +use Apache::londefdef(); +use Apache::scripttag(); +use Apache::edit(); +use Apache::lonnet(); +use Apache::File(); +use Apache::loncommon(); #================================================== Main subroutine: xmlparse #debugging control, to turn on debugging modify the correct handler @@ -129,6 +129,9 @@ $evaluate = 1; # stores the list of active tag namespaces @namespace=(); +# if 0 all high ASCII characters will be encoded into HTML Entities +$prevent_entity_encode=0; + # has the dynamic menu been updated to know about this resource $Apache::lonxml::registered=0; @@ -176,10 +179,12 @@ sub xmlend { } my $sender='Anonymous'; if ((!$contrib{$idx.':anonymous'}) || ($seeid)) { - $sender=$contrib{$idx.':sendername'}.' at '. - $contrib{$idx.':senderdomain'}; + $sender=$contrib{$idx.':plainname'}.' ('. + $contrib{$idx.':sendername'}.' at '. + $contrib{$idx.':senderdomain'}.')'; if ($contrib{$idx.':anonymous'}) { - $sender.=' (anonymous)'; + $sender.=' [anonymous] '. + $contrib{$idx.':screenname'}; } if ($seeid) { if ($hidden) { @@ -190,6 +195,10 @@ sub xmlend { $symb.':::'.$idx.'">Hide'; } } + } else { + if ($contrib{$idx.':screenname'}) { + $sender=''.$contrib{$idx.':screenname'}.''; + } } $discussion.='

'.$sender.' ('. localtime($contrib{$idx.':timestamp'}). @@ -330,26 +339,20 @@ sub registerurl { if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; } if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { my $hwkadd=''; - if ($ENV{'REQUEST_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { + if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { $hwkadd.=(< + menu.currentURL=null; var editbrowser; - function openbrowser(formname,elementname) { + function openbrowser(formname,elementname,only,omit) { var url = '/res/?'; if (editbrowser == null) { url += 'launch=1&'; @@ -451,6 +459,12 @@ ENDDONOTREGTHIS url += 'catalogmode=interactive&'; url += 'mode=edit&'; url += 'form=' + formname + '&'; + if (only != null) { + url += 'only=' + only + '&'; + } + if (omit != null) { + url += 'omit=' + omit + '&'; + } url += 'element=' + elementname + ''; var title = 'Browser'; var options = 'scrollbars=1,resizable=1,menubar=0'; @@ -535,7 +549,7 @@ sub htmlclean { my $output= $tree->as_HTML(undef,' '); - $output=~s/\<(br|hr|img|meta|allow)([^\>\/]*)\>/\<$1$2 \/\>/gis; + $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; @@ -613,18 +627,22 @@ sub inner_xmlparse { #evaluate variable refs in result if ($result ne "") { if ( $#$parstack > -1 ) { - if ($Apache::lonxml::redirection) { - $Apache::lonxml::outputstack['-1'] .= - &Apache::run::evaluate($result,$safeeval,$$parstack['-1']); - } else { - $finaloutput .= &Apache::run::evaluate($result,$safeeval, - $$parstack['-1']); - } + $result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]); } else { - $finaloutput .= &Apache::run::evaluate($result,$safeeval,''); + $result= &Apache::run::evaluate($result,$safeeval,''); } - $result = ''; - } + } + # Encode any high ASCII characters + if (!$Apache::lonxml::prevent_entity_encode) { + $result=&HTML::Entities::encode($result,"\200-\377"); + } + if ($Apache::lonxml::redirection) { + $Apache::lonxml::outputstack['-1'] .= $result; + } else { + $finaloutput.=$result; + } + $result = ''; + if ($token->[0] eq 'E') { &end_tag($stack,$parstack,$token); } @@ -637,6 +655,7 @@ sub inner_xmlparse { # $finaloutput.=&endredirection; # } + if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { $finaloutput=&afterburn($finaloutput); } @@ -808,6 +827,11 @@ sub setup_globals { $Apache::lonxml::metamode = 0; $Apache::lonxml::evaluate = 0; $Apache::lonxml::import = 0; + } elsif ($target eq 'analyze') { + $Apache::lonxml::redirection = 0; + $Apache::lonxml::metamode = 0; + $Apache::lonxml::evaluate = 1; + $Apache::lonxml::import = 1; } else { $Apache::lonxml::redirection = 0; $Apache::lonxml::metamode = 0; @@ -981,7 +1005,7 @@ sub get_all_text { sub newparser { my ($parser,$contentref,$dir) = @_; - push (@$parser,HTML::TokeParser->new($contentref)); + push (@$parser,HTML::LCParser->new($contentref)); $$parser['-1']->xml_mode('1'); if ( $dir eq '' ) { push (@Apache::lonxml::pwd, $Apache::lonxml::pwd[$#Apache::lonxml::pwd]); @@ -1093,17 +1117,21 @@ sub inserteditinfo { my ($result,$filecontents)=@_; $filecontents = &HTML::Entities::encode($filecontents); # my $editheader='Edit below


'; + my $buttons=(< + + +BUTTONS my $editfooter=(<
+ +$buttons
+
$buttons
- - - -
ENDFOOTER # $result=~s/(\]*\>)/$1$editheader/is; @@ -1182,7 +1210,7 @@ ENDNOTFOUND $filecontents=''; if ($ENV{'request.state'} ne 'published') { $filecontents=&createnewhtml(); - $ENV{'form.showmode'}='Edit'; #force edit mode + $ENV{'form.editmode'}='Edit'; #force edit mode } } else { unless ($ENV{'request.state'} eq 'published') { @@ -1190,7 +1218,7 @@ ENDNOTFOUND $filecontents=&htmlclean($filecontents,1); } } - if ($ENV{'form.showmode'} ne 'Edit') { + if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) { $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle); } } @@ -1199,7 +1227,7 @@ ENDNOTFOUND # Edit action? Insert editing commands # unless ($ENV{'request.state'} eq 'published') { - if ($ENV{'form.showmode'} eq 'Edit') { + if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) { $result=''; $result=&inserteditinfo($result,$filecontents); } @@ -1221,7 +1249,8 @@ sub debug { sub error { if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { - print "ERROR:".join('
',@_)."
\n"; + # If printing in construction space, put the error inside

+    print "ERROR:".join("\n",@_)."\n";
   } else {
     print "An Error occured while processing this resource. The instructor has been notified. 
"; #notify author