--- loncom/interface/Attic/lonspreadsheet.pm 2002/02/04 10:30:58 1.80 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/04/09 18:41:11 1.82 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.80 2002/02/04 10:30:58 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.82 2002/04/09 18:41:11 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1133,26 +1133,51 @@ sub outsheet { # # ----------------------------------------------- Read list of available sheets # - sub othersheets { my ($safeeval,$stype)=@_; - + # my $cnum=&getcnum($safeeval); my $cdom=&getcdom($safeeval); my $chome=&getchome($safeeval); - + # my @alternatives=(); - my $result=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'. - $stype.'_spreadsheets',$chome); - if ($result!~/^error\:/) { - foreach (split(/\&/,$result)) { - $alternatives[$#alternatives+1]= - &Apache::lonnet::unescape((split(/\=/,$_))[0]); - } - } + my %results=&Apache::lonnet::dump($stype.'_spreadsheets',$cdom,$cnum); + my ($tmp) = keys(%results); + unless ($tmp =~ /^(con_lost|error|no_such_host)/i) { + @alternatives = sort (keys(%results)); + } 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 # @@ -1164,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 @@ -1193,44 +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 $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'.$fn, - $chome); - unless ($reply=~/^error\:/) { - $sheet=$reply; - } - foreach (split(/\&/,$sheet)) { - my ($name,$value)=split(/\=/,$_); - $f{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } - } + } + } # --------------------------------------------------------------- Cache and set $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); &setformulas($safeeval,%f);