version 1.160, 2002/03/21 22:10:31
|
version 1.181, 2002/07/15 19:45:18
|
Line 60
|
Line 60
|
|
|
package Apache::lonxml; |
package Apache::lonxml; |
use vars |
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 strict; |
use HTML::TokeParser; |
use HTML::LCParser(); |
use HTML::TreeBuilder; |
use HTML::TreeBuilder(); |
use HTML::Entities; |
use HTML::Entities(); |
use Safe; |
use Safe(); |
use Safe::Hole; |
use Safe::Hole(); |
use Math::Cephes qw(:trigs :hypers :bessels erf erfc); |
use Math::Cephes(); |
use Math::Random qw(:all); |
use Math::Random(); |
use Opcode; |
use Opcode(); |
|
|
sub register { |
sub register { |
my ($space,@taglist) = @_; |
my ($space,@taglist) = @_; |
Line 90 sub deregister {
|
Line 90 sub deregister {
|
} |
} |
|
|
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
use Apache::lontexconvert; |
use Apache::lontexconvert(); |
use Apache::style; |
use Apache::style(); |
use Apache::run; |
use Apache::run(); |
use Apache::londefdef; |
use Apache::londefdef(); |
use Apache::scripttag; |
use Apache::scripttag(); |
use Apache::edit; |
use Apache::edit(); |
use Apache::lonnet; |
use Apache::lonnet(); |
use Apache::File; |
use Apache::File(); |
use Apache::loncommon; |
use Apache::loncommon(); |
|
|
#================================================== Main subroutine: xmlparse |
#================================================== Main subroutine: xmlparse |
#debugging control, to turn on debugging modify the correct handler |
#debugging control, to turn on debugging modify the correct handler |
Line 129 $evaluate = 1;
|
Line 129 $evaluate = 1;
|
# stores the list of active tag namespaces |
# stores the list of active tag namespaces |
@namespace=(); |
@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 |
# has the dynamic menu been updated to know about this resource |
$Apache::lonxml::registered=0; |
$Apache::lonxml::registered=0; |
|
|
|
# a pointer the the Apache request object |
|
$Apache::lonxml::request=''; |
|
|
sub xmlbegin { |
sub xmlbegin { |
my $output=''; |
my $output=''; |
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
Line 176 sub xmlend {
|
Line 182 sub xmlend {
|
} |
} |
my $sender='Anonymous'; |
my $sender='Anonymous'; |
if ((!$contrib{$idx.':anonymous'}) || ($seeid)) { |
if ((!$contrib{$idx.':anonymous'}) || ($seeid)) { |
$sender=$contrib{$idx.':sendername'}.' at '. |
$sender=$contrib{$idx.':plainname'}.' ('. |
$contrib{$idx.':senderdomain'}; |
$contrib{$idx.':sendername'}.' at '. |
|
$contrib{$idx.':senderdomain'}.')'; |
if ($contrib{$idx.':anonymous'}) { |
if ($contrib{$idx.':anonymous'}) { |
$sender.=' (anonymous)'; |
$sender.=' [anonymous] '. |
|
$contrib{$idx.':screenname'}; |
} |
} |
if ($seeid) { |
if ($seeid) { |
if ($hidden) { |
if ($hidden) { |
Line 190 sub xmlend {
|
Line 198 sub xmlend {
|
$symb.':::'.$idx.'">Hide</a>'; |
$symb.':::'.$idx.'">Hide</a>'; |
} |
} |
} |
} |
|
} else { |
|
if ($contrib{$idx.':screenname'}) { |
|
$sender='<i>'.$contrib{$idx.':screenname'}.'</i>'; |
|
} |
} |
} |
$discussion.='<p><b>'.$sender.'</b> ('. |
$discussion.='<p><b>'.$sender.'</b> ('. |
localtime($contrib{$idx.':timestamp'}). |
localtime($contrib{$idx.':timestamp'}). |
Line 319 sub registerurl {
|
Line 331 sub registerurl {
|
my $forcereg=shift; |
my $forcereg=shift; |
my $target = shift; |
my $target = shift; |
my $result = ''; |
my $result = ''; |
if (($ENV{'request.publicaccess'}) || |
if ($target eq 'edit') { |
($ENV{'REQUEST_URI'} eq '/res/adm/pages/menu.html')) { |
$result .="<script>\n menu.currentURL=null;\n". |
return |
&Apache::loncommon::browser_and_searcher_javascript(). |
|
"\n</script>\n"; |
|
} |
|
if ((($ENV{'request.publicaccess'}) || |
|
(!&Apache::lonnet::is_on_map($ENV{'REQUEST_URI'}))) && |
|
(!$forcereg)) { |
|
return $result. |
'<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>'; |
'<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>'; |
} |
} |
if ($Apache::lonxml::registered && !$forcereg) { return ''; } |
if ($Apache::lonxml::registered && !$forcereg) { return ''; } |
$Apache::lonxml::registered=1; |
$Apache::lonxml::registered=1; |
my $nothing=''; |
my $nothing=''; |
if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; } |
if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; } |
|
my $timesync='menu.syncclock(1000*'.time.');'; |
if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { |
if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { |
my $hwkadd=''; |
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'})) { |
if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { |
$hwkadd.=(<<ENDSUBM); |
$hwkadd.=(<<ENDSUBM); |
menu.switchbutton |
menu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")'); |
(7,1,'subm.gif','view sub','missions', |
|
'gocmd("/adm/grades","submission")'); |
|
ENDSUBM |
ENDSUBM |
} |
} |
if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) { |
if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) { |
$hwkadd.=(<<ENDGRDS); |
$hwkadd.=(<<ENDGRDS); |
menu.switchbutton |
menu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")'); |
(7,2,'pgrd.gif','problem','grades', |
|
'gocmd("/adm/grades","viewgrades")'); |
|
ENDGRDS |
ENDGRDS |
} |
} |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
$hwkadd.=(<<ENDPARM); |
$hwkadd.=(<<ENDPARM); |
menu.switchbutton |
menu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")'); |
(7,3,'pparm.gif','problem','parms', |
|
'gocmd("/adm/parmset","set")'); |
|
ENDPARM |
ENDPARM |
} |
} |
} |
} |
Line 361 ENDPARM
|
Line 374 ENDPARM
|
function LONCAPAreg() { |
function LONCAPAreg() { |
menu=window.open("$nothing","LONCAPAmenu","",false); |
menu=window.open("$nothing","LONCAPAmenu","",false); |
menu.clearTimeout(menu.menucltim); |
menu.clearTimeout(menu.menucltim); |
|
$timesync |
menu.currentURL=window.location.pathname; |
menu.currentURL=window.location.pathname; |
|
menu.reloadURL=window.location.pathname; |
menu.currentStale=0; |
menu.currentStale=0; |
menu.clearbut(3,1); |
menu.clearbut(3,1); |
menu.switchbutton |
menu.switchbutton |
Line 388 ENDPARM
|
Line 403 ENDPARM
|
function LONCAPAstale() { |
function LONCAPAstale() { |
menu=window.open("$nothing","LONCAPAmenu","",false); |
menu=window.open("$nothing","LONCAPAmenu","",false); |
menu.currentStale=1; |
menu.currentStale=1; |
menu.switchbutton |
if (menu.reloadURL!='' && menu.reloadURL!= null) { |
(3,1,'reload.gif','return','location','go(currentURL)'); |
menu.switchbutton |
|
(3,1,'reload.gif','return','location','go(reloadURL)'); |
|
} |
menu.clearbut(7,1); |
menu.clearbut(7,1); |
menu.clearbut(7,2); |
menu.clearbut(7,2); |
menu.clearbut(7,3); |
menu.clearbut(7,3); |
Line 412 ENDREGTHIS
|
Line 429 ENDREGTHIS
|
|
|
function LONCAPAreg() { |
function LONCAPAreg() { |
menu=window.open("$nothing","LONCAPAmenu","",false); |
menu=window.open("$nothing","LONCAPAmenu","",false); |
|
$timesync |
menu.currentStale=1; |
menu.currentStale=1; |
menu.clearbut(2,1); |
menu.clearbut(2,1); |
menu.clearbut(2,3); |
menu.clearbut(2,3); |
Line 433 ENDREGTHIS
|
Line 451 ENDREGTHIS
|
</script> |
</script> |
ENDDONOTREGTHIS |
ENDDONOTREGTHIS |
} |
} |
if ($target eq 'edit') { |
|
# Javascript routines for construction space: |
|
# openbrowser and opensearcher will start the file browser |
|
# (lonindexer) and searcher (lonsearchcat) respectively. |
|
# Inputs are the name of the html form being used |
|
# and the name of the element the selected URL should |
|
# be placed in. |
|
$result .=<<"ENDBROWSERSCRIPT"; |
|
<script> |
|
var editbrowser; |
|
function openbrowser(formname,elementname) { |
|
var url = '/res/?'; |
|
if (editbrowser == null) { |
|
url += 'launch=1&'; |
|
} |
|
url += 'catalogmode=interactive&'; |
|
url += 'mode=edit&'; |
|
url += 'form=' + formname + '&'; |
|
url += 'element=' + elementname + ''; |
|
var title = 'Browser'; |
|
var options = 'scrollbars=1,resizable=1,menubar=0'; |
|
options += ',width=700,height=600'; |
|
editbrowser = open(url,title,options,'1'); |
|
editbrowser.focus(); |
|
} |
|
var editsearcher; |
|
function opensearcher(formname,elementname) { |
|
var url = '/adm/searchcat?'; |
|
if (editsearcher == null) { |
|
url += 'launch=1&'; |
|
} |
|
url += 'catalogmode=interactive&'; |
|
url += 'mode=edit&'; |
|
url += 'form=' + formname + '&'; |
|
url += 'element=' + elementname + ''; |
|
var title = 'Search'; |
|
var options = 'scrollbars=1,resizable=1,menubar=0'; |
|
options += ',width=700,height=600'; |
|
editsearcher = open(url,title,options,'1'); |
|
editsearcher.focus(); |
|
} |
|
</script> |
|
ENDBROWSERSCRIPT |
|
} |
|
return $result; |
return $result; |
} |
} |
|
|
Line 497 sub printalltags {
|
Line 471 sub printalltags {
|
} |
} |
|
|
sub xmlparse { |
sub xmlparse { |
my ($target,$content_file_string,$safeinit,%style_for_target) = @_; |
my ($request,$target,$content_file_string,$safeinit,%style_for_target) = @_; |
|
|
|
&setup_globals($request,$target); |
|
# |
|
# do we have a course style file? |
|
# |
|
|
|
if ($ENV{'request.course.id'}) { |
|
my $bodytext= |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'}; |
|
if ($bodytext) { |
|
my $location=&Apache::lonnet::filelocation('',$bodytext); |
|
my $styletext=&Apache::lonnet::getfile($location); |
|
if ($styletext ne '-1') { |
|
%style_for_target = (%style_for_target, |
|
&Apache::style::styleparser($target,$styletext)); |
|
} |
|
} |
|
} |
|
|
&setup_globals($target); |
|
#&printalltags(); |
#&printalltags(); |
my @pars = (); |
my @pars = (); |
my $pwd=$ENV{'request.filename'}; |
my $pwd=$ENV{'request.filename'}; |
Line 535 sub htmlclean {
|
Line 526 sub htmlclean {
|
|
|
my $output= $tree->as_HTML(undef,' '); |
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; |
$output=~s/\<\/(br|hr|img|meta|allow)\>//gis; |
unless ($full) { |
unless ($full) { |
$output=~s/\<[\/]*(body|head|html)\>//gis; |
$output=~s/\<[\/]*(body|head|html)\>//gis; |
Line 613 sub inner_xmlparse {
|
Line 604 sub inner_xmlparse {
|
#evaluate variable refs in result |
#evaluate variable refs in result |
if ($result ne "") { |
if ($result ne "") { |
if ( $#$parstack > -1 ) { |
if ( $#$parstack > -1 ) { |
if ($Apache::lonxml::redirection) { |
$result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]); |
$Apache::lonxml::outputstack['-1'] .= |
|
&Apache::run::evaluate($result,$safeeval,$$parstack['-1']); |
|
} else { |
|
$finaloutput .= &Apache::run::evaluate($result,$safeeval, |
|
$$parstack['-1']); |
|
} |
|
} else { |
} 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') { |
if ($token->[0] eq 'E') { |
&end_tag($stack,$parstack,$token); |
&end_tag($stack,$parstack,$token); |
} |
} |
Line 637 sub inner_xmlparse {
|
Line 632 sub inner_xmlparse {
|
# $finaloutput.=&endredirection; |
# $finaloutput.=&endredirection; |
# } |
# } |
|
|
|
|
if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { |
if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { |
$finaloutput=&afterburn($finaloutput); |
$finaloutput=&afterburn($finaloutput); |
} |
} |
Line 779 sub callsub {
|
Line 775 sub callsub {
|
} |
} |
|
|
sub setup_globals { |
sub setup_globals { |
my ($target)=@_; |
my ($request,$target)=@_; |
|
$Apache::lonxml::request=$request; |
$Apache::lonxml::registered = 0; |
$Apache::lonxml::registered = 0; |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::extlinks=(); |
@Apache::lonxml::extlinks=(); |
Line 808 sub setup_globals {
|
Line 805 sub setup_globals {
|
$Apache::lonxml::metamode = 0; |
$Apache::lonxml::metamode = 0; |
$Apache::lonxml::evaluate = 0; |
$Apache::lonxml::evaluate = 0; |
$Apache::lonxml::import = 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 { |
} else { |
$Apache::lonxml::redirection = 0; |
$Apache::lonxml::redirection = 0; |
$Apache::lonxml::metamode = 0; |
$Apache::lonxml::metamode = 0; |
Line 931 sub decreasedepth {
|
Line 933 sub decreasedepth {
|
#print "<br />e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n"; |
#print "<br />e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n"; |
} |
} |
|
|
sub get_all_text { |
sub get_all_text_unbalanced { |
|
my($tag,$pars)= @_; |
|
my $token; |
|
my $result=''; |
|
$tag='<'.$tag.'>'; |
|
while ($token = $$pars[-1]->get_token) { |
|
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
|
$result.=$token->[1]; |
|
} elsif ($token->[0] eq 'PI') { |
|
$result.=$token->[2]; |
|
} elsif ($token->[0] eq 'S') { |
|
$result.=$token->[4]; |
|
} elsif ($token->[0] eq 'E') { |
|
$result.=$token->[2]; |
|
} |
|
if ($result =~ /(.*)$tag(.*)/) { |
|
&Apache::lonxml::debug('Got a winner with leftovers ::'.$2); |
|
&Apache::lonxml::debug('Result is :'.$1); |
|
$result=$1; |
|
my $redo=$tag.$2; |
|
&Apache::lonxml::newparser($pars,\$redo); |
|
last; |
|
} |
|
} |
|
return $result |
|
} |
|
|
|
sub get_all_text { |
my($tag,$pars)= @_; |
my($tag,$pars)= @_; |
my $depth=0; |
my $depth=0; |
my $token; |
my $token; |
Line 981 sub get_all_text {
|
Line 1009 sub get_all_text {
|
|
|
sub newparser { |
sub newparser { |
my ($parser,$contentref,$dir) = @_; |
my ($parser,$contentref,$dir) = @_; |
push (@$parser,HTML::TokeParser->new($contentref)); |
push (@$parser,HTML::LCParser->new($contentref)); |
$$parser['-1']->xml_mode('1'); |
$$parser['-1']->xml_mode('1'); |
if ( $dir eq '' ) { |
if ( $dir eq '' ) { |
push (@Apache::lonxml::pwd, $Apache::lonxml::pwd[$#Apache::lonxml::pwd]); |
push (@Apache::lonxml::pwd, $Apache::lonxml::pwd[$#Apache::lonxml::pwd]); |
Line 1093 sub inserteditinfo {
|
Line 1121 sub inserteditinfo {
|
my ($result,$filecontents)=@_; |
my ($result,$filecontents)=@_; |
$filecontents = &HTML::Entities::encode($filecontents); |
$filecontents = &HTML::Entities::encode($filecontents); |
# my $editheader='<a href="#editsection">Edit below</a><hr />'; |
# my $editheader='<a href="#editsection">Edit below</a><hr />'; |
|
my $buttons=(<<BUTTONS); |
|
<input type="submit" name="attemptclean" |
|
value="Save and then attempt to clean HTML" /> |
|
<input type="submit" name="savethisfile" value="Save this" /> |
|
<input type="submit" name="viewmode" value="View" /> |
|
BUTTONS |
my $editfooter=(<<ENDFOOTER); |
my $editfooter=(<<ENDFOOTER); |
<hr /> |
<hr /> |
<a name="editsection" /> |
<a name="editsection" /> |
<form method="post"> |
<form method="post"> |
|
<input type="hidden" name="editmode" value="Edit" /> |
|
$buttons<br /> |
<textarea cols="80" rows="40" name="filecont">$filecontents</textarea> |
<textarea cols="80" rows="40" name="filecont">$filecontents</textarea> |
|
<br />$buttons |
<br /> |
<br /> |
<input type="hidden" name="showmode" value="Edit" /> |
|
<input type="submit" name="attemptclean" |
|
value="Save and then attempt to clean HTML" /> |
|
<input type="submit" name="savethisfile" value="Save this" /> |
|
<input type="submit" name="showmode" value="View" /> |
|
</form> |
</form> |
ENDFOOTER |
ENDFOOTER |
# $result=~s/(\<body[^\>]*\>)/$1$editheader/is; |
# $result=~s/(\<body[^\>]*\>)/$1$editheader/is; |
Line 1182 ENDNOTFOUND
|
Line 1214 ENDNOTFOUND
|
$filecontents=''; |
$filecontents=''; |
if ($ENV{'request.state'} ne 'published') { |
if ($ENV{'request.state'} ne 'published') { |
$filecontents=&createnewhtml(); |
$filecontents=&createnewhtml(); |
$ENV{'form.showmode'}='Edit'; #force edit mode |
$ENV{'form.editmode'}='Edit'; #force edit mode |
} |
} |
} else { |
} else { |
unless ($ENV{'request.state'} eq 'published') { |
unless ($ENV{'request.state'} eq 'published') { |
Line 1190 ENDNOTFOUND
|
Line 1222 ENDNOTFOUND
|
$filecontents=&htmlclean($filecontents,1); |
$filecontents=&htmlclean($filecontents,1); |
} |
} |
} |
} |
if ($ENV{'form.showmode'} ne 'Edit') { |
if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) { |
$result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle); |
$result = &Apache::lonxml::xmlparse($request,$target,$filecontents, |
|
'',%mystyle); |
} |
} |
} |
} |
|
|
Line 1199 ENDNOTFOUND
|
Line 1232 ENDNOTFOUND
|
# Edit action? Insert editing commands |
# Edit action? Insert editing commands |
# |
# |
unless ($ENV{'request.state'} eq 'published') { |
unless ($ENV{'request.state'} eq 'published') { |
if ($ENV{'form.showmode'} eq 'Edit') { |
if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) { |
$result='<html><body bgcolor="#FFFFFF"></body></html>'; |
my $displayfile=$request->uri; |
|
$displayfile=~s/^\/[^\/]*//; |
|
$result='<html><body bgcolor="#FFFFFF"><h3>'.$displayfile. |
|
'</h3></body></html>'; |
$result=&inserteditinfo($result,$filecontents); |
$result=&inserteditinfo($result,$filecontents); |
} |
} |
} |
} |
Line 1215 ENDNOTFOUND
|
Line 1251 ENDNOTFOUND
|
sub debug { |
sub debug { |
if ($Apache::lonxml::debug eq 1) { |
if ($Apache::lonxml::debug eq 1) { |
$|=1; |
$|=1; |
print("DEBUG:".join('<br />',@_)."<br />\n"); |
print("DEBUG:".&HTML::Entities::encode($_[0])."<br />\n"); |
} |
} |
} |
} |
|
|
sub error { |
sub error { |
if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { |
if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { |
print "<b>ERROR:</b>".join('<br />',@_)."<br />\n"; |
# If printing in construction space, put the error inside <pre></pre> |
|
print "<b>ERROR:</b>".join("\n",@_)."\n"; |
} else { |
} else { |
print "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />"; |
print "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />"; |
#notify author |
#notify author |