--- 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,