Diff for /loncom/homework/edit.pm between versions 1.34 and 1.62

version 1.34, 2002/04/26 13:30:08 version 1.62, 2003/09/08 21:17:54
Line 39  use HTML::Entities(); Line 39  use HTML::Entities();
 @Apache::edit::colorlist=('#ffffff','#ff0000','#00ff00','#0000ff','#0ff000','#000ff0','#f0000f');  @Apache::edit::colorlist=('#ffffff','#ff0000','#00ff00','#0000ff','#0ff000','#000ff0','#f0000f');
 # depth of nesting of edit  # depth of nesting of edit
 $Apache::edit::colordepth=0;  $Apache::edit::colordepth=0;
   @Apache::edit::inserttag=();
   # image-type responses: active background image and curdepth at definition
   $Apache::edit::bgimgsrc='';
   $Apache::edit::bgimgsrccurdepth='';
   
 sub initialize_edit {  sub initialize_edit {
   $Apache::edit::colordepth=0;    $Apache::edit::colordepth=0;
     @Apache::edit::inserttag=();
 }  }
   
 sub tag_start {  sub tag_start {
Line 58  sub tag_start { Line 63  sub tag_start {
   &deletelist($target,$token)    &deletelist($target,$token)
   ."</td>    ."</td>
 <td>".  <td>".
     &insertlist($target,$token).&end_row().&start_spanning_row();      &insertlist($target,$token);
 #<td>".   #<td>". 
 #  &movebuttons($target,$token).  #  &movebuttons($target,$token).
 #    "</tr><tr><td colspan=\"3\">\n";  #    "</tr><tr><td colspan=\"3\">\n";
       my @help;# = Apache::lonxml::helpinfo($token);
       if ($help[0]) {
    $result .= '<td align="right" valign="top">' .
       Apache::loncommon::help_open_topic(@help) .
       '</td>';
       } else { $result .= "<td>&nbsp;</td>"; }
       $result .= &end_row().&start_spanning_row();
   }    }
   return $result;    return $result;
 }  }
Line 70  sub tag_end { Line 82  sub tag_end {
   my ($target,$token,$description) = @_;    my ($target,$token,$description) = @_;
   my $result='';    my $result='';
   if ($target eq 'edit') {    if ($target eq 'edit') {
     my $tag=$token->[1];      $result.="</td></tr>".&end_table()."\n";
     if (!defined($description)) {  
       $result.="</td></tr><tr><td>&lt;/$tag&gt;</td><td colspan=\"2\">&nbsp;</td>";  
     } else {  
       if ($description ne '') { $result.="</td></tr><tr><td>$description</td><td colspan=\"2\">&nbsp;</td>"; }  
     }  
     $result.="</tr>".&end_table()."\n";  
   }    }
   return $result;    return $result;
 }  }
