Parent Directory
|
Revision Log
updated copyright header. -sam
1 ################################################################################ 2 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project 3 # $Id$ 4 ################################################################################ 5 6 package WeBWorK::ContentGenerator::Hardcopy; 7 8 =head1 NAME 9 10 WeBWorK::ContentGenerator::Test - generate a PDF version of one or more 11 problem sets. 12 13 =cut 14 15 use strict; 16 use warnings; 17 use base qw(WeBWorK::ContentGenerator); 18 use Apache::Constants qw(:common); 19 use CGI qw(); 20 use WeBWorK::Form; 21 use WeBWorK::Utils qw(readFile); 22 23 sub texBlockComment { return "\n".("%"x80)."\n%% ".join("", @_)."\n".("%"x80)."\n\n"; } 24 25 sub go { 26 my ($self, $singleSet) = @_; 27 $singleSet =~ s/^set//; 28 my $r = $self->{r}; 29 my $ce = $self->{courseEnvironment}; 30 $self->{wwdb} = WeBWorK::DB::WW->new($ce); 31 32 my @sets = $r->param("set"); 33 unshift @sets, $singleSet; 34 return DECLINED unless @sets; 35 36 $r->content_type("text/plain"); 37 $r->send_http_header(); 38 $self->writePDF($singleSet); 39 #$self->{texFH} = \*STDOUT; 40 #$self->writeMultiSetTeX($singleSet); 41 42 return OK; 43 } 44 45 sub writePDF { 46 my ($self, @sets) = @_; 47 my $ce = $self->{courseEnvironment}; 48 my $pdflatex = $ce->{externalPrograms}->{pdflatex}; 49 50 open $self->{texFH}, "|-", "$pdflatex -v2" or die "Failed to call $pdflatex: $!\n"; 51 $self->writeMultiSetTeX(@sets); 52 close $self->{texFH}; 53 } 54 55 sub writeMultiSetTeX { 56 my ($self, @sets) = @_; 57 my $texFH = $self->{texFH}; 58 my $ce = $self->{courseEnvironment}; 59 60 # print the document preamble 61 $self->texInclude($ce->{webworkFiles}->{hardcopySnippets}->{preamble}); 62 63 while (my $set = shift @sets) { 64 $self->getSetTeX($set); 65 if (@sets) { 66 # divide sets, but not after the last set 67 $self->texInclude($ce->{webworkFiles}->{hardcopySnippets}->{setDivider}); 68 } 69 } 70 71 # print the document postamble 72 $self->texInclude($ce->{webworkFiles}->{hardcopySnippets}->{postamble}); 73 } 74 75 sub getSetTeX { 76 my ($self, $setName) = @_; 77 my $texFH = $self->{texFH}; 78 my $ce = $self->{courseEnvironment}; 79 my $wwdb = $self->{wwdb}; 80 my $user = $self->{r}->param("user"); 81 my @problemNumbers = sort { $a <=> $b } $wwdb->getProblems($user, $setName); 82 83 # get header and footer 84 my $setHeader = $wwdb->getSet($user, $setName)->set_header 85 || $ce->{webworkFiles}->{hardcopySnippets}->{setHeader}; 86 my $setFooter = $ce->{webworkFiles}->{hardcopySnippets}->{setFooter}; 87 # database doesn't support the following yet :( 88 #my $setFooter = $wwdb->getSet($user, $setName)->set_footer 89 # || $ce->{webworkFiles}->{hardcopySnippets}->{setFooter}; 90 91 # render header 92 print $texFH texBlockComment("BEGIN $setName : $setHeader"); 93 #print $texFH $self->getProblemTeX($setName, $setHeader); 94 95 # render each problem 96 while (my $problemNumber = shift @problemNumbers) { 97 print $texFH texBlockComment("BEGIN $setName : $problemNumber"); 98 print $texFH $self->getProblemTeX($setName, $problemNumber); 99 if (@problemNumbers) { 100 # divide problems, but not after the last problem 101 $self->texInclude($ce->{webworkFiles}->{hardcopySnippets}->{problemDivider}); 102 } 103 } 104 105 # render footer 106 print $texFH texBlockComment("BEGIN $setName : $setFooter"); 107 print $texFH $self->getProblemTeX($setName, $setFooter); 108 } 109 110 sub getProblemTeX { 111 my ($self, $setName, $problemNumber) = @_; 112 my $r = $self->{r}; 113 my $ce = $self->{courseEnvironment}; 114 115 my $pg = WeBWorK::PG->new( 116 $ce, 117 $r->param('user'), 118 $r->param('key'), 119 $setName, 120 $problemNumber, # this may be non-numeric, for headers and the like 121 { # translation options 122 displayMode => "tex", 123 showHints => 0, 124 showSolutions => 0, 125 processAnswers => 0, 126 }, 127 WeBWorK::Form->new->Vars # this is silly, i should say {} instead 128 ); 129 130 # *** # handle errors/warnings here! 131 return $pg->{body_text}; 132 } 133 134 sub texInclude { 135 my ($self, $texFile) = @_; 136 my $texFH = $self->{texFH}; 137 138 print $texFH texBlockComment("BEGIN: $texFile"); 139 eval { 140 print $texFH readFile($texFile) 141 }; 142 if ($@) { 143 print $texFH texBlockComment($@); 144 } 145 } 146 147 1;
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |