--- loncom/interface/Attic/lonspreadsheet.pm 2002/04/09 18:41:11 1.82 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/04/29 21:06:30 1.88 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.82 2002/04/09 18:41:11 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.88 2002/04/29 21:06:30 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -122,6 +122,8 @@ sub initsheet { $safeeval->permit("sort"); $safeeval->deny(":base_io"); $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); + $safehole->wrap(\&send_msg, $safeeval,"&send_msg"); + $safehole->wrap(\&send_crit_msg,$safeeval,"&send_crit_msg"); my $code=<<'ENDDEFS'; # ---------------------------------------------------- Inside of the safe space @@ -508,6 +510,15 @@ sub HASH { return $Values[-1]; } +#------------------------------------------------------- + +=item NUM(range) + +returns the number of items in the range. + +=cut + +#------------------------------------------------------- sub NUM { my $mask=mask(@_); my $num= $#{@{grep(/$mask/,keys(%v))}}+1; @@ -527,6 +538,15 @@ sub BIN { } +#------------------------------------------------------- + +=item SUM(range) + +returns the sum of items in the range. + +=cut + +#------------------------------------------------------- sub SUM { my $mask=mask(@_); my $sum=0; @@ -536,6 +556,15 @@ sub SUM { return $sum; } +#------------------------------------------------------- + +=item MEAN(range) + +compute the average of the items in the range. + +=cut + +#------------------------------------------------------- sub MEAN { my $mask=mask(@_); my $sum=0; my $num=0; @@ -550,6 +579,15 @@ sub MEAN { } } +#------------------------------------------------------- + +=item STDDEV(range) + +compute the standard deviation of the items in the range. + +=cut + +#------------------------------------------------------- sub STDDEV { my $mask=mask(@_); my $sum=0; my $num=0; @@ -566,6 +604,15 @@ sub STDDEV { return sqrt($sum/($num-1)); } +#------------------------------------------------------- + +=item PROD(range) + +compute the product of the items in the range. + +=cut + +#------------------------------------------------------- sub PROD { my $mask=mask(@_); my $prod=1; @@ -575,6 +622,15 @@ sub PROD { return $prod; } +#------------------------------------------------------- + +=item MAX(range) + +compute the maximum of the items in the range. + +=cut + +#------------------------------------------------------- sub MAX { my $mask=mask(@_); my $max='-'; @@ -585,6 +641,15 @@ sub MAX { return $max; } +#------------------------------------------------------- + +=item MIN(range) + +compute the minimum of the items in the range. + +=cut + +#------------------------------------------------------- sub MIN { my $mask=mask(@_); my $min='-'; @@ -595,12 +660,22 @@ sub MIN { return $min; } +#------------------------------------------------------- + +=item SUMMAX(num,lower,upper) + +compute the sum of the largest 'num' items in the range from +'lower' to 'upper' + +=cut + +#------------------------------------------------------- sub SUMMAX { my ($num,$lower,$upper)=@_; my $mask=mask($lower,$upper); my @inside=(); foreach (grep /$mask/,keys(%v)) { - $inside[$#inside+1]=$v{$_}; + push (@inside,$v{$_}); } @inside=sort(@inside); my $sum=0; my $i; @@ -610,6 +685,16 @@ sub SUMMAX { return $sum; } +#------------------------------------------------------- + +=item SUMMIN(num,lower,upper) + +compute the sum of the smallest 'num' items in the range from +'lower' to 'upper' + +=cut + +#------------------------------------------------------- sub SUMMIN { my ($num,$lower,$upper)=@_; my $mask=mask($lower,$upper); @@ -657,7 +742,25 @@ sub expandnamed { return 0; } } else { - return '$c{\''.$expression.'\'}'; + # it is not a function, so it is a parameter name + # We should do the following: + # 1. Take the list of parameter names + # 2. look through the list for ones that match the parameter we want + # 3. If there are no collisions, return the one that matches + # 4. If there is a collision, return 'bad parameter name error' + my $returnvalue = ''; + my @matches = (); + $#matches = -1; + study $expression; + foreach $parameter (keys(%c)) { + push @matches,$parameter if ($parameter =~ /$expression/); + } + if ($#matches == 0) { + $returnvalue = '$c{\''.$matches[0].'\'}'; + } else { + $returnvalue = "'bad parameter name : $expression'"; + } + return $returnvalue; } } @@ -677,11 +780,17 @@ sub sett { if ($_=~/A(\d+)/) { my $trow=$1; if ($trow) { + # Get the name of this cell my $lb=$col.$trow; + # Grab the template declaration $t{$lb}=$f{'template_'.$col}; + # Replace '#' with the row number $t{$lb}=~s/\#/$trow/g; + # Replace '....' with ',' $t{$lb}=~s/\.\.+/\,/g; + # Replace 'A0' with the value from 'A0' $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; + # Replace parameters $t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } @@ -704,6 +813,8 @@ sub sett { } } } + # For some reason 'A0' gets special treatment... This seems superfluous + # but I imagine it is here for a reason. $t{'A0'}=$f{'A0'}; $t{'A0'}=~s/\.\.+/\,/g; $t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; @@ -774,7 +885,7 @@ sub outrowassess { 'n','o','p','q','r','s','t','u','v','w','x','y','z') { my $fm=$f{$_.$n}; $fm=~s/[\'\"]/\&\#34;/g; - $cols[$#cols+1]="'$_$n','$fm'".'___eq___'.$v{$_.$n}; + push(@cols,"'$_$n','$fm'".'___eq___'.$v{$_.$n}); } return @cols; } @@ -1189,7 +1300,7 @@ sub readsheet { my $cdom=&getcdom($safeeval); my $chome=&getchome($safeeval); - if (! defined($fn) || $fn eq '') { + if (! defined($fn)) { # There is no filename. Look for defaults in course and global, cache unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) { my %tmphash = &Apache::lonnet::get('environment', @@ -1203,19 +1314,6 @@ sub readsheet { } $defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; } - } else { - # We do have a filename, do a get on it. - my %tmphash = &Apache::lonnet::get('environment', - [$fn], - $cdom,$cnum); - my ($tmp) = keys(%tmphash); - if ($tmp =~ /^(con_lost|error|no_such_host)/i) { - # On error, grab the default filename - $fn = 'default_'.$stype; - } else { - $fn = $tmphash{$fn}; - } - $defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; } # ---------------------------------------------------------- fn now has a value @@ -1242,26 +1340,15 @@ sub readsheet { } else { $sheetxml='"Error"'; } - %f=&parse_sheet(\$sheetxml); + %f=%{&parse_sheet(\$sheetxml)}; } elsif($fn=~/\/*\.spreadsheet$/) { - my $sheetxml=''; - my $fh; - my $dfn=$fn; - $dfn=~s/\_/\./g; - - if ($fn !~ /^$Apache::lonnet::perlvar{'lonDocRoot'}\/res/) { - $fn = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res'.$fn; - } - if ($fn !~ /^$Apache::lonnet::perlvar{'lonDocRoot'}/) { - $fn = $Apache::lonnet::perlvar{'lonDocRoot'}.$fn; - } - if ($fh=Apache::File->new($fn)) { - $sheetxml=join('',<$fh>); - } else { + my $sheetxml=&Apache::lonnet::getfile + (&Apache::lonnet::filelocation('',$fn)); + if ($sheetxml == -1) { $sheetxml='"Error loading spreadsheet ' .$fn.'"'; } - %f=&parse_sheet(\$sheetxml); + %f=%{&parse_sheet(\$sheetxml)}; } else { my $sheet=''; my %tmphash = &Apache::lonnet::dump($fn,$cdom,$cnum); @@ -2360,8 +2447,8 @@ $tmpdir=$r->dir_config('lonDaemons').'/t function celledit(cn,cf) { var cnf=prompt(cn,cf); - if (cnf!=null) { - document.sheet.unewfield.value=cn; + if (cnf!=null) { + document.sheet.unewfield.value=cn; document.sheet.unewformula.value=cnf; document.sheet.submit(); } @@ -2589,6 +2676,7 @@ ENDSCRIPT } } $r->print('>'); + if (&gettype($asheet) eq 'classcalc') { $r->print( ' Output CSV format: