-$addbuttons
function initDocument() {
+ resize_textarea('$textarea_id','LC_aftertextarea');
}
FULLPAGE
- }
- $result=~s/\]*)\>/\/i;
+ }
+
+ $add_to_onload = 'initDocument();';
+ $add_to_onresize = "resize_textarea('$textarea_id','LC_aftertextarea');";
+
+ if ($filetype eq 'html') {
$xml_help=&Apache::loncommon::helpLatexCheatsheet();
}
+
my $cleanbut = '';
my $titledisplay=&display_title();
- my %lt=&Apache::lonlocal::texthash('st' => 'Save this',
- 'vi' => 'View',
+ my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit',
+ 'vi' => 'Save and View',
+ 'dv' => 'Discard Edits and View',
+ 'un' => 'undo',
'ed' => 'Edit');
my $buttons=(<
+
BUTTONS
$buttons.=&Apache::lonhtmlcommon::spelllink('xmledit','filecont');
- $buttons.=&Apache::lonhtmlcommon::htmlareaselectactive('filecont');
+ my $textarea_events = &Apache::edit::element_change_detection();
+ my $form_events = &Apache::edit::form_change_detection();
my $editfooter=(<
-
ENDFOOTER
-# $result=~s/(\]*\>)/$1$editheader/is;
- $result=~s/(\<\/body\>)/$editfooter/is;
- return $result;
+ return ($editfooter,$add_to_onload,$add_to_onresize);;
}
sub get_target {
@@ -1357,31 +1621,23 @@ sub handler {
#
# Edit action? Save file.
#
- unless ($env{'request.state'} eq 'published') {
- if ($env{'form.savethisfile'}) {
- if (&storefile($file,$env{'form.filecont'})) {
- &Apache::lonxml::info("".
- &mt('Updated').": ".
- &Apache::lonlocal::locallocaltime(time).
- " ");
- }
+ if (!($env{'request.state'} eq 'published')) {
+ if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) {
+ my $html_file=&Apache::lonnet::getfile($file);
+ my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'});
}
}
my %mystyle;
my $result = '';
my $filecontents=&Apache::lonnet::getfile($file);
if ($filecontents eq -1) {
- my $bodytag=&Apache::loncommon::bodytag('File Error');
+ my $start_page=&Apache::loncommon::start_page('File Error');
+ my $end_page=&Apache::loncommon::end_page();
my $fnf=&mt('File not found');
$result=(<
-
-$fnf
-
-$bodytag
+$start_page
$fnf: $file
-
-
+$end_page
ENDNOTFOUND
$filecontents='';
if ($env{'request.state'} ne 'published') {
@@ -1402,36 +1658,65 @@ ENDNOTFOUND
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['editmode']);
}
- if (!$env{'form.editmode'} || $env{'form.viewmode'}) {
+ if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) {
+ &Apache::structuretags::reset_problem_globals();
$result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
'',%mystyle);
- undef($Apache::lonhomework::parsing_a_task);
+ # .html files may contain or need to clean
+ # up if it did
+ &Apache::structuretags::reset_problem_globals();
+ &Apache::lonhomework::finished_parsing();
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['rawmode']);
- if ($env{'rawmode'}) { $result = $filecontents; }
+ if ($env{'form.rawmode'}) { $result = $filecontents; }
+ if ($filetype eq 'sty') {
+ my $controls =
+ ($env{'request.state'} eq 'construct') ? &Apache::londefdef::edit_controls()
+ : '';
+ my %options = ('bgcolor' => '#FFFFFF');
+ $result =
+ &Apache::loncommon::start_page(undef,undef,\%options).
+ $controls.
+ $result.
+ &Apache::loncommon::end_page();
+ }
}
}
-
+
#
# Edit action? Insert editing commands
#
unless ($env{'request.state'} eq 'published') {
- if ($env{'form.editmode'} && (!($env{'form.viewmode'}))) {
+ if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'})))
+ {
+ my ($edit_info, $add_to_onload, $add_to_onresize)=
+ &inserteditinfo($filecontents,$filetype);
+
my $displayfile=$request->uri;
$displayfile=~s/^\/[^\/]*//;
- my $bodytag='';
- if ($env{'environment.remote'} eq 'off') {
- $bodytag=&Apache::loncommon::bodytag();
+ my %options =
+ ('add_entries' =>
+ {'onresize' => $add_to_onresize,
+ 'onload' => $add_to_onload, });
+
+ if ($env{'environment.remote'} ne 'off') {
+ $options{'bgcolor'} = '#FFFFFF';
+ $options{'only_body'} = 1;
}
- $result=''.$bodytag.
+ my $js =
+ &Apache::edit::js_change_detection().
+ &Apache::loncommon::resize_textarea_js();
+ my $start_page = &Apache::loncommon::start_page(undef,$js,
+ \%options);
+ $result=$start_page.
&Apache::lonxml::message_location().''.
$displayfile.
- '
';
- $result=&inserteditinfo($result,$filecontents,$filetype);
+ ''.
+ $edit_info.
+ &Apache::loncommon::end_page();
}
}
- if ($filetype eq 'html') { writeallows($request->uri); }
-
+ if ($filetype eq 'html') { &writeallows($request->uri); }
&Apache::lonxml::add_messages(\$result);
$request->print($result);
@@ -1480,12 +1765,28 @@ sub show_error_warn_msg {
}
sub error {
+ my @errors = @_;
+
$errorcount++;
+
+ if (defined($Apache::inputtags::part)) {
+ if ( @Apache::inputtags::response ) {
+ push(@errors,
+ &mt("This error occurred while processing response [_1] in part [_2]",
+ $Apache::inputtags::response[-1],
+ $Apache::inputtags::part));
+ } else {
+ push(@errors,
+ &mt("This error occurred while processing part [_1]",
+ $Apache::inputtags::part));
+ }
+ }
+
if ( &show_error_warn_msg() ) {
# If printing in construction space, put the error inside
push(@Apache::lonxml::error_messages,
$Apache::lonxml::warnings_error_header.
- "ERROR:".join("
\n",@_)."
\n");
+ "ERROR:".join("
\n",@errors)."
\n");
$Apache::lonxml::warnings_error_header='';
} else {
my $errormsg;
@@ -1493,15 +1794,21 @@ sub error {
if ( !$symb ) {
#public or browsers
$errormsg=&mt("An error occured while processing this resource. The author has been notified.");
- }
+ }
+ my $host=$Apache::lonnet::perlvar{'lonHostID'};
+ push(@errors, "The error occurred on host $host");
+
+ my $msg = join('
', @errors);
+
#notify author
- &Apache::lonmsg::author_res_msg($env{'request.filename'},join('
',@_));
+ &Apache::lonmsg::author_res_msg($env{'request.filename'},$msg);
#notify course
if ( $symb && $env{'request.course.id'} ) {
my $cnum=$env{'course.'.$env{'request.course.id'}.'.num'};
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
- my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1);
+ my (undef,%users)=&Apache::lonmsg::decide_receiver(undef,0,1,1,1);
my $declutter=&Apache::lonnet::declutter($env{'request.filename'});
+ my $baseurl = &Apache::lonnet::clutter($declutter);
my @userlist;
foreach (keys %users) {
my ($user,$domain) = split(/:/, $_);
@@ -1512,8 +1819,11 @@ sub error {
$cdom,$cnum);
my $now=time;
if ($now-$lastnotified{$key}>86400) {
+ my $title = &Apache::lonnet::gettitle($symb);
+ my $sentmessage;
&Apache::lonmsg::user_normal_msg($user,$domain,
- "Error [$declutter]",join('
',@_));
+ "Error [$title]",$msg,'',$baseurl,'','',
+ \$sentmessage,$symb,$title,1);
&Apache::lonnet::put('nohist_xmlerrornotifications',
{$key => $now},
$cdom,$cnum);
@@ -1576,14 +1886,14 @@ sub get_param {
}
if ( ! $args ) { return undef; }
if ( $case_insensitive ) {
- if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) {
+ if ($args =~ s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei) {
return &Apache::run::run("{$args;".'return $'.$param.'}',
$safeeval); #'
} else {
return undef;
}
} else {
- if ( $args =~ /my \$\Q$param\E=\"/ ) {
+ if ( $args =~ /my .*\$\Q$param\E[,\)]/ ) {
return &Apache::run::run("{$args;".'return $'.$param.'}',
$safeeval); #'
} else {
@@ -1602,10 +1912,10 @@ sub get_param_var {
}
&Apache::lonxml::debug("Args are $args param is $param");
if ($case_insensitive) {
- if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) {
+ if (! ($args=~s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei)) {
return undef;
}
- } elsif ( $args !~ /my \$\Q$param\E=\"/ ) { return undef; }
+ } elsif ( $args !~ /my .*\$\Q$param\E[,\)]/ ) { return undef; }
my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
&Apache::lonxml::debug("first run is $value");
if ($value =~ /^[\$\@\%][a-zA-Z_]\w*$/) {
@@ -1621,113 +1931,144 @@ sub get_param_var {
}
}
-sub register_insert {
- my @data = split /\n/, &Apache::lonnet::getfile('/home/httpd/lonTabs/insertlist.tab');
- my $i;
- my $tagnum=0;
- my @order;
- for ($i=0;$i < $#data; $i++) {
- my $line = $data[$i];
- if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
- if ( $line =~ /TABLE/ ) { last; }
- my ($tag,$descrip,$color,$function,$show,$helpfile,$helpdesc) = split(/,/, $line);
- 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{"$tagnum.helpfile"} = $helpfile;
- $insertlist{"$tagnum.helpdesc"} = $helpdesc;
- $insertlist{"$tag.num"}=$tagnum;
- $tagnum++;
+sub register_insert_xml {
+ my $parser = HTML::LCParser->new($Apache::lonnet::perlvar{'lonTabDir'}
+ .'/insertlist.xml');
+ my ($tagnum,$in_help)=(0,0);
+ my @alltags;
+ my $tag;
+ while (my $token = $parser->get_token()) {
+ if ($token->[0] eq 'S') {
+ my $key;
+ if ($token->[1] eq 'tag') {
+ $tag = $token->[2]{'name'};
+ $insertlist{"$tagnum.tag"} = $tag;
+ $insertlist{"$tag.num"} = $tagnum;
+ push(@alltags,$tag);
+ } elsif ($in_help && $token->[1] eq 'file') {
+ $key = $tag.'.helpfile';
+ } elsif ($in_help && $token->[1] eq 'description') {
+ $key = $tag.'.helpdesc';
+ } elsif ($token->[1] eq 'description' ||
+ $token->[1] eq 'color' ||
+ $token->[1] eq 'show' ) {
+ $key = $tag.'.'.$token->[1];
+ } elsif ($token->[1] eq 'insert_sub') {
+ $key = $tag.'.function';
+ } elsif ($token->[1] eq 'help') {
+ $in_help=1;
+ } elsif ($token->[1] eq 'allow') {
+ $key = $tag.'.allow';
+ }
+ if (defined($key)) {
+ $insertlist{$key} = $parser->get_text();
+ $insertlist{$key} =~ s/(^\s*|\s*$ )//gx;
+ }
+ } elsif ($token->[0] eq 'E') {
+ if ($token->[1] eq 'tag') {
+ undef($tag);
+ $tagnum++;
+ } elsif ($token->[1] eq 'help') {
+ undef($in_help);
+ }
+ }
}
- }
- $i++; #skipping TABLE line
- $tagnum = 0;
- for (;$i < $#data;$i++) {
- my $line = $data[$i];
- my ($mnemonic,@which) = split(/ +/,$line);
- my $tag = $insertlist{"$tagnum.tag"};
- for (my $j=0;$j <=$#which;$j++) {
- if ( $which[$j] eq 'Y' ) {
- if ($insertlist{"$j.show"} ne 'no') {
- push(@{ $insertlist{"$tag.which"} },$j);
+
+ # parse the allows and ignore tags set to no
+ foreach my $tag (@alltags) {
+ next if (!exists($insertlist{"$tag.allow"}));
+ my $allow = $insertlist{"$tag.allow"};
+ foreach my $element (split(',',$allow)) {
+ $element =~ s/(^\s*|\s*$ )//gx;
+ if (!exists($insertlist{"$element.show"})
+ || $insertlist{"$element.show"} ne 'no') {
+ push(@{ $insertlist{$tag.'.which'} },$element);
+ }
}
- }
}
- $tagnum++;
- }
+}
+
+sub register_insert {
+ return ®ister_insert_xml(@_);
+# &dump_insertlist('2');
+}
+
+sub dump_insertlist {
+ my ($ext) = @_;
+ open(XML,">/tmp/insertlist.xml.$ext");
+ print XML ("");
+ my $i=0;
+
+ while (exists($insertlist{"$i.tag"})) {
+ my $tag = $insertlist{"$i.tag"};
+ print XML ("
+\t");
+ if (defined($insertlist{"$tag.description"})) {
+ print XML ("
+\t\t".$insertlist{"$tag.description"}."");
+ }
+ if (defined($insertlist{"$tag.color"})) {
+ print XML ("
+\t\t".$insertlist{"$tag.color"}."");
+ }
+ if (defined($insertlist{"$tag.function"})) {
+ print XML ("
+\t\t".$insertlist{"$tag.function"}."");
+ }
+ if (defined($insertlist{"$tag.show"})
+ && $insertlist{"$tag.show"} ne 'yes') {
+ print XML ("
+\t\t".$insertlist{"$tag.show"}."");
+ }
+ if (defined($insertlist{"$tag.helpfile"})) {
+ print XML ("
+\t\t
+\t\t\t".$insertlist{"$tag.helpfile"}."");
+ if ($insertlist{"$tag.helpdesc"} ne '') {
+ print XML ("
+\t\t\t".$insertlist{"$tag.helpdesc"}."");
+ }
+ print XML ("
+\t\t");
+ }
+ if (defined($insertlist{"$tag.which"})) {
+ print XML ("
+\t\t".join(',',sort(@{ $insertlist{"$tag.which"} }))."");
+ }
+ print XML ("
+\t");
+ $i++;
+ }
+ print XML ("\n\n");
+ close(XML);
}
sub description {
- 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.'.description'};
+ my ($token)=@_;
+ my $tag = &get_tag($token);
+ return $insertlist{$tag.'.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'});
+ my ($token)=@_;
+ my $tag = &get_tag($token);
+ return ($insertlist{$tag.'.helpfile'}, $insertlist{$tag.'.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)=
- &Apache::loncommon::get_env_multiple('form.grade_courseid');
- my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid);
- if (!$allowed &&
- exists($env{'request.course.sec'}) &&
- $env{'request.course.sec'} !~ /^\s*$/) {
- $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid.
- '/'.$env{'request.course.sec'});
- }
- if ($allowed) {
- ($symb)=&Apache::loncommon::get_env_multiple('form.grade_symb');
- $courseid=$tmp_courseid;
- ($domain)=&Apache::loncommon::get_env_multiple('form.grade_domain');
- ($name)=&Apache::loncommon::get_env_multiple('form.grade_username');
- return ($symb,$courseid,$domain,$name,$publicuser);
- }
- }
- if (!$passedsymb) {
- $symb=&Apache::lonnet::symbread();
- } else {
- $symb=$passedsymb;
- }
- $courseid=$env{'request.course.id'};
- $domain=$env{'user.domain'};
- $name=$env{'user.name'};
- if ($name eq 'public' && $domain eq 'public') {
- if (!defined($env{'form.username'})) {
- $env{'form.username'}.=time.rand(10000000);
- }
- $name.=$env{'form.username'};
- }
- return ($symb,$courseid,$domain,$name,$publicuser);
+sub get_tag {
+ my ($token)=@_;
+ my $tagnum;
+ my $tag=$token->[1];
+ foreach my $namespace (reverse(@Apache::lonxml::namespace)) {
+ my $testtag = $namespace.'::'.$tag;
+ $tagnum = $insertlist{"$testtag.num"};
+ last if (defined($tagnum));
+ }
+ if (!defined($tagnum)) {
+ $tagnum = $Apache::lonxml::insertlist{"$tag.num"};
+ }
+ return $insertlist{"$tagnum.tag"};
}
1;