--- loncom/interface/Attic/lonspreadsheet.pm 2000/12/18 17:14:49 1.18 +++ loncom/interface/Attic/lonspreadsheet.pm 2000/12/30 17:13:54 1.20 @@ -2,7 +2,7 @@ # Spreadsheet/Grades Display Handler # # 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 Gerd Kortemeyer +# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -12,8 +12,8 @@ use Safe::Hole; use Opcode; use Apache::lonnet; use Apache::Constants qw(:common :http); -use HTML::TokeParser; use GDBM_File; +use HTML::TokeParser; # # These cache hashes need to be independent of user, resource and course @@ -267,7 +267,26 @@ sub sett { $pattern='[A-Z]'; } map { - if ($f{$_}) { + if ($_=~/template\_(\w)/) { + my $col=$1; + unless ($col=~/^$pattern/) { + map { + if ($_=~/A(\d+)/) { + my $trow=$1; + if ($trow) { + my $lb=$col.$trow; + $t{$lb}=$f{'template_'.$col}; + $t{$lb}=~s/\#/$trow/g; + $t{$lb}=~s/\.\.+/\,/g; + $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; + } + } + } keys %f; + } + } + } keys %f; + map { + if (($f{$_}) && ($_!~/template\_/)) { if ($_=~/^$pattern/) { unless ($f{$_}=~/^\!/) { $t{$_}=$c{$_}; @@ -541,38 +560,78 @@ sub outsheet { -# --------------------------------------- Read spreadsheet formulas from a file +# ------------------------------------- Read spreadsheet formulas from a course sub readsheet { - my ($safeeval,$fn)=@_; - &setfilename($safeeval,$fn); - $fn=~/\.(\w+)/; - &settype($safeeval,$1); + my ($safeeval,$fn,$r)=@_; my %f=(); - unless ($spreadsheets{$fn}) { - $spreadsheets{$fn}=''; + unless ($fn) { + my $sheetxml=''; { my $fh; - if ($fh=Apache::File->new($fn)) { - $spreadsheets{$fn}=join('',<$fh>); - } + if ($fh=Apache::File->new($r->dir_config('lonIncludes'). + '/default.'.&gettype($safeeval))) { + $sheetxml=join('',<$fh>); + } } + 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'); + } + } + } + &setfilename($safeeval,'default_'.&gettype($safeeval)); + } else { + &setfilename($safeeval,$fn); + unless ($spreadsheets{$fn}) { + $spreadsheets{$fn}=''; + my $reply=&Apache::lonnet::reply('dump:'. + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn, + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + unless ($reply=~/^error\:/) { + $spreadsheets{$fn}=$reply; + } + } + map { + my ($name,$value)=split(/\=/,$_); + $f{&Apache::lonnet::unescape($name)}= + &Apache::lonnet::unescape($value); + } split(/\&/,$spreadsheets{$fn}); } - { - my $parser=HTML::TokeParser->new(\$spreadsheets{$fn}); - 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'); - } - } - } - } + &setformulas($safeeval,%f); } +# ------------------------------------------------------------ Save spreadsheet + +sub writesheet { + my $safeeval=shift; + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + my %f=&getformulas($safeeval); + my $sheetdata=''; + map { + $sheetdata.=&Apache::lonnet::escape($_).'='. + &Apache::lonnet::escape($f{$_}).'&'; + } keys %f; + $sheetdata=~s/\&$//; + my $reply=&Apache::lonnet::reply('put:'. + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'. + &getfilename($safeeval).':'. + $sheetdata, + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + } +} + # ----------------------------------------------- Make a temp copy of the sheet sub tmpwrite { @@ -981,7 +1040,8 @@ sub handler { my ($name, $value) = split(/=/,$_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; - if (($name eq 'uname') || ($name eq 'udom') || ($name eq 'usymb')) { + if (($name eq 'uname') || ($name eq 'udom') || + ($name eq 'usymb') || ($name eq 'ufn')) { unless ($ENV{'form.'.$name}) { $ENV{'form.'.$name}=$value; } @@ -989,7 +1049,6 @@ sub handler { } (split(/&/,$ENV{'QUERY_STRING'})); # ------------------------------------------- Nothing there? Must be login user - unless ($ENV{'form.uname'}) { $uname=$ENV{'user.name'}; $udom=$ENV{'user.domain'}; @@ -1031,6 +1090,7 @@ ENDSCRIPT &hiddenfield('uname',$ENV{'form.uname'}). &hiddenfield('udom',$ENV{'form.udom'}). &hiddenfield('usymb',$ENV{'form.usymb'}). + &hiddenfield('ufn',$ENV{'form.ufn'}). &hiddenfield('unewfield',''). &hiddenfield('unewformula','')); } @@ -1038,19 +1098,19 @@ ENDSCRIPT # ---------------------------------------- Read new sheet or modified worksheet my $sheetone=initsheet(); + $r->uri=~/\/(\w+)$/; + &settype($sheetone,$1); if ($ENV{'form.unewfield'}) { $r->print('