version 1.484.2.2, 2008/10/24 19:36:40
|
version 1.494.4.3, 2010/01/28 18:46:47
|
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 90 use Apache::lonfeedback();
|
Line 109 use Apache::lonfeedback();
|
use Apache::lonmsg(); |
use Apache::lonmsg(); |
use Apache::loncacc(); |
use Apache::loncacc(); |
use Apache::lonmaxima(); |
use Apache::lonmaxima(); |
|
use Apache::lonr(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
|
#==================================== Main subroutine: xmlparse |
#==================================== Main subroutine: xmlparse |
Line 505 sub inner_xmlparse {
|
Line 525 sub inner_xmlparse {
|
if (!$Apache::lonxml::usestyle) { |
if (!$Apache::lonxml::usestyle) { |
$extras=$Apache::lonxml::style_values; |
$extras=$Apache::lonxml::style_values; |
} |
} |
if ($token->[1] ne 'translated') { |
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 660 sub setup_globals {
|
Line 678 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 737 sub init_safespace {
|
Line 756 sub init_safespace {
|
$safehole->wrap(\&Apache::lonmaxima::maxima_cas_formula_fix,$safeeval, |
$safehole->wrap(\&Apache::lonmaxima::maxima_cas_formula_fix,$safeeval, |
'&maxima_cas_formula_fix'); |
'&maxima_cas_formula_fix'); |
|
|
|
$safehole->wrap(\&Apache::lonr::r_eval,$safeeval,'&r_eval'); |
|
$safehole->wrap(\&Apache::lonr::Rentry,$safeeval,'&Rentry'); |
|
$safehole->wrap(\&Apache::lonr::Rarray,$safeeval,'&Rarray'); |
|
$safehole->wrap(\&Apache::lonr::r_check,$safeeval,'&r_check'); |
|
$safehole->wrap(\&Apache::lonr::r_cas_formula_fix,$safeeval, |
|
'&r_cas_formula_fix'); |
|
|
$safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval, |
$safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval, |
'&capa_formula_fix'); |
'&capa_formula_fix'); |
|
|
Line 1017 sub get_id {
|
Line 1043 sub get_id {
|
my ($parstack,$safeeval)=@_; |
my ($parstack,$safeeval)=@_; |
my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval); |
my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval); |
if ($env{'request.state'} eq 'construct' && $id =~ /([._]|[^\w\d\s[:punct:]])/) { |
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 -",'<tt>'.$id.'</tt>')); |
&error(&mt("ID [_1] contains invalid characters, IDs are only allowed to contain letters, numbers, spaces and -",'<tt>'.$id.'</tt>')); |
} |
} |
if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; } |
if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; } |
return $id; |
return $id; |
Line 1486 SIMPLECONTENT
|
Line 1512 SIMPLECONTENT
|
return $filecontents; |
return $filecontents; |
} |
} |
|
|
|
sub createnewjs { |
|
my $filecontents=(<<SIMPLECONTENT); |
|
<script type="text/javascript" language="Javascript"> |
|
|
|
</script> |
|
SIMPLECONTENT |
|
return $filecontents; |
|
} |
|
|
sub verify_html { |
sub verify_html { |
my ($filecontents)=@_; |
my ($filecontents)=@_; |
if ($filecontents!~/(?:\<|\<\;)(?:html|xml)[^\<]*(?:\>|\>\;)/is) { |
if ($filecontents!~/(?:\<|\<\;)(?:html|xml)[^\<]*(?:\>|\>\;)/is) { |
Line 1511 sub renderingoptions {
|
Line 1546 sub renderingoptions {
|
= &Apache::loncommon::plainlanguagedescription($_); |
= &Apache::loncommon::plainlanguagedescription($_); |
} |
} |
} |
} |
return |
my $output; |
'<span class="LC_nobreak">'. |
unless ($env{'form.forceedit'}) { |
&mt('Language:').' '. |
$output .= |
&Apache::loncommon::select_form($env{'form.languages'},'languages', |
'<span class="LC_nobreak">'. |
%langchoices).' |
&mt('Language:').' '. |
</span> |
&Apache::loncommon::select_form( |
<span class="LC_nobreak">'. |
$env{'form.languages'}, |
|
'languages', |
|
&Apache::lonlocal::texthash(%langchoices)). |
|
'</span>'; |
|
} |
|
$output .= |
|
' <span class="LC_nobreak">'. |
&mt('Math Rendering:').' '. |
&mt('Math Rendering:').' '. |
&Apache::loncommon::select_form($env{'form.texengine'},'texengine', |
&Apache::loncommon::select_form( |
('' => '', |
$env{'form.texengine'}, |
'tth' => 'tth (TeX to HTML)', |
'texengine', |
'jsMath' => 'jsMath', |
&Apache::lonlocal::texthash |
'mimetex' => 'mimetex (Convert to Images)')).' |
('' => '', |
</span>'; |
'tth' => 'tth (TeX to HTML)', |
|
'jsMath' => 'jsMath', |
|
'mimetex' => 'mimetex (Convert to Images)')). |
|
'</span>'; |
|
return $output; |
} |
} |
|
|
sub inserteditinfo { |
sub inserteditinfo { |
Line 1533 sub inserteditinfo {
|
Line 1578 sub inserteditinfo {
|
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 1570 FULLPAGE
|
Line 1616 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 1588 FULLPAGE
|
Line 1638 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=&verify_html($filecontents); |
my $htmlerror; |
if ($htmlerror) { |
if ($filetype eq 'html') { |
$htmlerror='<span class="LC_error">'.$htmlerror.'</span>'; |
$htmlerror=&verify_html($filecontents); |
|
if ($htmlerror) { |
|
$htmlerror='<span class="LC_error">'.$htmlerror.'</span>'; |
|
} |
} |
} |
my $editfooter=(<<ENDFOOTER); |
my $editfooter=(<<ENDFOOTER); |
$initialize |
$initialize |
Line 1606 $initialize
|
Line 1659 $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 $htmlerror |
$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 1653 sub get_target {
|
Line 1706 sub get_target {
|
|
|
sub handler { |
sub handler { |
my $request=shift; |
my $request=shift; |
|
|
my $target=&get_target(); |
my $target=&get_target(); |
|
|
$Apache::lonxml::debug=$env{'user.debug'}; |
$Apache::lonxml::debug=$env{'user.debug'}; |
|
|
&Apache::loncommon::content_type($request,'text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
Line 1664 sub handler {
|
Line 1716 sub handler {
|
$request->set_last_modified(&Apache::lonnet::metadata($request->uri, |
$request->set_last_modified(&Apache::lonnet::metadata($request->uri, |
'lastrevisiondate')); |
'lastrevisiondate')); |
} |
} |
|
# Embedded Flash movies (e.g., from Camtasia) served from https will not display in IE |
|
# if XML config file has expired from cache. |
|
if ($ENV{'SERVER_PORT'} == 443) { |
|
if ($request->uri =~ /\.xml$/) { |
|
my ($httpbrowser,$clientbrowser) = |
|
&Apache::loncommon::decode_user_agent($request); |
|
if ($clientbrowser =~ /^explorer$/i) { |
|
delete $request->headers_out->{'Cache-control'}; |
|
delete $request->headers_out->{'Pragma'}; |
|
my $expiration = time + 60; |
|
my $date=strftime("%a, %d %b %Y %H:%M:%S GMT",gmtime($expiration)); |
|
$request->headers_out->set("Expires" => $date); |
|
} |
|
} |
|
} |
$request->send_http_header; |
$request->send_http_header; |
|
|
return OK if $request->header_only; |
return OK if $request->header_only; |
Line 1671 sub handler {
|
Line 1738 sub handler {
|
|
|
my $file=&Apache::lonnet::filelocation("",$request->uri); |
my $file=&Apache::lonnet::filelocation("",$request->uri); |
my $filetype; |
my $filetype; |
if ($file =~ /\.sty$/) { |
if ($file =~ /\.(sty|css|js|txt)$/) { |
$filetype='sty'; |
$filetype=$1; |
} else { |
} else { |
$filetype='html'; |
$filetype='html'; |
} |
} |
|
|
# |
# |
# Edit action? Save file. |
# Edit action? Save file. |
# |
# |
Line 1704 ENDNOTFOUND
|
Line 1772 ENDNOTFOUND
|
if ($env{'request.state'} ne 'published') { |
if ($env{'request.state'} ne 'published') { |
if ($filetype eq 'sty') { |
if ($filetype eq 'sty') { |
$filecontents=&createnewsty(); |
$filecontents=&createnewsty(); |
} else { |
} elsif ($filetype eq 'js') { |
|
$filecontents=&createnewjs(); |
|
} elsif (($filetype ne 'css') && ($filetype ne 'txt')) { |
$filecontents=&createnewhtml(); |
$filecontents=&createnewhtml(); |
} |
} |
$env{'form.editmode'}='Edit'; #force edit mode |
$env{'form.editmode'}='Edit'; #force edit mode |
Line 1720 ENDNOTFOUND
|
Line 1790 ENDNOTFOUND
|
['editmode']); |
['editmode']); |
} |
} |
if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) { |
if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) { |
&Apache::structuretags::reset_problem_globals(); |
if ($filetype eq 'html' || $filetype eq 'sty') { |
$result = &Apache::lonxml::xmlparse($request,$target,$filecontents, |
&Apache::structuretags::reset_problem_globals(); |
'',%mystyle); |
$result = &Apache::lonxml::xmlparse($request,$target, |
|
$filecontents,'',%mystyle); |
# .html files may contain <problem> or <Task> need to clean |
# .html files may contain <problem> or <Task> need to clean |
# up if it did |
# up if it did |
&Apache::structuretags::reset_problem_globals(); |
&Apache::structuretags::reset_problem_globals(); |
&Apache::lonhomework::finished_parsing(); |
&Apache::lonhomework::finished_parsing(); |
|
} else { |
|
$result = $filecontents; |
|
} |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['rawmode']); |
['rawmode']); |
if ($env{'form.rawmode'}) { $result = $filecontents; } |
if ($env{'form.rawmode'}) { $result = $filecontents; } |
if ($filetype eq 'sty') { |
if ($filetype ne 'html') { |
|
my $nochgview = 1; |
my $controls = |
my $controls = |
($env{'request.state'} eq 'construct') ? &Apache::londefdef::edit_controls() |
($env{'request.state'} eq 'construct') ? &Apache::londefdef::edit_controls($nochgview) |
: ''; |
: ''; |
my %options = ('bgcolor' => '#FFFFFF'); |
if ($filetype ne 'sty') { |
$result = |
$result =~ s/</</g; |
&Apache::loncommon::start_page(undef,undef,\%options). |
$result =~ s/>/>/g; |
$controls. |
$result = '<table class="LC_sty_begin">'. |
$result. |
'<tr><td><b><pre>'.$result. |
&Apache::loncommon::end_page(); |
'</pre></b></td></tr></table>'; |
} |
} |
|
if ($env{'environment.remote'} eq 'off') { |
|
my %options = ('bgcolor' => '#FFFFFF'); |
|
$result = |
|
&Apache::loncommon::start_page(undef,undef,\%options). |
|
$controls. |
|
$result. |
|
&Apache::loncommon::end_page(); |
|
} else { |
|
$result = $controls.$result; |
|
} |
|
} |
} |
} |
} |
} |
|
|
Line 1774 ENDNOTFOUND
|
Line 1860 ENDNOTFOUND
|
&Apache::lonxml::message_location(). |
&Apache::lonxml::message_location(). |
$edit_info. |
$edit_info. |
&Apache::loncommon::end_page(); |
&Apache::loncommon::end_page(); |
} |
} |
} |
} |
if ($filetype eq 'html') { &writeallows($request->uri); } |
if ($filetype eq 'html') { &writeallows($request->uri); } |
|
|
Line 1830 sub error {
|
Line 1916 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 2139 sub get_tag {
|
Line 2227 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__ |
|
|
|
|