Parent Directory
|
Revision Log
rewriten allowing png mode and error checking
1 #!/usr/local/bin/webwork-perl 2 3 use strict; 4 ## $Id$ 5 6 7 ################################################################ 8 # Copyright @1995-2002 by Michael E. Gage, Arnold K. Pizer and 9 # WeBWorK at the University of Rochester. All rights reserved. 10 ################################################################ 11 12 ## precreate.pl 13 ## 14 ## pre-creates latex2html or dvipng output for each student for a problem set 15 ## so that WeBWorK doesn't have to run latex2html or dvipng in processProblems 16 17 ## NOTE: problem set has to be built before precreating... 18 19 use CGI; 20 use Global; 21 use TimeLocal; 22 use PGtranslator; 23 use ImageGenerator; 24 25 sub precreate { 26 27 my $type = shift; 28 my ($mode, $courseID,$fileName, $probNumber, $lowerLimit, $upperLimit); 29 30 if ($type eq 'set') { 31 ($mode, $courseID, $fileName, $lowerLimit, $upperLimit) = @_; 32 } 33 elsif ($type eq 'prob') { 34 ($mode, $courseID,$fileName, $probNumber, $lowerLimit, $upperLimit) = @_; 35 } 36 else { 37 die "Unknown parameter $type passed to subroutine precreate, stopped"; 38 } 39 40 &Global::getCourseEnvironment($courseID); 41 42 my $databaseDirectory = getCourseDatabaseDirectory(); 43 my $htmlDirectory = getCourseHtmlDirectory(); 44 my $htmlURL = getCourseHtmlURL(); 45 my $scriptDirectory = getWebworkScriptDirectory(); 46 my $templateDirectory = getCourseTemplateDirectory(); 47 my $courseScriptsDirectory = getCourseScriptsDirectory(); 48 my $tempDirectory = getCourseTempDirectory(); 49 50 require "${courseScriptsDirectory}$Global::displayMacros_pl"; 51 require "${scriptDirectory}$Global::DBglue_pl"; 52 require "${scriptDirectory}$Global::classlist_DBglue_pl"; 53 require "${scriptDirectory}$Global::FILE_pl"; 54 require "${scriptDirectory}$Global::HTMLglue_pl"; 55 56 #################################################################### 57 # load the modules to be used in PGtranslator 58 require "${courseScriptsDirectory}PG_module_list.pl"; 59 #################################################################### 60 61 $fileName = ${templateDirectory} . $fileName; 62 63 my $starttime = time; 64 my ($name); 65 my ($setNumber,$setHeaderFileName,$probHeaderFileName,$dueDate,$openDate,$answerDate,$problemListref,$problemValueListref,$problemAttemptLimitListref,$problemContinuationFlagListRef) 66 = &readSetDef($fileName); 67 my @problemList = @$problemListref; 68 # my @problemValueList = @$problemValueListref; 69 # my @problemAttemptLimitList = @$problemAttemptLimitListref; 70 71 72 my $numProbs=0; 73 foreach $name (@problemList) 74 {$numProbs++;} 75 76 my @setProbSetKeys = &getAllProbSetKeysForSet($setNumber); 77 #sort the ProbSetKeys to make it easier to keep track of what's happening 78 @setProbSetKeys = sort {$a <=> $b} @setProbSetKeys; 79 80 # my $mode = 'HTML_dpng'; 81 my ($ii,$psvn); 82 my @saveSubmittedAnswerList = (); 83 my ($login_name_for_psvn); 84 85 foreach $psvn (@setProbSetKeys) { 86 next if ((defined $lowerLimit) and ($psvn < $lowerLimit)); 87 next if ((defined $upperLimit) and ($psvn > $upperLimit)); 88 89 &attachProbSetRecord($psvn); 90 $login_name_for_psvn = &getStudentLogin($psvn); 91 attachCLRecord($login_name_for_psvn); 92 93 print "In foreach: key = $psvn\n"; 94 for($ii=1; $ii<=$numProbs; $ii++) { 95 next if (($type eq 'prob') and ($ii != $probNumber)); 96 print "In for key = $psvn .... i = $ii\n"; 97 98 my $source; 99 my $probFileName = &getProblemFileName($ii,$psvn);; 100 if (-e "${templateDirectory}$probFileName" ) { 101 unless (-r "${templateDirectory}$probFileName") { 102 wwerror($0, "Can't read ${templateDirectory}$probFileName"); 103 } 104 open(PROB,"<${templateDirectory}$probFileName"); 105 $source = join("",<PROB>); 106 close(PROB); 107 } 108 ############################################### 109 # Create problem text 110 ############################################### 111 my %envir=defineProblemEnvir($mode,$ii,$psvn,$courseID,\@saveSubmittedAnswerList); 112 113 ###### New Code contributed by Bill Wheeler ############ 114 ####### to fix memory leak 115 my $pid=fork(); 116 if ($pid) { 117 waitpid($pid,0); 118 exit 1 if $?; ## exit main program if there was an error in the child process 119 } 120 else { 121 122 my $pt = new PGtranslator; #pt stands for problem translator; 123 $pt -> evaluate_modules( @{main::modules_to_evaluate}); 124 $pt -> load_extra_packages(@{main::extra_packages_to_be_loaded}); 125 # The variables in the two preceding lines are defined in PG_module_list.pl at Indiana. 126 127 my $imgen=""; 128 if($mode eq 'HTML_dpng') { 129 $imgen = new ImageGenerator; 130 $imgen->initialize(\%envir); 131 } 132 $envir{imagegen} = $imgen; 133 134 $pt->environment(\%envir); 135 $pt->initialize(); 136 $pt-> set_mask(); 137 $pt->source_string($source); 138 $pt -> unrestricted_load("${courseScriptsDirectory}PG.pl"); 139 $pt -> unrestricted_load("${courseScriptsDirectory}dangerousMacros.pl"); 140 $pt -> rf_safety_filter( \&safetyFilter); # install blank safety filter 141 $pt ->translate(); 142 143 if ($mode eq 'Latex2HTML') { 144 &createDisplayedProblem($setNumber,$ii,$psvn,$pt->ra_text(), $pt->rh_flags()); 145 } 146 if($mode eq 'HTML_dpng') { 147 my $forceRefresh=0; 148 $imgen->render('refresh'=>$forceRefresh); # Can force new images 149 } 150 if ($pt ->rh_flags->{'error_flag'}) { # print out error and exit 151 print "\n\nProblem $ii in $setNumber for PSVN $psvn has the following error:\n\n"; 152 print @{ $pt->ra_text() }; 153 exit(1); 154 } 155 undef($pt); 156 ## remove any links to gifs. These are not needed and when created by a script run from 157 ## the command line, they are invalid if the webserver is in a chroot enviroment 158 unlink(<$tempDirectory/gif/*${psvn}-set${setNumber}*prob${ii}*>); 159 unlink(<$tempDirectory/eps/*${psvn}-set${setNumber}*prob${ii}*>); 160 ############## New Code ######################## 161 exit(0); 162 } 163 } 164 } 165 166 167 168 169 my $endtime = time; 170 my $totaltime = ($endtime - $starttime)/60; 171 172 print "\n\nThis took $totaltime minutes to precreate $fileName \n\n"; 173 } 174 175 176 sub defineProblemEnvir { 177 my ($mode,$probNum,$psvn,$courseName,$refSubmittedAnswers) = @_; 178 my %envir=(); 179 my $loginName = &getStudentLogin($psvn); 180 ##how to put an array submittedAnswers in a hash?? 181 $envir{'refSubmittedAnswers'} = $refSubmittedAnswers if defined($refSubmittedAnswers); 182 $envir{'psvnNumber'} = $psvn; 183 $envir{'psvn'} = $psvn; 184 $envir{'studentName'} = &CL_getStudentName($loginName); 185 $envir{'studentID'} = &CL_getStudentID($loginName); 186 $envir{'studentLogin'} = $loginName; 187 $envir{'sectionName'} = &CL_getClassSection($loginName); 188 $envir{'sectionNumber'} = &CL_getClassSection($loginName); 189 $envir{'recitationName'} = &CL_getClassRecitation($loginName); 190 $envir{'recitationNumber'} = &CL_getClassRecitation($loginName); 191 $envir{'setNumber'} = &getSetNumber($psvn); 192 $envir{'questionNumber'} = $probNum; 193 $envir{'probNum'} = $probNum; 194 $envir{'openDate'} = &getOpenDate($psvn); 195 $envir{'formattedOpenDate'} = &formatDateAndTime(&getOpenDate($psvn)); 196 $envir{'dueDate'} = &getDueDate($psvn); 197 $envir{'formattedDueDate'} = &formatDateAndTime(&getDueDate($psvn)); 198 $envir{'answerDate'} = &getAnswerDate($psvn); 199 $envir{'formattedAnswerDate'} = &formatDateAndTime(&getAnswerDate($psvn)); 200 $envir{'problemValue'} = &getProblemValue($probNum,$psvn); 201 $envir{'fileName'} = &getProblemFileName($probNum,$psvn); 202 $envir{'probFileName'} = &getProblemFileName($probNum,$psvn ); 203 $envir{'displayMode'} = $mode; 204 $envir{'languageMode'} = $mode; 205 $envir{'outputMode'} = $mode; 206 $envir{'courseName'} = $courseName; 207 $envir{'sessionKey'} = ( defined($main::in{'key'}) ) ?$main::in{'key'} : " "; 208 209 210 # initialize constants for PGanswermacros.pl 211 $envir{'numRelPercentTolDefault'} = getNumRelPercentTolDefault(); 212 $envir{'numZeroLevelDefault'} = getNumZeroLevelDefault(); 213 $envir{'numZeroLevelTolDefault'} = getNumZeroLevelTolDefault(); 214 $envir{'numAbsTolDefault'} = getNumAbsTolDefault(); 215 $envir{'numFormatDefault'} = getNumFormatDefault(); 216 $envir{'functRelPercentTolDefault'} = getFunctRelPercentTolDefault(); 217 $envir{'functZeroLevelDefault'} = getFunctZeroLevelDefault(); 218 $envir{'functZeroLevelTolDefault'} = getFunctZeroLevelTolDefault(); 219 $envir{'functAbsTolDefault'} = getFunctAbsTolDefault(); 220 $envir{'functNumOfPoints'} = getFunctNumOfPoints(); 221 $envir{'functVarDefault'} = getFunctVarDefault(); 222 $envir{'functLLimitDefault'} = getFunctLLimitDefault(); 223 $envir{'functULimitDefault'} = getFunctULimitDefault(); 224 $envir{'functMaxConstantOfIntegration'} = getFunctMaxConstantOfIntegration(); 225 $envir{'numOfAttempts'} = undef; 226 227 # defining directorys and URLs 228 $envir{'templateDirectory'} = &getCourseTemplateDirectory(); 229 $envir{'classDirectory'} = $Global::classDirectory; 230 $envir{'cgiDirectory'} = $Global::cgiDirectory; 231 $envir{'cgiURL'} = getWebworkCgiURL(); 232 $envir{'macroDirectory'} = getCourseMacroDirectory(); 233 $envir{'courseScriptsDirectory'} = getCourseScriptsDirectory(); 234 $envir{'htmlDirectory'} = getCourseHtmlDirectory(); 235 $envir{'htmlURL'} = getCourseHtmlURL(); 236 $envir{'tempDirectory'} = getCourseTempDirectory(); 237 $envir{'tempURL'} = getCourseTempURL(); 238 $envir{'scriptDirectory'} = $Global::scriptDirectory; 239 $envir{'webworkDocsURL'} = $Global::webworkDocsURL; 240 $envir{'externalTTHPath'} = $Global::externalTTHPath; 241 242 $envir{'inputs_ref'} = {user => 'practice1',course => 'demoCourse', key => ' '}; 243 # no inputs when in this mode 244 my $seed = &getProblemSeed($probNum, $psvn); 245 $seed = 0 unless defined($seed); 246 247 $envir{'problemSeed'} = $seed if defined($seed); 248 249 my $k; 250 foreach $k (keys %Global::PG_environment ) { 251 $envir{$k} = $Global::PG_environment{$k}; 252 } 253 %envir; 254 } 255 1;
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |