--- loncom/interface/Attic/lonspreadsheet.pm 2001/03/20 21:49:05 1.49
+++ loncom/interface/Attic/lonspreadsheet.pm 2001/09/17 22:01:23 1.65
@@ -5,7 +5,8 @@
# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30,
# 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 Gerd Kortemeyer
+# 03/19,03/20,03/21,03/27,04/05,04/09,
+# 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;
@@ -77,12 +78,14 @@ sub initsheet {
# v: output values
# c: preloaded constants (A-column)
# rl: row label
+# os: other spreadsheets (for student spreadsheet only)
undef %v;
undef %t;
undef %f;
undef %c;
undef %rl;
+undef @os;
$maxrow=0;
$sheettype='';
@@ -305,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='';
@@ -326,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;
@@ -344,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 {
@@ -397,7 +436,18 @@ sub outrowassess {
my $n=shift;
my @cols=();
if ($n) {
- $cols[0]=$rl{$f{'A'.$n}};
+ my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n});
+ $cols[0]=$rl{$usy}.'
'.
+ '';
} else {
$cols[0]='Export';
}
@@ -460,6 +510,13 @@ sub setconstants {
%{$safeeval->varglob('c')}=%c;
}
+# --------------------------------------------- Set names of other spreadsheets
+
+sub setothersheets {
+ my ($safeeval,@os)=@_;
+ @{$safeeval->varglob('os')}=@os;
+}
+
# ------------------------------------------------ Add or change formula values
sub setrowlabels {
@@ -600,6 +657,7 @@ sub exportdata {
return $safeeval->reval('&exportrowa()');
}
+
# ========================================================== End of Spreadsheet
# =============================================================================
@@ -612,43 +670,34 @@ sub rown {
my ($safeeval,$n)=@_;
my $defaultbg;
my $rowdata='';
+ my $dataflag=0;
unless ($n eq '-') {
$defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
} else {
$defaultbg='#E0FF';
}
- if ((($n-1)/25)==int(($n-1)/25)) {
- my $what='Student';
- if (&gettype($safeeval) eq 'assesscalc') {
- $what='Item';
- } elsif (&gettype($safeeval) eq 'studentcalc') {
- $what='Assessment';
- }
- $rowdata.="\n
'.$what.' | '; - map { - $rowdata.=''.$_.' | '; - } ('A','B','C','D','E','F','G','H','I','J','K','L','M', - 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', - 'a','b','c','d','e','f','g','h','i','j','k','l','m', - 'n','o','p','q','r','s','t','u','v','w','x','y','z'); - $rowdata.='|
$n | "; my $showf=0; my $proc; my $maxred; - if (&gettype($safeeval) eq 'assesscalc') { + my $sheettype=&gettype($safeeval); + if ($sheettype eq 'studentcalc') { $proc='&outrowassess'; - $maxred=1; + $maxred=26; } else { $proc='&outrow'; + } + if ($sheettype eq 'assesscalc') { + $maxred=1; + } else { $maxred=26; } - if ($n eq '-') { $proc='&templaterow'; $n=-1; } + if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; } map { my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); + if ((($vl ne '') || ($vl eq '0')) && + (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; } if ($showf==0) { $vl=$_; } if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } @@ -664,7 +713,11 @@ sub rown { } $showf++; } $safeeval->reval($proc.'('.$n.')'); - return $rowdata.'
'.$what.' | '); + map { + $r->print(''.$_.' | '); + } ('A','B','C','D','E','F','G','H','I','J','K','L','M', + 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', + 'a','b','c','d','e','f','g','h','i','j','k','l','m', + 'n','o','p','q','r','s','t','u','v','w','x','y','z'); + $r->print('
Saving spreadsheet: '. - &writesheet($asheet,$ENV{'form.makedefufn'}).'
'); - } + if ((&gettype($asheet) eq 'classcalc') || + (&getuname($asheet) ne $ENV{'user.name'}) || + (&getudom($asheet) ne $ENV{'user.domain'})) { + unless (&Apache::lonnet::allowed('vgr',&getcid($asheet))) { + $r->print( + '