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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 494 - (download) (as text) (annotate)
Wed Aug 21 18:31:20 2002 UTC (10 years, 8 months ago) by sh002i
File size: 3960 byte(s)
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