Diff for /loncom/interface/spreadsheet/Spreadsheet.pm between versions 1.44 and 1.45

version 1.44, 2005/05/12 22:42:57 version 1.45, 2005/05/13 15:59:07
Line 670  sub MAXPARM { Line 670  sub MAXPARM {
     return $max;      return $max;
 }  }
   
   #-------------------------------------------------------
   
   =pod
   
   =item  &get_values($lower,$upper)
   
   Inputs: $lower and $upper, cell names ("X12" or "a150") or globs ("X*").
   
   Returns: an array ref of the values of the cells that exist in the 
            speced range
   
   =cut
   
   #-------------------------------------------------------
 sub get_values {  sub get_values {
     my ($lower,$upper)=@_;      my ($lower,$upper)=@_;
     my $mask=&mask(@_);      $upper = $lower if (! defined($upper));
     my @values;      my @values;
     foreach (grep eval("/$mask/"),keys(%sheet_values)) {      my ($la,$ld) = ($lower=~/([A-z]|\*)(\d+|\*)/);
  push(@values,$sheet_values{$_});      my ($ua,$ud) = ($upper=~/([A-z]|\*)(\d+|\*)/);
     }      my ($alpha,$num);
     return \@values;      if ($ld ne '*' && $ud ne '*') {
     if (0) {  
  # perhaps creating a list of possible cells and looking if they exist  
         # would be faster somtimes?  
  &logthis("mask is ".$mask);  
  my @alpha;   my @alpha;
  if (($la eq '*') || ($ua eq '*')) {   if (($la eq '*') || ($ua eq '*')) {
     @alpha=('A'..'z');      @alpha=('A'..'z');
  } else {   } else {
     if ($la gt $ua) {      if ($la gt $ua) { ($la,$ua)=($ua,$la); }
  my $tmp = $ua;      if ((lc($la) ne $la) && (lc($ua) eq $ua)) {
  $ua = $la;   @alpha=($la..'Z','a'..$ua);
  $la = $ua;      } else {
    @alpha=($la..$ua);
               }
    }
    my @num=($ld..$ud);
    foreach my $a (@alpha) {
       foreach my $n (@num) {
    if (exists($sheet_values{$a.$n})) {
       push(@values,$sheet_values{$a.$n});
    }
     }      }
     $alpha=($la..$ua);  
  }   }
    return \@values;
       } else {
    $num = '(\d+)';
     }      }
       if (($la eq '*') || ($ua eq '*')) {
           $alpha='[A-z]';
       } else {
    if ($la gt $ua) { ($la,$ua)=($ua,$la); }
           $alpha=qq/[$la-$ua]/;
       }
       my $expression = '^'.$alpha.$num.'$';
       foreach (grep /$expression/,keys(%sheet_values)) {
    push(@values,$sheet_values{$_});
       }
       return \@values;
 }  }
   
 sub calc {  sub calc {
Line 758  ENDDEFS Line 790  ENDDEFS
   
 ######################################################  ######################################################
   
   
 ######################################################  
   
 =pod  
   
 =item  &mask($lower,$upper)  
   
 Inputs: $lower and $upper, cell names ("X12" or "a150") or globs ("X*").  
   
 Returns:  Regular expression matching spreadsheet cells that are within  
 the rectangle defined by $lower and $upper.  Due to the nature of the  
 regular expression this result must be used inside an eval().  
   
 =cut  
   
 ######################################################  
 {  
   
 my %memoizer;  
   
 sub mask {  
     my ($lower,$upper)=@_;  
     my $key = $lower.'_'.$upper;  
     if (exists($memoizer{$key})) {  
         return $memoizer{$key};  
     }  
     $upper = $lower if (! defined($upper));  
     #  
     my ($la,$ld) = ($lower=~/([A-z]|\*)(\d+|\*)/);  
     my ($ua,$ud) = ($upper=~/([A-z]|\*)(\d+|\*)/);  
     #  
     my $alpha='';  
     my $num='';  
     #  
     # Do not put parenthases around $alpha.  
     # $num depends on the value in $1.  
     if (($la eq '*') || ($ua eq '*')) {  
         $alpha='[A-z]';  
     } else {  
         if ($la gt $ua) {  
             my $tmp = $ua;  
             $ua = $la;  
             $la = $ua;  
         }  
         $alpha=qq/[$la-$ua]/;  
     }  
     if ($ld ne '*' && $ud ne '*') {  
         # Make sure $ld <= $ud  
         if ($ld > $ud) {  
             my $tmp = $ud;  
             $ud = $ld;  
             $ld = $tmp;  
         }  
         # Here we make a regular expression using some advanced regexp  
         # abilities.  
         # (\d+) will match the digits of the cell name and dump them in  
         #     to $1  
         # (?(?{ ... code ...} pattern_if_true | pattern_if_false)) will  
         #     choose pattern_if_true if { ... code ... } is true and  
         #     pattern_if_false if { ... code ... } is false.  
         # In this case, pattern_if_true is empty.  pattern_if_false is   
         #     'donotmatch' and will not match our cells because none of   
         #     them end with donotmatch.    
         # Unfortunately, the use of this type of regular expression   
         #     requires that each match be wrapped in an eval().  Search for  
         #     $mask in this module for examples  
         $num = '(\d+)(?(?{$1>= '.$ld.' && $1<='.$ud.'})|donotmatch)';  
     } else {  
         $num = '(\d+)';  
     }  
     my $expression = '^'.$alpha.$num.'$';  
     $memoizer{$key} = $expression;  
     return $expression;  
 }  
   
 #  
 # Debugging routine  
 sub dump_memoized_values {  
     while (my ($key,$value) = each(%memoizer)) {  
         &Apache::lonnet::logthis('memoizer: '.$key.' = '.$value);  
     }  
     return;  
 }  
   
 }  
   
 ##  ##
 ## sub add_hash_to_safe {} # spreadsheet, would like to destroy  ## sub add_hash_to_safe {} # spreadsheet, would like to destroy
 ##  ##

Removed from v.1.44  
changed lines
  Added in v.1.45


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