Diff for /loncom/homework/randomlabel.pm between versions 1.10 and 1.78

version 1.10, 2002/01/17 12:23:31 version 1.78, 2005/06/28 14:58:23
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # 7/20/2001 Isaac Tsai, initial syntax  
 # 8/10/2001 Isaac Tsai,   
 # 8/30/2001 Isaac Tsai,   
 # SYNTAX:  # SYNTAX:
 # <randomlabel bgimg="URL" width="12" height="45" texwidth="50">  # <randomlabel bgimg="URL" width="12" height="45" texwidth="50">
 #    <labelgroup name="GroupOne" type="image">  #    <labelgroup name="GroupOne" type="image">
Line 57 Line 54
 #             (21,54)  : $GroupTwo[2] = "TEXT-2"  #             (21,54)  : $GroupTwo[2] = "TEXT-2"
 #  ===========================================  #  ===========================================
 package Apache::randomlabel;  package Apache::randomlabel;
   use Apache::lonnet;
 use strict;  use strict;
 use Apache::edit;  use Apache::edit;
   use Apache::File();
   use Apache::Constants qw(:common :http);
   use Image::Magick;
   use Apache::lonplot;
   
   my %args;
   my $cgi_id;
   my $scale_factor; # image scale factor.
   my $label_xscale;                # Label scale factor (needed for gnuplot).
   my $label_yscale;
   
   
 BEGIN {  BEGIN {
   &Apache::lonxml::register('Apache::randomlabel',('randomlabel','labelgroup','location','label'));      &Apache::lonxml::register('Apache::randomlabel',('randomlabel','labelgroup','location','label','bgimg'));
   }
   
   
   
   sub check_int {
       # utility function to do error checking on a integer.
       my ($num,$default) = @_;
       $default = 100 if (! defined($default));
       $num =~ s/\s+//g;  # We dont need no stinkin white space!
       # If it is a real, just grab the integer part.
       ($num,undef) = split (/\./,$num) if ($num =~ /\./); 
       # set to default if what we have left doesn't match anything...
       $num = $default unless ($num =~/^\d+$/);
       return $num;
 }  }
   
   #  Get width/height from an image tag...
   #
   #  Parameters:
   #      tag         - tag potentially containing height/width attributes.
   #      def_width   - Default width.
   #      def_height  - Default height.
   #  Returns:
   #      list containing width/height.
   #
   sub extract_tag_sizes {
       my ($tag, $dw, $dh) = @_;
       $tag =~ s/\s+/ /g;         # Collapse whitespace.
       $tag =~ s/\s*=\s*/=/g;     # kill space around ='s.
       $tag =~ s/[<>\"]//g;       # Get rid of the <">'s too.
   
       &Apache::lonxml::debug("Compressed tag: $tag");
       my @taglist = split(/ /,$tag);
       foreach my $attribute (@taglist) {
    if ($attribute =~ /^width/i) {
       my ($e, $s)= split(/=/,$attribute);
       $dw = $s;
    }
    if ($attribute =~  /^height/i) {
       my ($e, $s) = split(/=/,$attribute);
       $dh = $s;
    }
       } 
       return($dw, $dh);
   
   }
   
   my ($height_param,$width_param);
 sub start_randomlabel {  sub start_randomlabel {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;  
   my $result='';      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=      my $result='';
     '/res/adm/includes/GLabel.class';      push (@Apache::lonxml::namespace,'randomlabel');
       ($height_param,$width_param)=(0,0);
   my $bgimg= &Apache::lonxml::get_param('bgimg',$parstack,$safeeval);      $label_xscale = 1.0; # Assume image size not overridden.
       $label_yscale = 1.0;
   if ( $bgimg !~ /^http:/ ) {      my $bgimg= &Apache::lonxml::get_param('bgimg',$parstack,$safeeval);
     $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$bgimg;      if ( defined($bgimg) && $bgimg !~ /^http:/ ) {
     $bgimg=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$bgimg);   $bgimg=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$bgimg);
     if ($bgimg =~ /$Apache::lonnet::perlvar{'lonDocRoot'}/) {   if (&Apache::lonnet::repcopy($bgimg) ne 'ok') {
       $bgimg=~s/$Apache::lonnet::perlvar{'lonDocRoot'}//;      $bgimg='/home/httpd/html/adm/lonKaputt/lonlogo_broken.gif';
     } elsif ($bgimg =~ m:^/home/.*/public_html:) {   }
       $bgimg =~ s:^/home/(.*)/public_html:/~$1:;  
     }  
     $bgimg="http://".$ENV{'SERVER_NAME'}.$bgimg;  
   }  
   my $code = &Apache::lonxml::get_param('code',$parstack,$safeeval);  
   my $codebase = &Apache::lonxml::get_param('codebase',$parstack,$safeeval);  
   my $w= &Apache::lonxml::get_param('width',$parstack,$safeeval);  
   my $h= &Apache::lonxml::get_param('height',$parstack,$safeeval);  
   my $texwidth= &Apache::lonxml::get_param('texwidth',$parstack,$safeeval);  
   if (!$code) { $code='GLabel.class'; }  
   if (!$codebase) { $codebase='/res/adm/includes/'; }  
   $Apache::randomlabel::tlabel_cnt=0;  
   $Apache::randomlabel::ilabel_cnt=0;  
   if ($target eq 'web') {  
     $result.="<applet code=\"$code\" codebase=\"$codebase\" width=\"$w\" height=\"$h\">";  
     $result.="<param name=\"bgimg\" value=\"$bgimg\">";  
   } elsif ($target eq 'tex') {  
     $bgimg=~s/(.gif|.jpg)$/.ps/;  
     $result.='\vspace*{2mm} \\ \noindent \epsfxsize='.$texwidth.' \epsffile{'.  
       $bgimg.'}\setlength{\unitlength}{1mm} \\ \begin{picture}(0,0)(0,-5)';  
   } elsif ($target eq 'edit') {  
     $result.=&Apache::edit::tag_start($target,$token);  
     $result.=&Apache::edit::text_arg('Image:','bgimg',$token,75).'<br />'.  
       &Apache::edit::text_arg('Width(pixel):','width',$token,4).  
  &Apache::edit::text_arg('Height(pixel):','height',$token,4).  
   &Apache::edit::text_arg('TeXWidth(mm):','texwidth',$token,4).  
      &Apache::edit::end_row().&Apache::edit::start_spanning_row();  
   } elsif ($target eq 'modified') {  
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,  
  'bgimg','width','height',  
  'texwidth');  
     if ($constructtag) {  
       $result = &Apache::edit::rebuild_tag($token);  
       $result.=&Apache::edit::handle_insert();  
     }      }
   }      $Apache::randomlabel::obj_cnt=0;
   return $result;      if ($target eq 'web') {
    $cgi_id=&Apache::loncommon::get_cgi_id();
    %args=();
    $args{"cgi.$cgi_id.BGIMG"}=&Apache::lonnet::escape($bgimg);
    $height_param = &Apache::lonxml::get_param('height',$parstack, $safeeval);
    $width_param  = &Apache::lonxml::get_param('width', $parstack, $safeeval);
       } elsif ($target eq 'tex' && defined($bgimg)) {
    $result.=&make_eps_image($bgimg,$parstack,$safeeval);
       } elsif ($target eq 'edit') {
    $result.=&Apache::edit::tag_start($target,$token);
    $Apache::edit::bgimgsrc=
       &Apache::lonxml::get_param('bgimg',$parstack,$safeeval);
    $Apache::edit::bgimgsrccurdepth=$Apache::lonxml::curdepth;
    $result.=&Apache::edit::text_arg('Image:','bgimg',$token,75).' ';
    $result.=&Apache::edit::browse('bgimg').' ';
    $result.=&Apache::edit::search('bgimg').'<br />'.
       &Apache::edit::text_arg('Width(pixel):' ,'width'   ,$token,6).
       &Apache::edit::text_arg('Height(pixel):','height'  ,$token,6).
       &Apache::edit::text_arg('TeXWidth(mm):' ,'texwidth',$token,6).
       &Apache::edit::end_row().&Apache::edit::start_spanning_row();     
       } elsif ($target eq 'modified') {
    my $constructtag=&Apache::edit::get_new_args($token,$parstack,
        $safeeval,'bgimg','width',
        'height','texwidth');
    if ($constructtag) {
       $result = &Apache::edit::rebuild_tag($token);
       $result.=&Apache::edit::handle_insert();
    }
       }
       return $result;
 }  }
   
 sub end_randomlabel {  sub end_randomlabel {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result='';      my $result='';
   my $count;      my $count;
       pop @Apache::lonxml::namespace;
       if ($target eq 'web') {
   if ($target eq 'web') {   $count = $Apache::randomlabel::obj_cnt;
     $count = $Apache::randomlabel::tlabel_cnt;   if( $count != 0) { $args{"cgi.$cgi_id.OBJCOUNT"}=$count; }
     if( $count != 0) { $result.= "<param name=\"count\" value=\"$count\">"; }   $result.='<img src="/adm/randomlabel.png?token='.$cgi_id.'" /><br />'."\n";
     $count = $Apache::randomlabel::ilabel_cnt;   &Apache::lonnet::appenv(%args);
     if( $count != 0) { $result.= "<param name=\"icount\" value=\"$count\">"; }      } elsif ($target eq 'tex') {
     $result .= "</applet><BR />";   $result='\end{picture}\\\\';
   } elsif ($target eq 'tex') {   $result.= ' \vskip -'.$height_param.' mm }  \\\\ ';
     $result='\end{picture}';      } elsif ($target eq 'edit') {
   } elsif ($target eq 'edit') {   $result.=&Apache::edit::end_table;
     $result.=&Apache::edit::end_table;      }
   }      return $result;
   return $result;  }
   
   
   sub start_bgimg {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $result='';
       if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { 
    &Apache::lonxml::startredirection(); 
       }
       return $result;
   }
   
   sub end_bgimg {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $result='';
       if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { 
    my $bgimg=&Apache::lonxml::endredirection(); 
    if ($target eq 'web') {
       
       # If the  tag produced has sizes, they override ours.
       # (for now anyway).
       #
       &Apache::lonxml::debug("Base sizes: $width_param x $height_param");
   
       my ($plot_x, $plot_y) = &extract_tag_sizes($bgimg, 
          $width_param,
          $height_param);
       &Apache::lonxml::debug("Extracted sizes: $plot_x x $plot_y");
       if ($width_param) {
    $label_xscale     = $plot_x / $width_param;
       }
       if ($height_param) {
    $label_yscale     = $plot_y / $height_param;
       }
       &Apache::lonxml::debug("Scale factors:   $label_xscale $label_yscale");
   
       &Apache::lonxml::debug("Image: $bgimg");
       $bgimg=&Apache::imageresponse::clean_up_image($bgimg);
       &Apache::lonxml::debug("Cleaned image: $bgimg");
       $args{"cgi.$cgi_id.BGIMG"}=&Apache::lonnet::escape($bgimg);
    } elsif ($target eq 'tex') {
       #   Some bg images can create latex for us... e.g. gnuplot.
       #   If it looks like we have some latex use that, 
       #   otherwise, assume this is a resource name that must
       #   be converted into the latex to create an eps insertion.
       #
       my $src = $bgimg;
       $src =~ s/\s+$//s;
       $src =~ s/^\s+//s;
   
       #If this is a dynamically generated image, it will
       #be in latex already, with a comment header that
       #describes the dimensions:
   
       if($src =~ /^%DYNAMICIMAGE:/) {
    $Apache::lonxml::debug = 0;
    &Apache::lonxml::debug("Dynamic image");
    my ($commentline, $junk) = split(/\n/, $src);
    &Apache::lonxml::debug("Comment line was: $commentline");
    my $trash;
    my $initial_width;
    ($trash, $initial_width, $height_param, $width_param) =
       split(/:/,$commentline);
    &Apache::lonxml::debug("internal web Width/height: $initial_width $height_param");
    &Apache::lonxml::debug("Texwitdh: $width_param");
    if($initial_width == 0) {
       $initial_width = $width_param;
    }
    # strip off the comments since output does not always
    # preserve \n's:
                   #
    $src =~ s/$commentline//;
    $scale_factor = $width_param / $initial_width;
    $height_param = $height_param*$scale_factor;
   
    $label_xscale = 1.0; #  $scale_factor;
    $label_yscale = 1.0; #  $scale_factor;
      
    &Apache::lonxml::debug("height $height_param");
    &Apache::lonxml::debug("Width $width_param");
    &Apache::lonxml::debug("Scale factors: $label_xscale $label_yscale");
    my $dirty_width = $width_param + 5;
    $result .= '\parbox{'.$dirty_width.'mm}{';
    $result  .= " $src \n";
    $result  .= '\setlength{\unitlength}{1mm}'."\n";
    $result  .= '\begin{picture}('."$height_param,$width_param)";
    $result  .= "(0,-$height_param)";
    $result  .= "\n";
    $Apache::lonxml::debug = 0;
   
       } else {
    $result.=&make_eps_image($bgimg,$parstack,$safeeval,-2);
       }
    }
       }
       return $result;
   }
   sub make_eps_image {
       my ($bgimg,$parstack,$safeeval,$depth)=@_;
       &Apache::lonxml::debug("image prior to get_eps_image: $bgimg");
       my ($path,$file) = &Apache::londefdef::get_eps_image($bgimg);
       &Apache::lonxml::debug("image after:  $bgimg");
       ($height_param,$width_param)=
    &Apache::londefdef::image_size($bgimg,0.3,$parstack,$safeeval,
          $depth,1);
   
       &Apache::lonxml::debug("Image size: $height_param x $width_param");
   
       my $dirtywidth=$width_param+5;
       my $result ="\n".'\vspace*{2mm}\noindent'."\n".
    '\parbox{'.$dirtywidth.
    ' mm}{  \noindent \epsfxsize='.$width_param.
    ' mm \epsffile{'.$path.$file.
    '}\setlength{\unitlength}{1mm}'."\n".'  \begin{picture}('.
    $width_param.','.$height_param.')(0,-'.$height_param.')'."\n";
       my $magick = Image::Magick->new;
       $magick->Read($bgimg);
       my $initial_width = $magick->Get('width');
       &Apache::lonxml::debug("ImageMagick thinks width is; $initial_width");
       $scale_factor = $width_param / $initial_width;
       return $result;
 }  }
   
 sub start_labelgroup {  sub start_labelgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result='';      my $result='';
   my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);      my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
   my $type = &Apache::lonxml::get_param('type',$parstack,$safeeval);      my $type = &Apache::lonxml::get_param('type',$parstack,$safeeval);
   $type =~tr/A-Z/a-z/;      $type =~tr/A-Z/a-z/;
   if ($target eq 'web' || $target eq 'tex' ||       if ($target ne 'modified' && ($name =~ /\W/ || $name =~ /^[0-9]/)) {
       $target eq 'grade' || $target eq 'answer') {   &Apache::lonxml::error("Only _ a-z A-Z and 0-9 are allowed in the name to a labelgroup, and the first character can not be a number.<br />");
     $Apache::randomlabel::groupname=$name;      }
     $Apache::randomlabel::type=$type;      if ($target eq 'web' || $target eq 'tex' ||
     @Apache::randomlabel::xcoord = ();   $target eq 'grade' || $target eq 'answer' || $target eq 'analyze') {
     @Apache::randomlabel::ycoord = ();   $Apache::randomlabel::groupname=$name;
     @Apache::randomlabel::value = ();   $Apache::randomlabel::type=$type;
     @Apache::randomlabel::label_arr  = ();   @Apache::randomlabel::xcoord = ();
   } elsif ($target eq 'edit') {   @Apache::randomlabel::ycoord = ();
     $result.=&Apache::edit::tag_start($target,$token);   @Apache::randomlabel::value = ();
     $result.=&Apache::edit::text_arg('Name:','name',$token).   @Apache::randomlabel::label_arr  = ();
       &Apache::edit::select_arg('Type:','type',['text','image'],$token).   @Apache::randomlabel::description  = ();
   &Apache::edit::end_row().&Apache::edit::start_spanning_row();      } elsif ($target eq 'edit') {
   } elsif ($target eq 'modified') {   $result.=&Apache::edit::tag_start($target,$token);
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,   $result.=&Apache::edit::text_arg('Name:','name',$token).
  'name','type');      &Apache::edit::select_arg('Type:','type',['text','image'],$token);
     if ($constructtag) {   if (!defined($token->[2]{'TeXsize'})) {
       $result = &Apache::edit::rebuild_tag($token);      $token->[2]{'TeXsize'}='\normalsize';
       $result.=&Apache::edit::handle_insert();   }
    $result.=&Apache::edit::select_arg('TeX font size:','TeXsize',
      ['\tiny','\scriptsize',
       '\footnotesize','\small',
       '\normalsize','\large','\Large',
       '\LARGE','\huge','\Huge'],
      $token);
    $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
       } elsif ($target eq 'modified') {
    my $constructtag=&Apache::edit::get_new_args($token,$parstack,
        $safeeval,'name','type',
        'TeXsize');
    if ($constructtag) {
       $result = &Apache::edit::rebuild_tag($token);
       $result.=&Apache::edit::handle_insert();
    }
     }      }
   }      return $result;
   return $result;  
 }  }
   
   #
   #   Utility sub to compute the width of a label.
   #
   sub get_label_width {
       my $label         = shift;
       &Apache::lonxml::debug("image label = $label");
       if (-e $label) {
    &Apache::lonxml::debug("$label exists");
       } else {
    &Apache::lonxml::debug("$label does not exist");
       }
       my $magick        = Image::Magick->new;
       $magick->Read($label);
       my $pixel_width   = $magick->Get('width');
       return $pixel_width * $scale_factor;
       
   
   }
 sub add_vars {  sub add_vars {
   my ($name,$order,$label,$labelorder,$value,$safeeval) = @_;      my ($name,$order,$label,$labelorder,$value,$image,$safeeval) = @_;
   my $code = '${'.$name."}{'".($order+1)."'}='".$label."';";      if (!defined($name) || $name eq '') { return; }
   my $out=Apache::run::run($code,$safeeval);      my $code = '${'.$name."}{'".($order+1)."'}='".$label."';";
   if ($value) {      my $out=Apache::run::run($code,$safeeval);
     $code = '${'.$name."}{'value_".($order+1)."'}='".$value."';";      if ($value) {
     $out=Apache::run::run($code,$safeeval);   $code = '${'.$name."}{'value_".($order+1)."'}='".$value."';";
     $code = '${'.$name."}{'labelvalue_".($labelorder+1)."'}='".$value."';";   $out=Apache::run::run($code,$safeeval);
    $code = '${'.$name."}{'labelvalue_".($labelorder+1)."'}='".$value."';";
    $out=Apache::run::run($code,$safeeval);
       }
       if ($image) {
    my $code = '${'.$name."}{'image_".($order+1)."'}='".$image."';";
    my $out=Apache::run::run($code,$safeeval);
       }
       $code = '${'.$name."}{'numlocations'}='".($order+1)."';";
     $out=Apache::run::run($code,$safeeval);      $out=Apache::run::run($code,$safeeval);
   }  
   $code = '${'.$name."}{'numlocations'}='".($order+1)."';";  
   $out=Apache::run::run($code,$safeeval);  
 }  }
   
 # begin to assign labels to locations  # begin to assign labels to locations
 sub end_labelgroup {  sub end_labelgroup {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $gname = $Apache::randomlabel::groupname;      my $gname = $Apache::randomlabel::groupname;
   my $type  = $Apache::randomlabel::type;      my $type  = $Apache::randomlabel::type;
   my $result='';      my $result='';
   if ($target eq 'web' || $target eq 'answer' || $target eq 'grade') {      if ($target eq 'web' || $target eq 'answer' || $target eq 'grade' ||
     my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);   $target eq 'analyze') {
     &Apache::structuretags::shuffle(\@idx_arr);   my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);
     for(0 .. $#Apache::randomlabel::label_arr) {   &Apache::structuretags::shuffle(\@idx_arr);
       my $str;   for(0 .. $#Apache::randomlabel::label_arr) {
       my $xstr;      my $str;
       my $ystr;      my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$_] ]";
       my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$_] ]";      my $x = $Apache::randomlabel::xcoord[$_];
       my $x = $Apache::randomlabel::xcoord[$_];      my $y = $Apache::randomlabel::ycoord[$_];
       my $y = $Apache::randomlabel::ycoord[$_];      my $value = $Apache::randomlabel::value[$_];
       my $value = $Apache::randomlabel::value[$_];      my $i=$Apache::randomlabel::obj_cnt++;
       if( $type eq 'text') {      if( $type eq 'text') {
  &add_vars($gname,$_,$label,$idx_arr[$_],$value,$safeeval);   &add_vars($gname,$_,$label,$idx_arr[$_],$value,'',$safeeval);
  $str = 'LB'.$Apache::randomlabel::tlabel_cnt;   $str = join(':',$x,$y,&Apache::lonnet::escape($label));
  $xstr = 'X'.$Apache::randomlabel::tlabel_cnt;   $args{"cgi.$cgi_id.OBJTYPE"}.='LABEL:';
  $ystr = 'Y'.$Apache::randomlabel::tlabel_cnt;      } elsif ( $type eq 'image') {
  $Apache::randomlabel::tlabel_cnt += 1;   &add_vars($gname,$_,
       } elsif ( $type eq 'image') {    $Apache::randomlabel::description[$idx_arr[$_]],
  &add_vars($gname,$_,$idx_arr[$_],$idx_arr[$_],$value,$safeeval);    $idx_arr[$_],$value,$label,$safeeval);
  $str = 'LB'.$Apache::randomlabel::ilabel_cnt;   $str = join(':',$x,$y,&Apache::lonnet::escape($label));
  $xstr = 'X'.$Apache::randomlabel::ilabel_cnt;   $args{"cgi.$cgi_id.OBJTYPE"}.='IMAGE:';
  $ystr = 'Y'.$Apache::randomlabel::ilabel_cnt;      } else {
  $Apache::randomlabel::ilabel_cnt += 1;   &Apache::lonxml::error('Unknown type of label :'.$type.':');
       } else {      }
  &Apache::lonxml::error('Unknown type of label :'.$type.':');      if ($target eq 'web') { $args{"cgi.$cgi_id.OBJ$i"} =$str; }
       }   }
       if ($target eq 'web') {      } elsif ($target eq 'tex') {
  $result .= '<param name="' . $str  . '" value="'.$label.'">';   my $WX1=0; #  Web x-coord. of upper left corner (ULC)
  $result .= '<param name="' . $xstr . '" value="'.$x.'">';   my $WY1=0; #  Web y-coord. of (ULC)
  $result .= '<param name="' . $ystr . '" value="'.$y.'">';   my $wwidth=&Apache::lonxml::get_param('width',$parstack,$safeeval,-2);
       }   my $wheight=&Apache::lonxml::get_param('height',$parstack,$safeeval,-2);
     }   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
   } elsif ($target eq 'tex') {   if (!defined($TeXsize)) { $TeXsize='\\normalsize'; }
     my $WX1=0; #  Web x-coord. of upper left corner (ULC)  
     my $WY1=0; #  Web y-coord. of (ULC)   my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);
     my $wwidth=&Apache::lonxml::get_param('width',$parstack,$safeeval,-2);   &Apache::structuretags::shuffle(\@idx_arr);
     my $wheight=&Apache::lonxml::get_param('height',$parstack,$safeeval,-2);  
     my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,-2);   &Apache::lonxml::debug("Array is:".$#Apache::randomlabel::label_arr.":");
     my $TX1=0;   $Apache::lonxml::debug = 0;
     my $TY1=$texwidth*($wheight/$wwidth);   for(my $i=0;$i <= $#Apache::randomlabel::label_arr; $i++) {
     my $TX2=$texwidth;      my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$i] ]";
     my $TY2=0;      my $x = $Apache::randomlabel::xcoord[$i];
       # FIXME the 3.5 here is the 'height' of the letter in TeX
       my $y = $Apache::randomlabel::ycoord[$i]-3.5;
     my $slopex=($wwidth-$WX1)/($TX2-$TX1);      &Apache::lonxml::debug("initially: x= $x y= $y");
     my $slopey=($wheight-$WY1)/($TY2-($TY1-1.0));      my $value = $Apache::randomlabel::value[$i];
     my $cstx=$wwidth-$slopex*($TX2);      #x latex coordinate
     my $csty=$wheight-$slopey*($TY2);      my $tcX=($x)*($width_param/$wwidth);
       &Apache::lonxml::debug("wparam = $width_param wwidth = $wwidth, texx = $tcX");
     my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);      #y latex coordinate
     &Apache::structuretags::shuffle(\@idx_arr);              #      my $ratio=($wwidth > 0 ? $wheight/$wwidth : 1 );
       my $tcY=$height_param-$y*($height_param/$wheight);
     &Apache::lonxml::debug("Array is:".$#Apache::randomlabel::label_arr.":");      &Apache::lonxml::debug("hparam = $height_param wheight = $wheight texy = $tcY");
     for(my $i=0;$i <= $#Apache::randomlabel::label_arr; $i++) {      $tcX=sprintf('%.2f',$tcX);
       my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$i] ]";      $tcY=sprintf('%.2f',$tcY);
       my $x = $Apache::randomlabel::xcoord[$i];      $result .= '\put('.$tcX.','.$tcY.'){';
       my $y = $Apache::randomlabel::ycoord[$i];      if( $type eq 'text') {
       my $value = $Apache::randomlabel::value[$i];   $result.= $TeXsize.' \bf '.$label."}\n";
       my $tcX=$x*($texwidth/$wwidth);   &add_vars($gname,$i,$label,$idx_arr[$i],$value,'',$safeeval);
       my $tcY=$TY1-$y*($TY1/$wheight)-2;      } elsif ( $type eq 'image') {
       $tcX=sprintf('%.2f',$tcX);   my ($path,$file) = &Apache::londefdef::get_eps_image($label);
       $tcY=sprintf('%.2f',$tcY);   my $image_name = $path.$file;
       $result.='\put('.$tcX.','.$tcY.'){\normalsize \bf '.$label.'}'."\n";   my $label_width = get_label_width($label);
       if( $type eq 'text') {  
  &add_vars($gname,$i,$label,$idx_arr[$i],$value,$safeeval);   $result .=  '\includegraphics[width='.$label_width.'mm]{'
       } elsif ( $type eq 'image') {              .$image_name."}}\n";
  &add_vars($gname,$i,$idx_arr[$i],$idx_arr[$i],$value,$safeeval);   &add_vars($gname,$i,
       } else {    $Apache::randomlabel::description[$idx_arr[$i]],
  &Apache::lonxml::error('Unknown type of label :'.$type.':');    $idx_arr[$i],$value,$label,$safeeval);
       }      } else {
     }   &Apache::lonxml::error('Unknown type of label :'.$type.':');
   } elsif ($target eq 'edit') {      }
     $result.=&Apache::edit::end_table;   }
   }   $Apache::lonxml::debug =0;
   return $result;      } elsif ($target eq 'edit') {
    $result.=&Apache::edit::end_table;
       }
       return $result;
 }  }
   
 # <location x="123" y="456" value="some value"/>  # <location x="123" y="456" value="some value"/>
 sub start_location {  sub start_location {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      $Apache::lonxml::debug = 0;
   my $x= &Apache::lonxml::get_param('x',$parstack,$safeeval);      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $y= &Apache::lonxml::get_param('y',$parstack,$safeeval);      my $x= &check_int(&Apache::lonxml::get_param('x',$parstack,$safeeval),50);
   my $value= &Apache::lonxml::get_param('value',$parstack,$safeeval);      my $y= &check_int(&Apache::lonxml::get_param('y',$parstack,$safeeval),50);
   my $result='';      &Apache::lonxml::debug("x = $x y = $y");
   push(@Apache::randomlabel::xcoord,$x);      $x = $x*$label_xscale;
   push(@Apache::randomlabel::ycoord,$y);      $y = $y*$label_yscale;
   push(@Apache::randomlabel::value,$value);      &Apache::lonxml::debug(" H = $height_param W = $width_param");
   if ($target eq 'edit') {      &Apache::lonxml::debug(" XS = $label_xscale YS = $label_yscale");
     $result.=&Apache::edit::tag_start($target,$token);      &Apache::lonxml::debug(" X  = $x Y = $y");
     $result.=&Apache::edit::text_arg('X:','x',$token,4).      my $value= &Apache::lonxml::get_param('value',$parstack,$safeeval);
       &Apache::edit::text_arg('Y:','y',$token,4).      my $result='';
  &Apache::edit::text_arg('Value:','value',$token).      push(@Apache::randomlabel::xcoord,$x);
   &Apache::edit::end_row();      push(@Apache::randomlabel::ycoord,$y);
     $result.=&Apache::edit::end_table;      push(@Apache::randomlabel::value,$value);
   } elsif ($target eq 'modified') {      if ($target eq 'edit') {
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,   $result.=&Apache::edit::tag_start($target,$token);
  'x','y','value');   $result.=&Apache::edit::text_arg('X:','x',$token,4).
     if ($constructtag) {      &Apache::edit::text_arg('Y:','y',$token,4).
       $result = &Apache::edit::rebuild_tag($token);      &Apache::edit::entercoords('x','y','attribute','width','height').'&nbsp;&nbsp;&nbsp;'.
       $result.=&Apache::edit::handle_insert();      &Apache::edit::text_arg('Value:','value',$token).
       &Apache::edit::end_row();
    $result.=&Apache::edit::end_table;
       } elsif ($target eq 'modified') {
    my $constructtag=&Apache::edit::get_new_args($token,$parstack,
       $safeeval,'x','y','value');
    if ($constructtag) {
       $result = &Apache::edit::rebuild_tag($token);
       $result.=&Apache::edit::handle_insert();
    }
     }      }
   }      $Apache::lonxml::debug = 0;
   return $result;      return $result;
 }  }
   
 sub end_location {  sub end_location {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my @result;      my @result;
   if ($target eq 'edit') { @result=('','no') }      if ($target eq 'edit') { @result=('','no') }
   return @result;      return @result;
 }  }
   
 # <label>$var_abc</label>  # <label>$var_abc</label>
 sub start_label {  sub start_label {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result='';      my $result='';
   if ($target eq 'web' || $target eq 'tex' ||       my $type = &Apache::lonxml::get_param('type',$parstack,$safeeval,-2);
       $target eq 'grade' || $target eq 'answer') {      if ($target eq 'web' || $target eq 'tex' ||
     my $ltext=&Apache::lonxml::get_all_text("/label",$$parser[-1]);   $target eq 'grade' || $target eq 'answer' || $target eq 'analyze') {
     push(@Apache::randomlabel::label_arr,$ltext);   &Apache::lonxml::startredirection; 
   } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
     $result.=&Apache::edit::tag_start($target,$token);   $result.=&Apache::edit::tag_start($target,$token,"$type Label");
     my $text=&Apache::lonxml::get_all_text("/label",$$parser[-1]);   my $text=&Apache::lonxml::get_all_text("/label",$parser);
     $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row().   if ($type eq 'image') {
       &Apache::edit::editfield('',$text,'',20,1).      $result.=&Apache::edit::end_row().
  &Apache::edit::end_table();   &Apache::edit::start_spanning_row();
   } elsif ($target eq 'modified') {      $result.=&Apache::edit::text_arg('Description:','description',
     my $text=$$parser[-1]->get_text("/label");       $token);
     $result.=&Apache::edit::modifiedfield($token);   }
   }   if ($type eq 'text') { $result.="Label Text:"; }
   return $result;   if ($type eq 'image') { $result.="Path to image:&nbsp;"; }
    $result.=&Apache::edit::editline('',$text,'',50).
       &Apache::edit::end_table();
       } elsif ($target eq 'modified') {
    $result = '<label>';
    if ($type eq 'image') {
       my $constructtag=&Apache::edit::get_new_args($token,$parstack,
    $safeeval,
    'description');
       if ($constructtag) {
    $result = &Apache::edit::rebuild_tag($token);
       } else {
    $result = $token->[4];
       }
    }
    $result.=&Apache::edit::modifiedfield("/label",$parser);
       }
       return $result;
 }  }
   
 sub end_label {  sub end_label {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my @result;      my @result;
   if ($target eq 'edit') { @result=('','no') }      if ($target eq 'edit') {
   return @result;   @result=('','no') ;
       } elsif ($target eq 'web' || $target eq 'tex' || $target eq 'grade' ||
        $target eq 'answer' || $target eq 'analyze') {
    my $type = &Apache::lonxml::get_param('type',$parstack,$safeeval,-2);
    my $ltext=&Apache::lonxml::endredirection; 
    if ($type eq 'image') {
       if ($target eq 'tex') {
    # For tex targets, our image url has been potentially corrupted
    # by prepending \'s in front of special latex symbols.
    # For now we only worry about the _ case (most common?)
    # There's a whole host of theim in lonxml::latex_special_symbols
    # that could potentially have to be re-done.
   
    $ltext =~ s/\\_/_/g;
       }
       &Apache::lonxml::debug("Turning $ltext, $Apache::lonxml::pwd[-1]");
       $ltext=&Apache::imageresponse::clean_up_image($ltext);
   #    $ltext=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],
   # $ltext);
       &Apache::lonxml::debug("into $ltext");
       my $description = &Apache::lonxml::get_param('description',
    $parstack,$safeeval);
       push(@Apache::randomlabel::description,$description);
    } else {
       $ltext=~s/[\r\n]*//gs
    }
    push(@Apache::randomlabel::label_arr,$ltext);
       }
       return @result;
 }  }
   
   
   
 1;  1;
 __END__  __END__
     

Removed from v.1.10  
changed lines
  Added in v.1.78


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.