| … | |
… | |
| 18 | use Apache::Constants qw(:common); |
18 | use Apache::Constants qw(:common); |
| 19 | use CGI qw(); |
19 | use CGI qw(); |
| 20 | use WeBWorK::Form; |
20 | use WeBWorK::Form; |
| 21 | use WeBWorK::Utils qw(readFile); |
21 | use WeBWorK::Utils qw(readFile); |
| 22 | |
22 | |
|
|
23 | sub texBlockComment { return "\n".("%"x80)."\n%% ".join("", @_)."\n".("%"x80)."\n\n"; } |
|
|
24 | |
| 23 | sub go { |
25 | sub go { |
| 24 | my ($self, $singleSet) = @_; |
26 | my ($self, $singleSet) = @_; |
| 25 | $singleSet =~ s/^set//; |
27 | $singleSet =~ s/^set//; |
| 26 | my $r = $self->{r}; |
28 | my $r = $self->{r}; |
| 27 | my $ce = $self->{courseEnvironment}; |
29 | my $ce = $self->{courseEnvironment}; |
| … | |
… | |
| 31 | unshift @sets, $singleSet; |
33 | unshift @sets, $singleSet; |
| 32 | return DECLINED unless @sets; |
34 | return DECLINED unless @sets; |
| 33 | |
35 | |
| 34 | $r->content_type("text/plain"); |
36 | $r->content_type("text/plain"); |
| 35 | $r->send_http_header(); |
37 | $r->send_http_header(); |
|
|
38 | $self->writePDF($singleSet); |
|
|
39 | #$self->{texFH} = \*STDOUT; |
| 36 | print $self->getSetTeX($singleSet); |
40 | #$self->writeMultiSetTeX($singleSet); |
| 37 | |
41 | |
| 38 | return OK; |
42 | return OK; |
| 39 | } |
43 | } |
| 40 | |
44 | |
| 41 | sub getMultiSetTeX { |
45 | sub writePDF { |
|
|
46 | my ($self, @sets) = @_; |
|
|
47 | my $ce = $self->{courseEnvironment}; |
|
|
48 | my $pdflatex = $ce->{externalPrograms}->{pdflatex}; |
| 42 | |
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}); |
| 43 | } |
73 | } |
| 44 | |
74 | |
| 45 | sub getSetTeX { |
75 | sub getSetTeX { |
| 46 | my ($self, $setName) = @_; |
76 | my ($self, $setName) = @_; |
|
|
77 | my $texFH = $self->{texFH}; |
| 47 | my $ce = $self->{courseEnvironment}; |
78 | my $ce = $self->{courseEnvironment}; |
| 48 | my $wwdb = $self->{wwdb}; |
79 | my $wwdb = $self->{wwdb}; |
| 49 | my $user = $self->{r}->param("user"); |
80 | my $user = $self->{r}->param("user"); |
| 50 | my @problemNumbers = $wwdb->getProblems($user, $setName); |
81 | my @problemNumbers = sort { $a <=> $b } $wwdb->getProblems($user, $setName); |
| 51 | |
82 | |
| 52 | my $tex; |
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}; |
| 53 | |
90 | |
| 54 | # include the set preamble |
91 | # render header |
| 55 | $tex .= texBlockComment("BEGIN Set: $setName Preamble"); |
|
|
| 56 | eval { $tex .= readFile($ce->{webworkFiles}->{paperSetPreamble}) }; |
|
|
| 57 | $@ and warn $@; |
|
|
| 58 | |
|
|
| 59 | # render the set header (problem 0 is the set header, see PG.pm) |
|
|
| 60 | #$tex .= texBlockComment("BEGIN Set: $setName Header"); |
92 | print $texFH texBlockComment("BEGIN $setName : $setHeader"); |
| 61 | #$tex .= $self->getProblemTeX($setName, 0); |
93 | #print $texFH $self->getProblemTeX($setName, $setHeader); |
| 62 | |
94 | |
| 63 | # render each problem |
95 | # render each problem |
| 64 | foreach my $problemNumber (sort { $a <=> $b } @problemNumbers) { |
96 | while (my $problemNumber = shift @problemNumbers) { |
| 65 | $tex .= texBlockComment("BEGIN Set: $setName Problem: $problemNumber"); |
97 | print $texFH texBlockComment("BEGIN $setName : $problemNumber"); |
| 66 | $tex .= $self->getProblemTeX($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 | } |
| 67 | } |
103 | } |
| 68 | |
104 | |
| 69 | # include the set postamble |
105 | # render footer |
| 70 | $tex .= texBlockComment("BEGIN Set: $setName Postamble"); |
106 | print $texFH texBlockComment("BEGIN $setName : $setFooter"); |
| 71 | eval { $tex .= readFile($ce->{webworkFiles}->{paperSetPostamble}) }; |
107 | print $texFH $self->getProblemTeX($setName, $setFooter); |
| 72 | $@ and warn $@; |
|
|
| 73 | |
|
|
| 74 | return $tex; |
|
|
| 75 | } |
108 | } |
| 76 | |
109 | |
| 77 | sub getProblemTeX { |
110 | sub getProblemTeX { |
| 78 | my ($self, $setName, $problemNumber) = @_; |
111 | my ($self, $setName, $problemNumber) = @_; |
| 79 | my $r = $self->{r}; |
112 | my $r = $self->{r}; |
| … | |
… | |
| 82 | my $pg = WeBWorK::PG->new( |
115 | my $pg = WeBWorK::PG->new( |
| 83 | $ce, |
116 | $ce, |
| 84 | $r->param('user'), |
117 | $r->param('user'), |
| 85 | $r->param('key'), |
118 | $r->param('key'), |
| 86 | $setName, |
119 | $setName, |
| 87 | $problemNumber, |
120 | $problemNumber, # this may be non-numeric, for headers and the like |
| 88 | { # translation options |
121 | { # translation options |
| 89 | displayMode => "tex", |
122 | displayMode => "tex", |
| 90 | showHints => 0, |
123 | showHints => 0, |
| 91 | showSolutions => 0, |
124 | showSolutions => 0, |
| 92 | processAnswers => 0, |
125 | processAnswers => 0, |
| 93 | }, |
126 | }, |
| 94 | WeBWorK::Form->new->Vars |
127 | WeBWorK::Form->new->Vars # this is silly, i should say {} instead |
| 95 | ); |
128 | ); |
| 96 | |
129 | |
|
|
130 | # *** # handle errors/warnings here! |
| 97 | return $pg->{body_text}; |
131 | return $pg->{body_text}; |
| 98 | } |
132 | } |
| 99 | |
133 | |
| 100 | sub texBlockComment { |
134 | sub texInclude { |
| 101 | return "%% \n%% " . join("", @_) . "\n%% \n"; |
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 | } |
| 102 | } |
145 | } |
| 103 | |
146 | |
| 104 | 1; |
147 | 1; |