Diff for /loncom/homework/randomlabel.pm between versions 1.4 and 1.11

version 1.4, 2001/10/13 05:57:43 version 1.11, 2002/01/21 16:40:57
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # random labelling tool  # random labelling tool
   #
   # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
 # 7/20/2001 Isaac Tsai, initial syntax  # 7/20/2001 Isaac Tsai, initial syntax
 # 8/10/2001 Isaac Tsai,   # 8/10/2001 Isaac Tsai, 
 # 8/30/2001 Isaac Tsai,   # 8/30/2001 Isaac Tsai, 
Line 33 Line 58
 #  ===========================================  #  ===========================================
 package Apache::randomlabel;  package Apache::randomlabel;
 use strict;  use strict;
   use Apache::edit;
   
 sub BEGIN {  BEGIN {
   &Apache::lonxml::register('Apache::randomlabel',('randomlabel','labelgroup','location','label'));    &Apache::lonxml::register('Apache::randomlabel',('randomlabel','labelgroup','location','label'));
 }  }
   
 sub start_randomlabel {  sub start_randomlabel {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result='';    my $result='';
     $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
       '/res/adm/includes/GLabel.class';
   
   my $bgimg= &Apache::lonxml::get_param('bgimg',$parstack,$safeeval);    my $bgimg= &Apache::lonxml::get_param('bgimg',$parstack,$safeeval);
   
     if ( $bgimg !~ /^http:/ ) {
       $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$bgimg;
       $bgimg=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$bgimg);
       if ($bgimg =~ /$Apache::lonnet::perlvar{'lonDocRoot'}/) {
         $bgimg=~s/$Apache::lonnet::perlvar{'lonDocRoot'}//;
       } 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 $code = &Apache::lonxml::get_param('code',$parstack,$safeeval);
   my $codebase = &Apache::lonxml::get_param('codebase',$parstack,$safeeval);    my $codebase = &Apache::lonxml::get_param('codebase',$parstack,$safeeval);
   my $w= &Apache::lonxml::get_param('width',$parstack,$safeeval);    my $w= &Apache::lonxml::get_param('width',$parstack,$safeeval);
Line 64  sub start_randomlabel { Line 104  sub start_randomlabel {
       &Apache::edit::text_arg('Width(pixel):','width',$token,4).        &Apache::edit::text_arg('Width(pixel):','width',$token,4).
  &Apache::edit::text_arg('Height(pixel):','height',$token,4).   &Apache::edit::text_arg('Height(pixel):','height',$token,4).
   &Apache::edit::text_arg('TeXWidth(mm):','texwidth',$token,4).    &Apache::edit::text_arg('TeXWidth(mm):','texwidth',$token,4).
     '</td></tr><tr><td colspan="3">';       &Apache::edit::end_row().&Apache::edit::start_spanning_row();
   } elsif ($target eq 'modified') {    } elsif ($target eq 'modified') {
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,      my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
  'bgimg','width','height',   'bgimg','width','height',
Line 103  sub start_labelgroup { Line 143  sub start_labelgroup {
   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 eq 'web' || $target eq 'tex' || 
         $target eq 'grade' || $target eq 'answer') {
     $Apache::randomlabel::groupname=$name;      $Apache::randomlabel::groupname=$name;
     $Apache::randomlabel::type=$type;      $Apache::randomlabel::type=$type;
     @Apache::randomlabel::xcoord = ();      @Apache::randomlabel::xcoord = ();
     @Apache::randomlabel::ycoord = ();      @Apache::randomlabel::ycoord = ();
       @Apache::randomlabel::value = ();
     @Apache::randomlabel::label_arr  = ();      @Apache::randomlabel::label_arr  = ();
   } elsif ($target eq 'edit') {    } elsif ($target eq 'edit') {
     $result.=&Apache::edit::tag_start($target,$token);      $result.=&Apache::edit::tag_start($target,$token);
     $result.=&Apache::edit::text_arg('Name:','name',$token).      $result.=&Apache::edit::text_arg('Name:','name',$token).
       &Apache::edit::select_arg('Type:','type',['text','image'],$token).        &Apache::edit::select_arg('Type:','type',['text','image'],$token).
  '</td></tr><tr><td colspan="3">';    &Apache::edit::end_row().&Apache::edit::start_spanning_row();
   } elsif ($target eq 'modified') {    } elsif ($target eq 'modified') {
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,      my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
  'name','type');   'name','type');
Line 125  sub start_labelgroup { Line 167  sub start_labelgroup {
   return $result;    return $result;
 }  }
   
 sub add_var {  sub add_vars {
   my ($name,$value,$type,$safeeval) = @_;    my ($name,$order,$label,$labelorder,$value,$safeeval) = @_;
   if ($type eq 'array') {    my $code = '${'.$name."}{'".($order+1)."'}='".$label."';";
     my $code = 'push(@'.$name.',\''.$value.'\');';    my $out=Apache::run::run($code,$safeeval);
     my $out=Apache::run::run($code,$safeeval);    if ($value) {
   } else {      $code = '${'.$name."}{'value_".($order+1)."'}='".$value."';";
     &Apache::lonxml::error('Unsupported add_var type :'.$type.':');      $out=Apache::run::run($code,$safeeval);
       $code = '${'.$name."}{'labelvalue_".($labelorder+1)."'}='".$value."';";
       $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') {    if ($target eq 'web' || $target eq 'answer' || $target eq 'grade') {
     my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);      my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);
     &Apache::structuretags::shuffle(\@idx_arr);      &Apache::structuretags::shuffle(\@idx_arr);
     for(0 .. $#Apache::randomlabel::label_arr) {      for(0 .. $#Apache::randomlabel::label_arr) {
Line 148  sub end_labelgroup { Line 195  sub end_labelgroup {
       my $xstr;        my $xstr;
       my $ystr;        my $ystr;
       my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$_] ]";        my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$_] ]";
         my $x = $Apache::randomlabel::xcoord[$_];
         my $y = $Apache::randomlabel::ycoord[$_];
         my $value = $Apache::randomlabel::value[$_];
       if( $type eq 'text') {        if( $type eq 'text') {
  &add_var($gname,$label,'array',$safeeval);   &add_vars($gname,$_,$label,$idx_arr[$_],$value,$safeeval);
  $str = 'LB'.$Apache::randomlabel::tlabel_cnt;   $str = 'LB'.$Apache::randomlabel::tlabel_cnt;
  $xstr = 'X'.$Apache::randomlabel::tlabel_cnt;   $xstr = 'X'.$Apache::randomlabel::tlabel_cnt;
  $ystr = 'Y'.$Apache::randomlabel::tlabel_cnt;   $ystr = 'Y'.$Apache::randomlabel::tlabel_cnt;
  $Apache::randomlabel::tlabel_cnt += 1;   $Apache::randomlabel::tlabel_cnt += 1;
       } elsif ( $type eq 'image') {        } elsif ( $type eq 'image') {
  &add_var($gname,$idx_arr[$_],'array',$safeeval);   &add_vars($gname,$_,$idx_arr[$_],$idx_arr[$_],$value,$safeeval);
  $str = 'LB'.$Apache::randomlabel::ilabel_cnt;   $str = 'LB'.$Apache::randomlabel::ilabel_cnt;
  $xstr = 'X'.$Apache::randomlabel::ilabel_cnt;   $xstr = 'X'.$Apache::randomlabel::ilabel_cnt;
  $ystr = 'Y'.$Apache::randomlabel::ilabel_cnt;   $ystr = 'Y'.$Apache::randomlabel::ilabel_cnt;
Line 163  sub end_labelgroup { Line 213  sub end_labelgroup {
       } else {        } else {
  &Apache::lonxml::error('Unknown type of label :'.$type.':');   &Apache::lonxml::error('Unknown type of label :'.$type.':');
       }        }
       my $x = $Apache::randomlabel::xcoord[$_];        if ($target eq 'web') {
       my $y = $Apache::randomlabel::ycoord[$_];   $result .= '<param name="' . $str  . '" value="'.$label.'">';
       $result .= '<param name="' . $str  . '" value="'.$label.'">';   $result .= '<param name="' . $xstr . '" value="'.$x.'">';
       $result .= '<param name="' . $xstr . '" value="'.$x.'">';   $result .= '<param name="' . $ystr . '" value="'.$y.'">';
       $result .= '<param name="' . $ystr . '" value="'.$y.'">';        }
     }      }
   } elsif ($target eq 'tex') {    } elsif ($target eq 'tex') {
     my $WX1=0; #  Web x-coord. of upper left corner (ULC)      my $WX1=0; #  Web x-coord. of upper left corner (ULC)
Line 194  sub end_labelgroup { Line 244  sub end_labelgroup {
       my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$i] ]";        my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$i] ]";
       my $x = $Apache::randomlabel::xcoord[$i];        my $x = $Apache::randomlabel::xcoord[$i];
       my $y = $Apache::randomlabel::ycoord[$i];        my $y = $Apache::randomlabel::ycoord[$i];
         my $value = $Apache::randomlabel::value[$i];
       my $tcX=$x*($texwidth/$wwidth);        my $tcX=$x*($texwidth/$wwidth);
       my $tcY=$TY1-$y*($TY1/$wheight)-2;        my $tcY=$TY1-$y*($TY1/$wheight)-2;
       $tcX=sprintf('%.2f',$tcX);        $tcX=sprintf('%.2f',$tcX);
       $tcY=sprintf('%.2f',$tcY);        $tcY=sprintf('%.2f',$tcY);
       $result.='\put('.$tcX.','.$tcY.'){\normalsize \bf '.$label.'}'."\n";        $result.='\put('.$tcX.','.$tcY.'){\normalsize \bf '.$label.'}'."\n";
       if( $type eq 'text') {        if( $type eq 'text') {
  &add_var($gname,$label,'array',$safeeval);   &add_vars($gname,$i,$label,$idx_arr[$i],$value,$safeeval);
       } elsif ( $type eq 'image') {        } elsif ( $type eq 'image') {
  &add_var($gname,$idx_arr[$i],'array',$safeeval);   &add_vars($gname,$i,$idx_arr[$i],$idx_arr[$i],$value,$safeeval);
       } else {        } else {
  &Apache::lonxml::error('Unknown type of label :'.$type.':');   &Apache::lonxml::error('Unknown type of label :'.$type.':');
       }        }
Line 213  sub end_labelgroup { Line 264  sub end_labelgroup {
   return $result;    return $result;
 }  }
   
 # <location x=123 y=456 />  # <location x="123" y="456" value="some value"/>
 sub start_location {  sub start_location {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $x= &Apache::lonxml::get_param('x',$parstack,$safeeval);    my $x= &Apache::lonxml::get_param('x',$parstack,$safeeval);
   my $y= &Apache::lonxml::get_param('y',$parstack,$safeeval);    my $y= &Apache::lonxml::get_param('y',$parstack,$safeeval);
     my $value= &Apache::lonxml::get_param('value',$parstack,$safeeval);
   my $result='';    my $result='';
   push(@Apache::randomlabel::xcoord,$x);    push(@Apache::randomlabel::xcoord,$x);
   push(@Apache::randomlabel::ycoord,$y);    push(@Apache::randomlabel::ycoord,$y);
     push(@Apache::randomlabel::value,$value);
   if ($target eq 'edit') {    if ($target eq 'edit') {
     $result.=&Apache::edit::tag_start($target,$token);      $result.=&Apache::edit::tag_start($target,$token);
     $result.=&Apache::edit::text_arg('X:','x',$token,4).      $result.=&Apache::edit::text_arg('X:','x',$token,4).
       &Apache::edit::text_arg('Y:','y',$token,4).        &Apache::edit::text_arg('Y:','y',$token,4).
  '</td></tr><tr><td colspan="3">';   &Apache::edit::text_arg('Value:','value',$token).
     &Apache::edit::end_row();
     $result.=&Apache::edit::end_table;      $result.=&Apache::edit::end_table;
   } elsif ($target eq 'modified') {    } elsif ($target eq 'modified') {
     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,      my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
  'x','y');   'x','y','value');
     if ($constructtag) {      if ($constructtag) {
       $result = &Apache::edit::rebuild_tag($token);        $result = &Apache::edit::rebuild_tag($token);
       $result.=&Apache::edit::handle_insert();        $result.=&Apache::edit::handle_insert();
Line 249  sub end_location { Line 303  sub end_location {
 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') {    if ($target eq 'web' || $target eq 'tex' || 
         $target eq 'grade' || $target eq 'answer') {
     my $ltext=&Apache::lonxml::get_all_text("/label",$$parser[-1]);      my $ltext=&Apache::lonxml::get_all_text("/label",$$parser[-1]);
     push(@Apache::randomlabel::label_arr,$ltext);      push(@Apache::randomlabel::label_arr,$ltext);
   } elsif ($target eq 'edit') {    } elsif ($target eq 'edit') {
     $result.=&Apache::edit::tag_start($target,$token);      $result.=&Apache::edit::tag_start($target,$token);
     my $text=&Apache::lonxml::get_all_text("/label",$$parser[-1]);      my $text=&Apache::lonxml::get_all_text("/label",$$parser[-1]);
     $result.='</td></tr><tr><td colspan="3">'.      $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row().
       &Apache::edit::editfield('',$text,'',20,1).        &Apache::edit::editfield('',$text,'',20,1).
  &Apache::edit::end_table();   &Apache::edit::end_table();
   } elsif ($target eq 'modified') {    } elsif ($target eq 'modified') {
     my $text=$$parser[-1]->get_text("/label");      my $text=$$parser[-1]->get_text("/label");
     $result.=&Apache::edit::modifiedfield($token);      $result.='<label>'.&Apache::edit::modifiedfield($token);
   }    }
   return $result;    return $result;
 }  }

Removed from v.1.4  
changed lines
  Added in v.1.11


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>