--- loncom/homework/Attic/lonproblem.pm 2000/01/21 20:01:28 1.1 +++ loncom/homework/Attic/lonproblem.pm 2000/02/22 21:32:17 1.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Problem Handler # -# 12/15-01/21 Gerd Kortemeyer +# 12/15-01/21,01/24 Gerd Kortemeyer package Apache::lonproblem; @@ -37,14 +37,18 @@ print "\n---------------\n$outstring\n"; return 1; #change to ok } +# ============================================================================= # ============================================================= Parsing Routine # Takes $parsestring and $target +# ============================================================================= sub xmlparse { my ($r,$parsestring,$target) = @_; -my $safeeval = new Safe; +my $safeeval = new Safe 'Script'; + +my $parsereval = new Safe 'Parser'; my $parser=HTML::TokeParser->new(\$parsestring); @@ -54,30 +58,31 @@ my $outtext=''; my %toptoplevel = ( 'problem' => 'Problem', 'entryform' => 'Entry Form', - 'survey' => 'Survey' ); + 'survey' => 'Survey', + 'graded' => 'Manually Graded' ); -my %answertags = ( 'item' => 'Question Item', - 'inlinetext' => 'Inline Text' ); -my %includetags = ( 'codelib' => 'Code Library' ); +# --------------------------------------------------------------- Toplevel Tags my %topleveltags = ( 'block' => 'Condition Block', - 'answer' => 'Answer Field', + 'part' => 'Problem Part'; 'include' => 'Include Section', + 'answer' => 'Answerfield'; 'script' => 'Script', 'outtext' => 'Text Block' ); + +# ---------------------------------------------------------- Preregistered Tags -my %xmltags = ( %answertags, %includetags, - %topleveltags, %toptoplevel ); +my %includetags = ( 'scriptlib' => 'Script Library', + 'parserlib' => 'Parser Library' ); + +# -------------------------------------------------------------------- All Tags + +my %xmltags = ( %includetags, %topleveltags, %toptoplevel ); my $toplevel = ''; my $above = ''; -my %answertypes = ( 'true_false' => 'True/False', - 'multiple_choice' => 'Multiple Choice', - 'numerical' => 'Numerical', - 'numerical_units' => 'Numerical with Units' ); - # --------------------------------------------------- Depth counter for editing my @depthcounter=(); @@ -90,17 +95,17 @@ my @stack=(''); # -------------------------------------------------------------- Init $saveeval -if ($target eq 'web') { - &init_safeeval($safeeval); -} +&init_safeeval($safeeval); # ---------------------------------------------------------- Parse $parsestring my $token; while ($token=$parser->get_token) { +# ============================================================================= if ($token->[0] eq 'S') { -# ------------------------------------------------------------------- Start Tag +# =================================================================== Start Tag +# --------------------------------------------------------------- Depth Counter if (defined($xmltags{$token->[1]})) { if ($depth<$olddepth-1) { $#depthcounter--; @@ -112,6 +117,9 @@ while ($token=$parser->get_token) { $olddepth=$depth; } } +# ----------------------------------------------------------------------------- + + if ($target eq 'web') { my $sub="start_$token->[1]"; { @@ -123,6 +131,7 @@ while ($token=$parser->get_token) { } } } + if ($target eq 'edit') { my $depthlabel=join('_',@depthcounter); if (defined($xmltags{$token->[1]})) { @@ -148,10 +157,14 @@ while ($token=$parser->get_token) { $stack[$#stack].=$token->[4]; } } + if ($target eq 'modified') { } + +# ============================================================================= } elsif ($token->[0] eq 'E') { -# --------------------------------------------------------------------- End Tag +# ===================================================================== End Tag + if ($target eq 'web') { my $sub="end_$token->[1]"; { @@ -163,6 +176,7 @@ while ($token=$parser->get_token) { } } } + if ($target eq 'edit') { if (defined($xmltags{$token->[1]})) { my $sub="end_edit_$token->[1]"; @@ -174,11 +188,15 @@ while ($token=$parser->get_token) { } } } + if ($target eq 'modified') { } +# --------------------------------------------------------------- Depth Counter if (defined($xmltags{$token->[1]})) { $depth--; } +# ----------------------------------------------------------------------------- +# ============================================================================= } elsif ($token->[0] eq 'T') { -# ------------------------------------------------------------------------ Text +# ================================================================= Parsed Text $stack[$#stack].=$token->[1]; } } @@ -187,21 +205,9 @@ return $outtext; } # ============================================================================= -# -------------------------------------------- Initialize routines in $safeeval - -sub init_safeeval { - my $safeeval=shift; - my $initprg=<<'ENDINIT'; - -# -------------------------------------------- Initializations inside $safeeval +# --------------------------------------------------------------- Execute Token -$e=25; -$c=20; -ENDINIT -# ---------------------------------------------------------------- Execute that - $safeeval->reval($initprg); -} # ------------------------------------------------- Helper Routines for Editing @@ -226,31 +232,62 @@ sub insertmenu { } &rawprint($r,"\n".'
'."\n"); } - -# ----------------------------------------------- Helper Routines for Renderers + +# ============================================================================= +# ================================================ Routines for Safe Evaluation +# ============================================================================= + +# -------------------------------------------- Initialize routines in $safeeval + +sub init_safeeval { + my $safeeval=shift; + my $initprg=<<'ENDINIT'; + +# -------------------------------------------- Initializations inside $safeeval + +$e=25; +$c=20; + +ENDINIT +# ---------------------------------------------------------------- Execute that + $safeeval->reval($initprg); +} + +# ----------------------------------------------- Routines that use Safe Spaces sub printout { - my ($r,$data,$safeeval)=@_; - $r->print($safeeval->reval('return qq('.$data.');')); + my ($r,$data,$safespace)=@_; + $r->print($safespace->reval('return qq('.$data.');')); } sub runfile { - my ($r,$filename,$safeeval)=@_; - my $includespath=$r->dir_config('lonIncludes'); - $safeeval->rdo($includespath.'/'.$filename); + my ($r,$filename,$safespace)=@_; + my $includefile; + if ($filename=~/^\//) { + $includefile=$filename; + } else { + $includefile=$r->dir_config('lonIncludes'); + $includefile.='/'.$filename; + } + if (-e $includefile) { + $safespace->rdo($includefile); + } } sub run { - my ($expression,$safeeval)=@_; - $safeeval->reval($expression); + my ($expression,$safespace)=@_; + $safespace->reval($expression); } sub booleanexpr { - my ($expression,$safeeval)=@_; - return $safeeval->reval('return '.$expression.';'); + my ($expression,$safespace)=@_; + return $safespace->reval('return '.$expression.';'); } -# -------------------------------------------------- Tag Handlers for Rendering + +# ============================================================================= +# ================================================== Tag Handlers for Rendering +# ============================================================================= sub start_block { my ($r,$token,$parser,$safeeval,$stackref)=@_; @@ -301,11 +338,17 @@ sub end_inlinetext { &end_outtext(@_); } -sub start_codelib { +sub start_scriptlib { + my ($r,$token,$parser,$safeeval,$stackref)=@_; + &runfile($r,$parser->get_text('/scriptlib'),$safeeval); +} + +sub start_parserlib { my ($r,$token,$parser,$safeeval,$stackref)=@_; - &runfile($r,$parser->get_text('/codelib'),$safeeval); + &runfile($r,$parser->get_text('/parserlib'),$parsereval); } + sub start_answer { my ($r,$token,$parser,$safeeval,$stackref)=@_; $stackref->[$#$stackref+1]='::'. @@ -333,7 +376,9 @@ sub start_item { sub end_item {} -# ------------------------------------------------------------ Edit Tag Handler +# ============================================================================= +# ==================================================== Tag Handlers for Editing +# ============================================================================= sub start_edit_outtext { my ($r,$token,$parser,$description,$depthlabel,$above,$answertyperef,