--- loncom/xml/lonxml.pm 2007/04/07 01:21:59 1.443
+++ loncom/xml/lonxml.pm 2007/09/05 01:03:21 1.449.2.1
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.443 2007/04/07 01:21:59 albertel Exp $
+# $Id: lonxml.pm,v 1.449.2.1 2007/09/05 01:03:21 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,6 +42,7 @@ package Apache::lonxml;
use vars
qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount);
use strict;
+use LONCAPA;
use HTML::LCParser();
use HTML::TreeBuilder();
use HTML::Entities();
@@ -124,6 +125,9 @@ $evaluate = 1;
# stores the list of active tag namespaces
@namespace=();
+# stores all Scrit Vars displays for later showing
+my @script_var_displays=();
+
# a pointer the the Apache request object
$Apache::lonxml::request='';
@@ -315,13 +319,14 @@ sub xmlparse {
}
}
}
- } elsif ($env{'construct.style'} && ($env{'request.state'} eq 'construct')) {
+ } elsif ($env{'construct.style'}
+ && ($env{'request.state'} eq 'construct')) {
my $location=&Apache::lonnet::filelocation('',$env{'construct.style'});
my $styletext=&Apache::lonnet::getfile($location);
- if ($styletext ne '-1') {
- %style_for_target = (%style_for_target,
- &Apache::style::styleparser($target,$styletext));
- }
+ if ($styletext ne '-1') {
+ %style_for_target = (%style_for_target,
+ &Apache::style::styleparser($target,$styletext));
+ }
}
#&printalltags();
my @pars = ();
@@ -356,6 +361,11 @@ sub xmlparse {
&clean_safespace($safeeval);
+ if (@script_var_displays) {
+ $finaloutput .= join('',@script_var_displays);
+ undef(@script_var_displays);
+ }
+
if ($env{'form.return_only_error_and_warning_counts'}) {
return "$errorcount:$warningcount";
}
@@ -598,9 +608,9 @@ sub callsub {
}
}
if ($token->[0] eq 'S') {
- $currentstring.=&Apache::edit::handle_insert();
+ $currentstring.=&Apache::edit::handle_insert();
} elsif ($token->[0] eq 'E') {
- $currentstring.=&Apache::edit::handle_insertafter($token->[1]);
+ $currentstring.=&Apache::edit::handle_insertafter($token->[1]);
}
}
}
@@ -619,6 +629,7 @@ sub setup_globals {
&init_counter();
@Apache::lonxml::pwd=();
@Apache::lonxml::extlinks=();
+ @script_var_displays=();
@Apache::lonxml::ssi_info=();
$Apache::lonxml::post_evaluate=1;
$Apache::lonxml::warnings_error_header='';
@@ -957,8 +968,8 @@ sub decreasedepth {
sub get_id {
my ($parstack,$safeeval)=@_;
my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
- if ($env{'request.state'} eq 'construct' && $id =~ /(\.|_)/) {
- &error(&mt("IDs are not allowed to contain "_" or ".""));
+ if ($env{'request.state'} eq 'construct' && $id =~ /([._]|[^\w\d\s[:punct:]])/) {
+ &error(&mt("ID "[_1]" contains invalid characters, IDs are only allowed to contain letters, numbers, spaces and -",''.$id.''));
}
if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; }
return $id;
@@ -996,6 +1007,24 @@ sub get_all_text_unbalanced {
return $result
}
+=pod
+
+For bubble grading mode and exam bubble printing mode, the tracking of
+the current 'bubble line number' is stored in the %env element
+'form.counter', and is modifed and handled by the following routines.
+
+The value of it is stored in $Apache:lonxml::counter when live and
+stored back to env after done.
+
+=item &increment_counter($increment);
+
+Increments the internal counter environment variable a specified amount
+
+Optional Arguments:
+ $increment - amount to increment by (defaults to 1)
+
+=cut
+
sub increment_counter {
my ($increment) = @_;
if (defined($increment) && $increment gt 0) {
@@ -1006,6 +1035,14 @@ sub increment_counter {
$Apache::lonxml::counter_changed=1;
}
+=pod
+
+=item &init_counter($increment);
+
+Initialize the internal counter environment variable
+
+=cut
+
sub init_counter {
if ($env{'request.state'} eq 'construct') {
$Apache::lonxml::counter=1;
@@ -1208,7 +1245,7 @@ sub writeallows {
my %httpref=();
foreach (@extlinks) {
$httpref{'httpref.'.
- &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl;
+ &Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl;
}
@extlinks=();
&Apache::lonnet::appenv(%httpref);
@@ -1227,6 +1264,12 @@ sub do_registered_ssi {
&Apache::lonnet::ssi($url,%form);
}
}
+
+sub add_script_result {
+ my ($display) = @_;
+ push(@script_var_displays, $display);
+}
+
#
# Afterburner handles anchors, highlights and links
#
@@ -1471,9 +1514,13 @@ ENDNOTFOUND
['editmode']);
}
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{'form.rawmode'}) { $result = $filecontents; }
@@ -1743,10 +1790,12 @@ sub register_insert_xml {
# 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 ($insertlist{"$element.show"} ne 'no') {
+ if (!exists($insertlist{"$element.show"})
+ || $insertlist{"$element.show"} ne 'no') {
push(@{ $insertlist{$tag.'.which'} },$element);
}
}