--- loncom/homework/structuretags.pm 2007/07/23 23:30:47 1.384 +++ loncom/homework/structuretags.pm 2009/03/09 21:24:12 1.439 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.384 2007/07/23 23:30:47 albertel Exp $ +# $Id: structuretags.pm,v 1.439 2009/03/09 21:24:12 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,6 +27,29 @@ # ### +=pod + +=head1 NAME + +Apache::structuretags + +=head1 SYNOPSIS + + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + + +=head1 NOTABLE SUBROUTINES + +=over + +=item + +=back + +=cut + package Apache::structuretags; @@ -36,13 +59,14 @@ use Apache::File(); use Apache::lonmenu; use Apache::lonlocal; use Apache::lonxml; +use Apache::londefdef; use Apache::lonenc(); use Time::HiRes qw( gettimeofday tv_interval ); use lib '/home/httpd/lib/perl/'; use LONCAPA; BEGIN { - &Apache::lonxml::register('Apache::structuretags',('block','languageblock','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag')); + &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag')); } sub start_web { @@ -74,7 +98,14 @@ sub start_tex { if ($target ne 'edit' && $target ne 'modified') { my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style); if ($target eq 'tex') { - return $bodytext.' '; + + # If inside a table, occurrences of \\ must be removed; + # else the table blows up. + + if (&Apache::londefdef::is_inside_of($tagstack, "table")) { + $bodytext =~ s/\\\\//g; + } + return $bodytext.'{}'; } } elsif ($target eq "edit" ) { my $bodytext = @@ -92,6 +123,44 @@ sub end_tex { return ''; } +sub homework_js { + return &Apache::loncommon::resize_textarea_js(). + &setmode_javascript(). + <<'JS'; + +JS +} + +sub setmode_javascript { + return <<"ENDSCRIPT"; + +ENDSCRIPT +} + sub page_start { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name, $extra_head)=@_; @@ -108,13 +177,13 @@ sub page_start { $parstack,$parser,$safeeval); } - $extra_head.= ' - -'; + $extra_head .= &homework_js(); + + if ($env{'environment.wysiwygeditor'} eq 'on') { + $extra_head .= &Apache::lonhtmlcommon::dragmath_js("FCKEditMathPopup"); + } else { + $extra_head .= &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); + } my %body_args; if (defined($found{'html'})) { @@ -139,7 +208,9 @@ function setSubmittedPart (part) { } elsif (!defined($found{'body'}) && $env{'request.state'} eq 'construct') { if ($target eq 'web' || $target eq 'edit') { - # no extra args to bodytag + if ($env{'environment.remote'} ne 'off') { + $body_args{'only_body'} = 1; + } } } elsif (!defined($found{'body'})) { my %add_entries; @@ -157,6 +228,10 @@ function setSubmittedPart (part) { $body_args{'no_title'} = 1; $body_args{'force_register'} = 1; $body_args{'add_entries'} = \%add_entries; + if ($env{'environment.remote'} eq 'off' + && $env{'request.state'} eq 'construct') { + $body_args{'only_body'} = 1; + } } $body_args{'no_auto_mt_title'} = 1; my $page_start = &Apache::loncommon::start_page($name,$extra_head, @@ -174,7 +249,7 @@ function setSubmittedPart (part) { } } - if (!defined($found{'body'})) { + if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') { $page_start .= &Apache::lonxml::message_location(); } @@ -202,20 +277,27 @@ function setSubmittedPart (part) { #use Time::HiRes(); sub get_resource_name { my ($parstack,$safeeval)=@_; + my $name; if (defined($Apache::lonhomework::name)) { - return $Apache::lonhomework::name; - } - my ($symb)=&Apache::lonnet::whichuser(); - my $name=&Apache::lonnet::gettitle($symb); - if ($name eq '') { - $name=&Apache::lonnet::EXT('resource.title'); - if ($name eq 'con_lost') { $name = ''; } - } - if ($name!~/\S+/) { - $name=$env{'request.uri'}; - $name=~s-.*/([^/]+)$-$1-; + $name = $Apache::lonhomework::name; + } else { + my ($symb)=&Apache::lonnet::whichuser(); + $name=&Apache::lonnet::gettitle($symb); + if ($name eq '') { + $name=&Apache::lonnet::EXT('resource.title'); + if ($name eq 'con_lost') { $name = ''; } + } + if ($name!~/\S+/) { + $name=$env{'request.uri'}; + $name=~s-.*/([^/]+)$-$1-; + } + # The name has had html tags escaped: + + $name=~s/<//gs; + + $Apache::lonhomework::name=$name; } - $Apache::lonhomework::name=$name; return $name; } @@ -267,23 +349,44 @@ sub remember_problem_state { '; } +sub problem_edit_buttons { + return ' +
+ + + +
+
+ + +
'; +} + sub problem_edit_header { - return ''. + return ''. &Apache::structuretags::remember_problem_state().' - - - -
- -
'. - &Apache::loncommon::help_open_menu('Problem Editing Help','Problem_Editor_XML_Index',5,'Authoring',undef,undef,undef,'Problem Editing Help') - .'
'. +
+
+'.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' +
'. +&problem_edit_buttons().' +
+'.&Apache::lonxml::message_location().' +
+'. '
'; } sub problem_edit_footer { - return '

