Parent Directory
|
Revision Log
Revision 492 - (view) (download) (as text)
| 1 : | sh002i | 478 | ################################################################################ |
| 2 : | # WeBWorK mod_perl (c) 1995-2002 WeBWorK Team, Univeristy of Rochester | ||
| 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 : | sh002i | 492 | sub texBlockComment { return "\n".("%"x80)."\n%% ".join("", @_)."\n".("%"x80)."\n\n"; } |
| 24 : | |||
| 25 : | sh002i | 478 | 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 : | sh002i | 492 | $self->writePDF($singleSet); |
| 39 : | #$self->{texFH} = \*STDOUT; | ||
| 40 : | #$self->writeMultiSetTeX($singleSet); | ||
| 41 : | sh002i | 478 | |
| 42 : | return OK; | ||
| 43 : | } | ||
| 44 : | |||
| 45 : | sh002i | 492 | sub writePDF { |
| 46 : | my ($self, @sets) = @_; | ||
| 47 : | my $ce = $self->{courseEnvironment}; | ||
| 48 : | my $pdflatex = $ce->{externalPrograms}->{pdflatex}; | ||
| 49 : | sh002i | 478 | |
| 50 : | sh002i | 492 | open $self->{texFH}, "|-", "$pdflatex -v2" or die "Failed to call $pdflatex: $!\n"; |
| 51 : | $self->writeMultiSetTeX(@sets); | ||
| 52 : | close $self->{texFH}; | ||
| 53 : | sh002i | 478 | } |
| 54 : | |||
| 55 : | sh002i | 492 | 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 : | sh002i | 478 | sub getSetTeX { |
| 76 : | my ($self, $setName) = @_; | ||
| 77 : | sh002i | 492 | my $texFH = $self->{texFH}; |
| 78 : | sh002i | 478 | my $ce = $self->{courseEnvironment}; |
| 79 : | my $wwdb = $self->{wwdb}; | ||
| 80 : | my $user = $self->{r}->param("user"); | ||
| 81 : | sh002i | 492 | my @problemNumbers = sort { $a <=> $b } $wwdb->getProblems($user, $setName); |
| 82 : | sh002i | 478 | |
| 83 : | sh002i | 492 | # 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 : | sh002i | 478 | |
| 91 : | sh002i | 492 | # render header |
| 92 : | print $texFH texBlockComment("BEGIN $setName : $setHeader"); | ||
| 93 : | #print $texFH $self->getProblemTeX($setName, $setHeader); | ||
| 94 : | sh002i | 478 | |
| 95 : | # render each problem | ||
| 96 : | sh002i | 492 | 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 : | sh002i | 478 | } |
| 104 : | |||
| 105 : | sh002i | 492 | # render footer |
| 106 : | print $texFH texBlockComment("BEGIN $setName : $setFooter"); | ||
| 107 : | print $texFH $self->getProblemTeX($setName, $setFooter); | ||
| 108 : | sh002i | 478 | } |
| 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 : | sh002i | 492 | $problemNumber, # this may be non-numeric, for headers and the like |
| 121 : | sh002i | 478 | { # translation options |
| 122 : | displayMode => "tex", | ||
| 123 : | showHints => 0, | ||
| 124 : | showSolutions => 0, | ||
| 125 : | processAnswers => 0, | ||
| 126 : | }, | ||
| 127 : | sh002i | 492 | WeBWorK::Form->new->Vars # this is silly, i should say {} instead |
| 128 : | sh002i | 478 | ); |
| 129 : | |||
| 130 : | sh002i | 492 | # *** # handle errors/warnings here! |
| 131 : | sh002i | 478 | return $pg->{body_text}; |
| 132 : | } | ||
| 133 : | |||
| 134 : | sh002i | 492 | 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 : | sh002i | 478 | } |
| 146 : | |||
| 147 : | 1; |
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |