--- loncom/interface/Attic/lonspreadsheet.pm 2002/04/12 21:41:13 1.86 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/07/05 21:44:50 1.96 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.86 2002/04/12 21:41:13 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.96 2002/07/05 21:44:50 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -106,28 +106,19 @@ my %courseopt; my %useropt; my %parmhash; +# +# Some hashes for stats on timing and performance +# + +my %starttimes; +my %usedtimes; +my %numbertimes; + # Stuff that only the screen handler can know my $includedir; my $tmpdir; -# ------------------------------------------------ Send critical message -sub send_crit_msg { - my ($uname,$udom,$subject,$message,$sendback) = @_; - my $result = &Apache::lonmsg::user_crit_msg($uname,$udom,$subject, - $message,$sendback); - return ($result eq 'ok' ? 1 : 0); -} - -# ------------------------------------------------ Send noncritical message -sub send_msg { - my ($uname,$udom,$subject,$message) = @_; - my $result = &Apache::lonmsg::user_normal_msg($uname,$udom, - $subject,$message); - return ($result eq 'ok' ? 1 : 0); -} - - # ============================================================================= # ===================================== Implements an instance of a spreadsheet @@ -139,8 +130,7 @@ sub initsheet { $safeeval->permit("sort"); $safeeval->deny(":base_io"); $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); - $safehole->wrap(\&send_msg, $safeeval,"&send_msg"); - $safehole->wrap(\&send_crit_msg,$safeeval,"&send_crit_msg"); + $safeeval->share('$@'); my $code=<<'ENDDEFS'; # ---------------------------------------------------- Inside of the safe space @@ -184,6 +174,10 @@ $cfn=''; $usymb=''; +# error messages + +$errormsg=''; + sub mask { my ($lower,$upper)=@_; @@ -727,40 +721,6 @@ sub SUMMIN { return $sum; } -#------------------------------------------------------- - -=item SEND_CRIT_MSG(subject,message) - -Send a critical message to a student. - -=cut - -#------------------------------------------------------- -sub SEND_CRIT_MSG { - my ($subject,$message) = @_; - my $name = $uname; - my $dom = $udom; - return (&send_crit_msg($name,$dom,$subject,$message) ? 'Message Sent.' - : 'Error sending message'); -} - -#------------------------------------------------------- - -=item SEND_MSG(subject,message) - -Send a message to a student. - -=cut - -#------------------------------------------------------- -sub SEND_MSG { - my ($subject,$message) = @_; - my $name = $uname; - my $dom = $udom; - return (&send_msg($name,$dom,$subject,$message) ? 'Message Sent.' - : 'Error sending message'); -} - sub expandnamed { my $expression=shift; if ($expression=~/^\&/) { @@ -793,7 +753,25 @@ sub expandnamed { return 0; } } else { - return '$c{\''.$expression.'\'}'; + # it is not a function, so it is a parameter name + # We should do the following: + # 1. Take the list of parameter names + # 2. look through the list for ones that match the parameter we want + # 3. If there are no collisions, return the one that matches + # 4. If there is a collision, return 'bad parameter name error' + my $returnvalue = ''; + my @matches = (); + $#matches = -1; + study $expression; + foreach $parameter (keys(%c)) { + push @matches,$parameter if ($parameter =~ /$expression/); + } + if ($#matches == 0) { + $returnvalue = '$c{\''.$matches[0].'\'}'; + } else { + $returnvalue = "'bad parameter name : $expression'"; + } + return $returnvalue; } } @@ -813,11 +791,17 @@ sub sett { if ($_=~/A(\d+)/) { my $trow=$1; if ($trow) { + # Get the name of this cell my $lb=$col.$trow; + # Grab the template declaration $t{$lb}=$f{'template_'.$col}; + # Replace '#' with the row number $t{$lb}=~s/\#/$trow/g; + # Replace '....' with ',' $t{$lb}=~s/\.\.+/\,/g; + # Replace 'A0' with the value from 'A0' $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; + # Replace parameters $t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } @@ -840,6 +824,8 @@ sub sett { } } } + # For some reason 'A0' gets special treatment... This seems superfluous + # but I imagine it is here for a reason. $t{'A0'}=$f{'A0'}; $t{'A0'}=~s/\.\.+/\,/g; $t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; @@ -847,7 +833,7 @@ sub sett { } sub calc { - %v=(); + undef %v; &sett(); my $notfinished=1; my $depth=0; @@ -855,16 +841,16 @@ sub calc { $notfinished=0; foreach (keys(%t)) { my $old=$v{$_}; - $v{$_}=eval($t{$_}); + $v{$_}=eval $t{$_}; if ($@) { - %v=(); - return $@; + undef %v; + return $_.': '.$@; } if ($v{$_} ne $old) { $notfinished=1; } } $depth++; if ($depth>100) { - %v=(); + undef %v; return 'Maximum calculation depth exceeded'; } } @@ -890,9 +876,11 @@ sub outrowassess { my @cols=(); if ($n) { my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n}); + if ($rl{$usy}) { $cols[0]=$rl{$usy}.'
'. 'print(' checked'); } $r->print('>'); } + +# ------------------------------------------------------------------ Insertrows + + $r->print(< + +
+ENDINSERTBUTTONS + # ------------------------------------------------------------- Print out sheet &outsheet($r,$asheet);