version 1.26, 2001/01/01 20:52:10
|
version 1.27, 2001/01/02 12:12:43
|
Line 3
|
Line 3
|
# |
# |
# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, |
# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, |
# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, |
# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, |
# 01/01/01 Gerd Kortemeyer |
# 01/01/01,02/01 Gerd Kortemeyer |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 18 use HTML::TokeParser;
|
Line 18 use HTML::TokeParser;
|
|
|
# |
# |
# These cache hashes need to be independent of user, resource and course |
# These cache hashes need to be independent of user, resource and course |
# (user and course are in the keys) |
# (user and course can/should be in the keys) |
# |
# |
use vars qw(%spreadsheets %courserdatas %userrdatas); |
use vars qw(%spreadsheets %courserdatas %userrdatas %defaultsheets); |
|
|
# |
# |
# These global hashes are dependent on user, course and resource, |
# These global hashes are dependent on user, course and resource, |
# and need to be initialized every time when a sheet is calculated |
# and need to be initialized every time when a sheet is calculated |
Line 28 use vars qw(%spreadsheets %courserdatas
|
Line 29 use vars qw(%spreadsheets %courserdatas
|
my %courseopt; |
my %courseopt; |
my %useropt; |
my %useropt; |
my %parmhash; |
my %parmhash; |
my $csec; |
|
my $uname; |
|
my $udom; |
|
|
|
# ============================================================================= |
# ============================================================================= |
# ===================================== Implements an instance of a spreadsheet |
# ===================================== Implements an instance of a spreadsheet |
Line 61 sub initsheet {
|
Line 59 sub initsheet {
|
|
|
$maxrow=0; |
$maxrow=0; |
$sheettype=''; |
$sheettype=''; |
|
|
|
# filename/reference of the sheet |
|
|
$filename=''; |
$filename=''; |
|
|
|
# user data |
|
$uname=''; |
|
$uhome=''; |
|
$udom=''; |
|
|
|
# course data |
|
|
|
$csec=''; |
|
$chome=''; |
|
$cnum=''; |
|
$cdom=''; |
|
|
|
# symb |
|
|
|
$usymb=''; |
|
|
sub mask { |
sub mask { |
my ($lower,$upper)=@_; |
my ($lower,$upper)=@_; |
|
|
Line 452 sub gettype {
|
Line 469 sub gettype {
|
my $safeeval=shift; |
my $safeeval=shift; |
return $safeeval->reval('$sheettype'); |
return $safeeval->reval('$sheettype'); |
} |
} |
|
|
# ------------------------------------------------------------------ Set maxrow |
# ------------------------------------------------------------------ Set maxrow |
|
|
sub setmaxrow { |
sub setmaxrow { |
Line 480 sub getfilename {
|
Line 498 sub getfilename {
|
return $safeeval->reval('$filename'); |
return $safeeval->reval('$filename'); |
} |
} |
|
|
|
# ----------------------------------------------------------- Get course number |
|
|
|
sub getcnum { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$cnum'); |
|
} |
|
|
|
# ------------------------------------------------------------- Get course home |
|
|
|
sub getchome { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$chome'); |
|
} |
|
|
|
# ----------------------------------------------------------- Get course domain |
|
|
|
sub getcdom { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$cdom'); |
|
} |
|
|
|
# ---------------------------------------------------------- Get course section |
|
|
|
sub getcsec { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$csec'); |
|
} |
|
|
|
# --------------------------------------------------------------- Get user name |
|
|
|
sub getuname { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$uname'); |
|
} |
|
|
|
# ------------------------------------------------------------- Get user domain |
|
|
|
sub getudom { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$udom'); |
|
} |
|
|
|
# --------------------------------------------------------------- Get user home |
|
|
|
sub getuhome { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$uhome'); |
|
} |
|
|
|
# -------------------------------------------------------------------- Get symb |
|
|
|
sub getusymb { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$usymb'); |
|
} |
|
|
# ------------------------------------------------------------- Export of A-row |
# ------------------------------------------------------------- Export of A-row |
|
|
sub exportrow { |
sub exportrow { |
Line 490 sub exportrow {
|
Line 564 sub exportrow {
|
# ========================================================== End of Spreadsheet |
# ========================================================== End of Spreadsheet |
# ============================================================================= |
# ============================================================================= |
|
|
|
# |
|
# Procedures for screen output |
|
# |
# --------------------------------------------- Produce output row n from sheet |
# --------------------------------------------- Produce output row n from sheet |
|
|
sub rown { |
sub rown { |
Line 600 sub outsheet {
|
Line 676 sub outsheet {
|
$r->print('</table>'); |
$r->print('</table>'); |
} |
} |
|
|
|
# |
|
# -------------------------------------- Read spreadsheet formulas for a course |
|
# |
|
|
|
sub readsheet { |
|
my ($safeeval,$fn)=@_; |
|
my $stype=&gettype($safeeval); |
|
my $cnum=&getcnum($safeeval); |
|
|
|
# --------- There is no filename. Look for defaults in course and global, cache |
|
|
|
unless($fn) { |
|
unless ($fn=$defaultsheets{$cnum.'_'.$stype}) { |
|
$fn=&Apache::lonnet::reply('get:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
|
':environment:spreadsheet_default_'.&gettype($safeeval), |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
unless (($fn) && ($fn!~/^error\:/)) { |
|
$fn='default_'.$stype; |
|
} |
|
$defaultsheets{$cnum.'_'.$stype}=$fn; |
|
} |
|
} |
|
|
# ------------------------------------- Read spreadsheet formulas from a course |
# ---------------------------------------------------------- fn now has a value |
|
|
sub readsheet { |
&setfilename($safeeval,$fn); |
my ($safeeval,$fn,$r)=@_; |
|
my %f=(); |
# ------------------------------------------------------ see if sheet is cached |
if (($fn eq '') || ($fn=~/^default\_/)) { |
my $fstring=''; |
|
if ($fstring=$spreadsheets{$cnum.'_'.$stype.'_'.$fn}) { |
|
&setformulas($sheetone,split(/\_\_\_\;\_\_\_/,$fstring)); |
|
} else { |
|
|
|
# ---------------------------------------------------- Not cached, need to read |
|
|
|
my %f=(); |
|
|
|
if ($fn=~/^default\_/) { |
my $sheetxml=''; |
my $sheetxml=''; |
{ |
{ |
my $fh; |
my $fh; |
Line 616 sub readsheet {
|
Line 724 sub readsheet {
|
$sheetxml=join('',<$fh>); |
$sheetxml=join('',<$fh>); |
} |
} |
} |
} |
my $parser=HTML::TokeParser->new(\$sheetxml); |
my $parser=HTML::TokeParser->new(\$sheetxml); |
my $token; |
my $token; |
while ($token=$parser->get_token) { |
while ($token=$parser->get_token) { |
if ($token->[0] eq 'S') { |
if ($token->[0] eq 'S') { |
if ($token->[1] eq 'field') { |
if ($token->[1] eq 'field') { |
$f{$token->[2]->{'col'}.$token->[2]->{'row'}}= |
$f{$token->[2]->{'col'}.$token->[2]->{'row'}}= |
Line 629 sub readsheet {
|
Line 737 sub readsheet {
|
$parser->get_text('/template'); |
$parser->get_text('/template'); |
} |
} |
} |
} |
} |
} |
&setfilename($safeeval,'default_'.&gettype($safeeval)); |
} else { |
} else { |
my $sheet=''; |
&setfilename($safeeval,$fn); |
my $reply=&Apache::lonnet::reply('dump:'. |
unless ($spreadsheets{$fn}) { |
|
$spreadsheets{$fn}=''; |
|
my $reply=&Apache::lonnet::reply('dump:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn, |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn, |
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
unless ($reply=~/^error\:/) { |
unless ($reply=~/^error\:/) { |
$spreadsheets{$fn}=$reply; |
$sheet=$reply; |
} |
} |
|
map { |
|
my ($name,$value)=split(/\=/,$_); |
|
$f{&Apache::lonnet::unescape($name)}= |
|
&Apache::lonnet::unescape($value); |
|
} split(/\&/,$sheet); |
} |
} |
map { |
# --------------------------------------------------------------- Cache and set |
my ($name,$value)=split(/\=/,$_); |
$spreadsheets{$cnum.'_'.$stype.'_'.$fn}=join('___;___',%f); |
$f{&Apache::lonnet::unescape($name)}= |
&setformulas($safeeval,%f); |
&Apache::lonnet::unescape($value); |
|
} split(/\&/,$spreadsheets{$fn}); |
|
} |
} |
|
|
&setformulas($safeeval,%f); |
|
} |
} |
|
|
# ------------------------------------------------------------ Save spreadsheet |
# ------------------------------------------------------------ Save spreadsheet |
Line 1283 ENDSCRIPT
|
Line 1389 ENDSCRIPT
|
$ENV{'form.usymb'}); |
$ENV{'form.usymb'}); |
} else { |
} else { |
unless ($ENV{'form.ufn'}) { |
unless ($ENV{'form.ufn'}) { |
my $reply=&Apache::lonnet::reply('get:'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
|
':environment:spreadsheet_default_'. |
|
&gettype($sheetone), |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
unless (($reply=~/^error\:/) || ($reply eq '')) { |
|
$ENV{'form.ufn'}=$reply; |
|
unless ($reroute) { |
|
$r->print('<p>Using customized default spreadsheet<p>'); |
|
} |
|
} |
|
} |
|
&readsheet($sheetone,$ENV{'form.ufn'},$r); |
|
$ENV{'form.ufn'}=&getfilename($sheetone); |
|
} |
} |
|
|
if (&gettype($sheetone) eq 'classcalc') { |
if (&gettype($sheetone) eq 'classcalc') { |