--- loncom/homework/edit.pm 2006/05/30 12:45:36 1.102 +++ loncom/homework/edit.pm 2007/06/19 19:41:52 1.107 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # edit mode helpers # -# $Id: edit.pm,v 1.102 2006/05/30 12:45:36 www Exp $ +# $Id: edit.pm,v 1.107 2007/06/19 19:41:52 banghart Exp $ # # Copyright Michigan State University Board of Trustees # @@ -90,17 +90,10 @@ sub tag_end { sub start_table { my ($token)=@_; - my $tag = $token->[1]; - my $tagnum; - foreach my $namespace (reverse @Apache::lonxml::namespace) { - my $testtag=$namespace.'::'.$tag; - $tagnum=$Apache::lonxml::insertlist{"$testtag.num"}; - &Apache::lonxml::debug(" $testtag "); - if (defined($tagnum)) { last; } - } - if (!defined ($tagnum)) {$tagnum=$Apache::lonxml::insertlist{"$tag.num"};} - my $color = $Apache::lonxml::insertlist{"$tagnum.color"}; - &Apache::lonxml::debug(" $tagnum -- $color"); + my $tag = &Apache::lonxml::get_tag($token); + + my $color = $Apache::lonxml::insertlist{"$tag.color"}; + &Apache::lonxml::debug(" $tag -- $color"); if (!defined($color)) { $color = $Apache::edit::colorlist[$Apache::edit::colordepth]; } @@ -119,13 +112,19 @@ sub end_table { my ($tagname,$closingtag); if (defined($Apache::edit::inserttag[-2])) { $tagname=$Apache::edit::inserttag[-2]; - } else {$tagname='problem';} + } else { + if ($Apache::lonhomework::parsing_a_task) { + $tagname='Task'; + } else { + $tagname='problem'; + } + } if (defined($Apache::edit::inserttag[-1])) { $closingtag=$Apache::edit::inserttag[-1]; } $result.=&innerinsertlist('edit',$tagname,$closingtag). "</td></tr></table></div>"; - pop(@Apache::edit::inserttag); + my $last = pop(@Apache::edit::inserttag); return $result; } @@ -177,20 +176,21 @@ sub handle_delete { sub get_insert_list { my ($tagname) = @_; my $result=''; - my @tagnums= (); + my @tags= (); #&Apache::lonxml::debug("keys ".join("\n",sort(keys(%Apache::lonxml::insertlist)))); if ($Apache::lonxml::insertlist{"$tagname.which"}) { - push (@tagnums, @{ $Apache::lonxml::insertlist{"$tagname.which"} }); + push (@tags, @{ $Apache::lonxml::insertlist{"$tagname.which"} }); } foreach my $namespace (@Apache::lonxml::namespace) { if ($Apache::lonxml::insertlist{"$namespace".'::'."$tagname.which"}) { - push (@tagnums, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$tagname.which"} }); + push (@tags, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$tagname.which"} }); } } - if (@tagnums) { + if (@tags) { my %options; - foreach my $tagnum (@tagnums) { - my $descrip=$Apache::lonxml::insertlist{"$tagnum.description"}; + foreach my $tag (@tags) { + my $descrip=$Apache::lonxml::insertlist{"$tag.description"}; + my $tagnum =$Apache::lonxml::insertlist{"$tag.num"}; $options{$descrip} ="<option value=\"$tagnum\">". $descrip."</option>\n"; } @@ -228,40 +228,32 @@ sub innerinsertlist { sub handle_insert { if ($env{"form.insert_$Apache::lonxml::curdepth"} eq '') { return ''; } - my $result; my $tagnum = $env{"form.insert_$Apache::lonxml::curdepth"}; - my $func=$Apache::lonxml::insertlist{"$tagnum.function"}; - if ($func eq 'default') { - my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; - my $namespace; - if ($newtag =~ /::/) { ($namespace,$newtag) = split(/::/,$newtag); } - $result.="\n<$newtag>\n</$newtag>"; - } else { - if (defined(&$func)) { - { - no strict 'refs'; - $result.=&$func(); - } - } else { - my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; - &Apache::lonxml::error("Unable to insert tag ".$Apache::lonxml::curdepth." ($tagnum) $newtag, func was not defined."); - } - } - return $result; + return &do_insert($tagnum); } sub handle_insertafter { my $tagname=shift; - if ($env{"form.insert_after_$tagname\_$Apache::lonxml::curdepth"} eq '') - { return ''; } - my $result; + if ($env{"form.insert_after_$tagname\_$Apache::lonxml::curdepth"} eq '') { + return ''; + } my $tagnum =$env{"form.insert_after_$tagname\_$Apache::lonxml::curdepth"}; - my $func=$Apache::lonxml::insertlist{"$tagnum.function"}; + return &do_insert($tagnum,1); +} + +sub do_insert { + my ($tagnum,$after) = @_; + my $result; + + my $newtag = $Apache::lonxml::insertlist{"$tagnum.tag"}; + my $func = $Apache::lonxml::insertlist{"$newtag.function"}; if ($func eq 'default') { - my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; my $namespace; if ($newtag =~ /::/) { ($namespace,$newtag) = split(/::/,$newtag); } - $result.="\n<$newtag>\n</$newtag>"; + my $depth = scalar(@Apache::lonxml::depthcounter); + $depth -- if ($after); + my $inset = "\t"x$depth; + $result.="\n$inset<$newtag>\n$inset</$newtag>"; } else { if (defined(&$func)) { { @@ -269,8 +261,7 @@ sub handle_insertafter { $result.=&$func(); } } else { - my $newtag=$Apache::lonxml::insertlist{"$tagnum.tag"}; - &Apache::lonxml::error("Unable to insert (after) tag $newtag, $func was not defined. ($tagname $tagnum)"); + &Apache::lonxml::error("Unable to insert tag $newtag, $func was not defined. ($tagnum)"); } } return $result; @@ -333,6 +324,56 @@ sub insert_customresponse_answer { '; } +sub insert_customhint { + return ' + <customhint> + <answer type="loncapa/perl"> + </answer> + </customhint>'; +} + +sub insert_customhint_answer { + return ' + <answer type="loncapa/perl"> + </answer> +'; +} + +sub insert_mathresponse { + return ' +<mathresponse> + <answer> + </answer> + <textline /> + <hintgroup> + <startouttext /> + <endouttext /> + </hintgroup> +</mathresponse>'; +} + +sub insert_mathresponse_answer { + return ' + <answer> + </answer> +'; +} + +sub insert_mathhint { + return ' + <mathhint> + <answer> + </answer> + </mathhint>'; +} + +sub insert_mathhint_answer { + return ' + <answer> + </answer> +'; +} + sub insert_stringresponse { return ' <stringresponse answer="" type=""> @@ -583,7 +624,11 @@ sub editfield { &Apache::lonhtmlcommon::add_htmlareafields('homework_edit_'. $Apache::lonxml::curdepth); } - return $description."\n".' <textarea style="width:100%" rows="'.$rows. + # remove typesetting whitespace from between data and the end tag + # to make the edit look prettier + $data =~ s/\n?[ \t]*$//; + + return $description."\n".'<textarea style="width:100%" rows="'.$rows. '" cols="'.$cols.'" name="homework_edit_'. $Apache::lonxml::curdepth.'" id="homework_edit_'. $Apache::lonxml::curdepth.'" '.&element_change_detection().'>'. @@ -595,15 +640,17 @@ sub editfield { sub modifiedfield { my ($endtag,$parser) = @_; my $result; -# foreach my $envkey (sort keys %env) { -# &Apache::lonxml::debug("$envkey ---- $env{$envkey}"); -# } -# &Apache::lonxml::debug("I want homework_edit_$Apache::lonxml::curdepth"); -# &Apache::lonxml::debug($env{"form.homework_edit_$Apache::lonxml::curdepth"}); $result=$env{"form.homework_edit_$Apache::lonxml::curdepth"}; my $bodytext=&Apache::lonxml::get_all_text($endtag,$parser); # textareas throw away intial \n - if ($bodytext=~/^\n/) { $result="\n".$result; } + if ($bodytext=~/^\n/) { + $result="\n".$result; + } + # if there is typesetting whitespace from between the data and the end tag + # restore to keep the source looking pretty + if ($bodytext =~ /(\n?[ \t]*)$/) { + $result .= $1; + } return $result; } @@ -873,7 +920,7 @@ sub deletecoorddata { #----------------------------------------------------- browse sub browse { # insert a link to call up the filesystem browser (lonindexer) - my ($id, $mode, $titleid) = @_; + my ($id, $mode, $titleid, $only) = @_; my $form = 'lonhomework'; my $element; if (! defined($mode) || $mode eq 'attribute') { @@ -884,7 +931,7 @@ sub browse { } my $titleelement; if ($titleid) { - $titleelement=",'','','".&escape("$titleid\_$Apache::lonxml::curdepth")."'"; + $titleelement=",'$only','','".&escape("$titleid\_$Apache::lonxml::curdepth")."'"; } my $result = <<"ENDBUTTON"; <a href=\"javascript:openbrowser('$form','$element'$titleelement)\"\>Select</a>