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