Diff for /loncom/homework/structuretags.pm between versions 1.359 and 1.402

version 1.359, 2006/06/26 22:33:22 version 1.402, 2007/10/12 18:45:03
Line 42  use lib '/home/httpd/lib/perl/'; Line 42  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
 BEGIN {  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 {  sub start_web {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $bodytext=&Apache::lonxml::get_all_text("/web",$parser,$style);      if ($target ne 'edit' && $target ne 'modified') {
     if ($target eq 'web' || $target eq 'webgrade') {   my $bodytext=&Apache::lonxml::get_all_text("/web",$parser,$style);
  return $bodytext;   if ($target eq 'web' || $target eq 'webgrade') {
       return $bodytext;
    }
       } elsif ($target eq "edit" ) {
    my $bodytext = 
       &Apache::lonxml::get_all_text_unbalanced("/web",$parser);
    my $result = &Apache::edit::tag_start($target,$token);
    $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
    return $result;
       } elsif ( $target eq "modified" ) {
    return $token->[4].&Apache::edit::modifiedfield("/web",$parser);
     }      }
     return '';      return '';
 }  }
Line 61  sub end_web { Line 71  sub end_web {
 sub start_tex {  sub start_tex {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style);      if ($target ne 'edit' && $target ne 'modified') {
     if ($target eq 'tex') {   my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style);
  return $bodytext.' ';   if ($target eq 'tex') {
       return $bodytext.' ';
    }
       } elsif ($target eq "edit" ) {
    my $bodytext = 
       &Apache::lonxml::get_all_text_unbalanced("/tex",$parser);
    my $result = &Apache::edit::tag_start($target,$token);
    $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
    return $result;
       } elsif ( $target eq "modified" ) {
    return $token->[4].&Apache::edit::modifiedfield("/tex",$parser);
     }      }
     return $result;;      return $result;;
 }  }
Line 72  sub end_tex { Line 92  sub end_tex {
     return '';      return '';
 }  }
   
   sub homework_js {
       return &Apache::loncommon::resize_textarea_js().
    <<'JS';
   <script type="text/javascript">
   function setSubmittedPart (part) {
      this.document.lonhomework.submitted.value="part_"+part;
   }
   
   function image_response_click (which, e) {
       init_geometry();
       if (!e) { e = window.event; } //IE
       var input_element = document.lonhomework.elements[which];
       var token_element = document.lonhomework.elements[which+'_token'];
       var token = token_element.value;
       var img_element   = document.getElementById(which+'_imageresponse');
       var x= e.clientX-getX(img_element)+Geometry.getHorizontalScroll();
       var y= e.clientY-getY(img_element)+Geometry.getVerticalScroll();
       var click = x+':'+y;
       input_element.value = click;
       img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;
   }
   </script>
   JS
   }
   
 sub page_start {  sub page_start {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
  $extra_head)=@_;   $extra_head)=@_;
Line 88  sub page_start { Line 133  sub page_start {
    $parstack,$parser,$safeeval);     $parstack,$parser,$safeeval);
     }      }
   
       $extra_head .= &homework_js();
   
     my %body_args;      my %body_args;
     if (defined($found{'html'})) {      if (defined($found{'html'})) {
  $body_args{'skip_phases'}{'head'}=1;   $body_args{'skip_phases'}{'head'}=1;
Line 95  sub page_start { Line 142  sub page_start {
   
  $extra_head .= &Apache::lonhtmlcommon::spellheader();   $extra_head .= &Apache::lonhtmlcommon::spellheader();
   
  my $css_href = &Apache::lonnet::EXT('resource.0.cssfile');   $extra_head .= &Apache::londefdef::generate_css_links();
  if ($css_href =~ /\S/) {  
     &Apache::lonxml::extlink($css_href);   if ($env{'request.state'} eq 'construct') {
     $extra_head .=   
  '<link rel="stylesheet" type="text/css" href="'.$css_href.'" />';  
  }  
  if ($target eq 'edit') {  
     $extra_head.=&Apache::edit::js_change_detection().      $extra_head.=&Apache::edit::js_change_detection().
  "<script type=\"text/javascript\">\n".   "<script type=\"text/javascript\">\n".
  "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".   "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
Line 115  sub page_start { Line 158  sub page_start {
     } elsif (!defined($found{'body'})       } elsif (!defined($found{'body'}) 
      && $env{'request.state'} eq 'construct') {       && $env{'request.state'} eq 'construct') {
  if ($target eq 'web' || $target eq 'edit') {   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'})) {      } elsif (!defined($found{'body'})) {
  my %add_entries;   my %add_entries;
Line 133  sub page_start { Line 178  sub page_start {
  $body_args{'no_title'}       = 1;   $body_args{'no_title'}       = 1;
  $body_args{'force_register'} = 1;   $body_args{'force_register'} = 1;
  $body_args{'add_entries'}    = \%add_entries;   $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,      my $page_start = &Apache::loncommon::start_page($name,$extra_head,
     \%body_args);      \%body_args);
   
Line 142  sub page_start { Line 191  sub page_start {
  && $env{'request.state'} ne 'construct'   && $env{'request.state'} ne 'construct'
  && ($target eq 'web' || $target eq 'webgrade')) {   && ($target eq 'web' || $target eq 'webgrade')) {
   
  my ($symb,undef,undef,undef,$publicuser)= &Apache::lonxml::whichuser();   my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser();
  if ($symb eq '' && !$publicuser) {   if ($symb eq '' && !$publicuser) {
     my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");      my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");
     $help=&mt("Browsing resource, all submissions are temporary.")."<br />";      $help=&mt("Browsing resource, all submissions are temporary.")."<br />";
Line 162  sub page_start { Line 211  sub page_start {
  if ($target eq 'edit') {   if ($target eq 'edit') {
     $form_tag_start.=&Apache::edit::form_change_detection();      $form_tag_start.=&Apache::edit::form_change_detection();
  }   }
  $form_tag_start.='>';   $form_tag_start.='>'."\n";
   
  my $symb=&Apache::lonnet::symbread();   my $symb=&Apache::lonnet::symbread();
  if ($symb =~ /\S/) {   if ($symb =~ /\S/) {
     $symb=      $symb=
  &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb));   &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb));
     $form_tag_start.=      $form_tag_start.=
  '<input type="hidden" name="symb" value="'.$symb.'" />';   "\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n";
  }   }
     }      }
     return ($page_start,$form_tag_start);      return ($page_start,$form_tag_start);
Line 178  sub page_start { Line 227  sub page_start {
 #use Time::HiRes();  #use Time::HiRes();
 sub get_resource_name {  sub get_resource_name {
     my ($parstack,$safeeval)=@_;      my ($parstack,$safeeval)=@_;
       my $name;
     if (defined($Apache::lonhomework::name)) {      if (defined($Apache::lonhomework::name)) {
  return $Apache::lonhomework::name;   $name = $Apache::lonhomework::name;
     }      } else {
     my ($symb)=&Apache::lonxml::whichuser();   my ($symb)=&Apache::lonnet::whichuser();
     my $name=&Apache::lonnet::gettitle($symb);   $name=&Apache::lonnet::gettitle($symb);
     if ($name eq '') {   if ($name eq '') {
  $name=&Apache::lonnet::EXT('resource.title');      $name=&Apache::lonnet::EXT('resource.title');
  if ($name eq 'con_lost') { $name = ''; }      if ($name eq 'con_lost') { $name = ''; }
     }   }
     if ($name!~/\S+/) {   if ($name!~/\S+/) {
  $name=$env{'request.uri'};      $name=$env{'request.uri'};
  $name=~s-.*/([^/]+)$-$1-;      $name=~s-.*/([^/]+)$-$1-;
    }
    # The name has had html tags escaped:
          
    $name=~s/&lt;/</gs;
    $name=~s/&gt;/>/gs;
   
    $Apache::lonhomework::name=$name;
     }      }
     $Apache::lonhomework::name=$name;  
     return $name;      return $name;
 }  }
   
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval)=@_;      my ($safeeval)=@_;
     my $rndseed;      my $rndseed;
     my ($symb)=&Apache::lonxml::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     if ($env{'request.state'} eq "construct"       if ($env{'request.state'} eq "construct" 
  || $symb eq ''    || $symb eq '' 
  || $Apache::lonhomework::type eq 'practice'   || $Apache::lonhomework::type eq 'practice'
Line 213  sub setup_rndseed { Line 269  sub setup_rndseed {
     }      }
     $env{'form.rndseed'}=$rndseed;      $env{'form.rndseed'}=$rndseed;
  }   }
  if ($env{'form.resetdata'} eq &mt('New Problem Variation') ||   if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')
         && $env{'form.submitted'} eq 'yes')  ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     srand(time);      srand(time);
     $rndseed=int(rand(2100000000));      $rndseed=int(rand(2100000000));
Line 276  sub option { Line 333  sub option {
 sub problem_web_to_edit_header {  sub problem_web_to_edit_header {
     my ($rndseed)=@_;      my ($rndseed)=@_;
     my $result.='<input type="hidden" name="problemmode" value="'.&mt('View').'" />';      my $result.='<input type="hidden" name="problemmode" value="'.&mt('View').'" />';
     if (!$Apache::lonhomework::parsing_a_task) {      $result .= '<input type="submit" name="problemmode" accesskey="e" value="'.&mt('Edit').'" />';
  $result .= '<input type="submit" name="problemmode" accesskey="e" value="'.&mt('Edit').'" />';  
     }  
     $result .= '<input type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />      $result .= '<input type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />
              <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />               <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />
              <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />               <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
Line 286  sub problem_web_to_edit_header { Line 341  sub problem_web_to_edit_header {
               <input type="text" name="rndseed" size="10" value="'.                <input type="text" name="rndseed" size="10" value="'.
        $rndseed.'"         $rndseed.'"
            onchange="javascript:document.lonhomework.changerandseed.click()" /></nobr>             onchange="javascript:document.lonhomework.changerandseed.click()" /></nobr>
              <label><input type="checkbox" name="showallfoils" ';               <span class="LC_nobreak"><label><input type="checkbox" name="showallfoils" ';
     my $show_all_foils_text =       my $show_all_foils_text = 
  ($Apache::lonhomework::parsing_a_task) ?   ($Apache::lonhomework::parsing_a_task) ?
  &mt('&nbsp;Show&nbsp;All&nbsp;Instances')   &mt('&nbsp;Show&nbsp;All&nbsp;Instances')
  : &mt('&nbsp;Show&nbsp;All&nbsp;Foils');   : &mt('&nbsp;Show&nbsp;All&nbsp;Foils');
   
     if (defined($env{'form.showallfoils'})) { $result.='checked="on"'; }      if (defined($env{'form.showallfoils'})) { $result.='checked="on"'; }
     $result.= ' />'.$show_all_foils_text.      $result.= ' />'.$show_all_foils_text.'</label></span>'.
  &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area','Testing Problems').   &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area','Testing Problems').
  '</label><hr />';   '<hr />';
       $result.=&mt('Apply style file: ').'
   <input type="text" name="style_file" value="'.&HTML::Entities::encode($env{'construct.style'},'"<>&').'" />
    <a href="javascript:openbrowser(\'lonhomework\',\'style_file\',\'sty\')">'.&mt('Select').'</a>
   <input type="submit" name="clear_style_file" value="'.&mt('Clear').'" />
   <br />';
   
     if (!$Apache::lonhomework::parsing_a_task) {      if (!$Apache::lonhomework::parsing_a_task) {
  $result.="   $result.="
 <nobr>  <nobr>
Line 337  Feedback Mode: Line 398  Feedback Mode:
      '.'.&Apache::loncommon::help_open_topic("Analyze_Problem",       '.'.&Apache::loncommon::help_open_topic("Analyze_Problem",
      '',undef,undef,300).       '',undef,undef,300).
      '<hr />';       '<hr />';
       } elsif ($Apache::lonhomework::parsing_a_task) {
    $result.="
   <nobr>
   Problem Status:
   <select name='problemstate'>
     <option value=''></option>
     ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>
     ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>
     ".&option('WEB_GRADE'            ,'problemstate').&mt("Criteria Grading")."</option>
     ".&option('SHOW_ANSWER'          ,'problemstate').&mt("Show Feedback")."</option>
   </select>
   </nobr>
   <input type='submit' name='changeproblemmode' value='".&mt("Change")."' />
   <hr />";
     }      }
     return $result;      return $result;
 }  }
Line 346  sub initialize_storage { Line 421  sub initialize_storage {
     undef(%Apache::lonhomework::results);      undef(%Apache::lonhomework::results);
     undef(%Apache::lonhomework::history);      undef(%Apache::lonhomework::history);
     my ($symb,$courseid,$domain,$name) =       my ($symb,$courseid,$domain,$name) = 
  &Apache::lonxml::whichuser($given_symb);   &Apache::lonnet::whichuser($given_symb);
           
     # anonymous users (CODEd exams) have no data      # anonymous users (CODEd exams) have no data
     if ($name eq 'anonymous'       if ($name eq 'anonymous' 
Line 360  sub initialize_storage { Line 435  sub initialize_storage {
   
  my $namespace = $symb || $env{'request.uri'};   my $namespace = $symb || $env{'request.uri'};
  if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||   if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
     $env{'form.resetdata'} eq &mt('New Problem Variation') ||      ($env{'form.resetdata'} eq &mt('New Problem Variation')
        && $env{'form.submitted'} eq 'yes') ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     &Apache::lonnet::tmpreset($namespace,'',$domain,$name);      &Apache::lonnet::tmpreset($namespace,'',$domain,$name);
     &Apache::lonxml::debug("Attempt reset");      &Apache::lonxml::debug("Attempt reset");
Line 392  sub finalize_storage { Line 468  sub finalize_storage {
  my @remove = grep(/^INTERNAL_/,keys(%Apache::lonhomework::results));   my @remove = grep(/^INTERNAL_/,keys(%Apache::lonhomework::results));
  delete(@Apache::lonhomework::results{@remove});   delete(@Apache::lonhomework::results{@remove});
  my ($symb,$courseid,$domain,$name) =    my ($symb,$courseid,$domain,$name) = 
     &Apache::lonxml::whichuser($given_symb);      &Apache::lonnet::whichuser($given_symb);
  if ($env{'request.state'} eq 'construct'    if ($env{'request.state'} eq 'construct' 
     || $symb eq ''      || $symb eq ''
     || $Apache::lonhomework::type eq 'practice') {      || $Apache::lonhomework::type eq 'practice') {
Line 414  sub finalize_storage { Line 490  sub finalize_storage {
     }      }
     return $result;      return $result;
 }  }
 use Data::Dumper;  
   
 # -------------------------------------------------------------store_aggregates  # -------------------------------------------------------------store_aggregates
 # Sends hash of values to be incremented in nohist_resourcetracker.db  # Sends hash of values to be incremented in nohist_resourcetracker.db
Line 528  sub init_problem_globals { Line 603  sub init_problem_globals {
     undef($Apache::lonhomework::name);      undef($Apache::lonhomework::name);
     undef($Apache::lonhomework::default_type);      undef($Apache::lonhomework::default_type);
     undef($Apache::lonhomework::type);      undef($Apache::lonhomework::type);
     undef($Apache::lonhomework::problemstatus);  
 }  }
   
 sub reset_problem_globals {  sub reset_problem_globals {
Line 594  sub start_problem { Line 668  sub start_problem {
  $Apache::lonhomework::scantronmode=1;   $Apache::lonhomework::scantronmode=1;
     }      }
   
     &initialize_storage();  
     if ($target ne 'analyze') {      if ($target ne 'analyze') {
  if ($target eq 'web') {  
     &Apache::lonhomework::showhash(%Apache::lonhomework::history);  
  }  
         if ($env{'request.state'} eq 'construct') { &set_problem_state('0'); }  
  $Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');   $Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
  if (($env{'request.state'} eq 'construct') &&   if (($env{'request.state'} eq 'construct') &&
     defined($env{'form.problemtype'})) {      defined($env{'form.problemtype'})) {
Line 619  sub start_problem { Line 688  sub start_problem {
     }      }
     $Apache::lonhomework::default_type = $Apache::lonhomework::type;      $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);
       }
   
     #added vars to the scripting enviroment      #added vars to the scripting enviroment
     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';      my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';      $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
Line 656  sub start_problem { Line 736  sub start_problem {
  }   }
  #handle rand seed in construction space   #handle rand seed in construction space
  my $rndseed=&setup_rndseed($safeeval);   my $rndseed=&setup_rndseed($safeeval);
  my ($symb)=&Apache::lonxml::whichuser();   my ($symb)=&Apache::lonnet::whichuser();
  if ($env{'request.state'} ne "construct" &&    if ($env{'request.state'} ne "construct" && 
     ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {      ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
     $form_tag_start.='<input type="hidden" name="rndseed" value="'.      $form_tag_start.='<input type="hidden" name="rndseed" value="'.
Line 706  sub start_problem { Line 786  sub start_problem {
     $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';      $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
  }   }
  if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {   if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
     $msg.='The problem '.$accessmsg;      $msg.=&mt('The problem ').$accessmsg;
  } elsif ($status eq 'UNCHECKEDOUT') {   } elsif ($status eq 'UNCHECKEDOUT') {
     $msg.=&checkout_msg();      $msg.=&checkout_msg();
  } elsif ($status eq 'NOT_YET_VIEWED') {   } elsif ($status eq 'NOT_YET_VIEWED') {
Line 730  sub start_problem { Line 810  sub start_problem {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
     if ($target eq 'web') {      if ($target eq 'web') {
  $result .= &Apache::bridgetask::proctor_validation_screen();   $result .= 
       &Apache::bridgetask::proctor_validation_screen($slot);
     } elsif ($target eq 'grade') {      } elsif ($target eq 'grade') {
  &Apache::bridgetask::proctor_check_auth($slot_name,$slot,   &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
  'problem');   'problem');
     }      }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     $result.="\n $form_tag_start".      if ($status eq 'CAN_ANSWER' 
    && $slot_name ne ''
    && $Apache::lonhomework::history{'resource.0.checkedin'} eq '') {
    # unproctored slot access, self checkin
    &Apache::bridgetask::check_in('problem',undef,undef,
         $slot_name);
       }
       $result.="\n $form_tag_start \t".
       '<input type="hidden" name="submitted" value="yes" />';        '<input type="hidden" name="submitted" value="yes" />';
     # create a page header and exit      # create a page header and exit
     if ($env{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
Line 761  sub start_problem { Line 849  sub start_problem {
  $result.=$temp;   $result.=$temp;
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result=$token->[4];   $result=$token->[4];
  $result.=&Apache::edit::handle_insert();  
     } else {      } else {
  # page_start returned a starting result, delete it if we don't need it   # page_start returned a starting result, delete it if we don't need it
  $result = '';   $result = '';
Line 779  sub end_problem { Line 866  sub end_problem {
     }      }
   
     if ($target eq 'tex') {      if ($target eq 'tex') {
   
  # Figure out the front matter and replace the   # Figure out the front matter and replace the
  # INSERTTEXFRONTMATTERHERE in result with it.  note that we do   # INSERTTEXFRONTMATTERHERE in result with it.  note that we do
  # this in end_problem because whether or not we display due   # this in end_problem because whether or not we display due
Line 855  sub end_problem { Line 941  sub end_problem {
     if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}      if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}
  }   }
     } else {      } else {
  $frontmatter .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';   $frontmatter .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\'.$startminipage;
     }      }
  } else {   } else {
     if (not $env{'request.symb'} =~ m/\.page_/) {      if (not $env{'request.symb'} =~ m/\.page_/) {
  $frontmatter .= $begin_doc.$toc_line;   $frontmatter .= $begin_doc.$toc_line;
  if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}   if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}
     } else {      } else {
  $frontmatter .= '\vskip 1mm \\\\\\\\';   $frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
     }      }
  }   }
  $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;   $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
Line 912  sub end_problem { Line 998  sub end_problem {
     if (not $env{'request.symb'} =~ m/\.page_/) {      if (not $env{'request.symb'} =~ m/\.page_/) {
  $result .= $endminipage.'\end{document} ';   $result .= $endminipage.'\end{document} ';
     } else {      } else {
  $result .= '';   $result .= $endminipage;
     }      }
  }   }
     }      }
Line 939  sub end_problem { Line 1025  sub end_problem {
  $result .= &problem_edit_footer();   $result .= &problem_edit_footer();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result .= $token->[2];   $result .= $token->[2];
  $result.=&Apache::edit::handle_insertafter($token->[1]);  
     }      }
   
     if ($env{'request.state'} eq 'construct' && $target eq 'web') {      if ($env{'request.state'} eq 'construct' && $target eq 'web') {
Line 955  sub end_problem { Line 1040  sub end_problem {
 sub start_library {  sub start_library {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my ($result,$form_tag_start);      my ($result,$form_tag_start);
     if ($$tagstack[0] eq 'library') {      if ($#$tagstack eq 0 && $$tagstack[0] eq 'library') {
  &init_problem_globals('library');   &init_problem_globals('library');
  $Apache::lonhomework::type='problem';   $Apache::lonhomework::type='problem';
     }      }
Line 968  sub start_library { Line 1053  sub start_library {
  $result.=$temp;   $result.=$temp;
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result=$token->[4];   $result=$token->[4];
  $result.=&Apache::edit::handle_insert();  
     } elsif (($target eq 'web' || $target eq 'webgrade')      } elsif (($target eq 'web' || $target eq 'webgrade')
      && $$tagstack[0] eq 'library'        && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')
      && $env{'request.state'} eq "construct" ) {       && $env{'request.state'} eq "construct" ) {
  my $name=&get_resource_name($parstack,$safeeval);   my $name=&get_resource_name($parstack,$safeeval);
  ($result,$form_tag_start)=   ($result,$form_tag_start)=
Line 989  sub end_library { Line 1073  sub end_library {
     my $result='';      my $result='';
     if ($target eq 'edit') {      if ($target eq 'edit') {
  $result=&problem_edit_footer();   $result=&problem_edit_footer();
     } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&      } elsif ($target eq 'web' 
      $env{'request.state'} eq "construct") {       && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') 
        && $env{'request.state'} eq "construct") {
  $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});   $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
     }      }
     if ($$tagstack[0] eq 'library') { &reset_problem_globals('library') };      if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
    &reset_problem_globals('library');
       }
     return $result;      return $result;
 }  }
   
Line 1004  sub start_definetag { Line 1091  sub start_definetag {
   
     my $name = $token->[2]->{'name'};      my $name = $token->[2]->{'name'};
     my $skip=&Apache::lonxml::get_all_text("/definetag",$parser,$style);      my $skip=&Apache::lonxml::get_all_text("/definetag",$parser,$style);
     if ($name=~/^\//) {      if ($target eq 'web') {
  $result=   if ($name=~/^\//) {
  '<br /><table bgcolor="#FFBBBB"><tr><th>END <tt>'.$name.'</tt></th></tr>';      $result=
     } else {   '<br /><table class="LC_sty_end"><tr><th>'.
  $result=   &mt('END [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
  '<br /><table bgcolor="#BBFFBB"><tr><th>BEGIN <tt>'.$name.'</tt></th></tr>';   } else {
       $result=
    '<br /><table class="LC_sty_begin"><tr><th>'.
    &mt('BEGIN [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
    }
    $skip = &HTML::Entities::encode($skip, '<>&"');
    $result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';
     }      }
     $skip=~s/\</\&lt\;/gs;  
     $skip=~s/\>/\&gt\;/gs;  
     $result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';  
     return $result;      return $result;
 }  }
   
Line 1029  sub start_block { Line 1119  sub start_block {
     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer'  ||      if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer'  ||
  $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {   $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
  my $code = $token->[2]->{'condition'};   my $code = $token->[2]->{'condition'};
  if (defined($code)) {   if (defined($code) && $code ne '') {
     if (!$Apache::lonxml::default_homework_loaded) {      if (!$Apache::lonxml::default_homework_loaded) {
  &Apache::lonxml::default_homework_load($safeeval);   &Apache::lonxml::default_homework_load($safeeval);
     }      }
Line 1074  sub start_languageblock { Line 1164  sub start_languageblock {
  $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {   $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
  my $include = $token->[2]->{'include'};   my $include = $token->[2]->{'include'};
  my $exclude = $token->[2]->{'exclude'};   my $exclude = $token->[2]->{'exclude'};
         my %languages=&Apache::loncommon::display_languages();          my @preferred_languages=&Apache::loncommon::preferred_languages();
         $result='1';  # This should not even happen, since we should at least have the server language
  if ($include) {          if (!$preferred_languages[0]) { $preferred_languages[0]='en'; }
             $result='';  # Now loop over all languages in order of preference
             foreach (split(/\,/,$include)) {          foreach my $preferred_language (@preferred_languages) {
                 if ($languages{$_}) { $result='1'; }  # If the languageblock has no arguments, show the contents
             }             $result=1;
  }             my $found=0;
         if ($exclude) {  # Do we have an include argument?
             foreach (split(/\,/,$exclude)) {     if ($include) {
                 if ($languages{$_}) { $result='0'; }  # 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 ) {   if ( ! $result ) {
     my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,      my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,
    $style);     $style);
Line 1118  sub end_languageblock { Line 1227  sub end_languageblock {
     return $result;      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);
       $available_texts{$which} = $result;
    }
    return '';
       }
   }
   
 sub start_instructorcomment {  sub start_instructorcomment {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
Line 1196  sub end_while { Line 1355  sub end_while {
  while ($return) {   while ($return) {
     if (time-$starttime >      if (time-$starttime >
  $Apache::lonnet::perlvar{'lonScriptTimeout'}) {   $Apache::lonnet::perlvar{'lonScriptTimeout'}) {
  #$return = 0; $error=1; next;   $return = 0; $error=1; next;
     }      }
     $result.=&Apache::scripttag::xmlparse($bodytext);      $result.=&Apache::scripttag::xmlparse($bodytext);
       if ($target eq 'grade' || $target eq 'answer' ||
    $target eq 'analyze') {
    # grade/answer/analyze should produce no output but if we
    # are redirecting, the redirecter should know what to do
    # with the output
    if (!$Apache::lonxml::redirection) { undef($result); }
       }
     $return = &Apache::run::run($code,$safeeval);      $return = &Apache::run::run($code,$safeeval);
  }   }
  if ($error) {   if ($error) {
Line 1316  sub start_part { Line 1482  sub start_part {
                                      # duedates.                                       # duedates.
     }      }
     my $result='';      my $result='';
     my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);      my $id= &Apache::lonxml::get_id($parstack,$safeeval);
     if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; }  
     $Apache::inputtags::part=$id;      $Apache::inputtags::part=$id;
     push(@Apache::inputtags::partlist,$id);      push(@Apache::inputtags::partlist,$id);
     @Apache::inputtags::response=();      @Apache::inputtags::response=();
Line 1370  sub start_part { Line 1535  sub start_part {
  if ($target eq 'tex') {   if ($target eq 'tex') {
     if (not $env{'form.problem_split'}=~/yes/) {      if (not $env{'form.problem_split'}=~/yes/) {
  if ($$tagstack[-2] eq 'td') {   if ($$tagstack[-2] eq 'td') {
     $result.='\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';      $result.='\noindent \begin{minipage}{\textwidth}\noindent';
  } else {   } else {
     $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';      $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
  }   }
Line 1412  sub start_part { Line 1577  sub start_part {
     #limiting ids to only letters numbers, and space      #limiting ids to only letters numbers, and space
     $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;      $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
     $result = &Apache::edit::rebuild_tag($token);      $result = &Apache::edit::rebuild_tag($token);
     $result.=&Apache::edit::handle_insert();  
  }   }
     }      }
     return $result;      return $result;
Line 1450  sub end_part { Line 1614  sub end_part {
  $result.=&Apache::edit::end_table();   $result.=&Apache::edit::end_table();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result .= $token->[2];   $result .= $token->[2];
  $result.=&Apache::edit::handle_insertafter($token->[1]);  
     }      }
     pop @Apache::inputtags::status;      pop @Apache::inputtags::status;
     $Apache::inputtags::part='';      $Apache::inputtags::part='';
Line 1477  sub end_preduedate { Line 1640  sub end_preduedate {
     return '';      return '';
 }  }
   
   # In all the modes where <postanswerdate> text is 
   # displayable,  all we do is eat up the text between the start/stop
   # tags if the conditions are not right to display it.
 sub start_postanswerdate {  sub start_postanswerdate {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     if ($target eq 'web' || $target eq 'grade' || $target eq 'webgrade') {      my $pav = &Apache::lonnet::allowed('pav', $env{'request.course.id'}) ||
    &Apache::lonnet::allowed('pav',
      $env{'request.course.id'}.'/'.$env{'request.course.sec'});
       if ($target eq 'web' || $target eq 'grade' || $target eq 'webgrade' ||
    $target eq 'tex' ) {
  if ($Apache::lonhomework::scantronmode ||   if ($Apache::lonhomework::scantronmode ||
     $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {      $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER' ||
       (($target eq 'tex') && !$pav)) {
     &Apache::lonxml::get_all_text("/postanswerdate",$parser,$style);      &Apache::lonxml::get_all_text("/postanswerdate",$parser,$style);
  }   }
     } elsif ($target eq 'tex') {  
  &Apache::lonxml::get_all_text("/postanswerdate",$parser,$style);  
     }      }
     return '';      return '';
 }  }
Line 1592  sub end_startouttext { Line 1761  sub end_startouttext {
  ."</td>   ."</td>
 <td>".  <td>".
                  &Apache::edit::insertlist($target,$token).                   &Apache::edit::insertlist($target,$token).
    '</td><td align="right" valign="top">' .
    &Apache::loncommon::helpLatexCheatsheet().
  &Apache::edit::end_row().   &Apache::edit::end_row().
                  &Apache::edit::start_spanning_row()."\n"                   &Apache::edit::start_spanning_row()."\n".
  . &Apache::loncommon::helpLatexCheatsheet () .  
  &Apache::edit::editfield($token->[1],$text,"",80,8,1);   &Apache::edit::editfield($token->[1],$text,"",80,8,1);
     }      }
     if ($target eq 'modified') {      if ($target eq 'modified') {
Line 1612  sub start_endouttext { Line 1782  sub start_endouttext {
     if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }      if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
     if ($target eq "modified") {      if ($target eq "modified") {
  $result='<endouttext />'.   $result='<endouttext />'.
     &Apache::edit::handle_insertafter('startouttext'); }      &Apache::edit::handle_insertafter('startouttext');
       }
     return $result;      return $result;
 }  }
   
Line 1645  sub start_simpleeditbutton { Line 1816  sub start_simpleeditbutton {
         (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {          (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
         my $url=$env{'request.noversionuri'};          my $url=$env{'request.noversionuri'};
         $url=~s/\?.*$//;          $url=~s/\?.*$//;
  my ($symb) = &Apache::lonxml::whichuser();   my ($symb) = &Apache::lonnet::whichuser();
  $result='<table width="100%" bgcolor="#FFFFAA" border="2"><tr><td>'.   $result='<table width="100%" bgcolor="#FFFFAA" border="2"><tr><td>'.
                 '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'.&mt('Edit').'</a> - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.').                  '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'.&mt('Edit').'</a> - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.').
 &Apache::loncommon::help_open_topic('Caching').'</td></tr></table><br />';  &Apache::loncommon::help_open_topic('Caching').'</td></tr></table><br />';

Removed from v.1.359  
changed lines
  Added in v.1.402


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>