- '. + return '
+ +'. + &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields()). "\n\n".&Apache::loncommon::end_page(); } @@ -300,35 +403,38 @@ sub option { sub problem_web_to_edit_header { my ($rndseed)=@_; - my $result.=''; - $result .= ''; - $result .= ' - - - - - '. - &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area','Testing Problems'). - '
'; - $result.=&mt('Apply style file').' -&').'" /> - '.&mt('Select').' - -
'; + my $show_all= ''; + + + $result .= '
'; if (!$Apache::lonhomework::parsing_a_task) { $result.=" - -Problem Status: +
+ +".&mt("Problem Status:")." - - -Problem Type: + + +".&mt("Problem Type:")." - - -Feedback Mode: + +$show_all +
+
+ +".&mt("Feedback Mode:")." - - -
"; - my $numtoanalyze=$env{'form.numtoanalyze'}; - if (!$numtoanalyze) { $numtoanalyze=20; } - $result.= ' for - '.&mt('versions of this problem'). - '.'.&Apache::loncommon::help_open_topic("Analyze_Problem", - '',undef,undef,300). - '
'; + +"; + } elsif ($Apache::lonhomework::parsing_a_task) { $result.=" - -Problem Status: +
+ +".&mt("Problem Status:")." - - -
"; - } + +$show_all +"; + } + $result.=' + + '.&mt('Apply style file: ').' + &').'" /> + '.&mt('Select').' + +
+
'. + &Apache::lonxml::renderingoptions().' +
+ + + +
+
+
+ + + '; + + if (!$Apache::lonhomework::parsing_a_task) { + my $numtoanalyze=$env{'form.numtoanalyze'}; + if (!$numtoanalyze) { $numtoanalyze=20; } + $result .= ''. + &mt('[_1] for [_2] versions.', + '' + ,''). + &Apache::loncommon::help_open_topic("Analyze_Problem",'',undef,undef,300). + ''; + + } + + $result.=' +
+
'; + $result.=''; + $result .= ''; + $result .= ''; + $result.=' +
+ '.&Apache::lonxml::message_location().' +
'; return $result; } @@ -423,12 +574,19 @@ sub initialize_storage { if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); } } -# -------------------------------------------------------------finalize_storage -# Stores away the result has to a student's environment -# checks form.grade_ for specific values, other wises stores -# to the running users environment -# Will increment totals for attempts, students, and corrects -# if running user has student role. +=pod + +=item finalize_storage() + + Stores away the result has to a student's environment + checks form.grade_ for specific values, other wises stores + to the running users environment + Will increment totals for attempts, students, and corrects + if running user has student role. + +=cut + + sub finalize_storage { my ($given_symb) = @_; my $result; @@ -458,12 +616,17 @@ sub finalize_storage { } return $result; } -use Data::Dumper; -# -------------------------------------------------------------store_aggregates -# Sends hash of values to be incremented in nohist_resourcetracker.db -# for the course. Increments total number of attempts, unique students -# and corrects for each part for an instance of a problem, as appropriate. +=pod + +item store_aggregates() + + Sends hash of values to be incremented in nohist_resourcetracker.db + for the course. Increments total number of attempts, unique students + and corrects for each part for an instance of a problem, as appropriate. + +=cut + sub store_aggregates { my ($symb,$courseid) = @_; my %aggregate; @@ -523,17 +686,37 @@ ENDCHECKOUT sub firstaccess_msg { my ($time,$symb)=@_; - my ($map)=&Apache::lonnet::decode_symb($symb); - my $foldertitle=&Apache::lonnet::gettitle($map); - &Apache::lonxml::debug("map is $map title is $foldertitle"); + my $result; + my @interval=&Apache::lonnet::EXT("resource.0.interval"); + if ($interval[1] eq 'map') { + my ($map)=&Apache::lonnet::decode_symb($symb); + my $foldertitle=&Apache::lonnet::gettitle($map); + + &Apache::lonxml::debug("map is $map title is $foldertitle"); + $result .= "

