[system] / branches / rel-2-4-patches / webwork-modperl / lib / WeBWorK / PG.pm Repository:
ViewVC logotype

View of /branches/rel-2-4-patches/webwork-modperl/lib/WeBWorK/PG.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 415 - (download) (as text) (annotate)
Wed Jun 26 13:33:59 2002 UTC (10 years, 10 months ago) by sh002i
Original Path: trunk/webwork-modperl/lib/WeBWorK/PG.pm
File size: 7185 byte(s)
stuff i've been working on.
-sam

    1 package WeBWork::PG;
    2 
    3 # hide PG::* from the not-yet-insane.
    4 
    5 use strict;
    6 use warnings;
    7 use WeBWorK::Utils qw(readFile formatDateTime);
    8 use WeBWorK::DB::Classlist;
    9 use WeBWorK::DB::WW;
   10 use WeBWorK::PG::Translator;
   11 
   12 sub new($$$$$$) {
   13   my $invocant = shift;
   14   my $class = ref($invocant) || $invocant;
   15 
   16   my $courseEnv = shift;
   17   my $userName = shift;
   18   my $setName = shift;
   19   my $problemNumber = shift;
   20   my $formData = shift;
   21 
   22   # get database information
   23   my $classlist = WeBWorK::DB::Classlist->new($courseEnv);
   24   my $wwdb = WeBWorK::DB::WW->new($courseEnv);
   25   my $user = $classlist->getUser($userName);
   26   my $set = $wwdb->getSet($userName, $setName);
   27   my $problem = $wwdb->getProblem($userName, $setName, $problemNumber);
   28   my $psvn = $wwdb->getPSVN($userName, $setName);
   29 
   30   # create a Translator
   31   my $translator = WeBWorK::PG::Translator->new;
   32 
   33   # give it a directory hash
   34   $translator->rh_directories({
   35     courseScriptsDirectory => $courseEnv->{webworkDirs}->{macros},
   36     macroDirectory         => $courseEnv->{courseDirs}->{macros},
   37     templateDirectory      => $courseEnv->{courseDirs}->{templates},
   38     tempDirectory          => $courseEnv->{courseDirs}->{html_temp},
   39   });
   40 
   41   # give it modules to evaluate
   42   # give it "extra packages" to load
   43   my $modules = $courseEnv->{pg}->{modules};
   44   foreach $module (keys %$modules) {
   45     my $main_package_loaded = 0;
   46     foreach $package (@{$modules->{$module}}) {
   47       if ($package eq $module) {
   48         # this is the main package
   49         $translator->evaluate_modules($package);
   50         $main_package_loaded = 1;
   51       } else {
   52         # this is an "extra" package
   53         if ($main_package_loaded) {
   54           $translator->load_extra_packages($package);
   55         } else {
   56         warn "Can't load extra package $package: module $module hasn't been evaluated.";
   57         }
   58 
   59       }
   60     }
   61   }
   62 
   63   # give it an environment (from defineProblemEnvir)
   64   $translator->environment(
   65     defineProblemEnvir($courseEnv, $user, $set, $problem, $psvn, $formData)
   66   );
   67 
   68   # initialize it
   69   $translator->initialize();
   70 
   71   # have it "unrestricted load" PG.pl and dangerousMacros.pl
   72   my $pg_pl = $courseEnv->{webworkDirs}->{macros} . "/PG.pl";
   73   my $dangerousMacros_pl = $courseEnv->{webworkDirs}->{macros} . "/dangerousMacros.pl"
   74   my $err = $translator->unrestricted_load($pg_pl);
   75   warn "Error while loading $pg_pl: $err" if $err;
   76   $err = $translator->unrestricted_load($dangerousMacros_pl);
   77   warn "Error while loading $dangerousMacros_pl: $err" if $err;
   78 
   79   # give it an opcode mask (using default values)
   80   $translator->set_mask();
   81 
   82   # give it the problem source
   83   my $sourceFile = $courseEnv->{courseDirs}->{templates}."/".$problem->source_file;
   84   $translator->source_string(readFile($sourceFile));
   85 
   86   # install a safety filter (&safetyFilter)
   87   $translator->rf_safety_filter(\&safetyFilter);
   88 
   89   # translate the PG source into text
   90   $translator->translate();
   91 
   92   # install a grader
   93   my $grader = $courseEnv->{pg}->{grader};
   94   $translator->rf_problem_grader(\&FIXME); # *** need a coderef!
   95 
   96   # process student answers (if any)
   97   $translator->process_answers($formData);
   98 
   99   # a PG object is a REFERENCE to a Translator object
  100   return bless \$translator, $class;
  101 }
  102 
  103 # -----
  104 
  105 sub defineProblemEnvir($$$$$$) {
  106   my $courseEnv = shift;
  107   my $user = shift;
  108   my $set = shift;
  109   my $problem = shift;
  110   my $psvn = shift;
  111   my $form = shift;
  112 
  113   my %envir;
  114 
  115   # PG environment variables
  116   # from docs/pglanguage/pgreference/environmentvariables as of 06/25/2002
  117   # any changes are noted by "ADDED:" or "REMOVED:"
  118 
  119   # Vital state information
  120   # ADDED: displayHintsQ, displaySolutionsQ, externalTTHPath
  121 
  122   $envir{psvn}              = $psvn;
  123   $envir{psvnNumber}        = $envir{psvn};
  124   $envir{probNum}           = $problem->id;
  125   $envir{questionNumber}    = $envir{probNum};
  126   $envir{fileName}          = $problem->source_file;
  127   $envir{probFileName}      = $envir{fileName};
  128   $envir{problemSeed}       = $problem->problem_seed;
  129   $envir{displayMode}       = $form->param('Mode');
  130   $envir{languageMode}      = $envir{displayMode};
  131   $envir{outputMode}        = $envir{displayMode};
  132   $envir{displayHintsQ}     = $form->param('ShowHint');
  133   $envir{displaySolutionsQ} = $form->param('ShowSol');
  134   $envir{externalTTHPath}   = $courseEnv->{externalPrograms}->{tth};
  135 
  136   # Problem Information
  137   # ADDED: courseName
  138 
  139   $envir{openDate}            = $set->open_date;
  140   $envir{formattedOpenDate}   = formatDateTime $envir{openDate};
  141   $envir{dueDate}             = $set->due_date;
  142   $envir{formattedDueDate}    = formatDateTime $envir{dueDate};
  143   $envir{answerDate}          = $set->answer_date;
  144   $envir{formattedAnswerDate} = formatDateTime $envir{answerDate};
  145   $envir{numOfAttempts}       = $problem->num_correct + $problem->num_incorrect;
  146   $envir{problemValue}        = $problem->value;
  147   $envir{sessionKey}          = $form->param('key');
  148   $envir{courseName}          = $courseEnv->{courseName};
  149 
  150   # Student Information
  151   # ADDED: studentID
  152 
  153   $envir{sectionName}      = $user->section;
  154   $envir{sectionNumber}    = $envir{sectionName};
  155   $envir{recitationName}   = $user->recitation;
  156   $envir{recitationNumber} = $envir{recitationName};
  157   $envir{setNumber}        = $set->id;
  158   $envir{studentLogin}     = $user->id;
  159   $envir{studentName}      = $user->first_name . " " . $user->last_name;
  160   $envir{studentID}        = $user->student_id
  161 
  162   # Answer Information
  163 
  164   $envir{inputs_ref}          = {}; # *** keys like "Answer1"
  165   $envir{refSubmittedAnswers} = {}; # *** keys like "AnSwEr1"
  166 
  167   # Default values for evaluating answers
  168 
  169   my $ansEvalDefaults = $courseEnv->{pg}->{ansEvalDefaults};
  170   $envir{$_} = $ansEvalDefaults->{$_} foreach (keys %$ansEvalDefaults);
  171 
  172   # Directories and URLs
  173   # REMOVED: courseName
  174 
  175   $envir{cgiDirectory}           = undef;
  176   $envir{cgiURL}                 = undef;
  177   $envir{classDirectory}         = undef;
  178   $envir{courseScriptsDirectory} = $courseEnv->{webworkDirs}->{macros};
  179   $envir{htmlDirectory}          = $courseEnv->{courseDirs}->{html};
  180   $envir{htmlURL}                = $courseEnv->{courseURLs}->{html};
  181   $envir{macroDirectory}         = $courseEnv->{courseDirs}->{macros};
  182   $envir{templateDirectory}      = $courseEnv->{courseDirs}->{templates};
  183   $envir{tempDirectory}          = $courseEnv->{courseDirs}->{html_temp};
  184   $envir{tempURL}                = $courseEnv->{courseURLs}->{html_temp};
  185   $envir{scriptDirectory}        = undef;
  186   $envir{webworkDocsURL}         = $courseEnv->{webworkURLs}->{docs};
  187 
  188   return \%envir;
  189 }
  190 
  191 sub safetyFilter {
  192   my $answer = shift; # accepts one answer and checks it
  193   my $submittedAnswer = $answer;
  194   $answer = '' unless defined $answer;
  195   my ($errorno);
  196   $answer =~ tr/\000-\037/ /;
  197   # Return if answer field is empty
  198   unless ($answer =~ /\S/) {
  199     #$errorno = "<BR>No answer was submitted.";
  200     $errorno = 0;  ## don't report blank answer as error
  201     return ($answer,$errorno);
  202   }
  203   # replace ^ with **    (for exponentiation)
  204   # $answer =~ s/\^/**/g;
  205   # Return if  forbidden characters are found
  206   unless ($answer =~ /^[a-zA-Z0-9_\-\+ \t\/@%\*\.\n^\(\)]+$/ )  {
  207     $answer =~ tr/a-zA-Z0-9_\-\+ \t\/@%\*\.\n^\(\)/#/c;
  208     $errorno = "<BR>There are forbidden characters in your answer: $submittedAnswer<BR>";
  209     return ($answer,$errorno);
  210   }
  211   $errorno = 0;
  212   return($answer, $errorno);
  213 }
  214 
  215 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9