--- loncom/homework/structuretags.pm 2023/07/05 20:57:30 1.512.2.24.2.3
+++ 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.24.2.3 2023/07/05 20:57:30 raeburn Exp $
+# $Id: structuretags.pm,v 1.527 2015/01/19 15:35:53 goltermann Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -62,9 +62,7 @@ use Apache::lonxml;
use Apache::londefdef;
use Apache::lonenc();
use Apache::loncommon();
-use Apache::lonnavmaps;
use Time::HiRes qw( gettimeofday tv_interval );
-use HTML::Entities();
use lib '/home/httpd/lib/perl/';
use LONCAPA;
@@ -226,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,45 +546,19 @@ sub get_resource_name {
}
sub setup_rndseed {
- my ($safeeval,$target,$probpartlist)=@_;
+ my ($safeeval,$target)=@_;
my ($symb)=&Apache::lonnet::whichuser();
- my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);
+ my ($questiontype,$set_safespace,$rndseed);
if ($target eq 'analyze') {
$questiontype = $env{'form.grade_questiontype'};
}
unless (defined($questiontype)) {
$questiontype = $Apache::lonhomework::type;
}
- if ($Apache::lonhomework::type eq 'randomizetry') {
- my $partfortries = $Apache::inputtags::part;
-#
-# Where question type is "randomizetry" for a problem containing
-# a single part (and unless type is explicitly set to not be
-# "randomizetry" for that part), the number of tries used to
-# determine randomization will be for that part, and randomization
-# from calls to &random() in a perl script block before the part tag,
-# will change based on the number of tries, and value of the
-# "randomizeontries" parameter in effect for the single part.
-#
- if (ref($probpartlist) eq 'ARRAY') {
- if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) {
- if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') {
- $partfortries = $probpartlist->[0];
- } else {
- $partfortries = '';
- }
- }
- }
- if ($partfortries ne '') {
- $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"};
- $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
- }
- }
- 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'};
@@ -690,19 +567,13 @@ 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") || ($symb eq '')) &&
+ if (($env{'request.state'} eq "construct") &&
($Apache::lonhomework::type eq 'randomizetry')) {
- if ($numtries) {
- if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
- my $inc = int($numtries/$reqtries);
- $rndseed += $inc;
- } else {
- $rndseed += $numtries;
- }
+ my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
+ if ($tries) {
+ $rndseed += $tries;
}
$env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
}
@@ -724,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;
@@ -740,7 +607,7 @@ sub setup_rndseed {
}
unless (($target eq 'analyze') && (defined($rndseed))) {
$rndseed=&Apache::lonnet::rndseed();
- my $curr_try = $numtries;
+ my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
$curr_try ++;
}
@@ -748,6 +615,7 @@ sub setup_rndseed {
$rndseed = $1;
}
if ($curr_try) {
+ my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
my $inc = int(($curr_try-1)/$reqtries);
$rndseed += $inc;
@@ -757,9 +625,6 @@ sub setup_rndseed {
}
}
$set_safespace = 1;
- if ($target eq 'grade') {
- $Apache::lonhomework::rawrndseed = $rndseed;
- }
}
if ($set_safespace) {
if ($safeeval) {
@@ -789,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>$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 = ''.
@@ -823,11 +890,13 @@ sub problem_edit_header {
' . &Apache::lonxml::message_location();
+ '.
+ ''.
+ &problem_edit_buttons();
+
+ $return.='
+ '
+ .&Apache::lonxml::message_location();
$return .= '
';
@@ -840,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\');
}
}
);
@@ -853,7 +921,6 @@ sub problem_edit_header {
return $return;
}
-
sub problem_edit_footer {
my $resource = $env{'request.ambiguous'};
return '
@@ -929,7 +996,7 @@ sub problem_web_to_edit_header {
".&mt("Problem Type:")."