".&mt('The resources in "[_1]" are open for a limited time.' + .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' + ,$foldertitle,$time)."

"; + } elsif ($interval[1] eq 'course') { + my $course = $env{'course.'.$env{'request.course.id'}.'.description'}; + $result .= "

".&mt('The resources in "[_1]" are open for a limited time.' + .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' + ,$course,$time)."

"; + } else { + my $title=&Apache::lonnet::gettitle($symb); + $result .= "

".&mt('This resource "[_1]" is open for a limited time.' + .' Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".' + ,$title,$time)."

"; + } my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); - return (<The resources in "$foldertitle" are open for a limited time. Once you click the 'Show Resource' button below you have $time to complete all resources "$foldertitle". + my $buttontext = &mt('Show Resource'); + my $timertext = &mt('Start Timer?'); + $result .= (< - + ENDCHECKOUT + return $result; } sub init_problem_globals { @@ -545,19 +728,19 @@ sub init_problem_globals { if ($type eq 'problem') { $Apache::inputtags::part='0'; @Apache::inputtags::partlist=('0'); - $Apache::lonhomework::problemstatus=&get_problem_status('0'); + &Apache::lonhomework::set_show_problem_status(&get_problem_status('0')); $Apache::lonhomework::ignore_response_errors=0; } elsif ($type eq 'library') { $Apache::inputtags::part=''; @Apache::inputtags::partlist=(); - $Apache::lonhomework::problemstatus=''; + &Apache::lonhomework::reset_show_problem_status(); $Apache::lonhomework::ignore_response_errors=1; } elsif ($type eq 'Task') { $Apache::inputtags::part='0'; @Apache::inputtags::partlist=('0'); - $Apache::lonhomework::problemstatus=''; + &Apache::lonhomework::reset_show_problem_status(); $Apache::lonhomework::ignore_response_errors=1; } @Apache::inputtags::responselist = (); @@ -586,8 +769,8 @@ sub reset_problem_globals { undef($Apache::lonhomework::default_type); undef($Apache::lonhomework::type); undef($Apache::lonhomework::scantronmode); - undef($Apache::lonhomework::problemstatus); undef($Apache::lonhomework::ignore_response_errors); + &Apache::lonhomework::reset_show_problem_status(); } sub set_problem_state { @@ -638,10 +821,10 @@ sub start_problem { } if ($target ne 'analyze') { - if ($env{'request.state'} eq 'construct') { &set_problem_state('0'); } - $Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type'); + my $type = &Apache::lonnet::EXT('resource.0.type'); + $Apache::lonhomework::type=$type; if (($env{'request.state'} eq 'construct') && - defined($env{'form.problemtype'})) { + $env{'form.problemtype'} =~ /\S/) { $Apache::lonhomework::type=$env{'form.problemtype'}; } &Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:"); @@ -659,6 +842,11 @@ sub start_problem { $Apache::lonhomework::default_type = $Apache::lonhomework::type; &initialize_storage(); + if ($target ne 'analyze' + && $env{'request.state'} eq 'construct') { + &set_problem_state('0'); + } + if ($target eq 'web') { &Apache::lonxml::debug(" grading history "); &Apache::lonhomework::showhash(%Apache::lonhomework::history); @@ -697,7 +885,8 @@ sub start_problem { $result.=&Apache::lonxml::printtokenheader($target,$token); } if ($env{'form.markaccess'}) { - &Apache::lonnet::set_first_access('map'); + my @interval=&Apache::lonnet::EXT("resource.0.interval"); + &Apache::lonnet::set_first_access($interval[1]); } #handle rand seed in construction space my $rndseed=&setup_rndseed($safeeval); @@ -722,6 +911,9 @@ sub start_problem { $form_tag_start.= ' />'.&mt(' Show All Foils'). ''; } + if ($Apache::lonhomework::type eq 'practice') { + $form_tag_start.=&practice_problem_header(); + } $form_tag_start.='
'; } @@ -751,7 +943,7 @@ sub start_problem { $msg.='

'.&mt('Not open to be viewed').'

'; } if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') { - $msg.='The problem '.$accessmsg; + $msg.=&mt('The problem ').$accessmsg; } elsif ($status eq 'UNCHECKEDOUT') { $msg.=&checkout_msg(); } elsif ($status eq 'NOT_YET_VIEWED') { @@ -794,6 +986,11 @@ sub start_problem { # create a page header and exit if ($env{'request.state'} eq "construct") { $result.= &problem_web_to_edit_header($env{'form.rndseed'}); + if ($Apache::lonhomework::type eq 'practice') { + $result.= ''. + &practice_problem_header().'
'; + } } # if we are viewing someone else preserve that info if (defined $env{'form.grade_symb'}) { @@ -1029,6 +1226,11 @@ sub start_library { $result.=" \n $form_tag_start". ''; $result.=&problem_web_to_edit_header($rndseed); + if ($Apache::lonhomework::type eq 'practice') { + $result.= ''. + &practice_problem_header().'
'; + } } return $result; } @@ -1056,16 +1258,19 @@ sub start_definetag { my $name = $token->[2]->{'name'}; my $skip=&Apache::lonxml::get_all_text("/definetag",$parser,$style); - if ($name=~/^\//) { - $result= - '
'; - } else { - $result= - '
END '.$name.'
'; + if ($target eq 'web') { + if ($name=~/^\//) { + $result= + '
BEGIN '.$name.'
'; + } else { + $result= + '
'. + &mt('END [_1]'.''.$name.'').'
'; + } + $skip = &HTML::Entities::encode($skip, '<>&"'); + $result.='
'. + &mt('BEGIN [_1]'.''.$name.'').'
'.$skip.'
'; } - $skip=~s/\/\>\;/gs; - $result.='
'.$skip.'
'; return $result; } @@ -1081,7 +1286,7 @@ sub start_block { if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { my $code = $token->[2]->{'condition'}; - if (defined($code)) { + if (defined($code) && $code ne '') { if (!$Apache::lonxml::default_homework_loaded) { &Apache::lonxml::default_homework_load($safeeval); } @@ -1126,19 +1331,38 @@ sub start_languageblock { $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { my $include = $token->[2]->{'include'}; my $exclude = $token->[2]->{'exclude'}; - my %languages=&Apache::loncommon::display_languages(); - $result='1'; - if ($include) { - $result=''; - foreach (split(/\,/,$include)) { - if ($languages{$_}) { $result='1'; } - } - } - if ($exclude) { - foreach (split(/\,/,$exclude)) { - if ($languages{$_}) { $result='0'; } - } - } + my @preferred_languages=&Apache::lonlocal::preferred_languages(); +# This should not even happen, since we should at least have the server language + if (!$preferred_languages[0]) { $preferred_languages[0]='en'; } +# Now loop over all languages in order of preference + foreach my $preferred_language (@preferred_languages) { +# If the languageblock has no arguments, show the contents + $result=1; + my $found=0; +# Do we have an include argument? + if ($include) { +# If include is specified, by default, don't render the block + $result=0; + foreach my $included_language (split(/\,/,$include)) { +# ... but if my preferred language is included, render it + if ($included_language eq $preferred_language) { + $result=1; + $found=1; + } + } + } +# Do we have an exclude argument? + if ($exclude) { + $result=1; + foreach my $excluded_language (split(/\,/,$exclude)) { + if ($excluded_language eq $preferred_language) { + $result=0; + $found=1; + } + } + } + if ($found) { last; } + } if ( ! $result ) { my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser, $style); @@ -1170,6 +1394,66 @@ sub end_languageblock { return $result; } +{ + my %available_texts; + sub start_translated { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + &Apache::lonxml::register('Apache::structuretags',('lang')); + undef(%available_texts); + } + + sub end_translated { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result; + #show the translation on viewable targets + if ($target eq 'web' || $target eq 'tex' || $target eq 'webgrade'|| + # or non-viewable targets, if it's embedded in something that + # wants the output + (($target eq 'answer' || $target eq 'analyze'|| $target eq 'grade') + && &Apache::lonxml::in_redirection() ) ) { + my @possibilities = keys(%available_texts); + my $which = + &Apache::loncommon::languages(\@possibilities) || 'default'; + $result = $available_texts{$which}; + } + undef(%available_texts); + &Apache::lonxml::deregister('Apache::structuretags',('lang')); + return $result; + } + + + sub start_lang { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || + $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { + &Apache::lonxml::startredirection(); + } + return ''; + } + + sub end_lang { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || + $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { + my $result = &Apache::lonxml::endredirection(); + my $which = &Apache::lonxml::get_param('which',$parstack, + $safeeval); + if ($which=~/\w/) { + $available_texts{$which} = $result; + } + my $otherlangs = &Apache::lonxml::get_param('other',$parstack, + $safeeval); + foreach my $language (split(/\s*\,\s*/,$otherlangs)) { + if ($language=~/\w/) { + $available_texts{$language} = $result; + } + } + + } + return ''; + } +} + sub start_instructorcomment { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -1261,7 +1545,7 @@ sub end_while { $return = &Apache::run::run($code,$safeeval); } if ($error) { - &Apache::lonxml::error('
'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occured while running <while> on line').' '.$line.'
'); + &Apache::lonxml::error('
'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occurred while running <while> on line').' '.$line.'
'); } } elsif ($target eq "edit") { $result.= &Apache::edit::tag_end($target,$token,''); @@ -1315,6 +1599,20 @@ sub start_randomlist { my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval); $showarg--; if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; } + if (($target eq 'analyze') && ($env{'form.check_parts_withrandomlist'})) { + my @currlist; + my $part = $Apache::inputtags::part; + if ($part ne '') { + if (ref($Apache::lonhomework::analyze{'parts_withrandomlist'}) eq 'ARRAY') { + my @currlist = @{$Apache::lonhomework::analyze{'parts_withrandomlist'}}; + if (!(grep(/^\Q$part\E$/,@currlist))) { + push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part); + } + } else { + push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part); + } + } + } for(0 .. $show) { $bodytext .= "$randomlist[ $idx_arr[$_] ]"; } @@ -1375,14 +1673,15 @@ sub start_part { # duedates. } my $result=''; - my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval); - if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; } + my $id= &Apache::lonxml::get_id($parstack,$safeeval); $Apache::inputtags::part=$id; push(@Apache::inputtags::partlist,$id); @Apache::inputtags::response=(); @Apache::inputtags::previous=(); @Apache::inputtags::previous_version=(); - $Apache::lonhomework::problemstatus=&get_problem_status($id); + &Apache::lonhomework::set_show_problem_status(&get_problem_status($id)); + &Apache::response::reset_params(); + my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part); my $newtype=&Apache::lonnet::EXT("resource.$id.type"); if ($newtype) { $Apache::lonhomework::type=$newtype; } @@ -1429,7 +1728,7 @@ sub start_part { if ($target eq 'tex') { if (not $env{'form.problem_split'}=~/yes/) { if ($$tagstack[-2] eq 'td') { - $result.='\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent'; + $result.='\noindent \begin{minipage}{\textwidth}\noindent'; } else { $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent'; } @@ -1620,7 +1919,8 @@ sub start_problemtype { $result .=&Apache::edit::checked_arg('When used as type(s):','for', [ ['exam','Exam/Quiz Problem'], ['survey','Survey'], - ['problem','Homework Problem'] ] + ['problem','Homework Problem'], + ['practice','Practice Problem'] ] ,$token); $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { @@ -1639,6 +1939,13 @@ sub start_startouttext { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my @result=(''.''); if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); } + + my $nesting = + &Apache::lonxml::set_state('outtext', + &Apache::lonxml::get_state('outtext')+1); + if ($nesting > 1 && $env{'request.state'} eq 'construct') { + &Apache::lonxml::error("Nesting of <startouttext /> not allowed, on line ".$token->[5]); + } return (@result); } @@ -1646,17 +1953,23 @@ sub end_startouttext { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; my $text=''; - if ($target eq 'edit') { + my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth; $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style); - $result.=&Apache::edit::start_table($token)."".&mt('Text Block')." -".&mt('Delete:'). - &Apache::edit::deletelist($target,$token) - ." -". - &Apache::edit::insertlist($target,$token). - '' . - &Apache::loncommon::helpLatexCheatsheet(). + $result.=&Apache::edit::start_table($token)."".&mt('Text Block')."" + .''.&mt('Delete?').' ' + .&Apache::edit::deletelist($target,$token) + .''; + unless ($env{'environment.wysiwygeditor'} eq 'on') { + $result .= '' + .&Apache::lonhtmlcommon::dragmath_button($areaid,1) + .'' + .'' + .&Apache::edit::insertlist($target,$token) + .''; + } + $result.='' . + &Apache::loncommon::helpLatexCheatsheet(). &Apache::edit::end_row(). &Apache::edit::start_spanning_row()."\n". &Apache::edit::editfield($token->[1],$text,"",80,8,1); @@ -1678,6 +1991,14 @@ sub start_endouttext { $result=''. &Apache::edit::handle_insertafter('startouttext'); } + + my $nesting = + &Apache::lonxml::set_state('outtext', + &Apache::lonxml::get_state('outtext')-1); + if ($nesting < 0 && $env{'request.state'} eq 'construct') { + &Apache::lonxml::error(" Extraneous <endouttext /> not allowed on line ".$token->[5]); + &Apache::lonxml::set_state('outtext', 0); + } return $result; } @@ -1722,5 +2043,17 @@ sub end_simpleeditbutton { return ''; } +sub practice_problem_header { + return '

'.&mt('Practice Problem').'

'. + ''.&mt('Submissions are not permanently recorded'). + ''; +} + 1; __END__ + +=pod + +=back + +=cut