--- loncom/xml/lonxml.pm 2001/08/10 15:49:46 1.109
+++ loncom/xml/lonxml.pm 2001/10/26 17:09:04 1.136
@@ -13,7 +13,10 @@
# 6/12,6/13 H. K. Ng
# 6/16 Gerd Kortemeyer
# 7/27 H. K. Ng
-# 8/7,8/9,8/10 Gerd Kortemeyer
+# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20,8/23,8/24 Gerd Kortemeyer
+# Guy Albertelli
+# 9/26 Gerd Kortemeyer
+
package Apache::lonxml;
use vars
@@ -46,6 +49,7 @@ 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
@@ -91,6 +95,8 @@ sub xmlbegin {
} else {
$output='';
}
+ my $date=localtime;
+ $output .=&Apache::loncommon::cacheheader();
return $output;
}
@@ -113,20 +119,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;
+ 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.='';
}
@@ -135,6 +158,104 @@ sub xmlend {
return $discussion.'';
}
+sub tokeninputfield {
+ my $defhost=$Apache::lonnet::perlvar{'lonHostID'};
+ $defhost=~tr/a-z/A-Z/;
+ return (<
+ 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='';
+ }
+
+
+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,$tsymb,$tcrsid,$tudom,$tuname)=@_;
+ unless ($token) { return ''; }
+
+ my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+ unless ($tsymb) {
+ $tsymb=$symb;
+ }
+ unless ($tuname) {
+ $tuname=$name;
+ $tudom=$domain;
+ $tcrsid=$courseid;
+ }
+
+ 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
+ ''.
+ 'Checked out for '.$plainname.
+ '
User: '.$tuname.' at '.$tudom.
+ '
CourseID: '.$tcrsid.
+ '
DocID: '.$token.
+ '
Time: '.localtime().'
';
+ } else {
+ return $token;
+ }
+}
+
sub fontsettings() {
my $headerstring='';
if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) {
@@ -146,7 +267,11 @@ sub fontsettings() {
sub registerurl {
my $forcereg=shift;
- if ($Apache::lonxml::registered) { return ''; }
+ if ($ENV{'request.publicaccess'}) {
+ return
+ '';
+ }
+ if ($Apache::lonxml::registered && !$forcereg) { return ''; }
$Apache::lonxml::registered=1;
if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
my $hwkadd='';
@@ -209,7 +334,7 @@ ENDPARM
menu=window.open("","LONCAPAmenu");
menu.currentStale=1;
menu.switchbutton
- (3,1,'reload.gif','return','location','go(currentURL)');
+ (3,1,'reload.gif','return','location','go(currentURL)');
menu.clearbut(7,1);
menu.clearbut(7,2);
menu.clearbut(7,3);
@@ -294,7 +419,9 @@ sub xmlparse {
my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
$safeeval,\%style_for_target);
-
+ if ($ENV{'request.uri'}) {
+ &writeallows($ENV{'request.uri'});
+ }
return $finaloutput;
}
@@ -308,8 +435,8 @@ sub htmlclean {
my $output= $tree->as_HTML(undef,' ');
- $output=~s/\<(br|hr|img)([^\>\/]*)\>/\<$1$2 \/\>/gis;
- $output=~s/\<\/(br|hr|img)\>//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;
}
@@ -321,7 +448,6 @@ sub htmlclean {
sub inner_xmlparse {
my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
- &Apache::lonxml::debug('Reentrant parser starting, again?');
my $finaloutput = '';
my $result;
my $token;
@@ -543,11 +669,17 @@ sub setup_globals {
my ($target)=@_;
$Apache::lonxml::registered = 0;
@Apache::lonxml::pwd=();
+ @Apache::lonxml::extlinks=();
if ($target eq 'meta') {
$Apache::lonxml::redirection = 0;
$Apache::lonxml::metamode = 1;
$Apache::lonxml::evaluate = 1;
$Apache::lonxml::import = 0;
+ } elsif ($target eq 'answer') {
+ $Apache::lonxml::redirection = 0;
+ $Apache::lonxml::metamode = 1;
+ $Apache::lonxml::evaluate = 1;
+ $Apache::lonxml::import = 1;
} elsif ($target eq 'grade') {
&startredirection;
$Apache::lonxml::metamode = 0;
@@ -624,7 +756,10 @@ sub init_safespace {
#need to inspect this class of ops
# $safeeval->deny(":base_orig");
$safeinit .= ';$external::target="'.$target.'";';
- $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';';
+ my $rndseed;
+ my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+ $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name);
+ $safeinit .= ';$external::randomseed='.$rndseed.';';
&Apache::run::run($safeinit,$safeeval);
}
@@ -759,13 +894,19 @@ sub parstring {
}
sub writeallows {
+ unless ($#extlinks>=0) { return; }
my $thisurl='/res/'.&Apache::lonnet::declutter(shift);
+ if ($ENV{'httpref.'.$thisurl}) {
+ $thisurl=$ENV{'httpref.'.$thisurl};
+ }
my $thisdir=$thisurl;
$thisdir=~s/\/[^\/]+$//;
my %httpref=();
map {
$httpref{'httpref.'.
- &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl; } @extlinks;
+ &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl;
+ } @extlinks;
+ @extlinks=();
&Apache::lonnet::appenv(%httpref);
}
@@ -914,10 +1055,11 @@ ENDNOTFOUND
unless ($ENV{'request.state'} eq 'published') {
$result=&inserteditinfo($result,$filecontents);
}
+
+ writeallows($request->uri);
$request->print($result);
- writeallows($request->uri);
return OK;
}
@@ -960,7 +1102,25 @@ sub get_param {
if ( ! $context ) { $context = -1; }
my $args ='';
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
- return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+ if ( $args =~ /my \$$param=\"/ ) {
+ return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+ } else {
+ return undef;
+ }
+}
+
+sub get_param_var {
+ my ($param,$parstack,$safeeval,$context) = @_;
+ if ( ! $context ) { $context = -1; }
+ my $args ='';
+ if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
+ if ( $args !~ /my \$$param=\"/ ) { return undef; }
+ my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+ if ($value =~ /^[\$\@\%]/) {
+ return &Apache::run::run("return $value",$safeeval,1);
+ } else {
+ return $value;
+ }
}
sub register_insert {
@@ -973,13 +1133,16 @@ sub register_insert {
if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
if ( $line =~ /TABLE/ ) { last; }
my ($tag,$descrip,$color,$function,$show) = split(/,/, $line);
- $insertlist{"$tagnum.tag"} = $tag;
- $insertlist{"$tagnum.description"} = $descrip;
- $insertlist{"$tagnum.color"} = $color;
- $insertlist{"$tagnum.function"} = $function;
- $insertlist{"$tagnum.show"}= $show;
- $insertlist{"$tag.num"}=$tagnum;
- $tagnum++;
+ if ($tag) {
+ $insertlist{"$tagnum.tag"} = $tag;
+ $insertlist{"$tagnum.description"} = $descrip;
+ $insertlist{"$tagnum.color"} = $color;
+ $insertlist{"$tagnum.function"} = $function;
+ if (!defined($show)) { $show='yes'; }
+ $insertlist{"$tagnum.show"}= $show;
+ $insertlist{"$tag.num"}=$tagnum;
+ $tagnum++;
+ }
}
$i++; #skipping TABLE line
$tagnum = 0;
@@ -1002,6 +1165,31 @@ sub description {
my ($token)=@_;
return $insertlist{$insertlist{"$token->[1].num"}.'.description'};
}
+
+# ----------------------------------------------------------------- whichuser
+# returns a list of $symb, $courseid, $domain, $name that is correct for
+# calls to lonnet functions for this setup.
+# - looks for form.grade_ parameters
+sub whichuser {
+ my ($symb,$courseid,$domain,$name);
+ if (defined($ENV{'form.grade_symb'})) {
+ my $tmp_courseid=$ENV{'form.grade_courseid'};
+ my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid);
+ if ($allowed) {
+ $symb=$ENV{'form.grade_symb'};
+ $courseid=$ENV{'form.grade_courseid'};
+ $domain=$ENV{'form.grade_domain'};
+ $name=$ENV{'form.grade_username'};
+ }
+ } else {
+ $symb=&Apache::lonnet::symbread();
+ $courseid=$ENV{'request.course.id'};
+ $domain=$ENV{'user.domain'};
+ $name=$ENV{'user.name'};
+ }
+ return ($symb,$courseid,$domain,$name);
+}
+
1;
__END__