--- loncom/homework/structuretags.pm 2019/08/07 21:44:28 1.512.2.17 +++ loncom/homework/structuretags.pm 2015/01/19 15:35:53 1.527 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.512.2.17 2019/08/07 21:44:28 raeburn Exp $ +# $Id: structuretags.pm,v 1.527 2015/01/19 15:35:53 goltermann Exp $ # # Copyright Michigan State University Board of Trustees # @@ -224,55 +224,10 @@ sub end_tex { } sub homework_js { - my ($postsubmit,$timeout); - if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) { - my $crstype; - if (&Apache::loncommon::course_type() eq 'Community') { - $crstype = 'community'; - } else { - if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) { - $crstype = 'official'; - } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) { - $crstype = 'textbook'; - } else { - $crstype = 'unofficial'; - } - } - $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'}; - if ($postsubmit eq '') { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); - $postsubmit = $domdefs{'postsubmit'}; - unless ($postsubmit eq 'off') { - $timeout = $domdefs{$crstype.'postsubtimeout'}; - } - } elsif ($postsubmit eq '0') { - $postsubmit = 'off'; - } elsif ($postsubmit eq '1') { - $postsubmit = 'on'; - $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'}; - if ($timeout eq '') { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); - $timeout = $domdefs{$crstype.'postsubtimeout'}; - } - } - if ($timeout eq '') { - $timeout = 60; - } - } else { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); - $postsubmit = $domdefs{'postsubmit'}; - unless ($postsubmit eq 'off') { - $timeout = 60; - } - } - my $jstimeout = 0; - if ($timeout) { - $jstimeout = 1000 * $timeout; - } return &Apache::loncommon::resize_textarea_js(). - &Apache::loncommon::colorfuleditor_js(). + &Apache::loncommon::colorfuleditor_js(). &setmode_javascript(). - <<"JS"; + <<'JS'; @@ -419,17 +341,13 @@ sub page_start { $extra_head .= &homework_js(). &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); if (&Apache::lonhtmlcommon::htmlareabrowser()) { - my %textarea_args; - if (($env{'request.state'} ne 'construct') || - ($env{'environment.nocodemirror'})) { - %textarea_args = ( + my %textarea_args = ( dragmath => 'math', ); - } $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args); } my $is_task = ($env{'request.uri'} =~ /\.task$/); - my ($needs_upload,$partlist); + my $needs_upload; my ($symb)= &Apache::lonnet::whichuser(); my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb); if ($is_task) { @@ -447,12 +365,6 @@ sub page_start { unless ($is_page) { $needs_upload = 1; } - if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) { - my $res = $navmap->getBySymb($symb); - if (ref($res)) { - $partlist = $res->parts(); - } - } } } } else { @@ -464,17 +376,10 @@ sub page_start { if (ref($mapres)) { $is_page = $mapres->is_page(); } - if ($is_page) { - if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) { - my $res = $navmap->getBySymb($symb); - if (ref($res)) { - $partlist = $res->parts(); - } - } - } else { + unless ($is_page) { my $res = $navmap->getBySymb($symb); if (ref($res)) { - $partlist = $res->parts(); + my $partlist = $res->parts(); if (ref($partlist) eq 'ARRAY') { foreach my $part (@{$partlist}) { my @types = $res->responseType($part); @@ -496,9 +401,7 @@ sub page_start { } } if ($needs_upload) { - $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(). - ''; + $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(); } } @@ -612,7 +515,7 @@ sub page_start { "\t".''."\n"; } } - return ($page_start,$form_tag_start,$partlist); + return ($page_start,$form_tag_start); } #use Time::HiRes(); @@ -643,7 +546,7 @@ sub get_resource_name { } sub setup_rndseed { - my ($safeeval,$target,$probpartlist)=@_; + my ($safeeval,$target)=@_; my ($symb)=&Apache::lonnet::whichuser(); my ($questiontype,$set_safespace,$rndseed); if ($target eq 'analyze') { @@ -652,11 +555,10 @@ sub setup_rndseed { unless (defined($questiontype)) { $questiontype = $Apache::lonhomework::type; } - if (($env{'request.state'} eq "construct") - || ($symb eq '') - || ($Apache::lonhomework::type eq 'practice') - || ($Apache::lonhomework::history{'resource.CODE'}) - || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) { + if ($env{'request.state'} eq "construct" + || $symb eq '' + || $Apache::lonhomework::type eq 'practice' + || $Apache::lonhomework::history{'resource.CODE'}) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['rndseed']); $rndseed=$env{'form.rndseed'}; @@ -665,9 +567,7 @@ sub setup_rndseed { if (!$rndseed) { $rndseed=time; } - unless ($env{'form.code_for_randomlist'}) { - $env{'form.rndseed'}=$rndseed; - } + $env{'form.rndseed'}=$rndseed; } if (($env{'request.state'} eq "construct") && ($Apache::lonhomework::type eq 'randomizetry')) { @@ -695,11 +595,7 @@ sub setup_rndseed { $rndseed=join(':',&Apache::lonnet::digest($rndseed)); } } - if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) { - $env{'form.CODE'} = $env{'form.code_for_randomlist'}; - $rndseed=&Apache::lonnet::rndseed(); - undef($env{'form.CODE'}); - } elsif ($Apache::lonhomework::history{'resource.CODE'}) { + if ($Apache::lonhomework::history{'resource.CODE'}) { $rndseed=&Apache::lonnet::rndseed(); } $set_safespace = 1; @@ -711,13 +607,7 @@ sub setup_rndseed { } unless (($target eq 'analyze') && (defined($rndseed))) { $rndseed=&Apache::lonnet::rndseed(); - my $partfortries = $Apache::inputtags::part; - if (ref($probpartlist) eq 'ARRAY') { - if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) { - $partfortries = $probpartlist->[0]; - } - } - my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"}; + my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') { $curr_try ++; } @@ -725,7 +615,7 @@ sub setup_rndseed { $rndseed = $1; } if ($curr_try) { - my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries"); + my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { my $inc = int(($curr_try-1)/$reqtries); $rndseed += $inc; @@ -735,9 +625,6 @@ sub setup_rndseed { } } $set_safespace = 1; - if ($target eq 'grade') { - $Apache::lonhomework::rawrndseed = $rndseed; - } } if ($set_safespace) { if ($safeeval) { @@ -767,33 +654,235 @@ sub problem_edit_action_button { sub problem_edit_buttons { my ($mode)=@_; -# Buttons that save - my $result = '
'; - if ($mode eq 'editxml') { - $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); - $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); - } else { - $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); - $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); - } - $result.="\n
\n"; # Buttons that do not save - $result .= '
'. + my $result='
'. &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); if ($mode eq 'editxml') { $result.=&problem_edit_action_button('subedit','edit','e','Edit',1); $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); - if ($env{'environment.nocodemirror'}) { - $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); - } + $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); } else { $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1); $result.=&problem_edit_action_button('subundo','undo','u','Undo',1); } $result.="\n
"; +# Buttons that save + $result.='
'; + if ($mode eq 'editxml') { + $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); + $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); + } else { + $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); + $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); + } + $result.="\n
\n"; return $result; } +sub insert_menu_datastructure { + + my $template_menu = &template_dropdown_datastructure(); + my $responseblock_menu = &responseblock_dropdown_datastructure(); + my $conditional_scripting = &conditional_scripting_datastructure(); + my $misc = &misc_datastructure(); + + my @menu = ($template_menu, $responseblock_menu, $conditional_scripting, $misc); + return \@menu; + +} + +sub template_dropdown_datastructure { + # gathering the all templates and their path, title, category and help topic + my @templates = &Apache::lonhomework::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]; + } + + my $templDropdown = [$catList, &mt("Complete Problem Templates"), undef]; + return $templDropdown; +} + +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 Response"), undef], + ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N Statement"), undef], + ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Optionresponse"), undef], + ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef] + ], + &mt("Misc"), + 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 Structure"), undef] + ], + &mt("Chemical"), + 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 + ]; + + my $cats = [[$mathCat, $miscCat, $chemCat, $textCat], &mt("Response Types"), undef]; + return $cats; +} + + +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 = ' + + + +'; + + my $cat = [ + [ + ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Tag"), 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 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] + ], + &mt("Contitional Scripting"), + undef + ]; + + return $cat; +} + +sub misc_datastructure { + + my $graphicalCat = [ + [ + ["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] + ], + "Graphical", + undef + ]; + + my $advancedCat = [ + [ + ["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] + ], + "advanced", + undef + ]; + + my $cats = [[$graphicalCat, $advancedCat], &mt("misc"), undef]; + return $cats; +} + +# helper routine for the datastructure building subroutines +sub default_xml_tag { + my ($tag) = @_; + return "\n<$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|\n|\\r\\n|g; + $return =~ s|'|\\'|g; + $return =~ s|'|\\'|g; + return $return; +} + sub problem_edit_header { my ($mode)=@_; my $return = ''. @@ -801,11 +890,13 @@ sub problem_edit_header {
'.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' -
'. - ''. - &problem_edit_buttons(); - - $return .= '
' . &Apache::lonxml::message_location(); +
'. + ''. + &problem_edit_buttons(); + + $return.='
+
' + .&Apache::lonxml::message_location(); $return .= ' '; @@ -818,8 +909,7 @@ sub problem_edit_header { $(\'.LC_edit_actionbar\').scrollToFixed( { fixed: function(){ - //$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\'); - $(this).find(\'.LC_edit_actionbar\'); + $(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\'); } } ); @@ -831,7 +921,6 @@ sub problem_edit_header { return $return; } - sub problem_edit_footer { my $resource = $env{'request.ambiguous'}; return '
@@ -907,7 +996,7 @@ sub problem_web_to_edit_header { ".&mt("Problem Type:")."