--- loncom/interface/Attic/lonspreadsheet.pm 2002/11/21 18:56:36 1.145 +++ loncom/interface/Attic/lonspreadsheet.pm 2003/03/14 22:54:26 1.160.2.3 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.145 2002/11/21 18:56:36 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.160.2.3 2003/03/14 22:54:26 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,6 +62,7 @@ use Safe; use Safe::Hole; use Opcode; use GDBM_File; +use HTML::Entities(); use HTML::TokeParser; use Spreadsheet::WriteExcel; @@ -960,16 +961,14 @@ ENDDEFS sub templaterow { my $sheet = shift; my @cols=(); - my $rowlabel = 'Template'; + my $rowlabel = 'Template '; foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z') { - my $fm=$sheet->{'f'}->{'template_'.$_}; - $fm=~s/[\'\"]/\&\#34;/g; push(@cols,{ name => 'template_'.$_, - formula => $fm, - value => $fm }); + formula => $sheet->{'f'}->{'template_'.$_}, + value => $sheet->{'f'}->{'template_'.$_} }); } return ($rowlabel,@cols); } @@ -982,21 +981,25 @@ sub outrowassess { if ($n) { my ($usy,$ufn)=split(/__&&&\__/,$sheet->{'f'}->{'A'.$n}); if (exists($sheet->{'rowlabel'}->{$usy})) { - $rowlabel = $sheet->{'rowlabel'}->{$usy}; + # This is dumb, but we need the information when we output + # the html version of the studentcalc spreadsheet for the + # links to the assesscalc sheets. + $rowlabel = $sheet->{'rowlabel'}->{$usy}.':'. + &Apache::lonnet::escape($ufn); } else { $rowlabel = ''; } + } elsif ($ENV{'request.role'} =~ /^st\./) { + $rowlabel = 'Summary0'; } else { - $rowlabel = 'Export'; + $rowlabel = 'Export0'; } foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z') { - my $fm=$sheet->{'f'}->{$_.$n}; - $fm=~s/[\'\"]/\&\#34;/g; push(@cols,{ name => $_.$n, - formula => $fm, + formula => $sheet->{'f'}->{$_.$n}, value => $sheet->{'values'}->{$_.$n}}); } return ($rowlabel,@cols); @@ -1010,19 +1013,17 @@ sub outrow { $rowlabel = $sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}}; } else { if ($sheet->{'sheettype'} eq 'classcalc') { - $rowlabel = 'Summary'; + $rowlabel = 'Summary0'; } else { - $rowlabel = 'Export'; + $rowlabel = 'Export0'; } } foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z') { - my $fm=$sheet->{'f'}->{$_.$n}; - $fm=~s/[\'\"]/\&\#34;/g; push(@cols,{ name => $_.$n, - formula => $fm, + formula => $sheet->{'f'}->{$_.$n}, value => $sheet->{'values'}->{$_.$n}}); } return ($rowlabel,@cols); @@ -1203,9 +1204,13 @@ sub sort_indicies { my @sortby2=(undef); # Skip row 0 for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { - my (undef,$symb,$uname,$udom,$mapid,$resid,$title) = - split(':',$sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$row}}); - $symb = &Apache::lonnet::unescape($symb); + my ($key,undef) = split(/__&&&\__/,$sheet->{'f'}->{'A'.$row}); + my $rowlabel = $sheet->{'rowlabel'}->{$key}; + my (undef,$symb,$mapid,$resid,$title,$ufn) = + split(':',$rowlabel); + $ufn = &Apache::lonnet::unescape($ufn); + $symb = &Apache::lonnet::unescape($symb); + $title = &Apache::lonnet::unescape($title); my ($sequence) = ($symb =~ /\/([^\/]*\.sequence)/); if ($sequence eq '') { $sequence = $symb; @@ -1253,25 +1258,35 @@ sub html_editable_cell { if ($formula ne '') { $value = 'undefined value'; } - } - if ($value =~ /^\s*$/ ) { + } elsif ($value =~ /^\s*$/ ) { $value = '#'; + } else { + $value = &HTML::Entities::encode($value) if ($value !~/ /); } + # Make the formula safe for outputting + $formula =~ s/\'/\"/g; + # The formula will be parsed by the browser *twice* before being + # displayed to the user for editing. + $formula = &HTML::Entities::encode(&HTML::Entities::encode($formula)); + # Escape newlines so they make it into the edit window $formula =~ s/\n/\\n/gs; - $result .= ''.$value.''; + # Glue everything together + $result .= "".$value.""; return $result; } sub html_uneditable_cell { my ($cell,$bgcolor) = @_; my $value = (defined($cell) ? $cell->{'value'} : ''); + $value = &HTML::Entities::encode($value) if ($value !~/ /); return ' '.$value.' '; } sub outsheet_html { my ($sheet,$r) = @_; my ($num_uneditable,$realm,$row_type); + my $requester_is_student = ($ENV{'request.role'} =~ /^st\./); if ($sheet->{'sheettype'} eq 'assesscalc') { $num_uneditable = 1; $realm = 'Assessment'; @@ -1294,7 +1309,7 @@ sub outsheet_html { my $tabledata =<<"END"; - + '; - my $num_cols_output = 0; - foreach my $cell (@rowdata) { - if ($num_cols_output++ < $num_uneditable) { - $row_html .= ''; + $num_cols_output = 0; + foreach my $cell (@rowdata) { + if ($requester_is_student || + $num_cols_output++ < $num_uneditable) { + $row_html .= ''; } - $row_html .= ''; + $row_html.= "\n"; + $r->print($row_html); } - $row_html.= "\n"; - $r->print($row_html); #################################### # Print out summary/export row #################################### - my ($rowlabel,@rowdata) = &get_row($sheet,'0'); - $row_html = ''; + ($rowlabel,@rowdata) = &get_row($sheet,'0'); + $row_html = ''; $num_cols_output = 0; foreach my $cell (@rowdata) { - if ($num_cols_output++ < 26) { + if ($num_cols_output++ < 26 && ! $requester_is_student) { $row_html .= ''; } @@ -1381,25 +1401,28 @@ END ''; # if ($sheet->{'sheettype'} eq 'classcalc') { - $row_html.=''; + $row_html.=''; # Output links for each student? - # Nope, that is already done for us in format_html_rowlabel (for now) + # Nope, that is already done for us in format_html_rowlabel + # (for now) } elsif ($sheet->{'sheettype'} eq 'studentcalc') { - $row_html.=''; } elsif ($sheet->{'sheettype'} eq 'assesscalc') { - $row_html.=''; + $row_html.=''; } # my $shown_cells = 0; @@ -1417,7 +1440,7 @@ END $bgcolor='#FFDDDD' if ($shown_cells < $num_uneditable); # $row_html.='
$realm$realm Import @@ -1316,34 +1331,39 @@ END #################################### # Print out template row #################################### - my ($rowlabel,@rowdata) = &get_row($sheet,'-'); - my $row_html = '
'.&format_html_rowlabel($rowlabel).''; - $row_html .= &html_uneditable_cell($cell,'#FFDDDD'); - } else { - $row_html .= ''; - $row_html .= &html_editable_cell($cell,'#E0FFDD'); + my ($num_cols_output,$row_html,$rowlabel,@rowdata); + + if (! $requester_is_student) { + ($rowlabel,@rowdata) = &get_row($sheet,'-'); + $row_html = '
'.&format_html_rowlabel($sheet,$rowlabel).''; + $row_html .= &html_uneditable_cell($cell,'#FFDDDD'); + } else { + $row_html .= ''; + $row_html .= &html_editable_cell($cell,'#E0FFDD'); + } + $row_html .= '
'.&format_html_rowlabel($rowlabel).'
'.&format_html_rowlabel($sheet,$rowlabel).''; $row_html .= &html_editable_cell($cell,'#CCCCFF'); } else { $row_html .= ''; - $row_html .= &html_uneditable_cell(undef,'#CCCCFF'); + $row_html .= &html_uneditable_cell($cell,'#CCCCFF'); } $row_html .= ''.&format_html_rowlabel($rowlabel).''.&format_html_rowlabel($sheet,$rowlabel).''.&format_html_rowlabel($rowlabel); + my $ufn = (split(/:/,$rowlabel))[5]; + $row_html.=''.&format_html_rowlabel($sheet,$rowlabel); $row_html.= '
'. '
'.&format_html_rowlabel($rowlabel).''.&format_html_rowlabel($sheet,$rowlabel).''; - if ($shown_cells < $num_uneditable) { + if ($requester_is_student || $shown_cells < $num_uneditable) { $row_html .= &html_uneditable_cell($cell,$bgcolor); } else { $row_html .= &html_editable_cell($cell,$bgcolor); @@ -1469,7 +1492,7 @@ sub outsheet_csv { foreach my $rownum (@Rows) { my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); next if ($rowlabel =~ /^\s*$/); - push (@Values,&format_csv_rowlabel($rowlabel)); + push (@Values,&format_csv_rowlabel($sheet,$rowlabel)); foreach my $cell (@rowdata) { push (@Values,'"'.$cell->{'value'}.'"'); } @@ -1530,10 +1553,9 @@ A link to the spreadsheet will be availa END $r->rflush(); my $starttime = time; - foreach (keys(%f)) { - next if ($_!~/^A(\d+)/ || $1 == 0 || ($f{$_}=~/^[!~-]/)); + foreach my $rownum (&sort_indicies($sheet)) { $count++; - my ($sname,$sdom) = split(':',$f{$_}); + my ($sname,$sdom) = split(':',$f{'A'.$rownum}); my $student_excel_worksheet=$workbook->addworksheet($sname.'@'.$sdom); # Create a new spreadsheet my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef); @@ -1639,7 +1661,7 @@ sub export_sheet_as_excel { # Write the summary/export row # #################################### my ($rowlabel,@rowdata) = &get_row($sheet,'0'); - my $label = &format_excel_rowlabel($rowlabel); + my $label = &format_excel_rowlabel($sheet,$rowlabel); $cols_output = 0; $worksheet->write($rows_output,$cols_output++,$label); foreach my $cell (@rowdata) { @@ -1656,7 +1678,7 @@ sub export_sheet_as_excel { my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); next if ($rowlabel =~ /^[\s]*$/); $cols_output = 0; - my $label = &format_excel_rowlabel($rowlabel); + my $label = &format_excel_rowlabel($sheet,$rowlabel); if ( ! $ENV{'form.showall'} && $sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) { my $row_is_empty = 1; @@ -1819,13 +1841,27 @@ sub readsheet { } %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) { + if ($tmp !~ /^(con_lost|error|no_such_host)/i) { foreach (keys(%tmphash)) { $f{$_}=$tmphash{$_}; } + } else { + # Unable to grab the specified spreadsheet, + # so we get the default ones instead. + $fn = 'default_'.$stype; + $sheet->{'filename'} = $fn; + my $dfn = $fn; + $dfn =~ s/\_/\./g; + my $sheetxml; + if (my $fh=Apache::File->new($includedir.'/'.$dfn)) { + $sheetxml = join('',<$fh>); + } else { + $sheetxml=''. + '"Unable to load spreadsheet"'; + } + %f=%{&parse_sheet(\$sheetxml)}; } } # Cache and set @@ -1846,6 +1882,14 @@ sub makenewsheet { $sheet->{'mapid'} = $ENV{'form.mapid'}; $sheet->{'resid'} = $ENV{'form.resid'}; $sheet->{'cid'} = $ENV{'request.course.id'}; + if (! exists($Section{$uname.':'.$udom})) { + my $classlist = &Apache::loncoursedata::get_classlist(); + foreach my $student (keys(%$classlist)) { + my ($studentDomain,$studentName,undef,undef,undef,$studentSection, + undef,undef) = @{$classlist->{$student}}; + $Section{$studentName.':'.$studentDomain} = $studentSection; + } + } $sheet->{'csec'} = $Section{$uname.':'.$udom}; $sheet->{'coursefilename'} = $ENV{'request.course.fn'}; $sheet->{'cnum'} = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; @@ -1899,9 +1943,16 @@ sub writesheet { $cdom,$cnum); if ($reply eq 'ok') { if ($makedef) { - return &Apache::lonnet::put('environment', - {'spreadsheet_default_'.$stype => $fn }, - $cdom,$cnum); + $reply = &Apache::lonnet::put('environment', + {'spreadsheet_default_'.$stype => $fn }, + $cdom,$cnum); + if ($reply eq 'ok' && + ($sheet->{'sheettype'} eq 'studentcalc' || + $sheet->{'sheettype'} eq 'assesscalc')) { + # Expire the spreadsheets of the other students. + &Apache::lonnet::expirespread('','','studentcalc',''); + } + return $reply; } return $reply; } @@ -1924,7 +1975,10 @@ sub tmpwrite { $fn=$tmpdir.$fn.'.tmp'; my $fh; if ($fh=Apache::File->new('>'.$fn)) { - print $fh join("\n",&getformulas($sheet)); + my %f = &getformulas($sheet); + while( my ($cell,$formula) = each(%f)) { + print $fh &Apache::lonnet::escape($cell)."=".&Apache::lonnet::escape($formula)."\n"; + } } } @@ -1940,32 +1994,36 @@ sub tmpread { my %fo=(); my $countrows=0; if ($fh=Apache::File->new($fn)) { - my $name; - while ($name=<$fh>) { - chomp($name); - my $value=<$fh>; - chomp($value); - $fo{$name}=$value; - if ($name=~/^A(\d+)$/) { - if ($1>$countrows) { - $countrows=$1; - } - } - } - } + while (<$fh>) { + chomp; + my ($cell,$formula) = split(/=/); + $cell = &Apache::lonnet::unescape($cell); + $formula = &Apache::lonnet::unescape($formula); + $fo{$cell} = $formula; + } + } +# chomp($value); +# $fo{$name}=$value; +# if ($name=~/^A(\d+)$/) { +# if ($1>$countrows) { +# $countrows=$1; +# } +# } +# } +# } if ($nform eq 'changesheet') { $fo{'A'.$nfield}=(split(/__&&&\__/,$fo{'A'.$nfield}))[0]; unless ($ENV{'form.sel_'.$nfield} eq 'Default') { $fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; } - } elsif ($nfield eq 'insertrow') { - $countrows++; - my $newrow=substr('000000'.$countrows,-7); - if ($nform eq 'top') { - $fo{'A'.$countrows}='--- '.$newrow; - } else { - $fo{'A'.$countrows}='~~~ '.$newrow; - } +# } elsif ($nfield eq 'insertrow') { +# $countrows++; +# my $newrow=substr('000000'.$countrows,-7); +# if ($nform eq 'top') { +# $fo{'A'.$countrows}='--- '.$newrow; +# } else { +# $fo{'A'.$countrows}='~~~ '.$newrow; +# } } else { if ($nfield) { $fo{$nfield}=$nform; } } @@ -2044,8 +2102,27 @@ sub parmval { # second, check map parms my $thisparm = $parmhash{$symbparm}; return $thisparm if (defined($thisparm)); + # first, check default - return &Apache::lonnet::metadata($fn,$rwhat.'.default'); + $thisparm = &Apache::lonnet::metadata($fn,$rwhat.'.default'); + return $thisparm if (defined($thisparm)); + + #Cascade Up + my $space=$what; + $space=~s/\.\w+$//; + if ($space ne '0') { + my @parts=split(/_/,$space); + my $id=pop(@parts); + my $part=join('_',@parts); + if ($part eq '') { $part='0'; } + my $newwhat=$rwhat; + $newwhat=~s/\Q$space\E/$part/; + my $partgeneral=&parmval($newwhat,$sheet); + if (defined($partgeneral)) { return $partgeneral; } + } + + #nothing defined + return ''; } @@ -2053,18 +2130,26 @@ sub parmval { ## Row label formatting routines ## ################################################################## sub format_html_rowlabel { + my $sheet = shift; my $rowlabel = shift; return '' if ($rowlabel eq ''); my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); - $symb = &Apache::lonnet::unescape($symb); + my ($symb,$mapid,$resid,$title,$ufn) = split(':',$labeldata); + $ufn = 'default' if (!defined($ufn) || $ufn eq ''); + $ufn = &Apache::lonnet::unescape($ufn); + $symb = &Apache::lonnet::unescape($symb); + $title = &Apache::lonnet::unescape($title); $result = ''.$title.''; + '&uname='.$sheet->{'uname'}.'&udom='.$sheet->{'udom'}. + '&ufn='.$ufn. + '&mapid='.$mapid.'&resid='.$resid.'">'.$title.''; } elsif ($type eq 'student') { my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); + if ($fullname =~ /^\s*$/) { + $fullname = $sname.'@'.$sdom; + } $result =''; $result.=$section.' '.$id." ".$fullname.''; @@ -2077,13 +2162,16 @@ sub format_html_rowlabel { } sub format_csv_rowlabel { + my $sheet = shift; my $rowlabel = shift; return '' if ($rowlabel eq ''); my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); - $symb = &Apache::lonnet::unescape($symb); + my ($symb,$mapid,$resid,$title,$ufn) = split(':',$labeldata); + $ufn = &Apache::lonnet::unescape($ufn); + $symb = &Apache::lonnet::unescape($symb); + $title = &Apache::lonnet::unescape($title); $result = $title; } elsif ($type eq 'student') { my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); @@ -2098,13 +2186,16 @@ sub format_csv_rowlabel { } sub format_excel_rowlabel { + my $sheet = shift; my $rowlabel = shift; return '' if ($rowlabel eq ''); my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); - $symb = &Apache::lonnet::unescape($symb); + my ($symb,$mapid,$resid,$title,$ufn) = split(':',$labeldata); + $ufn = &Apache::lonnet::unescape($ufn); + $symb = &Apache::lonnet::unescape($symb); + $title = &Apache::lonnet::unescape($title); $result = $title; } elsif ($type eq 'student') { my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); @@ -2212,10 +2303,11 @@ sub get_student_rowlabels { return 'Could not access course data'; } # - my %assesslist; + my %assesslist = (); foreach ('Feedback','Evaluation','Tutoring','Discussion') { my $symb = '_'.lc($_); - $assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,0,0,$_)); + $assesslist{$symb} = join(':',('symb',$symb,0,0, + &Apache::lonnet::escape($_))); } # while (my ($key,$srcf) = each(%course_db)) { @@ -2227,9 +2319,9 @@ sub get_student_rowlabels { my $symb= &Apache::lonnet::declutter($course_db{'map_id_'.$mapid}). '___'.$resid.'___'.&Apache::lonnet::declutter($srcf); - $assesslist{$symb}='symb:'.&Apache::lonnet::escape($symb).':' - .$uname.':'.$udom.':'.$mapid.':'.$resid.':'. - $course_db{'title_'.$id}; + $assesslist{$symb} ='symb:'.&Apache::lonnet::escape($symb).':' + .$mapid.':'.$resid.':'. + &Apache::lonnet::escape($course_db{'title_'.$id}); } } untie(%course_db); @@ -2317,7 +2409,8 @@ sub updatestudentassesssheet { $sheet->{'maxrow'} = 0; my %existing=(); # Now obsolete rows - while (my ($cell, $formula) = each (%f)) { + foreach my $cell (keys(%f)) { + my $formula = $f{$cell}; next if ($cell !~ /^A(\d+)/); $sheet->{'maxrow'} = $1 if ($1 > $sheet->{'maxrow'}); my ($usy,$ufn)=split(/__&&&\__/,$formula); @@ -2325,12 +2418,8 @@ sub updatestudentassesssheet { unless ((exists($sheet->{'rowlabel'}->{$usy}) && (defined($sheet->{'rowlabel'}->{$usy})) || (!$1) || ($formula =~ /^(~~~|---)/) )) { - $f{$_}='!!! Obsolete'; + $f{$cell}='!!! Obsolete'; $changed=1; - } elsif ($ufn) { - # I do not think this works any more - $sheet->{'rowlabel'}->{$usy} - =~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn&\usymb\=/; } } # New and unknown keys @@ -2671,7 +2760,7 @@ sub forcedrecalc { &checkthis($uname.':'.$udom.':assesscalc:'.$map,$time) || &checkthis($uname.':'.$udom.':assesscalc:'.$usymb,$time)) { return 1; - } + } } else { if (&checkthis('::studentcalc:',$time) || &checkthis($uname.':'.$udom.':studentcalc:',$time)) { @@ -2692,6 +2781,7 @@ sub exportsheet { $udom = $udom || $sheet->{'udom'}; $stype = $stype || $sheet->{'sheettype'}; my @exportarr=(); + # This handles the assessment sheets for '_feedback', etc if (defined($usymb) && ($usymb=~/^\_(\w+)/) && (!defined($fn) || $fn eq '')) { $fn='default_'.$1; @@ -2852,7 +2942,8 @@ sub cachedssheets { $uname = $uname || $sheet->{'uname'}; $udom = $udom || $sheet->{'udom'}; if (! $loadedcaches{$uname.'_'.$udom}) { - my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets', + my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets_'. + $ENV{'request.course.id'}, $sheet->{'udom'}, $sheet->{'uname'}); if ($tmp[0] !~ /^error/) { @@ -2937,11 +3028,16 @@ sub handler { delete $ENV{'form.unewformula'} if (exists($ENV{'form.unewformula'})); } # - # Clean up symb and spreadsheet filename + # Look for special assessment spreadsheets - '_feedback', etc. # - if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) { + if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'} || + $ENV{'form.ufn'} eq '' || + $ENV{'form.ufn'} eq 'default')) { $ENV{'form.ufn'}='default_'.$1; } + if (!$ENV{'form.ufn'} || $ENV{'form.ufn'} eq 'default') { + $ENV{'form.ufn'}='course_default_'.$sheettype; + } # # Interactive loading of specific sheet? # @@ -2983,6 +3079,8 @@ sub handler { function celledit(cellname,cellformula) { var edit_text = ''; + // cellformula may contain less-than and greater-than symbols, so + // we need to escape them? edit_text +='Cell Edit Window'; edit_text += '
'; edit_text += '

Cell '+cellname+'

'; @@ -3075,9 +3173,10 @@ ENDSCRIPT # If a new formula had been entered, go from work copy if ($ENV{'form.unewfield'}) { $r->print('

Modified Workcopy

'); - $ENV{'form.unewformula'}=~s/\'/\"/g; - $r->print('

New formula: '.$ENV{'form.unewfield'}.'='. - $ENV{'form.unewformula'}.'

'); + #$ENV{'form.unewformula'}=~s/\'/\"/g; + $r->print('

Cell '.$ENV{'form.unewfield'}.' =

');
+        $r->print(&HTML::Entities::encode($ENV{'form.unewformula'}).
+                  '

'); $sheet->{'filename'} = $ENV{'form.ufn'}; &tmpread($sheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'}); } elsif ($ENV{'form.saveas'}) { @@ -3140,6 +3239,7 @@ ENDSCRIPT $oldsheets{'course'} ne $sheet->{'cid'}) { undef %oldsheets; undef %loadedcaches; + undef %Section; } $oldsheets{'course'} = $sheet->{'cid'}; # @@ -3206,8 +3306,8 @@ ENDSCRIPT } $r->print('>'); # - # CSV format checkbox (classcalc sheets only) - $r->print(' Output as '. "\n"); foreach my $mode (qw/HTML CSV Excel/) { $r->print(''."\n"); } - if ($sheet->{'sheettype'} eq 'classcalc') { - $r->print('\n"); - } +# +# Mulit-sheet excel takes too long and does not work at all for large +# classes. Future inclusion of this option may be possible with the +# Spreadsheet::WriteExcel::Big and speed improvements. +# +# if ($sheet->{'sheettype'} eq 'classcalc') { +# $r->print('\n"); +# } $r->print("\n"); # if ($sheet->{'sheettype'} eq 'classcalc') { @@ -3248,3 +3353,5 @@ ENDSCRIPT 1; __END__ + +