Annotation of loncom/homework/randomlabel.pm, revision 1.25

1.1       tsai        1: # The LearningOnline Network with CAPA
                      2: # random labelling tool
1.8       albertel    3: #
1.25    ! sakharuk    4: # $Id: randomlabel.pm,v 1.24 2002/04/25 21:36:36 sakharuk Exp $
1.8       albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.3       tsai       28: # 7/20/2001 Isaac Tsai, initial syntax
                     29: # 8/10/2001 Isaac Tsai, 
                     30: # 8/30/2001 Isaac Tsai, 
1.1       tsai       31: # SYNTAX:
1.4       albertel   32: # <randomlabel bgimg="URL" width="12" height="45" texwidth="50">
                     33: #    <labelgroup name="GroupOne" type="image">
                     34: #      <location x="123" y="456" />
                     35: #      <location x="321" y="654" />
                     36: #      <location x="213" y="546" />
                     37: #      <label description="TEXT-1">IMG-URL</label>
                     38: #      <label description="TEXT-2">IMG-URL</label>
                     39: #      <label description="TEXT-3">IMG-URL</label>
1.1       tsai       40: #    </labelgroup>
1.4       albertel   41: #    <labelgroup name="GroupTwo" type="text">
                     42: #      <location x="12" y="45" />
                     43: #      <location x="32" y="65" />
                     44: #      <location x="21" y="54" />
1.3       tsai       45: #      <label>TEXT-1</label>
                     46: #      <label>TEXT-2</label>
                     47: #      <label>TEXT-3</label>
1.1       tsai       48: #    </labelgroup>
                     49: #   </randomlabel>
                     50: #  ===========================================
1.3       tsai       51: #  side effect:
                     52: #    location (123,456): $GroupOne[0] = 2  # images give out indexes
                     53: #             (321,654): $GroupOne[1] = 1
                     54: #             (213,546): $GroupOne[2] = 0
                     55: #    location (12,45)  : $GroupTwo[0] = "TEXT-3"
                     56: #             (32,65)  : $GroupTwo[1] = "TEXT-1"
                     57: #             (21,54)  : $GroupTwo[2] = "TEXT-2"
1.1       tsai       58: #  ===========================================
                     59: package Apache::randomlabel;
1.24      sakharuk   60: use Apache::lonnet;
1.1       tsai       61: use strict;
1.13      sakharuk   62: use Apache::edit;
1.1       tsai       63: 
1.13      sakharuk   64: BEGIN {
1.1       tsai       65:   &Apache::lonxml::register('Apache::randomlabel',('randomlabel','labelgroup','location','label'));
                     66: }
                     67: 
1.23      matthew    68: sub check_int {
                     69:     # utility function to do error checking on a integer.
                     70:     my ($num,$default) = @_;
                     71:     $default = 100 if (! defined($default));
                     72:     $num =~ s/\s+//g;  # We dont need no stinkin white space!
                     73:     # If it is a real, just grab the integer part.
                     74:     ($num,undef) = split (/\./,$num) if ($num =~ /\./); 
                     75:     # set to default if what we have left doesn't match anything...
                     76:     $num = $default unless ($num =~/^\d+$/);
                     77:     return $num;
                     78: }
                     79: 
1.1       tsai       80: sub start_randomlabel {
                     81:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                     82:   my $result='';
1.23      matthew    83:   push (@Apache::lonxml::extlinks, '/res/adm/includes/GLabel.class');
1.20      albertel   84:   push (@Apache::lonxml::namespace,'randomlabel');
1.1       tsai       85:   my $bgimg= &Apache::lonxml::get_param('bgimg',$parstack,$safeeval);
1.6       albertel   86:   if ( $bgimg !~ /^http:/ ) {
1.23      matthew    87:     push (@Apache::lonxml::extlinks,$bgimg);
1.6       albertel   88:     $bgimg=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$bgimg);
1.7       albertel   89:     if ($bgimg =~ /$Apache::lonnet::perlvar{'lonDocRoot'}/) {
                     90:       $bgimg=~s/$Apache::lonnet::perlvar{'lonDocRoot'}//;
                     91:     } elsif ($bgimg =~ m:^/home/.*/public_html:) {
                     92:       $bgimg =~ s:^/home/(.*)/public_html:/~$1:;
                     93:     }
1.6       albertel   94:     $bgimg="http://".$ENV{'SERVER_NAME'}.$bgimg;
                     95:   }
