--- loncom/homework/lonhomework.pm 2013/08/20 14:37:33 1.339
+++ loncom/homework/lonhomework.pm 2015/04/17 12:33:56 1.352
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Homework handler
#
-# $Id: lonhomework.pm,v 1.339 2013/08/20 14:37:33 bisitz Exp $
+# $Id: lonhomework.pm,v 1.352 2015/04/17 12:33:56 droeschl Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -451,13 +451,14 @@ sub check_access {
$datemsg=$date;
} elsif ($type eq 'opendate') {
$status='CLOSED';
- $datemsg = &mt("will open on")." $date";
+ $datemsg = &mt('will open on [_1]',$date);
} elsif ($type eq 'duedate') {
$status='CAN_ANSWER';
- $datemsg = &mt("is due at")." $date";
+ $datemsg = &mt('is due at [_1]',$date);
} elsif ($type eq 'answerdate') {
$status='CLOSED';
- $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";
+ $datemsg = &mt('was due on [_1], and answers will be available on [_2]',
+ $lastdate,$date);
}
}
if ($status eq 'CAN_ANSWER' ||
@@ -468,7 +469,6 @@ sub check_access {
if ( $tries eq '' ) { $tries = '0'; }
if ( $maxtries eq '' &&
$env{'request.state'} ne 'construct') { $maxtries = '2'; }
- $Apache::lonhomework::results{'resource.'.$id.'.maxtries'}=$maxtries;
if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }
# if (correct and show prob status) or excused then CANNOT_ANSWER
if ( ($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/)
@@ -540,7 +540,7 @@ sub due_date {
} else {
$date = $due_date;
}
- return $date
+ return $date;
}
sub seconds_to_human_length {
@@ -589,7 +589,7 @@ sub showarray {
sub showhashsubset {
my ($hash,$keyre) = @_;
my $resultkey;
- foreach $resultkey (sort keys %$hash) {
+ foreach $resultkey (sort(keys(%$hash))) {
if ($resultkey !~ /$keyre/) { next; }
if (ref($$hash{$resultkey}) eq 'ARRAY' ) {
&Apache::lonxml::debug("$resultkey ---- ".
@@ -767,8 +767,7 @@ sub analyze_header {
.&Apache::loncommon::head_subbox(
&Apache::loncommon::CSTR_pageheader());
$result .=
- &Apache::lonxml::message_location().'
-
';
+ '
+ .&Apache::lonxml::message_location().
+ '';
&Apache::lonxml::add_messages(\$result);
$request->print($result);
$request->rflush();
@@ -962,9 +962,8 @@ sub editxmlmode {
$problem='';
}
-
if (($env{'form.problemmode'} eq 'saveeditxml') ||
- ($env{'form.problemmode'} eq 'saveviewxml') ||
+ ($env{'form.problemmode'} eq 'saveviewxml') ||
($env{'form.problemmode'} eq 'undoxml')) {
my $error=&handle_save_or_undo($request,\$problem,
\$env{'form.editxmltext'});
@@ -1010,27 +1009,88 @@ sub editxmlmode {
'';
+
+ my $resource = $env{'request.ambiguous'};
+ unless($env{'environment.nocodemirror'}){
+ $result .= '
+
+ ",
+ 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.'");
+ ';
+ }
+
+ $result .= &Apache::loncommon::end_page();
+ &Apache::lonxml::add_messages(\$result);
+ $request->print($result);
}
return '';
}
@@ -1065,11 +1125,13 @@ sub renderpage {
$problem='';
my $filename=(split('/',$file))[-1];
my $error =
- &mt('Unable to find [_1]',
- ''.$filename.'');
+ ''
+ .&mt('Unable to find [_1]',
+ ''.$filename.'')
+ ."
";
$result.=
&Apache::loncommon::simple_error_page($request,'Not available',
- $error,{'no_auto_mt_msg'});
+ $error,{'no_auto_mt_msg' => 1});
return;
}
@@ -1117,7 +1179,25 @@ sub finished_parsing {
undef($Apache::lonhomework::parsing_a_task);
}
-sub get_template_list {
+# 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;
@@ -1126,13 +1206,9 @@ sub get_template_list {
if ($extension eq 'survey' || $extension eq 'exam') {
$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')),
- &mt(&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;
foreach my $file (@files) {
next if ($file->[1] !~ /\S/);
@@ -1171,11 +1247,16 @@ sub get_template_list {
if ($file->[3]) {
$result.=&Apache::loncommon::help_open_topic($file->[3]);
}
+ # Provide example link
my $filename=$file->[0];
$filename=~s{^\Q$londocroot\E}{};
- $result.=' '
- .&Apache::loncommon::modal_link($filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')
- .'
'."\n";
+ if (!(grep($filename =~ /\Q$_\E$/,@noexamplelink))) {
+ $result .= ' '
+ .&Apache::loncommon::modal_link(
+ $filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')
+ .'';
+ }
+ $result .= '
'."\n";
$count ++;
}
if ($numfiles > 0) {
@@ -1187,6 +1268,12 @@ sub get_template_list {
sub newproblem {
my ($request) = @_;
+ if ($env{'form.mode'} eq 'blank'){
+ my $dest = &Apache::lonnet::filelocation("",$request->uri);
+ &File::Copy::copy('/home/httpd/html/res/adm/includes/templates/blank.problem',$dest);
+ &renderpage($request,$dest);
+ return;
+ }
if ($env{'form.template'}) {
my $file = $env{'form.template'};
my $dest = &Apache::lonnet::filelocation("",$request->uri);
@@ -1197,7 +1284,7 @@ sub newproblem {
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 =
@@ -1271,7 +1358,7 @@ sub handler {
my $file=&Apache::lonnet::filelocation("",$request->uri);
#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 ($Apache::lonhomework::browse ne 'F' &&
$env{'request.state'} ne "construct") {
@@ -1309,6 +1396,8 @@ sub handler {
&renderpage($request,$file);
}
} else {
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['mode']);
# requested file doesn't exist in contruction space
&newproblem($request);
}
@@ -1326,5 +1415,174 @@ 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(){
+ $code.= $_ unless $_ =~ /()|(<\/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 = '
+
+
+
+';
+ 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]
+ ];
+}
+
+# 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|'|\\'|g;
+ return $return;
+}
+
1;
__END__