Parent Directory
|
Revision Log
Revision 3073 - (view) (download) (as text)
| 1 : | gage | 3065 | #!/usr/local/bin/perl -w |
| 2 : | |||
| 3 : | # Copyright (C) 2002 Michael Gage | ||
| 4 : | |||
| 5 : | ############################################################################### | ||
| 6 : | # Web service which translates TeX to pdf or to HTML | ||
| 7 : | ############################################################################### | ||
| 8 : | |||
| 9 : | #use lib '/home/gage/webwork/pg/lib'; | ||
| 10 : | #use lib '/home/gage/webwork/webwork-modperl/lib'; | ||
| 11 : | |||
| 12 : | gage | 3073 | package WebworkWebservice::MathTranslators; |
| 13 : | gage | 3065 | use WebworkWebservice; |
| 14 : | use base qw(WebworkWebservice); | ||
| 15 : | |||
| 16 : | use strict; | ||
| 17 : | use sigtrap; | ||
| 18 : | use Carp; | ||
| 19 : | use Safe; | ||
| 20 : | use Apache; | ||
| 21 : | use WeBWorK::PG::Translator; | ||
| 22 : | use WeBWorK::PG::IO; | ||
| 23 : | use Benchmark; | ||
| 24 : | use MIME::Base64 qw( encode_base64 decode_base64); | ||
| 25 : | |||
| 26 : | |||
| 27 : | |||
| 28 : | our $WW_DIRECTORY = $WebworkWebservice::WW_DIRECTORY; | ||
| 29 : | our $PG_DIRECTORY = $WebworkWebservice::PG_DIRECTORY; | ||
| 30 : | our $COURSENAME = $WebworkWebservice::COURSENAME; | ||
| 31 : | our $HOST_NAME = $WebworkWebservice::HOST_NAME; | ||
| 32 : | |||
| 33 : | gage | 3073 | our $ce =$WebworkWebservice::SeedCE; |
| 34 : | # create a local course environment for some course | ||
| 35 : | $ce = WeBWorK::CourseEnvironment->new($WW_DIRECTORY, "", "", $COURSENAME); | ||
| 36 : | gage | 3065 | |
| 37 : | |||
| 38 : | |||
| 39 : | my $debugOn = 1; | ||
| 40 : | my $PASSWORD = $WebworkWebservice::PASSWORD; | ||
| 41 : | |||
| 42 : | |||
| 43 : | my $TEMPDIRECTORY = $ce->{webworkDirs}->{htdocs_temp}; | ||
| 44 : | my $TEMP_BASE_URL = $ce->{webworkURLs}->{htdocs_temp}; | ||
| 45 : | my $externalLatexPath = $ce->{externalPrograms}->{latex}; | ||
| 46 : | # my $externalDvipsPath = $Global::externalDvipsPath; | ||
| 47 : | my $externalpdflatexPath = $ce->{externalPrograms}->{pdflatex};; | ||
| 48 : | # my $externalGsPath = $Global::externalGsPath; | ||
| 49 : | |||
| 50 : | |||
| 51 : | # variables formerly set in Global | ||
| 52 : | $Global::tmp_directory_permission = 0775; | ||
| 53 : | $Global::numericalGroupID='100'; # group ID for wwdev | ||
| 54 : | |||
| 55 : | my $tmp_directory_permission = $Global::tmp_directory_permission; | ||
| 56 : | my $numericalGroupID = $Global::numericalGroupID; # group ID for webadmin | ||
| 57 : | |||
| 58 : | sub tex2pdf { | ||
| 59 : | |||
| 60 : | my $rh = shift; | ||
| 61 : | local($|) = 1; | ||
| 62 : | my $out = {}; | ||
| 63 : | unless ($rh->{pw} eq $PASSWORD ) { | ||
| 64 : | $out->{error} = 404; | ||
| 65 : | return($out); | ||
| 66 : | } | ||
| 67 : | #obtain the path to the file | ||
| 68 : | my $filePath = $rh->{fileName}; | ||
| 69 : | my @pathElements = split("/", $filePath); | ||
| 70 : | |||
| 71 : | # grab the last element as the fileName | ||
| 72 : | #remove the extension from the file name | ||
| 73 : | my $fileName = pop @pathElements; | ||
| 74 : | $fileName =~ s/\.pg$//; | ||
| 75 : | |||
| 76 : | #Create the full url and the full directory path -- If pathElements is empty this can give an extra //? Should I worry? maybe | ||
| 77 : | my $url = $TEMP_BASE_URL. join("/",@pathElements); | ||
| 78 : | $url .= '/' unless $url =~ m|/$|; # only add / if it is needed. | ||
| 79 : | $url .= "$fileName.pdf"; | ||
| 80 : | my $texFileBasePath = $TEMPDIRECTORY.join("/",@pathElements); | ||
| 81 : | $texFileBasePath .= '/' unless $texFileBasePath =~ m|/$|; | ||
| 82 : | $texFileBasePath .= "$fileName"; | ||
| 83 : | |||
| 84 : | # create the intermediate directories if they don't exists | ||
| 85 : | # create a dummy .pdf file | ||
| 86 : | surePathToTmpFile2($texFileBasePath.'.pdf'); | ||
| 87 : | # my $filePermission = '0775'; | ||
| 88 : | # chmod("$filePermission","$texFileBasePath.pdf") | ||
| 89 : | # or die "Can't change file permissions on $texFileBasePath.pdf to $filePermission"; | ||
| 90 : | |||
| 91 : | # Decode and cleanup the tex string | ||
| 92 : | my $texString = decode_base64( $rh->{'texString'}); | ||
| 93 : | #Make sure the line endings are correct | ||
| 94 : | $texString=~s/\r\n/\n/g; | ||
| 95 : | $texString=~s/\r/\n/g; | ||
| 96 : | |||
| 97 : | # Make sure that TeX is run in batchmode so that the tex program doesn't hang on errors | ||
| 98 : | $texString = "\\batchmode\n".$texString; # force errors to log. | ||
| 99 : | |||
| 100 : | # Remove any old files | ||
| 101 : | unlink("$texFileBasePath.tex","$texFileBasePath.dvi","$texFileBasePath.log","$texFileBasePath.aux", | ||
| 102 : | "$texFileBasePath.ps","$texFileBasePath.pdf"); | ||
| 103 : | # Create the texfile of the problem. | ||
| 104 : | local(*TEX); | ||
| 105 : | open(TEX,"> $texFileBasePath.tex") or die "Can't open $texFileBasePath.tex to store tex code"; | ||
| 106 : | local($/)=undef; | ||
| 107 : | print TEX $texString; | ||
| 108 : | close(TEX); | ||
| 109 : | |||
| 110 : | |||
| 111 : | # my $dviCommandLine = "$externalLatexPath $texFileBasePath.tex";# >/dev/null 2>/dev/null"; | ||
| 112 : | # my $psCommandLine = "$externalDvipsPath -o $texFileBasePath.ps $texFileBasePath.dvi >/dev/null";# 2>/dev/null"; | ||
| 113 : | # my $pdfCommandLine = "$externalGsPath -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$texFileBasePath.pdf -c save pop -f $texFileBasePath.ps"; | ||
| 114 : | # print "dviCommandLine: $dviCommandLine\n"; | ||
| 115 : | # print "psCommandLine: $psCommandLine\n"; | ||
| 116 : | # print "pdfCommandLine: $pdfCommandLine\n"; | ||
| 117 : | #print "execute pdflatex", `$externalpdflatexPath $texFileBasePath.tex`, "\n"; | ||
| 118 : | #print "done $externalpdflatexPath $texFileBasePath.tex\n"; | ||
| 119 : | # Change to the working directory and create the pdf files. | ||
| 120 : | my $wd = $TEMPDIRECTORY.join("/",@pathElements); # working directory | ||
| 121 : | # print "---cd $wd && $externalpdflatexPath $fileName.tex\n"; | ||
| 122 : | |||
| 123 : | system "cd $wd && $externalpdflatexPath $fileName.tex >>$fileName.log"; | ||
| 124 : | chmod 0777, "$texFileBasePath.pdf"; | ||
| 125 : | unless ($debugOn) { | ||
| 126 : | unlink("$texFileBasePath.tex","$texFileBasePath.log","$texFileBasePath.aux", | ||
| 127 : | ); | ||
| 128 : | } | ||
| 129 : | return({pdfURL => $url}); | ||
| 130 : | |||
| 131 : | |||
| 132 : | |||
| 133 : | |||
| 134 : | } | ||
| 135 : | |||
| 136 : | sub surePathToTmpFile2 { # constructs intermediate directories if needed beginning at ${Global::htmlDirectory}tmp/ | ||
| 137 : | # the input path must be either the full path, or the path relative to this tmp sub directory | ||
| 138 : | my $path = shift; | ||
| 139 : | my $delim = getDirDelim(); | ||
| 140 : | my $tmpDirectory = $TEMPDIRECTORY; | ||
| 141 : | # if the path starts with $tmpDirectory (which is permitted but optional) remove this initial segment | ||
| 142 : | print "Original path $path\n"; | ||
| 143 : | $path =~ s|^$tmpDirectory|| if $path =~ m|^$tmpDirectory|; | ||
| 144 : | $path = convertPath($path); | ||
| 145 : | print "Creating path to $path using $delim\n"; | ||
| 146 : | # find the nodes on the given path | ||
| 147 : | my @nodes = split("$delim",$path); | ||
| 148 : | # create new path | ||
| 149 : | $path = convertPath("$tmpDirectory"); | ||
| 150 : | print "Creating path: $path\n "; | ||
| 151 : | while (@nodes>1 ) { | ||
| 152 : | |||
| 153 : | $path = convertPath($path . shift (@nodes) ."/"); | ||
| 154 : | print "Creating path: $path\n "; | ||
| 155 : | unless (-e $path) { | ||
| 156 : | # system("mkdir $path"); | ||
| 157 : | createDirectory($path,$tmp_directory_permission, $numericalGroupID) || | ||
| 158 : | die "Failed to create directory $path"; | ||
| 159 : | |||
| 160 : | } | ||
| 161 : | |||
| 162 : | } | ||
| 163 : | $path = convertPath($path . shift(@nodes)); | ||
| 164 : | print "Creating path: $path\n "; | ||
| 165 : | # system(qq!echo "" > $path! ); | ||
| 166 : | |||
| 167 : | $path; | ||
| 168 : | |||
| 169 : | } | ||
| 170 : | |||
| 171 : | |||
| 172 : | sub pretty_print_rh { | ||
| 173 : | my $rh = shift; | ||
| 174 : | my $out = ""; | ||
| 175 : | my $type = ref($rh); | ||
| 176 : | if ( ref($rh) =~/HASH/ ) { | ||
| 177 : | foreach my $key (sort keys %{$rh}) { | ||
| 178 : | $out .= " $key => " . pretty_print_rh( $rh->{$key} ) . "\n"; | ||
| 179 : | } | ||
| 180 : | } elsif ( ref($rh) =~ /SCALAR/ ) { | ||
| 181 : | $out = "scalar reference ". ${$rh}; | ||
| 182 : | } elsif ( ref($rh) =~/Base64/ ) { | ||
| 183 : | $out .= "base64 reference " .$$rh; | ||
| 184 : | } else { | ||
| 185 : | $out = $rh; | ||
| 186 : | } | ||
| 187 : | if (defined($type) ) { | ||
| 188 : | $out .= "type = $type \n"; | ||
| 189 : | } | ||
| 190 : | return $out; | ||
| 191 : | } | ||
| 192 : | |||
| 193 : | |||
| 194 : | 1; |
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |