version 1.101, 2001/07/12 15:26:03
|
version 1.122, 2001/08/21 17:21:50
|
Line 12
|
Line 12
|
# 6/2,6/3,6/8,6/9 Gerd Kortemeyer |
# 6/2,6/3,6/8,6/9 Gerd Kortemeyer |
# 6/12,6/13 H. K. Ng |
# 6/12,6/13 H. K. Ng |
# 6/16 Gerd Kortemeyer |
# 6/16 Gerd Kortemeyer |
|
# 7/27 H. K. Ng |
|
# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20 Gerd Kortemeyer |
|
|
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); |
use strict; |
use strict; |
use HTML::TokeParser; |
use HTML::TokeParser; |
|
use HTML::TreeBuilder; |
use Safe; |
use Safe; |
use Safe::Hole; |
use Safe::Hole; |
use Math::Cephes qw(:trigs :hypers :bessels erf erfc); |
use Math::Cephes qw(:trigs :hypers :bessels erf erfc); |
Line 92 sub xmlbegin {
|
Line 95 sub xmlbegin {
|
} |
} |
|
|
sub xmlend { |
sub xmlend { |
return '</html>'; |
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'}, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}); |
|
if ($contrib{'version'}) { |
|
$discussion.= |
|
'<address><hr /><h2>Course Discussion of Resource</h2>'; |
|
my $idx; |
|
for ($idx=1;$idx<=$contrib{'version'};$idx++) { |
|
my $hidden=($contrib{'hidden'}=~/\.$idx\./); |
|
unless (($hidden) && (!$seeid)) { |
|
my $message=$contrib{$idx.':message'}; |
|
$message=~s/\n/\<br \/\>/g; |
|
if ($message) { |
|
if ($hidden) { |
|
$message='<font color="#888888">'.$message.'</font>'; |
|
} |
|
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.=' <a href="/adm/feedback?unhide='. |
|
$symb.':::'.$idx.'">Make Visible</a>'; |
|
} else { |
|
$sender.=' <a href="/adm/feedback?hide='. |
|
$symb.':::'.$idx.'">Hide</a>'; |
|
} |
|
} |
|
} |
|
$discussion.='<p><b>'.$sender.'</b> ('. |
|
localtime($contrib{$idx.':timestamp'}). |
|
'):<blockquote>'.$message. |
|
'</blockquote></p>'; |
|
} |
|
} |
|
} |
|
$discussion.='</address>'; |
|
} |
|
} |
|
} |
|
return $discussion.'</html>'; |
|
} |
|
|
|
sub tokeninputfield { |
|
my $defhost=$Apache::lonnet::perlvar{'lonHostID'}; |
|
$defhost=~tr/a-z/A-Z/; |
|
return (<<ENDINPUTFIELD) |
|
<script> |
|
function updatetoken() { |
|
var comp=new Array; |
|
var barcode=unescape(document.tokeninput.barcode.value); |
|
comp=barcode.split('*'); |
|
if (typeof(comp[0])!="undefined") { |
|
document.tokeninput.codeone.value=comp[0]; |
|
} |
|
if (typeof(comp[1])!="undefined") { |
|
document.tokeninput.codetwo.value=comp[1]; |
|
} |
|
if (typeof(comp[2])!="undefined") { |
|
comp[2]=comp[2].toUpperCase(); |
|
document.tokeninput.codethree.value=comp[2]; |
|
} |
|
document.tokeninput.barcode.value=''; |
|
} |
|
</script> |
|
<form method="post" name="tokeninput"> |
|
<table border="2" bgcolor="#FFFFBB"> |
|
<tr><th>DocID Checkin</th></tr> |
|
<tr><td> |
|
<table> |
|
<tr> |
|
<td>Scan in Barcode</td> |
|
<td><input type="text" size="22" name="barcode" |
|
onChange="updatetoken()"/></td> |
|
</tr> |
|
<tr><td><i>or</i> Type in DocID</td> |
|
<td> |
|
<input type="text" size="5" name="codeone" /> |
|
<b><font size="+2">*</font></b> |
|
<input type="text" size="5" name="codetwo" /> |
|
<b><font size="+2">*</font></b> |
|
<input type="text" size="10" name="codethree" value="$defhost" |
|
onChange="this.value=this.value.toUpperCase()" /> |
|
</td></tr> |
|
</table> |
|
</td></tr> |
|
<tr><td><input type="submit" value="Check in DocID" /></td></tr> |
|
</table> |
|
</form> |
|
ENDINPUTFIELD |
|
} |
|
|
|
sub maketoken { |
|
my ($symb,$tuname,$tudom,$tcrsid)=@_; |
|
unless ($symb) { |
|
$symb=&Apache::lonnet::symbread(); |
|
} |
|
unless ($tuname) { |
|
$tuname=$ENV{'user.name'}; |
|
$tudom=$ENV{'user.domain'}; |
|
$tcrsid=$ENV{'request.course.id'}; |
|
} |
|
|
|
return &Apache::lonnet::checkout($symb,$tuname,$tudom,$tcrsid); |
|
} |
|
|
|
sub printtokenheader { |
|
my ($target,$token,$symb,$tuname,$tudom,$tcrsid)=@_; |
|
unless ($token) { return ''; } |
|
|
|
unless ($symb) { |
|
$symb=&Apache::lonnet::symbread(); |
|
} |
|
unless ($tuname) { |
|
$tuname=$ENV{'user.name'}; |
|
$tudom=$ENV{'user.domain'}; |
|
$tcrsid=$ENV{'request.course.id'}; |
|
} |
|
|
|
my %reply=&Apache::lonnet::get('environment', |
|
['firstname','middlename','lastname','generation'], |
|
$tudom,$tuname); |
|
my $plainname=$reply{'firstname'}.' '. |
|
$reply{'middlename'}.' '. |
|
$reply{'lastname'}.' '. |
|
$reply{'generation'}; |
|
|
|
if ($target eq 'web') { |
|
return |
|
'<img align="right" src="/cgi-bin/barcode.gif?encode='.$token.'" />'. |
|
'Checked out for '.$plainname. |
|
'<br />User: '.$tuname.' at '.$tudom. |
|
'<br />CourseID: '.$tcrsid. |
|
'<br />DocID: '.$token. |
|
'<br />Time: '.localtime().'<hr />'; |
|
} else { |
|
return $token; |
|
} |
} |
} |
|
|
sub fontsettings() { |
sub fontsettings() { |
Line 107 sub fontsettings() {
|
Line 261 sub fontsettings() {
|
sub registerurl { |
sub registerurl { |
my $forcereg=shift; |
my $forcereg=shift; |
if ($Apache::lonxml::registered) { return ''; } |
if ($Apache::lonxml::registered) { return ''; } |
|
$Apache::lonxml::registered=1; |
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_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { |
Line 144 ENDPARM
|
Line 299 ENDPARM
|
menu.currentStale=0; |
menu.currentStale=0; |
menu.clearbut(3,1); |
menu.clearbut(3,1); |
menu.switchbutton |
menu.switchbutton |
|
(6,3,'catalog.gif','catalog','info','catalog_info()'); |
|
menu.switchbutton |
(8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)'); |
(8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)'); |
menu.switchbutton |
menu.switchbutton |
(8,2,'fdbk.gif','feedback','on this','gopost("/adm/feedback",currentURL)'); |
(8,2,'fdbk.gif','feedback','on this','gopost("/adm/feedback",currentURL)'); |
Line 172 ENDPARM
|
Line 329 ENDPARM
|
menu.clearbut(7,3); |
menu.clearbut(7,3); |
menu.menucltim=menu.setTimeout( |
menu.menucltim=menu.setTimeout( |
'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+ |
'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); |
2000); |
|
|
} |
} |
Line 255 sub xmlparse {
|
Line 412 sub xmlparse {
|
return $finaloutput; |
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 { |
sub inner_xmlparse { |
my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_; |
my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_; |
&Apache::lonxml::debug('Reentrant parser starting, again?'); |
|
my $finaloutput = ''; |
my $finaloutput = ''; |
my $result; |
my $result; |
my $token; |
my $token; |
Line 513 sub init_safespace {
|
Line 690 sub init_safespace {
|
$safeeval->permit(":base_math"); |
$safeeval->permit(":base_math"); |
$safeeval->permit("sort"); |
$safeeval->permit("sort"); |
$safeeval->deny(":base_io"); |
$safeeval->deny(":base_io"); |
|
$safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse'); |
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); |
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); |
|
|
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); |
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); |
Line 559 sub init_safespace {
|
Line 737 sub init_safespace {
|
#need to inspect this class of ops |
#need to inspect this class of ops |
# $safeeval->deny(":base_orig"); |
# $safeeval->deny(":base_orig"); |
$safeinit .= ';$external::target="'.$target.'";'; |
$safeinit .= ';$external::target="'.$target.'";'; |
$safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';'; |
my $rndseed; |
|
if (defined(&Apache::lonhomework::whichuser)) { |
|
my ($symb,$courseid,$domain,$name) = &Apache::lonhomework::whichuser(); |
|
$rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name); |
|
} else { |
|
$rndseed=&Apache::lonnet::rndseed(); |
|
} |
|
$safeinit .= ';$external::randomseed='.$rndseed.';'; |
&Apache::run::run($safeinit,$safeeval); |
&Apache::run::run($safeinit,$safeeval); |
} |
} |
|
|
Line 695 sub parstring {
|
Line 880 sub parstring {
|
|
|
sub writeallows { |
sub writeallows { |
my $thisurl='/res/'.&Apache::lonnet::declutter(shift); |
my $thisurl='/res/'.&Apache::lonnet::declutter(shift); |
|
if ($ENV{'httpref.'.$thisurl}) { |
|
$thisurl=$ENV{'httpref.'.$thisurl}; |
|
} |
my $thisdir=$thisurl; |
my $thisdir=$thisurl; |
$thisdir=~s/\/[^\/]+$//; |
$thisdir=~s/\/[^\/]+$//; |
my %httpref=(); |
my %httpref=(); |
Line 782 SIMPLECONTENT
|
Line 970 SIMPLECONTENT
|
<form method="post"> |
<form method="post"> |
<textarea cols="80" rows="40" name="filecont">$filecontents</textarea> |
<textarea cols="80" rows="40" name="filecont">$filecontents</textarea> |
<br /> |
<br /> |
<input type="submit" name="savethisfile" value="Save this file" /> |
<input type="submit" name="attemptclean" |
|
value="Save and then attempt to clean HTML" /> |
|
<input type="submit" name="savethisfile" value="Save this" /> |
</form> |
</form> |
ENDFOOTER |
ENDFOOTER |
$result=~s/(\<body[^\>]*\>)/$1$editheader/is; |
$result=~s/(\<body[^\>]*\>)/$1$editheader/is; |
Line 813 sub handler {
|
Line 1003 sub handler {
|
# Edit action? Save file. |
# Edit action? Save file. |
# |
# |
unless ($ENV{'request.state'} eq 'published') { |
unless ($ENV{'request.state'} eq 'published') { |
if ($ENV{'form.savethisfile'}) { |
if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) { |
&storefile($file,$ENV{'form.filecont'}); |
&storefile($file,$ENV{'form.filecont'}); |
} |
} |
} |
} |
Line 833 sub handler {
|
Line 1023 sub handler {
|
ENDNOTFOUND |
ENDNOTFOUND |
$filecontents=''; |
$filecontents=''; |
} else { |
} else { |
|
unless ($ENV{'request.state'} eq 'published') { |
|
if ($ENV{'form.attemptclean'}) { |
|
$filecontents=&htmlclean($filecontents,1); |
|
} |
|
} |
$result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle); |
$result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle); |
} |
} |
|
|