--- loncom/interface/spreadsheet/Spreadsheet.pm 2005/09/01 21:52:56 1.56 +++ loncom/interface/spreadsheet/Spreadsheet.pm 2006/04/06 16:43:49 1.66 @@ -1,5 +1,5 @@ # -# $Id: Spreadsheet.pm,v 1.56 2005/09/01 21:52:56 albertel Exp $ +# $Id: Spreadsheet.pm,v 1.66 2006/04/06 16:43:49 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -85,7 +85,7 @@ sub new { my $class = ref($this) || $this; my ($stype) = ($class =~ /Apache::(.*)$/); # - my ($name,$domain,$filename,$usymb)=@_; + my ($name,$domain,$filename,$usymb,$section)=@_; if (defined($usymb) && ref($usymb)) { $usymb = $usymb->symb; } @@ -95,10 +95,15 @@ sub new { if (! defined($domain) || $domain eq '') { $domain = $env{'user.domain'}; } + if (! defined($section) || $section eq '') { + $section = &Apache::lonnet::getsection($domain,$name, + $env{'request.course.id'}); + } # my $self = { name => $name, domain => $domain, + section => $section, type => $stype, symb => $usymb, errorlog => '', @@ -378,10 +383,12 @@ Calls the system EXT function to determi #------------------------------------------------------- sub EXT { - my ($parameter) = @_; + my ($parameter,$specific_symb) = @_; return '' if (! defined($parameter) || $parameter eq ''); $parameter =~ s/^parameter\./resource\./; - my $value = &Apache::lonnet::EXT($parameter,$symb,$domain,$name,$usection); + if ($specific_symb eq '') { $specific_symb = $symb; } + my $value = &Apache::lonnet::EXT($parameter,$specific_symb,$domain,$name, + $usection); return $value; } @@ -697,7 +704,7 @@ sub get_values { } return \@values; } else { - $num = '(\d+)'; + $num = '([1-9]\d*)'; } if (($la eq '*') || ($ua eq '*')) { $alpha='[A-z]'; @@ -806,7 +813,7 @@ sub expandnamed { $result.=$thissum.'+'; } $result=~s/\+$//; - return $result; + return '('.$result.')'; } else { return 0; } @@ -1193,12 +1200,19 @@ sub display { last; } } + $self->{outputmode} = $outputmode; if ($outputmode eq 'html') { $self->compute($r); $self->outsheet_html($r); } elsif ($outputmode eq 'htmlclasslist') { # No computation neccessary... This is kludgy $self->outsheet_htmlclasslist($r); + } elsif ($outputmode eq 'source') { + # No computation necessary. Rumor has it that this is some + # sort of kludge w.r.t. not "computing". It's also + # a bit of of a kludge that we call "outsheet_html" and + # let the 'outputmode' cause the outputting of source. + $self->outsheet_html($r); } elsif ($outputmode eq 'excel') { $self->compute($r); $self->outsheet_excel($r); @@ -1238,10 +1252,12 @@ sub html_export_row { foreach my $cell (@rowdata) { if ($cell->{'name'} =~ /^[A-Z]/) { $row_html .= ''. - &html_editable_cell($cell,$color,$allowed).''; + &html_editable_cell($cell,$color,$allowed, + $self->{outputmode} eq 'source').''; } else { $row_html .= ''. - &html_editable_cell($cell,'#DDCCFF',$allowed).''; + &html_editable_cell($cell,'#DDCCFF',$allowed, + $self->{outputmode} eq 'source').''; } } return $row_html; @@ -1261,14 +1277,15 @@ sub html_template_row { &html_uneditable_cell($cell,'#FFDDDD',$allowed).''; } else { $row_html .= ''. - &html_editable_cell($cell,'#EOFFDD',$allowed).''; + &html_editable_cell($cell,'#EOFFDD',$allowed, + $self->{outputmode} eq 'source').''; } } return $row_html; } sub html_editable_cell { - my ($cell,$bgcolor,$allowed) = @_; + my ($cell,$bgcolor,$allowed,$showsource) = @_; my $result; my ($name,$formula,$value); if (defined($cell)) { @@ -1278,7 +1295,13 @@ sub html_editable_cell { } $name = '' if (! defined($name)); $formula = '' if (! defined($formula)); - if (! defined($value)) { + if ($showsource) { + if (!defined($formula) || $formula =~ /^\s*$/) { + $value = '#'; + } else { + $value = &HTML::Entities::encode($formula, '<>&"'); + } + } elsif (! defined($value)) { $value = '#'; if ($formula ne '') { $value = 'undefined value'; @@ -1331,7 +1354,8 @@ sub html_row { $row_html .= &html_uneditable_cell($cell,'#FFDDDD'); } else { $row_html .= ''; - $row_html .= &html_editable_cell($cell,'#E0FFDD',$allowed); + $row_html .= &html_editable_cell($cell,'#E0FFDD',$allowed, + $self->{outputmode} eq 'source'); } $row_html .= ''; } @@ -1355,6 +1379,8 @@ sub output_options { description => 'HTML'}, {value => 'excel', description => 'Excel'}, + {value => 'source', + description => 'Show Source'}, # {value => 'xml', # description => 'XML'}, {value => 'csv', @@ -1623,7 +1649,7 @@ sub load { $self->{'row_source'}=$spreadsheets{$cachekey}->{'row_source'}; $self->{'row_numbers'}=$spreadsheets{$cachekey}->{'row_numbers'}; $self->{'maxrow'}=$spreadsheets{$cachekey}->{'maxrow'}; - } else { + } else { # Not cached, need to read if (! defined($filename)) { $formulas = $self->load_system_default_sheet(); @@ -1656,24 +1682,33 @@ sub load { $formulas = $self->load_system_default_sheet(); } } - $filename=$self->filename(); # filename may have changed - $cachekey = join('_',($cnum,$cdom,$stype,$filename)); - if (ref($formulas) eq 'HASH') { - %{$spreadsheets{$cachekey}->{'formulas'}} = %{$formulas}; - } $self->formulas($formulas); $self->set_row_sources(); $self->set_row_numbers(); - if (ref($self->{'row_source'})) { - %{$spreadsheets{$cachekey}->{'row_source'}} = - %{$self->{'row_source'}}; - } - if (ref($self->{'row_numbers'})) { - %{$spreadsheets{$cachekey}->{'row_numbers'}} = - %{$self->{'row_numbers'}}; - } - $spreadsheets{$cachekey}->{'maxrow'} = $self->{'maxrow'}; + $self->cache_sheet($formulas); + } +} + +sub cache_sheet { + my $self = shift; + my ($formulas) = @_; + my $stype = $self->{'type'}; + my $cnum = $self->{'cnum'}; + my $cdom = $self->{'cdom'}; + # + my $filename = $self->filename(); + my $cachekey = join('_',($cnum,$cdom,$stype,$filename)); + + if (ref($formulas) eq 'HASH') { + %{$spreadsheets{$cachekey}->{'formulas'}} = %{$formulas}; + } + if (ref($self->{'row_source'})) { + %{$spreadsheets{$cachekey}->{'row_source'}} =%{$self->{'row_source'}}; + } + if (ref($self->{'row_numbers'})) { + %{$spreadsheets{$cachekey}->{'row_numbers'}}=%{$self->{'row_numbers'}}; } + $spreadsheets{$cachekey}->{'maxrow'} = $self->{'maxrow'}; } sub set_row_sources { @@ -1725,9 +1760,8 @@ sub save { my $cnum = $self->{'cnum'}; my $cdom = $self->{'cdom'}; my $filename = $self->{'filename'}; - my $cachekey = join('_',($cnum,$cdom,$stype,$filename)); # Cache new sheet - %{$spreadsheets{$cachekey}->{'formulas'}}=%f; + $self->cache_sheet(\%f); # Write sheet foreach (keys(%f)) { delete($f{$_}) if ($f{$_} eq 'import');