--- loncom/homework/structuretags.pm 2020/06/03 18:40:33 1.512.2.13.2.2
+++ loncom/homework/structuretags.pm 2015/03/07 23:13:09 1.531
@@ -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.13.2.2 2020/06/03 18:40:33 raeburn Exp $
+# $Id: structuretags.pm,v 1.531 2015/03/07 23:13:09 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -270,7 +270,7 @@ sub homework_js {
$jstimeout = 1000 * $timeout;
}
return &Apache::loncommon::resize_textarea_js().
- &Apache::loncommon::colorfuleditor_js().
+ &Apache::loncommon::colorfuleditor_js().
&setmode_javascript().
<<"JS";
@@ -417,13 +406,9 @@ 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$/);
@@ -756,33 +741,236 @@ 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|\\|\\\\|g;
+ $return =~ s|\n|\\r\\n|g;
+ $return =~ s|'|\\'|g;
+ $return =~ s|'|\\'|g;
+ return $return;
+}
+
sub problem_edit_header {
my ($mode)=@_;
my $return = ''.
@@ -790,11 +978,13 @@ sub problem_edit_header {
' . &Apache::lonxml::message_location();
+ '.
+ ''.
+ &problem_edit_buttons();
+
+ $return.='
+ '
+ .&Apache::lonxml::message_location();
$return .= '
';
@@ -807,8 +997,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\');
}
}
);
@@ -820,7 +1009,6 @@ sub problem_edit_header {
return $return;
}
-
sub problem_edit_footer {
my $resource = $env{'request.ambiguous'};
return '
@@ -896,7 +1084,7 @@ sub problem_web_to_edit_header {
".&mt("Problem Type:")."