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

version 1.349.2.3, 2015/05/26 13:25:52 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 Apace::lonparmset();  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 1015  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 1380  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 1444  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.3  
changed lines
  Added in v.1.355


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