Annotation of loncom/interface/lonprintout.pm, revision 1.557.2.3
1.389 foxr 1: # The LearningOnline Network
1.1 www 2: # Printout
3: #
1.557.2.3! foxr 4: # $Id: lonprintout.pm,v 1.557.2.2 2009/07/14 11:08:00 foxr Exp $
1.11 albertel 5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: # http://www.lon-capa.org/
26: #
1.3 sakharuk 27: #
1.1 www 28: package Apache::lonprintout;
29:
30: use strict;
1.10 albertel 31: use Apache::Constants qw(:common :http);
1.2 sakharuk 32: use Apache::lonxml;
33: use Apache::lonnet;
1.54 sakharuk 34: use Apache::loncommon;
1.13 sakharuk 35: use Apache::inputtags;
1.54 sakharuk 36: use Apache::grades;
1.13 sakharuk 37: use Apache::edit;
1.5 sakharuk 38: use Apache::File();
1.68 sakharuk 39: use Apache::lonnavmaps;
1.511 foxr 40: use Apache::admannotations;
1.521 foxr 41: use Apache::lonenc;
1.531 foxr 42: use Apache::entities;
1.550 foxr 43: use Apache::londefdef;
44:
45: use File::Basename;
1.531 foxr 46:
1.515 foxr 47: use HTTP::Response;
1.511 foxr 48:
1.491 albertel 49: use LONCAPA::map();
1.34 sakharuk 50: use POSIX qw(strftime);
1.255 www 51: use Apache::lonlocal;
1.429 foxr 52: use Carp;
1.439 www 53: use LONCAPA;
1.60 sakharuk 54:
1.397 albertel 55: my %perm;
1.454 foxr 56: my %parmhash;
1.459 foxr 57: my $resources_printed;
1.454 foxr 58:
1.515 foxr 59: # Global variables that describe errors in ssi calls detected by ssi_with_retries.
60: #
61:
62: my $ssi_error; # True if there was an ssi error.
63: my $ssi_last_error_resource; # The resource URI that could not be fetched.
64: my $ssi_last_error; # The error text from the server. (e.g. 500 Server timed out).
65:
66: #
67: # Our ssi max retry count.
68: #
69:
70: my $ssi_retry_count = 5; # Some arbitrary value.
71:
72:
1.556 foxr 73: # Font size:
74:
75: my $font_size = 'normalsize'; # Default is normalsize...
76:
1.515 foxr 77:
1.498 foxr 78: # Fetch the contents of a resource, uninterpreted.
79: # This is used here to fetch a latex file to be included
80: # verbatim into the printout<
81: # NOTE: Ask Guy if there is a lonnet function similar to this?
82: #
83: # Parameters:
84: # URL of the file
85: #
86: sub fetch_raw_resource {
87: my ($url) = @_;
88:
89: my $filename = &Apache::lonnet::filelocation("", $url);
1.500 foxr 90: my $contents = &Apache::lonnet::getfile($filename);
1.498 foxr 91:
1.500 foxr 92: if ($contents == -1) {
93: return "File open failed for $filename"; # This will bomb the print.
1.498 foxr 94: }
1.500 foxr 95: return $contents;
1.498 foxr 96:
97:
98: }
99:
1.511 foxr 100: # Fetch the annotations associated with a URL and
101: # put a centered 'annotations:' title.
102: # This is all suppressed if the annotations are empty.
103: #
104: sub annotate {
105: my ($symb) = @_;
106:
107: my $annotation_text = &Apache::admannotations::get_annotation($symb, 1);
108:
109:
110: my $result = "";
111:
112: if (length($annotation_text) > 0) {
113: $result .= '\\hspace*{\\fill} \\\\[\\baselineskip] \textbf{Annotations:} \\\\ ';
114: $result .= "\n";
115: $result .= &Apache::lonxml::latex_special_symbols($annotation_text,""); # Escape latex.
116: $result .= "\n\n";
117: }
118: return $result;
119: }
120:
1.556 foxr 121: #
122: # Set a global document font size:
123: # This is done by replacing \begin{document}
124: # with \begin{document}{\some-font-directive
125: # and \end{document} with
126: # }\end{document
127: #
128: sub set_font_size {
129:
130: my ($text) = @_;
131:
132: $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/;
133: $text =~ s/\\end{document}/}\\end{document}/;
134: return $text;
135:
136:
137: }
138:
1.550 foxr 139: # include_pdf - PDF files are included into the
140: # output as follows:
141: # - The PDF, if necessary, is replicated.
142: # - The PDF is added to the list of files to convert to postscript (along with the images).
143: # - The LaTeX is added to include the final converted postscript in the file as an included
144: # job. The assumption is that the includedpsheader.ps header will be included.
145: #
146: # Parameters:
147: # pdf_uri - URI of the PDF file to include.
148: #
149: # Returns:
150: # The LaTeX to include.
151: #
152: # Assumptions:
153: # The uri is actually a PDF file
154: # The postscript will have the includepsheader.ps included.
155: #
156: #
157: sub include_pdf {
158: my ($pdf_uri) = @_;
159:
160: # Where is the file? If not local we'll need to repcopy it:'
161:
162: my $file = &Apache::lonnet::filelocation('', $pdf_uri);
163: if (! -e $file) {
164: &Apache::lonnet::repcopy($file);
165: $file = &Apache::lonnet::filelocation('',$pdf_uri);
166: }
167:
168: # The file isn ow replicated locally.. or it did not exist in the first place
169: # (unlikely). If it did exist, add the pdf to the set of files/images that
170: # need tob e converted for this print job:
171:
172: $file =~ s|(.*)/res/|/home/httpd/html/res/|;
173:
174: open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");
175: print FILE ("$file\n");
176: close (FILE);
177:
178: # Construct the special to put out. To do this we need to get the
179: # resulting filename after conversion. The file will have the same name
180: # but will be in the user's spool directory with converted images.
181:
182: my $dirname = "/home/httpd/prtspool/$env{'user.name'}/";
183: my ( $base, $path, $ext) = &fileparse($file, '.pdf');
184: # my $destname = $dirname.'/'.$base.'.eps'; # Not really an eps but easier in printout.pl
185: $base =~ s/ /\_/g;
186:
187:
1.551 foxr 188: my $output = &print_latex_header();
1.550 foxr 189: $output .= '\special{ps: _begin_job_ ('
190: .$base.'.pdf.eps'.
191: ')run _end_job_}';
192:
193: return $output;
194:
195:
196: }
197:
1.515 foxr 198:
199: #
1.557.2.2 foxr 200: # ssi_with_retries- Does the server side include of a resource.
1.515 foxr 201: # if the ssi call returns an error we'll retry it up to
202: # the number of times requested by the caller.
203: # If we still have a proble, no text is appended to the
204: # output and we set some global variables.
1.523 raeburn 205: # to indicate to the caller an SSI error occurred.
1.515 foxr 206: # All of this is supposed to deal with the issues described
207: # in LonCAPA BZ 5631 see:
208: # http://bugs.lon-capa.org/show_bug.cgi?id=5631
209: # by informing the user that this happened.
210: #
211: # Parameters:
212: # resource - The resource to include. This is passed directly, without
213: # interpretation to lonnet::ssi.
214: # form - The form hash parameters that guide the interpretation of the resource
215: #
216: # retries - Number of retries allowed before giving up completely.
217: # Returns:
218: # On success, returns the rendered resource identified by the resource parameter.
219: # Side Effects:
220: # The following global variables can be set:
1.523 raeburn 221: # ssi_error - If an unrecoverable error occurred this becomes true.
1.515 foxr 222: # It is up to the caller to initialize this to false
223: # if desired.
1.523 raeburn 224: # ssi_last_error_resource - If an unrecoverable error occurred, this is the value
1.515 foxr 225: # of the resource that could not be rendered by the ssi
226: # call.
227: # ssi_last_error - The error string fetched from the ssi response
228: # in the event of an error.
229: #
230: sub ssi_with_retries {
231: my ($resource, $retries, %form) = @_;
232:
233:
1.516 foxr 234: my ($content, $response) = &Apache::loncommon::ssi_with_retries($resource, $retries, %form);
235: if (!$response->is_success) {
1.515 foxr 236: $ssi_error = 1;
237: $ssi_last_error_resource = $resource;
1.516 foxr 238: $ssi_last_error = $response->code . " " . $response->message;
1.528 raeburn 239: $content='\section*{!!! An error occurred !!!}';
1.519 foxr 240: &Apache::lonnet::logthis("Error in SSI resource: $resource Error: $ssi_last_error");
1.515 foxr 241: }
1.516 foxr 242:
243: return $content;
244:
1.515 foxr 245: }
246:
1.524 www 247: sub get_student_view_with_retries {
248: my ($curresline,$retries,$username,$userdomain,$courseid,$target,$moreenv)=@_;
249:
250: my ($content, $response) = &Apache::loncommon::get_student_view_with_retries($curresline,$retries,$username,$userdomain,$courseid,$target,$moreenv);
251: if (!$response->is_success) {
252: $ssi_error = 1;
1.526 www 253: $ssi_last_error_resource = $curresline.' for user '.$username.':'.$userdomain;
1.524 www 254: $ssi_last_error = $response->code . " " . $response->message;
1.528 raeburn 255: $content='\section*{!!! An error occurred !!!}';
1.526 www 256: &Apache::lonnet::logthis("Error in SSI (student view) resource: $curresline Error: $ssi_last_error User: $username:$userdomain");
1.524 www 257: }
258: return $content;
259:
260: }
261:
1.486 foxr 262: #
263: # printf_style_subst item format_string repl
264: #
265: # Does printf style substitution for a format string that
266: # can have %[n]item in it.. wherever, %[n]item occurs,
267: # rep is substituted in format_string. Note that
268: # [n] is an optional integer length. If provided,
269: # repl is truncated to at most [n] characters prior to
270: # substitution.
271: #
272: sub printf_style_subst {
273: my ($item, $format_string, $repl) = @_;
1.490 foxr 274: my $result = "";
275: while ($format_string =~ /(%)(\d*)\Q$item\E/g ) {
1.488 albertel 276: my $fmt = $1;
277: my $size = $2;
1.486 foxr 278: my $subst = $repl;
279: if ($size ne "") {
280: $subst = substr($subst, 0, $size);
1.490 foxr 281:
282: # Here's a nice edge case.. supose the end of the
283: # substring is a \. In that case may have just
284: # chopped off a TeX escape... in that case, we append
285: # " " for the trailing character, and let the field
286: # spill over a bit (sigh).
287: # We don't just chop off the last character in order to deal
288: # with one last pathology, and that would be if substr had
289: # trimmed us to e.g. \\\
290:
291:
292: if ($subst =~ /\\$/) {
293: $subst .= " ";
294: }
1.486 foxr 295: }
1.490 foxr 296: my $item_pos = pos($format_string);
297: $result .= substr($format_string, 0, $item_pos - length($size) -2) . $subst;
298: $format_string = substr($format_string, pos($format_string));
1.486 foxr 299: }
1.490 foxr 300:
301: # Put the residual format string into the result:
302:
303: $result .= $format_string;
304:
305: return $result;
1.486 foxr 306: }
307:
1.454 foxr 308:
309: # Format a header according to a format.
310: #
311:
312: # Substitutions:
313: # %a - Assignment name.
314: # %c - Course name.
315: # %n - Student name.
1.537 foxr 316: # %s - The section if it is supplied.
1.454 foxr 317: #
318: sub format_page_header {
1.537 foxr 319: my ($width, $format, $assignment, $course, $student, $section) = @_;
320:
1.454 foxr 321:
1.486 foxr 322: $width = &recalcto_mm($width); # Get width in mm.
1.454 foxr 323: # Default format?
324:
325: if ($format eq '') {
1.486 foxr 326: # For the default format, we may need to truncate
327: # elements.. To do this we need to get the page width.
328: # we assume that each character is about 2mm in width.
329: # (correct for the header text size??). We ignore
330: # any formatting (e.g. boldfacing in this).
331: #
332: # - Allow the student/course to be one line.
333: # but only truncate the course.
334: # - Allow the assignment to be 2 lines (wrapped).
335: #
336: my $chars_per_line = $width/2; # Character/textline.
1.537 foxr 337:
338:
339:
340: my $name_length = int($chars_per_line *3 /4);
341: my $sec_length = int($chars_per_line / 5);
1.486 foxr 342:
1.537 foxr 343: $format = "%$name_length".'n';
1.486 foxr 344:
1.537 foxr 345: if ($section) {
346: $format .= ' - Sec: '."%$sec_length".'s';
1.486 foxr 347: }
1.489 foxr 348:
1.537 foxr 349: $format .= '\\\\%c \\\\ %a';
350:
1.490 foxr 351:
1.454 foxr 352: }
1.537 foxr 353: # An open question is how to handle long user formatted page headers...
354: # A possible future is to support e.g. %na so that the user can control
355: # the truncation of the elements that can appear in the header.
356: #
357: $format = &printf_style_subst("a", $format, $assignment);
358: $format = &printf_style_subst("c", $format, $course);
359: $format = &printf_style_subst("n", $format, $student);
360: $format = &printf_style_subst("s", $format, $section);
361:
362:
363: # If the user put %'s in the format string, they must be escaped
364: # to \% else LaTeX will think they are comments and terminate
365: # the line.. which is bad!!!
366:
1.538 onken 367: # If the user has role author, $course and $assignment are empty so
368: # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
369: if($format =~ /\\\\\s\\\\\s/) {
370: #TODO find sensible caption for page header
371: my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout ');
372: $format =~ s/\\\\\s\\\\\s/$testPrintout/;
373: }
1.454 foxr 374:
375:
376: return $format;
377:
378: }
1.397 albertel 379:
1.385 foxr 380: #
381: # Convert a numeric code to letters
382: #
383: sub num_to_letters {
384: my ($num) = @_;
385: my @nums= split('',$num);
386: my @num_to_let=('A'..'Z');
387: my $word;
388: foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }
389: return $word;
390: }
391: # Convert a letter code to numeric.
392: #
393: sub letters_to_num {
394: my ($letters) = @_;
395: my @letters = split('', uc($letters));
1.490 foxr 396: my %substitution;
1.385 foxr 397: my $digit = 0;
398: foreach my $letter ('A'..'J') {
399: $substitution{$letter} = $digit;
400: $digit++;
401: }
402: # The substitution is done as below to preserve leading
403: # zeroes which are needed to keep the code size exact
404: #
405: my $result ="";
406: foreach my $letter (@letters) {
407: $result.=$substitution{$letter};
408: }
409: return $result;
410: }
411:
1.383 foxr 412: # Determine if a code is a valid numeric code. Valid
413: # numeric codes must be comprised entirely of digits and
1.384 albertel 414: # have a correct number of digits.
1.383 foxr 415: #
416: # Parameters:
417: # value - proposed code value.
1.384 albertel 418: # num_digits - Number of digits required.
1.383 foxr 419: #
420: sub is_valid_numeric_code {
1.384 albertel 421: my ($value, $num_digits) = @_;
1.383 foxr 422: # Remove leading/trailing whitespace;
1.387 foxr 423: $value =~ s/^\s*//g;
424: $value =~ s/\s*$//g;
1.383 foxr 425:
426: # All digits?
1.387 foxr 427: if ($value !~ /^[0-9]+$/) {
1.383 foxr 428: return "Numeric code $value has invalid characters - must only be digits";
429: }
1.384 albertel 430: if (length($value) != $num_digits) {
431: return "Numeric code $value incorrect number of digits (correct = $num_digits)";
432: }
1.385 foxr 433: return undef;
1.383 foxr 434: }
435: # Determines if a code is a valid alhpa code. Alpha codes
436: # are ciphers that map [A-J,a-j] -> 0..9 0..9.
1.384 albertel 437: # They also have a correct digit count.
1.383 foxr 438: # Parameters:
439: # value - Proposed code value.
1.384 albertel 440: # num_letters - correct number of letters.
1.383 foxr 441: # Note:
442: # leading and trailing whitespace are ignored.
443: #
444: sub is_valid_alpha_code {
1.384 albertel 445: my ($value, $num_letters) = @_;
1.383 foxr 446:
447: # strip leading and trailing spaces.
448:
449: $value =~ s/^\s*//g;
450: $value =~ s/\s*$//g;
451:
452: # All alphas in the right range?
1.384 albertel 453: if ($value !~ /^[A-J,a-j]+$/) {
1.383 foxr 454: return "Invalid letter code $value must only contain A-J";
455: }
1.384 albertel 456: if (length($value) != $num_letters) {
457: return "Letter code $value has incorrect number of letters (correct = $num_letters)";
458: }
1.385 foxr 459: return undef;
1.383 foxr 460: }
461:
1.382 foxr 462: # Determine if a code entered by the user in a helper is valid.
463: # valid depends on the code type and the type of code selected.
464: # The type of code selected can either be numeric or
465: # Alphabetic. If alphabetic, the code, in fact is a simple
466: # substitution cipher for the actual numeric code: 0->A, 1->B ...
467: # We'll be nice and be case insensitive for alpha codes.
468: # Parameters:
469: # code_value - the value of the code the user typed in.
470: # code_option - The code type selected from the set in the scantron format
471: # table.
472: # Returns:
473: # undef - The code is valid.
474: # other - An error message indicating what's wrong.
475: #
476: sub is_code_valid {
477: my ($code_value, $code_option) = @_;
1.383 foxr 478: my ($code_type, $code_length) = ('letter', 6); # defaults.
1.542 raeburn 479: my @lines = &Apache::grades::get_scantronformat_file();
480: foreach my $line (@lines) {
1.383 foxr 481: my ($name, $type, $length) = (split(/:/, $line))[0,2,4];
482: if($name eq $code_option) {
483: $code_length = $length;
484: if($type eq 'number') {
485: $code_type = 'number';
486: }
487: }
488: }
489: my $valid;
490: if ($code_type eq 'number') {
1.385 foxr 491: return &is_valid_numeric_code($code_value, $code_length);
1.383 foxr 492: } else {
1.385 foxr 493: return &is_valid_alpha_code($code_value, $code_length);
1.383 foxr 494: }
1.382 foxr 495:
496: }
497:
1.341 foxr 498: # Compare two students by name. The students are in the form
499: # returned by the helper:
500: # user:domain:section:last, first:status
501: # This is a helper function for the perl sort built-in therefore:
502: # Implicit Inputs:
503: # $a - The first element to compare (global)
504: # $b - The second element to compare (global)
505: # Returns:
506: # -1 - $a < $b
507: # 0 - $a == $b
508: # +1 - $a > $b
509: # Note that the initial comparison is done on the last names with the
510: # first names only used to break the tie.
511: #
512: #
513: sub compare_names {
514: # First split the names up into the primary fields.
515:
516: my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a);
517: my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b);
518:
519: # Now split the last name and first name of each n:
520: #
521:
522: my ($l1,$f1) = split(/,/, $n1);
523: my ($l2,$f2) = split(/,/, $n2);
524:
525: # We don't bother to remove the leading/trailing whitespace from the
526: # firstname, unless the last names compare identical.
527:
528: if($l1 lt $l2) {
529: return -1;
530: }
531: if($l1 gt $l2) {
532: return 1;
533: }
534:
535: # Break the tie on the first name, but there are leading (possibly trailing
536: # whitespaces to get rid of first
537: #
538: $f1 =~ s/^\s+//; # Remove leading...
539: $f1 =~ s/\s+$//; # Trailing spaces from first 1...
540:
541: $f2 =~ s/^\s+//;
542: $f2 =~ s/\s+$//; # And the same for first 2...
543:
544: if($f1 lt $f2) {
545: return -1;
546: }
547: if($f1 gt $f2) {
548: return 1;
549: }
550:
551: # Must be the same name.
552:
553: return 0;
554: }
555:
1.71 sakharuk 556: sub latex_header_footer_remove {
557: my $text = shift;
558: $text =~ s/\\end{document}//;
559: $text =~ s/\\documentclass([^&]*)\\begin{document}//;
560: return $text;
561: }
1.423 foxr 562: #
563: # If necessary, encapsulate text inside
564: # a minipage env.
565: # necessity is determined by the problem_split param.
566: #
567: sub encapsulate_minipage {
568: my ($text) = @_;
1.427 albertel 569: if (!($env{'form.problem.split'} =~ /yes/i)) {
1.423 foxr 570: $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';
571: }
572: return $text;
573: }
1.429 foxr 574: #
575: # The NUMBER_TO_PRINT and SPLIT_PDFS
576: # variables interact, this sub looks at these two parameters
577: # and comes up with a final value for NUMBER_TO_PRINT which can be:
578: # all - if SPLIT_PDFS eq 'all'.
579: # 1 - if SPLIT_PDFS eq 'oneper'
580: # section - if SPLIT_PDFS eq 'sections'
581: # <unchanged> - if SPLIT_PDFS eq 'usenumber'
582: #
583: sub adjust_number_to_print {
584: my $helper = shift;
1.71 sakharuk 585:
1.429 foxr 586: my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'};
587:
588: if ($split_pdf eq 'all') {
589: $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all';
590: } elsif ($split_pdf eq 'oneper') {
591: $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 1;
592: } elsif ($split_pdf eq 'sections') {
593: $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'section';
594: } elsif ($split_pdf eq 'usenumber') {
595: # Unmodified.
596: } else {
597: # Error!!!!
1.536 foxr 598:
599: croak "bad SPLIT_PDFS: $split_pdf in lonprintout::adjust_number_to_print";
1.429 foxr 600:
601: }
602: }
1.71 sakharuk 603:
1.531 foxr 604:
1.37 sakharuk 605: sub character_chart {
1.531 foxr 606: my $result = shift;
607: return &Apache::entities::replace_entities($result);
608: }
609:
610: sub old_character_chart {
1.37 sakharuk 611: my $result = shift;
1.116 sakharuk 612: $result =~ s/&\#0?0?(7|9);//g;
613: $result =~ s/&\#0?(10|13);//g;
614: $result =~ s/&\#0?32;/ /g;
615: $result =~ s/&\#0?33;/!/g;
616: $result =~ s/&(\#0?34|quot);/\"/g;
617: $result =~ s/&\#0?35;/\\\#/g;
618: $result =~ s/&\#0?36;/\\\$/g;
619: $result =~ s/&\#0?37;/\\%/g;
620: $result =~ s/&(\#0?38|amp);/\\&/g;
621: $result =~ s/&\#(0?39|146);/\'/g;
622: $result =~ s/&\#0?40;/(/g;
623: $result =~ s/&\#0?41;/)/g;
624: $result =~ s/&\#0?42;/\*/g;
625: $result =~ s/&\#0?43;/\+/g;
626: $result =~ s/&\#(0?44|130);/,/g;
627: $result =~ s/&\#0?45;/-/g;
628: $result =~ s/&\#0?46;/\./g;
629: $result =~ s/&\#0?47;/\//g;
630: $result =~ s/&\#0?48;/0/g;
631: $result =~ s/&\#0?49;/1/g;
632: $result =~ s/&\#0?50;/2/g;
633: $result =~ s/&\#0?51;/3/g;
634: $result =~ s/&\#0?52;/4/g;
635: $result =~ s/&\#0?53;/5/g;
636: $result =~ s/&\#0?54;/6/g;
637: $result =~ s/&\#0?55;/7/g;
638: $result =~ s/&\#0?56;/8/g;
639: $result =~ s/&\#0?57;/9/g;
1.269 albertel 640: $result =~ s/&\#0?58;/:/g;
1.116 sakharuk 641: $result =~ s/&\#0?59;/;/g;
642: $result =~ s/&(\#0?60|lt|\#139);/\$<\$/g;
1.281 sakharuk 643: $result =~ s/&\#0?61;/\\ensuremath\{=\}/g;
644: $result =~ s/&(\#0?62|gt|\#155);/\\ensuremath\{>\}/g;
1.116 sakharuk 645: $result =~ s/&\#0?63;/\?/g;
646: $result =~ s/&\#0?65;/A/g;
647: $result =~ s/&\#0?66;/B/g;
648: $result =~ s/&\#0?67;/C/g;
649: $result =~ s/&\#0?68;/D/g;
650: $result =~ s/&\#0?69;/E/g;
651: $result =~ s/&\#0?70;/F/g;
652: $result =~ s/&\#0?71;/G/g;
653: $result =~ s/&\#0?72;/H/g;
654: $result =~ s/&\#0?73;/I/g;
655: $result =~ s/&\#0?74;/J/g;
656: $result =~ s/&\#0?75;/K/g;
657: $result =~ s/&\#0?76;/L/g;
658: $result =~ s/&\#0?77;/M/g;
659: $result =~ s/&\#0?78;/N/g;
660: $result =~ s/&\#0?79;/O/g;
661: $result =~ s/&\#0?80;/P/g;
662: $result =~ s/&\#0?81;/Q/g;
663: $result =~ s/&\#0?82;/R/g;
664: $result =~ s/&\#0?83;/S/g;
665: $result =~ s/&\#0?84;/T/g;
666: $result =~ s/&\#0?85;/U/g;
667: $result =~ s/&\#0?86;/V/g;
668: $result =~ s/&\#0?87;/W/g;
669: $result =~ s/&\#0?88;/X/g;
670: $result =~ s/&\#0?89;/Y/g;
671: $result =~ s/&\#0?90;/Z/g;
672: $result =~ s/&\#0?91;/[/g;
1.281 sakharuk 673: $result =~ s/&\#0?92;/\\ensuremath\{\\setminus\}/g;
1.116 sakharuk 674: $result =~ s/&\#0?93;/]/g;
1.281 sakharuk 675: $result =~ s/&\#(0?94|136);/\\ensuremath\{\\wedge\}/g;
1.116 sakharuk 676: $result =~ s/&\#(0?95|138|154);/\\underline{\\makebox[2mm]{\\strut}}/g;
677: $result =~ s/&\#(0?96|145);/\`/g;
678: $result =~ s/&\#0?97;/a/g;
679: $result =~ s/&\#0?98;/b/g;
680: $result =~ s/&\#0?99;/c/g;
681: $result =~ s/&\#100;/d/g;
682: $result =~ s/&\#101;/e/g;
683: $result =~ s/&\#102;/f/g;
684: $result =~ s/&\#103;/g/g;
685: $result =~ s/&\#104;/h/g;
686: $result =~ s/&\#105;/i/g;
687: $result =~ s/&\#106;/j/g;
688: $result =~ s/&\#107;/k/g;
689: $result =~ s/&\#108;/l/g;
690: $result =~ s/&\#109;/m/g;
691: $result =~ s/&\#110;/n/g;
692: $result =~ s/&\#111;/o/g;
693: $result =~ s/&\#112;/p/g;
694: $result =~ s/&\#113;/q/g;
695: $result =~ s/&\#114;/r/g;
696: $result =~ s/&\#115;/s/g;
697: $result =~ s/&\#116;/t/g;
698: $result =~ s/&\#117;/u/g;
699: $result =~ s/&\#118;/v/g;
700: $result =~ s/&\#119;/w/g;
701: $result =~ s/&\#120;/x/g;
702: $result =~ s/&\#121;/y/g;
703: $result =~ s/&\#122;/z/g;
704: $result =~ s/&\#123;/\\{/g;
705: $result =~ s/&\#124;/\|/g;
706: $result =~ s/&\#125;/\\}/g;
707: $result =~ s/&\#126;/\~/g;
708: $result =~ s/&\#131;/\\textflorin /g;
709: $result =~ s/&\#132;/\"/g;
1.281 sakharuk 710: $result =~ s/&\#133;/\\ensuremath\{\\ldots\}/g;
711: $result =~ s/&\#134;/\\ensuremath\{\\dagger\}/g;
712: $result =~ s/&\#135;/\\ensuremath\{\\ddagger\}/g;
1.116 sakharuk 713: $result =~ s/&\#137;/\\textperthousand /g;
714: $result =~ s/&\#140;/{\\OE}/g;
715: $result =~ s/&\#147;/\`\`/g;
716: $result =~ s/&\#148;/\'\'/g;
1.281 sakharuk 717: $result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g;
1.494 albertel 718: $result =~ s/&(\#150|\#8211);/--/g;
1.116 sakharuk 719: $result =~ s/&\#151;/---/g;
1.281 sakharuk 720: $result =~ s/&\#152;/\\ensuremath\{\\sim\}/g;
1.116 sakharuk 721: $result =~ s/&\#153;/\\texttrademark /g;
722: $result =~ s/&\#156;/\\oe/g;
723: $result =~ s/&\#159;/\\\"Y/g;
1.283 albertel 724: $result =~ s/&(\#160|nbsp);/~/g;
1.116 sakharuk 725: $result =~ s/&(\#161|iexcl);/!\`/g;
726: $result =~ s/&(\#162|cent);/\\textcent /g;
727: $result =~ s/&(\#163|pound);/\\pounds /g;
728: $result =~ s/&(\#164|curren);/\\textcurrency /g;
729: $result =~ s/&(\#165|yen);/\\textyen /g;
730: $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;
731: $result =~ s/&(\#167|sect);/\\textsection /g;
1.530 foxr 732: $result =~ s/&(\#168|uml);/\\"\{\} /g;
1.116 sakharuk 733: $result =~ s/&(\#169|copy);/\\copyright /g;
734: $result =~ s/&(\#170|ordf);/\\textordfeminine /g;
1.281 sakharuk 735: $result =~ s/&(\#172|not);/\\ensuremath\{\\neg\}/g;
1.116 sakharuk 736: $result =~ s/&(\#173|shy);/ - /g;
737: $result =~ s/&(\#174|reg);/\\textregistered /g;
1.281 sakharuk 738: $result =~ s/&(\#175|macr);/\\ensuremath\{^{-}\}/g;
739: $result =~ s/&(\#176|deg);/\\ensuremath\{^{\\circ}\}/g;
740: $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g;
741: $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g;
742: $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g;
1.530 foxr 743: $result =~ s/&(\#180|acute);/\\'\{\} /g;
1.281 sakharuk 744: $result =~ s/&(\#181|micro);/\\ensuremath\{\\mu\}/g;
1.116 sakharuk 745: $result =~ s/&(\#182|para);/\\P/g;
1.281 sakharuk 746: $result =~ s/&(\#183|middot);/\\ensuremath\{\\cdot\}/g;
1.116 sakharuk 747: $result =~ s/&(\#184|cedil);/\\c{\\strut}/g;
1.281 sakharuk 748: $result =~ s/&(\#185|sup1);/\\ensuremath\{^1\}/g;
1.116 sakharuk 749: $result =~ s/&(\#186|ordm);/\\textordmasculine /g;
750: $result =~ s/&(\#188|frac14);/\\textonequarter /g;
751: $result =~ s/&(\#189|frac12);/\\textonehalf /g;
752: $result =~ s/&(\#190|frac34);/\\textthreequarters /g;
753: $result =~ s/&(\#191|iquest);/?\`/g;
754: $result =~ s/&(\#192|Agrave);/\\\`{A}/g;
755: $result =~ s/&(\#193|Aacute);/\\\'{A}/g;
756: $result =~ s/&(\#194|Acirc);/\\^{A}/g;
757: $result =~ s/&(\#195|Atilde);/\\~{A}/g;
758: $result =~ s/&(\#196|Auml);/\\\"{A}/g;
759: $result =~ s/&(\#197|Aring);/{\\AA}/g;
760: $result =~ s/&(\#198|AElig);/{\\AE}/g;
761: $result =~ s/&(\#199|Ccedil);/\\c{c}/g;
762: $result =~ s/&(\#200|Egrave);/\\\`{E}/g;
763: $result =~ s/&(\#201|Eacute);/\\\'{E}/g;
764: $result =~ s/&(\#202|Ecirc);/\\^{E}/g;
765: $result =~ s/&(\#203|Euml);/\\\"{E}/g;
766: $result =~ s/&(\#204|Igrave);/\\\`{I}/g;
767: $result =~ s/&(\#205|Iacute);/\\\'{I}/g;
768: $result =~ s/&(\#206|Icirc);/\\^{I}/g;
769: $result =~ s/&(\#207|Iuml);/\\\"{I}/g;
770: $result =~ s/&(\#209|Ntilde);/\\~{N}/g;
771: $result =~ s/&(\#210|Ograve);/\\\`{O}/g;
772: $result =~ s/&(\#211|Oacute);/\\\'{O}/g;
773: $result =~ s/&(\#212|Ocirc);/\\^{O}/g;
774: $result =~ s/&(\#213|Otilde);/\\~{O}/g;
775: $result =~ s/&(\#214|Ouml);/\\\"{O}/g;
1.281 sakharuk 776: $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g;
1.116 sakharuk 777: $result =~ s/&(\#216|Oslash);/{\\O}/g;
778: $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;
779: $result =~ s/&(\#218|Uacute);/\\\'{U}/g;
780: $result =~ s/&(\#219|Ucirc);/\\^{U}/g;
781: $result =~ s/&(\#220|Uuml);/\\\"{U}/g;
782: $result =~ s/&(\#221|Yacute);/\\\'{Y}/g;
1.329 sakharuk 783: $result =~ s/&(\#223|szlig);/{\\ss}/g;
1.116 sakharuk 784: $result =~ s/&(\#224|agrave);/\\\`{a}/g;
785: $result =~ s/&(\#225|aacute);/\\\'{a}/g;
786: $result =~ s/&(\#226|acirc);/\\^{a}/g;
787: $result =~ s/&(\#227|atilde);/\\~{a}/g;
788: $result =~ s/&(\#228|auml);/\\\"{a}/g;
789: $result =~ s/&(\#229|aring);/{\\aa}/g;
790: $result =~ s/&(\#230|aelig);/{\\ae}/g;
791: $result =~ s/&(\#231|ccedil);/\\c{c}/g;
792: $result =~ s/&(\#232|egrave);/\\\`{e}/g;
793: $result =~ s/&(\#233|eacute);/\\\'{e}/g;
794: $result =~ s/&(\#234|ecirc);/\\^{e}/g;
795: $result =~ s/&(\#235|euml);/\\\"{e}/g;
796: $result =~ s/&(\#236|igrave);/\\\`{i}/g;
797: $result =~ s/&(\#237|iacute);/\\\'{i}/g;
798: $result =~ s/&(\#238|icirc);/\\^{i}/g;
799: $result =~ s/&(\#239|iuml);/\\\"{i}/g;
1.281 sakharuk 800: $result =~ s/&(\#240|eth);/\\ensuremath\{\\partial\}/g;
1.116 sakharuk 801: $result =~ s/&(\#241|ntilde);/\\~{n}/g;
802: $result =~ s/&(\#242|ograve);/\\\`{o}/g;
803: $result =~ s/&(\#243|oacute);/\\\'{o}/g;
804: $result =~ s/&(\#244|ocirc);/\\^{o}/g;
805: $result =~ s/&(\#245|otilde);/\\~{o}/g;
806: $result =~ s/&(\#246|ouml);/\\\"{o}/g;
1.281 sakharuk 807: $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g;
1.116 sakharuk 808: $result =~ s/&(\#248|oslash);/{\\o}/g;
809: $result =~ s/&(\#249|ugrave);/\\\`{u}/g;
810: $result =~ s/&(\#250|uacute);/\\\'{u}/g;
811: $result =~ s/&(\#251|ucirc);/\\^{u}/g;
812: $result =~ s/&(\#252|uuml);/\\\"{u}/g;
813: $result =~ s/&(\#253|yacute);/\\\'{y}/g;
814: $result =~ s/&(\#255|yuml);/\\\"{y}/g;
1.399 albertel 815: $result =~ s/&\#295;/\\ensuremath\{\\hbar\}/g;
1.281 sakharuk 816: $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g;
1.117 sakharuk 817: #Greek Alphabet
1.281 sakharuk 818: $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g;
819: $result =~ s/&(beta|\#946);/\\ensuremath\{\\beta\}/g;
820: $result =~ s/&(gamma|\#947);/\\ensuremath\{\\gamma\}/g;
821: $result =~ s/&(delta|\#948);/\\ensuremath\{\\delta\}/g;
822: $result =~ s/&(epsilon|\#949);/\\ensuremath\{\\epsilon\}/g;
823: $result =~ s/&(zeta|\#950);/\\ensuremath\{\\zeta\}/g;
824: $result =~ s/&(eta|\#951);/\\ensuremath\{\\eta\}/g;
825: $result =~ s/&(theta|\#952);/\\ensuremath\{\\theta\}/g;
826: $result =~ s/&(iota|\#953);/\\ensuremath\{\\iota\}/g;
827: $result =~ s/&(kappa|\#954);/\\ensuremath\{\\kappa\}/g;
828: $result =~ s/&(lambda|\#955);/\\ensuremath\{\\lambda\}/g;
829: $result =~ s/&(mu|\#956);/\\ensuremath\{\\mu\}/g;
830: $result =~ s/&(nu|\#957);/\\ensuremath\{\\nu\}/g;
831: $result =~ s/&(xi|\#958);/\\ensuremath\{\\xi\}/g;
1.199 sakharuk 832: $result =~ s/&(omicron|\#959);/o/g;
1.281 sakharuk 833: $result =~ s/&(pi|\#960);/\\ensuremath\{\\pi\}/g;
834: $result =~ s/&(rho|\#961);/\\ensuremath\{\\rho\}/g;
835: $result =~ s/&(sigma|\#963);/\\ensuremath\{\\sigma\}/g;
836: $result =~ s/&(tau|\#964);/\\ensuremath\{\\tau\}/g;
837: $result =~ s/&(upsilon|\#965);/\\ensuremath\{\\upsilon\}/g;
838: $result =~ s/&(phi|\#966);/\\ensuremath\{\\phi\}/g;
839: $result =~ s/&(chi|\#967);/\\ensuremath\{\\chi\}/g;
840: $result =~ s/&(psi|\#968);/\\ensuremath\{\\psi\}/g;
841: $result =~ s/&(omega|\#969);/\\ensuremath\{\\omega\}/g;
842: $result =~ s/&(thetasym|\#977);/\\ensuremath\{\\vartheta\}/g;
843: $result =~ s/&(piv|\#982);/\\ensuremath\{\\varpi\}/g;
1.199 sakharuk 844: $result =~ s/&(Alpha|\#913);/A/g;
845: $result =~ s/&(Beta|\#914);/B/g;
1.281 sakharuk 846: $result =~ s/&(Gamma|\#915);/\\ensuremath\{\\Gamma\}/g;
847: $result =~ s/&(Delta|\#916);/\\ensuremath\{\\Delta\}/g;
1.199 sakharuk 848: $result =~ s/&(Epsilon|\#917);/E/g;
849: $result =~ s/&(Zeta|\#918);/Z/g;
850: $result =~ s/&(Eta|\#919);/H/g;
1.281 sakharuk 851: $result =~ s/&(Theta|\#920);/\\ensuremath\{\\Theta\}/g;
1.199 sakharuk 852: $result =~ s/&(Iota|\#921);/I/g;
853: $result =~ s/&(Kappa|\#922);/K/g;
1.281 sakharuk 854: $result =~ s/&(Lambda|\#923);/\\ensuremath\{\\Lambda\}/g;
1.199 sakharuk 855: $result =~ s/&(Mu|\#924);/M/g;
856: $result =~ s/&(Nu|\#925);/N/g;
1.281 sakharuk 857: $result =~ s/&(Xi|\#926);/\\ensuremath\{\\Xi\}/g;
1.199 sakharuk 858: $result =~ s/&(Omicron|\#927);/O/g;
1.281 sakharuk 859: $result =~ s/&(Pi|\#928);/\\ensuremath\{\\Pi\}/g;
1.199 sakharuk 860: $result =~ s/&(Rho|\#929);/P/g;
1.281 sakharuk 861: $result =~ s/&(Sigma|\#931);/\\ensuremath\{\\Sigma\}/g;
1.199 sakharuk 862: $result =~ s/&(Tau|\#932);/T/g;
1.281 sakharuk 863: $result =~ s/&(Upsilon|\#933);/\\ensuremath\{\\Upsilon\}/g;
864: $result =~ s/&(Phi|\#934);/\\ensuremath\{\\Phi\}/g;
1.199 sakharuk 865: $result =~ s/&(Chi|\#935);/X/g;
1.281 sakharuk 866: $result =~ s/&(Psi|\#936);/\\ensuremath\{\\Psi\}/g;
867: $result =~ s/&(Omega|\#937);/\\ensuremath\{\\Omega\}/g;
1.199 sakharuk 868: #Arrows (extended HTML 4.01)
1.281 sakharuk 869: $result =~ s/&(larr|\#8592);/\\ensuremath\{\\leftarrow\}/g;
870: $result =~ s/&(uarr|\#8593);/\\ensuremath\{\\uparrow\}/g;
871: $result =~ s/&(rarr|\#8594);/\\ensuremath\{\\rightarrow\}/g;
872: $result =~ s/&(darr|\#8595);/\\ensuremath\{\\downarrow\}/g;
873: $result =~ s/&(harr|\#8596);/\\ensuremath\{\\leftrightarrow\}/g;
874: $result =~ s/&(lArr|\#8656);/\\ensuremath\{\\Leftarrow\}/g;
875: $result =~ s/&(uArr|\#8657);/\\ensuremath\{\\Uparrow\}/g;
876: $result =~ s/&(rArr|\#8658);/\\ensuremath\{\\Rightarrow\}/g;
877: $result =~ s/&(dArr|\#8659);/\\ensuremath\{\\Downarrow\}/g;
878: $result =~ s/&(hArr|\#8660);/\\ensuremath\{\\Leftrightarrow\}/g;
1.199 sakharuk 879: #Mathematical Operators (extended HTML 4.01)
1.281 sakharuk 880: $result =~ s/&(forall|\#8704);/\\ensuremath\{\\forall\}/g;
881: $result =~ s/&(part|\#8706);/\\ensuremath\{\\partial\}/g;
882: $result =~ s/&(exist|\#8707);/\\ensuremath\{\\exists\}/g;
883: $result =~ s/&(empty|\#8709);/\\ensuremath\{\\emptyset\}/g;
884: $result =~ s/&(nabla|\#8711);/\\ensuremath\{\\nabla\}/g;
885: $result =~ s/&(isin|\#8712);/\\ensuremath\{\\in\}/g;
886: $result =~ s/&(notin|\#8713);/\\ensuremath\{\\notin\}/g;
887: $result =~ s/&(ni|\#8715);/\\ensuremath\{\\ni\}/g;
888: $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;
889: $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;
890: $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;
1.390 albertel 891: $result =~ s/–/\\ensuremath\{-\}/g;
1.281 sakharuk 892: $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;
893: $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;
894: $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;
895: $result =~ s/&(infin|\#8734);/\\ensuremath\{\\infty\}/g;
896: $result =~ s/&(ang|\#8736);/\\ensuremath\{\\angle\}/g;
897: $result =~ s/&(and|\#8743);/\\ensuremath\{\\wedge\}/g;
898: $result =~ s/&(or|\#8744);/\\ensuremath\{\\vee\}/g;
899: $result =~ s/&(cap|\#8745);/\\ensuremath\{\\cap\}/g;
900: $result =~ s/&(cup|\#8746);/\\ensuremath\{\\cup\}/g;
901: $result =~ s/&(int|\#8747);/\\ensuremath\{\\int\}/g;
902: $result =~ s/&(sim|\#8764);/\\ensuremath\{\\sim\}/g;
903: $result =~ s/&(cong|\#8773);/\\ensuremath\{\\cong\}/g;
904: $result =~ s/&(asymp|\#8776);/\\ensuremath\{\\approx\}/g;
905: $result =~ s/&(ne|\#8800);/\\ensuremath\{\\not=\}/g;
906: $result =~ s/&(equiv|\#8801);/\\ensuremath\{\\equiv\}/g;
907: $result =~ s/&(le|\#8804);/\\ensuremath\{\\leq\}/g;
908: $result =~ s/&(ge|\#8805);/\\ensuremath\{\\geq\}/g;
909: $result =~ s/&(sub|\#8834);/\\ensuremath\{\\subset\}/g;
910: $result =~ s/&(sup|\#8835);/\\ensuremath\{\\supset\}/g;
911: $result =~ s/&(nsub|\#8836);/\\ensuremath\{\\not\\subset\}/g;
912: $result =~ s/&(sube|\#8838);/\\ensuremath\{\\subseteq\}/g;
913: $result =~ s/&(supe|\#8839);/\\ensuremath\{\\supseteq\}/g;
914: $result =~ s/&(oplus|\#8853);/\\ensuremath\{\\oplus\}/g;
915: $result =~ s/&(otimes|\#8855);/\\ensuremath\{\\otimes\}/g;
916: $result =~ s/&(perp|\#8869);/\\ensuremath\{\\perp\}/g;
917: $result =~ s/&(sdot|\#8901);/\\ensuremath\{\\cdot\}/g;
1.199 sakharuk 918: #Geometric Shapes (extended HTML 4.01)
1.281 sakharuk 919: $result =~ s/&(loz|\#9674);/\\ensuremath\{\\Diamond\}/g;
1.199 sakharuk 920: #Miscellaneous Symbols (extended HTML 4.01)
1.281 sakharuk 921: $result =~ s/&(spades|\#9824);/\\ensuremath\{\\spadesuit\}/g;
922: $result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g;
923: $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g;
924: $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g;
1.495 foxr 925: # Chemically useful 'things' contributed by Hon Kie (bug 4652).
1.515 foxr 926:
1.495 foxr 927: $result =~ s/&\#8636;/\\ensuremath\{\\leftharpoonup\}/g;
928: $result =~ s/&\#8637;/\\ensuremath\{\\leftharpoondown\}/g;
929: $result =~ s/&\#8640;/\\ensuremath\{\\rightharpoonup\}/g;
930: $result =~ s/&\#8641;/\\ensuremath\{\\rightharpoondown\}/g;
931: $result =~ s/&\#8652;/\\ensuremath\{\\rightleftharpoons\}/g;
932: $result =~ s/&\#8605;/\\ensuremath\{\\leadsto\}/g;
933: $result =~ s/&\#8617;/\\ensuremath\{\\hookleftarrow\}/g;
934: $result =~ s/&\#8618;/\\ensuremath\{\\hookrightarrow\}/g;
935: $result =~ s/&\#8614;/\\ensuremath\{\\mapsto\}/g;
936: $result =~ s/&\#8599;/\\ensuremath\{\\nearrow\}/g;
937: $result =~ s/&\#8600;/\\ensuremath\{\\searrow\}/g;
938: $result =~ s/&\#8601;/\\ensuremath\{\\swarrow\}/g;
939: $result =~ s/&\#8598;/\\ensuremath\{\\nwarrow\}/g;
1.513 foxr 940:
941: # Left/right quotations:
942:
943: $result =~ s/&(ldquo|#8220);/\`\`/g;
944: $result =~ s/&(rdquo|#8221);/\'\'/g;
945:
1.557.2.1 foxr 946:
1.513 foxr 947:
1.37 sakharuk 948: return $result;
949: }
1.41 sakharuk 950:
951:
1.327 albertel 952: #width, height, oddsidemargin, evensidemargin, topmargin
953: my %page_formats=
954: ('letter' => {
955: 'book' => {
1.493 foxr 956: '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'],
957: '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in']
1.327 albertel 958: },
959: 'album' => {
1.496 foxr 960: '1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','0.394 in'],
1.484 albertel 961: '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in']
1.327 albertel 962: },
963: },
964: 'legal' => {
965: 'book' => {
966: '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'],
1.514 foxr 967: '2' => ['3.66 in','13 in','-0.57 in','-0.57 in','-0.5 in']
1.327 albertel 968: },
969: 'album' => {
1.376 albertel 970: '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],
971: '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']
1.327 albertel 972: },
973: },
974: 'tabloid' => {
975: 'book' => {
976: '1' => ['9.8 in','16 in','-0.57 in','-0.57 in','-0.5 in'],
977: '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in']
978: },
979: 'album' => {
1.376 albertel 980: '1' => ['16 in','9.8 in','-0.57 in','-0.57 in','-0.5 in'],
981: '2' => ['16 in','4.9 in','-0.57 in','-0.57 in','-0.5 in']
1.327 albertel 982: },
983: },
984: 'executive' => {
985: 'book' => {
986: '1' => ['6.8 in','9 in','-0.57 in','-0.57 in','1.2 in'],
987: '2' => ['3.1 in','9 in','-0.57 in','-0.57 in','1.2 in']
988: },
989: 'album' => {
990: '1' => [],
991: '2' => []
992: },
993: },
994: 'a2' => {
995: 'book' => {
996: '1' => [],
997: '2' => []
998: },
999: 'album' => {
1000: '1' => [],
1001: '2' => []
1002: },
1003: },
1004: 'a3' => {
1005: 'book' => {
1006: '1' => [],
1007: '2' => []
1008: },
1009: 'album' => {
1010: '1' => [],
1011: '2' => []
1012: },
1013: },
1014: 'a4' => {
1015: 'book' => {
1.493 foxr 1016: '1' => ['17.6 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'],
1.496 foxr 1017: '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm']
1.327 albertel 1018: },
1019: 'album' => {
1.496 foxr 1020: '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'],
1.493 foxr 1021: '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm']
1.327 albertel 1022: },
1023: },
1024: 'a5' => {
1025: 'book' => {
1026: '1' => [],
1027: '2' => []
1028: },
1029: 'album' => {
1030: '1' => [],
1031: '2' => []
1032: },
1033: },
1034: 'a6' => {
1035: 'book' => {
1036: '1' => [],
1037: '2' => []
1038: },
1039: 'album' => {
1040: '1' => [],
1041: '2' => []
1042: },
1043: },
1044: );
1045:
1.177 sakharuk 1046: sub page_format {
1.140 sakharuk 1047: #
1.326 sakharuk 1048: #Supported paper format: "Letter [8 1/2x11 in]", "Legal [8 1/2x14 in]",
1049: # "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]",
1050: # "A2 [420x594 mm]", "A3 [297x420 mm]",
1051: # "A4 [210x297 mm]", "A5 [148x210 mm]",
1052: # "A6 [105x148 mm]"
1.140 sakharuk 1053: #
1054: my ($papersize,$layout,$numberofcolumns) = @_;
1.327 albertel 1055: return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};
1.140 sakharuk 1056: }
1.76 sakharuk 1057:
1058:
1.126 albertel 1059: sub get_name {
1060: my ($uname,$udom)=@_;
1.373 albertel 1061: if (!defined($uname)) { $uname=$env{'user.name'}; }
1062: if (!defined($udom)) { $udom=$env{'user.domain'}; }
1.126 albertel 1063: my $plainname=&Apache::loncommon::plainname($uname,$udom);
1.213 albertel 1064: if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }
1.453 foxr 1065: $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');
1.213 albertel 1066: return $plainname;
1.126 albertel 1067: }
1068:
1.213 albertel 1069: sub get_course {
1070: my $courseidinfo;
1.373 albertel 1071: if (defined($env{'request.course.id'})) {
1.439 www 1072: $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
1.537 foxr 1073: my $sec = $env{'request.course.sec'};
1074:
1.213 albertel 1075: }
1076: return $courseidinfo;
1077: }
1.177 sakharuk 1078:
1.76 sakharuk 1079: sub page_format_transformation {
1.312 sakharuk 1080: my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_;
1.202 sakharuk 1081: my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
1.454 foxr 1082:
1.312 sakharuk 1083: if ($selectionmade eq '4') {
1.502 foxr 1084: if ($choice eq 'all_problems') {
1085: $assignment='Problems from the Whole Course';
1086: } else {
1087: $assignment='Resources from the Whole Course';
1088: }
1.312 sakharuk 1089: } else {
1090: $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');
1091: }
1.261 sakharuk 1092: ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);
1.454 foxr 1093:
1094:
1.126 albertel 1095: my $name = &get_name();
1.213 albertel 1096: my $courseidinfo = &get_course();
1.455 albertel 1097: my $header_text = $parmhash{'print_header_format'};
1.486 foxr 1098: $header_text = &format_page_header($textwidth, $header_text, $assignment,
1.455 albertel 1099: $courseidinfo, $name);
1.319 sakharuk 1100: my $topmargintoinsert = '';
1101: if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';}
1.325 sakharuk 1102: my $fancypagestatement='';
1103: if ($numberofcolumns eq '2') {
1.455 albertel 1104: $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}";
1.325 sakharuk 1105: } else {
1.455 albertel 1106: $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";
1.325 sakharuk 1107: }
1.140 sakharuk 1108: if ($layout eq 'album') {
1.550 foxr 1109: $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;
1.140 sakharuk 1110: } elsif ($layout eq 'book') {
1111: if ($choice ne 'All class print') {
1.550 foxr 1112: $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;
1.140 sakharuk 1113: } else {
1.550 foxr 1114: $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /;
1.319 sakharuk 1115: }
1.326 sakharuk 1116: if ($papersize eq 'a4') {
1.319 sakharuk 1117: $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/;
1.140 sakharuk 1118: }
1119: }
1.214 sakharuk 1120: if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
1121: if ($indexlist eq 'yes') {
1122: $text=~s/(\\begin{document})/\\makeindex $1/;
1123: $text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/;
1124: }
1.140 sakharuk 1125: return $text;
1126: }
1127:
1128:
1.33 sakharuk 1129: sub page_cleanup {
1130: my $result = shift;
1.65 sakharuk 1131:
1132: $result =~ m/\\end{document}(\d*)$/;
1.34 sakharuk 1133: my $number_of_columns = $1;
1.33 sakharuk 1134: my $insert = '{';
1.34 sakharuk 1135: for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }
1.33 sakharuk 1136: $insert .= '}';
1.65 sakharuk 1137: $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;
1.34 sakharuk 1138: $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;
1139: return $result,$number_of_columns;
1.7 sakharuk 1140: }
1.5 sakharuk 1141:
1.3 sakharuk 1142:
1.60 sakharuk 1143: sub details_for_menu {
1.335 albertel 1144: my ($helper)=@_;
1.373 albertel 1145: my $postdata=$env{'form.postdata'};
1.335 albertel 1146: if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }
1147: my $name_of_resource = &Apache::lonnet::gettitle($postdata);
1148: my $symbolic = &Apache::lonnet::symbread($postdata);
1.482 albertel 1149: return if ( $symbolic eq '');
1150:
1.233 www 1151: my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic);
1.123 albertel 1152: $map=&Apache::lonnet::clutter($map);
1.269 albertel 1153: my $name_of_sequence = &Apache::lonnet::gettitle($map);
1.63 albertel 1154: if ($name_of_sequence =~ /^\s*$/) {
1.123 albertel 1155: $map =~ m|([^/]+)$|;
1156: $name_of_sequence = $1;
1.63 albertel 1157: }
1.373 albertel 1158: my $name_of_map = &Apache::lonnet::gettitle($env{'request.course.uri'});
1.63 albertel 1159: if ($name_of_map =~ /^\s*$/) {
1.373 albertel 1160: $env{'request.course.uri'} =~ m|([^/]+)$|;
1.123 albertel 1161: $name_of_map = $1;
1162: }
1.335 albertel 1163: return ($name_of_resource,$name_of_sequence,$name_of_map);
1.76 sakharuk 1164: }
1165:
1.476 albertel 1166: sub copyright_line {
1167: return '\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\vspace*{-2 mm}\newline\noindent{\tiny Printed from LON-CAPA\copyright MSU{\hfill} Licensed under GNU General Public License } ';
1168: }
1169: my $end_of_student = "\n".'\special{ps:ENDOFSTUDENTSTAMP}'."\n";
1.76 sakharuk 1170:
1171: sub latex_corrections {
1.408 albertel 1172: my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;
1.185 sakharuk 1173: # $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;
1.476 albertel 1174: my $copyright = ©right_line();
1.408 albertel 1175: if ($selectionmade eq '1' || $answer_mode eq 'only') {
1.476 albertel 1176: $result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/;
1.408 albertel 1177: } else {
1.476 albertel 1178: $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/;
1.316 sakharuk 1179: }
1.476 albertel 1180: $result =~ s/\$number_of_columns/$number_of_columns/g;
1.91 sakharuk 1181: $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;
1182: $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;
1.76 sakharuk 1183: #-- LaTeX corrections
1184: my $first_comment = index($result,'<!--',0);
1185: while ($first_comment != -1) {
1186: my $end_comment = index($result,'-->',$first_comment);
1187: substr($result,$first_comment,$end_comment-$first_comment+3) = '';
1188: $first_comment = index($result,'<!--',$first_comment);
1189: }
1190: $result =~ s/^\s+$//gm; #remove empty lines
1.377 albertel 1191: #removes more than one empty space
1192: $result =~ s|(\s\s+)|($1=~/[\n\r]/)?"\n":" "|ge;
1.76 sakharuk 1193: $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
1194: $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
1195: $result =~ s/{\\par }\s*\\\\/\\\\/gm;
1.313 sakharuk 1196: $result =~ s/\\\\\s+\[/ \[/g;
1.76 sakharuk 1197: #conversion of html characters to LaTeX equivalents
1198: if ($result =~ m/&(\w+|#\d+);/) {
1199: $result = &character_chart($result);
1200: }
1201: $result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g;
1202: $result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g;
1203: return $result;
1.60 sakharuk 1204: }
1205:
1.3 sakharuk 1206:
1.214 sakharuk 1207: sub index_table {
1208: my $currentURL = shift;
1209: my $insex_string='';
1210: $currentURL=~s/\.([^\/+])$/\.$1\.meta/;
1211: $insex_string=&Apache::lonnet::metadata($currentURL,'keywords');
1212: return $insex_string;
1213: }
1214:
1215:
1.215 sakharuk 1216: sub IndexCreation {
1217: my ($texversion,$currentURL)=@_;
1218: my @key_words=split(/,/,&index_table($currentURL));
1219: my $chunk='';
1220: my $st=index $texversion,'\addcontentsline{toc}{subsection}{';
1221: if ($st>0) {
1222: for (my $i=0;$i<3;$i++) {$st=(index $texversion,'}',$st+1);}
1223: $chunk=substr($texversion,0,$st+1);
1224: substr($texversion,0,$st+1)=' ';
1225: }
1226: foreach my $key_word (@key_words) {
1227: if ($key_word=~/\S+/) {
1228: $texversion=~s/\b($key_word)\b/$1 \\index{$key_word} /i;
1229: }
1230: }
1231: if ($st>0) {substr($texversion,0,1)=$chunk;}
1232: return $texversion;
1233: }
1234:
1.242 sakharuk 1235: sub print_latex_header {
1236: my $mode=shift;
1.550 foxr 1237:
1238: return &Apache::londefdef::latex_header($mode);
1.242 sakharuk 1239: }
1240:
1241: sub path_to_problem {
1.328 albertel 1242: my ($urlp,$colwidth)=@_;
1.404 albertel 1243: $urlp=&Apache::lonnet::clutter($urlp);
1244:
1.242 sakharuk 1245: my $newurlp = '';
1.328 albertel 1246: $colwidth=~s/\s*mm\s*$//;
1247: #characters average about 2 mm in width
1.360 albertel 1248: if (length($urlp)*2 > $colwidth) {
1.404 albertel 1249: my @elements = split('/',$urlp);
1.328 albertel 1250: my $curlength=0;
1251: foreach my $element (@elements) {
1.404 albertel 1252: if ($element eq '') { next; }
1.328 albertel 1253: if ($curlength+(length($element)*2) > $colwidth) {
1.404 albertel 1254: $newurlp .= '|\vskip -1 mm \verb|';
1255: $curlength=length($element)*2;
1.328 albertel 1256: } else {
1257: $curlength+=length($element)*2;
1.242 sakharuk 1258: }
1.328 albertel 1259: $newurlp.='/'.$element;
1.242 sakharuk 1260: }
1.253 sakharuk 1261: } else {
1262: $newurlp=$urlp;
1.242 sakharuk 1263: }
1264: return '{\small\noindent\verb|'.$newurlp.'|\vskip 0 mm}';
1265: }
1.215 sakharuk 1266:
1.275 sakharuk 1267: sub recalcto_mm {
1268: my $textwidth=shift;
1269: my $LaTeXwidth;
1.339 albertel 1270: if ($textwidth=~/(-?\d+\.?\d*)\s*cm/) {
1.275 sakharuk 1271: $LaTeXwidth = $1*10;
1.339 albertel 1272: } elsif ($textwidth=~/(-?\d+\.?\d*)\s*mm/) {
1.275 sakharuk 1273: $LaTeXwidth = $1;
1.339 albertel 1274: } elsif ($textwidth=~/(-?\d+\.?\d*)\s*in/) {
1.275 sakharuk 1275: $LaTeXwidth = $1*25.4;
1276: }
1277: $LaTeXwidth.=' mm';
1278: return $LaTeXwidth;
1279: }
1280:
1.285 albertel 1281: sub get_textwidth {
1282: my ($helper,$LaTeXwidth)=@_;
1.286 albertel 1283: my $textwidth=$LaTeXwidth;
1.285 albertel 1284: if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&
1285: $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {
1.286 albertel 1286: $textwidth=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.
1287: $helper->{'VARS'}->{'pagesize.widthunit'});
1.285 albertel 1288: }
1.286 albertel 1289: return $textwidth;
1.285 albertel 1290: }
1291:
1.296 sakharuk 1292:
1293: sub unsupported {
1.414 albertel 1294: my ($currentURL,$mode,$symb)=@_;
1.307 sakharuk 1295: if ($mode ne '') {$mode='\\'.$mode}
1.308 sakharuk 1296: my $result.= &print_latex_header($mode);
1.414 albertel 1297: if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
1298: $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
1299: my $title=&Apache::lonnet::gettitle($symb);
1300: $title = &Apache::lonxml::latex_special_symbols($title);
1301: $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' ';
1.296 sakharuk 1302: } else {
1303: $result.=$currentURL;
1304: }
1.419 albertel 1305: $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
1.296 sakharuk 1306: return $result;
1307: }
1308:
1.557.2.2 foxr 1309: #
1310: # Map from helper layout style to the book/album:
1311: #
1312: sub map_laystyle {
1313: my ($laystyle) = @_;
1314: if ($laystyle eq 'L') {
1315: $laystyle='album';
1316: } else {
1317: $laystyle='book';
1318: }
1319: return $laystyle;
1320: }
1.296 sakharuk 1321:
1.557.2.1 foxr 1322: sub print_page_in_course {
1.557.2.2 foxr 1323: my ($helper, $rparmhash, $currentURL, $resources) = @_;
1324: my %parmhash = %$rparmhash;
1.557.2.1 foxr 1325: my @page_resources = @$resources;
1326: my $mode = $helper->{'VARS'}->{'LATEX_TYPE'};
1327: my $symb = $helper->{'VARS'}->{'symb'};
1328:
1.557.2.2 foxr 1329:
1330: my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};
1331:
1332:
1333: my @temporary_array=split /\|/,$format_from_helper;
1334: my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array;
1335: $laystyle = &map_laystyle($laystyle);
1336: my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,
1337: $numberofcolumns);
1338: my $LaTeXwidth=&recalcto_mm($textwidth);
1339:
1340:
1.557.2.1 foxr 1341: if ($mode ne '') {$mode='\\'.$mode}
1342: my $result.= &print_latex_header($mode);
1343: if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
1344: $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
1345: my $title=&Apache::lonnet::gettitle($symb);
1346: $title = &Apache::lonxml::latex_special_symbols($title);
1347: } else {
1348: $result.=$currentURL;
1349: }
1.557.2.3! foxr 1350: $result .= '\\\\';
! 1351:
1.557.2.2 foxr 1352: if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
1353: &Apache::lonnet::appenv({'construct.style' =>
1354: $helper->{'VARS'}->{'style_file'}});
1355: } elsif ($env{'construct.style'}) {
1356: &Apache::lonnet::delenv('construct.style');
1357: }
1.557.2.1 foxr 1358:
1359: # First is theo verall page description. This is then followed by the
1360: # components of the page. Each of which must be printed independently.
1361:
1362: my $the_page = shift(@page_resources);
1363:
1364: foreach my $resource (@page_resources) {
1.557.2.2 foxr 1365: my $resource_src = $resource->src(); # Essentially the URL of the resource.
1.557.2.3! foxr 1366: $result .= $resource->title() . '\\\\';
! 1367:
1.557.2.2 foxr 1368: # Recurse if a .page:
1369:
1370: if ($resource_src =~ /.page$/i) {
1371: my $navmap = Apache::lonnavmaps::navmap->new();
1372: my @page_resources = $navmap->retrieveResources($resource_src);
1373: $result .= &print_page_in_course($helper, $rparmhash,
1374: $resource_src, \@page_resources);
1375: }
1376: # these resources go through the XML transformer:
1377:
1378: elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm\xhtml|xhtm)$/) {
1379: my $urlp = &Apache::lonnet::clutter($resource_src);
1380: my %form;
1381: my %moreenv;
1382:
1383: &Apache::lonxml::remember_problem_counter();
1384: $moreenv{'request.filename'}=$urlp;
1385: if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
1386:
1387: $form{'grade_target'} = 'tex';
1388: $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth);
1389: $form{'pdfFormFiels'} = $pdfFormFields; #
1390: $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
1391:
1392: $form{'problem_split'}=$parmhash{'problem_stream_switch'};
1393: $form{'suppress_tries'}=$parmhash{'suppress_tries'};
1394: $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1395: $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
1396: $form{'print_annotations'}=$helper->{'VARS'}->{'PRINT_ANNOTATIONS'};
1397: if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') ||
1398: ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {
1399: $form{'problem_split'}='yes';
1400: }
1401: my $rndseed = time;
1402: if ($helper->{'VARS'}->{'curseed'}) {
1403: $rndseed=$helper->{'VARS'}->{'curseed'};
1404: }
1405: $form{'rndseed'}=$rndseed;
1406: &Apache::lonnet::appenv(\%moreenv);
1407:
1408: &Apache::lonxml::clear_problem_counter();
1409:
1410: my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
1411:
1.557.2.3! foxr 1412: # There seems to be an extraneous \vskip 1mm \\\\ :
! 1413:
! 1414: $texversion =~ s/^\\vskip 1mm \\\\\\\\//;
! 1415:
1.557.2.2 foxr 1416: # current document with answers.. no need to encap in minipage
1417: # since there's only one answer.
1418:
1419: if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
1420: ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1421: $form{'problem_split'}=$parmhash{'problem_stream_switch'};
1422: $form{'grade_target'}='answer';
1423: $form{'answer_output_mode'}='tex';
1424: $form{'rndseed'}=$rndseed;
1425: if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {
1426: $form{'problemtype'}='exam';
1427: }
1428: $resources_printed .= $currentURL.':';
1429: my $answer=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
1430:
1431:
1432: if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
1433: $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
1434: } else {
1435: $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
1436: if ($helper->{'VARS'}->{'construction'} ne '1') {
1437: my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
1438: $title = &Apache::lonxml::latex_special_symbols($title);
1439: $texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
1440: $texversion.=&path_to_problem($urlp,$LaTeXwidth);
1441: } else {
1442: $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
1443: my $URLpath=$urlp;
1444: $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
1445: $texversion.=&path_to_problem($URLpath,$LaTeXwidth);
1446: }
1447: $texversion.='\vskip 1 mm '.$answer.'\end{document}';
1448: }
1449:
1450:
1451:
1452:
1453:
1454: }
1455: # Print annotations.
1456:
1457:
1458: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
1459: my $annotation .= &annotate($currentURL);
1460: $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;
1461: }
1462:
1463: if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
1464: $texversion=&IndexCreation($texversion,$currentURL);
1465: }
1466: if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
1467: $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /;
1468:
1469: }
1470: $result .= $texversion;
1471: if ($currentURL=~m/\.page\s*$/) {
1472: ($result,$numberofcolumns) = &page_cleanup($result);
1473: }
1474: }
1.557.2.1 foxr 1475: }
1476:
1477: $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
1478: return $result;
1479: }
1480:
1481:
1.363 foxr 1482: #
1.395 www 1483: # List of recently generated print files
1484: #
1485: sub recently_generated {
1486: my $r=shift;
1487: my $prtspool=$r->dir_config('lonPrtDir');
1.400 albertel 1488: my $zip_result;
1489: my $pdf_result;
1.395 www 1490: opendir(DIR,$prtspool);
1.400 albertel 1491:
1492: my @files =
1493: grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));
1.395 www 1494: closedir(DIR);
1.400 albertel 1495:
1496: @files = sort {
1497: my ($actime) = (stat($prtspool.'/'.$a))[10];
1498: my ($bctime) = (stat($prtspool.'/'.$b))[10];
1499: return $bctime <=> $actime;
1500: } (@files);
1501:
1502: foreach my $filename (@files) {
1503: my ($ext) = ($filename =~ m/(pdf|zip)$/);
1504: my ($cdev,$cino,$cmode,$cnlink,
1505: $cuid,$cgid,$crdev,$csize,
1506: $catime,$cmtime,$cctime,
1507: $cblksize,$cblocks)=stat($prtspool.'/'.$filename);
1.544 bisitz 1508: my $ext_text = 'pdf' ? &mt('PDF File'):&mt('Zip File');
1509: my $result=&Apache::loncommon::start_data_table_row()
1510: .'<td>'
1511: .'<a href="/prtspool/'.$filename.'">'.$ext_text.'</a>'
1512: .'</td>'
1513: .'<td>'.&Apache::lonlocal::locallocaltime($cctime).'</td>'
1514: .'<td align="right">'.$csize.'</td>'
1515: .&Apache::loncommon::end_data_table_row();
1.400 albertel 1516: if ($ext eq 'pdf') { $pdf_result .= $result; }
1517: if ($ext eq 'zip') { $zip_result .= $result; }
1518: }
1.544 bisitz 1519: if ($zip_result || $pdf_result) {
1520: $r->print('<hr />');
1521: }
1.400 albertel 1522: if ($zip_result) {
1.544 bisitz 1523: $r->print('<h3>'.&mt('Recently generated printout zip files')."</h3>\n"
1524: .&Apache::loncommon::start_data_table()
1525: .&Apache::loncommon::start_data_table_header_row()
1526: .'<th>'.&mt('Download').'</th>'
1527: .'<th>'.&mt('Creation Date').'</th>'
1528: .'<th>'.&mt('File Size (Bytes)').'</th>'
1529: .&Apache::loncommon::end_data_table_header_row()
1530: .$zip_result
1531: .&Apache::loncommon::end_data_table()
1532: );
1.400 albertel 1533: }
1534: if ($pdf_result) {
1.544 bisitz 1535: $r->print('<h3>'.&mt('Recently generated printouts')."</h3>\n"
1536: .&Apache::loncommon::start_data_table()
1537: .&Apache::loncommon::start_data_table_header_row()
1538: .'<th>'.&mt('Download').'</th>'
1539: .'<th>'.&mt('Creation Date').'</th>'
1540: .'<th>'.&mt('File Size (Bytes)').'</th>'
1541: .&Apache::loncommon::end_data_table_header_row()
1542: .$pdf_result
1543: .&Apache::loncommon::end_data_table()
1544: );
1.396 albertel 1545: }
1.395 www 1546: }
1547:
1548: #
1.363 foxr 1549: # Retrieve the hash of page breaks.
1550: #
1551: # Inputs:
1552: # helper - reference to helper object.
1553: # Outputs
1554: # A reference to a page break hash.
1555: #
1556: #
1.418 foxr 1557: #use Data::Dumper;
1558: #sub dump_helper_vars {
1559: # my ($helper) = @_;
1560: # my $helpervars = Dumper($helper->{'VARS'});
1561: # &Apache::lonnet::logthis("Dump of helper vars:\n $helpervars");
1562: #}
1.363 foxr 1563:
1.481 albertel 1564: sub get_page_breaks {
1565: my ($helper) = @_;
1566: my %page_breaks;
1567:
1568: foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) {
1569: $page_breaks{$break} = 1;
1570: }
1571: return %page_breaks;
1572: }
1.363 foxr 1573:
1.459 foxr 1574: # Output a sequence (recursively if neeed)
1575: # from construction space.
1576: # Parameters:
1577: # url = URL of the sequence to print.
1578: # helper - Reference to the helper hash.
1579: # form - Copy of the format hash.
1580: # LaTeXWidth
1581: # Returns:
1582: # Text to add to the printout.
1583: # NOTE if the first element of the outermost sequence
1584: # is itself a sequence, the outermost caller may need to
1585: # prefix the latex with the page headers stuff.
1586: #
1587: sub print_construction_sequence {
1588: my ($currentURL, $helper, %form, $LaTeXwidth) = @_;
1589: my $result;
1590: my $rndseed=time;
1591: if ($helper->{'VARS'}->{'curseed'}) {
1592: $rndseed=$helper->{'VARS'}->{'curseed'};
1593: }
1.491 albertel 1594: my $errtext=&LONCAPA::map::mapread($currentURL);
1.459 foxr 1595: #
1596: # These make this all support recursing for subsequences.
1597: #
1.491 albertel 1598: my @order = @LONCAPA::map::order;
1599: my @resources = @LONCAPA::map::resources;
1.459 foxr 1600: for (my $member=0;$member<=$#order;$member++) {
1601: $resources[$order[$member]]=~/^([^:]*):([^:]*):/;
1602: my $urlp=$2;
1603: if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
1604: my $texversion='';
1605: if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
1606: $form{'problem_split'}=$parmhash{'problem_stream_switch'};
1607: $form{'suppress_tries'}=$parmhash{'suppress_tries'};
1608: $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1609: $form{'rndseed'}=$rndseed;
1610: $resources_printed .=$urlp.':';
1.515 foxr 1611: $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
1.459 foxr 1612: }
1613: if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
1614: ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) &&
1615: ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {
1616: # Don't permanently modify %$form...
1617: my %answerform = %form;
1618: $answerform{'grade_target'}='answer';
1619: $answerform{'answer_output_mode'}='tex';
1620: $answerform{'rndseed'}=$rndseed;
1621: $answerform{'problem_split'}=$parmhash{'problem_stream_switch'};
1.481 albertel 1622: if ($urlp=~/\/res\//) {$env{'request.state'}='published';}
1.459 foxr 1623: $resources_printed .= $urlp.':';
1.515 foxr 1624: my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
1.459 foxr 1625: if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
1626: $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
1627: } else {
1628: # If necessary, encapsulate answer in minipage:
1629:
1630: $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
1.477 albertel 1631: my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
1632: $title = &Apache::lonxml::latex_special_symbols($title);
1633: my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
1.459 foxr 1634: $body.=&path_to_problem($urlp,$LaTeXwidth);
1635: $body.='\vskip 1 mm '.$answer.'\end{document}';
1636: $body = &encapsulate_minipage($body);
1637: $texversion.=$body;
1638: }
1639: }
1640: $texversion = &latex_header_footer_remove($texversion);
1641:
1642: if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
1643: $texversion=&IndexCreation($texversion,$urlp);
1644: }
1645: if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
1646: $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
1647: }
1648: $result.=$texversion;
1649:
1650: } elsif ($urlp=~/\.(sequence|page)$/) {
1.557 foxr 1651:
1.459 foxr 1652: # header:
1653:
1654: $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';
1655:
1656: # IF sequence, recurse:
1657:
1658: if ($urlp =~ /\.sequence$/) {
1659: my $sequence_url = $urlp;
1660: my $domain = $env{'user.domain'}; # Constr. space only on local
1661: my $user = $env{'user.name'};
1662:
1663: $sequence_url =~ s/^\/res\/$domain/\/home/;
1664: $sequence_url =~ s/^(\/home\/$user)/$1\/public_html/;
1665: # $sequence_url =~ s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;
1666: $result .= &print_construction_sequence($sequence_url,
1667: $helper, %form,
1668: $LaTeXwidth);
1669: }
1.550 foxr 1670: }
1671: elsif ($urlp =~ /\.pdf$/i) {
1.552 foxr 1672: my $texversion;
1673: if ($member != 0) {
1674: $texversion .= '\cleardoublepage';
1675: }
1676:
1677: $texversion .= &include_pdf($urlp);
1678: $texversion = &latex_header_footer_remove($texversion);
1679: if ($member != $#order) {
1680: $texversion .= '\\ \cleardoublepage';
1681: }
1.551 foxr 1682:
1683: $result .= $texversion;
1.550 foxr 1684: }
1.459 foxr 1685: }
1686: if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
1687: return $result;
1688: }
1689:
1.177 sakharuk 1690: sub output_data {
1.184 sakharuk 1691: my ($r,$helper,$rparmhash) = @_;
1692: my %parmhash = %$rparmhash;
1.515 foxr 1693: $ssi_error = 0; # This will be set nonzero by failing ssi's.
1.459 foxr 1694: $resources_printed = '';
1.556 foxr 1695: $font_size = $helper->{'VARS'}->{'fontsize'};
1.499 foxr 1696: my $do_postprocessing = 1;
1.433 albertel 1697: my $js = <<ENDPART;
1698: <script type="text/javascript">
1.264 sakharuk 1699: var editbrowser;
1700: function openbrowser(formname,elementname,only,omit) {
1701: var url = '/res/?';
1702: if (editbrowser == null) {
1703: url += 'launch=1&';
1704: }
1705: url += 'catalogmode=interactive&';
1706: url += 'mode=parmset&';
1707: url += 'form=' + formname + '&';
1708: if (only != null) {
1709: url += 'only=' + only + '&';
1710: }
1711: if (omit != null) {
1712: url += 'omit=' + omit + '&';
1713: }
1714: url += 'element=' + elementname + '';
1715: var title = 'Browser';
1716: var options = 'scrollbars=1,resizable=1,menubar=0';
1717: options += ',width=700,height=600';
1718: editbrowser = open(url,title,options,'1');
1719: editbrowser.focus();
1720: }
1721: </script>
1.140 sakharuk 1722: ENDPART
1723:
1.512 foxr 1724:
1725:
1.433 albertel 1726: my $start_page = &Apache::loncommon::start_page('Preparing Printout',$js);
1727: my $msg = &mt('Please stand by while processing your print request, this may take some time ...');
1.363 foxr 1728:
1.433 albertel 1729: $r->print($start_page."\n<p>\n$msg\n</p>\n");
1.372 foxr 1730:
1.363 foxr 1731: # fetch the pagebreaks and store them in the course environment
1732: # The page breaks will be pulled into the hash %page_breaks which is
1733: # indexed by symb and contains 1's for each break.
1734:
1.373 albertel 1735: $env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'};
1736: $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'};
1.363 foxr 1737: &Apache::loncommon::store_course_settings('print',
1.366 foxr 1738: {'pagebreaks' => 'scalar',
1739: 'lastprinttype' => 'scalar'});
1.363 foxr 1740:
1.364 albertel 1741: my %page_breaks = &get_page_breaks($helper);
1.363 foxr 1742:
1.140 sakharuk 1743: my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};
1744: my ($result,$selectionmade) = ('','');
1745: my $number_of_columns = 1; #used only for pages to determine the width of the cell
1746: my @temporary_array=split /\|/,$format_from_helper;
1.539 onken 1747: my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array;
1.557.2.2 foxr 1748:
1749: $laystyle = &map_laystyle($laystyle);
1.177 sakharuk 1750: my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
1.373 albertel 1751: my $assignment = $env{'form.assignment'};
1.275 sakharuk 1752: my $LaTeXwidth=&recalcto_mm($textwidth);
1.272 sakharuk 1753: my @print_array=();
1.274 sakharuk 1754: my @student_names=();
1.360 albertel 1755:
1.512 foxr 1756:
1.360 albertel 1757: # Common settings for the %form has:
1758: # In some cases these settings get overriddent by specific cases, but the
1759: # settings are common enough to make it worthwhile factoring them out
1760: # here.
1761: #
1762: my %form;
1763: $form{'grade_target'} = 'tex';
1764: $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth);
1.539 onken 1765: $form{'pdfFormFields'} = $pdfFormFields;
1.372 foxr 1766:
1767: # If form.showallfoils is set, then request all foils be shown:
1768: # privilege will be enforced both by not allowing the
1769: # check box selecting this option to be presnt unless it's ok,
1770: # and by lonresponse's priv. check.
1771: # The if is here because lonresponse.pm only cares that
1772: # showallfoils is defined, not what the value is.
1773:
1774: if ($helper->{'VARS'}->{'showallfoils'} eq "1") {
1775: $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
1776: }
1.504 albertel 1777:
1778: if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
1.520 raeburn 1779: &Apache::lonnet::appenv({'construct.style' =>
1780: $helper->{'VARS'}->{'style_file'}});
1.504 albertel 1781: } elsif ($env{'construct.style'}) {
1.549 raeburn 1782: &Apache::lonnet::delenv('construct.style');
1.504 albertel 1783: }
1784:
1.372 foxr 1785:
1.140 sakharuk 1786: if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {
1.143 sakharuk 1787: #-- single document - problem, page, html, xml, ...
1.343 albertel 1788: my ($currentURL,$cleanURL);
1.375 foxr 1789:
1.162 sakharuk 1790: if ($helper->{'VARS'}->{'construction'} ne '1') {
1.185 sakharuk 1791: #prints published resource
1.153 sakharuk 1792: $currentURL=$helper->{'VARS'}->{'postdata'};
1.343 albertel 1793: $cleanURL=&Apache::lonenc::check_decrypt($currentURL);
1.143 sakharuk 1794: } else {
1.512 foxr 1795:
1.185 sakharuk 1796: #prints resource from the construction space
1.240 albertel 1797: $currentURL='/'.$helper->{'VARS'}->{'filename'};
1.206 sakharuk 1798: if ($currentURL=~/([^?]+)/) {$currentURL=$1;}
1.343 albertel 1799: $cleanURL=$currentURL;
1.143 sakharuk 1800: }
1.140 sakharuk 1801: $selectionmade = 1;
1.413 albertel 1802: if ($cleanURL!~m|^/adm/|
1.557 foxr 1803: && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
1.169 albertel 1804: my $rndseed=time;
1.242 sakharuk 1805: my $texversion='';
1806: if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
1807: my %moreenv;
1.343 albertel 1808: $moreenv{'request.filename'}=$cleanURL;
1.290 sakharuk 1809: if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
1.242 sakharuk 1810: $form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.310 sakharuk 1811: $form{'suppress_tries'}=$parmhash{'suppress_tries'};
1.242 sakharuk 1812: $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1.309 sakharuk 1813: $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
1.511 foxr 1814: $form{'print_annotations'}=$helper->{'VARS'}->{'PRINT_ANNOTATIONS'};
1815: if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') ||
1816: ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {
1817: $form{'problem_split'}='yes';
1818: }
1.242 sakharuk 1819: if ($helper->{'VARS'}->{'curseed'}) {
1820: $rndseed=$helper->{'VARS'}->{'curseed'};
1821: }
1822: $form{'rndseed'}=$rndseed;
1.520 raeburn 1823: &Apache::lonnet::appenv(\%moreenv);
1.428 albertel 1824:
1825: &Apache::lonxml::clear_problem_counter();
1826:
1.375 foxr 1827: $resources_printed .= $currentURL.':';
1.515 foxr 1828: $texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
1.428 albertel 1829:
1.511 foxr 1830: # Add annotations if required:
1831:
1.428 albertel 1832: &Apache::lonxml::clear_problem_counter();
1833:
1.242 sakharuk 1834: &Apache::lonnet::delenv('request.filename');
1.230 albertel 1835: }
1.423 foxr 1836: # current document with answers.. no need to encap in minipage
1837: # since there's only one answer.
1838:
1.242 sakharuk 1839: if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
1840: ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.353 foxr 1841: $form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.166 albertel 1842: $form{'grade_target'}='answer';
1.167 albertel 1843: $form{'answer_output_mode'}='tex';
1.169 albertel 1844: $form{'rndseed'}=$rndseed;
1.401 albertel 1845: if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {
1846: $form{'problemtype'}='exam';
1847: }
1.375 foxr 1848: $resources_printed .= $currentURL.':';
1.515 foxr 1849: my $answer=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
1.511 foxr 1850:
1851:
1.242 sakharuk 1852: if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
1853: $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
1854: } else {
1855: $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
1.245 sakharuk 1856: if ($helper->{'VARS'}->{'construction'} ne '1') {
1.477 albertel 1857: my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
1858: $title = &Apache::lonxml::latex_special_symbols($title);
1859: $texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
1.343 albertel 1860: $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
1.245 sakharuk 1861: } else {
1862: $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
1.343 albertel 1863: my $URLpath=$cleanURL;
1.245 sakharuk 1864: $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
1.504 albertel 1865: $texversion.=&path_to_problem($URLpath,$LaTeXwidth);
1.245 sakharuk 1866: }
1.242 sakharuk 1867: $texversion.='\vskip 1 mm '.$answer.'\end{document}';
1868: }
1.511 foxr 1869:
1870:
1871:
1872:
1.550 foxr 1873:
1.511 foxr 1874: }
1875: # Print annotations.
1876:
1877:
1878: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
1879: my $annotation .= &annotate($currentURL);
1880: $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;
1.163 sakharuk 1881: }
1.511 foxr 1882:
1883:
1.214 sakharuk 1884: if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
1.215 sakharuk 1885: $texversion=&IndexCreation($texversion,$currentURL);
1.214 sakharuk 1886: }
1.219 sakharuk 1887: if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
1888: $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /;
1889:
1890: }
1.162 sakharuk 1891: $result .= $texversion;
1892: if ($currentURL=~m/\.page\s*$/) {
1893: ($result,$number_of_columns) = &page_cleanup($result);
1894: }
1.413 albertel 1895: } elsif ($cleanURL!~m|^/adm/|
1.557 foxr 1896: && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') {
1.227 sakharuk 1897: #printing content of sequence from the construction space
1.557.2.1 foxr 1898:
1899: &Apache::lonnet::logthis("Printing sequence/page but construction space??");
1900:
1.227 sakharuk 1901: $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;
1.551 foxr 1902: # $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
1.459 foxr 1903: $result .= &print_construction_sequence($currentURL, $helper, %form,
1904: $LaTeXwidth);
1905: $result .= '\end{document}';
1906: if (!($result =~ /\\begin\{document\}/)) {
1907: $result = &print_latex_header() . $result;
1.227 sakharuk 1908: }
1.459 foxr 1909: # End construction space sequence.
1.456 raeburn 1910: } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
1.258 sakharuk 1911: $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1.298 sakharuk 1912: if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
1.375 foxr 1913: $resources_printed .= $currentURL.':';
1.515 foxr 1914: my $texversion=&ssi_with_retries($currentURL, $ssi_retry_count, %form);
1.511 foxr 1915: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
1916: my $annotation = &annotate($currentURL);
1917: $texversion =~ s/(\\end{document})/$annotation$1/;
1918: }
1.258 sakharuk 1919: $result .= $texversion;
1.550 foxr 1920: } elsif ($cleanURL =~/\.tex$/) {
1.498 foxr 1921: # For this sort of print of a single LaTeX file,
1922: # We can just print the LaTeX file as it is uninterpreted in any way:
1923: #
1924:
1925: $result = &fetch_raw_resource($currentURL);
1.511 foxr 1926: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
1927: my $annotation = &annotate($currentURL);
1928: $result =~ s/(\\end{document})/$annotation$1/;
1929: }
1930:
1.499 foxr 1931: $do_postprocessing = 0; # Don't massage the result.
1.498 foxr 1932:
1.550 foxr 1933: } elsif ($cleanURL =~ /\.pdf$/i) {
1934: $result .= &include_pdf($cleanURL);
1.551 foxr 1935: $result .= '\end{document}';
1.557.2.1 foxr 1936: } elsif ($cleanURL =~ /\.page$/i) { # Print page in non construction space contexts.
1937: &Apache::lonnet::logthis("Printing .page $cleanURL at " . __LINE__);
1938:
1939: # Determine the set of resources in the map of the page:
1940:
1941: my $navmap = Apache::lonnavmaps::navmap->new();
1942: my @page_resources = $navmap->retrieveResources($cleanURL);
1.557.2.2 foxr 1943: $result .= &print_page_in_course($helper, $rparmhash,
1944: $cleanURL, \@page_resources);
1.557.2.1 foxr 1945:
1946:
1.162 sakharuk 1947: } else {
1.557.2.1 foxr 1948: &Apache::lonnet::logthis("Unsupported type handler");
1.414 albertel 1949: $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
1950: $helper->{'VARS'}->{'symb'});
1.162 sakharuk 1951: }
1.354 foxr 1952: } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or
1.142 sakharuk 1953: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
1.354 foxr 1954: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or
1955: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') or # BUGBUG
1.536 foxr 1956: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')
1957: ) {
1.511 foxr 1958:
1959:
1.141 sakharuk 1960: #-- produce an output string
1.296 sakharuk 1961: if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
1962: $selectionmade = 2;
1963: } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
1964: $selectionmade = 3;
1.536 foxr 1965: } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')
1966: ) {
1.296 sakharuk 1967: $selectionmade = 4;
1.354 foxr 1968: } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG
1969: $selectionmade = 4;
1.296 sakharuk 1970: } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {
1971: $selectionmade = 7;
1972: }
1.193 sakharuk 1973: $form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.310 sakharuk 1974: $form{'suppress_tries'}=$parmhash{'suppress_tries'};
1.203 sakharuk 1975: $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1.309 sakharuk 1976: $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
1.511 foxr 1977: $form{'print_annotations'} = $helper->{'VARS'}->{'PRINT_ANNOTATIONS'};
1978: if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') ||
1979: ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') ) {
1980: $form{'problem_split'}='yes';
1981: }
1.141 sakharuk 1982: my $flag_latex_header_remove = 'NO';
1983: my $flag_page_in_sequence = 'NO';
1984: my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
1.193 sakharuk 1985: my $prevassignment='';
1.428 albertel 1986:
1987: &Apache::lonxml::clear_problem_counter();
1988:
1.416 foxr 1989: my $pbreakresources = keys %page_breaks;
1.141 sakharuk 1990: for (my $i=0;$i<=$#master_seq;$i++) {
1.350 foxr 1991:
1.521 foxr 1992: &Apache::lonenc::reset_enc();
1993:
1994:
1.350 foxr 1995: # Note due to document structure, not allowed to put \newpage
1996: # prior to the first resource
1997:
1.351 foxr 1998: if (defined $page_breaks{$master_seq[$i]}) {
1.350 foxr 1999: if($i != 0) {
2000: $result.="\\newpage\n";
2001: }
2002: }
1.521 foxr 2003: my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
1.237 albertel 2004: $urlp=&Apache::lonnet::clutter($urlp);
1.166 albertel 2005: $form{'symb'}=$master_seq[$i];
1.407 albertel 2006:
1.521 foxr 2007:
1.407 albertel 2008: my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem
1.521 foxr 2009:
1.267 sakharuk 2010: if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
1.247 sakharuk 2011: if ($i==0) {$prevassignment=$assignment;}
1.297 sakharuk 2012: my $texversion='';
1.413 albertel 2013: if ($urlp!~m|^/adm/|
2014: && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
1.557.2.1 foxr 2015: &Apache::lonnet::logthis("At line 1834 printing $urlp");
1.375 foxr 2016: $resources_printed .= $urlp.':';
1.428 albertel 2017: &Apache::lonxml::remember_problem_counter();
1.515 foxr 2018: $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
1.296 sakharuk 2019: if ($urlp=~/\.page$/) {
1.557.2.1 foxr 2020: &Apache::lonnet::logthis("Handling a .page at ". __LINE__);
2021:
1.296 sakharuk 2022: ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
2023: if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;}
2024: $texversion =~ s/\\end{document}\d*/\\end{document}/;
2025: $flag_page_in_sequence = 'YES';
2026: }
1.428 albertel 2027:
1.296 sakharuk 2028: if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
2029: ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.380 foxr 2030: # Don't permanently pervert the %form hash
2031: my %answerform = %form;
2032: $answerform{'grade_target'}='answer';
2033: $answerform{'answer_output_mode'}='tex';
1.375 foxr 2034: $resources_printed .= $urlp.':';
1.428 albertel 2035:
2036: &Apache::lonxml::restore_problem_counter();
1.515 foxr 2037: my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
1.428 albertel 2038:
1.296 sakharuk 2039: if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
2040: $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
1.249 sakharuk 2041: } else {
1.307 sakharuk 2042: if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
1.296 sakharuk 2043: $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
1.552 foxr 2044: $texversion =~ s/\\begin{document}//;
1.477 albertel 2045: my $title = &Apache::lonnet::gettitle($master_seq[$i]);
2046: $title = &Apache::lonxml::latex_special_symbols($title);
2047: my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
1.423 foxr 2048: $body .= &path_to_problem ($urlp,$LaTeXwidth);
2049: $body .='\vskip 1 mm '.$answer;
2050: $body = &encapsulate_minipage($body);
2051: $texversion .= $body;
1.296 sakharuk 2052: } else {
2053: $texversion='';
2054: }
1.249 sakharuk 2055: }
1.511 foxr 2056:
1.246 sakharuk 2057: }
1.511 foxr 2058: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
2059: my $annotation .= &annotate($urlp);
2060: $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;
2061: }
2062:
1.296 sakharuk 2063: if ($flag_latex_header_remove ne 'NO') {
2064: $texversion = &latex_header_footer_remove($texversion);
2065: } else {
2066: $texversion =~ s/\\end{document}//;
2067: }
2068: if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
2069: $texversion=&IndexCreation($texversion,$urlp);
2070: }
2071: if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
2072: my $name = &get_name();
2073: my $courseidinfo = &get_course();
2074: $prevassignment=$assignment;
1.455 albertel 2075: my $header_text = $parmhash{'print_header_format'};
1.486 foxr 2076: $header_text = &format_page_header($textwidth, $header_text,
1.455 albertel 2077: $assignment,
2078: $courseidinfo,
2079: $name);
1.552 foxr 2080:
1.417 foxr 2081: if ($numberofcolumns eq '1') {
1.455 albertel 2082: $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';
1.416 foxr 2083: } else {
1.455 albertel 2084: $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{'.$header_text.'}} \vskip 5 mm ';
1.416 foxr 2085: }
1.296 sakharuk 2086: }
2087: $result .= $texversion;
2088: $flag_latex_header_remove = 'YES';
1.456 raeburn 2089: } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
1.301 sakharuk 2090: $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
2091: if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
1.375 foxr 2092: $resources_printed .= $urlp.':';
1.515 foxr 2093: my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
1.511 foxr 2094: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
2095: my $annotation = &annotate($urlp);
2096: $texversion =~ s/(\\end{document)/$annotation$1/;
2097: }
2098:
1.301 sakharuk 2099: if ($flag_latex_header_remove ne 'NO') {
2100: $texversion = &latex_header_footer_remove($texversion);
1.550 foxr 2101: } else {
1.301 sakharuk 2102: $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;
2103: }
2104: $result .= $texversion;
2105: $flag_latex_header_remove = 'YES';
1.550 foxr 2106: } elsif ($urlp=~ /\.pdf$/i) {
2107: if ($i > 0) {
2108: $result .= '\cleardoublepage';
2109: }
2110: $result .= &include_pdf($urlp);
2111: if ($i != $#master_seq) {
2112: if ($numberofcolumns eq '1') {
2113: $result .= '\newpage';
2114: } else {
2115: # the \\'s seem to be needed to let LaTeX know there's something
2116: # on the page since LaTeX seems to not like to clear an empty page.
2117: #
2118: $result .= '\\ \cleardoublepage';
2119: }
2120: }
2121: $flag_latex_header_remove = 'YES';
2122:
1.141 sakharuk 2123: } else {
1.414 albertel 2124: $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'},
2125: $master_seq[$i]);
1.297 sakharuk 2126: if ($flag_latex_header_remove ne 'NO') {
2127: $texversion = &latex_header_footer_remove($texversion);
2128: } else {
2129: $texversion =~ s/\\end{document}//;
2130: }
2131: $result .= $texversion;
2132: $flag_latex_header_remove = 'YES';
1.296 sakharuk 2133: }
1.550 foxr 2134: if (&Apache::loncommon::connection_aborted($r)) {
2135: last;
2136: }
1.141 sakharuk 2137: }
1.428 albertel 2138: &Apache::lonxml::clear_problem_counter();
1.344 foxr 2139: if ($flag_page_in_sequence eq 'YES') {
2140: $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;
2141: }
1.141 sakharuk 2142: $result .= '\end{document}';
1.284 albertel 2143: } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
1.536 foxr 2144: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ||
1.284 albertel 2145: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
1.353 foxr 2146:
2147:
1.150 sakharuk 2148: #-- prints assignments for whole class or for selected students
1.284 albertel 2149: my $type;
1.536 foxr 2150: if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
2151: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) {
1.254 sakharuk 2152: $selectionmade=5;
1.284 albertel 2153: $type='problems';
1.254 sakharuk 2154: } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') {
2155: $selectionmade=8;
1.284 albertel 2156: $type='resources';
1.254 sakharuk 2157: }
1.150 sakharuk 2158: my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'};
1.341 foxr 2159: # The normal sort order is by section then by students within the
2160: # section. If the helper var student_sort is 1, then the user has elected
2161: # to override this and output the students by name.
2162: # Each element of the students array is of the form:
2163: # username:domain:section:last, first:status
2164: #
1.429 foxr 2165: # Note that student sort is not compatible with printing
2166: # 1 section per pdf...so that setting overrides.
1.341 foxr 2167: #
1.429 foxr 2168: if (($helper->{'VARS'}->{'student_sort'} eq 1) &&
2169: ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {
1.341 foxr 2170: @students = sort compare_names @students;
2171: }
1.429 foxr 2172: &adjust_number_to_print($helper);
2173:
1.278 albertel 2174: if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0' ||
2175: $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) {
2176: $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;
2177: }
1.429 foxr 2178: # If we are splitting on section boundaries, we need
2179: # to remember that in split_on_sections and
2180: # print all of the students in the list.
2181: #
2182: my $split_on_sections = 0;
2183: if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'section') {
2184: $split_on_sections = 1;
2185: $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = $#students+1;
2186: }
1.150 sakharuk 2187: my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
1.350 foxr 2188:
1.150 sakharuk 2189: #loop over students
1.552 foxr 2190: my $flag_latex_header_remove = 'NO';
1.150 sakharuk 2191: my %moreenv;
1.330 sakharuk 2192: $moreenv{'instructor_comments'}='hide';
1.285 albertel 2193: $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
1.309 sakharuk 2194: $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
1.511 foxr 2195: $moreenv{'print_annotations'} = $helper->{'VARS'}->{'PRINT_ANNOTATIONS'};
1.353 foxr 2196: $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'};
1.369 foxr 2197: $moreenv{'suppress_tries'} = $parmhash{'suppress_tries'};
1.511 foxr 2198: if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') ||
2199: ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {
2200: $moreenv{'problem_split'}='yes';
2201: }
1.318 albertel 2202: my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');
1.272 sakharuk 2203: my $student_counter=-1;
1.429 foxr 2204: my $i = 0;
1.430 albertel 2205: my $last_section = (split(/:/,$students[0]))[2];
1.150 sakharuk 2206: foreach my $person (@students) {
1.350 foxr 2207:
1.373 albertel 2208: my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
1.311 sakharuk 2209: if (-e $duefile) {
2210: my $temp_file = Apache::File->new('>>'.$duefile);
2211: print $temp_file "1969\n";
2212: }
1.272 sakharuk 2213: $student_counter++;
1.429 foxr 2214: if ($split_on_sections) {
1.430 albertel 2215: my $this_section = (split(/:/,$person))[2];
1.429 foxr 2216: if ($this_section ne $last_section) {
2217: $i++;
2218: $last_section = $this_section;
2219: }
2220: } else {
2221: $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
2222: }
1.375 foxr 2223: my ($output,$fullname, $printed)=&print_resources($r,$helper,
1.353 foxr 2224: $person,$type,
2225: \%moreenv,\@master_seq,
1.360 albertel 2226: $flag_latex_header_remove,
1.422 albertel 2227: $LaTeXwidth);
1.375 foxr 2228: $resources_printed .= ":";
1.284 albertel 2229: $print_array[$i].=$output;
2230: $student_names[$i].=$person.':'.$fullname.'_END_';
2231: &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
2232: $flag_latex_header_remove = 'YES';
1.331 albertel 2233: if (&Apache::loncommon::connection_aborted($r)) { last; }
1.284 albertel 2234: }
2235: &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
2236: $result .= $print_array[0].' \end{document}';
2237: } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') ||
2238: ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) {
1.373 albertel 2239: my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
2240: my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
1.288 albertel 2241: my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
2242: my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
1.292 albertel 2243: my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
1.385 foxr 2244: my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
1.388 foxr 2245: my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};
2246:
1.381 albertel 2247: my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
1.542 raeburn 2248: my @lines = &Apache::grades::get_scantronformat_file();
1.381 albertel 2249: my ($code_type,$code_length)=('letter',6);
1.542 raeburn 2250: foreach my $line (@lines) {
1.381 albertel 2251: my ($name,$type,$length) = (split(/:/,$line))[0,2,4];
2252: if ($name eq $code_option) {
2253: $code_length=$length;
2254: if ($type eq 'number') { $code_type = 'number'; }
2255: }
2256: }
1.288 albertel 2257: my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
1.353 foxr 2258: $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'};
1.420 albertel 2259: $moreenv{'instructor_comments'}='hide';
1.288 albertel 2260: my $seed=time+($$<<16)+($$);
1.292 albertel 2261: my @allcodes;
2262: if ($old_name) {
1.381 albertel 2263: my %result=&Apache::lonnet::get('CODEs',
2264: [$old_name,"type\0$old_name"],
2265: $cdom,$cnum);
2266: $code_type=$result{"type\0$old_name"};
1.292 albertel 2267: @allcodes=split(',',$result{$old_name});
1.336 albertel 2268: $num_todo=scalar(@allcodes);
1.389 foxr 2269: } elsif ($selected_code) { # Selection value is always numeric.
1.388 foxr 2270: $num_todo = 1;
2271: @allcodes = ($selected_code);
1.385 foxr 2272: } elsif ($single_code) {
2273:
1.387 foxr 2274: $num_todo = 1; # Unconditionally one code to do.
1.385 foxr 2275: # If an alpha code have to convert to numbers so it can be
2276: # converted back to letters again :-)
2277: #
2278: if ($code_type ne 'number') {
2279: $single_code = &letters_to_num($single_code);
2280: }
2281: @allcodes = ($single_code);
1.292 albertel 2282: } else {
2283: my %allcodes;
1.299 albertel 2284: srand($seed);
1.292 albertel 2285: for (my $i=0;$i<$num_todo;$i++) {
1.381 albertel 2286: $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,
2287: $code_type);
1.292 albertel 2288: }
2289: if ($code_name) {
2290: &Apache::lonnet::put('CODEs',
1.381 albertel 2291: {
2292: $code_name =>join(',',keys(%allcodes)),
2293: "type\0$code_name" => $code_type
2294: },
1.292 albertel 2295: $cdom,$cnum);
2296: }
2297: @allcodes=keys(%allcodes);
2298: }
1.336 albertel 2299: my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
2300: my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'});
1.452 albertel 2301: &adjust_number_to_print($helper);
1.336 albertel 2302: my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'};
2303: if ($number_per_page eq '0' || $number_per_page eq 'all') {
2304: $number_per_page=$num_todo;
2305: }
2306: my $flag_latex_header_remove = 'NO';
2307: my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75');
1.295 albertel 2308: my $count=0;
1.292 albertel 2309: foreach my $code (sort(@allcodes)) {
1.295 albertel 2310: my $file_num=int($count/$number_per_page);
1.381 albertel 2311: if ($code_type eq 'number') {
2312: $moreenv{'CODE'}=$code;
2313: } else {
2314: $moreenv{'CODE'}=&num_to_letters($code);
2315: }
1.375 foxr 2316: my ($output,$fullname, $printed)=
1.288 albertel 2317: &print_resources($r,$helper,'anonymous',$type,\%moreenv,
1.360 albertel 2318: \@master_seq,$flag_latex_header_remove,
2319: $LaTeXwidth);
1.375 foxr 2320: $resources_printed .= ":";
1.295 albertel 2321: $print_array[$file_num].=$output;
1.288 albertel 2322: &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
2323: &mt('last assignment').' '.$fullname);
2324: $flag_latex_header_remove = 'YES';
1.295 albertel 2325: $count++;
1.331 albertel 2326: if (&Apache::loncommon::connection_aborted($r)) { last; }
1.288 albertel 2327: }
2328: &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
2329: $result .= $print_array[0].' \end{document}';
2330: } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') {
1.151 sakharuk 2331: #prints selected problems from the subdirectory
2332: $selectionmade = 6;
2333: my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
1.154 sakharuk 2334: @list_of_files=sort @list_of_files;
1.175 sakharuk 2335: my $flag_latex_header_remove = 'NO';
2336: my $rndseed=time;
1.230 albertel 2337: if ($helper->{'VARS'}->{'curseed'}) {
2338: $rndseed=$helper->{'VARS'}->{'curseed'};
2339: }
1.151 sakharuk 2340: for (my $i=0;$i<=$#list_of_files;$i++) {
1.521 foxr 2341:
2342: &Apache::lonenc::reset_enc();
2343:
1.152 sakharuk 2344: my $urlp = $list_of_files[$i];
1.253 sakharuk 2345: $urlp=~s|//|/|;
1.152 sakharuk 2346: if ($urlp=~/\//) {
1.353 foxr 2347: $form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.175 sakharuk 2348: $form{'rndseed'}=$rndseed;
1.152 sakharuk 2349: if ($urlp =~ m|/home/([^/]+)/public_html|) {
2350: $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
2351: } else {
1.302 sakharuk 2352: $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;
1.152 sakharuk 2353: }
1.375 foxr 2354: $resources_printed .= $urlp.':';
1.515 foxr 2355: my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
1.251 sakharuk 2356: if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
1.253 sakharuk 2357: ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.380 foxr 2358: # Don't permanently pervert %form:
2359: my %answerform = %form;
2360: $answerform{'grade_target'}='answer';
2361: $answerform{'answer_output_mode'}='tex';
2362: $answerform{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
2363: $answerform{'rndseed'}=$rndseed;
1.375 foxr 2364: $resources_printed .= $urlp.':';
1.515 foxr 2365: my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
1.251 sakharuk 2366: if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
2367: $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
2368: } else {
1.253 sakharuk 2369: $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
2370: if ($helper->{'VARS'}->{'construction'} ne '1') {
2371: $texversion.='\vskip 0 mm \noindent ';
2372: $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
2373: } else {
2374: $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
2375: my $URLpath=$urlp;
2376: $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
2377: $texversion.=&path_to_problem ($URLpath,$LaTeXwidth);
2378: }
2379: $texversion.='\vskip 1 mm '.$answer.'\end{document}';
1.251 sakharuk 2380: }
1.174 sakharuk 2381: }
1.515 foxr 2382: #this chunk is responsible for printing the path to problem
2383:
1.253 sakharuk 2384: my $newurlp=$urlp;
2385: if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;}
2386: $newurlp=&path_to_problem($newurlp,$LaTeXwidth);
1.242 sakharuk 2387: $texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/;
1.152 sakharuk 2388: if ($flag_latex_header_remove ne 'NO') {
2389: $texversion = &latex_header_footer_remove($texversion);
2390: } else {
2391: $texversion =~ s/\\end{document}//;
1.216 sakharuk 2392: }
2393: if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
2394: $texversion=&IndexCreation($texversion,$urlp);
1.152 sakharuk 2395: }
1.219 sakharuk 2396: if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
2397: $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
2398:
2399: }
1.152 sakharuk 2400: $result .= $texversion;
2401: }
2402: $flag_latex_header_remove = 'YES';
1.151 sakharuk 2403: }
1.175 sakharuk 2404: if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;}
1.152 sakharuk 2405: $result .= '\end{document}';
1.140 sakharuk 2406: }
2407: #-------------------------------------------------------- corrections for the different page formats
1.499 foxr 2408:
2409: # Only post process if that has not been turned off e.g. by a raw latex resource.
2410:
2411: if ($do_postprocessing) {
2412: $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade);
2413: $result = &latex_corrections($number_of_columns,$result,$selectionmade,
2414: $helper->{'VARS'}->{'ANSWER_TYPE'});
2415: #if ($numberofcolumns == 1) {
1.451 albertel 2416: $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /;
2417: $result =~ s/\\textheight\s*=?\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /;
2418: $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
2419: $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
1.499 foxr 2420: #}
2421: }
1.367 foxr 2422:
1.515 foxr 2423: # Set URLback if this is a construction space print so we can provide
2424: # a link to the resource being edited.
2425: #
1.274 sakharuk 2426:
1.276 sakharuk 2427: my $URLback=''; #link to original document
1.510 albertel 2428: if ($helper->{'VARS'}->{'construction'} eq '1') {
1.276 sakharuk 2429: #prints resource from the construction space
2430: $URLback='/'.$helper->{'VARS'}->{'filename'};
1.279 albertel 2431: if ($URLback=~/([^?]+)/) {
2432: $URLback=$1;
2433: $URLback=~s|^/~|/priv/|;
2434: }
1.276 sakharuk 2435: }
1.556 foxr 2436: #
2437: # Final adjustment of the font size:
2438: #
2439:
2440: $result = set_font_size($result);
1.375 foxr 2441:
1.525 www 2442: #-- writing .tex file in prtspool
2443: my $temp_file;
2444: my $identifier = &Apache::loncommon::get_cgi_id();
2445: my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";
2446: if (!($#print_array>0)) {
2447: unless ($temp_file = Apache::File->new('>'.$filename)) {
2448: $r->log_error("Couldn't open $filename for output $!");
2449: return SERVER_ERROR;
2450: }
2451: print $temp_file $result;
2452: my $begin=index($result,'\begin{document}',0);
2453: my $inc=substr($result,0,$begin+16);
1.515 foxr 2454: } else {
1.525 www 2455: my $begin=index($result,'\begin{document}',0);
2456: my $inc=substr($result,0,$begin+16);
2457: for (my $i=0;$i<=$#print_array;$i++) {
2458: if ($i==0) {
2459: $print_array[$i]=$result;
2460: } else {
2461: $print_array[$i].='\end{document}';
2462: $print_array[$i] =
2463: &latex_corrections($number_of_columns,$print_array[$i],
2464: $selectionmade,
2465: $helper->{'VARS'}->{'ANSWER_TYPE'});
1.515 foxr 2466:
1.525 www 2467: my $anobegin=index($print_array[$i],'\setcounter{page}',0);
2468: substr($print_array[$i],0,$anobegin)='';
2469: $print_array[$i]=$inc.$print_array[$i];
2470: }
2471: my $temp_file;
2472: my $newfilename=$filename;
2473: my $num=$i+1;
2474: $newfilename =~s/\.tex$//;
2475: $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);
2476: unless ($temp_file = Apache::File->new('>'.$newfilename)) {
2477: $r->log_error("Couldn't open $newfilename for output $!");
2478: return SERVER_ERROR;
2479: }
2480: print $temp_file $print_array[$i];
2481: }
2482: }
2483: my $student_names='';
2484: if ($#print_array>0) {
2485: for (my $i=0;$i<=$#print_array;$i++) {
2486: $student_names.=$student_names[$i].'_ENDPERSON_';
1.515 foxr 2487: }
1.525 www 2488: } else {
2489: if ($#student_names>-1) {
2490: $student_names=$student_names[0].'_ENDPERSON_';
1.515 foxr 2491: } else {
1.525 www 2492: my $fullname = &get_name($env{'user.name'},$env{'user.domain'});
2493: $student_names=join(':',$env{'user.name'},$env{'user.domain'},
1.515 foxr 2494: $env{'request.course.sec'},$fullname).
2495: '_ENDPERSON_'.'_END_';
2496: }
1.525 www 2497: }
1.515 foxr 2498:
1.525 www 2499: # logic for now is too complex to trace if this has been defined
2500: # yet.
2501: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
2502: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2503: &Apache::lonnet::appenv({'cgi.'.$identifier.'.file' => $filename,
1.515 foxr 2504: 'cgi.'.$identifier.'.layout' => $laystyle,
2505: 'cgi.'.$identifier.'.numcol' => $numberofcolumns,
2506: 'cgi.'.$identifier.'.paper' => $papersize,
2507: 'cgi.'.$identifier.'.selection' => $selectionmade,
2508: 'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},
2509: 'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},
2510: 'cgi.'.$identifier.'.role' => $perm{'pav'},
2511: 'cgi.'.$identifier.'.numberoffiles' => $#print_array,
2512: 'cgi.'.$identifier.'.studentnames' => $student_names,
1.520 raeburn 2513: 'cgi.'.$identifier.'.backref' => $URLback,});
1.525 www 2514: &Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'},
1.515 foxr 2515: "cgi.$identifier.domain" => $env{'user.domain'},
2516: "cgi.$identifier.courseid" => $cnum,
2517: "cgi.$identifier.coursedom" => $cdom,
1.520 raeburn 2518: "cgi.$identifier.resources" => $resources_printed});
1.515 foxr 2519:
1.525 www 2520: my $end_page = &Apache::loncommon::end_page();
1.529 raeburn 2521: my $continue_text = &mt('Continue');
1.525 www 2522: # If there's been an unrecoverable SSI error, report it to the user
2523: if ($ssi_error) {
2524: my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk');
1.554 bisitz 2525: $r->print('<br /><p class="LC_error">'.&mt('An unrecoverable network error occurred:').'</p><p>'.
1.526 www 2526: &mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:').
2527: '<br />'.$ssi_last_error_resource.'<br />'.$ssi_last_error.
2528: '</p><p>'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'<br />'.
1.528 raeburn 2529: &mt('You may be able to reprint the individual resources for which this error occurred, as the issue may be temporary.').
1.525 www 2530: '<br />'.&mt('If the error persists, please contact the [_1] for assistance.',$helpurl).'</p><p>'.
2531: &mt('We apologize for the inconvenience.').'</p>'.
1.528 raeburn 2532: '<a href="/cgi-bin/printout.pl?'.$identifier.'">'.$continue_text.'</a>'.$end_page);
1.525 www 2533: } else {
1.515 foxr 2534: $r->print(<<FINALEND);
1.317 albertel 2535: <br />
1.288 albertel 2536: <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
1.528 raeburn 2537: <a href="/cgi-bin/printout.pl?$identifier">$continue_text</a>
1.431 albertel 2538: $end_page
1.140 sakharuk 2539: FINALEND
1.528 raeburn 2540: } # endif ssi errors.
1.140 sakharuk 2541: }
2542:
1.288 albertel 2543:
2544: sub get_CODE {
1.381 albertel 2545: my ($all_codes,$num,$seed,$size,$type)=@_;
1.288 albertel 2546: my $max='1'.'0'x$size;
2547: my $newcode;
2548: while(1) {
1.392 albertel 2549: $newcode=sprintf("%0".$size."d",int(rand($max)));
1.288 albertel 2550: if (!exists($$all_codes{$newcode})) {
2551: $$all_codes{$newcode}=1;
1.381 albertel 2552: if ($type eq 'number' ) {
2553: return $newcode;
2554: } else {
2555: return &num_to_letters($newcode);
2556: }
1.288 albertel 2557: }
2558: }
2559: }
1.140 sakharuk 2560:
1.284 albertel 2561: sub print_resources {
1.360 albertel 2562: my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
1.422 albertel 2563: $LaTeXwidth)=@_;
1.284 albertel 2564: my $current_output = '';
1.375 foxr 2565: my $printed = '';
1.284 albertel 2566: my ($username,$userdomain,$usersection) = split /:/,$person;
2567: my $fullname = &get_name($username,$userdomain);
1.492 foxr 2568: my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace.
1.288 albertel 2569: if ($person =~ 'anon') {
1.492 foxr 2570: $namepostfix .="Name: ";
1.288 albertel 2571: $fullname = "CODE - ".$moreenv->{'CODE'};
2572: }
1.444 foxr 2573: # Fullname may have special latex characters that need \ prefixing:
2574: #
2575:
1.350 foxr 2576: my $i = 0;
1.284 albertel 2577: #goes through all resources, checks if they are available for
2578: #current student, and produces output
1.428 albertel 2579:
2580: &Apache::lonxml::clear_problem_counter();
1.364 albertel 2581: my %page_breaks = &get_page_breaks($helper);
1.476 albertel 2582: my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1];
1.440 foxr 2583: #
1.441 foxr 2584: # end each student with a
1.440 foxr 2585: # Special that allows the post processor to even out the page
2586: # counts later. Nasty problem this... it would be really
2587: # nice to put the special in as a postscript comment
1.441 foxr 2588: # e.g. \special{ps:\ENDOFSTUDENTSTAMP} unfortunately,
1.440 foxr 2589: # The special gets passed the \ and dvips puts it in the output file
1.441 foxr 2590: # so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the
2591: # postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself.
1.440 foxr 2592: #
1.363 foxr 2593:
1.511 foxr 2594:
1.284 albertel 2595: foreach my $curresline (@{$master_seq}) {
1.351 foxr 2596: if (defined $page_breaks{$curresline}) {
1.350 foxr 2597: if($i != 0) {
2598: $current_output.= "\\newpage\n";
2599: }
2600: }
2601: $i++;
1.511 foxr 2602:
1.284 albertel 2603: if ( !($type eq 'problems' &&
2604: ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {
2605: my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
2606: if (&Apache::lonnet::allowed('bre',$res_url)) {
1.414 albertel 2607: if ($res_url!~m|^ext/|
1.413 albertel 2608: && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
1.375 foxr 2609: $printed .= $curresline.':';
1.557.2.1 foxr 2610: &Apache::lonnet::logthis("At line 2427 printing $curresline");
1.428 albertel 2611: &Apache::lonxml::remember_problem_counter();
2612:
1.526 www 2613: my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
1.428 albertel 2614:
1.305 sakharuk 2615: if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
2616: ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.380 foxr 2617: # Use a copy of the hash so we don't pervert it on future loop passes.
2618: my %answerenv = %{$moreenv};
2619: $answerenv{'answer_output_mode'}='tex';
2620: $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1.428 albertel 2621:
2622: &Apache::lonxml::restore_problem_counter();
2623:
1.380 foxr 2624: my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);
1.428 albertel 2625:
1.305 sakharuk 2626: if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
2627: $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;
2628: } else {
1.423 foxr 2629:
2630:
2631: my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
1.552 foxr 2632: $header =~ s/\\begin{document}//; #<<<<<
1.477 albertel 2633: my $title = &Apache::lonnet::gettitle($curresline);
2634: $title = &Apache::lonxml::latex_special_symbols($title);
2635: my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
2636: $body .=&path_to_problem($res_url,$LaTeXwidth);
1.423 foxr 2637: $body .='\vskip 1 mm '.$ansrendered;
2638: $body = &encapsulate_minipage($body);
2639: $rendered = $header.$body;
1.305 sakharuk 2640: }
2641: }
1.511 foxr 2642:
2643: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
2644: my $url = &Apache::lonnet::clutter($res_url);
2645: my $annotation = &annotate($url);
2646: $rendered =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;
2647: }
1.305 sakharuk 2648: if ($remove_latex_header eq 'YES') {
2649: $rendered = &latex_header_footer_remove($rendered);
2650: } else {
2651: $rendered =~ s/\\end{document}//;
2652: }
2653: $current_output .= $rendered;
1.456 raeburn 2654: } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
1.375 foxr 2655: $printed .= $curresline.':';
1.528 raeburn 2656: my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
1.511 foxr 2657: if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
2658: my $url = &Apache::lonnet::clutter($res_url);
2659: my $annotation = &annotate($url);
2660: $annotation =~ s/(\\end{document})/$annotation$1/;
2661: }
1.305 sakharuk 2662: if ($remove_latex_header eq 'YES') {
2663: $rendered = &latex_header_footer_remove($rendered);
1.284 albertel 2664: } else {
1.305 sakharuk 2665: $rendered =~ s/\\end{document}//;
1.284 albertel 2666: }
1.421 foxr 2667: $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
1.552 foxr 2668: } elsif($res_url = ~/\.pdf$/) {
2669: my $url = &Apache::lonnet::clutter($res_url);
2670: my $rendered = &include_pdf($url);
2671: if ($remove_latex_header ne 'NO') {
2672: $rendered = &latex_header_footer_remove($rendered);
2673: }
2674: $current_output .= $rendered;
1.284 albertel 2675: } else {
1.414 albertel 2676: my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline);
1.305 sakharuk 2677: if ($remove_latex_header ne 'NO') {
2678: $rendered = &latex_header_footer_remove($rendered);
2679: } else {
2680: $rendered =~ s/\\end{document}//;
2681: }
2682: $current_output .= $rendered;
1.284 albertel 2683: }
2684: }
2685: $remove_latex_header = 'YES';
1.550 foxr 2686: }
1.331 albertel 2687: if (&Apache::loncommon::connection_aborted($r)) { last; }
1.284 albertel 2688: }
1.552 foxr 2689:
2690:
1.284 albertel 2691: my $courseidinfo = &get_course();
2692: my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
1.476 albertel 2693: my $header_line =
1.486 foxr 2694: &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
1.537 foxr 2695: $currentassignment, $courseidinfo, $fullname, $usersection);
1.476 albertel 2696: my $header_start = ($columns_in_format == 1) ? '\lhead'
2697: : '\fancyhead[LO]';
2698: $header_line = $header_start.'{'.$header_line.'}';
1.284 albertel 2699: if ($current_output=~/\\documentclass/) {
1.476 albertel 2700: $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /;
1.284 albertel 2701: } else {
1.476 albertel 2702: my $blankpages =
2703: '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};
2704:
2705: $current_output = '\strut\vspace*{-6 mm}\\newline'.
2706: ©right_line().' \newpage '.$blankpages.$end_of_student.
2707: '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.
2708: $header_line.$namepostfix.'} \vskip 5 mm '.$current_output;
1.284 albertel 2709: }
1.440 foxr 2710: #
2711: # Close the student bracketing.
2712: #
1.375 foxr 2713: return ($current_output,$fullname, $printed);
1.284 albertel 2714:
2715: }
1.140 sakharuk 2716:
1.3 sakharuk 2717: sub handler {
2718:
2719: my $r = shift;
1.397 albertel 2720:
2721: &init_perm();
1.114 bowersj2 2722:
1.416 foxr 2723:
1.67 www 2724:
1.397 albertel 2725: my $helper = printHelper($r);
2726: if (!ref($helper)) {
2727: return $helper;
1.60 sakharuk 2728: }
1.177 sakharuk 2729:
1.184 sakharuk 2730:
1.454 foxr 2731: %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
1.353 foxr 2732:
1.416 foxr 2733:
1.350 foxr 2734:
2735:
1.367 foxr 2736: # If a figure conversion queue file exists for this user.domain
2737: # we delete it since it can only be bad (if it were good, printout.pl
2738: # would have deleted it the last time around.
2739:
1.373 albertel 2740: my $conversion_queuefile = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
1.367 foxr 2741: if(-e $conversion_queuefile) {
2742: unlink $conversion_queuefile;
2743: }
1.515 foxr 2744:
2745:
1.184 sakharuk 2746: &output_data($r,$helper,\%parmhash);
1.2 sakharuk 2747: return OK;
1.60 sakharuk 2748: }
1.2 sakharuk 2749:
1.131 bowersj2 2750: use Apache::lonhelper;
1.130 sakharuk 2751:
1.223 bowersj2 2752: sub addMessage {
2753: my $text = shift;
2754: my $paramHash = Apache::lonhelper::getParamHash();
2755: $paramHash->{MESSAGE_TEXT} = $text;
2756: Apache::lonhelper::message->new();
2757: }
2758:
1.416 foxr 2759:
1.238 bowersj2 2760:
1.397 albertel 2761: sub init_perm {
2762: undef(%perm);
2763: $perm{'pav'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'});
2764: if (!$perm{'pav'}) {
2765: $perm{'pav'}=&Apache::lonnet::allowed('pav',
2766: $env{'request.course.id'}.'/'.$env{'request.course.sec'});
2767: }
1.465 albertel 2768: $perm{'pfo'}=&Apache::lonnet::allowed('pfo',$env{'request.course.id'});
1.397 albertel 2769: if (!$perm{'pfo'}) {
2770: $perm{'pfo'}=&Apache::lonnet::allowed('pfo',
2771: $env{'request.course.id'}.'/'.$env{'request.course.sec'});
2772: }
2773: }
2774:
1.507 albertel 2775: sub get_randomly_ordered_warning {
2776: my ($helper,$map) = @_;
2777:
2778: my $message;
2779:
2780: my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'};
2781: my $navmap = Apache::lonnavmaps::navmap->new();
1.547 raeburn 2782: if (defined($navmap)) {
2783: my $res = $navmap->getResourceByUrl($map);
2784: if ($res) {
2785: my $func =
2786: sub { return ($_[0]->is_map() && $_[0]->randomorder); };
2787: my @matches = $navmap->retrieveResources($res, $func,1,1,1);
2788: if (@matches) {
2789: $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order.";
2790: }
2791: }
2792: if ($message) {
2793: return '<message type="warning">'.$message.'</message>';
2794: }
2795: } else {
2796: $message = "Retrieval of information about ordering of resources failed.";
2797: return '<message type="warning">'.$message.'</message>';
1.507 albertel 2798: }
2799: return;
2800: }
2801:
1.131 bowersj2 2802: sub printHelper {
1.115 bowersj2 2803: my $r = shift;
2804:
2805: if ($r->header_only) {
1.373 albertel 2806: if ($env{'browser.mathml'}) {
1.241 www 2807: &Apache::loncommon::content_type($r,'text/xml');
1.131 bowersj2 2808: } else {
1.241 www 2809: &Apache::loncommon::content_type($r,'text/html');
1.131 bowersj2 2810: }
2811: $r->send_http_header;
2812: return OK;
1.115 bowersj2 2813: }
2814:
1.131 bowersj2 2815: # Send header, nocache
1.373 albertel 2816: if ($env{'browser.mathml'}) {
1.241 www 2817: &Apache::loncommon::content_type($r,'text/xml');
1.115 bowersj2 2818: } else {
1.241 www 2819: &Apache::loncommon::content_type($r,'text/html');
1.115 bowersj2 2820: }
2821: &Apache::loncommon::no_cache($r);
2822: $r->send_http_header;
2823: $r->rflush();
2824:
1.131 bowersj2 2825: # Unfortunately, this helper is so complicated we have to
2826: # write it by hand
2827:
2828: Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
2829:
1.176 bowersj2 2830: my $helper = Apache::lonhelper::helper->new("Printing Helper");
1.146 bowersj2 2831: $helper->declareVar('symb');
1.156 bowersj2 2832: $helper->declareVar('postdata');
1.290 sakharuk 2833: $helper->declareVar('curseed');
2834: $helper->declareVar('probstatus');
1.156 bowersj2 2835: $helper->declareVar('filename');
2836: $helper->declareVar('construction');
1.178 sakharuk 2837: $helper->declareVar('assignment');
1.262 sakharuk 2838: $helper->declareVar('style_file');
1.340 foxr 2839: $helper->declareVar('student_sort');
1.363 foxr 2840: $helper->declareVar('FINISHPAGE');
1.366 foxr 2841: $helper->declareVar('PRINT_TYPE');
1.372 foxr 2842: $helper->declareVar("showallfoils");
1.483 foxr 2843: $helper->declareVar("STUDENTS");
1.363 foxr 2844:
1.518 foxr 2845:
2846:
2847:
2848:
1.363 foxr 2849: # The page breaks can get loaded initially from the course environment:
1.394 foxr 2850: # But we only do this in the initial state so that they are allowed to change.
2851: #
1.366 foxr 2852:
1.416 foxr 2853: # $helper->{VARS}->{FINISHPAGE} = '';
1.363 foxr 2854:
2855: &Apache::loncommon::restore_course_settings('print',
1.366 foxr 2856: {'pagebreaks' => 'scalar',
2857: 'lastprinttype' => 'scalar'});
2858:
1.483 foxr 2859: # This will persistently load in the data we want from the
2860: # very first screen.
1.394 foxr 2861:
2862: if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {
2863: if (!defined ($env{"form.CURRENT_STATE"})) {
2864:
2865: $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
2866: } else {
2867: my $state = $env{"form.CURRENT_STATE"};
2868: if ($state eq "START") {
2869: $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
2870: }
2871: }
2872:
1.366 foxr 2873: }
1.481 albertel 2874:
1.156 bowersj2 2875: # Detect whether we're coming from construction space
1.373 albertel 2876: if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {
1.235 bowersj2 2877: $helper->{VARS}->{'filename'} = "~$1/$2";
1.156 bowersj2 2878: $helper->{VARS}->{'construction'} = 1;
1.481 albertel 2879: } else {
1.373 albertel 2880: if ($env{'form.postdata'}) {
2881: $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});
1.482 albertel 2882: if ( $helper->{VARS}->{'symb'} eq '') {
2883: $helper->{VARS}->{'postdata'} = $env{'form.postdata'};
2884: }
1.156 bowersj2 2885: }
1.373 albertel 2886: if ($env{'form.symb'}) {
2887: $helper->{VARS}->{'symb'} = $env{'form.symb'};
1.156 bowersj2 2888: }
1.373 albertel 2889: if ($env{'form.url'}) {
1.156 bowersj2 2890: $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
2891: }
1.416 foxr 2892:
1.157 bowersj2 2893: }
1.481 albertel 2894:
1.373 albertel 2895: if ($env{'form.symb'}) {
2896: $helper->{VARS}->{'symb'} = $env{'form.symb'};
1.146 bowersj2 2897: }
1.373 albertel 2898: if ($env{'form.url'}) {
1.140 sakharuk 2899: $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
1.153 sakharuk 2900:
1.140 sakharuk 2901: }
1.343 albertel 2902: $helper->{VARS}->{'symb'}=
2903: &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
1.335 albertel 2904: my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);
1.178 sakharuk 2905: if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
1.481 albertel 2906:
1.156 bowersj2 2907:
1.146 bowersj2 2908: # Extract map
2909: my $symb = $helper->{VARS}->{'symb'};
1.156 bowersj2 2910: my ($map, $id, $url);
2911: my $subdir;
1.483 foxr 2912: my $is_published=0; # True when printing from resource space.
1.156 bowersj2 2913:
2914: # Get the resource name from construction space
2915: if ($helper->{VARS}->{'construction'}) {
2916: $resourceTitle = substr($helper->{VARS}->{'filename'},
2917: rindex($helper->{VARS}->{'filename'}, '/')+1);
2918: $subdir = substr($helper->{VARS}->{'filename'},
2919: 0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
1.481 albertel 2920: } else {
1.482 albertel 2921: if ($symb ne '') {
2922: ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
2923: $helper->{VARS}->{'postdata'} =
2924: &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
2925: } else {
2926: $url = $helper->{VARS}->{'postdata'};
1.483 foxr 2927: $is_published=1; # From resource space.
1.482 albertel 2928: }
2929: $url = &Apache::lonnet::clutter($url);
1.481 albertel 2930:
1.156 bowersj2 2931: if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
1.238 bowersj2 2932: my $postdata = $helper->{VARS}->{'postdata'};
2933: $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
1.156 bowersj2 2934: }
2935: $subdir = &Apache::lonnet::filelocation("", $url);
1.128 bowersj2 2936: }
1.373 albertel 2937: if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {
2938: $helper->{VARS}->{'curseed'}=$env{'form.curseed'};
1.230 albertel 2939: }
1.373 albertel 2940: if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
1.512 foxr 2941: $helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'};
1.290 sakharuk 2942: }
1.115 bowersj2 2943:
1.192 bowersj2 2944: my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
2945:
1.481 albertel 2946: Apache::lonhelper::registerHelperTags();
1.119 bowersj2 2947:
1.131 bowersj2 2948: # "Delete everything after the last slash."
1.119 bowersj2 2949: $subdir =~ s|/[^/]+$||;
2950:
1.131 bowersj2 2951: # What can be printed is a very dynamic decision based on
2952: # lots of factors. So we need to dynamically build this list.
2953: # To prevent security leaks, states are only added to the wizard
2954: # if they can be reached, which ensures manipulating the form input
2955: # won't allow anyone to reach states they shouldn't have permission
2956: # to reach.
2957:
2958: # printChoices is tracking the kind of printing the user can
2959: # do, and will be used in a choices construction later.
2960: # In the meantime we will be adding states and elements to
2961: # the helper by hand.
2962: my $printChoices = [];
2963: my $paramHash;
1.130 sakharuk 2964:
1.240 albertel 2965: if ($resourceTitle) {
1.458 www 2966: push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE'];
1.156 bowersj2 2967: }
2968:
1.238 bowersj2 2969: # Useful filter strings
1.540 raeburn 2970: my $isProblem = '($res->is_problem()||$res->contains_problem||$res->is_practice()) ';
1.238 bowersj2 2971: $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
1.541 raeburn 2972: my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice()';
1.287 albertel 2973: my $isNotMap = '!$res->is_sequence()';
1.238 bowersj2 2974: $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
2975: my $isMap = '$res->is_map()';
1.342 albertel 2976: my $symbFilter = '$res->shown_symb()';
2977: my $urlValue = '$res->link()';
1.238 bowersj2 2978:
2979: $helper->declareVar('SEQUENCE');
2980:
1.465 albertel 2981: # If we're in a sequence...
1.416 foxr 2982:
1.465 albertel 2983: my $start_new_option;
2984: if ($perm{'pav'}) {
2985: $start_new_option =
2986: "<option text='".&mt('Start new page<br />before selected').
2987: "' variable='FINISHPAGE' />";
2988: }
1.238 bowersj2 2989:
1.483 foxr 2990: if (($helper->{'VARS'}->{'construction'} ne '1' ) &&
1.243 bowersj2 2991: $helper->{VARS}->{'postdata'} &&
2992: $helper->{VARS}->{'assignment'}) {
1.131 bowersj2 2993: # Allow problems from sequence
1.546 bisitz 2994: push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 'map_problems', 'CHOOSE_PROBLEMS'];
1.131 bowersj2 2995: # Allow all resources from sequence
1.546 bisitz 2996: push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
1.465 albertel 2997:
1.131 bowersj2 2998: my $helperFragment = <<HELPERFRAGMENT;
1.155 sakharuk 2999: <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
1.435 foxr 3000: <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
1.287 albertel 3001: closeallpages="1">
1.144 bowersj2 3002: <nextstate>PAGESIZE</nextstate>
1.435 foxr 3003: <filterfunc>return $isProblem;</filterfunc>
1.131 bowersj2 3004: <mapurl>$map</mapurl>
1.238 bowersj2 3005: <valuefunc>return $symbFilter;</valuefunc>
1.465 albertel 3006: $start_new_option
1.131 bowersj2 3007: </resource>
3008: </state>
3009:
1.155 sakharuk 3010: <state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print">
1.435 foxr 3011: <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
1.287 albertel 3012: closeallpages="1">
1.144 bowersj2 3013: <nextstate>PAGESIZE</nextstate>
1.435 foxr 3014: <filterfunc>return $isNotMap;</filterfunc>
1.131 bowersj2 3015: <mapurl>$map</mapurl>
1.238 bowersj2 3016: <valuefunc>return $symbFilter;</valuefunc>
1.465 albertel 3017: $start_new_option
1.131 bowersj2 3018: </resource>
3019: </state>
3020: HELPERFRAGMENT
1.121 bowersj2 3021:
1.326 sakharuk 3022: &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
1.121 bowersj2 3023: }
3024:
1.546 bisitz 3025: # If the user has pfo (print for others) allow them to print all
3026: # problems and resources in the entire course, optionally for selected students
1.483 foxr 3027: if ($perm{'pfo'} && !$is_published &&
1.481 albertel 3028: ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {
3029:
1.509 albertel 3030: push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];
3031: push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];
1.536 foxr 3032: push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];
1.284 albertel 3033: &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
1.155 sakharuk 3034: <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
1.287 albertel 3035: <resource variable="RESOURCES" toponly='0' multichoice="1"
3036: suppressEmptySequences='0' addstatus="1" closeallpages="1">
1.144 bowersj2 3037: <nextstate>PAGESIZE</nextstate>
1.192 bowersj2 3038: <filterfunc>return $isProblemOrMap;</filterfunc>
1.287 albertel 3039: <choicefunc>return $isNotMap;</choicefunc>
1.238 bowersj2 3040: <valuefunc>return $symbFilter;</valuefunc>
1.465 albertel 3041: $start_new_option
1.284 albertel 3042: </resource>
3043: </state>
1.354 foxr 3044: <state name="ALL_RESOURCES" title="Select Resource(s) to print">
3045: <resource variable="RESOURCES" toponly='0' multichoice='1'
3046: suppressEmptySequences='0' addstatus='1' closeallpages='1'>
3047: <nextstate>PAGESIZE</nextstate>
3048: <filterfunc>return $isNotMap; </filterfunc>
3049: <valuefunc>return $symbFilter;</valuefunc>
1.465 albertel 3050: $start_new_option
1.354 foxr 3051: </resource>
3052: </state>
1.536 foxr 3053: <state name="ALL_PROBLEMS_STUDENTS" title="Select Problem(s) to print">
3054: <resource variable="RESOURCES" toponly='0' multichoice="1"
3055: suppressEmptySequences='0' addstatus="1" closeallpages="1">
3056: <nextstate>STUDENTS1</nextstate>
3057: <filterfunc>return $isProblemOrMap;</filterfunc>
3058: <choicefunc>return $isNotMap;</choicefunc>
3059: <valuefunc>return $symbFilter;</valuefunc>
3060: $start_new_option
3061: </resource>
3062: </state>
3063: <state name="STUDENTS1" title="Select People">
3064: <message><b>Select sorting order of printout</b> </message>
3065: <choices variable='student_sort'>
3066: <choice computer='0'>Sort by section then student</choice>
3067: <choice computer='1'>Sort by students across sections.</choice>
3068: </choices>
3069: <message><br /><hr /><br /> </message>
3070: <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>
3071: </state>
3072:
1.284 albertel 3073: ALL_PROBLEMS
1.132 bowersj2 3074:
1.284 albertel 3075: if ($helper->{VARS}->{'assignment'}) {
1.546 bisitz 3076: push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'problems_for_students', 'CHOOSE_STUDENTS'];
3077: push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'problems_for_anon', 'CHOOSE_ANON1'];
1.284 albertel 3078: }
1.424 foxr 3079:
1.507 albertel 3080: my $randomly_ordered_warning =
3081: &get_randomly_ordered_warning($helper,$map);
3082:
1.424 foxr 3083: # resource_selector will hold a few states that:
3084: # - Allow resources to be selected for printing.
3085: # - Determine pagination between assignments.
3086: # - Determine how many assignments should be bundled into a single PDF.
3087: # TODO:
3088: # Probably good to do things like separate this up into several vars, each
3089: # with one state, and use REGEXPs at inclusion time to set state names
3090: # and next states for better mix and match capability
3091: #
1.284 albertel 3092: my $resource_selector=<<RESOURCE_SELECTOR;
1.424 foxr 3093: <state name="SELECT_PROBLEMS" title="Select resources to print">
1.507 albertel 3094: $randomly_ordered_warning
3095:
1.424 foxr 3096: <nextstate>PRINT_FORMATTING</nextstate>
1.284 albertel 3097: <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
1.287 albertel 3098: <resource variable="RESOURCES" multichoice="1" addstatus="1"
3099: closeallpages="1">
1.254 sakharuk 3100: <filterfunc>return $isProblem;</filterfunc>
1.148 bowersj2 3101: <mapurl>$map</mapurl>
1.254 sakharuk 3102: <valuefunc>return $symbFilter;</valuefunc>
1.465 albertel 3103: $start_new_option
1.147 bowersj2 3104: </resource>
1.424 foxr 3105: </state>
3106: <state name="PRINT_FORMATTING" title="How should results be printed?">
1.155 sakharuk 3107: <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
1.149 bowersj2 3108: <choices variable="EMPTY_PAGES">
1.204 sakharuk 3109: <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>
3110: <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>
3111: <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
3112: <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
1.284 albertel 3113: </choices>
1.424 foxr 3114: <nextstate>PAGESIZE</nextstate>
1.429 foxr 3115: <message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message>
3116: <choices variable="SPLIT_PDFS">
3117: <choice computer="all">All assignments in a single PDF file</choice>
3118: <choice computer="sections">Each PDF contains exactly one section</choice>
3119: <choice computer="oneper">Each PDF contains exactly one assignment</choice>
1.449 albertel 3120: <choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT">
3121: Specify the number of assignments per PDF:</choice>
1.429 foxr 3122: </choices>
1.424 foxr 3123: </state>
1.284 albertel 3124: RESOURCE_SELECTOR
3125:
3126: &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
3127: <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
1.485 albertel 3128: <message><b>Select sorting order of printout</b> </message>
1.340 foxr 3129: <choices variable='student_sort'>
3130: <choice computer='0'>Sort by section then student</choice>
3131: <choice computer='1'>Sort by students across sections.</choice>
3132: </choices>
1.437 foxr 3133: <message><br /><hr /><br /> </message>
1.425 foxr 3134: <student multichoice='1' variable="STUDENTS" nextstate="SELECT_PROBLEMS" coursepersonnel="1"/>
1.424 foxr 3135: </state>
1.284 albertel 3136: $resource_selector
1.131 bowersj2 3137: CHOOSE_STUDENTS
1.292 albertel 3138:
1.373 albertel 3139: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3140: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
1.292 albertel 3141: my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);
3142: my $namechoice='<choice></choice>';
1.337 albertel 3143: foreach my $name (sort {uc($a) cmp uc($b)} @names) {
1.294 albertel 3144: if ($name =~ /^error: 2 /) { next; }
1.381 albertel 3145: if ($name =~ /^type\0/) { next; }
1.292 albertel 3146: $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
3147: }
1.389 foxr 3148:
3149:
3150: my %code_values;
1.405 albertel 3151: my %codes_to_print;
1.411 albertel 3152: foreach my $key (@names) {
1.389 foxr 3153: %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);
1.405 albertel 3154: foreach my $key (keys(%code_values)) {
3155: $codes_to_print{$key} = 1;
1.388 foxr 3156: }
3157: }
1.389 foxr 3158:
1.452 albertel 3159: my $code_selection;
1.405 albertel 3160: foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) {
1.389 foxr 3161: my $choice = $code;
3162: if ($code =~ /^[A-Z]+$/) { # Alpha code
3163: $choice = &letters_to_num($code);
3164: }
1.432 albertel 3165: push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]);
1.388 foxr 3166: }
1.436 albertel 3167: if (%codes_to_print) {
3168: $code_selection .='
1.472 albertel 3169: <message><b>Choose single CODE from list:</b></message>
1.448 albertel 3170: <message></td><td></message>
1.452 albertel 3171: <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
3172: <choice></choice>
1.448 albertel 3173: <exec>
3174: push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}});
3175: </exec>
1.452 albertel 3176: </dropdown>
1.468 foxr 3177: <message></td></tr><tr><td></message>
1.436 albertel 3178: '.$/;
1.448 albertel 3179:
1.436 albertel 3180: }
1.432 albertel 3181:
1.542 raeburn 3182: my @lines = &Apache::grades::get_scantronformat_file();
1.381 albertel 3183: my $codechoice='';
1.542 raeburn 3184: foreach my $line (@lines) {
1.381 albertel 3185: my ($name,$description,$code_type,$code_length)=
3186: (split(/:/,$line))[0,1,2,4];
3187: if ($code_length > 0 &&
3188: $code_type =~/^(letter|number|-1)/) {
3189: $codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';
3190: }
3191: }
3192: if ($codechoice eq '') {
3193: $codechoice='<choice computer="default">Default</choice>';
3194: }
1.284 albertel 3195: &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);
1.468 foxr 3196: <state name="CHOOSE_ANON1" title="Specify CODEd Assignments">
1.424 foxr 3197: <nextstate>SELECT_PROBLEMS</nextstate>
1.468 foxr 3198: <message><h4>Fill out one of the forms below</h4></message>
3199: <message><br /><hr /> <br /></message>
3200: <message><h3>Generate new CODEd Assignments</h3></message>
3201: <message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message>
1.362 albertel 3202: <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
3203: <validator>
3204: if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
1.382 foxr 3205: !\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
1.388 foxr 3206: !\$helper->{'VARS'}{'SINGLE_CODE'} &&
3207: !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.362 albertel 3208: return "You need to specify the number of assignments to print";
3209: }
3210: return undef;
3211: </validator>
3212: </string>
3213: <message></td></tr><tr><td></message>
1.501 albertel 3214: <message><b>Names to save the CODEs under for later:</b></message>
1.412 albertel 3215: <message></td><td></message>
3216: <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
3217: <message></td></tr><tr><td></message>
3218: <message><b>Bubble sheet type:</b></message>
3219: <message></td><td></message>
3220: <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
3221: $codechoice
3222: </dropdown>
1.468 foxr 3223: <message></td></tr><tr><td colspan="2"></td></tr><tr><td></message>
3224: <message></td></tr><tr><td></table></message>
1.472 albertel 3225: <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>
1.468 foxr 3226: <message><tr><td><b>Enter a CODE to print:</b></td><td></message>
1.412 albertel 3227: <string variable="SINGLE_CODE" size="10">
1.382 foxr 3228: <validator>
3229: if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} &&
1.388 foxr 3230: !\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
3231: !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.382 foxr 3232: return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
3233: \$helper->{'VARS'}{'CODE_OPTION'});
3234: } else {
3235: return undef; # Other forces control us.
3236: }
3237: </validator>
3238: </string>
1.472 albertel 3239: <message></td></tr><tr><td></message>
1.432 albertel 3240: $code_selection
1.468 foxr 3241: <message></td></tr></table></message>
1.472 albertel 3242: <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>
1.468 foxr 3243: <message><b>Select saved CODEs:</b></message>
1.381 albertel 3244: <message></td><td></message>
1.292 albertel 3245: <dropdown variable="REUSE_OLD_CODES">
3246: $namechoice
3247: </dropdown>
1.412 albertel 3248: <message></td></tr></table></message>
1.284 albertel 3249: </state>
1.424 foxr 3250: $resource_selector
1.284 albertel 3251: CHOOSE_ANON1
1.254 sakharuk 3252:
1.272 sakharuk 3253:
1.254 sakharuk 3254: if ($helper->{VARS}->{'assignment'}) {
1.546 bisitz 3255: push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_students', 'CHOOSE_STUDENTS1'];
3256: push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2'];
1.254 sakharuk 3257: }
1.284 albertel 3258:
3259:
3260: $resource_selector=<<RESOURCE_SELECTOR;
1.424 foxr 3261: <state name="SELECT_RESOURCES" title="Select Resources">
1.507 albertel 3262: $randomly_ordered_warning
3263:
1.424 foxr 3264: <nextstate>PRINT_FORMATTING</nextstate>
1.254 sakharuk 3265: <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
1.287 albertel 3266: <resource variable="RESOURCES" multichoice="1" addstatus="1"
3267: closeallpages="1">
1.254 sakharuk 3268: <filterfunc>return $isNotMap;</filterfunc>
3269: <mapurl>$map</mapurl>
3270: <valuefunc>return $symbFilter;</valuefunc>
1.465 albertel 3271: $start_new_option
1.254 sakharuk 3272: </resource>
1.424 foxr 3273: </state>
3274: <state name="PRINT_FORMATTING" title="Format of the print job">
3275: <nextstate>NUMBER_PER_PDF</nextstate>
1.254 sakharuk 3276: <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
3277: <choices variable="EMPTY_PAGES">
3278: <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>
3279: <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>
3280: <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
3281: <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
1.284 albertel 3282: </choices>
1.424 foxr 3283: <nextstate>PAGESIZE</nextstate>
1.429 foxr 3284: <message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message>
3285: <choices variable="SPLIT_PDFS">
3286: <choice computer="all">All assignments in a single PDF file</choice>
3287: <choice computer="sections">Each PDF contains exactly one section</choice>
3288: <choice computer="oneper">Each PDF contains exactly one assignment</choice>
1.449 albertel 3289: <choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT">
3290: Specify the number of assignments per PDF:</choice>
1.429 foxr 3291: </choices>
1.424 foxr 3292: </state>
1.284 albertel 3293: RESOURCE_SELECTOR
3294:
3295: &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);
3296: <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">
1.340 foxr 3297: <choices variable='student_sort'>
3298: <choice computer='0'>Sort by section then student</choice>
3299: <choice computer='1'>Sort by students across sections.</choice>
3300: </choices>
1.437 foxr 3301: <message><br /><hr /><br /></message>
1.426 foxr 3302: <student multichoice='1' variable="STUDENTS" nextstate="SELECT_RESOURCES" coursepersonnel="1" />
1.340 foxr 3303:
1.424 foxr 3304: </state>
1.284 albertel 3305: $resource_selector
1.254 sakharuk 3306: CHOOSE_STUDENTS1
3307:
1.284 albertel 3308: &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);
1.472 albertel 3309: <state name="CHOOSE_ANON2" title="Select CODEd Assignments">
1.424 foxr 3310: <nextstate>SELECT_RESOURCES</nextstate>
1.472 albertel 3311: <message><h4>Fill out one of the forms below</h4></message>
3312: <message><br /><hr /> <br /></message>
3313: <message><h3>Generate new CODEd Assignments</h3></message>
3314: <message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message>
1.362 albertel 3315: <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
3316: <validator>
3317: if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
1.386 foxr 3318: !\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
1.388 foxr 3319: !\$helper->{'VARS'}{'SINGLE_CODE'} &&
3320: !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.362 albertel 3321: return "You need to specify the number of assignments to print";
3322: }
3323: return undef;
3324: </validator>
3325: </string>
3326: <message></td></tr><tr><td></message>
1.501 albertel 3327: <message><b>Names to save the CODEs under for later:</b></message>
1.412 albertel 3328: <message></td><td></message>
3329: <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
3330: <message></td></tr><tr><td></message>
3331: <message><b>Bubble sheet type:</b></message>
3332: <message></td><td></message>
3333: <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
3334: $codechoice
3335: </dropdown>
1.472 albertel 3336: <message></td></tr><tr><td></table></message>
3337: <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>
3338: <message><tr><td><b>Enter a CODE to print:</b></td><td></message>
1.412 albertel 3339: <string variable="SINGLE_CODE" size="10">
1.386 foxr 3340: <validator>
3341: if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} &&
1.388 foxr 3342: !\$helper->{'VARS'}{'REUSE_OLD_CODES'} &&
3343: !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.386 foxr 3344: return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
3345: \$helper->{'VARS'}{'CODE_OPTION'});
3346: } else {
3347: return undef; # Other forces control us.
3348: }
3349: </validator>
3350: </string>
1.472 albertel 3351: <message></td></tr><tr><td></message>
1.432 albertel 3352: $code_selection
1.472 albertel 3353: <message></td></tr></table></message>
3354: <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>
3355: <message><b>Select saved CODEs:</b></message>
1.381 albertel 3356: <message></td><td></message>
1.294 albertel 3357: <dropdown variable="REUSE_OLD_CODES">
3358: $namechoice
3359: </dropdown>
1.412 albertel 3360: <message></td></tr></table></message>
1.424 foxr 3361: </state>
1.284 albertel 3362: $resource_selector
3363: CHOOSE_ANON2
1.481 albertel 3364: }
3365:
1.121 bowersj2 3366: # FIXME: That RE should come from a library somewhere.
1.483 foxr 3367: if (($perm{'pav'}
1.482 albertel 3368: && $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'
3369: && (defined($helper->{'VARS'}->{'construction'})
3370: ||
3371: (&Apache::lonnet::allowed('bre',$subdir) eq 'F'
3372: &&
3373: $helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)
1.483 foxr 3374: ))
3375: && $helper->{VARS}->{'assignment'} eq ""
1.482 albertel 3376: ) {
3377: my $pretty_dir = &Apache::lonnet::hreflocation($subdir);
1.546 bisitz 3378: push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from current subdirectory [_3]','<b>','</b>','<b><i>'.$pretty_dir.'</i></b>','<b>','</b>'), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
1.139 bowersj2 3379: my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
1.482 albertel 3380: <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$pretty_dir</small></b> to print">
1.458 www 3381:
1.138 bowersj2 3382: <files variable="FILES" multichoice='1'>
1.144 bowersj2 3383: <nextstate>PAGESIZE</nextstate>
1.138 bowersj2 3384: <filechoice>return '$subdir';</filechoice>
1.139 bowersj2 3385: CHOOSE_FROM_SUBDIR
3386:
1.238 bowersj2 3387: # this is broken up because I really want interpolation above,
3388: # and I really DON'T want it below
1.139 bowersj2 3389: $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
1.225 bowersj2 3390: <filefilter>return Apache::lonhelper::files::not_old_version($filename) &&
3391: $filename =~ m/\.(problem|exam|quiz|assess|survey|form|library)$/;
1.131 bowersj2 3392: </filefilter>
1.138 bowersj2 3393: </files>
1.131 bowersj2 3394: </state>
3395: CHOOSE_FROM_SUBDIR
1.139 bowersj2 3396: &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
1.131 bowersj2 3397: }
1.238 bowersj2 3398:
3399: # Allow the user to select any sequence in the course, feed it to
3400: # another resource selector for that sequence
1.483 foxr 3401: if (!$helper->{VARS}->{'construction'} && !$is_published) {
1.509 albertel 3402: push @$printChoices, [&mtn("Selected <b>Resources</b> from <b>selected folder</b> in course"),
1.249 sakharuk 3403: 'select_sequences', 'CHOOSE_SEQUENCE'];
1.244 bowersj2 3404: my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};
3405: #Escape apostrophes and backslashes for Perl
3406: $escapedSequenceName =~ s/\\/\\\\/g;
3407: $escapedSequenceName =~ s/'/\\'/g;
1.239 bowersj2 3408: &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);
1.238 bowersj2 3409: <state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From">
3410: <message>Select the sequence to print resources from:</message>
3411: <resource variable="SEQUENCE">
3412: <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
3413: <filterfunc>return \$res->is_sequence;</filterfunc>
3414: <valuefunc>return $urlValue;</valuefunc>
1.447 foxr 3415: <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
1.391 foxr 3416: </choicefunc>
1.238 bowersj2 3417: </resource>
3418: </state>
3419: <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
3420: <message>(mark desired resources then click "next" button) <br /></message>
1.435 foxr 3421: <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
1.287 albertel 3422: closeallpages="1">
1.238 bowersj2 3423: <nextstate>PAGESIZE</nextstate>
1.466 albertel 3424: <filterfunc>return $isNotMap</filterfunc>
1.244 bowersj2 3425: <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
1.238 bowersj2 3426: <valuefunc>return $symbFilter;</valuefunc>
1.465 albertel 3427: $start_new_option
1.238 bowersj2 3428: </resource>
3429: </state>
3430: CHOOSE_FROM_ANY_SEQUENCE
1.239 bowersj2 3431: }
1.481 albertel 3432:
1.131 bowersj2 3433: # Generate the first state, to select which resources get printed.
1.223 bowersj2 3434: Apache::lonhelper::state->new("START", "Select Printing Options:");
1.131 bowersj2 3435: $paramHash = Apache::lonhelper::getParamHash();
1.155 sakharuk 3436: $paramHash->{MESSAGE_TEXT} = "";
1.131 bowersj2 3437: Apache::lonhelper::message->new();
3438: $paramHash = Apache::lonhelper::getParamHash();
3439: $paramHash->{'variable'} = 'PRINT_TYPE';
3440: $paramHash->{CHOICES} = $printChoices;
3441: Apache::lonhelper::choices->new();
1.161 bowersj2 3442:
1.223 bowersj2 3443: my $startedTable = 0; # have we started an HTML table yet? (need
3444: # to close it later)
3445:
1.397 albertel 3446: if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or
1.170 sakharuk 3447: ($helper->{VARS}->{'construction'} eq '1')) {
1.544 bisitz 3448: &addMessage('<br />'
3449: .'<h3>'.&mt('Print Options').'</h3>'
3450: .&Apache::lonhtmlcommon::start_pick_box()
3451: .&Apache::lonhtmlcommon::row_title(
3452: '<label for="ANSWER_TYPE_forminput">'
3453: .&mt('Print Answers')
3454: .'</label>'
3455: )
3456: );
1.161 bowersj2 3457: $paramHash = Apache::lonhelper::getParamHash();
1.162 sakharuk 3458: $paramHash->{'variable'} = 'ANSWER_TYPE';
3459: $helper->declareVar('ANSWER_TYPE');
1.161 bowersj2 3460: $paramHash->{CHOICES} = [
1.242 sakharuk 3461: ['Without Answers', 'yes'],
3462: ['With Answers', 'no'],
1.368 albertel 3463: ['Only Answers', 'only']
1.289 sakharuk 3464: ];
1.210 sakharuk 3465: Apache::lonhelper::dropdown->new();
1.544 bisitz 3466: &addMessage(&Apache::lonhtmlcommon::row_closure());
1.223 bowersj2 3467: $startedTable = 1;
1.556 foxr 3468:
3469: #
3470: # Select font size.
3471: #
3472:
3473: $helper->declareVar('fontsize');
3474: &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size')));
3475: my $xmlfrag = << "FONT_SELECTION";
3476:
3477:
3478: <dropdown variable='fontsize' multichoice='0', allowempty='0'>
3479: <defaultvalue>
3480: return 'normalsize';
3481: </defaultvalue>
3482: <choice computer='tiny'>Tiny</choice>
3483: <choice computer='sub/superscriptsize'>Script Size</choice>
3484: <choice computer='footnotesize'>Footnote Size</choice>
3485: <choice computer='small'>Small</choice>
3486: <choice computer='normalsize'>Normal (default)</choice>
3487: <choice computer='large'>larger than normal</choice>
3488: <choice computer='Large'>Even larger than normal</choice>
3489: <choice computer='LARGE'>Still larger than normal</choice>
3490: <choice computer='huge'>huge font size</choice>
3491: <choice computer='Huge'>Largest possible size</choice>
3492: </dropdown>
3493: FONT_SELECTION
3494: &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
3495: &addMessage(&Apache::lonhtmlcommon::row_closure(1));
1.161 bowersj2 3496: }
1.209 sakharuk 3497:
1.397 albertel 3498: if ($perm{'pav'}) {
1.223 bowersj2 3499: if (!$startedTable) {
1.497 www 3500: addMessage("<hr width='33%' /><table><tr><td align='right'>".
3501: '<label for="LATEX_TYPE_forminput">'.
3502: &mt('LaTeX mode').
3503: "</label>: </td><td>");
1.223 bowersj2 3504: $startedTable = 1;
3505: } else {
1.544 bisitz 3506: &addMessage(&Apache::lonhtmlcommon::row_title(
3507: '<label for="LATEX_TYPE_forminput">'
3508: .&mt('LaTeX mode')
3509: .'</label>'
3510: )
3511: );
1.223 bowersj2 3512: }
1.203 sakharuk 3513: $paramHash = Apache::lonhelper::getParamHash();
3514: $paramHash->{'variable'} = 'LATEX_TYPE';
3515: $helper->declareVar('LATEX_TYPE');
3516: if ($helper->{VARS}->{'construction'} eq '1') {
3517: $paramHash->{CHOICES} = [
1.223 bowersj2 3518: ['standard LaTeX mode', 'standard'],
3519: ['LaTeX batchmode', 'batchmode'], ];
1.203 sakharuk 3520: } else {
3521: $paramHash->{CHOICES} = [
1.223 bowersj2 3522: ['LaTeX batchmode', 'batchmode'],
3523: ['standard LaTeX mode', 'standard'] ];
1.203 sakharuk 3524: }
1.210 sakharuk 3525: Apache::lonhelper::dropdown->new();
1.218 sakharuk 3526:
1.544 bisitz 3527: &addMessage(&Apache::lonhtmlcommon::row_closure()
3528: .&Apache::lonhtmlcommon::row_title(
3529: '<label for="TABLE_CONTENTS_forminput">'
3530: .&mt('Print Table of Contents')
3531: .'</label>'
3532: )
3533: );
1.209 sakharuk 3534: $paramHash = Apache::lonhelper::getParamHash();
3535: $paramHash->{'variable'} = 'TABLE_CONTENTS';
3536: $helper->declareVar('TABLE_CONTENTS');
3537: $paramHash->{CHOICES} = [
1.223 bowersj2 3538: ['No', 'no'],
3539: ['Yes', 'yes'] ];
1.210 sakharuk 3540: Apache::lonhelper::dropdown->new();
1.544 bisitz 3541: &addMessage(&Apache::lonhtmlcommon::row_closure());
1.214 sakharuk 3542:
1.220 sakharuk 3543: if (not $helper->{VARS}->{'construction'}) {
1.545 bisitz 3544: &addMessage(&Apache::lonhtmlcommon::row_title(
3545: '<label for="TABLE_INDEX_forminput">'
3546: .&mt('Print Index')
3547: .'</label>'
3548: )
3549: );
1.220 sakharuk 3550: $paramHash = Apache::lonhelper::getParamHash();
3551: $paramHash->{'variable'} = 'TABLE_INDEX';
3552: $helper->declareVar('TABLE_INDEX');
3553: $paramHash->{CHOICES} = [
1.223 bowersj2 3554: ['No', 'no'],
3555: ['Yes', 'yes'] ];
1.220 sakharuk 3556: Apache::lonhelper::dropdown->new();
1.545 bisitz 3557: &addMessage(&Apache::lonhtmlcommon::row_closure());
3558: &addMessage(&Apache::lonhtmlcommon::row_title(
3559: '<label for="PRINT_DISCUSSIONS_forminput">'
3560: .&mt('Print Discussions')
3561: .'</label>'
3562: )
3563: );
1.309 sakharuk 3564: $paramHash = Apache::lonhelper::getParamHash();
3565: $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';
3566: $helper->declareVar('PRINT_DISCUSSIONS');
3567: $paramHash->{CHOICES} = [
3568: ['No', 'no'],
3569: ['Yes', 'yes'] ];
3570: Apache::lonhelper::dropdown->new();
1.545 bisitz 3571: &addMessage(&Apache::lonhtmlcommon::row_closure());
1.372 foxr 3572:
1.511 foxr 3573: # Prompt for printing annotations too.
3574:
1.545 bisitz 3575: &addMessage(&Apache::lonhtmlcommon::row_title(
3576: '<label for="PRINT_ANNOTATIONS_forminput">'
3577: .&mt('Print Annotations')
3578: .'</label>'
3579: )
3580: );
1.511 foxr 3581: $paramHash = Apache::lonhelper::getParamHash();
3582: $paramHash->{'variable'} = "PRINT_ANNOTATIONS";
3583: $helper->declareVar("PRINT_ANNOTATIONS");
3584: $paramHash->{CHOICES} = [
3585: ['No', 'no'],
3586: ['Yes', 'yes']];
3587: Apache::lonhelper::dropdown->new();
1.545 bisitz 3588: &addMessage(&Apache::lonhtmlcommon::row_closure());
1.511 foxr 3589:
1.545 bisitz 3590: &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Foils')));
1.397 albertel 3591: $paramHash = Apache::lonhelper::getParamHash();
3592: $paramHash->{'multichoice'} = "true";
3593: $paramHash->{'allowempty'} = "true";
3594: $paramHash->{'variable'} = "showallfoils";
1.555 bisitz 3595: $paramHash->{'CHOICES'} = [ [&mt('Show All Foils'), "1"] ];
1.397 albertel 3596: Apache::lonhelper::choices->new();
1.545 bisitz 3597: &addMessage(&Apache::lonhtmlcommon::row_closure(1));
1.220 sakharuk 3598: }
1.219 sakharuk 3599:
1.230 albertel 3600: if ($helper->{'VARS'}->{'construction'}) {
1.505 albertel 3601: my $stylevalue='$Apache::lonnet::env{"construct.style"}';
1.497 www 3602: my $randseedtext=&mt("Use random seed");
3603: my $stylefiletext=&mt("Use style file");
1.506 albertel 3604: my $selectfiletext=&mt("Select style file");
1.497 www 3605:
1.544 bisitz 3606: my $xmlfrag .= '<message>'
3607: .&Apache::lonhtmlcommon::row_title('<label for="curseed_forminput">'
3608: .$randseedtext
3609: .'</label>'
3610: )
3611: .'</message>
3612: <string variable="curseed" size="15" maxlength="15">
3613: <defaultvalue>
3614: return '.$helper->{VARS}->{'curseed'}.';
3615: </defaultvalue>'
3616: .'</string>'
3617: .'<message>'
3618: .&Apache::lonhtmlcommon::row_closure()
3619: .&Apache::lonhtmlcommon::row_title('<label for="style_file">'
3620: .$stylefiletext
3621: .'</label>'
3622: )
3623: .'</message>
1.504 albertel 3624: <string variable="style_file" size="40">
1.544 bisitz 3625: <defaultvalue>
3626: return '.$stylevalue.';
3627: </defaultvalue>
3628: </string><message> '
3629: .qq|<a href="javascript:openbrowser('helpform','style_file_forminput','sty')">|
3630: .$selectfiletext.'</a>'
3631: .&Apache::lonhtmlcommon::row_closure()
1.555 bisitz 3632: .&Apache::lonhtmlcommon::row_title(&mt('Show All Foils'))
1.544 bisitz 3633: .'</message>
1.371 foxr 3634: <choices allowempty="1" multichoice="true" variable="showallfoils">
1.544 bisitz 3635: <choice computer="1"> </choice>
3636: </choices>'
3637: .'<message>'
3638: .&Apache::lonhtmlcommon::row_closure()
3639: .'</message>';
1.230 albertel 3640: &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
1.512 foxr 3641:
3642:
1.544 bisitz 3643: &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Problem Type')));
1.512 foxr 3644: #
3645: # Initial value from construction space:
3646: #
3647: if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
3648: $helper->{VARS}->{'probstatus'} = $env{'form.problemtype'}; # initial value
3649: }
1.518 foxr 3650: $xmlfrag = << "PROBTYPE";
3651: <dropdown variable="probstatus" multichoice="0" allowempty="0">
3652: <defaultvalue>
3653: return "$helper->{VARS}->{'probstatus'}";
3654: </defaultvalue>
3655: <choice computer="problem">Homework Problem</choice>
3656: <choice computer="exam">Exam Problem</choice>
3657: <choice computer="survey">Survey question</choice>
3658: </dropdown>
3659: PROBTYPE
3660: &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
1.544 bisitz 3661: &addMessage(&Apache::lonhtmlcommon::row_closure(1));
1.512 foxr 3662:
1.556 foxr 3663:
3664:
1.544 bisitz 3665: }
1.223 bowersj2 3666: }
1.264 sakharuk 3667:
3668:
3669:
1.218 sakharuk 3670:
1.223 bowersj2 3671: if ($startedTable) {
1.544 bisitz 3672: &addMessage(&Apache::lonhtmlcommon::end_pick_box());
1.215 sakharuk 3673: }
1.161 bowersj2 3674:
1.131 bowersj2 3675: Apache::lonprintout::page_format_state->new("FORMAT");
3676:
1.144 bowersj2 3677: # Generate the PAGESIZE state which will offer the user the margin
3678: # choices if they select one column
3679: Apache::lonhelper::state->new("PAGESIZE", "Set Margins");
3680: Apache::lonprintout::page_size_state->new('pagesize', 'FORMAT', 'FINAL');
3681:
3682:
1.131 bowersj2 3683: $helper->process();
3684:
1.416 foxr 3685:
1.131 bowersj2 3686: # MANUAL BAILOUT CONDITION:
3687: # If we're in the "final" state, bailout and return to handler
3688: if ($helper->{STATE} eq 'FINAL') {
3689: return $helper;
3690: }
1.130 sakharuk 3691:
1.131 bowersj2 3692: $r->print($helper->display());
1.395 www 3693: if ($helper->{STATE} eq 'START') {
3694: &recently_generated($r);
3695: }
1.333 albertel 3696: &Apache::lonhelper::unregisterHelperTags();
1.115 bowersj2 3697:
3698: return OK;
3699: }
3700:
1.1 www 3701:
3702: 1;
1.119 bowersj2 3703:
3704: package Apache::lonprintout::page_format_state;
3705:
3706: =pod
3707:
1.131 bowersj2 3708: =head1 Helper element: page_format_state
3709:
3710: See lonhelper.pm documentation for discussion of the helper framework.
1.119 bowersj2 3711:
1.131 bowersj2 3712: Apache::lonprintout::page_format_state is an element that gives the
3713: user an opportunity to select the page layout they wish to print
3714: with: Number of columns, portrait/landscape, and paper size. If you
3715: want to change the paper size choices, change the @paperSize array
3716: contents in this package.
1.119 bowersj2 3717:
1.131 bowersj2 3718: page_format_state is always directly invoked in lonprintout.pm, so there
3719: is no tag interface. You actually pass parameters to the constructor.
1.119 bowersj2 3720:
3721: =over 4
3722:
1.131 bowersj2 3723: =item * B<new>(varName): varName is where the print information will be stored in the format FIXME.
1.119 bowersj2 3724:
3725: =back
3726:
3727: =cut
3728:
1.131 bowersj2 3729: use Apache::lonhelper;
1.119 bowersj2 3730:
3731: no strict;
1.131 bowersj2 3732: @ISA = ("Apache::lonhelper::element");
1.119 bowersj2 3733: use strict;
1.266 sakharuk 3734: use Apache::lonlocal;
1.373 albertel 3735: use Apache::lonnet;
1.119 bowersj2 3736:
3737: my $maxColumns = 2;
1.376 albertel 3738: # it'd be nice if these all worked
3739: #my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",
3740: # "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",
3741: # "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]",
3742: # "a5 [148x210 mm]", "a6 [105x148 mm]" );
1.326 sakharuk 3743: my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",
1.376 albertel 3744: "a4 [210x297 mm]");
1.119 bowersj2 3745:
3746: # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
3747: # Paper type
3748:
3749: sub new {
1.131 bowersj2 3750: my $self = Apache::lonhelper::element->new();
1.119 bowersj2 3751:
1.135 bowersj2 3752: shift;
3753:
1.131 bowersj2 3754: $self->{'variable'} = shift;
1.134 bowersj2 3755: my $helper = Apache::lonhelper::getHelper();
1.135 bowersj2 3756: $helper->declareVar($self->{'variable'});
1.131 bowersj2 3757: bless($self);
1.119 bowersj2 3758: return $self;
3759: }
3760:
3761: sub render {
3762: my $self = shift;
1.131 bowersj2 3763: my $helper = Apache::lonhelper::getHelper();
1.119 bowersj2 3764: my $result = '';
1.131 bowersj2 3765: my $var = $self->{'variable'};
1.266 sakharuk 3766: my $PageLayout=&mt('Page layout');
3767: my $NumberOfColumns=&mt('Number of columns');
3768: my $PaperType=&mt('Paper type');
1.506 albertel 3769: my $landscape=&mt('Landscape');
3770: my $portrait=&mt('Portrait');
1.539 onken 3771: my $pdfFormLabel=&mt('PDF-Formfields');
3772: my $with=&mt('with Formfields');
3773: my $without=&mt('without Formfields');
1.556 foxr 3774:
3775:
1.544 bisitz 3776: $result.='<h3>'.&mt('Layout Options').'</h3>'
3777: .&Apache::loncommon::start_data_table()
3778: .&Apache::loncommon::start_data_table_header_row()
3779: .'<th>'.$PageLayout.'</th>'
3780: .'<th>'.$NumberOfColumns.'</th>'
3781: .'<th>'.$PaperType.'</th>'
3782: .'<th>'.$pdfFormLabel.'</th>'
3783: .&Apache::loncommon::end_data_table_header_row()
3784: .&Apache::loncommon::start_data_table_row()
3785: .'<td>'
3786: .'<label><input type="radio" name="'.${var}.'.layout" value="L" />'.$landscape.'</label><br />'
3787: .'<label><input type="radio" name="'.${var}.'.layout" value="P" checked="checked" />'.$portrait.'</label>'
3788: .'</td>';
1.119 bowersj2 3789:
1.544 bisitz 3790: $result.='<td align="center">'
3791: .'<select name="'.${var}.'.cols">';
1.119 bowersj2 3792:
3793: my $i;
3794: for ($i = 1; $i <= $maxColumns; $i++) {
1.144 bowersj2 3795: if ($i == 2) {
1.553 bisitz 3796: $result .= '<option value="'.$i.'" selected="selected">'.$i.'</option>'."\n";
1.119 bowersj2 3797: } else {
1.553 bisitz 3798: $result .= '<option value="'.$i.'">'.$i.'</option>'."\n";
1.119 bowersj2 3799: }
3800: }
3801:
3802: $result .= "</select></td><td>\n";
3803: $result .= "<select name='${var}.paper'>\n";
3804:
1.373 albertel 3805: my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
1.398 albertel 3806: my $DefaultPaperSize=lc($parmhash{'default_paper_size'});
3807: $DefaultPaperSize=~s/\s//g;
1.304 sakharuk 3808: if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}
1.119 bowersj2 3809: $i = 0;
3810: foreach (@paperSize) {
1.326 sakharuk 3811: $_=~/(\w+)/;
3812: my $papersize=$1;
1.304 sakharuk 3813: if ($paperSize[$i]=~/$DefaultPaperSize/) {
1.553 bisitz 3814: $result .= '<option selected="selected" value="'.$papersize.'">'.$paperSize[$i].'</option>'."\n";
1.119 bowersj2 3815: } else {
1.553 bisitz 3816: $result .= '<option value="'.$papersize.'">'.$paperSize[$i].'</option>'."\n";
1.119 bowersj2 3817: }
3818: $i++;
3819: }
1.539 onken 3820: $result .= <<HTML;
3821: </select>
3822: </td>
3823: <td align='center'>
3824: <select name='${var}.pdfFormFields'>
1.553 bisitz 3825: <option selected="selected" value="no">$without</option>
3826: <option value="yes">$with</option>
1.539 onken 3827: </select>
3828: </td>
3829: HTML
1.544 bisitz 3830: $result.=&Apache::loncommon::end_data_table_row()
3831: .&Apache::loncommon::end_data_table();
1.539 onken 3832:
1.119 bowersj2 3833: return $result;
1.135 bowersj2 3834: }
3835:
3836: sub postprocess {
3837: my $self = shift;
3838:
3839: my $var = $self->{'variable'};
1.136 bowersj2 3840: my $helper = Apache::lonhelper->getHelper();
1.135 bowersj2 3841: $helper->{VARS}->{$var} =
1.373 albertel 3842: $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
1.539 onken 3843: $env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"};
1.135 bowersj2 3844: return 1;
1.119 bowersj2 3845: }
3846:
3847: 1;
1.144 bowersj2 3848:
3849: package Apache::lonprintout::page_size_state;
3850:
3851: =pod
3852:
3853: =head1 Helper element: page_size_state
3854:
3855: See lonhelper.pm documentation for discussion of the helper framework.
3856:
3857: Apache::lonprintout::page_size_state is an element that gives the
3858: user the opportunity to further refine the page settings if they
3859: select a single-column page.
3860:
3861: page_size_state is always directly invoked in lonprintout.pm, so there
3862: is no tag interface. You actually pass parameters to the constructor.
3863:
3864: =over 4
3865:
3866: =item * B<new>(varName): varName is where the print information will be stored in the format FIXME.
3867:
3868: =back
3869:
3870: =cut
3871:
3872: use Apache::lonhelper;
1.373 albertel 3873: use Apache::lonnet;
1.144 bowersj2 3874: no strict;
3875: @ISA = ("Apache::lonhelper::element");
3876: use strict;
3877:
3878:
3879:
3880: sub new {
3881: my $self = Apache::lonhelper::element->new();
3882:
3883: shift; # disturbs me (probably prevents subclassing) but works (drops
3884: # package descriptor)... - Jeremy
3885:
3886: $self->{'variable'} = shift;
3887: my $helper = Apache::lonhelper::getHelper();
3888: $helper->declareVar($self->{'variable'});
3889:
3890: # The variable name of the format element, so we can look into
3891: # $helper->{VARS} to figure out whether the columns are one or two
3892: $self->{'formatvar'} = shift;
3893:
1.463 foxr 3894:
1.144 bowersj2 3895: $self->{NEXTSTATE} = shift;
3896: bless($self);
1.467 foxr 3897:
1.144 bowersj2 3898: return $self;
3899: }
3900:
3901: sub render {
3902: my $self = shift;
3903: my $helper = Apache::lonhelper::getHelper();
3904: my $result = '';
3905: my $var = $self->{'variable'};
3906:
1.467 foxr 3907:
3908:
1.144 bowersj2 3909: if (defined $self->{ERROR_MSG}) {
1.464 albertel 3910: $result .= '<br /><span class="LC_error">' . $self->{ERROR_MSG} . '</span><br />';
1.144 bowersj2 3911: }
3912:
1.438 foxr 3913: my $format = $helper->{VARS}->{$self->{'formatvar'}};
1.463 foxr 3914:
3915: # Use format to get sensible defaults for the margins:
3916:
3917:
3918: my ($laystyle, $cols, $papersize) = split(/\|/, $format);
3919: ($papersize) = split(/ /, $papersize);
3920:
1.557.2.2 foxr 3921: $laystyle = &Apache::lonprintout::map_laystyle($laystyle);
1.463 foxr 3922:
3923:
3924:
1.464 albertel 3925: my %size;
3926: ($size{'width_and_units'},
3927: $size{'height_and_units'},
3928: $size{'margin_and_units'})=
3929: &Apache::lonprintout::page_format($papersize, $laystyle, $cols);
1.463 foxr 3930:
1.464 albertel 3931: foreach my $dimension ('width','height','margin') {
3932: ($size{$dimension},$size{$dimension.'_unit'}) =
3933: split(/ +/, $size{$dimension.'_and_units'},2);
3934:
3935: foreach my $unit ('cm','in') {
3936: $size{$dimension.'_options'} .= '<option ';
3937: if ($size{$dimension.'_unit'} eq $unit) {
3938: $size{$dimension.'_options'} .= 'selected="selected" ';
3939: }
3940: $size{$dimension.'_options'} .= '>'.$unit.'</option>';
3941: }
1.438 foxr 3942: }
3943:
1.470 foxr 3944: # Adjust margin for LaTeX margin: .. requires units == cm or in.
3945:
3946: if ($size{'margin_unit'} eq 'in') {
3947: $size{'margin'} += 1;
3948: } else {
3949: $size{'margin'} += 2.54;
3950: }
1.548 bisitz 3951: my %lt = &Apache::lonlocal::texthash(
3952: 'format' => 'How should each column be formatted?',
3953: 'width' => 'Width',
3954: 'height' => 'Height',
3955: 'margin' => 'Left Margin'
3956: );
3957:
3958: $result .= '<p>'.$lt{'format'}.'</p>'
3959: .&Apache::lonhtmlcommon::start_pick_box()
3960: .&Apache::lonhtmlcommon::row_title($lt{'width'})
3961: .'<input type="text" name="'.$var.'.width" value="'.$size{'width'}.'" size="4" />'
3962: .'<select name="'.$var.'.widthunit">'
3963: .$size{'width_options'}
3964: .'</select>'
3965: .&Apache::lonhtmlcommon::row_closure()
3966: .&Apache::lonhtmlcommon::row_title($lt{'height'})
3967: .'<input type="text" name="'.$var.'.height" value="'.$size{'height'}.'" size="4" />'
3968: .'<select name="'.$var.'.heightunit">'
3969: .$size{'height_options'}
3970: .'</select>'
3971: .&Apache::lonhtmlcommon::row_closure()
3972: .&Apache::lonhtmlcommon::row_title($lt{'margin'})
3973: .'<input type="text" name="'.$var.'.lmargin" value="'.$size{'margin'}.'" size="4" />'
3974: .'<select name="'.$var.'.lmarginunit">'
3975: .$size{'margin_options'}
3976: .'</select>'
3977: .&Apache::lonhtmlcommon::row_closure(1)
3978: .&Apache::lonhtmlcommon::end_pick_box();
3979: # <p>Hint: Some instructors like to leave scratch space for the student by
3980: # making the width much smaller than the width of the page.</p>
1.144 bowersj2 3981:
3982: return $result;
3983: }
3984:
1.470 foxr 3985:
1.144 bowersj2 3986: sub preprocess {
3987: my $self = shift;
3988: my $helper = Apache::lonhelper::getHelper();
3989:
3990: my $format = $helper->{VARS}->{$self->{'formatvar'}};
1.467 foxr 3991:
3992: # If the user does not have 'pav' privilege, set default widths and
3993: # on to the next state right away.
3994: #
3995: if (!$perm{'pav'}) {
3996: my $var = $self->{'variable'};
3997: my $format = $helper->{VARS}->{$self->{'formatvar'}};
3998:
3999: my ($laystyle, $cols, $papersize) = split(/\|/, $format);
4000: ($papersize) = split(/ /, $papersize);
4001:
4002:
1.557.2.2 foxr 4003: $laystyle = &map_laystyle($laystyle);
4004:
1.467 foxr 4005: # Figure out some good defaults for the print out and set them:
4006:
4007: my %size;
4008: ($size{'width'},
4009: $size{'height'},
4010: $size{'lmargin'})=
4011: &Apache::lonprintout::page_format($papersize, $laystyle, $cols);
4012:
4013: foreach my $dim ('width', 'height', 'lmargin') {
4014: my ($value, $units) = split(/ /, $size{$dim});
1.470 foxr 4015:
1.467 foxr 4016: $helper->{VARS}->{"$var.".$dim} = $value;
4017: $helper->{VARS}->{"$var.".$dim.'unit'} = $units;
4018:
4019: }
4020:
4021:
4022: # Transition to the next state
4023:
4024: $helper->changeState($self->{NEXTSTATE});
4025: }
1.144 bowersj2 4026:
4027: return 1;
4028: }
4029:
4030: sub postprocess {
4031: my $self = shift;
4032:
4033: my $var = $self->{'variable'};
4034: my $helper = Apache::lonhelper->getHelper();
1.373 albertel 4035: my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"};
4036: my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"};
4037: my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"};
4038: $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"};
4039: $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"};
4040: $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"};
1.144 bowersj2 4041:
4042: my $error = '';
4043:
4044: # /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed
4045: # by an optional period, followed by digits, ending the string
4046:
1.464 albertel 4047: if ($width !~ /^-?[0-9]*(\.[0-9]*)?$/) {
1.144 bowersj2 4048: $error .= "Invalid width; please type only a number.<br />\n";
4049: }
1.464 albertel 4050: if ($height !~ /^-?[0-9]*(\.[0-9]*)?$/) {
1.144 bowersj2 4051: $error .= "Invalid height; please type only a number.<br />\n";
4052: }
1.464 albertel 4053: if ($lmargin !~ /^-?[0-9]*(\.[0-9]*)?$/) {
1.144 bowersj2 4054: $error .= "Invalid left margin; please type only a number.<br />\n";
1.470 foxr 4055: } else {
4056: # Adjust for LaTeX 1.0 inch margin:
4057:
4058: if ($env{"form.${var}.lmarginunit"} eq "in") {
4059: $helper->{VARS}->{$var.'.lmargin'} = $lmargin - 1;
4060: } else {
4061: $helper->{VARS}->{$var.'.lmargin'} = $lmargin - 2.54;
4062: }
1.144 bowersj2 4063: }
4064:
4065: if (!$error) {
4066: Apache::lonhelper::getHelper()->changeState($self->{NEXTSTATE});
4067: return 1;
4068: } else {
4069: $self->{ERROR_MSG} = $error;
4070: return 0;
4071: }
4072: }
4073:
4074:
1.119 bowersj2 4075:
1.1 www 4076: __END__
1.6 sakharuk 4077:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>