version 1.471, 2008/02/15 12:59:50
|
version 1.492, 2009/04/13 20:15:44
|
Line 37
|
Line 37
|
# to any other parties under any circumstances. |
# to any other parties under any circumstances. |
# |
# |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::lonxml |
|
|
|
=head1 SYNOPSIS |
|
|
|
XML Parsing Module |
|
|
|
This is part of the LearningOnline Network with CAPA project |
|
described at http://www.lon-capa.org. |
|
|
|
|
|
=head1 SUBROUTINES |
|
|
|
=cut |
|
|
|
|
|
|
package Apache::lonxml; |
package Apache::lonxml; |
use vars |
use vars |
Line 361 sub xmlparse {
|
Line 380 sub xmlparse {
|
$safeeval,\%style_for_target,1); |
$safeeval,\%style_for_target,1); |
|
|
if (@stack) { |
if (@stack) { |
&warning("At end of file some tags were still left unclosed, ". |
&warning(&mt('At end of file some tags were still left unclosed:'). |
'<tt><'.join('></tt>, <tt><',reverse(@stack)). |
' <tt><'.join('></tt>, <tt><',reverse(@stack)). |
'></tt>'); |
'></tt>'); |
} |
} |
if ($env{'request.uri'}) { |
if ($env{'request.uri'}) { |
Line 379 sub xmlparse {
|
Line 398 sub xmlparse {
|
} |
} |
&init_state(); |
&init_state(); |
if ($env{'form.return_only_error_and_warning_counts'}) { |
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 "$errorcount:$warningcount"; |
} |
} |
return $finaloutput; |
return $finaloutput; |
Line 482 sub inner_xmlparse {
|
Line 505 sub inner_xmlparse {
|
while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) { |
while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) { |
my $lasttag=$$stack[-1]; |
my $lasttag=$$stack[-1]; |
if ($token->[1] =~ /^\Q$lasttag\E$/i) { |
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; |
last; |
} else { |
} 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); |
&end_tag($stack,$parstack,$token); |
} |
} |
} |
} |
Line 501 sub inner_xmlparse {
|
Line 524 sub inner_xmlparse {
|
if (!$Apache::lonxml::usestyle) { |
if (!$Apache::lonxml::usestyle) { |
$extras=$Apache::lonxml::style_values; |
$extras=$Apache::lonxml::style_values; |
} |
} |
if ( $#$parstack > -1 ) { |
if ( $#$parstack > -1 ) { |
$result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]); |
$result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]); |
} else { |
} else { |
$result= &Apache::run::evaluate($result,$safeeval,$extras); |
$result= &Apache::run::evaluate($result,$safeeval,$extras); |
} |
} |
} |
} |
$Apache::lonxml::post_evaluate=1; |
$Apache::lonxml::post_evaluate=1; |
|
|
Line 654 sub setup_globals {
|
Line 677 sub setup_globals {
|
$Apache::lonxml::request=$request; |
$Apache::lonxml::request=$request; |
$errorcount=0; |
$errorcount=0; |
$warningcount=0; |
$warningcount=0; |
|
$Apache::lonxml::internal_error=0; |
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::usestyle=1; |
$Apache::lonxml::usestyle=1; |
&init_counter(); |
&init_counter(); |
Line 714 sub init_safespace {
|
Line 738 sub init_safespace {
|
$safeeval->permit(":base_math"); |
$safeeval->permit(":base_math"); |
$safeeval->permit("sort"); |
$safeeval->permit("sort"); |
$safeeval->permit("time"); |
$safeeval->permit("time"); |
|
$safeeval->permit("caller"); |
$safeeval->deny("rand"); |
$safeeval->deny("rand"); |
$safeeval->deny("srand"); |
$safeeval->deny("srand"); |
$safeeval->deny(":base_io"); |
$safeeval->deny(":base_io"); |
Line 733 sub init_safespace {
|
Line 758 sub init_safespace {
|
$safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval, |
$safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval, |
'&capa_formula_fix'); |
'&capa_formula_fix'); |
|
|
|
$safehole->wrap(\&Apache::lonlocal::locallocaltime,$safeeval, |
|
'&locallocaltime'); |
|
|
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); |
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); |
$safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos'); |
$safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos'); |
$safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan'); |
$safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan'); |
Line 1076 Optional Arguments:
|
Line 1104 Optional Arguments:
|
|
|
sub increment_counter { |
sub increment_counter { |
my ($increment, $part_response) = @_; |
my ($increment, $part_response) = @_; |
|
if ($env{'form.grade_noincrement'}) { return; } |
if (!defined($increment) || $increment le 0) { |
if (!defined($increment) || $increment le 0) { |
$increment = 1; |
$increment = 1; |
} |
} |
Line 1117 sub init_counter {
|
Line 1146 sub init_counter {
|
} |
} |
|
|
sub store_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; |
$Apache::lonxml::counter_changed=0; |
return ''; |
return ''; |
} |
} |
Line 1138 sub store_counter {
|
Line 1167 sub store_counter {
|
|
|
sub restore_problem_counter { |
sub restore_problem_counter { |
if (defined($state)) { |
if (defined($state)) { |
&Apache::lonnet::appenv(('form.counter' => $state)); |
&Apache::lonnet::appenv({'form.counter' => $state}); |
} |
} |
} |
} |
sub get_problem_counter { |
sub get_problem_counter { |
Line 1375 sub writeallows {
|
Line 1404 sub writeallows {
|
&Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl; |
&Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl; |
} |
} |
@extlinks=(); |
@extlinks=(); |
&Apache::lonnet::appenv(%httpref); |
&Apache::lonnet::appenv(\%httpref); |
} |
} |
|
|
sub register_ssi { |
sub register_ssi { |
Line 1442 sub storefile {
|
Line 1471 sub storefile {
|
$fh->close(); |
$fh->close(); |
return 1; |
return 1; |
} else { |
} else { |
&warning("Unable to save file $file"); |
&warning(&mt('Unable to save file [_1]','<tt>'.$file.'</tt>')); |
return 0; |
return 0; |
} |
} |
} |
} |
Line 1475 SIMPLECONTENT
|
Line 1504 SIMPLECONTENT
|
return $filecontents; |
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 |
|
'<span class="LC_nobreak">'. |
|
&mt('Language:').' '. |
|
&Apache::loncommon::select_form($env{'form.languages'},'languages', |
|
%langchoices).' |
|
</span> |
|
<span class="LC_nobreak">'. |
|
&mt('Math Rendering:').' '. |
|
&Apache::loncommon::select_form($env{'form.texengine'},'texengine', |
|
('' => '', |
|
'tth' => 'tth (TeX to HTML)', |
|
'jsMath' => 'jsMath', |
|
'mimetex' => 'mimetex (Convert to Images)')).' |
|
</span>'; |
|
} |
|
|
sub inserteditinfo { |
sub inserteditinfo { |
my ($filecontents, $filetype, $filename)=@_; |
my ($filecontents, $filetype, $filename)=@_; |
$filecontents = &HTML::Entities::encode($filecontents,'<>&"'); |
$filecontents = &HTML::Entities::encode($filecontents,'<>&"'); |
# my $editheader='<a href="#editsection">Edit below</a><hr />'; |
|
my $xml_help = ''; |
my $xml_help = ''; |
my $initialize=''; |
my $initialize=''; |
my $textarea_id = 'filecont'; |
my $textarea_id = 'filecont'; |
|
my $dragmath_button; |
my ($add_to_onload, $add_to_onresize); |
my ($add_to_onload, $add_to_onresize); |
$initialize=&Apache::lonhtmlcommon::spellheader(); |
$initialize=&Apache::lonhtmlcommon::spellheader(); |
if ($filetype eq 'html' |
if ($filetype eq 'html' |
Line 1520 FULLPAGE
|
Line 1589 FULLPAGE
|
} |
} |
</script> |
</script> |
FULLPAGE |
FULLPAGE |
|
if ($filetype eq 'html') { |
|
$initialize .= "\n".&Apache::lonhtmlcommon::dragmath_js('EditMathPopup'); |
|
$dragmath_button = &Apache::lonhtmlcommon::dragmath_button('filecont',1); |
|
} |
} |
} |
|
|
$add_to_onload = 'initDocument();'; |
$add_to_onload = 'initDocument();'; |
Line 1538 FULLPAGE
|
Line 1611 FULLPAGE
|
my $spelllink .=&Apache::lonhtmlcommon::spelllink('xmledit','filecont'); |
my $spelllink .=&Apache::lonhtmlcommon::spelllink('xmledit','filecont'); |
my $textarea_events = &Apache::edit::element_change_detection(); |
my $textarea_events = &Apache::edit::element_change_detection(); |
my $form_events = &Apache::edit::form_change_detection(); |
my $form_events = &Apache::edit::form_change_detection(); |
|
my $htmlerror; |
|
if ($filetype eq 'html') { |
|
$htmlerror=&verify_html($filecontents); |
|
if ($htmlerror) { |
|
$htmlerror='<span class="LC_error">'.$htmlerror.'</span>'; |
|
} |
|
} |
my $editfooter=(<<ENDFOOTER); |
my $editfooter=(<<ENDFOOTER); |
$initialize |
$initialize |
<a name="editsection" /> |
<a name="editsection" /> |
Line 1552 $initialize
|
Line 1632 $initialize
|
<div class="LC_edit_problem_discards"> |
<div class="LC_edit_problem_discards"> |
<input type="submit" name="discardview" accesskey="d" value="$lt{'dv'}" /> |
<input type="submit" name="discardview" accesskey="d" value="$lt{'dv'}" /> |
<input type="submit" name="Undo" accesskey="u" value="$lt{'un'}" /> |
<input type="submit" name="Undo" accesskey="u" value="$lt{'un'}" /> |
$spelllink |
$dragmath_button $spelllink $htmlerror |
</div> |
</div> |
<div class="LC_edit_problem_saves"> |
<div class="LC_edit_problem_saves"> |
<input type="submit" name="savethisfile" accesskey="s" value="$lt{'st'}" /> |
<input type="submit" name="savethisfile" accesskey="s" value="$lt{'st'}" /> |
Line 1629 sub handler {
|
Line 1709 sub handler {
|
if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) { |
if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) { |
my $html_file=&Apache::lonnet::getfile($file); |
my $html_file=&Apache::lonnet::getfile($file); |
my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'}); |
my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'}); |
|
if ($env{'form.savethisfile'}) { |
|
$env{'form.editmode'}='Edit'; #force edit mode |
|
} |
} |
} |
} |
} |
my %mystyle; |
my %mystyle; |
Line 1735 sub display_title {
|
Line 1818 sub display_title {
|
$title = $env{'request.filename'}; |
$title = $env{'request.filename'}; |
$title = substr($title, rindex($title, '/') + 1); |
$title = substr($title, rindex($title, '/') + 1); |
} |
} |
$result = "<script type='text/javascript'>top.document.title = '$title - LON-CAPA Construction Space';</script>"; |
$result = "<script type='text/javascript'>top.document.title = '$title - LON-CAPA " |
|
.&mt('Construction Space')."';</script>"; |
} |
} |
return $result; |
return $result; |
} |
} |
Line 1772 sub error {
|
Line 1856 sub error {
|
|
|
$errorcount++; |
$errorcount++; |
|
|
|
$Apache::lonxml::internal_error=1; |
|
|
if (defined($Apache::inputtags::part)) { |
if (defined($Apache::inputtags::part)) { |
if ( @Apache::inputtags::response ) { |
if ( @Apache::inputtags::response ) { |
push(@errors, |
push(@errors, |
Line 1788 sub error {
|
Line 1874 sub error {
|
if ( &show_error_warn_msg() ) { |
if ( &show_error_warn_msg() ) { |
# If printing in construction space, put the error inside <pre></pre> |
# If printing in construction space, put the error inside <pre></pre> |
push(@Apache::lonxml::error_messages, |
push(@Apache::lonxml::error_messages, |
$Apache::lonxml::warnings_error_header. |
$Apache::lonxml::warnings_error_header |
"<b>ERROR:</b>".join("<br />\n",@errors)."<br />\n"); |
.'<div class="LC_error">' |
|
.'<b>'.&mt('ERROR:').' </b>'.join("<br />\n",@errors) |
|
."</div>\n"); |
$Apache::lonxml::warnings_error_header=''; |
$Apache::lonxml::warnings_error_header=''; |
} else { |
} else { |
my $errormsg; |
my $errormsg; |
my ($symb)=&Apache::lonnet::symbread(); |
my ($symb)=&Apache::lonnet::symbread(); |
if ( !$symb ) { |
if ( !$symb ) { |
#public or browsers |
#public or browsers |
$errormsg=&mt("An error occured while processing this resource. The author has been notified."); |
$errormsg=&mt("An error occurred while processing this resource. The author has been notified."); |
} |
} |
my $host=$Apache::lonnet::perlvar{'lonHostID'}; |
my $host=$Apache::lonnet::perlvar{'lonHostID'}; |
push(@errors, "The error occurred on host <tt>$host</tt>"); |
push(@errors, |
|
&mt("The error occurred on host [_1]", |
|
"<tt>$host</tt>")); |
|
|
my $msg = join('<br />', @errors); |
my $msg = join('<br />', @errors); |
|
|
Line 1833 sub error {
|
Line 1923 sub error {
|
} |
} |
} |
} |
if ($env{'request.role.adv'}) { |
if ($env{'request.role.adv'}) { |
$errormsg=&mt("An error occured while processing this resource. The course personnel ([_1]) and the author have been notified.",join(', ',@userlist)); |
$errormsg=&mt("An error occurred while processing this resource. The course personnel ([_1]) and the author have been notified.",join(', ',@userlist)); |
} else { |
} else { |
$errormsg=&mt("An error occured while processing this resource. The instructor has been notified."); |
$errormsg=&mt("An error occurred while processing this resource. The instructor has been notified."); |
} |
} |
} |
} |
push(@Apache::lonxml::error_messages,"<b>$errormsg</b> <br />"); |
push(@Apache::lonxml::error_messages,"<b>$errormsg</b> <br />"); |
Line 1848 sub warning {
|
Line 1938 sub warning {
|
if ($env{'form.grade_target'} ne 'tex') { |
if ($env{'form.grade_target'} ne 'tex') { |
if ( &show_error_warn_msg() ) { |
if ( &show_error_warn_msg() ) { |
push(@Apache::lonxml::warning_messages, |
push(@Apache::lonxml::warning_messages, |
$Apache::lonxml::warnings_error_header. |
$Apache::lonxml::warnings_error_header |
"<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n"); |
.'<div class="LC_warning">' |
|
.&mt('[_1]W[_2]ARNING','<b>','</b>')."<b>:</b> ".join('<br />',@_) |
|
."</div>\n" |
|
); |
$Apache::lonxml::warnings_error_header=''; |
$Apache::lonxml::warnings_error_header=''; |
} |
} |
} |
} |
Line 2074 sub get_tag {
|
Line 2167 sub get_tag {
|
return $insertlist{"$tagnum.tag"}; |
return $insertlist{"$tagnum.tag"}; |
} |
} |
|
|
|
############################################################ |
|
# PDF-FORM-METHODS |
|
|
|
=pod |
|
|
|
=item &print_pdf_radiobutton(fieldname, value, text) |
|
|
|
Returns a latexline to generate a PDF-Form-Radiobutton with Text. |
|
|
|
$fieldname: PDF internalname of the radiobutton |
|
$value: Value of radiobutton (read when dumping the PDF data) |
|
$text: Text on the rightside of the radiobutton |
|
|
|
=cut |
|
sub print_pdf_radiobutton { |
|
my $result = ''; |
|
my ($fieldName, $value, $text) = @_; |
|
$result .= '\begin{tabularx}{\textwidth}{p{0cm}X}'."\n"; |
|
$result .= '\radioButton[\symbolchoice{circle}]{'. |
|
$fieldName.'}{10bp}{10bp}{'.$value.'}&'.$text."\n"; |
|
$result .= '\end{tabularx}' . "\n"; |
|
$result .= '\hspace{2mm}' . "\n"; |
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_start_combobox(fieldname) |
|
|
|
Starts a latexline to generate a PDF-Form-Combobox with text. |
|
|
|
$fieldname: PDF internal name of the Combobox |
|
|
|
=cut |
|
sub print_pdf_start_combobox { |
|
my $result; |
|
my ($fieldName) = @_; |
|
$result .= '\begin{tabularx}{\textwidth}{p{2.5cm}X}'."\n"; |
|
$result .= '\comboBox[]{'.$fieldName.'}{2.3cm}{14bp}{'; # |
|
|
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_add_combobox_option(options) |
|
|
|
Generates a latexline to add Options to a PDF-Form-ComboBox. |
|
|
|
$option: PDF internal name of the Combobox-Option |
|
|
|
=cut |
|
sub print_pdf_add_combobox_option { |
|
|
|
my $result; |
|
my ($option) = @_; |
|
|
|
$result .= '('.$option.')'; |
|
|
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_end_combobox(text) { |
|
|
|
Returns latexcode to end a PDF-Form-Combobox with text. |
|
|
|
=cut |
|
sub print_pdf_end_combobox { |
|
my $result; |
|
my ($text) = @_; |
|
|
|
$result .= '}&'.$text."\\\\\n"; |
|
$result .= '\end{tabularx}' . "\n"; |
|
$result .= '\hspace{2mm}' . "\n"; |
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_hiddenField(fieldname, user, domain) |
|
|
|
Returns a latexline to generate a PDF-Form-hiddenField with userdata. |
|
|
|
$fieldname label for hiddentextfield |
|
$user: name of user |
|
$domain: domain of user |
|
|
|
=cut |
|
sub print_pdf_hiddenfield { |
|
my $result; |
|
my ($fieldname, $user, $domain) = @_; |
|
|
|
$result .= '\textField [\F{\FHidden}\F{-\FPrint}\V{'.$domain.'&'.$user.'}]{'.$fieldname.'}{0in}{0in}'."\n"; |
|
|
|
return $result; |
|
} |
|
|
1; |
1; |
__END__ |
__END__ |
|
|
|
|