--- loncom/interface/Attic/lonspreadsheet.pm 2000/12/04 19:38:35 1.3 +++ loncom/interface/Attic/lonspreadsheet.pm 2000/12/04 22:09:39 1.4 @@ -13,20 +13,29 @@ use Apache::lonnet; use Apache::Constants qw(:common); use HTML::TokeParser; -# -# f: formulas -# t: intermediate format (from f after sett) -# v: output values (from t after calcv) -# -use vars qw(%v %t %f); - -sub deffunc { - my $safeeval=shift; +sub initsheet { + my $safeeval = new Safe; + my $safehole = new Safe::Hole; + $safeeval->permit("entereval"); + $safeeval->permit(":base_math"); + $safeeval->permit("sort"); + $safeeval->deny(":base_io"); + $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); my $code=<<'ENDDEFS'; # ---------------------------------------------------- Inside of the safe space +# +# f: formulas +# t: intermediate format (variable references expanded) +# v: output values +# + +%v=(); +%t=(); +%f=(); + sub mask { my ($lower,$upper)=@_; @@ -91,10 +100,9 @@ sub mask { } } } - return '^'.$alpha.$num.'$'; + return '^'.$alpha.$num."\$"; } - sub NUM { my $mask=mask(@_); my $num=0; @@ -215,14 +223,6 @@ sub SUMMIN { return $sum; } - -# ------------------------------------------- End of "Inside of the safe space" -ENDDEFS - $safeeval->reval($code); -} - -# --------------------------------------------------------- Initialize t from f - sub sett { %t=(); map { @@ -234,18 +234,16 @@ sub sett { } keys %f; } -# ------------------------------------------------------------ Calculate values - -sub calcv { - my $safeeval=shift; +sub calc { %v=(); + &sett(); my $notfinished=1; my $depth=0; while ($notfinished) { $notfinished=0; map { my $old=$v{$_}; - $v{$_}=$safeeval->reval($t{$_}); + $v{$_}=eval($t{$_}); if ($@) { %v=(); return $@; @@ -261,11 +259,45 @@ sub calcv { return ''; } +# ------------------------------------------- End of "Inside of the safe space" +ENDDEFS + $safeeval->reval($code); + return $safeeval; +} + +# ------------------------------------------------ Add or change formula values + +sub setformulas { + my ($safeeval,@f)=@_; + $safeeval->reval('%f=(%f,'."('".join("','",@f)."'));"); +} + +# ------------------------------------------------------- Calculate spreadsheet + +sub calcsheet { + my $safeeval=shift; + $safeeval->reval('&calc();'); +} + +# ------------------------------------------------------------------ Get values + +sub getvalues { + my $safeeval=shift; + return $safeeval->reval('%v'); +} + +# ---------------------------------------------------------------- Get formulas + +sub getformulas { + my $safeeval=shift; + return $safeeval->reval('%f'); +} + # ------------------------------------------------------------ Read spreadsheet sub readf { my $fn=shift; - %f=(); + my %f=(); my $content; { my $fh=Apache::File->new($fn); @@ -313,26 +345,6 @@ sub readmeta { } -# ------------------------------------------------------------ Returns safeeval - -sub init { - - %v=(); - %t=(); - %f=(); - my $safeeval = new Safe; - my $safehole = new Safe::Hole; - $safeeval->permit("entereval"); - $safeeval->permit(":base_math"); - $safeeval->permit("sort"); - $safeeval->deny(":base_io"); - $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); - $safeeval->share('%v','%t','%f'); - &deffunc($safeeval); - - return $safeeval; -} - # ----------------------------------------------------------------------------- sub handler { @@ -345,31 +357,17 @@ sub handler { $r->print('LON-CAPA Spreadsheet'); $r->print(''); - my $safeeval=init(); + my $sheetone=initsheet(); - $f{'A3'}=5; - $f{'A4'}=3; - $f{'A5'}=8; - $f{'E100'}=5; - $f{'C3'}='A3+6'; - $f{'B4'}='8+int(C3/3)'; - $f{'C7'}='A3+B4'; - $f{'G8'}='MEAN("E*")'; - $f{'G5'}='A3+SUMMIN(2,"A*")'; - $f{'G6'}='A3+SUM("A*")'; - $f{'G7'}='STDDEV("A*")'; - $f{'G9'}='NUM("G*")'; - $f{'H10'}='MEAN("E*")'; - $f{'G10'}='BIN(3,5,"A*")'; - &sett(); - $r->print(&calcv($safeeval)."\n"); - $r->print($v{'C7'}."\n"); - $r->print($t{'G5'}.' - '.$v{'G5'}."\n"); - $r->print($t{'G6'}.' - '.$v{'G6'}."\n"); - $r->print($t{'G7'}.' - '.$v{'G7'}."\n"); - $r->print($t{'G8'}.' - '.$v{'G8'}."\n"); - $r->print($t{'G9'}.' - '.$v{'G9'}."\n"); - $r->print($t{'G10'}.' - '.$v{'G10'}."\n"); + &setformulas($sheetone,('A1' => '5', 'B2' => '6', 'C4' => 'A1+B2')); + $r->print(&calcsheet($sheetone)); + my %output=&getformulas($sheetone); + + $r->print('FORM:'.$output{'A1'}.' '.$output{'B2'}.' '.$output{'C4'}); + + my %output=&getvalues($sheetone); + + $r->print('
OUT:'.$output{'A1'}.' '.$output{'B2'}.' '.$output{'C4'}); $r->print(''); return OK;