[system] / trunk / webwork-modperl / lib / WeBWorK / ContentGenerator / Hardcopy.pm Repository:
ViewVC logotype

Annotation of /trunk/webwork-modperl/lib/WeBWorK/ContentGenerator/Hardcopy.pm

Parent Directory Parent Directory | Revision Log 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