--- loncom/homework/edit.pm 2007/05/22 01:03:35 1.106 +++ loncom/homework/edit.pm 2008/12/10 21:59:43 1.121 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # edit mode helpers # -# $Id: edit.pm,v 1.106 2007/05/22 01:03:35 albertel Exp $ +# $Id: edit.pm,v 1.121 2008/12/10 21:59:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,6 +26,108 @@ # http://www.lon-capa.org/ # +=head1 NAME + +Apache::edit - edit mode helpers + +=head1 SYNOPSIS + +Invoked by many homework and xml related modules. + + &Apache::edit::SUBROUTINENAME(ARGUMENTS); + +=head1 INTRODUCTION + +This module outputs HTML syntax helpful for the rendering of edit +mode interfaces. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over 4 + +=item initialize_edit() + +initialize edit (set colordepth to zero) + +=item tag_start($target,$token,$description) + +provide deletion and insertion lists +for the manipulation of a start tag; return a scalar string + +=item tag_end($target,$token,$description) + +ending syntax corresponding to +&tag_start. return a scalar string. + +=item start_table($token) + +start table; update colordepth; return scalar string. + +=item end_table() + +reduce color depth; end table; return scalar string + +=item start_spanning_row() + +start a new table row spanning the 'edit' environment. + +=item start_row() + +start a new table row and element. + +=item end_row() + +end current table element and row. + +=item movebuttons($target,$token) + +move-up and move-down buttons; return scalar string + +=item deletelist($target,$token) + +provide a yes option in an HTML select element; return scalar string + +=item handle_delete($space,$target,$token,$tagstack,$parstack,$parser,$safeeval, +$style) + +respond to a user delete request by passing relevant stack +and array information to various rendering functions; return a scalar string + +=item get_insert_list($token) + +provide an insertion list based on possibilities from lonxml; return a scalar string + +=item insertlist($target,$token) + +api that uses get_insert_list; return a scalar string + +=item handleinsert($token) + +provide an insertion list based on possibilities from lonxml; return a scalar string + +=item get_insert_list($token) + +provide an insertion list based on possibilities from lonxml; return a scalar string + +=item browse($elementname) + +provide a link which will open up the filesystem browser (lonindexer) and, once a file is selected, place the result in the form element $elementname. + +=item search($elementname) + +provide a link which will open up the filesystem searcher (lonsearchcat) and, once a file is selected, place the result in the form element $elementname. + +=item editline(tag,data,description,size) + +Provide a <input type="text" ../> for single-line text entry. This is to be used for text enclosed by tags, not arguements/parameters associated with a tag. + +=back + +=cut + package Apache::edit; use strict; @@ -61,7 +163,7 @@ sub tag_start { if (!$description) { $description="<$tag>"; } } $result.= &start_table($token)."<tr><td>$description</td> - <td>Delete". + <td>".&mt('Delete?').' '. &deletelist($target,$token) ."</td> <td>". @@ -128,7 +230,7 @@ sub end_table { return $result; } -sub start_spanning_row { return '<tr><td colspan="4" bgcolor="#DDDDDD">';} +sub start_spanning_row { return '<tr><td colspan="5" bgcolor="#DDDDDD">';} sub start_row { return '<tr><td bgcolor="#DDDDDD">'; } sub end_row { return '</td></tr>'; } @@ -145,7 +247,7 @@ sub deletelist { my ($target,$token) = @_; my $result = "<select name=\"delete_$Apache::lonxml::curdepth\"> <option></option> -<option>Yes</option> +<option>".&mt('yes')."</option> </select>"; return $result; } @@ -215,7 +317,7 @@ sub innerinsertlist { if ($target eq 'edit') { my $optionlist= &get_insert_list($tagname); if ($optionlist) { - $result = "Insert: + $result = &mt('Insert:')." <select name=\"insert$after\_$Apache::lonxml::curdepth\"> $optionlist </select>" @@ -577,7 +679,8 @@ sub element_change_detection { } sub submit_ask_anyway { - return ' onclick="still_ask=true;" '; + my ($extra_action) = @_; + return ' onclick="still_ask=true;'.$extra_action.'" '; } sub textarea_sizes { @@ -597,7 +700,7 @@ sub textarea_sizes { sub editline { my ($tag,$data,$description,$size)=@_; $data=&HTML::Entities::encode($data,'<>&"'); - if ($description) { $description="<br />".$description."<br />"; } + if ($description) { $description=$description."<br />"; } my $change_code = &element_change_detection(); my $result = <<"END"; $description @@ -619,7 +722,7 @@ sub editfield { if ($cols > 80) { $cols = 80; } if ($cols < $minwidth ) { $cols = $minwidth; } if ($rows < $minheight) { $rows = $minheight; } - if ($description) { $description="<br />".$description."<br />"; } + if ($description) { $description=$description."<br />"; } if ($usehtmlarea) { &Apache::lonhtmlcommon::add_htmlareafields('homework_edit_'. $Apache::lonxml::curdepth); @@ -672,6 +775,10 @@ sub get_new_args { $token->[2]->{$arg}=$newvalue; } $rebuild=1; + # add new attributes to the of the attribute seq + if (!grep { $arg eq $_ } (@{ $token->[3] })) { + push(@{ $token->[3] },$arg); + } } elsif (!defined($newvalue) && defined($value)) { delete($token->[2]->{$arg}); $rebuild=1; @@ -686,11 +793,13 @@ sub rebuild_tag { my $result; if ($token->[0] eq 'S') { $result = '<'.$token->[1]; - while (my ($key,$val)= each(%{$token->[2]})) { - $val=~s:^\s+|\s+$::g; - $val=~s:"::g; #" - &Apache::lonxml::debug("setting :$key: to :$val:"); - $result.=' '.$key.'="'.$val.'"'; + foreach my $attribute (@{ $token->[3] }) { + my $value = $token->[2]{$attribute}; + next if ($value eq ''); + $value =~s/^\s+|\s+$//g; + $value =~s/\"//g; + &Apache::lonxml::debug("setting :$attribute: to :$value:"); + $result.=' '.$attribute.'="'.$value.'"'; } if ($token->[4] =~ m:/>$:) { $result.=' />'; @@ -733,15 +842,15 @@ sub checked_arg { $text=$option; $value='value="'.$option.'"'; } - $result.="<nobr><label><input type='checkbox' $value name='". - &html_element_name($name)."'"; + $result.='<span class="LC_nobreak"><label><input type="checkbox" '.$value.' name="'. + &html_element_name($name).'"'; foreach my $selected (split(/,/,$allselected)) { if ( $selected eq $option ) { - $result.=" checked='checked' "; + $result.=' checked="checked" '; last; } } - $result.=&element_change_detection()." />$text</label></nobr>\n"; + $result.=&element_change_detection().' />'.$text.'</label></span>'."\n"; } return $result; } @@ -754,7 +863,7 @@ sub text_arg { $result=&mt($description).' <input name="'.&html_element_name($name). '" type="text" value="'.$arg.'" size="'.$size.'" '. &element_change_detection().'/>'; - return '<nobr>'.$result.'</nobr>'; + return '<span class="LC_nobreak">'.$result.'</span>'; } sub select_arg { @@ -762,26 +871,28 @@ sub select_arg { my $result; my $optionlist=""; my $selected=$token->[2]{$name}; - foreach my $option (@$list) { - my ($text,$value); - if ( ref($option) eq 'ARRAY') { - $value='value="'.&HTML::Entities::encode($$option[0]).'"'; - $text=$$option[1]; - $option=$$option[0]; - } else { - $text=$option; - $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"'; - } - if ( $selected eq $option ) { - $optionlist.="<option $value selected=\"selected\">$text</option>\n"; - } else { - $optionlist.="<option $value >$text</option>\n"; - } + if (ref($list) eq 'ARRAY') { + foreach my $option (@{$list}) { + my ($text,$value); + if (ref($option) eq 'ARRAY') { + $value='value="'.&HTML::Entities::encode($option->[0]).'"'; + $text=$option->[1]; + $option=$option->[0]; + } else { + $text=$option; + $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"'; + } + if ( $selected eq $option ) { + $optionlist.="<option $value selected=\"selected\">".&mt($text)."</option>\n"; + } else { + $optionlist.="<option $value >".&mt($text)."</option>\n"; + } + } } - $result.='<nobr>'.$description.' <select name="'. + $result.='<span class="LC_nobreak">'.&mt($description).' <select name="'. &html_element_name($name).'" '.&element_change_detection().' > '.$optionlist.' - </select></nobr>'; + </select></span>'; return $result; } @@ -791,22 +902,24 @@ sub select_or_text_arg { my $optionlist=""; my $found=0; my $selected=$token->[2]{$name}; - foreach my $option (@$list) { - my ($text,$value); - if ( ref($option) eq 'ARRAY') { - $value='value="'.&HTML::Entities::encode($$option[0]).'"'; - $text=$$option[1]; - $option=$$option[0]; - } else { - $text=$option; - $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"'; - } - if ( $selected eq $option ) { - $optionlist.="<option $value selected=\"selected\">$text</option>\n"; - $found=1; - } else { - $optionlist.="<option $value>$text</option>\n"; - } + if (ref($list) eq 'ARRAY') { + foreach my $option (@{$list}) { + my ($text,$value); + if (ref($option) eq 'ARRAY') { + $value='value="'.&HTML::Entities::encode($option->[0]).'"'; + $text=$option->[1]; + $option=$option->[0]; + } else { + $text=$option; + $value='value="'.&HTML::Entities::encode($option,'\'"&<>').'"'; + } + if ( $selected eq $option ) { + $optionlist.="<option $value selected=\"selected\">$text</option>\n"; + $found=1; + } else { + $optionlist.="<option $value>$text</option>\n"; + } + } } $optionlist.="<option value=\"TYPEDINVALUE\"". ((!$found)?' selected="selected"':''). @@ -827,7 +940,7 @@ sub select_or_text_arg { $description=&mt($description); # return (<<ENDSELECTORTYPE); -<nobr> +<span class="LC_nobreak"> $description <select name="$selectelement" onChange="if ($selectedvalue!='TYPEDINVALUE') { $hiddenvalue=$selectedvalue; $typedinvalue=''; }" > @@ -838,7 +951,7 @@ $optionlist onChange="$hiddenvalue=$typedinvalue;" onFocus="$selectedindex=$selecttypeinindex-1;" /> <input type="hidden" name="$element" value="$selected" $change_code /> -</nobr> +</span> ENDSELECTORTYPE } @@ -873,7 +986,7 @@ sub entercoords { $data{"imagechoice.$id.formwidth"}=$width.'_'. $Apache::edit::bgimgsrccurdepth; } - &Apache::lonnet::appenv(%data); + &Apache::lonnet::appenv(\%data); my $text="Click Coordinates"; my $result='<a href="/adm/imagechoice?token='.$id.'" target="imagechoice">'.$text.'</a>'; return $result; @@ -906,7 +1019,7 @@ sub entercoord { $data{"imagechoice.$id.formwidth"}=$width.'_'. $Apache::edit::bgimgsrccurdepth; } - &Apache::lonnet::appenv(%data); + &Apache::lonnet::appenv(\%data); my $text="Enter Coordinates"; if ($type eq 'polygon') { $text='Create Polygon Data'; } my $result='<a href="/adm/imagechoice?token='.$id.'" target="imagechoice">'.$text.'</a>'; @@ -920,7 +1033,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') { @@ -931,7 +1044,9 @@ sub browse { } my $titleelement; if ($titleid) { - $titleelement=",'','','".&escape("$titleid\_$Apache::lonxml::curdepth")."'"; + $titleelement=",'$only','','".&escape("$titleid\_$Apache::lonxml::curdepth")."'"; + } else { + $titleelement=",'$only'"; } my $result = <<"ENDBUTTON"; <a href=\"javascript:openbrowser('$form','$element'$titleelement)\"\>Select</a> @@ -965,119 +1080,4 @@ ENDBUTTON 1; __END__ -=head1 NAME - -Apache::edit - edit mode helpers - -=head1 SYNOPSIS - -Invoked by many homework and xml related modules. - - &Apache::edit::SUBROUTINENAME(ARGUMENTS); - -=head1 INTRODUCTION - -This module outputs HTML syntax helpful for the rendering of edit -mode interfaces. - -This is part of the LearningOnline Network with CAPA project -described at http://www.lon-capa.org. - -=head1 HANDLER SUBROUTINE - -There is no handler subroutine. - -=head1 OTHER SUBROUTINES - -=over 4 - -=item * -initialize_edit() : initialize edit (set colordepth to zero) - -=item * - -tag_start($target,$token,$description) : provide deletion and insertion lists -for the manipulation of a start tag; return a scalar string - -=item * - -tag_end($target,$token,$description) : ending syntax corresponding to -&tag_start. return a scalar string. - -=item * - -start_table($token) : start table; update colordepth; return scalar string. - -=item * - -end_table() : reduce color depth; end table; return scalar string - -=item * - -start_spanning_row() : start a new table row spanning the 'edit' environment. - -=item * - -start_row() : start a new table row and element. - -=item * - -end_row() : end current table element and row. - -=item * - -movebuttons($target,$token) : move-up and move-down buttons; return scalar -string - -=item * - -deletelist($target,$token) : provide a yes option in an HTML select element; -return scalar string - -=item * - -handle_delete($space,$target,$token,$tagstack,$parstack,$parser,$safeeval, -$style) : respond to a user delete request by passing relevant stack -and array information to various rendering functions; return a scalar string - -=item * - -get_insert_list($token) : provide an insertion list based on possibilities -from lonxml; return a scalar string - -=item * - -insertlist($target,$token) : api that uses get_insert_list; -return a scalar string - -=item * - -handleinsert($token) : provide an insertion list based on possibilities -from lonxml; return a scalar string - -=item * - -get_insert_list($token) : provide an insertion list based on possibilities -from lonxml; return a scalar string - -=item * -browse($elementname) : provide a link which will open up the filesystem -browser (lonindexer) and, once a file is selected, place the result in -the form element $elementname. - -=item * -search($elementname) : provide a link which will open up the filesystem -searcher (lonsearchcat) and, once a file is selected, place the result in -the form element $elementname. - -=item * -editline(tag,data,description,size): Provide a <input type="text" ../> for -single-line text entry. This is to be used for text enclosed by tags, not -arguements/parameters associated with a tag. - -=back - -incomplete... - -=cut