version 1.81, 2002/04/08 18:28:03
|
version 1.87, 2002/04/18 20:21:38
|
Line 122 sub initsheet {
|
Line 122 sub initsheet {
|
$safeeval->permit("sort"); |
$safeeval->permit("sort"); |
$safeeval->deny(":base_io"); |
$safeeval->deny(":base_io"); |
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); |
$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'; |
my $code=<<'ENDDEFS'; |
# ---------------------------------------------------- Inside of the safe space |
# ---------------------------------------------------- Inside of the safe space |
|
|
Line 508 sub HASH {
|
Line 510 sub HASH {
|
return $Values[-1]; |
return $Values[-1]; |
} |
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item NUM(range) |
|
|
|
returns the number of items in the range. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
sub NUM { |
sub NUM { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $num= $#{@{grep(/$mask/,keys(%v))}}+1; |
my $num= $#{@{grep(/$mask/,keys(%v))}}+1; |
Line 527 sub BIN {
|
Line 538 sub BIN {
|
} |
} |
|
|
|
|
|
#------------------------------------------------------- |
|
|
|
=item SUM(range) |
|
|
|
returns the sum of items in the range. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
sub SUM { |
sub SUM { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $sum=0; |
my $sum=0; |
Line 536 sub SUM {
|
Line 556 sub SUM {
|
return $sum; |
return $sum; |
} |
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item MEAN(range) |
|
|
|
compute the average of the items in the range. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
sub MEAN { |
sub MEAN { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $sum=0; my $num=0; |
my $sum=0; my $num=0; |
Line 550 sub MEAN {
|
Line 579 sub MEAN {
|
} |
} |
} |
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item STDDEV(range) |
|
|
|
compute the standard deviation of the items in the range. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
sub STDDEV { |
sub STDDEV { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $sum=0; my $num=0; |
my $sum=0; my $num=0; |
Line 566 sub STDDEV {
|
Line 604 sub STDDEV {
|
return sqrt($sum/($num-1)); |
return sqrt($sum/($num-1)); |
} |
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item PROD(range) |
|
|
|
compute the product of the items in the range. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
sub PROD { |
sub PROD { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $prod=1; |
my $prod=1; |
Line 575 sub PROD {
|
Line 622 sub PROD {
|
return $prod; |
return $prod; |
} |
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item MAX(range) |
|
|
|
compute the maximum of the items in the range. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
sub MAX { |
sub MAX { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $max='-'; |
my $max='-'; |
Line 585 sub MAX {
|
Line 641 sub MAX {
|
return $max; |
return $max; |
} |
} |
|
|
|
#------------------------------------------------------- |
|
|
|
=item MIN(range) |
|
|
|
compute the minimum of the items in the range. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
sub MIN { |
sub MIN { |
my $mask=mask(@_); |
my $mask=mask(@_); |
my $min='-'; |
my $min='-'; |
Line 595 sub MIN {
|
Line 660 sub MIN {
|
return $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 { |
sub SUMMAX { |
my ($num,$lower,$upper)=@_; |
my ($num,$lower,$upper)=@_; |
my $mask=mask($lower,$upper); |
my $mask=mask($lower,$upper); |
my @inside=(); |
my @inside=(); |
foreach (grep /$mask/,keys(%v)) { |
foreach (grep /$mask/,keys(%v)) { |
$inside[$#inside+1]=$v{$_}; |
push (@inside,$v{$_}); |
} |
} |
@inside=sort(@inside); |
@inside=sort(@inside); |
my $sum=0; my $i; |
my $sum=0; my $i; |
Line 610 sub SUMMAX {
|
Line 685 sub SUMMAX {
|
return $sum; |
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 { |
sub SUMMIN { |
my ($num,$lower,$upper)=@_; |
my ($num,$lower,$upper)=@_; |
my $mask=mask($lower,$upper); |
my $mask=mask($lower,$upper); |
Line 774 sub outrowassess {
|
Line 859 sub outrowassess {
|
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
my $fm=$f{$_.$n}; |
my $fm=$f{$_.$n}; |
$fm=~s/[\'\"]/\&\#34;/g; |
$fm=~s/[\'\"]/\&\#34;/g; |
$cols[$#cols+1]="'$_$n','$fm'".'___eq___'.$v{$_.$n}; |
push(@cols,"'$_$n','$fm'".'___eq___'.$v{$_.$n}); |
} |
} |
return @cols; |
return @cols; |
} |
} |
Line 1149 sub othersheets {
|
Line 1234 sub othersheets {
|
return @alternatives; |
return @alternatives; |
} |
} |
|
|
|
|
|
# |
|
# -------------------------------------- Parse a spreadsheet |
|
# |
|
sub parse_sheet { |
|
# $sheetxml is a scalar reference or a scalar |
|
my ($sheetxml) = @_; |
|
if (! ref($sheetxml)) { |
|
my $tmp = $sheetxml; |
|
$sheetxml = \$tmp; |
|
} |
|
my %f; |
|
my $parser=HTML::TokeParser->new($sheetxml); |
|
my $token; |
|
while ($token=$parser->get_token) { |
|
if ($token->[0] eq 'S') { |
|
if ($token->[1] eq 'field') { |
|
$f{$token->[2]->{'col'}.$token->[2]->{'row'}}= |
|
$parser->get_text('/field'); |
|
} |
|
if ($token->[1] eq 'template') { |
|
$f{'template_'.$token->[2]->{'col'}}= |
|
$parser->get_text('/template'); |
|
} |
|
} |
|
} |
|
return \%f; |
|
} |
|
|
# |
# |
# -------------------------------------- Read spreadsheet formulas for a course |
# -------------------------------------- Read spreadsheet formulas for a course |
# |
# |
Line 1160 sub readsheet {
|
Line 1274 sub readsheet {
|
my $cdom=&getcdom($safeeval); |
my $cdom=&getcdom($safeeval); |
my $chome=&getchome($safeeval); |
my $chome=&getchome($safeeval); |
|
|
# --------- There is no filename. Look for defaults in course and global, cache |
if (! defined($fn)) { |
|
# There is no filename. Look for defaults in course and global, cache |
unless($fn) { |
|
unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) { |
unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) { |
$fn=&Apache::lonnet::reply('get:'.$cdom.':'.$cnum. |
my %tmphash = &Apache::lonnet::get('environment', |
':environment:spreadsheet_default_'.$stype, |
['spreadsheet_default_'.$stype], |
$chome); |
$cdom,$cnum); |
unless (($fn) && ($fn!~/^error\:/)) { |
my ($tmp) = keys(%tmphash); |
$fn='default_'.$stype; |
if ($tmp =~ /^(con_lost|error|no_such_host)/i) { |
} |
$fn = 'default_'.$stype; |
$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; |
} else { |
|
$fn = $tmphash{'spreadsheet_default_'.$stype}; |
|
} |
|
$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; |
} |
} |
} |
} |
|
|
Line 1189 sub readsheet {
|
Line 1305 sub readsheet {
|
my %f=(); |
my %f=(); |
|
|
if ($fn=~/^default\_/) { |
if ($fn=~/^default\_/) { |
my $sheetxml=''; |
my $sheetxml=''; |
{ |
|
my $fh; |
my $fh; |
my $dfn=$fn; |
my $dfn=$fn; |
$dfn=~s/\_/\./g; |
$dfn=~s/\_/\./g; |
if ($fh=Apache::File->new($includedir.'/'.$dfn)) { |
if ($fh=Apache::File->new($includedir.'/'.$dfn)) { |
$sheetxml=join('',<$fh>); |
$sheetxml=join('',<$fh>); |
} else { |
} else { |
$sheetxml='<field row="0" col="A">"Error"</field>'; |
$sheetxml='<field row="0" col="A">"Error"</field>'; |
} |
} |
} |
%f=%{&parse_sheet(\$sheetxml)}; |
my $parser=HTML::TokeParser->new(\$sheetxml); |
} elsif($fn=~/\/*\.spreadsheet$/) { |
my $token; |
my $sheetxml=&Apache::lonnet::getfile |
while ($token=$parser->get_token) { |
(&Apache::lonnet::filelocation('',$fn)); |
if ($token->[0] eq 'S') { |
if ($sheetxml == -1) { |
if ($token->[1] eq 'field') { |
$sheetxml='<field row="0" col="A">"Error loading spreadsheet ' |
$f{$token->[2]->{'col'}.$token->[2]->{'row'}}= |
.$fn.'"</field>'; |
$parser->get_text('/field'); |
} |
} |
%f=%{&parse_sheet(\$sheetxml)}; |
if ($token->[1] eq 'template') { |
} else { |
$f{'template_'.$token->[2]->{'col'}}= |
my $sheet=''; |
$parser->get_text('/template'); |
my %tmphash = &Apache::lonnet::dump($fn,$cdom,$cnum); |
|
my ($tmp) = keys(%tmphash); |
|
unless ($tmp =~ /^(con_lost|error|no_such_host)/i) { |
|
foreach (keys(%tmphash)) { |
|
$f{$_}=$tmphash{$_}; |
} |
} |
} |
} |
} |
} |
} else { |
|
my $sheet=''; |
|
my %tmphash = &Apache::lonnet::dump($fn,$cdom,$cnum); |
|
my ($tmp) = keys(%tmphash); |
|
unless ($tmp =~ /^(con_lost|error|no_such_host)/i) { |
|
foreach (keys(%tmphash)) { |
|
$f{$_}=$tmphash{$_}; |
|
} |
|
} |
|
} |
|
# --------------------------------------------------------------- Cache and set |
# --------------------------------------------------------------- Cache and set |
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); |
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); |
&setformulas($safeeval,%f); |
&setformulas($safeeval,%f); |
Line 2312 $tmpdir=$r->dir_config('lonDaemons').'/t
|
Line 2421 $tmpdir=$r->dir_config('lonDaemons').'/t
|
|
|
function celledit(cn,cf) { |
function celledit(cn,cf) { |
var cnf=prompt(cn,cf); |
var cnf=prompt(cn,cf); |
if (cnf!=null) { |
if (cnf!=null) { |
document.sheet.unewfield.value=cn; |
document.sheet.unewfield.value=cn; |
document.sheet.unewformula.value=cnf; |
document.sheet.unewformula.value=cnf; |
document.sheet.submit(); |
document.sheet.submit(); |
} |
} |
Line 2541 ENDSCRIPT
|
Line 2650 ENDSCRIPT
|
} |
} |
} |
} |
$r->print('>'); |
$r->print('>'); |
|
|
if (&gettype($asheet) eq 'classcalc') { |
if (&gettype($asheet) eq 'classcalc') { |
$r->print( |
$r->print( |
' Output CSV format: <input type=checkbox name=showcsv onClick="submit()"'); |
' Output CSV format: <input type=checkbox name=showcsv onClick="submit()"'); |