Diff for /loncom/homework/lonhomework.pm between versions 1.349.2.2 and 1.355

version 1.349.2.2, 2015/04/14 21:35:56 version 1.355, 2015/06/29 15:42:07
Line 49  use Apache::matchresponse(); Line 49  use Apache::matchresponse();
 use Apache::chemresponse();  use Apache::chemresponse();
 use Apache::functionplotresponse();  use Apache::functionplotresponse();
 use Apache::drawimage();  use Apache::drawimage();
   use Apache::loncapamath();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonparmset();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use HTML::Entities();  use HTML::Entities();
Line 1014  sub editxmlmode { Line 1016  sub editxmlmode {
                 &mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').                  &mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').
               '</div><div class="LC_edit_actionbar" id="actionbar">';                '</div><div class="LC_edit_actionbar" id="actionbar">';
   
         $result.='<input type="hidden" name="problemmode" value="saveedit" />'.      $result.='<input type="hidden" name="problemmode" value="saveedit" />'.
                   &Apache::structuretags::problem_edit_buttons('editxml');                    &Apache::structuretags::problem_edit_buttons('editxml');
         $result.='<div class="LC_edit_problem_discards">';      $result.='<div>';
   
  unless ($env{'environment.nocodemirror'}) {      $result .= '<ol class="LC_primary_menu" style="display:inline-block;font-size:90%;vertical-align:middle;">';
  # dropdown menues  
     $result .= '<ol class="LC_primary_menu LC_floatleft">'.      unless ($env{'environment.nocodemirror'}) {
     &Apache::lonmenu::create_submenu("#", "", &mt("Insert Menu"), &Apache::structuretags::insert_menu_datastructure(),"").'</ol>';          # dropdown menus
  }          $result .= Apache::lonmenu::create_submenu("#", "", 
     $result .= '<ol class="LC_primary_menu LC_floatleft">'.              &mt("Problem Templates"), template_dropdown_datastructure());
     Apache::lonmenu::create_submenu("#", "", &mt("Help"), &Apache::structuretags::helpmenu_datastructure(),"").'</ol>';  
     $result.="</div>";          $result .= Apache::lonmenu::create_submenu("#", "", 
               &mt("Response Types"), responseblock_dropdown_datastructure());
   
           $result .= Apache::lonmenu::create_submenu("#", "", 
               &mt("Conditional Blocks"), conditional_scripting_datastructure());
   
           $result .= Apache::lonmenu::create_submenu("#", "", 
               &mt("Miscellaneous"), misc_datastructure());
       }
   
       $result .= Apache::lonmenu::create_submenu("#", "", 
           &mt("Help") . ' <img src="/adm/help/help.png" alt="' . &mt("Help") .
           '" style="vertical-align:text-bottom; height: auto; margin:0; "/>', 
           helpmenu_datastructure(),"");
   
       $result.="</ol></div>";
                     
          $result.='<hr style="clear:both;visibility:hidden" /></div></div>'.&Apache::lonxml::message_location().      $result .= '</div></div>' . 
                   &Apache::loncommon::xmleditor_js().          &Apache::lonxml::message_location() .
   '<textarea '.&Apache::edit::element_change_detection().          &Apache::loncommon::xmleditor_js() .
               ' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" '.          '<textarea ' . &Apache::edit::element_change_detection() .
       ' name="editxmltext" id="LC_editxmltext">'.          ' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" ' .
       &HTML::Entities::encode($problem,'<>&"').'</textarea>          ' name="editxmltext" id="LC_editxmltext">' .
             <div id="LC_aftertextarea">          &HTML::Entities::encode($problem,'<>&"') .
             </div>          '</textarea> <div id="LC_aftertextarea"> </div> </form>';
         </form>';  
     my $resource = $env{'request.ambiguous'};      my $resource = $env{'request.ambiguous'};
     unless($env{'environment.nocodemirror'}){      unless($env{'environment.nocodemirror'}){
                   $result .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined-xml.css">
         $result .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined-xml.css">          <script src="/adm/codemirror/codemirror-compressed-xml.js"></script>
         <script src="/adm/codemirror/codemirror-compressed-xml.js"></script>          <script>
         <script>              CodeMirror.defineMode("mixedmode", function(config) {
             CodeMirror.defineMode("mixedmode", function(config) {                  return CodeMirror.multiplexingMode(
                 return CodeMirror.multiplexingMode(                      CodeMirror.getMode(config, "xml"),
                     CodeMirror.getMode(config, "xml"),                      {
                     {                          open: "\<script type=\"loncapa/perl\"\>", close: "\</script\>",
                         open: "\<script type=\"loncapa/perl\"\>", close: "\</script\>",                          mode: CodeMirror.getMode(config, "perl"),
                         mode: CodeMirror.getMode(config, "perl"),                          delimStyle: "tag",
                         delimStyle: "tag",                      }
                     }                );
               );              });
             });              var cm = CodeMirror.fromTextArea(document.getElementById("LC_editxmltext"),
             var cm = CodeMirror.fromTextArea(document.getElementById("LC_editxmltext"),              {
             {                  mode: "mixedmode",
                 mode: "mixedmode",                  lineWrapping: true,
                 lineWrapping: true,                  lineNumbers: true,
                 lineNumbers: true,                  tabSize: 4,
                 tabSize: 4,                  indentUnit: 4,
                 indentUnit: 4,  
                   autoCloseTags: true,
                 autoCloseTags: true,                  autoCloseBrackets: true,
                 autoCloseBrackets: true,                  height: "auto",
                 height: "auto",                  styleActiveLine: true,
                 styleActiveLine: true,                  
                                   extraKeys: {
                 extraKeys: {                      "Tab": "indentMore",
                     "Tab": "indentMore",                      "Shift-Tab": "indentLess",
                     "Shift-Tab": "indentLess",                  }
                 }              });
             });              restoreScrollPosition("'.$resource.'");
             restoreScrollPosition("'.$resource.'");          </script>';
         </script>';      }
     }  
         $result .= &Apache::loncommon::end_page();      $result .= &Apache::loncommon::end_page();
         &Apache::lonxml::add_messages(\$result);      &Apache::lonxml::add_messages(\$result);
         $request->print($result);      $request->print($result);
     }      }
     return '';      return '';
 }  }
Line 1331  sub update_construct_style { Line 1348  sub update_construct_style {
     }      }
 }  }
   
 # Sets timer to zero for the entire folder containing the current resource for the  #
 # current user.  # Sets interval for current user so time left will be zero, either for the entire folder 
   # containing the current resource, or just the resource, depending on value of first item
   # in interval array retrieved from EXT("resource.0.interval");
   #
 sub zero_timer {  sub zero_timer {
     my $symb = shift;      my ($symb) = @_;
     my $first_access = &Apache::lonnet::get_first_access("map",$symb);      my ($hastimeleft,$first_access,$now);
     my $done_time = time() - $first_access;      my @interval=&Apache::lonnet::EXT("resource.0.interval");
     &Apache::lonparmset::storeparm_by_symb($symb,"0_interval","2",$done_time,      if (@interval > 1) {
             "date_interval",$env{'user.name'},$env{'user.domain'},,'',);          if ($interval[1] eq 'course') {
               return;
           } else {
               my $now = time;
               my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb);
               if ($first_access > 0) {
                   if ($first_access+$interval[0] > $now) {
                       my $done_time = $now - $first_access;
                       my $snum = 1;
                       if ($interval[1] eq 'map') {
                           $snum = 2;
                       }
                       my $result = 
                           &Apache::lonparmset::storeparm_by_symb_inner($symb,'0_interval',
                                                                        $snum,$done_time,
                                                                        'date_interval',
                                                                        $env{'user.name'},
                                                                        $env{'user.domain'});
                       return $result;
                   }
               }
           }
       }
       return;
 }  }
   
   
 sub handler {  sub handler {
     #my $t0 = [&gettimeofday()];      #my $t0 = [&gettimeofday()];
     my $request=$_[0];      my $request=$_[0];
   
     my ($symb) = &Apache::lonnet::whichuser();  
   
     # Set the event timer to zero if the "done button" was clicked.  The button is   
     # part of the doneButton form created in lonmenu.pm  
     if ($env{"form.done"} eq "true") {  
         &zero_timer($symb);  
         $env{"form.done"} = "";  
     }  
   
     $Apache::lonxml::request=$request;      $Apache::lonxml::request=$request;
     $Apache::lonxml::debug=$env{'user.debug'};      $Apache::lonxml::debug=$env{'user.debug'};
     $env{'request.uri'}=$request->uri;      $env{'request.uri'}=$request->uri;
Line 1363  sub handler { Line 1396  sub handler {
     my $file=&Apache::lonnet::filelocation("",$request->uri);      my $file=&Apache::lonnet::filelocation("",$request->uri);
   
     #check if we know where we are      #check if we know where we are
     if ($env{'request.course.fn'} && !&Apache::lonnet::symbread()) {       if ($env{'request.course.fn'} && !&Apache::lonnet::symbread('','',1,1)) {
  # if we are browsing we might not be able to know where we are   # if we are browsing we might not be able to know where we are
  if ($Apache::lonhomework::browse ne 'F' &&    if ($Apache::lonhomework::browse ne 'F' && 
     $env{'request.state'} ne "construct") {      $env{'request.state'} ne "construct") {
Line 1377  sub handler { Line 1410  sub handler {
  &unset_permissions();   &unset_permissions();
  return OK;   return OK;
     }      }
   
     &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:$Apache::lonhomework::modifygrades:$Apache::lonhomework::queuegrade");      &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:$Apache::lonhomework::modifygrades:$Apache::lonhomework::queuegrade");
     &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});      &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});
       my ($symb) = &Apache::lonnet::whichuser();
     &Apache::lonxml::debug('symb is '.$symb);      &Apache::lonxml::debug('symb is '.$symb);
     if ($env{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
  if ( -e $file ) {   if ( -e $file ) {
Line 1406  sub handler { Line 1441  sub handler {
     &newproblem($request);      &newproblem($request);
  }   }
     } else {      } else {
           # Set the event timer to zero if the "done button" was clicked.  The button is
           # part of the doneButton form created in lonmenu.pm
           if ($symb && $env{'form.LC_interval_done'} eq 'true') {  
               &zero_timer($symb);
               undef($env{'form.LC_interval_done'});
           }
  # just render the page normally outside of construction space   # just render the page normally outside of construction space
  &Apache::lonxml::debug("not construct");   &Apache::lonxml::debug("not construct");
  &renderpage($request,$file);   &renderpage($request,$file);
Line 1419  sub handler { Line 1460  sub handler {
   
 }  }
   
   sub template_dropdown_datastructure {
       # gathering the all templates and their path, title, category and help topic
       my @templates = get_template_list('problem');
       # template category => title
       my %tmplthash = ();
       # template title => path
       my %tmpltcontent = ();
   
       foreach my $template (@templates){
           # put in hash if the template is not empty
           unless ($template->[1] eq ''){
               push(@{$tmplthash{$template->[2]}}, $template->[1]);
               push(@{$tmpltcontent{$template->[1]}},$template->[0]);
           }
       }
   
    my $catList = [];
       foreach my $cat (sort keys %tmplthash) {
    my $catItems = [];
           foreach my $title (sort @{$tmplthash{$cat}}) {
               my $path = $tmpltcontent{$title}->[0];
               my $code;
               open(FH, "<$path");
               while(<FH>){
                   $code.= $_ unless $_ =~ /(<problem>)|(<\/problem>)/;
               }
               close(FH);
   
    if ($code ne '') {
                   my $href = 'javascript:insertText(\'' . &convert_for_js(&HTML::Entities::encode($code,'<>&"')) . '\')';
    my $currItem = [$href, $title, undef];
    push @{$catItems}, $currItem;
    }
           }
    push @{$catList}, [$catItems, $cat, undef];
       }
   
       return $catList;
   }
   
   sub responseblock_dropdown_datastructure {
   
    my $mathCat = [
    [
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef]
    ], 
    &mt("Math"), 
    undef
    ];
   
    my $miscCat = [
    [
               ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef],
               ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef],
               ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef],
               ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_matchresponse())) . "\')", &mt("Match Two Lists"), undef],
               ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N statements"), undef],
               ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Select from Options"), undef], 
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef]
    ],
    &mt("Miscellaneous"),
    undef
    ];
   
    my $chemCat = [
    [
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Chemical Structure"), undef]
    ],
    &mt("Chemistry"),
    undef
    ];
   
    my $textCat = [
    [
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef]
    ],
    &mt("Text"),
    undef
    ];
   
       return [$mathCat, $miscCat, $chemCat, $textCat];
   }
   
   
   sub conditional_scripting_datastructure {
   # TODO: corresponding routines should be used for the javascript:insertText parts
   # instead of the placeholder routine default_xml_tag with the tags
   # e.g. &default_xml_tag("postanswerdate") should be replaced with a routine which
   # returns the corresponding content for this case
   
   #TODO translated is currently temporarily here, another solution should be found where the
   # needed string can be retrieved
   
    my $translatedTag = '
   <translated>
       <lang which="en"></lang>
       <lang which="default"></lang>
   </translated>';
       return [
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Block"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Date Block"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef],
    ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef]
           ];
   }
   
   sub misc_datastructure {
       return [
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_img())) . "\')", &mt("Image"), undef],
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::lonplot::insert_gnuplot())) . "\')", &mt("GNU Plot"), undef],
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicstructure())) . "\')", &mt("Organic Structure"), undef],
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_script())) . "\')", &mt("Script Block"), undef],
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("allow"))) . "\')", &mt("File Dependencies"), undef],
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("import"))) . "\')", &mt("Import a File"), undef],
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::londefdef::insert_meta())) . "\')", &mt("Custom Metadata"), undef],
           ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("part"))) . "\')", &mt("Problem Part"), undef]
       ];
   }
   
   # helper routine for the datastructure building subroutines
   sub default_xml_tag {
    my ($tag) = @_;
    return "\n<$tag></$tag>";
   }
   
   
   sub helpmenu_datastructure {
   
    my $width = 500;
    my $height = 600;
   
    my $helpers = [
    ['Problem_LON-CAPA_Functions', &mt('Script Functions')],
    ['Greek_Symbols', &mt('Greek Symbols')],
     ['Other_Symbols', &mt('Other Symbols')],
    ['Authoring_Output_Tags', &mt('Output Tags')],
    ['Authoring_Multilingual_Problems', 
    &mt('How to create problems in different languages')]
    ];
   
    my $help_structure = [];
   
    foreach my $count (0..(scalar(@{$helpers})-1)) {
    my $filename = $helpers->[$count]->[0];
    my $title = $helpers->[$count]->[1];
    my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename.hlp',$width,$height,'yes');");
    push @{$help_structure}, [$href, $title, undef];
    }
   
    return $help_structure;
   }
   
   # we need substitution to not break javascript code
   sub convert_for_js {
       my $return = shift;
           $return =~ s|script|ESCAPEDSCRIPT|g;
           $return =~ s|\\|\\\\|g;
           $return =~ s|\n|\\r\\n|g;
           $return =~ s|'|\\'|g;
    $return =~ s|&#39;|\\&#39;|g;
       return $return;
   }
   
 1;  1;
 __END__  __END__

Removed from v.1.349.2.2  
changed lines
  Added in v.1.355


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