1.1       tsai       96:   my $code = &Apache::lonxml::get_param('code',$parstack,$safeeval);
                     97:   my $codebase = &Apache::lonxml::get_param('codebase',$parstack,$safeeval);
1.23      matthew    98:   my $w= &check_int(&Apache::lonxml::get_param('width',$parstack,$safeeval));
                     99:   my $h= &check_int(&Apache::lonxml::get_param('height',$parstack,$safeeval));
1.4       albertel  100:   my $texwidth= &Apache::lonxml::get_param('texwidth',$parstack,$safeeval);
                    101:   if (!$code) { $code='GLabel.class'; }
                    102:   if (!$codebase) { $codebase='/res/adm/includes/'; }
1.3       tsai      103:   $Apache::randomlabel::tlabel_cnt=0;
                    104:   $Apache::randomlabel::ilabel_cnt=0;
                    105:   if ($target eq 'web') {
1.4       albertel  106:     $result.="<applet code=\"$code\" codebase=\"$codebase\" width=\"$w\" height=\"$h\">";
1.3       tsai      107:     $result.="<param name=\"bgimg\" value=\"$bgimg\">";
1.4       albertel  108:   } elsif ($target eq 'tex') {
1.12      sakharuk  109:     $bgimg=~s/(.gif|.jpg)$/.eps/;
1.24      sakharuk  110:     $bgimg= &Apache::lonnet::filelocation($bgimg);
                    111:     $bgimg=~s/http:\/[^\/]*/\/home\/httpd\/html/;
                    112:     $bgimg=~s/\/$//;
1.12      sakharuk  113:     $result.='\vspace*{2mm}  \noindent \epsfxsize='.$texwidth.' mm \epsffile{'.
1.24      sakharuk  114:     $bgimg.'}\setlength{\unitlength}{1mm}  \begin{picture}(0,0)('.$texwidth.','.$texwidth*$h/$w.')'
1.3       tsai      115:   } elsif ($target eq 'edit') {
1.4       albertel  116:     $result.=&Apache::edit::tag_start($target,$token);
1.18      matthew   117:     $result.=&Apache::edit::text_arg('Image:','bgimg',$token,75).' ';
                    118:     $result.=&Apache::edit::browse('bgimg').' ';
                    119:     $result.=&Apache::edit::search('bgimg').'<br />'.
1.15      matthew   120:         &Apache::edit::text_arg('Width(pixel):' ,'width'   ,$token,6).
                    121:         &Apache::edit::text_arg('Height(pixel):','height'  ,$token,6).
                    122:         &Apache::edit::text_arg('TeXWidth(mm):' ,'texwidth',$token,6).
                    123:         &Apache::edit::end_row().&Apache::edit::start_spanning_row();     
1.3       tsai      124:   } elsif ($target eq 'modified') {
1.4       albertel  125:     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
                    126: 						 'bgimg','width','height',
                    127: 						 'texwidth');
                    128:     if ($constructtag) {
                    129:       $result = &Apache::edit::rebuild_tag($token);
                    130:       $result.=&Apache::edit::handle_insert();
                    131:     }
