--- loncom/interface/Attic/lonspreadsheet.pm 2001/07/20 02:05:33 1.55 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/09/01 20:38:52 1.59 @@ -6,7 +6,7 @@ # 01/01/01,02/01,03/01,19/01,20/01,22/01, # 03/05,03/08,03/10,03/12,03/13,03/15,03/17, # 03/19,03/20,03/21,03/27,04/05,04/09, -# 07/09,07/14 Gerd Kortemeyer +# 07/09,07/14,07/21,09/01 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -87,9 +87,6 @@ undef %c; undef %rl; undef @os; - undef $nfield; - undef $nsheet; - $maxrow=0; $sheettype=''; @@ -311,6 +308,42 @@ sub SUMMIN { return $sum; } +sub expandnamed { + my $expression=shift; + if ($expression=~/^\&/) { + my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/); + my @vars=split(/\W+/,$formula); + my %values=(); + undef %values; + map { + my $varname=$_; + if ($varname=~/\D/) { + $formula=~s/$varname/'$c{\''.$varname.'\'}'/ge; + $varname=~s/$var/\(\\w\+\)/g; + map { + if ($_=~/$varname/) { + $values{$1}=1; + } + } keys %c; + } + } @vars; + if ($func eq 'EXPANDSUM') { + my $result=''; + map { + my $thissum=$formula; + $thissum=~s/$var/$_/g; + $result.=$thissum.'+'; + } keys %values; + $result=~s/\+$//; + return $result; + } else { + return 0; + } + } else { + return '$c{\''.$expression.'\'}'; + } +} + sub sett { %t=(); my $pattern=''; @@ -332,7 +365,7 @@ sub sett { $t{$lb}=~s/\#/$trow/g; $t{$lb}=~s/\.\.+/\,/g; $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{$lb}=~s/(^|[^\"\'])\[(\w+)\]/$1\$c\{\'$2\'\}/g; + $t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } } keys %f; @@ -350,14 +383,14 @@ sub sett { $t{$_}=$f{$_}; $t{$_}=~s/\.\.+/\,/g; $t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{$_}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g; + $t{$_}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } } keys %f; $t{'A0'}=$f{'A0'}; $t{'A0'}=~s/\.\.+/\,/g; $t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{'A0'}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g; + $t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } sub calc { @@ -404,7 +437,7 @@ sub outrowassess { my @cols=(); if ($n) { my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n}); - $cols[0]=$rl{$f{'A'.$n}}.''. + $cols[0]=$rl{$usy}.''. 'Default'; map { @@ -532,12 +565,6 @@ sub getmaxrow { my $safeeval=shift; return $safeeval->reval('$maxrow'); } -# -------------------------------------------- Store which sheet needs changing - -sub changesheet { - my ($safeeval,$nfield,$nsheet)=@_; - $safeeval->reval('$nfield='.$nfield.'; $nsheet='.$nsheet.';'); -} # ---------------------------------------------------------------- Set filename @@ -893,8 +920,10 @@ sub writesheet { # ----------------------------------------------------------------- Write sheet my $sheetdata=''; map { + unless ($f{$_} eq 'import') { $sheetdata.=&Apache::lonnet::escape($_).'='. &Apache::lonnet::escape($f{$_}).'&'; + } } keys %f; $sheetdata=~s/\&$//; my $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.$fn.':'. @@ -962,8 +991,9 @@ sub tmpread { } } if ($nform eq 'changesheet') { + $fo{'A'.$nfield}=(split(/\_\_\&\&\&\_\_/,$fo{'A'.$nfield}))[0]; unless ($ENV{'form.sel_'.$nfield} eq 'Default') { - &changesheet($safeeval,$nfield,$ENV{'form.sel_'.$nfield}); + $fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; } } else { if ($nfield) { $fo{$nfield}=$nform; } @@ -1235,10 +1265,14 @@ sub updatestudentassesssheet { map { if ($_=~/^A(\d+)/) { $maxrow=($1>$maxrow)?$1:$maxrow; - $existing{$f{$_}}=1; - unless ((defined($current{$f{$_}})) || (!$1)) { + my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_}); + $existing{$usy}=1; + unless ((defined($current{$usy})) || (!$1)) { $f{$_}='!!! Obsolete'; $changed=1; + } elsif ($ufn) { + $current{$usy} + =~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn\&usymb\=/; } } } keys %f; @@ -1953,27 +1987,6 @@ ENDSCRIPT } } -# ---------------------------------------------------- See if something to save - - if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { - my $fname=''; - if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { - $fname=~s/\W/\_/g; - if ($fname eq 'default') { $fname='course_default'; } - $fname.='_'.&gettype($asheet); - &setfilename($asheet,$fname); - $ENV{'form.ufn'}=$fname; - $r->print('Saving spreadsheet: '. - &writesheet($asheet,$ENV{'form.makedefufn'}).''); - } - } - -# ------------------------------------------------ Write the modified worksheet - - $r->print('Current sheet: '.&getfilename($asheet).''); - - &tmpwrite($asheet); - # ---------------------------------------------------------- Additional options $r->print( @@ -2062,6 +2075,29 @@ ENDSCRIPT my $calcoutput=&calcsheet($asheet); $r->print(''.$calcoutput.''); +# ---------------------------------------------------- See if something to save + + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + my $fname=''; + if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { + $fname=~s/\W/\_/g; + if ($fname eq 'default') { $fname='course_default'; } + $fname.='_'.&gettype($asheet); + &setfilename($asheet,$fname); + $ENV{'form.ufn'}=$fname; + $r->print('Saving spreadsheet: '. + &writesheet($asheet,$ENV{'form.makedefufn'}).''); + } + } + +# ------------------------------------------------ Write the modified worksheet + + $r->print('Current sheet: '.&getfilename($asheet).''); + + &tmpwrite($asheet); + +# ------------------------------------------------------------- Print out sheet + &outsheet($r,$asheet); $r->print('
Saving spreadsheet: '. - &writesheet($asheet,$ENV{'form.makedefufn'}).'
'); - } - } - -# ------------------------------------------------ Write the modified worksheet - - $r->print('Current sheet: '.&getfilename($asheet).'
'); - - &tmpwrite($asheet); - # ---------------------------------------------------------- Additional options $r->print( @@ -2062,6 +2075,29 @@ ENDSCRIPT my $calcoutput=&calcsheet($asheet); $r->print('
Saving spreadsheet: '. + &writesheet($asheet,$ENV{'form.makedefufn'}).'
'); + } + } + +# ------------------------------------------------ Write the modified worksheet + + $r->print('Current sheet: '.&getfilename($asheet).'
'); + + &tmpwrite($asheet); + +# ------------------------------------------------------------- Print out sheet + &outsheet($r,$asheet); $r->print('