--- loncom/xml/lonxml.pm 2007/10/16 23:20:05 1.465
+++ loncom/xml/lonxml.pm 2008/12/11 22:19:45 1.484.4.1
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.465 2007/10/16 23:20:05 albertel Exp $
+# $Id: lonxml.pm,v 1.484.4.1 2008/12/11 22:19:45 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -361,8 +361,8 @@ sub xmlparse {
$safeeval,\%style_for_target,1);
if (@stack) {
- &warning("At end of file some tags were still left unclosed, ".
- '<'.join('>, <',reverse(@stack)).
+ &warning(&mt('At end of file some tags were still left unclosed:').
+ ' <'.join('>, <',reverse(@stack)).
'>');
}
if ($env{'request.uri'}) {
@@ -377,8 +377,12 @@ sub xmlparse {
$finaloutput .= join('',@script_var_displays);
undef(@script_var_displays);
}
-
+ &init_state();
if ($env{'form.return_only_error_and_warning_counts'}) {
+ if ($env{'request.filename'}=~/\.(html|htm|xml)$/i) {
+ my $error=&verify_html($content_file_string);
+ if ($error) { $errorcount++; }
+ }
return "$errorcount:$warningcount";
}
return $finaloutput;
@@ -482,10 +486,10 @@ sub inner_xmlparse {
while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
my $lasttag=$$stack[-1];
if ($token->[1] =~ /^\Q$lasttag\E$/i) {
- &Apache::lonxml::warning('Using tag </'.$token->[1].'> on line '.$token->[3].' as end tag to <'.$$stack[-1].'>');
+ &Apache::lonxml::warning(&mt('Using tag [_1] on line [_2] as end tag to [_3]','</'.$token->[1].'>','.$token->[3].','<'.$$stack[-1].'>'));
last;
} else {
- &Apache::lonxml::warning('Found tag </'.$token->[1].'> on line '.$token->[3].' when looking for </'.$$stack[-1].'> in file');
+ &Apache::lonxml::warning(&mt('Found tag [_1] on line [_2] when looking for [_3] in file.','</'.$token->[1].'>',$token->[3],'</'.$$stack[-1].'>'));
&end_tag($stack,$parstack,$token);
}
}
@@ -654,11 +658,13 @@ sub setup_globals {
$Apache::lonxml::request=$request;
$errorcount=0;
$warningcount=0;
+ $Apache::lonxml::internal_error=0;
$Apache::lonxml::default_homework_loaded=0;
$Apache::lonxml::usestyle=1;
&init_counter();
&clear_bubble_lines_for_part();
&init_state();
+ &set_state('target',$target);
@Apache::lonxml::pwd=();
@Apache::lonxml::extlinks=();
@script_var_displays=();
@@ -713,6 +719,7 @@ sub init_safespace {
$safeeval->permit(":base_math");
$safeeval->permit("sort");
$safeeval->permit("time");
+ $safeeval->permit("caller");
$safeeval->deny("rand");
$safeeval->deny("srand");
$safeeval->deny(":base_io");
@@ -722,6 +729,7 @@ sub init_safespace {
$safehole->wrap(\&Apache::chemresponse::chem_standard_order,$safeeval,
'&chem_standard_order');
$safehole->wrap(\&Apache::response::check_status,$safeeval,'&check_status');
+ $safehole->wrap(\&Apache::response::implicit_multiplication,$safeeval,'&implicit_multiplication');
$safehole->wrap(\&Apache::lonmaxima::maxima_eval,$safeeval,'&maxima_eval');
$safehole->wrap(\&Apache::lonmaxima::maxima_check,$safeeval,'&maxima_check');
@@ -731,6 +739,9 @@ sub init_safespace {
$safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval,
'&capa_formula_fix');
+ $safehole->wrap(\&Apache::lonlocal::locallocaltime,$safeeval,
+ '&locallocaltime');
+
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin');
$safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos');
$safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan');
@@ -1066,28 +1077,29 @@ Increments the internal counter environm
Optional Arguments:
$increment - amount to increment by (defaults to 1)
Also 1 if the value is negative or zero.
- $part_id - optional part id.. during analysis, this
- indicates whic part of a problem is being
- counted.
+ $part_response - A concatenation of the part and response id
+ identifying exactly what is being 'answered'.
+
=cut
sub increment_counter {
- my ($increment, $part_id) = @_;
+ my ($increment, $part_response) = @_;
+ if ($env{'form.grade_noincrement'}) { return; }
if (!defined($increment) || $increment le 0) {
$increment = 1;
}
$Apache::lonxml::counter += $increment;
- # If the caller supplied the part_id parameter,
+ # If the caller supplied the response_id parameter,
# Maintain its counter.. creating if necessary.
- if(defined($part_id)) {
- if (!defined($Apache::lonxml::counters_per_part{$part_id})) {
- $Apache::lonxml::counters_per_part{$part_id} = 0;
+ if (defined($part_response)) {
+ if (!defined($Apache::lonxml::counters_per_part{$part_response})) {
+ $Apache::lonxml::counters_per_part{$part_response} = 0;
}
- $Apache::lonxml::counters_per_part{$part_id} += $increment;
- my $new_value = $Apache::lonxml::counters_per_part{$part_id};
+ $Apache::lonxml::counters_per_part{$part_response} += $increment;
+ my $new_value = $Apache::lonxml::counters_per_part{$part_response};
}
$Apache::lonxml::counter_changed=1;
@@ -1115,7 +1127,7 @@ sub init_counter {
}
sub store_counter {
- &Apache::lonnet::appenv(('form.counter' => $Apache::lonxml::counter));
+ &Apache::lonnet::appenv({'form.counter' => $Apache::lonxml::counter});
$Apache::lonxml::counter_changed=0;
return '';
}
@@ -1136,7 +1148,7 @@ sub store_counter {
sub restore_problem_counter {
if (defined($state)) {
- &Apache::lonnet::appenv(('form.counter' => $state));
+ &Apache::lonnet::appenv({'form.counter' => $state});
}
}
sub get_problem_counter {
@@ -1148,22 +1160,21 @@ sub store_counter {
=pod
-=item bubble_lines_for_part(part_id)
+=item bubble_lines_for_part(part_response)
Returns the number of lines required to get a response for
-$part_id (this is just $Apache::lonxml::counters_per_part{$part_id}
+$part_response (this is just $Apache::lonxml::counters_per_part{$part_response}
=cut
sub bubble_lines_for_part {
- my ($part_id) = @_;
+ my ($part_response) = @_;
- if (!defined($Apache::lonxml::counters_per_part{$part_id})) {
+ if (!defined($Apache::lonxml::counters_per_part{$part_response})) {
return 0;
} else {
- return $Apache::lonxml::counters_per_part{$part_id};
+ return $Apache::lonxml::counters_per_part{$part_response};
}
-
}
=pod
@@ -1182,7 +1193,7 @@ sub clear_bubble_lines_for_part {
=pod
-=item set_bubble_lines(part_id, value)
+=item set_bubble_lines(part_response, value)
If there is a problem part, that for whatever reason
requires bubble lines that are not
@@ -1192,9 +1203,9 @@ analysis to set its hash value explicitl
=cut
sub set_bubble_lines {
- my ($part_id, $value) = @_;
+ my ($part_response, $value) = @_;
- $Apache::lonxml::counters_per_part{$part_id} = $value;
+ $Apache::lonxml::counters_per_part{$part_response} = $value;
}
=pod
@@ -1374,7 +1385,7 @@ sub writeallows {
&Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl;
}
@extlinks=();
- &Apache::lonnet::appenv(%httpref);
+ &Apache::lonnet::appenv(\%httpref);
}
sub register_ssi {
@@ -1441,7 +1452,7 @@ sub storefile {
$fh->close();
return 1;
} else {
- &warning("Unable to save file $file");
+ &warning(&mt('Unable to save file [_1]',''.$file.''));
return 0;
}
}
@@ -1474,11 +1485,50 @@ SIMPLECONTENT
return $filecontents;
}
+sub verify_html {
+ my ($filecontents)=@_;
+ if ($filecontents!~/(?:\<|\<\;)(?:html|xml)[^\<]*(?:\>|\>\;)/is) {
+ return &mt('File does not have [_1] or [_2] starting tag','<html>','<xml>');
+ }
+ if ($filecontents!~/(?:\<|\<\;)\/(?:html|xml)(?:\>|\>\;)/is) {
+ return &mt('File does not have [_1] or [_2] ending tag','<html>','<xml>');
+ }
+ if ($filecontents!~/(?:\<|\<\;)(?:body|frameset)[^\<]*(?:\>|\>\;)/is) {
+ return &mt('File does not have [_1] or [_2] starting tag','<body>','<frameset>');
+ }
+ if ($filecontents!~/(?:\<|\<\;)\/(?:body|frameset)[^\<]*(?:\>|\>\;)/is) {
+ return &mt('File does not have [_1] or [_2] ending tag','<body>','<frameset>');
+ }
+ return '';
+}
+
+sub renderingoptions {
+ my %langchoices=('' => '');
+ foreach (&Apache::loncommon::languageids()) {
+ if (&Apache::loncommon::supportedlanguagecode($_)) {
+ $langchoices{&Apache::loncommon::supportedlanguagecode($_)}
+ = &Apache::loncommon::plainlanguagedescription($_);
+ }
+ }
+ return
+ ''.
+ &mt('Language:').' '.
+ &Apache::loncommon::select_form($env{'form.languages'},'languages',
+ %langchoices).'
+
+ '.
+ &mt('Math Rendering:').' '.
+ &Apache::loncommon::select_form($env{'form.texengine'},'texengine',
+ ('' => '',
+ 'tth' => 'tth (TeX to HTML)',
+ 'jsMath' => 'jsMath',
+ 'mimetex' => 'mimetex (Convert to Images)')).'
+ ';
+}
sub inserteditinfo {
- my ($filecontents,$filetype)=@_;
+ my ($filecontents, $filetype, $filename)=@_;
$filecontents = &HTML::Entities::encode($filecontents,'<>&"');
-# my $editheader='Edit below';
my $xml_help = '';
my $initialize='';
my $textarea_id = 'filecont';
@@ -1528,38 +1578,45 @@ FULLPAGE
$xml_help=&Apache::loncommon::helpLatexCheatsheet();
}
- my $cleanbut = '';
-
my $titledisplay=&display_title();
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');
+ my $spelllink .=&Apache::lonhtmlcommon::spelllink('xmledit','filecont');
my $textarea_events = &Apache::edit::element_change_detection();
my $form_events = &Apache::edit::form_change_detection();
+ my $htmlerror=&verify_html($filecontents);
+ if ($htmlerror) {
+ $htmlerror=''.$htmlerror.'';
+ }
my $editfooter=(<