1.1       tsai      132:   }
                    133:   return $result;
                    134: }
                    135: 
                    136: sub end_randomlabel {
1.3       tsai      137:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    138:   my $result='';
                    139:   my $count;
1.21      albertel  140:   pop @Apache::lonxml::namespace;
1.3       tsai      141:   if ($target eq 'web') {
1.4       albertel  142:     $count = $Apache::randomlabel::tlabel_cnt;
                    143:     if( $count != 0) { $result.= "<param name=\"count\" value=\"$count\">"; }
                    144:     $count = $Apache::randomlabel::ilabel_cnt;
                    145:     if( $count != 0) { $result.= "<param name=\"icount\" value=\"$count\">"; }
1.3       tsai      146:     $result .= "</applet><BR />";
1.4       albertel  147:   } elsif ($target eq 'tex') {
1.24      sakharuk  148:     $result='\end{picture}\\\\';
1.4       albertel  149:   } elsif ($target eq 'edit') {
                    150:     $result.=&Apache::edit::end_table;
1.3       tsai      151:   }
                    152:   return $result;
1.1       tsai      153: }
                    154: 
                    155: sub start_labelgroup {
                    156:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    157:   my $result='';
                    158:   my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
                    159:   my $type = &Apache::lonxml::get_param('type',$parstack,$safeeval);
1.2       tsai      160:   $type =~tr/A-Z/a-z/;
1.5       albertel  161:   if ($target eq 'web' || $target eq 'tex' || 
                    162:       $target eq 'grade' || $target eq 'answer') {
1.4       albertel  163:     $Apache::randomlabel::groupname=$name;
                    164:     $Apache::randomlabel::type=$type;
                    165:     @Apache::randomlabel::xcoord = ();
                    166:     @Apache::randomlabel::ycoord = ();
1.5       albertel  167:     @Apache::randomlabel::value = ();
1.4       albertel  168:     @Apache::randomlabel::label_arr  = ();
                    169:   } elsif ($target eq 'edit') {
                    170:     $result.=&Apache::edit::tag_start($target,$token);
                    171:     $result.=&Apache::edit::text_arg('Name:','name',$token).
                    172:       &Apache::edit::select_arg('Type:','type',['text','image'],$token).
1.13      sakharuk  173: 	  &Apache::edit::end_row().&Apache::edit::start_spanning_row();
1.4       albertel  174:   } elsif ($target eq 'modified') {
                    175:     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
                    176: 						 'name','type');
                    177:     if ($constructtag) {
                    178:       $result = &Apache::edit::rebuild_tag($token);
                    179:       $result.=&Apache::edit::handle_insert();
                    180:     }
                    181:   }
1.3       tsai      182:   return $result;
1.1       tsai      183: }
                    184: 
1.5       albertel  185: sub add_vars {
                    186:   my ($name,$order,$label,$labelorder,$value,$safeeval) = @_;
                    187:   my $code = '${'.$name."}{'".($order+1)."'}='".$label."';";
                    188:   my $out=Apache::run::run($code,$safeeval);
                    189:   if ($value) {
                    190:     $code = '${'.$name."}{'value_".($order+1)."'}='".$value."';";
                    191:     $out=Apache::run::run($code,$safeeval);
                    192:     $code = '${'.$name."}{'labelvalue_".($labelorder+1)."'}='".$value."';";
                    193:     $out=Apache::run::run($code,$safeeval);
1.4       albertel  194:   }
1.5       albertel  195:   $code = '${'.$name."}{'numlocations'}='".($order+1)."';";
                    196:   $out=Apache::run::run($code,$safeeval);
1.4       albertel  197: }
1.5       albertel  198: 
1.1       tsai      199: # begin to assign labels to locations
                    200: sub end_labelgroup {
                    201:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    202:   my $gname = $Apache::randomlabel::groupname;
1.2       tsai      203:   my $type  = $Apache::randomlabel::type;
1.4       albertel  204:   my $result='';
1.5       albertel  205:   if ($target eq 'web' || $target eq 'answer' || $target eq 'grade') {
1.4       albertel  206:     my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);
                    207:     &Apache::structuretags::shuffle(\@idx_arr);
                    208:     for(0 .. $#Apache::randomlabel::label_arr) {
                    209:       my $str;
                    210:       my $xstr;
                    211:       my $ystr;
                    212:       my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$_] ]";
1.5       albertel  213:       my $x = $Apache::randomlabel::xcoord[$_];
                    214:       my $y = $Apache::randomlabel::ycoord[$_];
                    215:       my $value = $Apache::randomlabel::value[$_];
