[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /homework lonhomework.pm

raeburn raeburn at source.lon-capa.org
Wed Sep 14 12:36:50 EDT 2016


raeburn		Wed Sep 14 16:36:50 2016 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/homework	lonhomework.pm 
  Log:
  - For 2.11
    - Backport 1.347, 1.348, 1.351, 1.352, 1.353, 1.365.
  
  
-------------- next part --------------
Index: loncom/homework/lonhomework.pm
diff -u loncom/homework/lonhomework.pm:1.344.2.4 loncom/homework/lonhomework.pm:1.344.2.5
--- loncom/homework/lonhomework.pm:1.344.2.4	Mon Aug  8 12:07:20 2016
+++ loncom/homework/lonhomework.pm	Wed Sep 14 16:36:49 2016
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Homework handler
 #
-# $Id: lonhomework.pm,v 1.344.2.4 2016/08/08 12:07:20 raeburn Exp $
+# $Id: lonhomework.pm,v 1.344.2.5 2016/09/14 16:36:49 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -861,8 +861,7 @@
        .&Apache::loncommon::head_subbox(
                 &Apache::loncommon::CSTR_pageheader());
     $result .= 
-	&Apache::lonxml::message_location().'
-            <form name="lonhomework" method="post" action="'.
+            '<form name="lonhomework" method="post" action="'.
 	    &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
             '<input type="hidden" name="problemmode" value="'.
             $env{'form.problemmode'}.'" />'.
@@ -876,7 +875,8 @@
             <input type="button" name="submitmode" value="'.&mt("View").'" '.
             'onclick="javascript:setmode(this.form,'."'view'".')" />
             <hr />
-            </div>
+            </div>'
+            .&Apache::lonxml::message_location().'
             </form>';
     &Apache::lonxml::add_messages(\$result);
     $request->print($result);
@@ -1104,27 +1104,88 @@
             '<form '.&Apache::edit::form_change_detection().' name="lonhomework" method="post" action="'.
 	    &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
 	    &Apache::structuretags::remember_problem_state().'
-            <div class="LC_edit_problem_editxml_header">
-              <table class="LC_edit_problem_header_title"><tr><td>
-               <h2>'.&mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').'</h2>
-                </td><td align="right">
-                  '.&Apache::loncommon::helpLatexCheatsheet('Problem_LON-CAPA_Functions','Script Functions').'
-                </td></tr>
-              </table>';
+            <div class="LC_edit_problem_header">
+              <div class="LC_edit_problem_header_title">'.
+                &mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').
+                </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');
-         
-         $result.='<hr style="clear:both;" />'.&Apache::lonxml::message_location().'</div>'.  
-                  '<textarea '.&Apache::edit::element_change_detection().
-	              ' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" '.
-		      ' name="editxmltext" id="LC_editxmltext">'.
-		      &HTML::Entities::encode($problem,'<>&"').'</textarea>
-            <div id="LC_aftertextarea">
-            </div>
-            </form>'.&Apache::loncommon::end_page();
-	&Apache::lonxml::add_messages(\$result);
-	$request->print($result);
+    $result.='<div>';
+
+    $result .= '<ol class="LC_primary_menu" style="display:inline-block;font-size:90%;vertical-align:middle;">';
+
+    unless ($env{'environment.nocodemirror'}) {
+        # dropdown menus
+        $result .= Apache::lonmenu::create_submenu("#", "",
+            &mt("Problem Templates"), template_dropdown_datastructure());
+
+        $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 .= '</div></div>' .
+        &Apache::lonxml::message_location() .
+        &Apache::loncommon::xmleditor_js() .
+        '<textarea ' . &Apache::edit::element_change_detection() .
+        ' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" ' .
+        ' name="editxmltext" id="LC_editxmltext">' .
+        &HTML::Entities::encode($problem,'<>&"') .
+        '</textarea> <div id="LC_aftertextarea"> </div> </form>';
+
+    my $resource = $env{'request.ambiguous'};
+    unless($env{'environment.nocodemirror'}){
+        $result .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined-xml.css">
+        <script src="/adm/codemirror/codemirror-compressed-xml.js"></script>
+        <script>
+            CodeMirror.defineMode("mixedmode", function(config) {
+                return CodeMirror.multiplexingMode(
+                    CodeMirror.getMode(config, "xml"),
+                    {
+                        open: "\<script type=\"loncapa/perl\"\>", close: "\</script\>",
+                        mode: CodeMirror.getMode(config, "perl"),
+                        delimStyle: "tag",
+                    }
+              );
+            });
+            var cm = CodeMirror.fromTextArea(document.getElementById("LC_editxmltext"),
+            {
+                mode: "mixedmode",
+                lineWrapping: true,
+                lineNumbers: true,
+                tabSize: 4,
+                indentUnit: 4,
+
+                autoCloseTags: true,
+                autoCloseBrackets: true,
+                height: "auto",
+                styleActiveLine: true,
+
+                extraKeys: {
+                    "Tab": "indentMore",
+                    "Shift-Tab": "indentLess",
+                }
+            });
+            restoreScrollPosition("'.$resource.'");
+        </script>';
+    }
+
+    $result .= &Apache::loncommon::end_page();
+    &Apache::lonxml::add_messages(\$result);
+    $request->print($result);
     }
     return '';
 }
