--- loncom/interface/Attic/lonspreadsheet.pm 2002/04/08 18:28:03 1.81 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/04/09 18:41:11 1.82 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.81 2002/04/08 18:28:03 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.82 2002/04/09 18:41:11 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1149,6 +1149,35 @@ sub othersheets { 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 # @@ -1160,18 +1189,33 @@ sub readsheet { my $cdom=&getcdom($safeeval); my $chome=&getchome($safeeval); -# --------- There is no filename. Look for defaults in course and global, cache - - unless($fn) { + if (! defined($fn) || $fn eq '') { + # There is no filename. Look for defaults in course and global, cache unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) { - $fn=&Apache::lonnet::reply('get:'.$cdom.':'.$cnum. - ':environment:spreadsheet_default_'.$stype, - $chome); - unless (($fn) && ($fn!~/^error\:/)) { - $fn='default_'.$stype; - } - $defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; + my %tmphash = &Apache::lonnet::get('environment', + ['spreadsheet_default_'.$stype], + $cdom,$cnum); + my ($tmp) = keys(%tmphash); + if ($tmp =~ /^(con_lost|error|no_such_host)/i) { + $fn = 'default_'.$stype; + } else { + $fn = $tmphash{'spreadsheet_default_'.$stype}; + } + $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 @@ -1189,41 +1233,45 @@ sub readsheet { my %f=(); if ($fn=~/^default\_/) { - my $sheetxml=''; - { + my $sheetxml=''; my $fh; my $dfn=$fn; $dfn=~s/\_/\./g; if ($fh=Apache::File->new($includedir.'/'.$dfn)) { - $sheetxml=join('',<$fh>); - } else { + $sheetxml=join('',<$fh>); + } else { $sheetxml='"Error"'; - } - } - 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'); + } + %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 { + $sheetxml='"Error loading spreadsheet ' + .$fn.'"'; + } + %f=&parse_sheet(\$sheetxml); + } 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{$_}; } - } - } - } 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 $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); &setformulas($safeeval,%f);