--- loncom/xml/lonxml.pm 2011/05/27 19:07:25 1.519 +++ loncom/xml/lonxml.pm 2013/12/03 16:39:47 1.545 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.519 2011/05/27 19:07:25 raeburn Exp $ +# $Id: lonxml.pm,v 1.545 2013/12/03 16:39:47 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -112,6 +112,8 @@ use Apache::lonmaxima(); use Apache::lonr(); use Apache::lonlocal; use Apache::lonhtmlcommon(); +use Apache::functionplotresponse(); +use Apache::lonnavmaps(); #==================================== Main subroutine: xmlparse @@ -142,7 +144,7 @@ $metamode = 0; # turns on and of run::evaluate actually derefencing var refs $evaluate = 1; -# data structure for eidt mode, determines what tags can go into what other tags +# data structure for edit mode, determines what tags can go into what other tags %insertlist=(); # stores the list of active tag namespaces @@ -209,8 +211,12 @@ sub xmlend { my $discussion; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['LONCAPA_INTERNAL_no_discussion']); - if (! exists($env{'form.LONCAPA_INTERNAL_no_discussion'}) || - $env{'form.LONCAPA_INTERNAL_no_discussion'} ne 'true') { + if ( + ( (!exists($env{'form.LONCAPA_INTERNAL_no_discussion'})) + || ($env{'form.LONCAPA_INTERNAL_no_discussion'} ne 'true') + ) + && ($env{'form.inhibitmenu'} ne 'yes') + ) { $discussion=&Apache::lonfeedback::list_discussion($mode,$status); } if ($target eq 'tex') { @@ -300,7 +306,8 @@ sub xmlparse { &clean_safespace($safeeval); if (@script_var_displays) { - $finaloutput .= join('',@script_var_displays); + my $scriptoutput = join('',@script_var_displays); + $finaloutput=~s{(\s*)\s*$}{$scriptoutput$1}s; undef(@script_var_displays); } &init_state(); @@ -642,9 +649,9 @@ sub setup_globals { sub init_safespace { my ($target,$safeeval,$safehole,$safeinit) = @_; - $safeeval->reval('use Math::Complex;'); $safeeval->reval('use LaTeX::Table;'); $safeeval->deny_only(':dangerous'); + $safeeval->reval('use LONCAPA::LCMathComplex;'); $safeeval->permit_only(":default"); $safeeval->permit("entereval"); $safeeval->permit(":base_math"); @@ -787,6 +794,15 @@ sub init_safespace { $safehole->wrap(\&Apache::lonnet::logthis,$safeeval,'&LONCAPA_INTERNAL_LOGTHIS'); $safehole->wrap(\&Apache::inputtags::finalizeawards,$safeeval,'&LONCAPA_INTERNAL_FINALIZEAWARDS'); $safehole->wrap(\&Apache::caparesponse::get_sigrange,$safeeval,'&LONCAPA_INTERNAL_get_sigrange'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_val,$safeeval,'&fpr_val'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_f,$safeeval,'&fpr_f'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_dfdx,$safeeval,'&fpr_dfdx'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_d2fdx2,$safeeval,'&fpr_d2fdx2'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_vectorcoords,$safeeval,'&fpr_vectorcoords'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_objectcoords,$safeeval,'&fpr_objectcoords'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_vectorlength,$safeeval,'&fpr_vectorlength'); + $safehole->wrap(\&Apache::functionplotresponse::fpr_vectorangle,$safeeval,'&fpr_vectorangle'); + # use Data::Dumper; # $safehole->wrap(\&Data::Dumper::Dumper,$safeeval,'&LONCAPA_INTERNAL_Dumper'); #need to inspect this class of ops @@ -838,7 +854,8 @@ sub initialize_rndseed { sub default_homework_load { my ($safeeval)=@_; &Apache::lonxml::debug('Loading default_homework'); - my $default=&Apache::lonnet::getfile('/home/httpd/html/res/adm/includes/default_homework.lcpm'); + my $default=&Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonIncludes'}. + '/default_homework.lcpm'); if ($default eq -1) { &Apache::lonxml::error("Unable to find default_homework.lcpm"); } else { @@ -1008,7 +1025,7 @@ the current 'bubble line number' is stor The value of it is stored in $Apache:lonxml::counter when live and stored back to env after done. -=item &increment_counter($increment); +=item &increment_counter($increment, $part_response); Increments the internal counter environment variable a specified amount @@ -1485,19 +1502,20 @@ sub renderingoptions { {&Apache::lonlocal::texthash ('' => '', 'tth' => 'tth (TeX to HTML)', - 'jsMath' => 'jsMath', + 'MathJax' => 'MathJax', + 'jsMath' => 'jsMath', 'mimetex' => 'mimetex (Convert to Images)')}). ''; return $output; } sub inserteditinfo { - my ($filecontents, $filetype, $filename)=@_; + my ($filecontents,$filetype,$filename,$symb,$itemtitle,$folderpath,$uri,$action) = @_; $filecontents = &HTML::Entities::encode($filecontents,'<>&"'); my $xml_help = ''; my $initialize=''; my $textarea_id = 'filecont'; - my $dragmath_button; + my ($dragmath_button,$deps_button); my ($add_to_onload, $add_to_onresize); $initialize=&Apache::lonhtmlcommon::spellheader(); if (($filetype eq 'html') && (&Apache::lonhtmlcommon::htmlareabrowser())) { @@ -1517,7 +1535,33 @@ sub inserteditinfo { // ]]> FULLPAGE + my $textareaclass; if ($filetype eq 'html') { + my $context; + if ($env{'request.course.id'}) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($uri =~ m{^\Q/uploaded/$cdom/$cnum/portfolio/syllabus/\E}) { + $context = 'syllabus'; + $deps_button = &Apache::lonhtmlcommon::dependencies_button()."\n"; + $initialize .= + &Apache::lonhtmlcommon::dependencycheck_js(undef,&mt('Syllabus'), + $uri,undef, + "/public/$cdom/$cnum/syllabus"). + "\n"; + if (&Apache::lonhtmlcommon::htmlareabrowser()) { + $textareaclass = 'class="LC_richDefaultOn"'; + } + } + } + unless ($context eq 'syllabus') { + if ($symb || $folderpath) { + $deps_button = &Apache::lonhtmlcommon::dependencies_button()."\n"; + $initialize .= + &Apache::lonhtmlcommon::dependencycheck_js($symb,$itemtitle, + undef,$folderpath,$uri)."\n"; + } + } $dragmath_button = ''.&Apache::lonhtmlcommon::dragmath_button('filecont',1).''; $initialize .= "\n".&Apache::lonhtmlcommon::dragmath_js('EditMathPopup'); } @@ -1529,7 +1573,6 @@ FULLPAGE } my $titledisplay=&display_title(); - my $textareaclass; my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit', 'vi' => 'Save and View', 'dv' => 'Discard Edits and View', @@ -1545,13 +1588,15 @@ FULLPAGE $htmlerror=''.$htmlerror.''; } if (&Apache::lonhtmlcommon::htmlareabrowser()) { - $textareaclass = 'class="LC_richDefaultOff"'; + unless ($textareaclass) { + $textareaclass = 'class="LC_richDefaultOff"'; + } } } my $editfooter=(< -
+
$filename @@ -1562,7 +1607,7 @@ $initialize
- $htmlerror $dragmath_button + $htmlerror $deps_button $dragmath_button
@@ -1575,7 +1620,6 @@ $initialize $titledisplay
- ENDFOOTER return ($editfooter,$add_to_onload,$add_to_onresize);; } @@ -1646,6 +1690,24 @@ sub handler { } else { $filetype='html'; } + unless ($env{'request.uri'}) { + $env{'request.uri'}=$request->uri; + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['todocs']); + } + my ($cdom,$cnum); + if ($env{'request.course.id'}) { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($filetype eq 'html') { + if ($request->uri =~ m{^\Q/uploaded/$cdom/$cnum/portfolio/syllabus/\E.+$}) { + if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['editmode']); + } + } + } + } if ($filetype eq 'sty') { $breadcrumbtext = 'Style File Editor'; } elsif ($filetype eq 'js') { @@ -1747,8 +1809,8 @@ ENDNOTFOUND } my $brcrum; if ($env{'request.state'} eq 'construct') { - $brcrum = [{'href' => &Apache::loncommon::authorspace(), - 'text' => 'Construction Space'}, + $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), + 'text' => 'Authoring Space'}, {'href' => '', 'text' => $breadcrumbtext}]; } else { @@ -1771,11 +1833,37 @@ ENDNOTFOUND unless ($env{'request.state'} eq 'published') { if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'}))) { - my $displayfile=$request->uri; - $displayfile=~s/^\/[^\/]*//; + my ($displayfile,$url,$symb,$itemtitle,$action); + $displayfile=$request->uri; + if ($request->uri =~ m{^/uploaded/}) { + if ($env{'request.course.id'}) { + if ($request->uri =~ m{^\Q/uploaded/$cdom/$cnum/supplemental/\E}) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['folderpath','title']); + } elsif ($request->uri =~ m{^\Q/uploaded/$cdom/$cnum/portfolio/syllabus/\E(.+)$}) { + my $filename = $1; + if ($1 eq 'loncapa.html') { + $displayfile = &mt('Syllabus (minimal template)'); + $action = $request->uri.'?forceedit=1'; + } else { + $displayfile = &mt('Syllabus file: [_1]',$1); + } + $itemtitle = &mt('Syllabus'); + } + } + unless ($itemtitle) { + ($symb,$itemtitle,$displayfile) = + &get_courseupload_hierarchy($request->uri, + $env{'form.folderpath'}, + $env{'form.title'}); + } + } else { + $displayfile=~s/^\/[^\/]*//; + } my ($edit_info, $add_to_onload, $add_to_onresize)= - &inserteditinfo($filecontents,$filetype,$displayfile); + &inserteditinfo($filecontents,$filetype,$displayfile,$symb, + $itemtitle,$env{'form.folderpath'},$request->uri,$action); my %options = ('add_entries' => @@ -1784,8 +1872,8 @@ ENDNOTFOUND my $header; if ($env{'request.state'} eq 'construct') { $options{'bread_crumbs'} = [{ - 'href' => &Apache::loncommon::authorspace(), - 'text' => 'Construction Space'}, + 'href' => &Apache::loncommon::authorspace($request->uri), + 'text' => 'Authoring Space'}, {'href' => '', 'text' => $breadcrumbtext}]; $header = &Apache::loncommon::head_subbox( @@ -1820,11 +1908,47 @@ sub display_title { $title = substr($title, rindex($title, '/') + 1); } $result = ""; + .&mt('Authoring Space')."';"; } return $result; } +sub get_courseupload_hierarchy { + my ($url,$folderpath,$title) = @_; + my ($symb,$itemtitle,$displaypath); + if ($env{'request.course.id'}) { + if ($folderpath =~ /^supplemental/) { + my @folders = split(/\&/,$folderpath); + my @pathitems; + while (@folders) { + my $folder=shift(@folders); + my $foldername=shift(@folders); + $foldername =~ s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//; + push(@pathitems,&unescape($foldername)); + } + if ($title) { + push(@pathitems,&unescape($title)); + } + $displaypath = join(' » ',@pathitems); + } else { + $symb = &Apache::lonnet::symbread($url); + my ($map,$id,$res)=&Apache::lonnet::decode_symb($symb); + my $navmap=Apache::lonnavmaps::navmap->new; + if (ref($navmap)) { + my $res = $navmap->getBySymb($symb); + if (ref($res)) { + my @pathitems = + &Apache::loncommon::get_folder_hierarchy($navmap,$map,1); + $itemtitle = $res->compTitle(); + push(@pathitems,$itemtitle); + $displaypath = join(' » ',@pathitems); + } + } + } + } + return ($symb,$itemtitle,$displaypath); +} + sub debug { if ($Apache::lonxml::debug eq "1") { $|=1; @@ -1841,8 +1965,9 @@ sub debug { } sub show_error_warn_msg { - if ($env{'request.filename'} eq '/home/httpd/html/res/lib/templates/simpleproblem.problem' && - &Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + if (($env{'request.filename'} eq + $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/lib/templates/simpleproblem.problem') && + (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) { return 1; } return (($Apache::lonxml::debug eq 1) || @@ -1906,7 +2031,7 @@ sub error { my @userlist; foreach (keys %users) { my ($user,$domain) = split(/:/, $_); - push(@userlist,"$user\@$domain"); + push(@userlist,"$user:$domain"); my $key=$declutter.'_'.$user.'_'.$domain; my %lastnotified=&Apache::lonnet::get('nohist_xmlerrornotifications', [$key], @@ -1929,7 +2054,7 @@ sub error { $errormsg=&mt("An error occurred while processing this resource. The instructor has been notified."); } } - push(@Apache::lonxml::error_messages,"$errormsg
"); + push(@Apache::lonxml::error_messages,"$errormsg
"); } } @@ -1974,16 +2099,25 @@ sub add_messages { } sub get_param { - my ($param,$parstack,$safeeval,$context,$case_insensitive) = @_; + my ($param,$parstack,$safeeval,$context,$case_insensitive, $noelide) = @_; + if ( ! $context ) { $context = -1; } my $args =''; if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } if ( ! $Apache::lonxml::usestyle ) { $args=$Apache::lonxml::style_values.$args; } + + + if ($noelide) { +# $args =~ s/\\'/'/g; + $args =~ s/'\$/'\\\$/g; + } + if ( ! $args ) { return undef; } if ( $case_insensitive ) { if ($args =~ s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei) { + return &Apache::run::run("{$args;".'return $'.$param.'}', $safeeval); #' } else { @@ -1991,6 +2125,7 @@ sub get_param { } } else { if ( $args =~ /my .*\$\Q$param\E[,\)]/ ) { + return &Apache::run::run("{$args;".'return $'.$param.'}', $safeeval); #' } else { @@ -2037,11 +2172,13 @@ sub register_insert_xml { while (my $token = $parser->get_token()) { if ($token->[0] eq 'S') { my $key; - if ($token->[1] eq 'tag') { + if ($token->[1] eq 'tag') { $tag = $token->[2]{'name'}; - $insertlist{$tagnum.'.tag'} = $tag; - $insertlist{$tag.'.num'} = $tagnum; - push(@alltags,$tag); + if (defined($tag)) { + $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') { @@ -2150,7 +2287,7 @@ sub description { sub helpinfo { my ($token)=@_; my $tag = &get_tag($token); - return ($insertlist{$tag.'.helpfile'}, $insertlist{$tag.'.helpdesc'}); + return ($insertlist{$tag.'.helpfile'}, &mt($insertlist{$tag.'.helpdesc'})); } sub get_tag { 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.