Line 96  sub start_table { Line 102  sub start_table {
     $color = $Apache::edit::colorlist[$Apache::edit::colordepth];      $color = $Apache::edit::colorlist[$Apache::edit::colordepth];
   }    }
   $Apache::edit::colordepth++;    $Apache::edit::colordepth++;
   my $result="<table bgcolor=\"$color\" width=\"100%\" border=\"5\">";    push(@Apache::edit::inserttag,$token->[1]);
     my $result='<div align="right">';
     $result.='<table bgcolor="'.$color.'" width="97%" border="0" cellspacing="5" cellpadding="3">';
   return $result;    return $result;
 }  }
   
 sub end_table {  sub end_table {
   $Apache::edit::colordepth--;    $Apache::edit::colordepth--;
   my $result="</table>";    my $result='</table></div>';
     $result.="<table><tr><td>";
   
     my ($tagname,$closingtag);
     if (defined($Apache::edit::inserttag[-2])) {
       $tagname=$Apache::edit::inserttag[-2];
     } else {$tagname='problem';}
     if (defined($Apache::edit::inserttag[-1])) {
       $closingtag=$Apache::edit::inserttag[-1];
     }
     $result.=&innerinsertlist('edit',$tagname,$closingtag).
       "</td></tr></table>";
     pop(@Apache::edit::inserttag);
   return $result;    return $result;
 }  }
   
 sub start_spanning_row { return '<tr><td colspan="3">';}  sub start_spanning_row { return '<tr><td colspan="4" bgcolor="#DDDDDD">';}
 sub start_row          { return '<tr><td>';            }  sub start_row          { return '<tr><td bgcolor="#DDDDDD">';            }
 sub end_row            { return '</td></tr>';          }  sub end_row            { return '</td></tr>';          }
   
 sub movebuttons {  sub movebuttons {
Line 143  sub handle_delete { Line 163  sub handle_delete {
   }    }
   if (!$result) {    if (!$result) {
     my $endtag='/'.$token->[1];      my $endtag='/'.$token->[1];
     my $bodytext=&Apache::lonxml::get_all_text($endtag,$$parser[$#$parser]);      my $bodytext=&Apache::lonxml::get_all_text($endtag,$parser);
     $$parser['-1']->get_token();      $$parser['-1']->get_token();
     &Apache::lonxml::debug("Deleting :$bodytext: for $token->[1]");      &Apache::lonxml::debug("Deleting :$bodytext: for $token->[1]");
     &Apache::lonxml::end_tag($tagstack,$parstack,$token);      &Apache::lonxml::end_tag($tagstack,$parstack,$token);
Line 152  sub handle_delete { Line 172  sub handle_delete {
 }  }
   
 sub get_insert_list {  sub get_insert_list {
   my ($token) = @_;    my ($tagname) = @_;
   my $result='';    my $result='';
   my @tagnums= ();    my @tagnums= ();
   #&Apache::lonxml::debug("keys ".join("\n",sort(keys(%Apache::lonxml::insertlist))));    #&Apache::lonxml::debug("keys ".join("\n",sort(keys(%Apache::lonxml::insertlist))));
   if ($Apache::lonxml::insertlist{"$token->[1].which"}) {    if ($Apache::lonxml::insertlist{"$tagname.which"}) {
     push (@tagnums, @{ $Apache::lonxml::insertlist{"$token->[1].which"} });      push (@tagnums, @{ $Apache::lonxml::insertlist{"$tagname.which"} });
   }    }
   foreach my $namespace (@Apache::lonxml::namespace) {    foreach my $namespace (@Apache::lonxml::namespace) {
     if ($Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"}) {      if ($Apache::lonxml::insertlist{"$namespace".'::'."$tagname.which"}) {
       push (@tagnums, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$token->[1].which"} });        push (@tagnums, @{ $Apache::lonxml::insertlist{"$namespace".'::'."$tagname.which"} });
     }      }
   }    }
   if (@tagnums) {    if (@tagnums) {
Line 178  sub get_insert_list { Line 198  sub get_insert_list {
   
 sub insertlist {  sub insertlist {
   my ($target,$token) = @_;    my ($target,$token) = @_;
     return &innerinsertlist($target,$token->[1]);
   }
   
   sub innerinsertlist {
     my ($target,$tagname,$closingtag) = @_;
   my $result;    my $result;
     my $after='';
     if ($closingtag) {
        $after='_after_'.$closingtag; 
     }
   if ($target eq 'edit') {    if ($target eq 'edit') {
     my $optionlist= &get_insert_list($token);      my $optionlist= &get_insert_list($tagname);
     if ($optionlist) {      if ($optionlist) {
       $result = "Insert:        $result = "Insert:
 <select name=\"insert_$Apache::lonxml::curdepth\">  <select name=\"insert$after\_$Apache::lonxml::curdepth\">
 $optionlist  $optionlist
 </select>"  </select>"
     } else {      } else {
Line 217  sub handle_insert { Line 246  sub handle_insert {
   return $result;    return $result;
 }  }
   
   sub handle_insertafter {
     my $tagname=shift;
     if ($ENV{"form.insert_after_$tagname\_$Apache::lonxml::curdepth"} eq '')
        { return ''; }
     my $result;
     my $tagnum =$ENV{"form.insert_after_$tagname\_$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 (after) tag $newtag, $func was not defined. ($tagname $tagnum)");
       }
     }
     return $result;
   }
   
 sub insert_responseparam {  sub insert_responseparam {
   return '    return '
     <responseparam />';      <responseparam />';
Line 249  sub insert_stringresponse { Line 304  sub insert_stringresponse {
 </stringresponse>';  </stringresponse>';
 }  }
   
   sub insert_essayresponse {
     return '
   <essayresponse>
       <textfield></textfield>
   </essayresponse>';
   }
   
   sub insert_imageresponse {
     return '
   <imageresponse max="1">
       <foilgroup>
       </foilgroup>
       <hintgroup>
       </hintgroup>
   </imageresponse>';
   }
   
 sub insert_optionresponse {  sub insert_optionresponse {
   return '    return '
 <optionresponse max="10">  <optionresponse max="10">
Line 269  sub insert_radiobuttonresponse { Line 341  sub insert_radiobuttonresponse {
 </radiobuttonresponse>';  </radiobuttonresponse>';
 }  }
   
   sub insert_rankresponse {
     return '
   <rankresponse max="10">
       <foilgroup options="">
       </foilgroup>
       <hintgroup>
       </hintgroup>
   </rankresponse>';
   }
   
   sub insert_matchresponse {
     return '
   <matchresponse max="10">
       <foilgroup options="">
         <itemgroup>
         </itemgroup>
       </foilgroup>
       <hintgroup>
       </hintgroup>
   </matchresponse>';
   }
   
 sub insert_displayduedate { return '<displayduedate />'; }  sub insert_displayduedate { return '<displayduedate />'; }
 sub insert_displaytitle   { return '<displaytitle />'; }  sub insert_displaytitle   { return '<displaytitle />'; }
 sub insert_hintpart {  sub insert_hintpart {
Line 285  sub insert_numericalhint { Line 379  sub insert_numericalhint {
 </numericalhint>';  </numericalhint>';
 }  }
   
   sub insert_stringhint {
     return '
   <stringhint>
   </stringhint>';
   }
   
   sub insert_formulahint {
     return '
   <formulahint>
   </formulahint>';
   }
   
   sub insert_radiobuttonhint {
     return '
   <radiobuttonhint>
   </radiobuttonhint>';
   }
   
   sub insert_optionhint {
     return '
   <optionhint>
   </optionhint>';
   }
   
 sub insert_startouttext {  sub insert_startouttext {
   return "<startouttext />\n<endouttext />";    return "<startouttext />\n<endouttext />";
 }  }
Line 297  sub textarea_sizes { Line 415  sub textarea_sizes {
   my ($data)=@_;    my ($data)=@_;
   my $count=0;    my $count=0;
   my $maxlength=-1;    my $maxlength=-1;
   foreach (split ("\n", $$data)) { $count++;    foreach (split ("\n", $$data)) {
  if (length($_) > $maxlength) { $maxlength = length($_); }        $count+=int(length($_)/79);
       }        $count++;
         if (length($_) > $maxlength) { $maxlength = length($_); }
     }
   my $rows = $count;    my $rows = $count;
   my $cols = $maxlength;    my $cols = $maxlength;
   return ($rows,$cols);    return ($rows,$cols);
Line 345  sub modifiedfield { Line 465  sub modifiedfield {
 # Returns a 1 if the token has been modified and you should rebuild the tag  # Returns a 1 if the token has been modified and you should rebuild the tag
 # side-effects, will modify the $token if new values are found  # side-effects, will modify the $token if new values are found
 sub get_new_args {  sub get_new_args {
   my ($token,$parstack,$safeeval,@args)=@_;      my ($token,$parstack,$safeeval,@args)=@_;
   my $rebuild=0;      my $rebuild=0;
   foreach my $arg (@args) {      foreach my $arg (@args) {
     #just want the string that it was set to      #just want the string that it was set to
     my $value=$token->[2]->{$arg};      my $value=$token->[2]->{$arg};
     my $newvalue=$ENV{"form.$Apache::lonxml::curdepth.$arg"};      my $element=&html_element_name($arg);
       my $newvalue=$ENV{"form.$element"};
     &Apache::lonxml::debug(" for:$arg: cur is :$value: new is :$newvalue:");      &Apache::lonxml::debug(" for:$arg: cur is :$value: new is :$newvalue:");
     if ($value ne $newvalue) {      if (defined($newvalue) && $value ne $newvalue) {
       $token->[2]->{$arg}=$newvalue;   if (ref($newvalue) eq 'ARRAY') {
       $rebuild=1;      $token->[2]->{$arg}=join(',',@$newvalue);
    } else {
       $token->[2]->{$arg}=$newvalue;
    }
    $rebuild=1;
     }      }
   }    }
   return $rebuild;    return $rebuild;
Line 383  sub rebuild_tag { Line 508  sub rebuild_tag {
   return $result;    return $result;
 }  }
   
   sub html_element_name {
       my ($name) = @_;
       return $name.'_'.$Apache::lonxml::curdepth;
   }
   
   sub hidden_arg {
       my ($name,$token) = @_;
       my $result;
       my $arg=$token->[2]{$name};
       $result='<input name="'.&html_element_name($name).
    '" type="hidden" value="'.$arg.'" />';
       return $result;
   }
   
   sub checked_arg {
       my ($description,$name,$list,$token) = @_;
       my $result;
       my $optionlist="";
       my $allselected=$token->[2]{$name};
       $result=$description;
       foreach my $option (@$list) {
    my ($value,$text);
    if ( ref($option) eq 'ARRAY') {
       $value='value="'.$$option[0].'"';
       $text=$$option[1];
       $option=$$option[0];
    } else {
       $text=$option;
       $value='value="'.$option.'"';
    }
    $result.="<nobr><input type='checkbox' $value name='".
       &html_element_name($name)."'";
    foreach my $selected (split(/,/,$allselected)) {
       if ( $selected eq $option ) {
    $result.=" checked='on' ";
    last;
       }
    }
    $result.=" />$text</nobr>\n";
       }
       return $result;
   }
   
 sub text_arg {  sub text_arg {
   my ($description,$name,$token,$size) = @_;    my ($description,$name,$token,$size) = @_;
   my $result;    my $result;
   if (!defined $size) { $size=20; }    if (!defined $size) { $size=20; }
   my $arg=$token->[2]{$name};    my $arg=$token->[2]{$name};
   $result=$description.'<input name="'."$Apache::lonxml::curdepth.$name".    $result=$description.'&nbsp;<input name="'.&html_element_name($name).
     '" type="text" value="'.$arg.'" size="'.$size.'" />';      '" type="text" value="'.$arg.'" size="'.$size.'" />';
   return $result;    return '<nobr>'.$result.'</nobr>';
 }  }
   
 sub select_arg {  sub select_arg {
   my ($description,$name,$list,$token) = @_;      my ($description,$name,$list,$token) = @_;
   my $result;      my $result;
   my $optionlist="";      my $optionlist="";
   my $selected=$token->[2]{$name};      my $selected=$token->[2]{$name};
   foreach my $option (@$list) {      foreach my $option (@$list) {
     if ( $selected eq $option ) {   my $value;
       $optionlist.="<option selected=\"on\">$option</option>\n";   if ( ref($option) eq 'ARRAY') {
     } else {      $value='value="'.$$option[0].'"';
       $optionlist.="<option>$option</option>\n";      $option=$$option[1];
    } else {
       $value='value="'.$option.'"';
    }
    if ( $selected eq $option ) {
       $optionlist.="<option $value selected=\"on\">$option</option>\n";
    } else {
       $optionlist.="<option $value >$option</option>\n";
    }
     }      }
   }      $result.='<nobr>'.$description.'&nbsp;<select name="'.
   $result.=$description.'<select name="'."$Apache::lonxml::curdepth.$name".'">   &html_element_name($name).'">
        '.$optionlist.'         '.$optionlist.'
       </select>';        </select></nobr>';
   return $result;      return $result;
 }  }
   
 sub select_or_text_arg {  sub select_or_text_arg {
   my ($description,$name,$list,$token,$size) = @_;      my ($description,$name,$list,$token,$size) = @_;
   my $result;      my $result;
   my $optionlist="";      my $optionlist="";
   my $found=0;      my $found=0;
   my $selected=$token->[2]{$name};      my $selected=$token->[2]{$name};
   foreach my $option (@$list) {      foreach my $option (@$list) {
     if ( $selected eq $option ) {   my $value;
       $optionlist.="<option selected=\"on\">$option</option>\n";   if ( ref($option) eq 'ARRAY') {
       $found=1;      $value='value="'.$$option[0].'"';
     } else {      $option=$$option[1];
       $optionlist.="<option>$option</option>\n";   } else {
       $value='value="'.$option.'"';
    }
    if ( $selected eq $option ) {
       $optionlist.="<option $value selected=\"on\">$option</option>\n";
       $found=1;
    } else {
       $optionlist.="<option $value>$option</option>\n";
    }
       }
       $optionlist.="<option value=\"TYPEDINVALUE\"".
     ((!$found)?' selected="on"':'').
     ">Type in value</option>\n";
   #
       my $element=&html_element_name($name);
       my $selectelement='select_list_'.$element;
       my $typeinelement='type_in_'.$element;
       my $typeinvalue=($found?'':$selected);
   #
       my $hiddenvalue='this.form.'.$element.'.value';
       my $selectedindex='this.form.'.$selectelement.'.selectedIndex';
       my $selectedvalue='this.form.'.$selectelement.
        '.options['.$selectedindex.'].value';
       my $typedinvalue='this.form.'.$typeinelement.'.value';
       my $selecttypeinindex='this.form.'.$selectelement.'.options.length';
   #
       return (<<ENDSELECTORTYPE);
   <nobr>
   $description
   &nbsp;<select name="$selectelement"
   onChange="if ($selectedvalue!='TYPEDINVALUE') { $hiddenvalue=$selectedvalue; $typedinvalue=''; }"
   $optionlist
   </select>
   <input type="text" size="$size" name="$typeinelement"
          value="$typeinvalue" 
   onChange="$hiddenvalue=$typedinvalue;"
   onFocus="$selectedindex=$selecttypeinindex-1;" />
   <input type="hidden" name="$element" value="$selected" />
   </nobr>
   ENDSELECTORTYPE
   }
   
   #----------------------------------------------------- image coordinates
   # single image coordinates, x, y 
   sub entercoords {
       my ($idx,,$idy,$mode,$width,$height) = @_;
       unless ($Apache::edit::bgimgsrc) { return ''; }
       if ($idx) { $idx.='_'; }
       if ($idy) { $idy.='_'; }
       my $bgfile=&Apache::lonnet::escape($Apache::edit::bgimgsrc);
       my $form    = 'lonhomework';
       my $element;
       if (! defined($mode) || $mode eq 'attribute') {
           $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth");
       } elsif ($mode eq 'textnode') {  # for data between <tag> ... </tag>
           $element = &Apache::lonnet::escape('homework_edit_'.
                                              $Apache::lonxml::curdepth);
       }
       my $formheight='';
       if ($height) {
    $formheight='&formheight='.$height.'_'.$Apache::edit::bgimgsrccurdepth;
       }
       my $formwidth='';
       if ($width) {
    $formwidth='&formwidth='.$width.'_'.$Apache::edit::bgimgsrccurdepth;
     }      }
   }      my $result = <<"ENDBUTTON";
   $optionlist.="<option value=\"TYPEDINVALUE\">Type in value</option>\n";  <a href="/cgi-bin/imagechoice.pl?formname=$form&file=$bgfile&formx=$idx$element&formy=$idy$element$formheight$formwidth"
   if ($found) {  target="imagechoice">Click Coordinates</a>
     $result.=$description.'<select name="'."$Apache::lonxml::curdepth.$name".'">  ENDBUTTON
        '.$optionlist.'      return $result;
       </select>';  
   } else {  
     $result.=&text_arg($description,$name,$token,$size);  
   }  
   return $result;  
 }  }
   
   # coordinate pair (x1,y1)-(x2,y2)
   sub entercoordpair {
       my ($id,$mode,$width,$height) = @_;
       unless ($Apache::edit::bgimgsrc) { return ''; }
       my $bgfile=&Apache::lonnet::escape($Apache::edit::bgimgsrc);
       my $form    = 'lonhomework';
       my $element;
       if (! defined($mode) || $mode eq 'attribute') {
           $element = &Apache::lonnet::escape("$id\_$Apache::lonxml::curdepth");
       } elsif ($mode eq 'textnode') {  # for data between <tag> ... </tag>
           $element = &Apache::lonnet::escape('homework_edit_'.
                                              $Apache::lonxml::curdepth);
       }
       my $formheight='';
       if ($height) {
    $formheight='&formheight='.$height.'_'.$Apache::edit::bgimgsrccurdepth;
       }
       my $formwidth='';
       if ($width) {
    $formwidth='&formwidth='.$width.'_'.$Apache::edit::bgimgsrccurdepth;
       }
       my $result = <<"ENDBUTTON";
   <a href="/cgi-bin/imagechoice.pl?mode=pair&formname=$form&file=$bgfile$formheight$formwidth&formcoord=$element"
   target="imagechoice">Click Coordinate Pair</a>
   ENDBUTTON
       return $result;
   }
 #----------------------------------------------------- browse  #----------------------------------------------------- browse
 sub browse {  sub browse {
     # insert a link to call up the filesystem browser (lonindexer)      # insert a link to call up the filesystem browser (lonindexer)
     $_ = shift;      my ($id, $mode) = @_;
     my $form    = 'lonhomework';      my $form    = 'lonhomework';
     my $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth.$_");      my $element;
       if (! defined($mode) || $mode eq 'attribute') {
           $element = &Apache::lonnet::escape("$id\_$Apache::lonxml::curdepth");
       } elsif ($mode eq 'textnode') {  # for data between <tag> ... </tag>
           $element = &Apache::lonnet::escape('homework_edit_'.
                                              $Apache::lonxml::curdepth);
       }
     my $result = <<"ENDBUTTON";      my $result = <<"ENDBUTTON";
 <a href=\"javascript:openbrowser('$form','$element')\"\>Browse</a>  <a href=\"javascript:openbrowser('$form','$element')\"\>Select</a>
 ENDBUTTON  ENDBUTTON
     return $result;      return $result;
 }  }
Line 451  ENDBUTTON Line 719  ENDBUTTON
 #----------------------------------------------------- browse  #----------------------------------------------------- browse
 sub search {  sub search {
     # insert a link to call up the filesystem browser (lonindexer)      # insert a link to call up the filesystem browser (lonindexer)
     $_ = shift;      my ($id, $mode) = @_;
     my $form    = 'lonhomework';      my $form    = 'lonhomework';
     my $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth.$_");      my $element;
       if (! defined($mode) || $mode eq 'attribute') {
           $element = &Apache::lonnet::escape("$id\_$Apache::lonxml::curdepth");
       } elsif ($mode eq 'textnode') {  # for data between <tag> ... </tag>
           $element = &Apache::lonnet::escape('homework_edit_'.
                                              $Apache::lonxml::curdepth);
       }
     my $result = <<"ENDBUTTON";      my $result = <<"ENDBUTTON";
 <a href=\"javascript:opensearcher('$form','$element')\"\>Search</a>  <a href=\"javascript:opensearcher('$form','$element')\"\>Search</a>
 ENDBUTTON  ENDBUTTON

Removed from v.1.34  
changed lines
  Added in v.1.62


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.