1.4       albertel  216:       if( $type eq 'text') {
1.5       albertel  217: 	&add_vars($gname,$_,$label,$idx_arr[$_],$value,$safeeval);
1.4       albertel  218: 	$str = 'LB'.$Apache::randomlabel::tlabel_cnt;
                    219: 	$xstr = 'X'.$Apache::randomlabel::tlabel_cnt;
                    220: 	$ystr = 'Y'.$Apache::randomlabel::tlabel_cnt;
                    221: 	$Apache::randomlabel::tlabel_cnt += 1;
                    222:       } elsif ( $type eq 'image') {
1.5       albertel  223: 	&add_vars($gname,$_,$idx_arr[$_],$idx_arr[$_],$value,$safeeval);
1.4       albertel  224: 	$str = 'LB'.$Apache::randomlabel::ilabel_cnt;
                    225: 	$xstr = 'X'.$Apache::randomlabel::ilabel_cnt;
                    226: 	$ystr = 'Y'.$Apache::randomlabel::ilabel_cnt;
                    227: 	$Apache::randomlabel::ilabel_cnt += 1;
                    228:       } else {
                    229: 	&Apache::lonxml::error('Unknown type of label :'.$type.':');
                    230:       }
1.5       albertel  231:       if ($target eq 'web') {
                    232: 	$result .= '<param name="' . $str  . '" value="'.$label.'">';
                    233: 	$result .= '<param name="' . $xstr . '" value="'.$x.'">';
                    234: 	$result .= '<param name="' . $ystr . '" value="'.$y.'">';
                    235:       }
1.3       tsai      236:     }
1.4       albertel  237:   } elsif ($target eq 'tex') {
                    238:     my $WX1=0; #  Web x-coord. of upper left corner (ULC)
                    239:     my $WY1=0; #  Web y-coord. of (ULC)
                    240:     my $wwidth=&Apache::lonxml::get_param('width',$parstack,$safeeval,-2);
                    241:     my $wheight=&Apache::lonxml::get_param('height',$parstack,$safeeval,-2);
                    242:     my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,-2);
                    243:     my $TX1=0;
                    244:     my $TY1=$texwidth*($wheight/$wwidth);
                    245:     my $TX2=$texwidth;
                    246:     my $TY2=0;
                    247: 
                    248: 
                    249:     my $slopex=($wwidth-$WX1)/($TX2-$TX1);
                    250:     my $slopey=($wheight-$WY1)/($TY2-($TY1-1.0));
                    251:     my $cstx=$wwidth-$slopex*($TX2);
                    252:     my $csty=$wheight-$slopey*($TY2);
                    253: 
                    254:     my @idx_arr = (0 .. $#Apache::randomlabel::label_arr);
                    255:     &Apache::structuretags::shuffle(\@idx_arr);
                    256: 
                    257:     &Apache::lonxml::debug("Array is:".$#Apache::randomlabel::label_arr.":");
                    258:     for(my $i=0;$i <= $#Apache::randomlabel::label_arr; $i++) {
                    259:       my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$i] ]";
                    260:       my $x = $Apache::randomlabel::xcoord[$i];
                    261:       my $y = $Apache::randomlabel::ycoord[$i];
1.5       albertel  262:       my $value = $Apache::randomlabel::value[$i];
1.16      sakharuk  263: #      my $tcX=$x*($texwidth/$wwidth) - $texwidth;
1.25    ! sakharuk  264:       my $tcX=($x-10)*($texwidth/$wwidth);
1.16      sakharuk  265: #      my $tcY=$TY1-$y*($TY1/$wheight)-2;
1.19      albertel  266:       my $ratio=($wwidth > 0 ? $wheight/$wwidth : 1 );
                    267:       my $tcY=$TY1-$y*($TY1/$wheight)+$texwidth*$ratio;
1.4       albertel  268:       $tcX=sprintf('%.2f',$tcX);
                    269:       $tcY=sprintf('%.2f',$tcY);
                    270:       $result.='\put('.$tcX.','.$tcY.'){\normalsize \bf '.$label.'}'."\n";
                    271:       if( $type eq 'text') {
1.5       albertel  272: 	&add_vars($gname,$i,$label,$idx_arr[$i],$value,$safeeval);
1.4       albertel  273:       } elsif ( $type eq 'image') {
1.5       albertel  274: 	&add_vars($gname,$i,$idx_arr[$i],$idx_arr[$i],$value,$safeeval);
1.4       albertel  275:       } else {
                    276: 	&Apache::lonxml::error('Unknown type of label :'.$type.':');
                    277:       }
                    278:     }
                    279:   } elsif ($target eq 'edit') {
                    280:     $result.=&Apache::edit::end_table;
1.1       tsai      281:   }
1.4       albertel  282:   return $result;
1.1       tsai      283: }
                    284: 
1.5       albertel  285: # <location x="123" y="456" value="some value"/>
1.1       tsai      286: sub start_location {
                    287:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.23      matthew   288:   my $x= &check_int(&Apache::lonxml::get_param('x',$parstack,$safeeval),50);
                    289:   my $y= &check_int(&Apache::lonxml::get_param('y',$parstack,$safeeval),50);
1.5       albertel  290:   my $value= &Apache::lonxml::get_param('value',$parstack,$safeeval);
1.3       tsai      291:   my $result='';
1.1       tsai      292:   push(@Apache::randomlabel::xcoord,$x);
1.4       albertel  293:   push(@Apache::randomlabel::ycoord,$y);
1.5       albertel  294:   push(@Apache::randomlabel::value,$value);
1.4       albertel  295:   if ($target eq 'edit') {
                    296:     $result.=&Apache::edit::tag_start($target,$token);
                    297:     $result.=&Apache::edit::text_arg('X:','x',$token,4).
                    298:       &Apache::edit::text_arg('Y:','y',$token,4).
1.5       albertel  299: 	&Apache::edit::text_arg('Value:','value',$token).
1.13      sakharuk  300: 	  &Apache::edit::end_row();
1.4       albertel  301:     $result.=&Apache::edit::end_table;
                    302:   } elsif ($target eq 'modified') {
                    303:     my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
1.5       albertel  304: 						 'x','y','value');
1.4       albertel  305:     if ($constructtag) {
                    306:       $result = &Apache::edit::rebuild_tag($token);
                    307:       $result.=&Apache::edit::handle_insert();
                    308:     }
                    309:   }
1.3       tsai      310:   return $result;
1.1       tsai      311: }
                    312: 
                    313: sub end_location {
1.3       tsai      314:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.4       albertel  315:   my @result;
                    316:   if ($target eq 'edit') { @result=('','no') }
                    317:   return @result;
1.1       tsai      318: }
                    319: 
1.2       tsai      320: # <label>$var_abc</label>
1.1       tsai      321: sub start_label {
                    322:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.3       tsai      323:   my $result='';
1.5       albertel  324:   if ($target eq 'web' || $target eq 'tex' || 
                    325:       $target eq 'grade' || $target eq 'answer') {
1.4       albertel  326:     my $ltext=&Apache::lonxml::get_all_text("/label",$$parser[-1]);
1.14      albertel  327:     $ltext=&Apache::run::evaluate($ltext,$safeeval,$$parstack[-1]);
1.4       albertel  328:     push(@Apache::randomlabel::label_arr,$ltext);
                    329:   } elsif ($target eq 'edit') {
                    330:     $result.=&Apache::edit::tag_start($target,$token);
                    331:     my $text=&Apache::lonxml::get_all_text("/label",$$parser[-1]);
1.13      sakharuk  332:     $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row().
1.22      albertel  333:       &Apache::edit::editline('',$text,'',20).
1.4       albertel  334: 	&Apache::edit::end_table();
                    335:   } elsif ($target eq 'modified') {
                    336:     my $text=$$parser[-1]->get_text("/label");
1.13      sakharuk  337:     $result.='<label>'.&Apache::edit::modifiedfield($token);
1.4       albertel  338:   }
1.3       tsai      339:   return $result;
1.1       tsai      340: }
                    341: 
                    342: sub end_label {
1.3       tsai      343:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.4       albertel  344:   my @result;
                    345:   if ($target eq 'edit') { @result=('','no') }
                    346:   return @result;
1.1       tsai      347: }
                    348: 
                    349: 
                    350: 
                    351: 1;
                    352: __END__
                    353:  

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.