@@ -1211,21 +1272,35 @@
     undef($Apache::lonhomework::parsing_a_task);
 }
 
+
+# function extracted from get_template_html
+# returns "key" -> list
+# key: path of template
+# value 1: title
+# value 2: category
+# value 3: name of help topic ???
 sub get_template_list {
     my ($extension) = @_;
+
+    my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}.
+		     '/templates/*.'.$extension);
+    @files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')),
+                      (&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')),
+                     &mt(&Apache::lonnet::metadata($_, 'help'))]} (@files);
+    @files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files);
+    return @files;
+}
+
+sub get_template_html {
+    my ($extension) = @_;
     my $result;
     my @allnames;
     &Apache::lonxml::debug("Looking for :$extension:");
     my $glob_extension  = $extension;
     if ($extension eq 'survey' || $extension eq 'exam') {
-	$glob_extension = 'problem';
+        $glob_extension = 'problem';
     }
-    my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}.
-		     '/templates/*.'.$glob_extension);
-    @files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')),
-                      (&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')),
-                      &Apache::lonnet::metadata($_, 'help')]} (@files);
-    @files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files);
+    my @files = &get_template_list($extension);
     my ($midpoint,$seconddiv,$numfiles);
     my @noexamplelink = ('blank.problem','blank.library','script.library');
     $numfiles = 0;
@@ -1287,6 +1362,14 @@
 sub newproblem {
     my ($request) = @_;
 
+    if ($env{'form.mode'} eq 'blank'){
+        my $dest = &Apache::lonnet::filelocation("",$request->uri);
+        my $templatefilename =
+            $request->dir_config('lonIncludes').'/templates/blank.problem';
+        &File::Copy::copy($templatefilename,$dest);
+        &renderpage($request,$dest);
+        return;
+
     if ($env{'form.template'}) {
 	my $file = $env{'form.template'};
 	my $dest = &Apache::lonnet::filelocation("",$request->uri);
@@ -1297,7 +1380,7 @@
 
     my ($extension) = ($request->uri =~ m/\.(\w+)$/);
     &Apache::lonxml::debug("Looking for :$extension:");
-    my $templatelist=&get_template_list($extension);
+    my $templatelist=&get_template_html($extension);
     if ($env{'form.newfile'} && !$templatelist) {
 	# no templates found
 	my $templatefilename =
@@ -1409,6 +1492,8 @@
 		&renderpage($request,$file);
 	    }
 	} else {
+            &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+                                                    ['mode']);
 	    # requested file doesn't exist in contruction space
 	    &newproblem($request);
 	}
@@ -1426,5 +1511,174 @@
 
 }
 
+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('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|'|\\'|g;
+    return $return;
+}
+
 1;
 __END__


More information about the LON-CAPA-cvs mailing list