--- loncom/interface/Attic/lonspreadsheet.pm 2001/07/21 23:55:31 1.57
+++ loncom/interface/Attic/lonspreadsheet.pm 2001/09/17 22:01:23 1.65
@@ -6,7 +6,7 @@
# 01/01/01,02/01,03/01,19/01,20/01,22/01,
# 03/05,03/08,03/10,03/12,03/13,03/15,03/17,
# 03/19,03/20,03/21,03/27,04/05,04/09,
-# 07/09,07/14,07/21 Gerd Kortemeyer
+# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17 Gerd Kortemeyer
package Apache::lonspreadsheet;
@@ -308,6 +308,42 @@ sub SUMMIN {
return $sum;
}
+sub expandnamed {
+ my $expression=shift;
+ if ($expression=~/^\&/) {
+ my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/);
+ my @vars=split(/\W+/,$formula);
+ my %values=();
+ undef %values;
+ map {
+ my $varname=$_;
+ if ($varname=~/\D/) {
+ $formula=~s/$varname/'$c{\''.$varname.'\'}'/ge;
+ $varname=~s/$var/\(\\w\+\)/g;
+ map {
+ if ($_=~/$varname/) {
+ $values{$1}=1;
+ }
+ } keys %c;
+ }
+ } @vars;
+ if ($func eq 'EXPANDSUM') {
+ my $result='';
+ map {
+ my $thissum=$formula;
+ $thissum=~s/$var/$_/g;
+ $result.=$thissum.'+';
+ } keys %values;
+ $result=~s/\+$//;
+ return $result;
+ } else {
+ return 0;
+ }
+ } else {
+ return '$c{\''.$expression.'\'}';
+ }
+}
+
sub sett {
%t=();
my $pattern='';
@@ -329,7 +365,7 @@ sub sett {
$t{$lb}=~s/\#/$trow/g;
$t{$lb}=~s/\.\.+/\,/g;
$t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
- $t{$lb}=~s/(^|[^\"\'])\[(\w+)\]/$1\$c\{\'$2\'\}/g;
+ $t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
}
}
} keys %f;
@@ -347,14 +383,14 @@ sub sett {
$t{$_}=$f{$_};
$t{$_}=~s/\.\.+/\,/g;
$t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
- $t{$_}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g;
+ $t{$_}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
}
}
} keys %f;
$t{'A0'}=$f{'A0'};
$t{'A0'}=~s/\.\.+/\,/g;
$t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
- $t{'A0'}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g;
+ $t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
}
sub calc {
@@ -401,7 +437,7 @@ sub outrowassess {
my @cols=();
if ($n) {
my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n});
- $cols[0]=$f{'A'.$n}.'
'.$rl{$usy}.'
'.
+ $cols[0]=$rl{$usy}.'
'.
'