#!/usr/local/bin/webwork-perl use strict; ## $Id$ ################################################################ # Copyright @1995-1998 by Michael E. Gage, Arnold K. Pizer and # WeBWorK at the University of Rochester. All rights reserved. ################################################################ use lib '.'; use webworkInit; # WeBWorKInitLine ## l2hPrecreateProb.pl ## ## pre-creates latex2html output for each student for a single problem ## so that WeBWorK doesn't have to run latex2html in processProblems ## NOTE: problem set has to be built before precreating... ## this is called with arguments classID setdefinitionfile probnumber ## e.g. l2hPrecreateSet.pl demoCourse set1.def 7 use CGI; use Global; use TimeLocal; use PGtranslator; my ($courseID,$fileName, $probNumber, $lowerLimit, $upperLimit) = @ARGV; if( (@ARGV < 3) or (@ARGV > 5) ) { print "\nSyntax is: l2hPrecreateProb.pl course_name set_definition_filename prob_number or\n"; print " l2hPrecreateProb.pl course_name set_definition_filename prob_number lowerLimit or\n"; print " l2hPrecreateProb.pl course_name set_definition_filename prob_number lowerLimit upperLimit\n\n"; print " (e.g. l2hPrecreateProb.pl demoCourse set1.def 2 or\n"; print " (e.g. l2hPrecreateProb.pl demoCourse set1.def 2 30000 or\n"; print " (e.g. l2hPrecreateProb.pl demoCourse set1.def 2 30000 60000\n\n"; print "The Problem is pre created for all psvn's between lower and upper limits if the limits\n"; print " are given.\n\n"; exit(0); } &Global::getCourseEnvironment($courseID); my $databaseDirectory = getCourseDatabaseDirectory(); my $htmlDirectory = getCourseHtmlDirectory(); my $htmlURL = getCourseHtmlURL(); my $scriptDirectory = getWebworkScriptDirectory(); my $templateDirectory = getCourseTemplateDirectory(); my $courseScriptsDirectory = getCourseScriptsDirectory(); my $tempDirectory = getCourseTempDirectory(); require "${courseScriptsDirectory}$Global::displayMacros_pl"; require "${scriptDirectory}$Global::DBglue_pl"; require "${scriptDirectory}$Global::classlist_DBglue_pl"; require "${scriptDirectory}$Global::FILE_pl"; require "${scriptDirectory}$Global::HTMLglue_pl"; #################################################################### # load the modules to be used in PGtranslator require "${courseScriptsDirectory}PG_module_list.pl"; #################################################################### $fileName = ${templateDirectory} . $fileName; my $starttime = time; my ($name); my ($setNumber,$setHeaderFileName,$probHeaderFileName,$dueDate,$openDate,$answerDate,$problemListref,$problemValueListref,$problemAttemptLimitListref) = &readSetDef($fileName); my @problemList = @$problemListref; my @problemValueList = @$problemValueListref; my @problemAttemptLimitList = @$problemAttemptLimitListref; my $numProbs=0; foreach $name (@problemList) {$numProbs++;} my @setProbSetKeys = &getAllProbSetKeysForSet($setNumber); #sort the ProbSetKeys to make it easier to keep track of what's happening @setProbSetKeys = sort {$a <=> $b} @setProbSetKeys; my $mode = 'Latex2HTML'; my ($ii,$psvn); my @saveSubmittedAnswerList = (); my ($seed, $login_name_for_psvn); foreach $psvn (@setProbSetKeys) { next if ((defined $lowerLimit) and ($psvn < $lowerLimit)); next if ((defined $upperLimit) and ($psvn > $upperLimit)); &attachProbSetRecord($psvn); $login_name_for_psvn = &getStudentLogin($psvn); attachCLRecord($login_name_for_psvn); print "In foreach: key = $psvn\n"; for($ii=1; $ii<=$numProbs; $ii++) { next unless $ii == $probNumber; print "In for key = $psvn .... i = $ii\n"; my $source; my $probFileName = &getProblemFileName($ii,$psvn);; if (-e "${templateDirectory}$probFileName" ) { unless (-r "${templateDirectory}$probFileName") { wwerror($0, "Can't read ${templateDirectory}$probFileName"); } open(PROB,"<${templateDirectory}$probFileName"); $source = join("",); close(PROB); } ############################################### # Create problem text ############################################### my %envir=defineProblemEnvir($mode,$ii,$psvn,$courseID,\@saveSubmittedAnswerList); ###### New Code contributed by Bill Wheeler ############ ### to fix memory leak my $pid=fork(); if ($pid) {wait ;} else { my $pt = new PGtranslator; #pt stands for problem translator; $pt->environment(\%envir); $pt->initialize(); $pt-> set_mask(); # $pt -> evaluate_modules(qw( Exporter DynaLoader GD WWPlot Fun Circle Label PGrandom Units ) ); # The modules to be loaded are now defined in PG_modules_list.pl $pt->source_string($source); $pt -> unrestricted_load("${courseScriptsDirectory}PG.pl"); $pt -> unrestricted_load("${courseScriptsDirectory}dangerousMacros.pl"); $pt ->translate(); &createDisplayedProblem($setNumber,$ii,$psvn,$pt->ra_text(), $pt->rh_flags()); undef($pt); ## remove any links to gifs. These are not needed and when created by a script run from ## the command, they are invalid if the webserver is in a chroot enviroment unlink(<$tempDirectory/gif/*${psvn}-set${setNumber}-prob${ii}-*>); ############## New Code ######################## exit(0); } } } my $endtime = time; my $totaltime = ($endtime - $starttime)/60; print "\n\nThis took $totaltime minutes to precreate $fileName \n\n"; sub defineProblemEnvir { my ($mode,$probNum,$psvn,$courseName,$refSubmittedAnswers) = @_; my %envir=(); my $loginName = &getStudentLogin($psvn); ##how to put an array submittedAnswers in a hash?? $envir{'refSubmittedAnswers'} = $refSubmittedAnswers if defined($refSubmittedAnswers); $envir{'psvnNumber'} = $psvn; $envir{'psvn'} = $psvn; $envir{'studentName'} = &CL_getStudentName($loginName); $envir{'studentLogin'} = $loginName; $envir{'sectionName'} = &CL_getClassSection($loginName); $envir{'sectionNumber'} = &CL_getClassSection($loginName); $envir{'recitationName'} = &CL_getClassRecitation($loginName); $envir{'recitationNumber'} = &CL_getClassRecitation($loginName); $envir{'setNumber'} = &getSetNumber($psvn); $envir{'questionNumber'} = $probNum; $envir{'probNum'} = $probNum; $envir{'openDate'} = &getOpenDate($psvn); $envir{'formattedOpenDate'} = &formatDateAndTime(&getOpenDate($psvn)); $envir{'dueDate'} = &getDueDate($psvn); $envir{'formattedDueDate'} = &formatDateAndTime(&getDueDate($psvn)); $envir{'answerDate'} = &getAnswerDate($psvn); $envir{'formattedAnswerDate'} = &formatDateAndTime(&getAnswerDate($psvn)); $envir{'problemValue'} = &getProblemValue($probNum,$psvn); $envir{'fileName'} = &getProblemFileName($probNum,$psvn); $envir{'probFileName'} = &getProblemFileName($probNum,$psvn ); $envir{'displayMode'} = $mode; $envir{'languageMode'} = $mode; $envir{'outputMode'} = $mode; $envir{'courseName'} = $courseName; $envir{'sessionKey'} = ( defined($main::in{'key'}) ) ?$main::in{'key'} : " "; # initialize constants for PGanswermacros.pl $envir{'numRelPercentTolDefault'} = getNumRelPercentTolDefault(); $envir{'numZeroLevelDefault'} = getNumZeroLevelDefault(); $envir{'numZeroLevelTolDefault'} = getNumZeroLevelTolDefault(); $envir{'numAbsTolDefault'} = getNumAbsTolDefault(); $envir{'numFormatDefault'} = getNumFormatDefault(); $envir{'functRelPercentTolDefault'} = getFunctRelPercentTolDefault(); $envir{'functZeroLevelDefault'} = getFunctZeroLevelDefault(); $envir{'functZeroLevelTolDefault'} = getFunctZeroLevelTolDefault(); $envir{'functAbsTolDefault'} = getFunctAbsTolDefault(); $envir{'functNumOfPoints'} = getFunctNumOfPoints(); $envir{'functVarDefault'} = getFunctVarDefault(); $envir{'functLLimitDefault'} = getFunctLLimitDefault(); $envir{'functULimitDefault'} = getFunctULimitDefault(); $envir{'functMaxConstantOfIntegration'} = getFunctMaxConstantOfIntegration(); $envir{'numOfAttempts'} = undef; # defining directorys and URLs $envir{'templateDirectory'} = &getCourseTemplateDirectory(); $envir{'classDirectory'} = $Global::classDirectory; $envir{'cgiDirectory'} = $Global::cgiDirectory; $envir{'cgiURL'} = getWebworkCgiURL(); $envir{'macroDirectory'} = getCourseMacroDirectory(); $envir{'courseScriptsDirectory'} = getCourseScriptsDirectory(); $envir{'htmlDirectory'} = getCourseHtmlDirectory(); $envir{'htmlURL'} = getCourseHtmlURL(); $envir{'tempDirectory'} = getCourseTempDirectory(); $envir{'tempURL'} = getCourseTempURL(); $envir{'scriptDirectory'} = $Global::scriptDirectory; $envir{'webworkDocsURL'} = $Global::webworkDocsURL; $envir{'inputs_ref'} = {user => 'practice1',course => 'demoCourse', key => ' '}; # no inputs when in this mode $seed = &getProblemSeed($probNum, $psvn); $seed = 0 unless defined($seed); $envir{'problemSeed'} = $seed if defined($seed); my $k; foreach $k (keys %Global::PG_environment ) { $envir{$k} = $Global::PG_environment{$k}; } %envir; }