--- loncom/xml/lonxml.pm 2003/05/01 15:49:26 1.249
+++ loncom/xml/lonxml.pm 2003/09/08 19:00:09 1.274
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.249 2003/05/01 15:49:26 albertel Exp $
+# $Id: lonxml.pm,v 1.274 2003/09/08 19:00:09 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -69,6 +69,8 @@ use Safe::Hole();
use Math::Cephes();
use Math::Random();
use Opcode();
+use POSIX qw(strftime);
+
sub register {
my ($space,@taglist) = @_;
@@ -95,6 +97,8 @@ use Apache::run();
use Apache::londefdef();
use Apache::scripttag();
use Apache::edit();
+use Apache::inputtags();
+use Apache::outputtags();
use Apache::lonnet();
use Apache::File();
use Apache::loncommon();
@@ -151,6 +155,10 @@ $Apache::lonxml::counter_changed=0;
#internal check on whether to look at style defs
$Apache::lonxml::usestyle=1;
+#locations used to store the parameter string for style substitutions
+$Apache::lonxml::style_values='';
+$Apache::lonxml::style_end_values='';
+
sub xmlbegin {
my $output='';
if ($ENV{'browser.mathml'}) {
@@ -382,7 +390,7 @@ sub fontsettings() {
if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) {
$headerstring.=
'';
- } elsif (!$ENV{'browser.mathml'}) {
+ } elsif (!$ENV{'browser.mathml'} && $ENV{'browser.unicode'}) {
$headerstring.=
'';
}
@@ -421,8 +429,7 @@ sub xmlparse {
}
}
}
-
- #&printalltags();
+#&printalltags();
my @pars = ();
my $pwd=$ENV{'request.filename'};
$pwd =~ s:/[^/]*$::;
@@ -441,6 +448,7 @@ sub xmlparse {
my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
$safeeval,\%style_for_target);
+
if ($ENV{'request.uri'}) {
&writeallows($ENV{'request.uri'});
}
@@ -470,23 +478,25 @@ sub htmlclean {
}
sub latex_special_symbols {
- my ($current_token,$stack,$parstack,$where)=@_;
+ my ($string,$where)=@_;
if ($where eq 'header') {
- $current_token =~ s/(\\|_|\^)/ /g;
- $current_token =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
+ $string =~ s/(\\|_|\^)/ /g;
+ $string =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
+ $string =~ s/_/ /g;
} else {
- $current_token=~s/\\ /\\char92 /g;
- $current_token=~s/\^/\\char94 /g;
- $current_token=~s/\~/\\char126 /g;
- $current_token=~s/(&[^A-Za-z\#])/\\$1/g;
- $current_token=~s/([^&])\#/$1\\#/g;
- $current_token=~s/(\$|_|{|})/\\$1/g;
- $current_token=~s/\\char92 /\\texttt{\\char92}/g;
- $current_token=~s/(>|<)/\$$1\$/g; #more or less
- if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
- if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
+ $string=~s/\\ /\\char92 /g;
+ $string=~s/\^/\\char94 /g;
+ $string=~s/\~/\\char126 /g;
+ $string=~s/(&[^A-Za-z\#])/\\$1/g;
+ $string=~s/([^&])\#/$1\\#/g;
+ $string=~s/(\$|_|{|})/\\$1/g;
+ $string=~s/\\char92 /\\texttt{\\char92}/g;
+ $string=~s/(>|<)/\$$1\$/g; #more or less
+ if ($string=~m/\d%/) {$string =~ s/(\d)%/$1\\%/g;} #percent after digit
+ if ($string=~m/\s%/) {$string =~ s/(\s)%/$1\\%/g;} #percent after space
+ if ($string eq '%.') {$string = '\%.';} #percent at the end of statement
}
- return $current_token;
+ return $string;
}
sub inner_xmlparse {
@@ -494,9 +504,10 @@ sub inner_xmlparse {
my $finaloutput = '';
my $result;
my $token;
+ my $dontpop=0;
while ( $#$pars > -1 ) {
while ($token = $$pars['-1']->get_token) {
- if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
+ if (($token->[0] eq 'T') || ($token->[0] eq 'C') ) {
if ($metamode<1) {
my $text=$token->[1];
if ($token->[0] eq 'C' && $target eq 'tex') {
@@ -505,8 +516,13 @@ sub inner_xmlparse {
}
$result.=$text;
}
+ } elsif (($token->[0] eq 'D')) {
+ if ($metamode<1 && $target eq 'web') {
+ my $text=$token->[1];
+ $result.=$text;
+ }
} elsif ($token->[0] eq 'PI') {
- if ($metamode<1) {
+ if ($metamode<1 && $target eq 'web') {
$result=$token->[2];
}
} elsif ($token->[0] eq 'S') {
@@ -521,48 +537,56 @@ sub inner_xmlparse {
my $string=$$style_for_target{$token->[1]}.
'';
&Apache::lonxml::newparser($pars,\$string);
+ $Apache::lonxml::style_values=$$parstack[-1];
+ $Apache::lonxml::style_end_values=$$parstack[-1];
} else {
$result = &callsub("start_$token->[1]", $target, $token, $stack,
$parstack, $pars, $safeeval, $style_for_target);
}
} elsif ($token->[0] eq 'E') {
- #clear out any tags that didn't end
- while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
- my $lasttag=$$stack[-1];
- if ($token->[1] =~ /^$lasttag$/i) {
- &Apache::lonxml::warning('Using tag </'.$token->[1].'> on line '.$token->[3].' as end tag to <'.$$stack[-1].'>');
- last;
- } else {
- &Apache::lonxml::warning('Found tag </'.$token->[1].'> on line '.$token->[3].' when looking for </'.$$stack[-1].'> in file');
- &end_tag($stack,$parstack,$token);
- }
- }
-
if ($Apache::lonxml::usestyle &&
exists($$style_for_target{'/'."$token->[1]"})) {
$Apache::lonxml::usestyle=0;
my $string=$$style_for_target{'/'.$token->[1]}.
- '';
+ '';
&Apache::lonxml::newparser($pars,\$string);
+ $Apache::lonxml::style_values=$Apache::lonxml::style_end_values;
+ $Apache::lonxml::style_end_values='';
+ $dontpop=1;
} else {
- $result = &callsub("end_$token->[1]", $target, $token, $stack,
- $parstack, $pars,$safeeval, $style_for_target);
+ #clear out any tags that didn't end
+ while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
+ my $lasttag=$$stack[-1];
+ if ($token->[1] =~ /^$lasttag$/i) {
+ &Apache::lonxml::warning('Using tag </'.$token->[1].'> on line '.$token->[3].' as end tag to <'.$$stack[-1].'>');
+ last;
+ } else {
+ &Apache::lonxml::warning('Found tag </'.$token->[1].'> on line '.$token->[3].' when looking for </'.$$stack[-1].'> in file');
+ &end_tag($stack,$parstack,$token);
+ }
+ }
+ $result = &callsub("end_$token->[1]", $target, $token, $stack,
+ $parstack, $pars,$safeeval, $style_for_target);
}
} else {
&Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");
}
#evaluate variable refs in result
if ($result ne "") {
+ my $extras;
+ if (!$Apache::lonxml::usestyle) {
+ $extras=$Apache::lonxml::style_values;
+ }
if ( $#$parstack > -1 ) {
- $result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]);
+ $result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]);
} else {
- $result= &Apache::run::evaluate($result,$safeeval,'');
+ $result= &Apache::run::evaluate($result,$safeeval,$extras);
}
}
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
#Style file definitions should be correct
- if ($target eq 'tex' && ($Apache::lonxml::usestyle) {
- $result=&latex_special_symbols($result,$stack,$parstack);
+ if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {
+ $result=&latex_special_symbols($result);
}
}
@@ -577,9 +601,10 @@ sub inner_xmlparse {
}
$result = '';
- if ($token->[0] eq 'E') {
+ if ($token->[0] eq 'E' && !$dontpop) {
&end_tag($stack,$parstack,$token);
}
+ $dontpop=0;
}
if ($#$pars > -1) {
pop @$pars;
@@ -722,6 +747,7 @@ sub init_safespace {
$safeeval->permit("sort");
$safeeval->deny(":base_io");
$safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse');
+ $safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart');
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin');
@@ -928,83 +954,105 @@ sub store_counter {
}
sub get_all_text {
- my($tag,$pars)= @_;
- &Apache::lonxml::debug("Got a ".ref($pars));
- my $gotfullstack=1;
- if (ref($pars) ne 'ARRAY') {
- $gotfullstack=0;
- $pars=[$pars];
- }
- my $depth=0;
- my $token;
- my $result='';
- if ( $tag =~ m:^/: ) {
- my $tag=substr($tag,1);
- #&Apache::lonxml::debug("have:$tag:");
- my $top_empty=0;
- while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) {
- while (($depth >=0) && ($token = $$pars[-1]->get_token)) {
- #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd);
- 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') {
- if ($token->[1] =~ /^$tag$/i) { $depth++; }
- $result.=$token->[4];
- } elsif ($token->[0] eq 'E') {
- if ( $token->[1] =~ /^$tag$/i) { $depth--; }
- #skip sending back the last end tag
- if ($depth > -1) { $result.=$token->[2]; } else {
- $$pars[-1]->unget_token($token);
- }
- }
- }
- if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; }
- if (($depth >=0) && ($#$pars > 0) ) {
- pop(@$pars);
- pop(@Apache::lonxml::pwd);
- }
- }
- if ($top_empty && $depth >= 0) {
- #never found the end tag ran out of text, throw error send back blank
- &error('Never found end tag for <'.$tag.'>');
- if ($gotfullstack) {
- my $newstring=''.$tag.'>'.$result;
- &Apache::lonxml::newparser($pars,\$newstring);
- }
- $result='';
- }
- } else {
- while ($#$pars > -1) {
- while ($token = $$pars[-1]->get_token) {
- #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]");
- 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') {
- if ( $token->[1] =~ /^$tag$/i) {
- $$pars[-1]->unget_token($token); last;
- } else {
- $result.=$token->[4];
- }
- } elsif ($token->[0] eq 'E') {
- $result.=$token->[2];
- }
- }
- if (($#$pars > 0) ) {
- pop(@$pars);
- pop(@Apache::lonxml::pwd);
- } else { last; }
- }
- }
- if ($result =~ m||) {
- $Apache::lonxml::usestyle=1;
- }
- #&Apache::lonxml::debug("Exit:$result:");
- return $result
+ my($tag,$pars,$style)= @_;
+ &Apache::lonxml::debug("Got a ".ref($pars));
+ my $gotfullstack=1;
+ if (ref($pars) ne 'ARRAY') {
+ $gotfullstack=0;
+ $pars=[$pars];
+ }
+ &Apache::lonxml::debug("Got a ".ref($style));
+ if (ref($style) ne 'HASH') {
+ $style={};
+ } else {
+ &Apache::lonhomework::showhash(%$style);
+ }
+ my $depth=0;
+ my $token;
+ my $result='';
+ if ( $tag =~ m:^/: ) {
+ my $tag=substr($tag,1);
+ #&Apache::lonxml::debug("have:$tag:");
+ my $top_empty=0;
+ while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) {
+ while (($depth >=0) && ($token = $$pars[-1]->get_token)) {
+ #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd);
+ 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') {
+ if ($token->[1] =~ /^$tag$/i) { $depth++; }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; }
+ $result.=$token->[4];
+ } elsif ($token->[0] eq 'E') {
+ if ( $token->[1] =~ /^$tag$/i) { $depth--; }
+ #skip sending back the last end tag
+ if ($depth == 0 && exists($$style{'/'.$token->[1]})) {
+ my $string=
+ ''.
+ $$style{'/'.$token->[1]}.
+ $token->[2].
+ '';
+ &Apache::lonxml::newparser($pars,\$string);
+ #&Apache::lonxml::debug("reParsing $string");
+ next;
+ }
+ if ($depth > -1) {
+ $result.=$token->[2];
+ } else {
+ $$pars[-1]->unget_token($token);
+ }
+ }
+ }
+ if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; }
+ if (($depth >=0) && ($#$pars > 0) ) {
+ pop(@$pars);
+ pop(@Apache::lonxml::pwd);
+ }
+ }
+ if ($top_empty && $depth >= 0) {
+ #never found the end tag ran out of text, throw error send back blank
+ &error('Never found end tag for <'.$tag.
+ '> current string
'.
+ &HTML::Entities::encode($result).
+ '
');
+ if ($gotfullstack) {
+ my $newstring=''.$tag.'>'.$result;
+ &Apache::lonxml::newparser($pars,\$newstring);
+ }
+ $result='';
+ }
+ } else {
+ while ($#$pars > -1) {
+ while ($token = $$pars[-1]->get_token) {
+ #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]");
+ 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') {
+ if ( $token->[1] =~ /^$tag$/i) {
+ $$pars[-1]->unget_token($token); last;
+ } else {
+ $result.=$token->[4];
+ }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; }
+ } elsif ($token->[0] eq 'E') {
+ $result.=$token->[2];
+ }
+ }
+ if (($#$pars > 0) ) {
+ pop(@$pars);
+ pop(@Apache::lonxml::pwd);
+ } else { last; }
+ }
+ }
+ #&Apache::lonxml::debug("Exit:$result:");
+ return $result
}
sub newparser {
@@ -1016,8 +1064,6 @@ sub newparser {
} else {
push (@Apache::lonxml::pwd, $dir);
}
-# &Apache::lonxml::debug("pwd:$#Apache::lonxml::pwd");
-# &Apache::lonxml::debug("pwd:$Apache::lonxml::pwd[$#Apache::lonxml::pwd]");
}
sub parstring {
@@ -1028,7 +1074,7 @@ sub parstring {
my $val=$token->[2]->{$_};
$val =~ s/([\%\@\\\"\'])/\\$1/g;
#if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
- $temp .= "my \$$_=\"$val\";"
+ $temp .= "my \$$_=\"$val\";";
}
}
return $temp;
@@ -1093,8 +1139,10 @@ sub storefile {
if (my $fh=Apache::File->new('>'.$file)) {
print $fh $contents;
$fh->close();
+ return 1;
} else {
- &warning("Unable to save file $file");
+ &warning("Unable to save file $file");
+ return 0;
}
}
@@ -1116,21 +1164,35 @@ SIMPLECONTENT
return $filecontents;
}
+sub createnewsty {
+ my $filecontents=(<
+
+
+
+
+
+SIMPLECONTENT
+ return $filecontents;
+}
+
sub inserteditinfo {
- my ($result,$filecontents)=@_;
+ my ($result,$filecontents,$filetype)=@_;
$filecontents = &HTML::Entities::encode($filecontents);
# my $editheader='Edit below
';
- my $xml_help = ''.
- &Apache::loncommon::help_open_topic("Greek_Symbols",'Greek Symbols',
- undef,undef,600)
- .' | '.
- &Apache::loncommon::help_open_topic("Other_Symbols",'Other Symbols',
- undef,undef,600)
- .' |
';
+ my $xml_help = '';
+ if ($filetype eq 'html') {
+ $xml_help=Apache::loncommon::helpLatexCheatsheet();
+ }
+ my $cleanbut = '';
+ if ($filetype eq 'html') {
+ $cleanbut='';
+ }
+ my $titledisplay=&display_title();
my $buttons=(<
+$cleanbut
BUTTONS
@@ -1145,6 +1207,7 @@ $buttons
$buttons
+$titledisplay
ENDFOOTER
# $result=~s/(\]*\>)/$1$editheader/is;
$result=~s/(\<\/body\>)/$editfooter/is;
@@ -1179,37 +1242,45 @@ sub get_target {
}
sub handler {
- my $request=shift;
-
- my $target=&get_target();
-
- $Apache::lonxml::debug=0;
-
- if ($ENV{'browser.mathml'}) {
- $request->content_type('text/xml');
- } else {
- $request->content_type('text/html');
- }
- &Apache::loncommon::no_cache($request);
- $request->send_http_header;
-
- return OK if $request->header_only;
+ my $request=shift;
+
+ my $target=&get_target();
+
+ $Apache::lonxml::debug=$ENV{'user.debug'};
+
+ if ($ENV{'browser.mathml'}) {
+ $request->content_type('text/xml');
+ } else {
+ $request->content_type('text/html');
+ }
+ &Apache::loncommon::no_cache($request);
+ $request->send_http_header;
+
+ return OK if $request->header_only;
- my $file=&Apache::lonnet::filelocation("",$request->uri);
+ my $file=&Apache::lonnet::filelocation("",$request->uri);
+ my $filetype;
+ if ($file =~ /\.sty$/) {
+ $filetype='sty';
+ } else {
+ $filetype='html';
+ }
#
# Edit action? Save file.
#
- unless ($ENV{'request.state'} eq 'published') {
- if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
- &storefile($file,$ENV{'form.filecont'});
- }
- }
- my %mystyle;
- my $result = '';
- my $filecontents=&Apache::lonnet::getfile($file);
- if ($filecontents eq -1) {
- $result=(<print("Updated: ". strftime("%d %b %H:%M:%S",localtime())." ");
+ }
+ }
+ }
+ my %mystyle;
+ my $result = '';
+ my $filecontents=&Apache::lonnet::getfile($file);
+ if ($filecontents eq -1) {
+ $result=(<
File not found
@@ -1220,40 +1291,62 @@ sub handler {
ENDNOTFOUND
$filecontents='';
- if ($ENV{'request.state'} ne 'published') {
- $filecontents=&createnewhtml();
- $ENV{'form.editmode'}='Edit'; #force edit mode
- }
- } else {
- unless ($ENV{'request.state'} eq 'published') {
- if ($ENV{'form.attemptclean'}) {
- $filecontents=&htmlclean($filecontents,1);
- }
- }
- if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
- $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
- '',%mystyle);
+ if ($ENV{'request.state'} ne 'published') {
+ if ($filetype eq 'sty') {
+ $filecontents=&createnewsty();
+ } else {
+ $filecontents=&createnewhtml();
+ }
+ $ENV{'form.editmode'}='Edit'; #force edit mode
+ }
+ } else {
+ unless ($ENV{'request.state'} eq 'published') {
+ if ($ENV{'form.attemptclean'}) {
+ $filecontents=&htmlclean($filecontents,1);
+ }
+#
+# we are in construction space, see if edit mode forced
+ &Apache::loncommon::get_unprocessed_cgi
+ ($ENV{'QUERY_STRING'},['editmode']);
+ }
+ if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
+ $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
+ '',%mystyle);
+ }
}
- }
-
+
#
# Edit action? Insert editing commands
#
- unless ($ENV{'request.state'} eq 'published') {
- if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
- my $displayfile=$request->uri;
- $displayfile=~s/^\/[^\/]*//;
- $result=''.$displayfile.
- '
';
- $result=&inserteditinfo($result,$filecontents);
+ unless ($ENV{'request.state'} eq 'published') {
+ if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
+ my $displayfile=$request->uri;
+ $displayfile=~s/^\/[^\/]*//;
+ $result=''.$displayfile.
+ '
';
+ $result=&inserteditinfo($result,$filecontents,$filetype);
+ }
}
- }
-
- writeallows($request->uri);
-
- $request->print($result);
-
- return OK;
+ if ($filetype eq 'html') { writeallows($request->uri); }
+
+
+
+ $request->print($result);
+
+ return OK;
+}
+
+sub display_title {
+ my $result;
+ if ($ENV{'request.state'} eq 'construct') {
+ my $title=&Apache::lonnet::gettitle();
+ if (!defined($title) || $title eq '') {
+ $title = $ENV{'request.filename'};
+ $title = substr($title, rindex($title, '/') + 1);
+ }
+ $result = "";
+ }
+ return $result;
}
sub debug {
@@ -1291,8 +1384,11 @@ sub error {
sub warning {
$warningcount++;
- if ($ENV{'request.state'} eq 'construct') {
- print "WARNING:".join('
',@_)."
\n";
+
+ if ($ENV{'form.grade_target'} ne 'tex') {
+ if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) {
+ print "WARNING:".join('
',@_)."
\n";
+ }
}
}
@@ -1354,7 +1450,7 @@ sub register_insert {
my $line = $data[$i];
if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
if ( $line =~ /TABLE/ ) { last; }
- my ($tag,$descrip,$color,$function,$show) = split(/,/, $line);
+ my ($tag,$descrip,$color,$function,$show,$helpfile,$helpdesc) = split(/,/, $line);
if ($tag) {
$insertlist{"$tagnum.tag"} = $tag;
$insertlist{"$tagnum.description"} = $descrip;
@@ -1362,6 +1458,8 @@ sub register_insert {
$insertlist{"$tagnum.function"} = $function;
if (!defined($show)) { $show='yes'; }
$insertlist{"$tagnum.show"}= $show;
+ $insertlist{"$tagnum.helpfile"} = $helpfile;
+ $insertlist{"$tagnum.helpdesc"} = $helpdesc;
$insertlist{"$tag.num"}=$tagnum;
$tagnum++;
}
@@ -1396,15 +1494,30 @@ sub description {
return $insertlist{$tagnum.'.description'};
}
+# Returns a list containing the help file, and the description
+sub helpinfo {
+ my ($token)=@_;
+ my $tagnum;
+ my $tag=$token->[1];
+ foreach my $namespace (reverse @Apache::lonxml::namespace) {
+ my $testtag=$namespace.'::'.$tag;
+ $tagnum=$insertlist{"$testtag.num"};
+ if (defined($tagnum)) { last; }
+ }
+ if (!defined ($tagnum)) { $tagnum=$Apache::lonxml::insertlist{"$tag.num"}; }
+ return ($insertlist{$tagnum.'.helpfile'}, $insertlist{$tagnum.'.helpdesc'});
+}
+
# ----------------------------------------------------------------- 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 ($passedsymb)=@_;
my ($symb,$courseid,$domain,$name,$publicuser);
if (defined($ENV{'form.grade_symb'})) {
my $tmp_courseid=$ENV{'form.grade_courseid'};
- my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid);
+ my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid);
if ($allowed) {
$symb=$ENV{'form.grade_symb'};
$courseid=$ENV{'form.grade_courseid'};
@@ -1412,7 +1525,11 @@ sub whichuser {
$name=$ENV{'form.grade_username'};
}
} else {
- $symb=&Apache::lonnet::symbread();
+ if (!$passedsymb) {
+ $symb=&Apache::lonnet::symbread();
+ } else {
+ $symb=$passedsymb;
+ }
$courseid=$ENV{'request.course.id'};
$domain=$ENV{'user.domain'};
$name=$ENV{'user.name'};