Annotation of loncom/interface/lonprintout.pm, revision 1.390

1.389     foxr        1: # The LearningOnline Network
1.1       www         2: # Printout
                      3: #
1.390   ! albertel    4: # $Id: lonprintout.pm,v 1.389 2005/08/29 10:06:52 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: #
                     26: # http://www.lon-capa.org/
                     27: #
1.3       sakharuk   28: #
1.1       www        29: package Apache::lonprintout;
                     30: 
                     31: use strict;
1.10      albertel   32: use Apache::Constants qw(:common :http);
1.2       sakharuk   33: use Apache::lonxml;
                     34: use Apache::lonnet;
1.54      sakharuk   35: use Apache::loncommon;
1.13      sakharuk   36: use Apache::inputtags;
1.54      sakharuk   37: use Apache::grades;
1.13      sakharuk   38: use Apache::edit;
1.5       sakharuk   39: use Apache::File();
1.68      sakharuk   40: use Apache::lonnavmaps;
1.227     sakharuk   41: use Apache::lonratedt;
1.34      sakharuk   42: use POSIX qw(strftime);
1.255     www        43: use Apache::lonlocal;
1.60      sakharuk   44: 
1.375     foxr       45: my $resources_printed = '';
                     46: 
1.385     foxr       47: #
                     48: #   Convert a numeric code to letters
                     49: #
                     50: sub num_to_letters {
                     51:     my ($num) = @_;
                     52:     my @nums= split('',$num);
                     53:     my @num_to_let=('A'..'Z');
                     54:     my $word;
                     55:     foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }
                     56:     return $word;
                     57: }
                     58: #   Convert a letter code to numeric.
                     59: #
                     60: sub letters_to_num {
                     61:     my ($letters) = @_;
                     62:     my @letters = split('', uc($letters));
                     63:     my %substitution;
                     64:     my $digit = 0;
                     65:     foreach my $letter ('A'..'J') {
                     66: 	$substitution{$letter} = $digit;
                     67: 	$digit++;
                     68:     }
                     69:     #  The substitution is done as below to preserve leading
                     70:     #  zeroes which are needed to keep the code size exact
                     71:     #
                     72:     my $result ="";
                     73:     foreach my $letter (@letters) {
                     74: 	$result.=$substitution{$letter};
                     75:     }
                     76:     return $result;
                     77: }
                     78: 
1.383     foxr       79: #  Determine if a code is a valid numeric code.  Valid
                     80: #  numeric codes must be comprised entirely of digits and
1.384     albertel   81: #  have a correct number of digits.
1.383     foxr       82: #
                     83: #  Parameters:
                     84: #     value      - proposed code value.
1.384     albertel   85: #     num_digits - Number of digits required.
1.383     foxr       86: #
                     87: sub is_valid_numeric_code {
1.384     albertel   88:     my ($value, $num_digits) = @_;
1.383     foxr       89:     #   Remove leading/trailing whitespace;
1.387     foxr       90:     $value =~ s/^\s*//g;
                     91:     $value =~ s/\s*$//g;
1.383     foxr       92:     
                     93:     #  All digits?
1.387     foxr       94:     if ($value !~ /^[0-9]+$/) {
1.383     foxr       95: 	return "Numeric code $value has invalid characters - must only be digits";
                     96:     }
1.384     albertel   97:     if (length($value) != $num_digits) {
                     98: 	return "Numeric code $value incorrect number of digits (correct = $num_digits)";
                     99:     }
1.385     foxr      100:     return undef;
1.383     foxr      101: }
                    102: #   Determines if a code is a valid alhpa code.  Alpha codes
                    103: #   are ciphers that map  [A-J,a-j] -> 0..9 0..9.
1.384     albertel  104: #   They also have a correct digit count.
1.383     foxr      105: # Parameters:
                    106: #     value          - Proposed code value.
1.384     albertel  107: #     num_letters    - correct number of letters.
1.383     foxr      108: # Note:
                    109: #    leading and trailing whitespace are ignored.
                    110: #
                    111: sub is_valid_alpha_code {
1.384     albertel  112:     my ($value, $num_letters) = @_;
1.383     foxr      113:     
                    114:      # strip leading and trailing spaces.
                    115: 
                    116:     $value =~ s/^\s*//g;
                    117:     $value =~ s/\s*$//g;
                    118: 
                    119:     #  All alphas in the right range?
1.384     albertel  120:     if ($value !~ /^[A-J,a-j]+$/) {
1.383     foxr      121: 	return "Invalid letter code $value must only contain A-J";
                    122:     }
1.384     albertel  123:     if (length($value) != $num_letters) {
                    124: 	return "Letter code $value has incorrect number of letters (correct = $num_letters)";
                    125:     }
1.385     foxr      126:     return undef;
1.383     foxr      127: }
                    128: 
1.382     foxr      129: #   Determine if a code entered by the user in a helper is valid.
                    130: #   valid depends on the code type and the type of code selected.
                    131: #   The type of code selected can either be numeric or 
                    132: #   Alphabetic.  If alphabetic, the code, in fact is a simple
                    133: #   substitution cipher for the actual numeric code: 0->A, 1->B ...
                    134: #   We'll be nice and be case insensitive for alpha codes.
                    135: # Parameters:
                    136: #    code_value    - the value of the code the user typed in.
                    137: #    code_option   - The code type selected from the set in the scantron format
                    138: #                    table.
                    139: # Returns:
                    140: #    undef         - The code is valid.
                    141: #    other         - An error message indicating what's wrong.
                    142: #
                    143: sub is_code_valid {
                    144:     my ($code_value, $code_option) = @_;
1.383     foxr      145:     my ($code_type, $code_length) = ('letter', 6);	# defaults.
                    146:     open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
                    147:     foreach my $line (<FG>) {
                    148: 	my ($name, $type, $length) = (split(/:/, $line))[0,2,4];
                    149: 	if($name eq $code_option) {
                    150: 	    $code_length = $length;
                    151: 	    if($type eq 'number') {
                    152: 		$code_type = 'number';
                    153: 	    }
                    154: 	}
                    155:     }
                    156:     my $valid;
                    157:     if ($code_type eq 'number') {
1.385     foxr      158: 	return &is_valid_numeric_code($code_value, $code_length);
1.383     foxr      159:     } else {
1.385     foxr      160: 	return &is_valid_alpha_code($code_value, $code_length);
1.383     foxr      161:     }
1.382     foxr      162: 
                    163: }
                    164: 
1.341     foxr      165: #   Compare two students by name.  The students are in the form
                    166: #   returned by the helper:
                    167: #      user:domain:section:last,   first:status
                    168: #   This is a helper function for the perl sort built-in  therefore:
                    169: # Implicit Inputs:
                    170: #    $a     - The first element to compare (global)
                    171: #    $b     - The second element to compare (global)
                    172: # Returns:
                    173: #   -1   - $a < $b
                    174: #    0   - $a == $b
                    175: #   +1   - $a > $b
                    176: #   Note that the initial comparison is done on the last names with the
                    177: #   first names only used to break the tie.
                    178: #
                    179: #
                    180: sub compare_names {
                    181:     #  First split the names up into the primary fields.
                    182: 
                    183:     my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a);
                    184:     my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b);
                    185: 
                    186:     # Now split the last name and first name of each n:
                    187:     #
                    188: 
                    189:     my ($l1,$f1) = split(/,/, $n1);
                    190:     my ($l2,$f2) = split(/,/, $n2);
                    191: 
                    192:     # We don't bother to remove the leading/trailing whitespace from the
                    193:     # firstname, unless the last names compare identical.
                    194: 
                    195:     if($l1 lt $l2) {
                    196: 	return -1;
                    197:     }
                    198:     if($l1 gt $l2) {
                    199: 	return  1;
                    200:     }
                    201: 
                    202:     # Break the tie on the first name, but there are leading (possibly trailing
                    203:     # whitespaces to get rid of first 
                    204:     #
                    205:     $f1 =~ s/^\s+//;		# Remove leading...
                    206:     $f1 =~ s/\s+$//;		# Trailing spaces from first 1...
                    207:     
                    208:     $f2 =~ s/^\s+//;
                    209:     $f2 =~ s/\s+$//;		# And the same for first 2...
                    210: 
                    211:     if($f1 lt $f2) {
                    212: 	return -1;
                    213:     }
                    214:     if($f1 gt $f2) {
                    215: 	return 1;
                    216:     }
                    217:     
                    218:     #  Must be the same name.
                    219: 
                    220:     return 0;
                    221: }
                    222: 
1.71      sakharuk  223: sub latex_header_footer_remove {
                    224:     my $text = shift;
                    225:     $text =~ s/\\end{document}//;
                    226:     $text =~ s/\\documentclass([^&]*)\\begin{document}//;
                    227:     return $text;
                    228: }
                    229: 
                    230: 
1.37      sakharuk  231: sub character_chart {
                    232:     my $result = shift;	
1.116     sakharuk  233:     $result =~ s/&\#0?0?(7|9);//g;
                    234:     $result =~ s/&\#0?(10|13);//g;
                    235:     $result =~ s/&\#0?32;/ /g;
                    236:     $result =~ s/&\#0?33;/!/g;
                    237:     $result =~ s/&(\#0?34|quot);/\"/g;
                    238:     $result =~ s/&\#0?35;/\\\#/g;
                    239:     $result =~ s/&\#0?36;/\\\$/g;
                    240:     $result =~ s/&\#0?37;/\\%/g; 
                    241:     $result =~ s/&(\#0?38|amp);/\\&/g; 
                    242:     $result =~ s/&\#(0?39|146);/\'/g;
                    243:     $result =~ s/&\#0?40;/(/g;
                    244:     $result =~ s/&\#0?41;/)/g;
                    245:     $result =~ s/&\#0?42;/\*/g;
                    246:     $result =~ s/&\#0?43;/\+/g;
                    247:     $result =~ s/&\#(0?44|130);/,/g;
                    248:     $result =~ s/&\#0?45;/-/g;
                    249:     $result =~ s/&\#0?46;/\./g;
                    250:     $result =~ s/&\#0?47;/\//g;
                    251:     $result =~ s/&\#0?48;/0/g;
                    252:     $result =~ s/&\#0?49;/1/g;
                    253:     $result =~ s/&\#0?50;/2/g;
                    254:     $result =~ s/&\#0?51;/3/g;
                    255:     $result =~ s/&\#0?52;/4/g;
                    256:     $result =~ s/&\#0?53;/5/g;
                    257:     $result =~ s/&\#0?54;/6/g;
                    258:     $result =~ s/&\#0?55;/7/g;
                    259:     $result =~ s/&\#0?56;/8/g;
                    260:     $result =~ s/&\#0?57;/9/g;
1.269     albertel  261:     $result =~ s/&\#0?58;/:/g;
1.116     sakharuk  262:     $result =~ s/&\#0?59;/;/g;
                    263:     $result =~ s/&(\#0?60|lt|\#139);/\$<\$/g;
1.281     sakharuk  264:     $result =~ s/&\#0?61;/\\ensuremath\{=\}/g;
                    265:     $result =~ s/&(\#0?62|gt|\#155);/\\ensuremath\{>\}/g;
1.116     sakharuk  266:     $result =~ s/&\#0?63;/\?/g;
                    267:     $result =~ s/&\#0?65;/A/g;
                    268:     $result =~ s/&\#0?66;/B/g;
                    269:     $result =~ s/&\#0?67;/C/g;
                    270:     $result =~ s/&\#0?68;/D/g;
                    271:     $result =~ s/&\#0?69;/E/g;
                    272:     $result =~ s/&\#0?70;/F/g;
                    273:     $result =~ s/&\#0?71;/G/g;
                    274:     $result =~ s/&\#0?72;/H/g;
                    275:     $result =~ s/&\#0?73;/I/g;
                    276:     $result =~ s/&\#0?74;/J/g;
                    277:     $result =~ s/&\#0?75;/K/g;
                    278:     $result =~ s/&\#0?76;/L/g;
                    279:     $result =~ s/&\#0?77;/M/g;
                    280:     $result =~ s/&\#0?78;/N/g;
                    281:     $result =~ s/&\#0?79;/O/g;
                    282:     $result =~ s/&\#0?80;/P/g;
                    283:     $result =~ s/&\#0?81;/Q/g;
                    284:     $result =~ s/&\#0?82;/R/g;
                    285:     $result =~ s/&\#0?83;/S/g;
                    286:     $result =~ s/&\#0?84;/T/g;
                    287:     $result =~ s/&\#0?85;/U/g;
                    288:     $result =~ s/&\#0?86;/V/g;
                    289:     $result =~ s/&\#0?87;/W/g;
                    290:     $result =~ s/&\#0?88;/X/g;
                    291:     $result =~ s/&\#0?89;/Y/g;
                    292:     $result =~ s/&\#0?90;/Z/g;
                    293:     $result =~ s/&\#0?91;/[/g;
1.281     sakharuk  294:     $result =~ s/&\#0?92;/\\ensuremath\{\\setminus\}/g;
1.116     sakharuk  295:     $result =~ s/&\#0?93;/]/g;
1.281     sakharuk  296:     $result =~ s/&\#(0?94|136);/\\ensuremath\{\\wedge\}/g;
1.116     sakharuk  297:     $result =~ s/&\#(0?95|138|154);/\\underline{\\makebox[2mm]{\\strut}}/g;
                    298:     $result =~ s/&\#(0?96|145);/\`/g;
                    299:     $result =~ s/&\#0?97;/a/g;
                    300:     $result =~ s/&\#0?98;/b/g;
                    301:     $result =~ s/&\#0?99;/c/g;
                    302:     $result =~ s/&\#100;/d/g;
                    303:     $result =~ s/&\#101;/e/g;
                    304:     $result =~ s/&\#102;/f/g;
                    305:     $result =~ s/&\#103;/g/g;
                    306:     $result =~ s/&\#104;/h/g;
                    307:     $result =~ s/&\#105;/i/g;
                    308:     $result =~ s/&\#106;/j/g;
                    309:     $result =~ s/&\#107;/k/g;
                    310:     $result =~ s/&\#108;/l/g;
                    311:     $result =~ s/&\#109;/m/g;
                    312:     $result =~ s/&\#110;/n/g;
                    313:     $result =~ s/&\#111;/o/g;
                    314:     $result =~ s/&\#112;/p/g;
                    315:     $result =~ s/&\#113;/q/g;
                    316:     $result =~ s/&\#114;/r/g;
                    317:     $result =~ s/&\#115;/s/g;
                    318:     $result =~ s/&\#116;/t/g;
                    319:     $result =~ s/&\#117;/u/g;
                    320:     $result =~ s/&\#118;/v/g;
                    321:     $result =~ s/&\#119;/w/g;
                    322:     $result =~ s/&\#120;/x/g;
                    323:     $result =~ s/&\#121;/y/g;
                    324:     $result =~ s/&\#122;/z/g;
                    325:     $result =~ s/&\#123;/\\{/g;
                    326:     $result =~ s/&\#124;/\|/g;
                    327:     $result =~ s/&\#125;/\\}/g;
                    328:     $result =~ s/&\#126;/\~/g;
                    329:     $result =~ s/&\#131;/\\textflorin /g;
                    330:     $result =~ s/&\#132;/\"/g;
1.281     sakharuk  331:     $result =~ s/&\#133;/\\ensuremath\{\\ldots\}/g;
                    332:     $result =~ s/&\#134;/\\ensuremath\{\\dagger\}/g;
                    333:     $result =~ s/&\#135;/\\ensuremath\{\\ddagger\}/g;
1.116     sakharuk  334:     $result =~ s/&\#137;/\\textperthousand /g;
                    335:     $result =~ s/&\#140;/{\\OE}/g;
                    336:     $result =~ s/&\#147;/\`\`/g;
                    337:     $result =~ s/&\#148;/\'\'/g;
1.281     sakharuk  338:     $result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g;
1.116     sakharuk  339:     $result =~ s/&\#150;/--/g;
                    340:     $result =~ s/&\#151;/---/g;
1.281     sakharuk  341:     $result =~ s/&\#152;/\\ensuremath\{\\sim\}/g;
1.116     sakharuk  342:     $result =~ s/&\#153;/\\texttrademark /g;
                    343:     $result =~ s/&\#156;/\\oe/g;
                    344:     $result =~ s/&\#159;/\\\"Y/g;
1.283     albertel  345:     $result =~ s/&(\#160|nbsp);/~/g;
1.116     sakharuk  346:     $result =~ s/&(\#161|iexcl);/!\`/g;
                    347:     $result =~ s/&(\#162|cent);/\\textcent /g;
                    348:     $result =~ s/&(\#163|pound);/\\pounds /g; 
                    349:     $result =~ s/&(\#164|curren);/\\textcurrency /g;
                    350:     $result =~ s/&(\#165|yen);/\\textyen /g;
                    351:     $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;
                    352:     $result =~ s/&(\#167|sect);/\\textsection /g;
                    353:     $result =~ s/&(\#168|uml);/\\texthighdieresis /g;
                    354:     $result =~ s/&(\#169|copy);/\\copyright /g;
                    355:     $result =~ s/&(\#170|ordf);/\\textordfeminine /g;
1.281     sakharuk  356:     $result =~ s/&(\#172|not);/\\ensuremath\{\\neg\}/g;
1.116     sakharuk  357:     $result =~ s/&(\#173|shy);/ - /g;
                    358:     $result =~ s/&(\#174|reg);/\\textregistered /g;
1.281     sakharuk  359:     $result =~ s/&(\#175|macr);/\\ensuremath\{^{-}\}/g;
                    360:     $result =~ s/&(\#176|deg);/\\ensuremath\{^{\\circ}\}/g;
                    361:     $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g;
                    362:     $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g;
                    363:     $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g;
1.116     sakharuk  364:     $result =~ s/&(\#180|acute);/\\textacute /g;
1.281     sakharuk  365:     $result =~ s/&(\#181|micro);/\\ensuremath\{\\mu\}/g;
1.116     sakharuk  366:     $result =~ s/&(\#182|para);/\\P/g;
1.281     sakharuk  367:     $result =~ s/&(\#183|middot);/\\ensuremath\{\\cdot\}/g;
1.116     sakharuk  368:     $result =~ s/&(\#184|cedil);/\\c{\\strut}/g;
1.281     sakharuk  369:     $result =~ s/&(\#185|sup1);/\\ensuremath\{^1\}/g;
1.116     sakharuk  370:     $result =~ s/&(\#186|ordm);/\\textordmasculine /g;
                    371:     $result =~ s/&(\#188|frac14);/\\textonequarter /g;
                    372:     $result =~ s/&(\#189|frac12);/\\textonehalf /g;
                    373:     $result =~ s/&(\#190|frac34);/\\textthreequarters /g;
                    374:     $result =~ s/&(\#191|iquest);/?\`/g;   
                    375:     $result =~ s/&(\#192|Agrave);/\\\`{A}/g;  
                    376:     $result =~ s/&(\#193|Aacute);/\\\'{A}/g; 
                    377:     $result =~ s/&(\#194|Acirc);/\\^{A}/g;
                    378:     $result =~ s/&(\#195|Atilde);/\\~{A}/g;
                    379:     $result =~ s/&(\#196|Auml);/\\\"{A}/g; 
                    380:     $result =~ s/&(\#197|Aring);/{\\AA}/g;
                    381:     $result =~ s/&(\#198|AElig);/{\\AE}/g;
                    382:     $result =~ s/&(\#199|Ccedil);/\\c{c}/g;
                    383:     $result =~ s/&(\#200|Egrave);/\\\`{E}/g;  
                    384:     $result =~ s/&(\#201|Eacute);/\\\'{E}/g;    
                    385:     $result =~ s/&(\#202|Ecirc);/\\^{E}/g;
                    386:     $result =~ s/&(\#203|Euml);/\\\"{E}/g;
                    387:     $result =~ s/&(\#204|Igrave);/\\\`{I}/g;
                    388:     $result =~ s/&(\#205|Iacute);/\\\'{I}/g;    
                    389:     $result =~ s/&(\#206|Icirc);/\\^{I}/g;
                    390:     $result =~ s/&(\#207|Iuml);/\\\"{I}/g;    
                    391:     $result =~ s/&(\#209|Ntilde);/\\~{N}/g;
                    392:     $result =~ s/&(\#210|Ograve);/\\\`{O}/g;
                    393:     $result =~ s/&(\#211|Oacute);/\\\'{O}/g;
                    394:     $result =~ s/&(\#212|Ocirc);/\\^{O}/g;
                    395:     $result =~ s/&(\#213|Otilde);/\\~{O}/g;
                    396:     $result =~ s/&(\#214|Ouml);/\\\"{O}/g;    
1.281     sakharuk  397:     $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g;
1.116     sakharuk  398:     $result =~ s/&(\#216|Oslash);/{\\O}/g;
                    399:     $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;    
                    400:     $result =~ s/&(\#218|Uacute);/\\\'{U}/g;
                    401:     $result =~ s/&(\#219|Ucirc);/\\^{U}/g;
                    402:     $result =~ s/&(\#220|Uuml);/\\\"{U}/g;
                    403:     $result =~ s/&(\#221|Yacute);/\\\'{Y}/g;
1.329     sakharuk  404:     $result =~ s/&(\#223|szlig);/{\\ss}/g;
1.116     sakharuk  405:     $result =~ s/&(\#224|agrave);/\\\`{a}/g;
                    406:     $result =~ s/&(\#225|aacute);/\\\'{a}/g;
                    407:     $result =~ s/&(\#226|acirc);/\\^{a}/g;
                    408:     $result =~ s/&(\#227|atilde);/\\~{a}/g;
                    409:     $result =~ s/&(\#228|auml);/\\\"{a}/g;
                    410:     $result =~ s/&(\#229|aring);/{\\aa}/g;
                    411:     $result =~ s/&(\#230|aelig);/{\\ae}/g;
                    412:     $result =~ s/&(\#231|ccedil);/\\c{c}/g;
                    413:     $result =~ s/&(\#232|egrave);/\\\`{e}/g;
                    414:     $result =~ s/&(\#233|eacute);/\\\'{e}/g;
                    415:     $result =~ s/&(\#234|ecirc);/\\^{e}/g;
                    416:     $result =~ s/&(\#235|euml);/\\\"{e}/g;
                    417:     $result =~ s/&(\#236|igrave);/\\\`{i}/g;
                    418:     $result =~ s/&(\#237|iacute);/\\\'{i}/g;
                    419:     $result =~ s/&(\#238|icirc);/\\^{i}/g;
                    420:     $result =~ s/&(\#239|iuml);/\\\"{i}/g;
1.281     sakharuk  421:     $result =~ s/&(\#240|eth);/\\ensuremath\{\\partial\}/g;
1.116     sakharuk  422:     $result =~ s/&(\#241|ntilde);/\\~{n}/g;
                    423:     $result =~ s/&(\#242|ograve);/\\\`{o}/g;
                    424:     $result =~ s/&(\#243|oacute);/\\\'{o}/g;
                    425:     $result =~ s/&(\#244|ocirc);/\\^{o}/g;
                    426:     $result =~ s/&(\#245|otilde);/\\~{o}/g;
                    427:     $result =~ s/&(\#246|ouml);/\\\"{o}/g;
1.281     sakharuk  428:     $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g;
1.116     sakharuk  429:     $result =~ s/&(\#248|oslash);/{\\o}/g;
                    430:     $result =~ s/&(\#249|ugrave);/\\\`{u}/g; 
                    431:     $result =~ s/&(\#250|uacute);/\\\'{u}/g;
                    432:     $result =~ s/&(\#251|ucirc);/\\^{u}/g;
                    433:     $result =~ s/&(\#252|uuml);/\\\"{u}/g;
                    434:     $result =~ s/&(\#253|yacute);/\\\'{y}/g;
                    435:     $result =~ s/&(\#255|yuml);/\\\"{y}/g;
1.281     sakharuk  436:     $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g;
1.117     sakharuk  437: #Greek Alphabet
1.281     sakharuk  438:     $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g;
                    439:     $result =~ s/&(beta|\#946);/\\ensuremath\{\\beta\}/g;
                    440:     $result =~ s/&(gamma|\#947);/\\ensuremath\{\\gamma\}/g;
                    441:     $result =~ s/&(delta|\#948);/\\ensuremath\{\\delta\}/g;
                    442:     $result =~ s/&(epsilon|\#949);/\\ensuremath\{\\epsilon\}/g;
                    443:     $result =~ s/&(zeta|\#950);/\\ensuremath\{\\zeta\}/g;
                    444:     $result =~ s/&(eta|\#951);/\\ensuremath\{\\eta\}/g;
                    445:     $result =~ s/&(theta|\#952);/\\ensuremath\{\\theta\}/g;
                    446:     $result =~ s/&(iota|\#953);/\\ensuremath\{\\iota\}/g;
                    447:     $result =~ s/&(kappa|\#954);/\\ensuremath\{\\kappa\}/g;
                    448:     $result =~ s/&(lambda|\#955);/\\ensuremath\{\\lambda\}/g;
                    449:     $result =~ s/&(mu|\#956);/\\ensuremath\{\\mu\}/g;
                    450:     $result =~ s/&(nu|\#957);/\\ensuremath\{\\nu\}/g;
                    451:     $result =~ s/&(xi|\#958);/\\ensuremath\{\\xi\}/g;
1.199     sakharuk  452:     $result =~ s/&(omicron|\#959);/o/g;
1.281     sakharuk  453:     $result =~ s/&(pi|\#960);/\\ensuremath\{\\pi\}/g;
                    454:     $result =~ s/&(rho|\#961);/\\ensuremath\{\\rho\}/g;
                    455:     $result =~ s/&(sigma|\#963);/\\ensuremath\{\\sigma\}/g;
                    456:     $result =~ s/&(tau|\#964);/\\ensuremath\{\\tau\}/g;
                    457:     $result =~ s/&(upsilon|\#965);/\\ensuremath\{\\upsilon\}/g;
                    458:     $result =~ s/&(phi|\#966);/\\ensuremath\{\\phi\}/g;
                    459:     $result =~ s/&(chi|\#967);/\\ensuremath\{\\chi\}/g;
                    460:     $result =~ s/&(psi|\#968);/\\ensuremath\{\\psi\}/g;
                    461:     $result =~ s/&(omega|\#969);/\\ensuremath\{\\omega\}/g;
                    462:     $result =~ s/&(thetasym|\#977);/\\ensuremath\{\\vartheta\}/g;
                    463:     $result =~ s/&(piv|\#982);/\\ensuremath\{\\varpi\}/g;
1.199     sakharuk  464:     $result =~ s/&(Alpha|\#913);/A/g;
                    465:     $result =~ s/&(Beta|\#914);/B/g;
1.281     sakharuk  466:     $result =~ s/&(Gamma|\#915);/\\ensuremath\{\\Gamma\}/g;
                    467:     $result =~ s/&(Delta|\#916);/\\ensuremath\{\\Delta\}/g;
1.199     sakharuk  468:     $result =~ s/&(Epsilon|\#917);/E/g;
                    469:     $result =~ s/&(Zeta|\#918);/Z/g;
                    470:     $result =~ s/&(Eta|\#919);/H/g;
1.281     sakharuk  471:     $result =~ s/&(Theta|\#920);/\\ensuremath\{\\Theta\}/g;
1.199     sakharuk  472:     $result =~ s/&(Iota|\#921);/I/g;
                    473:     $result =~ s/&(Kappa|\#922);/K/g;
1.281     sakharuk  474:     $result =~ s/&(Lambda|\#923);/\\ensuremath\{\\Lambda\}/g;
1.199     sakharuk  475:     $result =~ s/&(Mu|\#924);/M/g;
                    476:     $result =~ s/&(Nu|\#925);/N/g;
1.281     sakharuk  477:     $result =~ s/&(Xi|\#926);/\\ensuremath\{\\Xi\}/g;
1.199     sakharuk  478:     $result =~ s/&(Omicron|\#927);/O/g;
1.281     sakharuk  479:     $result =~ s/&(Pi|\#928);/\\ensuremath\{\\Pi\}/g;
1.199     sakharuk  480:     $result =~ s/&(Rho|\#929);/P/g;
1.281     sakharuk  481:     $result =~ s/&(Sigma|\#931);/\\ensuremath\{\\Sigma\}/g;
1.199     sakharuk  482:     $result =~ s/&(Tau|\#932);/T/g;
1.281     sakharuk  483:     $result =~ s/&(Upsilon|\#933);/\\ensuremath\{\\Upsilon\}/g;
                    484:     $result =~ s/&(Phi|\#934);/\\ensuremath\{\\Phi\}/g;
1.199     sakharuk  485:     $result =~ s/&(Chi|\#935);/X/g;
1.281     sakharuk  486:     $result =~ s/&(Psi|\#936);/\\ensuremath\{\\Psi\}/g;
                    487:     $result =~ s/&(Omega|\#937);/\\ensuremath\{\\Omega\}/g;
1.199     sakharuk  488: #Arrows (extended HTML 4.01)
1.281     sakharuk  489:     $result =~ s/&(larr|\#8592);/\\ensuremath\{\\leftarrow\}/g;
                    490:     $result =~ s/&(uarr|\#8593);/\\ensuremath\{\\uparrow\}/g;
                    491:     $result =~ s/&(rarr|\#8594);/\\ensuremath\{\\rightarrow\}/g;
                    492:     $result =~ s/&(darr|\#8595);/\\ensuremath\{\\downarrow\}/g;
                    493:     $result =~ s/&(harr|\#8596);/\\ensuremath\{\\leftrightarrow\}/g;
                    494:     $result =~ s/&(lArr|\#8656);/\\ensuremath\{\\Leftarrow\}/g;
                    495:     $result =~ s/&(uArr|\#8657);/\\ensuremath\{\\Uparrow\}/g;
                    496:     $result =~ s/&(rArr|\#8658);/\\ensuremath\{\\Rightarrow\}/g;
                    497:     $result =~ s/&(dArr|\#8659);/\\ensuremath\{\\Downarrow\}/g;
                    498:     $result =~ s/&(hArr|\#8660);/\\ensuremath\{\\Leftrightarrow\}/g;
1.199     sakharuk  499: #Mathematical Operators (extended HTML 4.01)
1.281     sakharuk  500:     $result =~ s/&(forall|\#8704);/\\ensuremath\{\\forall\}/g;
                    501:     $result =~ s/&(part|\#8706);/\\ensuremath\{\\partial\}/g;
                    502:     $result =~ s/&(exist|\#8707);/\\ensuremath\{\\exists\}/g;
                    503:     $result =~ s/&(empty|\#8709);/\\ensuremath\{\\emptyset\}/g;
                    504:     $result =~ s/&(nabla|\#8711);/\\ensuremath\{\\nabla\}/g;
                    505:     $result =~ s/&(isin|\#8712);/\\ensuremath\{\\in\}/g;
                    506:     $result =~ s/&(notin|\#8713);/\\ensuremath\{\\notin\}/g;
                    507:     $result =~ s/&(ni|\#8715);/\\ensuremath\{\\ni\}/g;
                    508:     $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;
                    509:     $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;
                    510:     $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;
1.390   ! albertel  511:     $result =~ s/–/\\ensuremath\{-\}/g;
1.281     sakharuk  512:     $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;
                    513:     $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;
                    514:     $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;
                    515:     $result =~ s/&(infin|\#8734);/\\ensuremath\{\\infty\}/g;
                    516:     $result =~ s/&(ang|\#8736);/\\ensuremath\{\\angle\}/g;
                    517:     $result =~ s/&(and|\#8743);/\\ensuremath\{\\wedge\}/g;
                    518:     $result =~ s/&(or|\#8744);/\\ensuremath\{\\vee\}/g;
                    519:     $result =~ s/&(cap|\#8745);/\\ensuremath\{\\cap\}/g;
                    520:     $result =~ s/&(cup|\#8746);/\\ensuremath\{\\cup\}/g;
                    521:     $result =~ s/&(int|\#8747);/\\ensuremath\{\\int\}/g;
                    522:     $result =~ s/&(sim|\#8764);/\\ensuremath\{\\sim\}/g;
                    523:     $result =~ s/&(cong|\#8773);/\\ensuremath\{\\cong\}/g;
                    524:     $result =~ s/&(asymp|\#8776);/\\ensuremath\{\\approx\}/g;
                    525:     $result =~ s/&(ne|\#8800);/\\ensuremath\{\\not=\}/g;
                    526:     $result =~ s/&(equiv|\#8801);/\\ensuremath\{\\equiv\}/g;
                    527:     $result =~ s/&(le|\#8804);/\\ensuremath\{\\leq\}/g;
                    528:     $result =~ s/&(ge|\#8805);/\\ensuremath\{\\geq\}/g;
                    529:     $result =~ s/&(sub|\#8834);/\\ensuremath\{\\subset\}/g;
                    530:     $result =~ s/&(sup|\#8835);/\\ensuremath\{\\supset\}/g;
                    531:     $result =~ s/&(nsub|\#8836);/\\ensuremath\{\\not\\subset\}/g;
                    532:     $result =~ s/&(sube|\#8838);/\\ensuremath\{\\subseteq\}/g;
                    533:     $result =~ s/&(supe|\#8839);/\\ensuremath\{\\supseteq\}/g;
                    534:     $result =~ s/&(oplus|\#8853);/\\ensuremath\{\\oplus\}/g;
                    535:     $result =~ s/&(otimes|\#8855);/\\ensuremath\{\\otimes\}/g;
                    536:     $result =~ s/&(perp|\#8869);/\\ensuremath\{\\perp\}/g;
                    537:     $result =~ s/&(sdot|\#8901);/\\ensuremath\{\\cdot\}/g;
1.199     sakharuk  538: #Geometric Shapes (extended HTML 4.01)
1.281     sakharuk  539:     $result =~ s/&(loz|\#9674);/\\ensuremath\{\\Diamond\}/g;
1.199     sakharuk  540: #Miscellaneous Symbols (extended HTML 4.01)
1.281     sakharuk  541:     $result =~ s/&(spades|\#9824);/\\ensuremath\{\\spadesuit\}/g;
                    542:     $result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g;
                    543:     $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g;
                    544:     $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g;
1.37      sakharuk  545:     return $result;
                    546: }
1.41      sakharuk  547: 
                    548: 
1.327     albertel  549:                   #width, height, oddsidemargin, evensidemargin, topmargin
                    550: my %page_formats=
                    551:     ('letter' => {
                    552: 	 'book' => {
1.349     albertel  553: 	     '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'],
                    554: 	     '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm']
1.327     albertel  555: 	 },
                    556: 	 'album' => {
1.338     albertel  557: 	     '1' => [ '8.8 in', '6.8 in','-40 pt in',  '-60 pt','1 cm'],
1.327     albertel  558: 	     '2' => [ '4.4 in', '6.8 in','-0.5 in', '-1.5 in','3.5 in']
                    559: 	 },
                    560:      },
                    561:      'legal' => {
                    562: 	 'book' => {
                    563: 	     '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'],
                    564: 	     '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in']
                    565: 	 },
                    566: 	 'album' => {
1.376     albertel  567: 	     '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],
                    568:              '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']
1.327     albertel  569:           },
                    570:      },
                    571:      'tabloid' => {
                    572: 	 'book' => {
                    573: 	     '1' => ['9.8 in','16 in','-0.57 in','-0.57 in','-0.5 in'],
                    574: 	     '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in']
                    575: 	 },
                    576: 	 'album' => {
1.376     albertel  577: 	     '1' => ['16 in','9.8 in','-0.57 in','-0.57 in','-0.5 in'],
                    578: 	     '2' => ['16 in','4.9 in','-0.57 in','-0.57 in','-0.5 in']
1.327     albertel  579:           },
                    580:      },
                    581:      'executive' => {
                    582: 	 'book' => {
                    583: 	     '1' => ['6.8 in','9 in','-0.57 in','-0.57 in','1.2 in'],
                    584: 	     '2' => ['3.1 in','9 in','-0.57 in','-0.57 in','1.2 in']
                    585: 	 },
                    586: 	 'album' => {
                    587: 	     '1' => [],
                    588: 	     '2' => []
                    589:           },
                    590:      },
                    591:      'a2' => {
                    592: 	 'book' => {
                    593: 	     '1' => [],
                    594: 	     '2' => []
                    595: 	 },
                    596: 	 'album' => {
                    597: 	     '1' => [],
                    598: 	     '2' => []
                    599:           },
                    600:      },
                    601:      'a3' => {
                    602: 	 'book' => {
                    603: 	     '1' => [],
                    604: 	     '2' => []
                    605: 	 },
                    606: 	 'album' => {
                    607: 	     '1' => [],
                    608: 	     '2' => []
                    609:           },
                    610:      },
                    611:      'a4' => {
                    612: 	 'book' => {
                    613: 	     '1' => ['176 mm','272 mm','-40 pt in','-60 pt','-0.5 in'],
                    614: 	     '2' => [ '91 mm','272 mm','-40 pt in','-60 pt','-0.5 in']
                    615: 	 },
                    616: 	 'album' => {
                    617: 	     '1' => ['8.5 in','7.7 in','-40 pt in','-60 pt','0 in'],
                    618: 	     '2' => ['3.9 in','7.7 in','-40 pt in','-60 pt','0 in']
                    619: 	 },
                    620:      },
                    621:      'a5' => {
                    622: 	 'book' => {
                    623: 	     '1' => [],
                    624: 	     '2' => []
                    625: 	 },
                    626: 	 'album' => {
                    627: 	     '1' => [],
                    628: 	     '2' => []
                    629:           },
                    630:      },
                    631:      'a6' => {
                    632: 	 'book' => {
                    633: 	     '1' => [],
                    634: 	     '2' => []
                    635: 	 },
                    636: 	 'album' => {
                    637: 	     '1' => [],
                    638: 	     '2' => []
                    639:           },
                    640:      },
                    641:      );
                    642: 
1.177     sakharuk  643: sub page_format {
1.140     sakharuk  644: #
1.326     sakharuk  645: #Supported paper format: "Letter [8 1/2x11 in]",      "Legal [8 1/2x14 in]",
                    646: #                        "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]",
                    647: #                        "A2 [420x594 mm]",           "A3 [297x420 mm]",
                    648: #                        "A4 [210x297 mm]",           "A5 [148x210 mm]",
                    649: #                        "A6 [105x148 mm]"
1.140     sakharuk  650: # 
                    651:     my ($papersize,$layout,$numberofcolumns) = @_; 
1.327     albertel  652:     return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};
1.140     sakharuk  653: }
1.76      sakharuk  654: 
                    655: 
1.126     albertel  656: sub get_name {
                    657:     my ($uname,$udom)=@_;
1.373     albertel  658:     if (!defined($uname)) { $uname=$env{'user.name'}; }
                    659:     if (!defined($udom)) { $udom=$env{'user.domain'}; }
1.126     albertel  660:     my $plainname=&Apache::loncommon::plainname($uname,$udom);
1.213     albertel  661:     if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }
                    662:     $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');
                    663:     return $plainname;
1.126     albertel  664: }
                    665: 
1.213     albertel  666: sub get_course {
                    667:     my $courseidinfo;
1.373     albertel  668:     if (defined($env{'request.course.id'})) {
                    669: 	$courseidinfo = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
1.213     albertel  670:     }
                    671:     return $courseidinfo;
                    672: }
1.177     sakharuk  673: 
1.76      sakharuk  674: sub page_format_transformation {
1.312     sakharuk  675:     my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; 
1.202     sakharuk  676:     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
1.312     sakharuk  677:     if ($selectionmade eq '4') {
                    678: 	$assignment='Problems from the Whole Course';
                    679:     } else {
                    680: 	$assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');
                    681:     }
1.261     sakharuk  682:     ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);
1.126     albertel  683:     my $name = &get_name();
1.213     albertel  684:     my $courseidinfo = &get_course();
                    685:     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
1.319     sakharuk  686:     my $topmargintoinsert = '';
                    687:     if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';}
1.325     sakharuk  688:     my $fancypagestatement='';
                    689:     if ($numberofcolumns eq '2') {
                    690: 	$fancypagestatement="\\fancyhead{}\\fancyhead[LO]{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}";
                    691:     } else {
                    692: 	$fancypagestatement="\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}";
                    693:     }
1.140     sakharuk  694:     if ($layout eq 'album') {
1.340     foxr      695: 	    $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\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;
1.140     sakharuk  696:     } elsif ($layout eq 'book') {
                    697: 	if ($choice ne 'All class print') { 
1.340     foxr      698: 	    $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\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;
1.140     sakharuk  699: 	} else {
1.340     foxr      700: 	    $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{}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;
1.319     sakharuk  701: 	}
1.326     sakharuk  702: 	if ($papersize eq 'a4') {
1.319     sakharuk  703: 	    $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/;
1.140     sakharuk  704: 	}
                    705:     }
1.214     sakharuk  706:     if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
                    707:     if ($indexlist eq 'yes') {
                    708: 	$text=~s/(\\begin{document})/\\makeindex $1/;
                    709: 	$text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/;
                    710:     }
1.140     sakharuk  711:     return $text;
                    712: }
                    713: 
                    714: 
1.33      sakharuk  715: sub page_cleanup {
                    716:     my $result = shift;	
1.65      sakharuk  717:  
                    718:     $result =~ m/\\end{document}(\d*)$/;
1.34      sakharuk  719:     my $number_of_columns = $1;
1.33      sakharuk  720:     my $insert = '{';
1.34      sakharuk  721:     for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }
1.33      sakharuk  722:     $insert .= '}';
1.65      sakharuk  723:     $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;
1.34      sakharuk  724:     $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;
                    725:     return $result,$number_of_columns;
1.7       sakharuk  726: }
1.5       sakharuk  727: 
1.3       sakharuk  728: 
1.60      sakharuk  729: sub details_for_menu {
1.335     albertel  730:     my ($helper)=@_;
1.373     albertel  731:     my $postdata=$env{'form.postdata'};
1.335     albertel  732:     if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }
                    733:     my $name_of_resource = &Apache::lonnet::gettitle($postdata);
                    734:     my $symbolic = &Apache::lonnet::symbread($postdata);
1.233     www       735:     my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic);
1.123     albertel  736:     $map=&Apache::lonnet::clutter($map);
1.269     albertel  737:     my $name_of_sequence = &Apache::lonnet::gettitle($map);
1.63      albertel  738:     if ($name_of_sequence =~ /^\s*$/) {
1.123     albertel  739: 	$map =~ m|([^/]+)$|;
                    740: 	$name_of_sequence = $1;
1.63      albertel  741:     }
1.373     albertel  742:     my $name_of_map = &Apache::lonnet::gettitle($env{'request.course.uri'});
1.63      albertel  743:     if ($name_of_map =~ /^\s*$/) {
1.373     albertel  744: 	$env{'request.course.uri'} =~ m|([^/]+)$|;
1.123     albertel  745: 	$name_of_map = $1;
                    746:     }
1.335     albertel  747:     return ($name_of_resource,$name_of_sequence,$name_of_map);
1.76      sakharuk  748: }
                    749: 
                    750: 
                    751: sub latex_corrections {
                    752: 
1.316     sakharuk  753:     my ($number_of_columns,$result,$selectionmade) = @_;
1.76      sakharuk  754: 
1.185     sakharuk  755: #    $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;
1.76      sakharuk  756:     $result =~ s/\$number_of_columns/$number_of_columns/g;
1.316     sakharuk  757:     if ($selectionmade ne '1') {
                    758: 	$result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;
                    759:     } else {
                    760: 	$result =~ s/(\\end{document})/\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;
                    761:     }
1.91      sakharuk  762:     $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;
                    763:     $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;
1.76      sakharuk  764: #-- LaTeX corrections     
                    765:     my $first_comment = index($result,'<!--',0);
                    766:     while ($first_comment != -1) {
                    767: 	my $end_comment = index($result,'-->',$first_comment);
                    768: 	substr($result,$first_comment,$end_comment-$first_comment+3) = '';
                    769: 	$first_comment = index($result,'<!--',$first_comment);
                    770:     }
                    771:     $result =~ s/^\s+$//gm; #remove empty lines
1.377     albertel  772:     #removes more than one empty space
                    773:     $result =~ s|(\s\s+)|($1=~/[\n\r]/)?"\n":" "|ge;
1.76      sakharuk  774:     $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
                    775:     $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
                    776:     $result =~ s/{\\par }\s*\\\\/\\\\/gm;
1.313     sakharuk  777:     $result =~ s/\\\\\s+\[/ \[/g;
1.76      sakharuk  778:     #conversion of html characters to LaTeX equivalents
                    779:     if ($result =~ m/&(\w+|#\d+);/) {
                    780: 	$result = &character_chart($result);
                    781:     }
                    782:     $result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g;
                    783:     $result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g;
                    784: 
                    785:     return $result;
1.60      sakharuk  786: }
                    787: 
1.3       sakharuk  788: 
1.214     sakharuk  789: sub index_table {
                    790:     my $currentURL = shift;
                    791:     my $insex_string='';
                    792:     $currentURL=~s/\.([^\/+])$/\.$1\.meta/;
                    793:     $insex_string=&Apache::lonnet::metadata($currentURL,'keywords');
                    794:     return $insex_string;
                    795: }
                    796: 
                    797: 
1.215     sakharuk  798: sub IndexCreation {
                    799:     my ($texversion,$currentURL)=@_;
                    800:     my @key_words=split(/,/,&index_table($currentURL));
                    801:     my $chunk='';
                    802:     my $st=index $texversion,'\addcontentsline{toc}{subsection}{';
                    803:     if ($st>0) {
                    804: 	for (my $i=0;$i<3;$i++) {$st=(index $texversion,'}',$st+1);}
                    805: 	$chunk=substr($texversion,0,$st+1);
                    806: 	substr($texversion,0,$st+1)=' ';
                    807:     }
                    808:     foreach my $key_word (@key_words) {
                    809: 	if ($key_word=~/\S+/) {
                    810: 	    $texversion=~s/\b($key_word)\b/$1 \\index{$key_word} /i;
                    811: 	}
                    812:     }			
                    813:     if ($st>0) {substr($texversion,0,1)=$chunk;}
                    814:     return $texversion;
                    815: }
                    816: 
1.242     sakharuk  817: sub print_latex_header {
                    818:     my $mode=shift;
                    819:     my $output='\documentclass[letterpaper]{article}';
1.373     albertel  820:     if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) {
1.242     sakharuk  821: 	$output.='\batchmode';
                    822:     }
1.340     foxr      823:     $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
                    824: 	     '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
1.344     foxr      825: 	     '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
                    826: 	     '\usepackage{picins}\usepackage{calc}'."\n".
1.340     foxr      827: 	     '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
                    828: 	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
                    829: 	     '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n".
                    830: 	     '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'."\n".
                    831: 	     '\setlength{\abovedisplayshortskip}{-0.04in}'."\n".
                    832: 	     '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'."\n".
                    833: 	     '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'."\n".
                    834: 	     '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'."\n".
                    835: 	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'."\n".
                    836: 	     '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'."\n".
                    837: 	     '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'."\n".
                    838: 	     '\setlength{\abovedisplayshortskip}{-0.04in}'."\n".
                    839: 	     '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'."\n";
1.242     sakharuk  840:     return $output;	     
                    841: }
                    842: 
                    843: sub path_to_problem {
1.328     albertel  844:     my ($urlp,$colwidth)=@_;
1.242     sakharuk  845:     my $newurlp = '';
1.328     albertel  846:     $colwidth=~s/\s*mm\s*$//;
                    847: #characters average about 2 mm in width
1.360     albertel  848:     if (length($urlp)*2 > $colwidth) {
1.328     albertel  849: 	my @elements = split '/',$urlp;
                    850: 	my $curlength=0;
                    851: 	foreach my $element (@elements) {
                    852: 	    if ($curlength+(length($element)*2) > $colwidth) {
                    853: 		$newurlp .=  '|\vskip -1 mm \noindent \verb|';
                    854: 		$curlength=0;
                    855: 	    } else {
                    856: 		$curlength+=length($element)*2;
1.242     sakharuk  857: 	    }
1.328     albertel  858: 	    $newurlp.='/'.$element;
1.242     sakharuk  859: 	}
1.253     sakharuk  860:     } else {
                    861: 	$newurlp=$urlp;
1.242     sakharuk  862:     }
                    863:     return '{\small\noindent\verb|'.$newurlp.'|\vskip 0 mm}';
                    864: }
1.215     sakharuk  865: 
1.275     sakharuk  866: sub recalcto_mm {
                    867:     my $textwidth=shift;
                    868:     my $LaTeXwidth;
1.339     albertel  869:     if ($textwidth=~/(-?\d+\.?\d*)\s*cm/) {
1.275     sakharuk  870: 	$LaTeXwidth = $1*10;
1.339     albertel  871:     } elsif ($textwidth=~/(-?\d+\.?\d*)\s*mm/) {
1.275     sakharuk  872: 	$LaTeXwidth = $1;
1.339     albertel  873:     } elsif ($textwidth=~/(-?\d+\.?\d*)\s*in/) {
1.275     sakharuk  874: 	$LaTeXwidth = $1*25.4;
                    875:     }
                    876:     $LaTeXwidth.=' mm';
                    877:     return $LaTeXwidth;
                    878: }
                    879: 
1.285     albertel  880: sub get_textwidth {
                    881:     my ($helper,$LaTeXwidth)=@_;
1.286     albertel  882:     my $textwidth=$LaTeXwidth;
1.285     albertel  883:     if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&
                    884: 	$helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {
1.286     albertel  885: 	$textwidth=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.
                    886: 				$helper->{'VARS'}->{'pagesize.widthunit'});
1.285     albertel  887:     }
1.286     albertel  888:     return $textwidth;
1.285     albertel  889: }
                    890: 
1.296     sakharuk  891: 
                    892: sub unsupported {
1.307     sakharuk  893:     my ($currentURL,$mode)=@_;
                    894:     if ($mode ne '') {$mode='\\'.$mode}
1.308     sakharuk  895:     my $result.= &print_latex_header($mode);
1.301     sakharuk  896:     if ($currentURL=~/\/ext\//) {
1.296     sakharuk  897: 	$result.=' \strut \\\\ THIS IS EXTERNAL RESOURCE WITH URL \strut \\\\ '.$currentURL.' ';
                    898:     } else {
                    899: 	$result.=$currentURL;
                    900:     }
1.297     sakharuk  901:     $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
1.296     sakharuk  902:     return $result;
                    903: }
                    904: 
                    905: 
1.363     foxr      906: #
                    907: #   Retrieve the hash of page breaks.
                    908: #
                    909: #  Inputs:
                    910: #    helper   - reference to helper object.
                    911: #  Outputs
                    912: #    A reference to a page break hash.
                    913: #
                    914: #
                    915: 
                    916: sub get_page_breaks  {
                    917:     my ($helper) = @_;
                    918:     my %page_breaks;
                    919:     
                    920:     foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) {
                    921: 	$page_breaks{$break} = 1;
                    922:     }
                    923:     
1.364     albertel  924:     return %page_breaks;
1.363     foxr      925: }
                    926: 
1.177     sakharuk  927: sub output_data {
1.184     sakharuk  928:     my ($r,$helper,$rparmhash) = @_;
                    929:     my %parmhash = %$rparmhash;
1.361     albertel  930:     my $html=&Apache::lonxml::xmlbegin();
1.187     www       931:     my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');
1.140     sakharuk  932:     $r->print(<<ENDPART);
1.361     albertel  933: $html
                    934: <head>
                    935: <script type="text/javascript" language="Javascript">
1.264     sakharuk  936:     var editbrowser;
                    937:     function openbrowser(formname,elementname,only,omit) {
                    938:         var url = '/res/?';
                    939:         if (editbrowser == null) {
                    940:             url += 'launch=1&';
                    941:         }
                    942:         url += 'catalogmode=interactive&';
                    943:         url += 'mode=parmset&';
                    944:         url += 'form=' + formname + '&';
                    945:         if (only != null) {
                    946:             url += 'only=' + only + '&';
                    947:         } 
                    948:         if (omit != null) {
                    949:             url += 'omit=' + omit + '&';
                    950:         }
                    951:         url += 'element=' + elementname + '';
                    952:         var title = 'Browser';
                    953:         var options = 'scrollbars=1,resizable=1,menubar=0';
                    954:         options += ',width=700,height=600';
                    955:         editbrowser = open(url,title,options,'1');
                    956:         editbrowser.focus();
                    957:     }
                    958: </script>
1.140     sakharuk  959: <title>LON-CAPA output for printing</title>
                    960: </head>
1.187     www       961: $bodytag
                    962: Please stand by while processing your print request, this may take some time ...
1.140     sakharuk  963: ENDPART
                    964: 
1.363     foxr      965: 
1.372     foxr      966: 
1.363     foxr      967:     # fetch the pagebreaks and store them in the course environment
                    968:     # The page breaks will be pulled into the hash %page_breaks which is
                    969:     # indexed by symb and contains 1's for each break.
                    970: 
1.373     albertel  971:     $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};
                    972:     $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; 
1.363     foxr      973:     &Apache::loncommon::store_course_settings('print',
1.366     foxr      974: 					      {'pagebreaks'    => 'scalar',
                    975: 					       'lastprinttype' => 'scalar'});
1.363     foxr      976: 
1.364     albertel  977:     my %page_breaks  = &get_page_breaks($helper);
1.363     foxr      978: 
1.140     sakharuk  979:     my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};
                    980:     my ($result,$selectionmade) = ('','');
                    981:     my $number_of_columns = 1; #used only for pages to determine the width of the cell
                    982:     my @temporary_array=split /\|/,$format_from_helper;
                    983:     my ($laystyle,$numberofcolumns,$papersize)=@temporary_array;
                    984:     if ($laystyle eq 'L') {
                    985: 	$laystyle='album';
                    986:     } else {
                    987: 	$laystyle='book';
                    988:     }
1.177     sakharuk  989:     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
1.373     albertel  990:     my $assignment =  $env{'form.assignment'};
1.275     sakharuk  991:     my $LaTeXwidth=&recalcto_mm($textwidth); 
1.272     sakharuk  992:     my @print_array=();
1.274     sakharuk  993:     my @student_names=();
1.360     albertel  994: 
                    995:     #  Common settings for the %form has:
                    996:     # In some cases these settings get overriddent by specific cases, but the
                    997:     # settings are common enough to make it worthwhile factoring them out
                    998:     # here.
                    999:     #
                   1000:     my %form;
                   1001:     $form{'grade_target'} = 'tex';
                   1002:     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
1.372     foxr     1003: 
                   1004:     # If form.showallfoils is set, then request all foils be shown:
                   1005:     # privilege will be enforced both by not allowing the 
                   1006:     # check box selecting this option to be presnt unless it's ok,
                   1007:     # and by lonresponse's priv. check.
                   1008:     # The if is here because lonresponse.pm only cares that
                   1009:     # showallfoils is defined, not what the value is.
                   1010: 
                   1011:     if ($helper->{'VARS'}->{'showallfoils'} eq "1") { 
                   1012: 	$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
                   1013:     }
                   1014: 
1.140     sakharuk 1015:     if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {
1.143     sakharuk 1016:       #-- single document - problem, page, html, xml, ...
1.343     albertel 1017: 	my ($currentURL,$cleanURL);
1.375     foxr     1018: 
1.162     sakharuk 1019: 	if ($helper->{'VARS'}->{'construction'} ne '1') {
1.185     sakharuk 1020:             #prints published resource
1.153     sakharuk 1021: 	    $currentURL=$helper->{'VARS'}->{'postdata'};
1.343     albertel 1022: 	    $cleanURL=&Apache::lonenc::check_decrypt($currentURL);
1.143     sakharuk 1023: 	} else {
1.185     sakharuk 1024:             #prints resource from the construction space
1.240     albertel 1025: 	    $currentURL='/'.$helper->{'VARS'}->{'filename'};
1.206     sakharuk 1026: 	    if ($currentURL=~/([^?]+)/) {$currentURL=$1;}
1.343     albertel 1027: 	    $cleanURL=$currentURL;
1.143     sakharuk 1028: 	}
1.140     sakharuk 1029: 	$selectionmade = 1;
1.343     albertel 1030: 	if ($cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
1.169     albertel 1031: 	    my $rndseed=time;
1.242     sakharuk 1032: 	    my $texversion='';
                   1033: 	    if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
                   1034: 		my %moreenv;
1.343     albertel 1035: 		$moreenv{'request.filename'}=$cleanURL;
1.265     sakharuk 1036: 		if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
                   1037: 		    $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};
1.373     albertel 1038: 		    my $dom = $env{'user.domain'};
                   1039: 		    my $user = $env{'user.name'};
1.265     sakharuk 1040: 		    my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);
                   1041: 		}
1.290     sakharuk 1042:                 if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
1.242     sakharuk 1043: 		$form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.310     sakharuk 1044: 		$form{'suppress_tries'}=$parmhash{'suppress_tries'};
1.242     sakharuk 1045: 		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1.309     sakharuk 1046: 		$form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
                   1047: 		if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';}
1.242     sakharuk 1048: 		if ($helper->{'VARS'}->{'curseed'}) {
                   1049: 		    $rndseed=$helper->{'VARS'}->{'curseed'};
                   1050: 		}
                   1051: 		$form{'rndseed'}=$rndseed;
                   1052: 		&Apache::lonnet::appenv(%moreenv);
                   1053: 		&Apache::lonnet::delenv('form.counter');
                   1054: 		&Apache::lonxml::init_counter();
1.375     foxr     1055: 		$resources_printed .= $currentURL.':';
1.275     sakharuk 1056: 		$texversion.=&Apache::lonnet::ssi($currentURL,%form);
1.242     sakharuk 1057: 		&Apache::lonnet::delenv('form.counter');
                   1058: 		&Apache::lonnet::delenv('request.filename');
1.230     albertel 1059: 	    }
1.242     sakharuk 1060: 	    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
                   1061: 	       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.353     foxr     1062: 		$form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.166     albertel 1063: 		$form{'grade_target'}='answer';
1.167     albertel 1064: 		$form{'answer_output_mode'}='tex';
1.169     albertel 1065: 		$form{'rndseed'}=$rndseed;
1.375     foxr     1066: 		$resources_printed .= $currentURL.':';
1.166     albertel 1067: 		my $answer=&Apache::lonnet::ssi($currentURL,%form);
1.242     sakharuk 1068: 		if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
                   1069: 		    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
                   1070: 		} else {
                   1071: 		    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
1.245     sakharuk 1072: 		    if ($helper->{'VARS'}->{'construction'} ne '1') {
                   1073: 			$texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
1.343     albertel 1074: 			$texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
1.245     sakharuk 1075: 		    } else {
                   1076: 			$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
1.343     albertel 1077: 			my $URLpath=$cleanURL;
1.245     sakharuk 1078: 			$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
                   1079: 			$texversion.=&path_to_problem ($URLpath,$LaTeXwidth);
                   1080: 		    }
1.242     sakharuk 1081: 		    $texversion.='\vskip 1 mm '.$answer.'\end{document}';
                   1082: 		}
1.163     sakharuk 1083: 	    }
1.214     sakharuk 1084: 	    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
1.215     sakharuk 1085: 		$texversion=&IndexCreation($texversion,$currentURL);
1.214     sakharuk 1086: 	    }
1.219     sakharuk 1087: 	    if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
                   1088: 		$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /;
                   1089: 
                   1090: 	    }
1.162     sakharuk 1091: 	    $result .= $texversion;
                   1092: 	    if ($currentURL=~m/\.page\s*$/) {
                   1093: 		($result,$number_of_columns) = &page_cleanup($result);
                   1094: 	    }
1.227     sakharuk 1095:         } elsif ($currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') {
                   1096:             #printing content of sequence from the construction space	
                   1097: 	    my $flag_latex_header_remove = 'NO'; 
                   1098: 	    my $rndseed=time;
1.231     albertel 1099: 	    if ($helper->{'VARS'}->{'curseed'}) {
                   1100: 		$rndseed=$helper->{'VARS'}->{'curseed'};
                   1101: 	    }
1.227     sakharuk 1102: 	    $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;
                   1103: 	    my $errtext=&Apache::lonratedt::mapread($currentURL);
                   1104: 	    for (my $member=0;$member<=$#Apache::lonratedt::order;$member++) {
                   1105: 		$Apache::lonratedt::resources[$Apache::lonratedt::order[$member]]=~/^([^:]*):([^:]*):/;
                   1106: 		my $urlp=$2;
                   1107: 		if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
1.245     sakharuk 1108: 		    my $texversion='';
                   1109: 		    if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
                   1110: 			$form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.310     sakharuk 1111: 			$form{'suppress_tries'}=$parmhash{'suppress_tries'};
1.245     sakharuk 1112: 			$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
                   1113: 			$form{'rndseed'}=$rndseed;
1.375     foxr     1114: 			$resources_printed .=$urlp.':';
1.245     sakharuk 1115: 			$texversion=&Apache::lonnet::ssi($urlp,%form);
                   1116: 		    }
1.249     sakharuk 1117: 		    if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
                   1118: 		       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && 
                   1119: 		       ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {
1.380     foxr     1120: 			#  Don't permanently modify %$form...
                   1121: 			my %answerform = %form;
                   1122: 			$answerform{'grade_target'}='answer';
                   1123: 			$answerform{'answer_output_mode'}='tex';
                   1124: 			$answerform{'rndseed'}=$rndseed;
                   1125: 			$answerform{'problem_split'}=$parmhash{'problem_stream_switch'};
1.373     albertel 1126:                         if ($urlp=~/\/res\//) {$env{'request.state'}='published';}
1.375     foxr     1127: 			$resources_printed .= $urlp.':';
1.380     foxr     1128: 			my $answer=&Apache::lonnet::ssi($urlp,%answerform);
1.245     sakharuk 1129: 			if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
                   1130: 			    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
                   1131: 			} else {
                   1132: 			    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
                   1133: 			    $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
                   1134: 			    $texversion.=&path_to_problem ($currentURL,$LaTeXwidth);
                   1135: 			    $texversion.='\vskip 1 mm '.$answer.'\end{document}';
                   1136: 			}
1.227     sakharuk 1137: 		    }
                   1138: 		    if ($flag_latex_header_remove ne 'NO') {
                   1139: 			$texversion = &latex_header_footer_remove($texversion);
                   1140: 		    } else {
                   1141: 			$texversion =~ s/\\end{document}//;
                   1142: 		    }
                   1143: 		    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
                   1144: 			$texversion=&IndexCreation($texversion,$urlp);
                   1145: 		    }
1.232     sakharuk 1146: 		    if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URpL'} eq 'yes') {
1.227     sakharuk 1147: 			$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
                   1148: 		    }
                   1149: 		    $result.=$texversion;
                   1150: 		    $flag_latex_header_remove = 'YES';
                   1151: 		} elsif ($urlp=~/\.(sequence|page)$/) {
1.229     sakharuk 1152: 		    $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';
1.227     sakharuk 1153: 		}  
                   1154: 	    }
1.228     sakharuk 1155: 	    if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
1.227     sakharuk 1156: 	    $result .= '\end{document}';   
1.343     albertel 1157: 	} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
1.258     sakharuk 1158: 		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1.298     sakharuk 1159: 		if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
1.375     foxr     1160: 		$resources_printed .= $currentURL.':';
1.258     sakharuk 1161: 		my $texversion=&Apache::lonnet::ssi($currentURL,%form);
                   1162: 		$result .= $texversion;
1.162     sakharuk 1163: 	} else {
1.307     sakharuk 1164: 	    $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'});
1.162     sakharuk 1165: 	}
1.354     foxr     1166:     } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')       or
1.142     sakharuk 1167:              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
1.354     foxr     1168:              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or
                   1169: 	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG
1.252     sakharuk 1170: 	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) { 
1.141     sakharuk 1171:         #-- produce an output string
1.296     sakharuk 1172: 	if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
                   1173: 	    $selectionmade = 2;
                   1174: 	} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
                   1175: 	    $selectionmade = 3;
                   1176: 	} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {
                   1177: 	    $selectionmade = 4;
1.354     foxr     1178: 	} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') {  #BUGBUG
                   1179: 	    $selectionmade = 4;
1.296     sakharuk 1180: 	} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {
                   1181: 	    $selectionmade = 7;
                   1182: 	}
1.193     sakharuk 1183: 	$form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.310     sakharuk 1184: 	$form{'suppress_tries'}=$parmhash{'suppress_tries'};
1.203     sakharuk 1185: 	$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
1.309     sakharuk 1186: 	$form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
                   1187: 	if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';}
1.141     sakharuk 1188: 	my $flag_latex_header_remove = 'NO';
                   1189: 	my $flag_page_in_sequence = 'NO';
                   1190: 	my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
1.193     sakharuk 1191: 	my $prevassignment='';
1.270     sakharuk 1192: 	&Apache::lonnet::delenv('form.counter');
1.201     sakharuk 1193: 	&Apache::lonxml::init_counter();
1.141     sakharuk 1194: 	for (my $i=0;$i<=$#master_seq;$i++) {
1.350     foxr     1195: 
                   1196: 	    # Note due to document structure, not allowed to put \newpage
                   1197: 	    # prior to the first resource
                   1198: 
1.351     foxr     1199: 	    if (defined $page_breaks{$master_seq[$i]}) {
1.350     foxr     1200: 		if($i != 0) {
                   1201: 		    $result.="\\newpage\n";
                   1202: 		}
                   1203: 	    }
1.236     albertel 1204: 	    my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
1.237     albertel 1205: 	    $urlp=&Apache::lonnet::clutter($urlp);
1.166     albertel 1206: 	    $form{'symb'}=$master_seq[$i];
1.236     albertel 1207: 	    my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]);
                   1208: 	    my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem
1.267     sakharuk 1209: 	    if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
1.247     sakharuk 1210: 	    if ($i==0) {$prevassignment=$assignment;}
1.297     sakharuk 1211: 	    my $texversion='';
1.296     sakharuk 1212: 	    if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
1.375     foxr     1213: 		$resources_printed .= $urlp.':';
1.297     sakharuk 1214: 		$texversion.=&Apache::lonnet::ssi($urlp,%form);
1.296     sakharuk 1215: 		if ($urlp=~/\.page$/) {
                   1216: 		    ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
                   1217: 		    if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
                   1218: 		    $texversion =~ s/\\end{document}\d*/\\end{document}/;
                   1219: 		    $flag_page_in_sequence = 'YES';
                   1220: 		} 
                   1221: 		my $lonidsdir=$r->dir_config('lonIDsDir');
1.373     albertel 1222: 		my $envfile=$env{'user.environment'};
1.296     sakharuk 1223: 		$envfile=~/\/([^\/]+)\.id$/;
                   1224: 		$envfile=$1;
                   1225: 		&Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
1.373     albertel 1226: 		my $current_counter=$env{'form.counter'};
1.296     sakharuk 1227: 		if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
                   1228: 		   ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.380     foxr     1229: 		    #  Don't permanently pervert the %form hash
                   1230: 		    my %answerform = %form;
                   1231: 		    $answerform{'grade_target'}='answer';
                   1232: 		    $answerform{'answer_output_mode'}='tex';
1.375     foxr     1233: 		    $resources_printed .= $urlp.':';
1.380     foxr     1234: 		    my $answer=&Apache::lonnet::ssi($urlp,%answerform);
1.296     sakharuk 1235: 		    &Apache::lonnet::appenv(('form.counter' => $current_counter));
                   1236: 		    if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
                   1237: 			$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
1.249     sakharuk 1238: 		    } else {
1.307     sakharuk 1239: 			if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
1.296     sakharuk 1240: 			    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
                   1241: 			    $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm ';
                   1242: 			    $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
                   1243: 			    $texversion.='\vskip 1 mm '.$answer;
                   1244: 			} else {
                   1245: 			    $texversion='';
                   1246: 			}
1.249     sakharuk 1247: 		    }
1.246     sakharuk 1248: 		}
1.296     sakharuk 1249: 		if ($flag_latex_header_remove ne 'NO') {
                   1250: 		    $texversion = &latex_header_footer_remove($texversion);
                   1251: 		} else {
                   1252: 		    $texversion =~ s/\\end{document}//;
                   1253: 		}
                   1254: 		if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
                   1255: 		    $texversion=&IndexCreation($texversion,$urlp);
                   1256: 		}
                   1257: 		if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
                   1258: 		    my $name = &get_name();
                   1259: 		    my $courseidinfo = &get_course();
                   1260: 		    if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
                   1261: 		    $prevassignment=$assignment;
1.334     albertel 1262: 		    $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm ';
1.296     sakharuk 1263: 		}
                   1264: 		$result .= $texversion;
                   1265: 		$flag_latex_header_remove = 'YES';   
1.301     sakharuk 1266: 	    } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
                   1267: 		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
                   1268: 		if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
1.375     foxr     1269: 		$resources_printed .= $urlp.':';
1.301     sakharuk 1270: 		my $texversion=&Apache::lonnet::ssi($urlp,%form);
                   1271: 		if ($flag_latex_header_remove ne 'NO') {
                   1272: 		    $texversion = &latex_header_footer_remove($texversion);
                   1273: 		} else {
                   1274: 		    $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;
                   1275: 		}
                   1276: 		$result .= $texversion;
                   1277: 		$flag_latex_header_remove = 'YES'; 
1.141     sakharuk 1278: 	    } else {
1.307     sakharuk 1279: 		$texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'});
1.297     sakharuk 1280: 		if ($flag_latex_header_remove ne 'NO') {
                   1281: 		    $texversion = &latex_header_footer_remove($texversion);
                   1282: 		} else {
                   1283: 		    $texversion =~ s/\\end{document}//;
                   1284: 		}
                   1285: 		$result .= $texversion;
                   1286: 		$flag_latex_header_remove = 'YES';   
1.296     sakharuk 1287: 	    }	    
1.331     albertel 1288: 	    if (&Apache::loncommon::connection_aborted($r)) { last; }
1.141     sakharuk 1289: 	}
                   1290: 	&Apache::lonnet::delenv('form.counter');
1.344     foxr     1291: 	if ($flag_page_in_sequence eq 'YES') {
                   1292: 	    $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;
                   1293: 	}	
1.141     sakharuk 1294: 	$result .= '\end{document}';
1.284     albertel 1295:      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
                   1296: 	      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
1.353     foxr     1297: 
                   1298: 
1.150     sakharuk 1299:      #-- prints assignments for whole class or for selected students  
1.284     albertel 1300: 	 my $type;
1.254     sakharuk 1301: 	 if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {
                   1302: 	     $selectionmade=5;
1.284     albertel 1303: 	     $type='problems';
1.254     sakharuk 1304: 	 } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') {
                   1305: 	     $selectionmade=8;
1.284     albertel 1306: 	     $type='resources';
1.254     sakharuk 1307: 	 }
1.150     sakharuk 1308: 	 my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'};
1.341     foxr     1309: 	 #   The normal sort order is by section then by students within the
                   1310: 	 #   section. If the helper var student_sort is 1, then the user has elected
                   1311: 	 #   to override this and output the students by name.
                   1312: 	 #    Each element of the students array is of the form:
                   1313: 	 #       username:domain:section:last, first:status
                   1314: 	 #    
                   1315: 	 #   
                   1316: 	 if ($helper->{'VARS'}->{'student_sort'}    eq 1) {
                   1317: 	     @students = sort compare_names  @students;
                   1318: 	 }
1.278     albertel 1319:          if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0' ||
                   1320: 	     $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) {
                   1321: 	     $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;
                   1322: 	 }
1.150     sakharuk 1323: 	 my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
1.350     foxr     1324: 
1.150     sakharuk 1325: 	 #loop over students
                   1326: 	 my $flag_latex_header_remove = 'NO'; 
                   1327: 	 my %moreenv;
1.330     sakharuk 1328:          $moreenv{'instructor_comments'}='hide';
1.285     albertel 1329: 	 $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
1.309     sakharuk 1330: 	 $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
1.353     foxr     1331: 	 $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
1.369     foxr     1332: 	 $moreenv{'suppress_tries'}   = $parmhash{'suppress_tries'};
1.309     sakharuk 1333: 	 if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$moreenv{'problem_split'}='yes';}
1.318     albertel 1334: 	 my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');
1.272     sakharuk 1335: 	 my $student_counter=-1;
1.150     sakharuk 1336: 	 foreach my $person (@students) {
1.350     foxr     1337: 
1.373     albertel 1338:              my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
1.311     sakharuk 1339: 	     if (-e $duefile) {
                   1340: 		 my $temp_file = Apache::File->new('>>'.$duefile);
                   1341: 		 print $temp_file "1969\n";
                   1342: 	     }
1.272     sakharuk 1343: 	     $student_counter++;
1.284     albertel 1344: 	     my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
1.375     foxr     1345: 	     my ($output,$fullname, $printed)=&print_resources($r,$helper,
1.353     foxr     1346: 						     $person,$type,
                   1347: 						     \%moreenv,\@master_seq,
1.360     albertel 1348: 						     $flag_latex_header_remove,
                   1349: 						     $LaTeXwidth);
1.375     foxr     1350: 	     $resources_printed .= ":";
1.284     albertel 1351: 	     $print_array[$i].=$output;
                   1352: 	     $student_names[$i].=$person.':'.$fullname.'_END_';
                   1353: 	     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
                   1354: 	     $flag_latex_header_remove = 'YES';
1.331     albertel 1355: 	     if (&Apache::loncommon::connection_aborted($r)) { last; }
1.284     albertel 1356: 	 }
                   1357: 	 &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                   1358: 	 $result .= $print_array[0].'  \end{document}';
                   1359:      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||
                   1360: 	      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) { 
1.373     albertel 1361: 	 my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
                   1362: 	 my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
1.288     albertel 1363: 	 my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
                   1364: 	 my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
1.292     albertel 1365: 	 my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
1.385     foxr     1366: 	 my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
1.388     foxr     1367: 	 my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};
                   1368: 
1.381     albertel 1369: 	 my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
                   1370: 	 open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
                   1371: 	 my ($code_type,$code_length)=('letter',6);
                   1372: 	 foreach my $line (<FH>) {
                   1373: 	     my ($name,$type,$length) = (split(/:/,$line))[0,2,4];
                   1374: 	     if ($name eq $code_option) {
                   1375: 		 $code_length=$length;
                   1376: 		 if ($type eq 'number') { $code_type = 'number'; }
                   1377: 	     }
                   1378: 	 }
1.288     albertel 1379: 	 my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
1.353     foxr     1380: 	 $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
1.288     albertel 1381: 	 my $seed=time+($$<<16)+($$);
1.292     albertel 1382: 	 my @allcodes;
                   1383: 	 if ($old_name) {
1.381     albertel 1384: 	     my %result=&Apache::lonnet::get('CODEs',
                   1385: 					     [$old_name,"type\0$old_name"],
                   1386: 					     $cdom,$cnum);
                   1387: 	     $code_type=$result{"type\0$old_name"};
1.292     albertel 1388: 	     @allcodes=split(',',$result{$old_name});
1.336     albertel 1389: 	     $num_todo=scalar(@allcodes);
1.389     foxr     1390: 	 } elsif ($selected_code) { # Selection value is always numeric.
1.388     foxr     1391: 	     $num_todo = 1;
                   1392: 	     @allcodes = ($selected_code);
1.385     foxr     1393: 	 } elsif ($single_code) {
                   1394: 
1.387     foxr     1395: 	     $num_todo    = 1;	# Unconditionally one code to do.
1.385     foxr     1396: 	     # If an alpha code have to convert to numbers so it can be
                   1397: 	     # converted back to letters again :-)
                   1398: 	     #
                   1399: 	     if ($code_type ne 'number') {
                   1400: 		 $single_code = &letters_to_num($single_code);
                   1401: 	     }
                   1402: 	     @allcodes = ($single_code);
1.292     albertel 1403: 	 } else {
                   1404: 	     my %allcodes;
1.299     albertel 1405: 	     srand($seed);
1.292     albertel 1406: 	     for (my $i=0;$i<$num_todo;$i++) {
1.381     albertel 1407: 		 $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,
                   1408: 					    $code_type);
1.292     albertel 1409: 	     }
                   1410: 	     if ($code_name) {
                   1411: 		 &Apache::lonnet::put('CODEs',
1.381     albertel 1412: 				      {
                   1413: 					$code_name =>join(',',keys(%allcodes)),
                   1414: 					"type\0$code_name" => $code_type
                   1415: 				      },
1.292     albertel 1416: 				      $cdom,$cnum);
                   1417: 	     }
                   1418: 	     @allcodes=keys(%allcodes);
                   1419: 	 }
1.336     albertel 1420: 	 my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
                   1421: 	 my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'});
                   1422: 	 my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'};
                   1423: 	 if ($number_per_page eq '0' || $number_per_page eq 'all') {
                   1424: 	     $number_per_page=$num_todo;
                   1425: 	 }
                   1426: 	 my $flag_latex_header_remove = 'NO'; 
                   1427: 	 my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75');
1.295     albertel 1428: 	 my $count=0;
1.292     albertel 1429: 	 foreach my $code (sort(@allcodes)) {
1.295     albertel 1430: 	     my $file_num=int($count/$number_per_page);
1.381     albertel 1431: 	     if ($code_type eq 'number') { 
                   1432: 		 $moreenv{'CODE'}=$code;
                   1433: 	     } else {
                   1434: 		 $moreenv{'CODE'}=&num_to_letters($code);
                   1435: 	     }
1.375     foxr     1436: 	     my ($output,$fullname, $printed)=
1.288     albertel 1437: 		 &print_resources($r,$helper,'anonymous',$type,\%moreenv,
1.360     albertel 1438: 				  \@master_seq,$flag_latex_header_remove,
                   1439: 				  $LaTeXwidth);
1.375     foxr     1440: 	     $resources_printed .= ":";
1.295     albertel 1441: 	     $print_array[$file_num].=$output;
1.288     albertel 1442: 	     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
                   1443: 				       &mt('last assignment').' '.$fullname);
                   1444: 	     $flag_latex_header_remove = 'YES';
1.295     albertel 1445: 	     $count++;
1.331     albertel 1446: 	     if (&Apache::loncommon::connection_aborted($r)) { last; }
1.288     albertel 1447: 	 }
                   1448: 	 &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                   1449: 	 $result .= $print_array[0].'  \end{document}';
                   1450:      } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') {      
1.151     sakharuk 1451:     #prints selected problems from the subdirectory 
                   1452: 	$selectionmade = 6;
                   1453:         my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
1.154     sakharuk 1454: 	@list_of_files=sort @list_of_files;
1.175     sakharuk 1455: 	my $flag_latex_header_remove = 'NO'; 
                   1456: 	my $rndseed=time;
1.230     albertel 1457: 	if ($helper->{'VARS'}->{'curseed'}) {
                   1458: 	    $rndseed=$helper->{'VARS'}->{'curseed'};
                   1459: 	}
1.151     sakharuk 1460: 	for (my $i=0;$i<=$#list_of_files;$i++) {
1.152     sakharuk 1461: 	    my $urlp = $list_of_files[$i];
1.253     sakharuk 1462: 	    $urlp=~s|//|/|;
1.152     sakharuk 1463: 	    if ($urlp=~/\//) {
1.353     foxr     1464: 		$form{'problem_split'}=$parmhash{'problem_stream_switch'};
1.175     sakharuk 1465: 		$form{'rndseed'}=$rndseed;
1.152     sakharuk 1466: 		if ($urlp =~ m|/home/([^/]+)/public_html|) {
                   1467: 		    $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
                   1468: 		} else {
1.302     sakharuk 1469: 		    $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;
1.152     sakharuk 1470: 		}
1.375     foxr     1471: 		$resources_printed .= $urlp.':';
1.166     albertel 1472: 		my $texversion=&Apache::lonnet::ssi($urlp,%form);
1.251     sakharuk 1473: 		if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
1.253     sakharuk 1474: 		   ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.380     foxr     1475: 		    #  Don't permanently pervert %form:
                   1476: 		    my %answerform = %form;
                   1477: 		    $answerform{'grade_target'}='answer';
                   1478: 		    $answerform{'answer_output_mode'}='tex';
                   1479: 		    $answerform{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
                   1480: 		    $answerform{'rndseed'}=$rndseed;
1.375     foxr     1481: 		    $resources_printed .= $urlp.':';
1.380     foxr     1482: 		    my $answer=&Apache::lonnet::ssi($urlp,%answerform);
1.251     sakharuk 1483: 		    if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
                   1484: 			$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
                   1485: 		    } else {
1.253     sakharuk 1486: 			$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
                   1487: 			if ($helper->{'VARS'}->{'construction'} ne '1') {
                   1488: 			    $texversion.='\vskip 0 mm \noindent ';
                   1489: 			    $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
                   1490: 			} else {
                   1491: 			    $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
                   1492: 			    my $URLpath=$urlp;
                   1493: 			    $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
                   1494: 			    $texversion.=&path_to_problem ($URLpath,$LaTeXwidth);
                   1495: 			}
                   1496: 			$texversion.='\vskip 1 mm '.$answer.'\end{document}';
1.251     sakharuk 1497: 		    }
1.174     sakharuk 1498: 		}
1.151     sakharuk 1499:                 #this chunck is responsible for printing the path to problem
1.253     sakharuk 1500: 		my $newurlp=$urlp;
                   1501: 		if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;}
                   1502: 		$newurlp=&path_to_problem($newurlp,$LaTeXwidth);
1.242     sakharuk 1503: 		$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/;
1.152     sakharuk 1504: 		if ($flag_latex_header_remove ne 'NO') {
                   1505: 		    $texversion = &latex_header_footer_remove($texversion);
                   1506: 		} else {
                   1507: 		    $texversion =~ s/\\end{document}//;
1.216     sakharuk 1508: 		}
                   1509: 		if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
                   1510: 		    $texversion=&IndexCreation($texversion,$urlp);
1.152     sakharuk 1511: 		}
1.219     sakharuk 1512: 		if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
                   1513: 		    $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
                   1514: 		    
                   1515: 		}
1.152     sakharuk 1516: 		$result .= $texversion;
                   1517: 	    }
                   1518: 	    $flag_latex_header_remove = 'YES';  
1.151     sakharuk 1519: 	}
1.175     sakharuk 1520: 	if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;}
1.152     sakharuk 1521: 	$result .= '\end{document}';      	
1.140     sakharuk 1522:     }
                   1523: #-------------------------------------------------------- corrections for the different page formats
1.312     sakharuk 1524:     $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade);
1.316     sakharuk 1525:     $result = &latex_corrections($number_of_columns,$result,$selectionmade);
                   1526:     for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i],$selectionmade);}
1.190     sakharuk 1527:     #changes page's parameters for the one column output 
1.195     sakharuk 1528:     if ($numberofcolumns == 1) {
1.339     albertel 1529: 	$result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /;
                   1530: 	$result =~ s/\\textheight\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /;
                   1531: 	$result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
                   1532: 	$result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
1.195     sakharuk 1533:     }
1.367     foxr     1534: 
1.140     sakharuk 1535: #-- writing .tex file in prtspool 
                   1536:     my $temp_file;
1.277     albertel 1537:     my $identifier = &Apache::loncommon::get_cgi_id();
1.379     foxr     1538:     my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";
1.277     albertel 1539:     if (!($#print_array>0)) { 
                   1540: 	unless ($temp_file = Apache::File->new('>'.$filename)) {
                   1541: 	    $r->log_error("Couldn't open $filename for output $!");
                   1542: 	    return SERVER_ERROR; 
                   1543: 	}
                   1544: 	print $temp_file $result;
                   1545: 	my $begin=index($result,'\begin{document}',0);
                   1546: 	my $inc=substr($result,0,$begin+16);
                   1547:     } else {
                   1548: 	my $begin=index($result,'\begin{document}',0);
                   1549: 	my $inc=substr($result,0,$begin+16);
                   1550:         for (my $i=0;$i<=$#print_array;$i++) {
                   1551: 	    if ($i==0) {
                   1552: 		$print_array[$i]=$result;
                   1553: 	    } else {
                   1554: 		my $anobegin=index($print_array[$i],'\setcounter{page}',0);
                   1555: 		substr($print_array[$i],0,$anobegin)='';
                   1556: 		$print_array[$i]=$inc.$print_array[$i].'\end{document}';
                   1557: 	    }
1.272     sakharuk 1558: 	    my $temp_file;
1.273     sakharuk 1559: 	    my $newfilename=$filename;
1.277     albertel 1560: 	    my $num=$i+1;
1.379     foxr     1561: 	    $newfilename =~s/\.tex$//; 
                   1562: 	    $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);
1.272     sakharuk 1563: 	    unless ($temp_file = Apache::File->new('>'.$newfilename)) {
                   1564: 		$r->log_error("Couldn't open $newfilename for output $!");
                   1565: 		return SERVER_ERROR; 
                   1566: 	    }
                   1567: 	    print $temp_file $print_array[$i];
                   1568: 	}
                   1569:     }
1.274     sakharuk 1570:     my $student_names='';
                   1571:     if ($#print_array>0) {
                   1572: 	for (my $i=0;$i<=$#print_array;$i++) {
                   1573: 	    $student_names.=$student_names[$i].'_ENDPERSON_';
                   1574: 	}
1.277     albertel 1575:     } else {
1.278     albertel 1576: 	if ($#student_names>-1) {
                   1577: 	    $student_names=$student_names[0].'_ENDPERSON_';
                   1578: 	} else {
1.373     albertel 1579: 	    my $fullname = &get_name($env{'user.name'},$env{'user.domain'});
                   1580: 	    $student_names=join(':',$env{'user.name'},$env{'user.domain'},
                   1581: 				$env{'request.course.sec'},$fullname).
1.278     albertel 1582: 				    '_ENDPERSON_'.'_END_';
                   1583: 	}
1.274     sakharuk 1584:     }
                   1585: 
1.276     sakharuk 1586:     my $URLback=''; #link to original document
                   1587:     if ($helper->{'VARS'}->{'construction'} ne '1') {
                   1588: 	#prints published resource
1.342     albertel 1589: 	$URLback=&Apache::lonnet::escape('/adm/flip?postdata=return:');
1.276     sakharuk 1590:     } else {
                   1591: 	#prints resource from the construction space
                   1592: 	$URLback='/'.$helper->{'VARS'}->{'filename'};
1.279     albertel 1593: 	if ($URLback=~/([^?]+)/) {
                   1594: 	    $URLback=$1;
                   1595: 	    $URLback=~s|^/~|/priv/|;
                   1596: 	}
1.276     sakharuk 1597:     }
1.375     foxr     1598:     # logic for now is too complex to trace if this has been defined
                   1599:     #  yet.
                   1600:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   1601:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.257     sakharuk 1602:     &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,
                   1603:                             'cgi.'.$identifier.'.layout'  => $laystyle,
                   1604:                             'cgi.'.$identifier.'.numcol'  => $numberofcolumns,
1.303     sakharuk 1605: 			    'cgi.'.$identifier.'.paper'  => $papersize,
1.257     sakharuk 1606:                             'cgi.'.$identifier.'.selection' => $selectionmade,
1.375     foxr     1607: 			    'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},
                   1608: 			    'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},
                   1609: 			    'cgi.'.$identifier.'.role' => $env{'request.role.adv'},
                   1610:                             'cgi.'.$identifier.'.numberoffiles' => $#print_array,
                   1611:                             'cgi.'.$identifier.'.studentnames' => $student_names,
                   1612:                             'cgi.'.$identifier.'.backref' => $URLback,);
                   1613:     &Apache::lonnet::appenv("cgi.$identifier.user"    => $env{'user.name'},
                   1614: 			    "cgi.$identifier.domain"  => $env{'user.domain'},
                   1615: 			    "cgi.$identifier.courseid" => $cnum, 
                   1616: 			    "cgi.$identifier.coursedom" => $cdom, 
                   1617: 			    "cgi.$identifier.resources" => $resources_printed);
                   1618: 
1.140     sakharuk 1619: $r->print(<<FINALEND);
1.317     albertel 1620: <br />
1.288     albertel 1621: <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
1.317     albertel 1622: <a href="/cgi-bin/printout.pl?$identifier">Continue</a>
1.140     sakharuk 1623: </body>
                   1624: </html>
                   1625: FINALEND
                   1626: }
                   1627: 
1.288     albertel 1628: 
                   1629: sub get_CODE {
1.381     albertel 1630:     my ($all_codes,$num,$seed,$size,$type)=@_;
1.288     albertel 1631:     my $max='1'.'0'x$size;
                   1632:     my $newcode;
                   1633:     while(1) {
1.293     albertel 1634: 	$newcode=sprintf("%06d",int(rand($max)));
1.288     albertel 1635: 	if (!exists($$all_codes{$newcode})) {
                   1636: 	    $$all_codes{$newcode}=1;
1.381     albertel 1637: 	    if ($type eq 'number' ) {
                   1638: 		return $newcode;
                   1639: 	    } else {
                   1640: 		return &num_to_letters($newcode);
                   1641: 	    }
1.288     albertel 1642: 	}
                   1643:     }
                   1644: }
1.140     sakharuk 1645: 
1.284     albertel 1646: sub print_resources {
1.360     albertel 1647:     my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
                   1648: 	$LaTeXwidth)=@_;
1.284     albertel 1649:     my $current_output = ''; 
1.375     foxr     1650:     my $printed = '';
1.284     albertel 1651:     my ($username,$userdomain,$usersection) = split /:/,$person;
                   1652:     my $fullname = &get_name($username,$userdomain);
1.323     sakharuk 1653:     my $namepostfix;
1.288     albertel 1654:     if ($person =~ 'anon') {
1.323     sakharuk 1655: 	$namepostfix="\\\\Name: ";
1.288     albertel 1656: 	$fullname = "CODE - ".$moreenv->{'CODE'};
                   1657:     }
1.350     foxr     1658:     my $i           = 0;
1.284     albertel 1659:     #goes through all resources, checks if they are available for 
                   1660:     #current student, and produces output   
                   1661:     &Apache::lonnet::delenv('form.counter');
                   1662:     &Apache::lonxml::init_counter();
1.363     foxr     1663: 
1.364     albertel 1664:     my %page_breaks  = &get_page_breaks($helper);
1.363     foxr     1665: 
1.284     albertel 1666:     foreach my $curresline (@{$master_seq})  {
1.351     foxr     1667: 	if (defined $page_breaks{$curresline}) {
1.350     foxr     1668: 	    if($i != 0) {
                   1669: 		$current_output.= "\\newpage\n";
                   1670: 	    }
                   1671: 	}
                   1672: 	$i++;
1.284     albertel 1673: 	if ( !($type eq 'problems' && 
                   1674: 	       ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {
                   1675: 	    my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
                   1676: 	    if (&Apache::lonnet::allowed('bre',$res_url)) {
1.305     sakharuk 1677: 		if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
1.375     foxr     1678: 		    $printed .= $curresline.':';
1.373     albertel 1679: 		    my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
1.305     sakharuk 1680: 		    my $lonidsdir=$r->dir_config('lonIDsDir');
1.373     albertel 1681: 		    my $envfile=$env{'user.environment'};
1.305     sakharuk 1682: 		    $envfile=~/\/([^\/]+)\.id$/;
                   1683: 		    $envfile=$1;
                   1684: 		    &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
1.373     albertel 1685: 		    my $current_counter=$env{'form.counter'};
1.305     sakharuk 1686: 		    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
                   1687: 		       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
1.380     foxr     1688: 			#   Use a copy of the hash so we don't pervert it on future loop passes.
                   1689: 			my %answerenv = %{$moreenv};
                   1690: 			$answerenv{'answer_output_mode'}='tex';
                   1691: 			$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
                   1692: 			my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);
1.305     sakharuk 1693: 			&Apache::lonnet::appenv(('form.counter' => $current_counter));
                   1694: 			if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
                   1695: 			    $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;
                   1696: 			} else {
                   1697: 			    $rendered=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
                   1698: 			    $rendered.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm ';
                   1699: 			    $rendered.=&path_to_problem ($curresline,$LaTeXwidth);
                   1700: 			    $rendered.='\vskip 1 mm '.$ansrendered;
                   1701: 			}
                   1702: 		    }
                   1703: 		    if ($remove_latex_header eq 'YES') {
                   1704: 			$rendered = &latex_header_footer_remove($rendered);
                   1705: 		    } else {
                   1706: 			$rendered =~ s/\\end{document}//;
                   1707: 		    }
                   1708: 		    $current_output .= $rendered;		    
                   1709: 		} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
1.375     foxr     1710: 		    $printed .= $curresline.':';
1.373     albertel 1711: 		    my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
1.305     sakharuk 1712: 		    my $lonidsdir=$r->dir_config('lonIDsDir');
1.373     albertel 1713: 		    my $envfile=$env{'user.environment'};
1.305     sakharuk 1714: 		    $envfile=~/\/([^\/]+)\.id$/;
                   1715: 		    $envfile=$1;
                   1716: 		    &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
1.373     albertel 1717: 		    my $current_counter=$env{'form.counter'};
1.305     sakharuk 1718: 		    if ($remove_latex_header eq 'YES') {
                   1719: 			$rendered = &latex_header_footer_remove($rendered);
1.284     albertel 1720: 		    } else {
1.305     sakharuk 1721: 			$rendered =~ s/\\end{document}//;
1.284     albertel 1722: 		    }
1.305     sakharuk 1723: 		    $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
1.284     albertel 1724: 		} else {
1.307     sakharuk 1725: 		    my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'});
1.305     sakharuk 1726: 		    if ($remove_latex_header ne 'NO') {
                   1727: 			$rendered = &latex_header_footer_remove($rendered);
                   1728: 		    } else {
                   1729: 			$rendered =~ s/\\end{document}//;
                   1730: 		    }
                   1731: 		    $current_output .= $rendered;
1.284     albertel 1732: 		}
                   1733: 	    }
                   1734: 	    $remove_latex_header = 'YES';
                   1735: 	}
1.331     albertel 1736: 	if (&Apache::loncommon::connection_aborted($r)) { last; }
1.284     albertel 1737:     }
                   1738:     my $courseidinfo = &get_course();
                   1739:     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
                   1740:     if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}
                   1741:     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
                   1742:     if ($current_output=~/\\documentclass/) {
1.334     albertel 1743: 	$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /;
1.284     albertel 1744:     } else {
                   1745: 	my $blankpages = '';
                   1746: 	for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}
1.334     albertel 1747: 	$current_output = '\strut\vspace*{-6 mm}\\newline\\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 }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;
1.284     albertel 1748:     }
1.375     foxr     1749:     return ($current_output,$fullname, $printed);
1.284     albertel 1750: 
                   1751: }
1.140     sakharuk 1752: 
1.3       sakharuk 1753: sub handler {
                   1754: 
                   1755:     my $r = shift;
1.131     bowersj2 1756:     my $helper;
1.114     bowersj2 1757: 
1.150     sakharuk 1758: #    my $loaderror=&Apache::lonnet::overloaderror($r);
                   1759: #    if ($loaderror) { return $loaderror; }
                   1760: #    $loaderror=
                   1761: #       &Apache::lonnet::overloaderror($r,
1.373     albertel 1762: #         $env{'course.'.$env{'request.course.id'}.'.home'});
1.150     sakharuk 1763: #    if ($loaderror) { return $loaderror; }
1.67      www      1764: 
1.177     sakharuk 1765:     my $result = printHelper($r);
                   1766:     if (!ref($result)) {
                   1767: 	return $result;
1.60      sakharuk 1768:     }
1.177     sakharuk 1769:     $helper = $result;
                   1770:    
                   1771: #	my $key; 
                   1772: #	foreach $key (keys %{$helper->{'VARS'}}) {
                   1773: #	    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');
                   1774: #	}
1.373     albertel 1775: #	foreach $key (keys %env) {
                   1776: #	    $r->print(' '.$key.'->'.$env{$key}.'<-<br />');
1.264     sakharuk 1777: #	}
1.177     sakharuk 1778: #	return OK;
1.184     sakharuk 1779: 
1.373     albertel 1780:     my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
1.353     foxr     1781:  
1.207     sakharuk 1782: #	my $key; 
1.200     sakharuk 1783: #	foreach $key (keys %parmhash) {
                   1784: #	    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');
                   1785: #	}
1.353     foxr     1786: #
1.350     foxr     1787: 
                   1788: 
1.367     foxr     1789:     #  If a figure conversion queue file exists for this user.domain
                   1790:     # we delete it since it can only be bad (if it were good, printout.pl
                   1791:     # would have deleted it the last time around.
                   1792: 
1.373     albertel 1793:     my $conversion_queuefile = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
1.367     foxr     1794:     if(-e $conversion_queuefile) {
                   1795: 	unlink $conversion_queuefile;
                   1796:     }
1.184     sakharuk 1797:     &output_data($r,$helper,\%parmhash);
1.2       sakharuk 1798:     return OK;
1.60      sakharuk 1799: } 
1.2       sakharuk 1800: 
1.131     bowersj2 1801: use Apache::lonhelper;
1.130     sakharuk 1802: 
1.223     bowersj2 1803: sub addMessage {
                   1804:     my $text = shift;
                   1805:     my $paramHash = Apache::lonhelper::getParamHash();
                   1806:     $paramHash->{MESSAGE_TEXT} = $text;
                   1807:     Apache::lonhelper::message->new();
                   1808: }
                   1809: 
1.238     bowersj2 1810: use Data::Dumper;
                   1811: 
1.131     bowersj2 1812: sub printHelper {
1.115     bowersj2 1813:     my $r = shift;
                   1814: 
                   1815:     if ($r->header_only) {
1.373     albertel 1816:         if ($env{'browser.mathml'}) {
1.241     www      1817:             &Apache::loncommon::content_type($r,'text/xml');
1.131     bowersj2 1818:         } else {
1.241     www      1819:             &Apache::loncommon::content_type($r,'text/html');
1.131     bowersj2 1820:         }
                   1821:         $r->send_http_header;
                   1822:         return OK;
1.115     bowersj2 1823:     }
                   1824: 
1.131     bowersj2 1825:     # Send header, nocache
1.373     albertel 1826:     if ($env{'browser.mathml'}) {
1.241     www      1827:         &Apache::loncommon::content_type($r,'text/xml');
1.115     bowersj2 1828:     } else {
1.241     www      1829:         &Apache::loncommon::content_type($r,'text/html');
1.115     bowersj2 1830:     }
                   1831:     &Apache::loncommon::no_cache($r);
                   1832:     $r->send_http_header;
                   1833:     $r->rflush();
                   1834: 
1.131     bowersj2 1835:     # Unfortunately, this helper is so complicated we have to
                   1836:     # write it by hand
                   1837: 
                   1838:     Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
                   1839:     
1.176     bowersj2 1840:     my $helper = Apache::lonhelper::helper->new("Printing Helper");
1.146     bowersj2 1841:     $helper->declareVar('symb');
1.156     bowersj2 1842:     $helper->declareVar('postdata');    
1.290     sakharuk 1843:     $helper->declareVar('curseed'); 
                   1844:     $helper->declareVar('probstatus');   
1.156     bowersj2 1845:     $helper->declareVar('filename');
                   1846:     $helper->declareVar('construction');
1.178     sakharuk 1847:     $helper->declareVar('assignment');
1.262     sakharuk 1848:     $helper->declareVar('style_file');
1.340     foxr     1849:     $helper->declareVar('student_sort');
1.363     foxr     1850:     $helper->declareVar('FINISHPAGE');
1.366     foxr     1851:     $helper->declareVar('PRINT_TYPE');
1.372     foxr     1852:     $helper->declareVar("showallfoils");
1.363     foxr     1853: 
                   1854:     #  The page breaks can get loaded initially from the course environment:
1.366     foxr     1855: 
1.373     albertel 1856:     if((!defined($env{"form.CURRENT_STATE"}))  ||
                   1857:        ($env{'form.CURRENT_STATE'} == "START")) {
1.366     foxr     1858: 	$helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g.
                   1859:     }
                   1860: 
                   1861: 
1.363     foxr     1862:     
                   1863:     &Apache::loncommon::restore_course_settings('print',
1.366     foxr     1864: 						{'pagebreaks'  => 'scalar',
                   1865: 					         'lastprinttype' => 'scalar'});
1.363     foxr     1866: 
1.366     foxr     1867:     
1.373     albertel 1868:     if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") {
                   1869: 	$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
1.366     foxr     1870:     }
                   1871:     
1.131     bowersj2 1872:     
                   1873:     # This will persistently load in the data we want from the
                   1874:     # very first screen.
1.156     bowersj2 1875:     # Detect whether we're coming from construction space
1.373     albertel 1876:     if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {
1.235     bowersj2 1877:         $helper->{VARS}->{'filename'} = "~$1/$2";
1.156     bowersj2 1878:         $helper->{VARS}->{'construction'} = 1;
                   1879:     } else {
1.373     albertel 1880:         if ($env{'form.postdata'}) {
                   1881:             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});
1.156     bowersj2 1882:         }
1.373     albertel 1883:         if ($env{'form.symb'}) {
                   1884:             $helper->{VARS}->{'symb'} = $env{'form.symb'};
1.156     bowersj2 1885:         }
1.373     albertel 1886:         if ($env{'form.url'}) {
1.156     bowersj2 1887:             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
                   1888:         }
1.157     bowersj2 1889:     }
1.156     bowersj2 1890: 
1.373     albertel 1891:     if ($env{'form.symb'}) {
                   1892:         $helper->{VARS}->{'symb'} = $env{'form.symb'};
1.146     bowersj2 1893:     }
1.373     albertel 1894:     if ($env{'form.url'}) {
1.140     sakharuk 1895:         $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
1.153     sakharuk 1896: 
1.140     sakharuk 1897:     }
1.343     albertel 1898:     $helper->{VARS}->{'symb'}=
                   1899: 	&Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
1.335     albertel 1900:     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);
1.178     sakharuk 1901:     if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
1.140     sakharuk 1902: 
1.156     bowersj2 1903:     
1.146     bowersj2 1904:     # Extract map
                   1905:     my $symb = $helper->{VARS}->{'symb'};
1.156     bowersj2 1906:     my ($map, $id, $url);
                   1907:     my $subdir;
                   1908: 
                   1909:     # Get the resource name from construction space
                   1910:     if ($helper->{VARS}->{'construction'}) {
                   1911:         $resourceTitle = substr($helper->{VARS}->{'filename'}, 
                   1912:                                 rindex($helper->{VARS}->{'filename'}, '/')+1);
                   1913:         $subdir = substr($helper->{VARS}->{'filename'},
                   1914:                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
                   1915:     } else {
1.233     www      1916:         ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
1.343     albertel 1917:         $helper->{VARS}->{'postdata'} = 
                   1918: 	    &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
1.146     bowersj2 1919: 
1.156     bowersj2 1920:         if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
1.238     bowersj2 1921:             my $postdata = $helper->{VARS}->{'postdata'};
                   1922:             $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
1.156     bowersj2 1923:         }
                   1924:         $subdir = &Apache::lonnet::filelocation("", $url);
1.128     bowersj2 1925:     }
1.373     albertel 1926:     if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {
                   1927: 	$helper->{VARS}->{'curseed'}=$env{'form.curseed'};
1.230     albertel 1928:     }
1.373     albertel 1929:     if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
                   1930: 	$helper->{VARS}->{'probstatus'}=$env{'form.problemtype'};
1.290     sakharuk 1931:     }
1.115     bowersj2 1932: 
1.192     bowersj2 1933:     my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
1.373     albertel 1934:     my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or
                   1935: 			   $env{'request.role'}=~m/^in\./ or
                   1936: 			   $env{'request.role'}=~m/^ta\./);
1.192     bowersj2 1937: 
1.131     bowersj2 1938:     Apache::lonhelper::registerHelperTags();
1.119     bowersj2 1939: 
1.131     bowersj2 1940:     # "Delete everything after the last slash."
1.119     bowersj2 1941:     $subdir =~ s|/[^/]+$||;
1.162     sakharuk 1942:     if (not $helper->{VARS}->{'construction'}) {
1.302     sakharuk 1943: 	$subdir=$Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$subdir;
1.153     sakharuk 1944:     }
1.189     bowersj2 1945:     # "Remove all duplicate slashes."
                   1946:     $subdir =~ s|/+|/|g;
1.119     bowersj2 1947: 
1.131     bowersj2 1948:     # What can be printed is a very dynamic decision based on
                   1949:     # lots of factors. So we need to dynamically build this list.
                   1950:     # To prevent security leaks, states are only added to the wizard
                   1951:     # if they can be reached, which ensures manipulating the form input
                   1952:     # won't allow anyone to reach states they shouldn't have permission
                   1953:     # to reach.
                   1954: 
                   1955:     # printChoices is tracking the kind of printing the user can
                   1956:     # do, and will be used in a choices construction later.
                   1957:     # In the meantime we will be adding states and elements to
                   1958:     # the helper by hand.
                   1959:     my $printChoices = [];
                   1960:     my $paramHash;
1.130     sakharuk 1961: 
1.240     albertel 1962:     if ($resourceTitle) {
1.291     sakharuk 1963:         push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('what you just saw on the screen').")", 'current_document', 'PAGESIZE'];
1.156     bowersj2 1964:     }
                   1965: 
1.238     bowersj2 1966:     # Useful filter strings
1.287     albertel 1967:     my $isProblem = '($res->is_problem()||$res->contains_problem) ';
1.238     bowersj2 1968:     $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
1.287     albertel 1969:     my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence()';
                   1970:     my $isNotMap = '!$res->is_sequence()';
1.238     bowersj2 1971:     $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
                   1972:     my $isMap = '$res->is_map()';
1.342     albertel 1973:     my $symbFilter = '$res->shown_symb()';
                   1974:     my $urlValue = '$res->link()';
1.238     bowersj2 1975: 
                   1976:     $helper->declareVar('SEQUENCE');
                   1977: 
                   1978:     # Useful for debugging: Dump the help vars
1.366     foxr     1979: #    $r->print(Dumper($helper->{VARS}));
                   1980: #    $r->print($map);
1.238     bowersj2 1981: 
1.131     bowersj2 1982:     # If we're in a sequence...
1.235     bowersj2 1983:     if (($helper->{'VARS'}->{'construction'} ne '1') &&
1.350     foxr     1984: 
1.243     bowersj2 1985: 	$helper->{VARS}->{'postdata'} &&
                   1986: 	$helper->{VARS}->{'assignment'}) {
1.131     bowersj2 1987:         # Allow problems from sequence
1.291     sakharuk 1988:         push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems', 'CHOOSE_PROBLEMS'];
1.131     bowersj2 1989:         # Allow all resources from sequence
1.291     sakharuk 1990:         push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
1.130     sakharuk 1991: 
1.131     bowersj2 1992:         my $helperFragment = <<HELPERFRAGMENT;
1.155     sakharuk 1993:   <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
                   1994:     <message>(mark them then click "next" button) <br /></message>
1.287     albertel 1995:     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
                   1996:               closeallpages="1">
1.144     bowersj2 1997:       <nextstate>PAGESIZE</nextstate>
1.192     bowersj2 1998:       <filterfunc>return $isProblem;</filterfunc>
1.131     bowersj2 1999:       <mapurl>$map</mapurl>
1.238     bowersj2 2000:       <valuefunc>return $symbFilter;</valuefunc>
1.350     foxr     2001:       <option text='Newpage' variable='FINISHPAGE' />
1.131     bowersj2 2002:       </resource>
                   2003:     </state>
                   2004: 
1.155     sakharuk 2005:   <state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print">
                   2006:     <message>(mark them then click "next" button) <br /></message>
1.287     albertel 2007:     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
                   2008:               closeallpages="1">
1.144     bowersj2 2009:       <nextstate>PAGESIZE</nextstate>
1.145     bowersj2 2010:       <filterfunc>return $isNotMap;</filterfunc>
1.131     bowersj2 2011:       <mapurl>$map</mapurl>
1.238     bowersj2 2012:       <valuefunc>return $symbFilter;</valuefunc>
1.350     foxr     2013:       <option text='Newpage' variable='FINISHPAGE' />
1.131     bowersj2 2014:       </resource>
                   2015:     </state>
                   2016: HELPERFRAGMENT
1.121     bowersj2 2017: 
1.326     sakharuk 2018: 	&Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
1.121     bowersj2 2019:     }
                   2020: 
1.354     foxr     2021:     # If the user is privileged, allow them to print all 
                   2022:     # problems and resources  in the entier course, optionally for selected students
1.306     sakharuk 2023:     if ($userPriviledged && 
                   2024:         ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
1.350     foxr     2025: 
1.254     sakharuk 2026:         push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
1.354     foxr     2027: 	push @{$printChoices}, ['<b>Resources</b> from <b>entire course</b>', 'all_resources', 'ALL_RESOURCES'];
1.284     albertel 2028:          &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
1.155     sakharuk 2029:   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
                   2030:     <message>(mark them then click "next" button) <br /></message>
1.287     albertel 2031:     <resource variable="RESOURCES" toponly='0' multichoice="1"
                   2032: 	suppressEmptySequences='0' addstatus="1" closeallpages="1">
1.144     bowersj2 2033:       <nextstate>PAGESIZE</nextstate>
1.192     bowersj2 2034:       <filterfunc>return $isProblemOrMap;</filterfunc>
1.287     albertel 2035:       <choicefunc>return $isNotMap;</choicefunc>
1.238     bowersj2 2036:       <valuefunc>return $symbFilter;</valuefunc>
1.350     foxr     2037:       <option text='Newpage' variable='FINISHPAGE' />
1.284     albertel 2038:     </resource>
                   2039:   </state>
1.354     foxr     2040:   <state name="ALL_RESOURCES" title="Select Resource(s) to print">
                   2041:     <message>(Mark them then click "next" button) <br /> </message>
                   2042:     <resource variable="RESOURCES" toponly='0' multichoice='1'
                   2043:               suppressEmptySequences='0' addstatus='1' closeallpages='1'>
                   2044:       <nextstate>PAGESIZE</nextstate>
                   2045:       <filterfunc>return $isNotMap; </filterfunc>
                   2046:       <valuefunc>return $symbFilter;</valuefunc>
                   2047:       <option text='NewPage' variable='FINISHPAGE' />
                   2048:     </resource>
                   2049:   </state>
1.284     albertel 2050: ALL_PROBLEMS
1.132     bowersj2 2051: 
1.284     albertel 2052: 	if ($helper->{VARS}->{'assignment'}) {
1.291     sakharuk 2053: 	    push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];
                   2054: 	    push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'problems_for_anon', 'CHOOSE_ANON1'];
1.284     albertel 2055: 	}
                   2056: 	my $resource_selector=<<RESOURCE_SELECTOR;
                   2057:    <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
1.287     albertel 2058:     <resource variable="RESOURCES" multichoice="1" addstatus="1" 
                   2059:               closeallpages="1">
1.254     sakharuk 2060:       <filterfunc>return $isProblem;</filterfunc>
1.148     bowersj2 2061:       <mapurl>$map</mapurl>
1.254     sakharuk 2062:       <valuefunc>return $symbFilter;</valuefunc>
1.350     foxr     2063:       <option text='New Page' variable='FINISHPAGE' />
1.147     bowersj2 2064:       </resource>
1.155     sakharuk 2065:     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
1.149     bowersj2 2066:     <choices variable="EMPTY_PAGES">
1.204     sakharuk 2067:       <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>
                   2068:       <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>
                   2069:       <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
                   2070:       <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
1.284     albertel 2071:     </choices>
                   2072:     <message><hr width='33%' /><b>Number of assignments printed at the same time: </b></message>
                   2073:     <string variable="NUMBER_TO_PRINT" maxlength="5" size="5"><defaultvalue>"all"</defaultvalue></string>
                   2074: RESOURCE_SELECTOR
                   2075: 
                   2076:         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
                   2077:   <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
1.370     foxr     2078:       <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1"/>
1.352     foxr     2079:       <message><b>Select sort order</b> </message>
1.340     foxr     2080:     <choices variable='student_sort'>
                   2081:       <choice computer='0'>Sort by section then student</choice>
                   2082:       <choice computer='1'>Sort by students across sections.</choice>
                   2083:     </choices>
1.284     albertel 2084:     $resource_selector
                   2085:   </state>
1.131     bowersj2 2086: CHOOSE_STUDENTS
1.292     albertel 2087: 
1.373     albertel 2088: 	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2089: 	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
1.292     albertel 2090:         my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);
                   2091: 	my $namechoice='<choice></choice>';
1.337     albertel 2092: 	foreach my $name (sort {uc($a) cmp uc($b)} @names) {
1.294     albertel 2093: 	    if ($name =~ /^error: 2 /) { next; }
1.381     albertel 2094: 	    if ($name =~ /^type\0/) { next; }
1.292     albertel 2095: 	    $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
                   2096: 	}
1.389     foxr     2097: 
                   2098: 
1.388     foxr     2099:         my %all_codes = &Apache::lonnet::get('CODEs',
                   2100: 					     \@names, $cdom,$cnum);
1.389     foxr     2101: 	my %code_values;
1.388     foxr     2102: 	my @all_code_array;
                   2103: 	foreach my $key (keys %all_codes) {
1.389     foxr     2104: 	    %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);
                   2105: 	    foreach my $key (keys %code_values) {
                   2106: 		push (@all_code_array, "$key");
1.388     foxr     2107: 	    }
                   2108: 	}
1.389     foxr     2109: 
1.388     foxr     2110: 	my $code_selection = "<choice></choice>\n";
1.389     foxr     2111: 	foreach my $code (sort {uc($a) cmp uc($b)} @all_code_array) {
                   2112: 	    my $choice  = $code;
                   2113: 	    if ($code =~ /^[A-Z]+$/) { # Alpha code
                   2114: 		$choice = &letters_to_num($code);
                   2115: 	    }
                   2116: 	    $code_selection .= '   <choice computer="'.$choice.'">'.$code."</choice>\n";
1.388     foxr     2117: 	}
1.381     albertel 2118: 	open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
                   2119: 	my $codechoice='';
                   2120: 	foreach my $line (<FH>) {
                   2121: 	    my ($name,$description,$code_type,$code_length)=
                   2122: 		(split(/:/,$line))[0,1,2,4];
                   2123: 	    if ($code_length > 0 && 
                   2124: 		$code_type =~/^(letter|number|-1)/) {
                   2125: 		$codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';
                   2126: 	    }
                   2127: 	}
                   2128: 	if ($codechoice eq '') {
                   2129: 	    $codechoice='<choice computer="default">Default</choice>';
                   2130: 	}
1.284     albertel 2131:         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);
                   2132:   <state name="CHOOSE_ANON1" title="Select Students and Resources">
1.288     albertel 2133:     <nextstate>PAGESIZE</nextstate>
1.362     albertel 2134:     <message><hr width='33%' /></message>
                   2135:     <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>
                   2136:     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
                   2137:        <validator>
                   2138: 	if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
1.382     foxr     2139: 	    !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
1.388     foxr     2140:             !\$helper->{'VARS'}{'SINGLE_CODE'}                    &&
                   2141: 	    !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.362     albertel 2142: 	    return "You need to specify the number of assignments to print";
                   2143: 	}
                   2144: 	return undef;
                   2145:        </validator>
                   2146:     </string>
                   2147:     <message></td></tr><tr><td></message>
1.382     foxr     2148:     <message><b>Value of CODE to print?</b></td><td></message>
                   2149:     <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">
                   2150:         <validator>
                   2151: 	   if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
1.388     foxr     2152: 	      !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&
                   2153: 	      !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.382     foxr     2154: 	      return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
                   2155: 						      \$helper->{'VARS'}{'CODE_OPTION'});
                   2156: 	   } else {
                   2157: 	       return undef;	# Other forces control us.
                   2158: 	   }
                   2159:         </validator>
                   2160:     </string>
                   2161:     <message></td></tr><tr><td></message>
1.388     foxr     2162:     <message><b>Choose single code from list</b></message>
                   2163:     <message></td><td></message>
                   2164:     <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
                   2165:     $code_selection
                   2166:     </dropdown>
                   2167:     <message></td></tr><tr><td></message>
1.362     albertel 2168:     <message><b>Names to store the CODEs under for later:</b></message>
                   2169:     <message></td><td></message>
1.288     albertel 2170:     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
1.381     albertel 2171:     <message></td></tr><tr><td></message>
                   2172:     <message><b>Bubble sheet type:</b></message>
                   2173:     <message></td><td></message>
                   2174:     <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
                   2175:     $codechoice
                   2176:     </dropdown>
1.362     albertel 2177:     <message></td></tr></table></message>
1.292     albertel 2178:     <message><hr width='33%' /></message>
                   2179:     <message><b>Reprint a set of saved CODEs:</b></message>
                   2180:     <dropdown variable="REUSE_OLD_CODES">
                   2181:         $namechoice
                   2182:     </dropdown>
1.284     albertel 2183:     <message><hr width='33%' /></message>
                   2184:     $resource_selector
                   2185:   </state>
                   2186: CHOOSE_ANON1
1.254     sakharuk 2187: 
1.272     sakharuk 2188: 
1.254     sakharuk 2189: 	if ($helper->{VARS}->{'assignment'}) {
1.291     sakharuk 2190: 	    push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'resources_for_students', 'CHOOSE_STUDENTS1'];
                   2191: 	    push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'resources_for_anon', 'CHOOSE_ANON2'];
1.254     sakharuk 2192: 	}
1.284     albertel 2193: 	    
                   2194: 
                   2195: 	$resource_selector=<<RESOURCE_SELECTOR;
1.254     sakharuk 2196:     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
1.287     albertel 2197:     <resource variable="RESOURCES" multichoice="1" addstatus="1" 
                   2198:               closeallpages="1">
1.254     sakharuk 2199:       <filterfunc>return $isNotMap;</filterfunc>
                   2200:       <mapurl>$map</mapurl>
                   2201:       <valuefunc>return $symbFilter;</valuefunc>
1.350     foxr     2202:       <option text='Newpage' variable='FINISHPAGE' />
1.254     sakharuk 2203:       </resource>
                   2204:     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
                   2205:     <choices variable="EMPTY_PAGES">
                   2206:       <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>
                   2207:       <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>
                   2208:       <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
                   2209:       <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
1.284     albertel 2210:     </choices>
                   2211:     <message><hr width='33%' /><b>Number of assignments printed at the same time: </b></message>
                   2212:     <string variable="NUMBER_TO_PRINT" maxlength="5" size="5"><defaultvalue>"all"</defaultvalue></string>
                   2213: RESOURCE_SELECTOR
                   2214: 
                   2215: 	&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);
                   2216:   <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">
1.370     foxr     2217:     <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1" />
1.340     foxr     2218:     <choices variable='student_sort'>
                   2219:       <choice computer='0'>Sort by section then student</choice>
                   2220:       <choice computer='1'>Sort by students across sections.</choice>
                   2221:     </choices>
                   2222: 
1.284     albertel 2223:     $resource_selector
1.254     sakharuk 2224:     </state>
                   2225: CHOOSE_STUDENTS1
                   2226: 
1.284     albertel 2227: 	&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);
                   2228:   <state name="CHOOSE_ANON2" title="Select Students and Resources">
1.294     albertel 2229:     <nextstate>PAGESIZE</nextstate>
1.362     albertel 2230:     <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>
                   2231:     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
                   2232:        <validator>
                   2233: 	if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
1.386     foxr     2234: 	    !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
1.388     foxr     2235: 	    !\$helper->{'VARS'}{'SINGLE_CODE'}                   &&
                   2236: 	    !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.362     albertel 2237: 	    return "You need to specify the number of assignments to print";
                   2238: 	}
                   2239: 	return undef;
                   2240:        </validator>
                   2241:     </string>
                   2242:     <message></td></tr><tr><td></message>
1.386     foxr     2243:     <message><b>Value of CODE to print?</b></td><td></message>
                   2244:     <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">
                   2245:         <validator>
                   2246: 	   if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
1.388     foxr     2247: 	      !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&
                   2248: 	      !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
1.386     foxr     2249: 	      return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
                   2250: 						      \$helper->{'VARS'}{'CODE_OPTION'});
                   2251: 	   } else {
                   2252: 	       return undef;	# Other forces control us.
                   2253: 	   }
                   2254:         </validator>
                   2255:     </string>
                   2256:     <message></td></tr><tr><td></message>
1.388     foxr     2257:     <message><b>Choose single code from list</b></message>
                   2258:     <message></td><td></message>
                   2259:     <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
                   2260:     $code_selection
                   2261:     </dropdown>
                   2262:     <message></td></tr><tr><td></message>
1.362     albertel 2263:     <message><b>Names to store the CODEs under for later:</b></message>
                   2264:     <message></td><td></message>
1.294     albertel 2265:     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
1.381     albertel 2266:     <message></td></tr><tr><td></message>
                   2267:     <message><b>Bubble sheet type:</b></message>
                   2268:     <message></td><td></message>
                   2269:     <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
                   2270:     $codechoice
                   2271:     </dropdown>
1.362     albertel 2272:     <message></td></tr></table></message>
1.294     albertel 2273:     <message><hr width='33%' /></message>
                   2274:     <message><b>Reprint a set of saved CODEs:</b></message>
                   2275:     <dropdown variable="REUSE_OLD_CODES">
                   2276:         $namechoice
                   2277:     </dropdown>
1.284     albertel 2278:     <message><hr width='33%' /></message>
                   2279:     $resource_selector
                   2280:   </state>
                   2281: CHOOSE_ANON2
1.121     bowersj2 2282:     }
                   2283: 
                   2284:     # FIXME: That RE should come from a library somewhere.
1.373     albertel 2285:     if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $env{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {    
1.291     sakharuk 2286:         push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
1.238     bowersj2 2287: 
1.131     bowersj2 2288:         my $f = '$filename';
1.139     bowersj2 2289:         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
1.155     sakharuk 2290:   <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$subdir</small></b> to print">
                   2291:     <message>(mark them then click "next" button) <br /></message>
1.138     bowersj2 2292:     <files variable="FILES" multichoice='1'>
1.144     bowersj2 2293:       <nextstate>PAGESIZE</nextstate>
1.138     bowersj2 2294:       <filechoice>return '$subdir';</filechoice>
1.139     bowersj2 2295: CHOOSE_FROM_SUBDIR
                   2296:         
1.238     bowersj2 2297:         # this is broken up because I really want interpolation above,
                   2298:         # and I really DON'T want it below
1.139     bowersj2 2299:         $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
1.225     bowersj2 2300:       <filefilter>return Apache::lonhelper::files::not_old_version($filename) &&
                   2301: 	  $filename =~ m/\.(problem|exam|quiz|assess|survey|form|library)$/;
1.131     bowersj2 2302:       </filefilter>
1.138     bowersj2 2303:       </files>
1.131     bowersj2 2304:     </state>
                   2305: CHOOSE_FROM_SUBDIR
1.139     bowersj2 2306:         &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
1.131     bowersj2 2307:     }
1.238     bowersj2 2308: 
                   2309:     # Allow the user to select any sequence in the course, feed it to
                   2310:     # another resource selector for that sequence
1.239     bowersj2 2311:     if (!$helper->{VARS}->{'construction'}) {
1.254     sakharuk 2312: 	push @$printChoices, ["<b>Resources</b> from <b>selected sequence</b> in course",
1.249     sakharuk 2313: 			      'select_sequences', 'CHOOSE_SEQUENCE'];
1.244     bowersj2 2314: 	my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};
                   2315: 	#Escape apostrophes and backslashes for Perl
                   2316: 	$escapedSequenceName =~ s/\\/\\\\/g;
                   2317: 	$escapedSequenceName =~ s/'/\\'/g;
1.239     bowersj2 2318: 	&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);
1.238     bowersj2 2319:   <state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From">
                   2320:     <message>Select the sequence to print resources from:</message>
                   2321:     <resource variable="SEQUENCE">
                   2322:       <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
                   2323:       <filterfunc>return \$res->is_sequence;</filterfunc>
                   2324:       <valuefunc>return $urlValue;</valuefunc>
1.350     foxr     2325:       <option text='Newpage' variable='FINISHPAGE' />
1.238     bowersj2 2326:       </resource>
                   2327:     </state>
                   2328:   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
                   2329:     <message>(mark desired resources then click "next" button) <br /></message>
1.287     albertel 2330:     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
                   2331:               closeallpages="1">
1.238     bowersj2 2332:       <nextstate>PAGESIZE</nextstate>
                   2333:       <filterfunc>return $isProblem</filterfunc>
1.244     bowersj2 2334:       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
1.238     bowersj2 2335:       <valuefunc>return $symbFilter;</valuefunc>
1.350     foxr     2336:       <option text='Newpage' variable='FINISHPAGE' />
1.238     bowersj2 2337:       </resource>
                   2338:     </state>
                   2339: CHOOSE_FROM_ANY_SEQUENCE
1.239     bowersj2 2340: }
1.131     bowersj2 2341: 
                   2342:     # Generate the first state, to select which resources get printed.
1.223     bowersj2 2343:     Apache::lonhelper::state->new("START", "Select Printing Options:");
1.131     bowersj2 2344:     $paramHash = Apache::lonhelper::getParamHash();
1.155     sakharuk 2345:     $paramHash->{MESSAGE_TEXT} = "";
1.131     bowersj2 2346:     Apache::lonhelper::message->new();
                   2347:     $paramHash = Apache::lonhelper::getParamHash();
                   2348:     $paramHash->{'variable'} = 'PRINT_TYPE';
                   2349:     $paramHash->{CHOICES} = $printChoices;
                   2350:     Apache::lonhelper::choices->new();
1.161     bowersj2 2351: 
1.223     bowersj2 2352:     my $startedTable = 0; # have we started an HTML table yet? (need
                   2353:                           # to close it later)
                   2354: 
1.373     albertel 2355:     if (($env{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or 
1.170     sakharuk 2356: 	($helper->{VARS}->{'construction'} eq '1')) {
1.242     sakharuk 2357: 	addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");
1.161     bowersj2 2358:         $paramHash = Apache::lonhelper::getParamHash();
1.162     sakharuk 2359: 	$paramHash->{'variable'} = 'ANSWER_TYPE';   
                   2360: 	$helper->declareVar('ANSWER_TYPE');         
1.161     bowersj2 2361:         $paramHash->{CHOICES} = [
1.242     sakharuk 2362:                                    ['Without Answers', 'yes'],
                   2363:                                    ['With Answers', 'no'],
1.368     albertel 2364:                                    ['Only Answers', 'only']
1.289     sakharuk 2365:                                 ];
1.210     sakharuk 2366:         Apache::lonhelper::dropdown->new();
1.223     bowersj2 2367: 	addMessage("</td></tr>");
                   2368: 	$startedTable = 1;
1.161     bowersj2 2369:     }
1.209     sakharuk 2370: 
1.373     albertel 2371:     if ($env{'request.role.adv'}) {
1.223     bowersj2 2372: 	if (!$startedTable) {
                   2373: 	    addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");
                   2374: 	    $startedTable = 1;
                   2375: 	} else {
                   2376: 	    addMessage("<tr><td align='right'>LaTeX mode: </td><td>");
                   2377: 	}
1.203     sakharuk 2378:         $paramHash = Apache::lonhelper::getParamHash();
                   2379: 	$paramHash->{'variable'} = 'LATEX_TYPE';   
                   2380: 	$helper->declareVar('LATEX_TYPE');  
                   2381: 	if ($helper->{VARS}->{'construction'} eq '1') {       
                   2382: 	    $paramHash->{CHOICES} = [
1.223     bowersj2 2383: 				     ['standard LaTeX mode', 'standard'], 
                   2384: 				     ['LaTeX batchmode', 'batchmode'], ];
1.203     sakharuk 2385: 	} else {
                   2386: 	    $paramHash->{CHOICES} = [
1.223     bowersj2 2387: 				     ['LaTeX batchmode', 'batchmode'],
                   2388: 				     ['standard LaTeX mode', 'standard'] ];
1.203     sakharuk 2389: 	}
1.210     sakharuk 2390:         Apache::lonhelper::dropdown->new();
1.218     sakharuk 2391:  
1.223     bowersj2 2392: 	addMessage("</td></tr><tr><td align='right'>Print Table of Contents: </td><td>");
1.209     sakharuk 2393:         $paramHash = Apache::lonhelper::getParamHash();
                   2394: 	$paramHash->{'variable'} = 'TABLE_CONTENTS';   
                   2395: 	$helper->declareVar('TABLE_CONTENTS');         
                   2396:         $paramHash->{CHOICES} = [
1.223     bowersj2 2397:                                    ['No', 'no'],
                   2398:                                    ['Yes', 'yes'] ];
1.210     sakharuk 2399:         Apache::lonhelper::dropdown->new();
1.223     bowersj2 2400: 	addMessage("</td></tr>");
1.214     sakharuk 2401:         
1.220     sakharuk 2402: 	if (not $helper->{VARS}->{'construction'}) {
1.223     bowersj2 2403: 	    addMessage("<tr><td align='right'>Print Index: </td><td>");
1.220     sakharuk 2404: 	    $paramHash = Apache::lonhelper::getParamHash();
                   2405: 	    $paramHash->{'variable'} = 'TABLE_INDEX';   
                   2406: 	    $helper->declareVar('TABLE_INDEX');         
                   2407: 	    $paramHash->{CHOICES} = [
1.223     bowersj2 2408: 				     ['No', 'no'],
                   2409: 				     ['Yes', 'yes'] ];
1.220     sakharuk 2410: 	    Apache::lonhelper::dropdown->new();
1.223     bowersj2 2411: 	    addMessage("</td></tr>");
1.309     sakharuk 2412: 	    addMessage("<tr><td align='right'>Print Discussions: </td><td>");
                   2413: 	    $paramHash = Apache::lonhelper::getParamHash();
                   2414: 	    $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';   
                   2415: 	    $helper->declareVar('PRINT_DISCUSSIONS');         
                   2416: 	    $paramHash->{CHOICES} = [
                   2417: 				     ['No', 'no'],
                   2418: 				     ['Yes', 'yes'] ];
                   2419: 	    Apache::lonhelper::dropdown->new();
                   2420: 	    addMessage("</td></tr>");
1.372     foxr     2421: 
                   2422:             #  If advanced roles, then allow to show all foils.
                   2423: 
1.374     albertel 2424:             if ($env{'request.role.adv'}) {
1.372     foxr     2425: 		addMessage("<tr><td align = 'right'>  </td><td>");
                   2426: 		$paramHash = Apache::lonhelper::getParamHash();
                   2427: 		$paramHash->{'multichoice'} = "true";
                   2428: 		$paramHash->{'allowempty'}  = "true";
                   2429: 		$paramHash->{'variable'}   = "showallfoils";
                   2430: 		$paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];
                   2431: 		Apache::lonhelper::choices->new();
                   2432: 		addMessage("</td></tr>");
                   2433:             }
                   2434: 
1.220     sakharuk 2435: 	}
1.219     sakharuk 2436: 
1.230     albertel 2437: 	if ($helper->{'VARS'}->{'construction'}) { 
1.373     albertel 2438: 	    my $stylevalue=$env{'construct.style'};
1.265     sakharuk 2439: 	    my $xmlfrag .= <<"RNDSEED";
1.290     sakharuk 2440: 	    <message><tr><td align='right'>Use random seed:  </td><td></message>
1.230     albertel 2441: 	    <string variable="curseed" size="15" maxlength="15">
                   2442: 		<defaultvalue>
                   2443: 	            return $helper->{VARS}->{'curseed'};
                   2444: 	        </defaultvalue>
1.262     sakharuk 2445: 	    </string>
1.264     sakharuk 2446: 	     <message></td></tr><tr><td align="right">Use style file:</td><td></message>
1.378     albertel 2447:              <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file','sty')">Select style file</a> </td><tr><td></message>
1.371     foxr     2448: 	     <choices allowempty="1" multichoice="true" variable="showallfoils">
                   2449:                 <choice computer="1">Show all foils?</choice>
                   2450:              </choices>
1.378     albertel 2451: 	     <message></td></tr></message>
1.230     albertel 2452: RNDSEED
                   2453:             &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
1.373     albertel 2454: 	    $helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'};
1.371     foxr     2455: 	    
1.372     foxr     2456: 	} 
                   2457: 
1.223     bowersj2 2458:     }
1.264     sakharuk 2459: 
                   2460: 
                   2461: 
1.218     sakharuk 2462: 
1.223     bowersj2 2463:     if ($startedTable) {
                   2464: 	addMessage("</table>");
1.215     sakharuk 2465:     }
1.161     bowersj2 2466: 
1.131     bowersj2 2467:     Apache::lonprintout::page_format_state->new("FORMAT");
                   2468: 
1.144     bowersj2 2469:     # Generate the PAGESIZE state which will offer the user the margin
                   2470:     # choices if they select one column
                   2471:     Apache::lonhelper::state->new("PAGESIZE", "Set Margins");
                   2472:     Apache::lonprintout::page_size_state->new('pagesize', 'FORMAT', 'FINAL');
                   2473: 
                   2474: 
1.131     bowersj2 2475:     $helper->process();
                   2476: 
                   2477:     # MANUAL BAILOUT CONDITION:
                   2478:     # If we're in the "final" state, bailout and return to handler
                   2479:     if ($helper->{STATE} eq 'FINAL') {
                   2480:         return $helper;
                   2481:     }    
1.130     sakharuk 2482: 
1.131     bowersj2 2483:     $r->print($helper->display());
1.130     sakharuk 2484: 
1.333     albertel 2485:     &Apache::lonhelper::unregisterHelperTags();
1.115     bowersj2 2486: 
                   2487:     return OK;
                   2488: }
                   2489: 
1.1       www      2490: 
                   2491: 1;
1.119     bowersj2 2492: 
                   2493: package Apache::lonprintout::page_format_state;
                   2494: 
                   2495: =pod
                   2496: 
1.131     bowersj2 2497: =head1 Helper element: page_format_state
                   2498: 
                   2499: See lonhelper.pm documentation for discussion of the helper framework.
1.119     bowersj2 2500: 
1.131     bowersj2 2501: Apache::lonprintout::page_format_state is an element that gives the 
                   2502: user an opportunity to select the page layout they wish to print 
                   2503: with: Number of columns, portrait/landscape, and paper size. If you 
                   2504: want to change the paper size choices, change the @paperSize array 
                   2505: contents in this package.
1.119     bowersj2 2506: 
1.131     bowersj2 2507: page_format_state is always directly invoked in lonprintout.pm, so there
                   2508: is no tag interface. You actually pass parameters to the constructor.
1.119     bowersj2 2509: 
                   2510: =over 4
                   2511: 
1.131     bowersj2 2512: =item * B<new>(varName): varName is where the print information will be stored in the format FIXME.
1.119     bowersj2 2513: 
                   2514: =back
                   2515: 
                   2516: =cut
                   2517: 
1.131     bowersj2 2518: use Apache::lonhelper;
1.119     bowersj2 2519: 
                   2520: no strict;
1.131     bowersj2 2521: @ISA = ("Apache::lonhelper::element");
1.119     bowersj2 2522: use strict;
1.266     sakharuk 2523: use Apache::lonlocal;
1.373     albertel 2524: use Apache::lonnet;
1.119     bowersj2 2525: 
                   2526: my $maxColumns = 2;
1.376     albertel 2527: # it'd be nice if these all worked
                   2528: #my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
                   2529: #                 "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",
                   2530: #                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]", 
                   2531: #                 "a5 [148x210 mm]", "a6 [105x148 mm]" );
1.326     sakharuk 2532: my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
1.376     albertel 2533: 		 "a4 [210x297 mm]");
1.119     bowersj2 2534: 
                   2535: # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
                   2536: #                   Paper type
                   2537: 
                   2538: sub new { 
1.131     bowersj2 2539:     my $self = Apache::lonhelper::element->new();
1.119     bowersj2 2540: 
1.135     bowersj2 2541:     shift;
                   2542: 
1.131     bowersj2 2543:     $self->{'variable'} = shift;
1.134     bowersj2 2544:     my $helper = Apache::lonhelper::getHelper();
1.135     bowersj2 2545:     $helper->declareVar($self->{'variable'});
1.131     bowersj2 2546:     bless($self);
1.119     bowersj2 2547:     return $self;
                   2548: }
                   2549: 
                   2550: sub render {
                   2551:     my $self = shift;
1.131     bowersj2 2552:     my $helper = Apache::lonhelper::getHelper();
1.119     bowersj2 2553:     my $result = '';
1.131     bowersj2 2554:     my $var = $self->{'variable'};
1.266     sakharuk 2555:     my $PageLayout=&mt('Page layout');
                   2556:     my $NumberOfColumns=&mt('Number of columns');
                   2557:     my $PaperType=&mt('Paper type');
1.119     bowersj2 2558:     $result .= <<STATEHTML;
                   2559: 
1.223     bowersj2 2560: <hr width="33%" />
1.119     bowersj2 2561: <table cellpadding="3">
                   2562:   <tr>
1.266     sakharuk 2563:     <td align="center"><b>$PageLayout</b></td>
                   2564:     <td align="center"><b>$NumberOfColumns</b></td>
                   2565:     <td align="center"><b>$PaperType</b></td>
1.119     bowersj2 2566:   </tr>
                   2567:   <tr>
                   2568:     <td>
1.376     albertel 2569:       <label><input type="radio" name="${var}.layout" value="L" /> Landscape </label><br />
                   2570:       <label><input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait </label>
1.119     bowersj2 2571:     </td>
1.155     sakharuk 2572:     <td align="center">
1.119     bowersj2 2573:       <select name="${var}.cols">
                   2574: STATEHTML
                   2575: 
                   2576:     my $i;
                   2577:     for ($i = 1; $i <= $maxColumns; $i++) {
1.144     bowersj2 2578:         if ($i == 2) {
1.119     bowersj2 2579:             $result .= "<option value='$i' selected>$i</option>\n";
                   2580:         } else {
                   2581:             $result .= "<option value='$i'>$i</option>\n";
                   2582:         }
                   2583:     }
                   2584: 
                   2585:     $result .= "</select></td><td>\n";
                   2586:     $result .= "<select name='${var}.paper'>\n";
                   2587: 
1.373     albertel 2588:     my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
1.304     sakharuk 2589:     my $DefaultPaperSize=$parmhash{'default_paper_size'};
                   2590:     if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}
1.119     bowersj2 2591:     $i = 0;
                   2592:     foreach (@paperSize) {
1.326     sakharuk 2593: 	$_=~/(\w+)/;
                   2594: 	my $papersize=$1;
1.304     sakharuk 2595:         if ($paperSize[$i]=~/$DefaultPaperSize/) {
1.326     sakharuk 2596:             $result .= "<option selected value='$papersize'>" . $paperSize[$i] . "</option>\n";
1.119     bowersj2 2597:         } else {
1.326     sakharuk 2598:             $result .= "<option value='$papersize'>" . $paperSize[$i] . "</option>\n";
1.119     bowersj2 2599:         }
                   2600:         $i++;
                   2601:     }
                   2602:     $result .= "</select></td></tr></table>";
                   2603:     return $result;
1.135     bowersj2 2604: }
                   2605: 
                   2606: sub postprocess {
                   2607:     my $self = shift;
                   2608: 
                   2609:     my $var = $self->{'variable'};
1.136     bowersj2 2610:     my $helper = Apache::lonhelper->getHelper();
1.135     bowersj2 2611:     $helper->{VARS}->{$var} = 
1.373     albertel 2612:         $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
                   2613:         $env{"form.$var.paper"};
1.135     bowersj2 2614:     return 1;
1.119     bowersj2 2615: }
                   2616: 
                   2617: 1;
1.144     bowersj2 2618: 
                   2619: package Apache::lonprintout::page_size_state;
                   2620: 
                   2621: =pod
                   2622: 
                   2623: =head1 Helper element: page_size_state
                   2624: 
                   2625: See lonhelper.pm documentation for discussion of the helper framework.
                   2626: 
                   2627: Apache::lonprintout::page_size_state is an element that gives the 
                   2628: user the opportunity to further refine the page settings if they
                   2629: select a single-column page.
                   2630: 
                   2631: page_size_state is always directly invoked in lonprintout.pm, so there
                   2632: is no tag interface. You actually pass parameters to the constructor.
                   2633: 
                   2634: =over 4
                   2635: 
                   2636: =item * B<new>(varName): varName is where the print information will be stored in the format FIXME.
                   2637: 
                   2638: =back
                   2639: 
                   2640: =cut
                   2641: 
                   2642: use Apache::lonhelper;
1.373     albertel 2643: use Apache::lonnet;
1.144     bowersj2 2644: no strict;
                   2645: @ISA = ("Apache::lonhelper::element");
                   2646: use strict;
                   2647: 
                   2648: 
                   2649: 
                   2650: sub new { 
                   2651:     my $self = Apache::lonhelper::element->new();
                   2652: 
                   2653:     shift; # disturbs me (probably prevents subclassing) but works (drops
                   2654:            # package descriptor)... - Jeremy
                   2655: 
                   2656:     $self->{'variable'} = shift;
                   2657:     my $helper = Apache::lonhelper::getHelper();
                   2658:     $helper->declareVar($self->{'variable'});
                   2659: 
                   2660:     # The variable name of the format element, so we can look into 
                   2661:     # $helper->{VARS} to figure out whether the columns are one or two
                   2662:     $self->{'formatvar'} = shift;
                   2663: 
                   2664:     # The state to transition to after selection, or after discovering
                   2665:     # the cols are not set to 1
                   2666:     $self->{NEXTSTATE} = shift;
                   2667:     bless($self);
                   2668:     return $self;
                   2669: }
                   2670: 
                   2671: sub render {
                   2672:     my $self = shift;
                   2673:     my $helper = Apache::lonhelper::getHelper();
                   2674:     my $result = '';
                   2675:     my $var = $self->{'variable'};
                   2676: 
                   2677:     if (defined $self->{ERROR_MSG}) {
                   2678:         $result .= '<br /><font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br />';
                   2679:     }
                   2680: 
                   2681:     $result .= <<ELEMENTHTML;
                   2682: 
                   2683: <p>How should the column be formatted?</p>
                   2684: 
                   2685: <table cellpadding='3'>
                   2686:   <tr>
                   2687:     <td align='right'><b>Width</b>:</td>
                   2688:     <td align='left'><input type='text' name='$var.width' value='18' size='4'></td>
                   2689:     <td align='left'>
                   2690:       <select name='$var.widthunit'>
                   2691:         <option>cm</option><option>in</option>
                   2692:       </select>
                   2693:     </td>
                   2694:   </tr>
                   2695:   <tr>
                   2696:     <td align='right'><b>Height</b>:</td>
                   2697:     <td align='left'><input type='text' name="$var.height" value="25.9" size='4'></td>
                   2698:     <td align='left'>
                   2699:       <select name='$var.heightunit'>
                   2700:         <option>cm</option><option>in</option>
                   2701:       </select>
                   2702:     </td>
                   2703:   </tr>
                   2704:   <tr>
                   2705:     <td align='right'><b>Left margin</b>:</td>
                   2706:     <td align='left'><input type='text' name='$var.lmargin' value='-1.5' size='4'></td>
                   2707:     <td align='left'>
1.186     bowersj2 2708:       <select name='$var.lmarginunit'>
1.144     bowersj2 2709:         <option>cm</option><option>in</option>
                   2710:       </select>
                   2711:     </td>
                   2712:   </tr>
                   2713: </table>
                   2714: 
                   2715: <p>Hint: Some instructors like to leave scratch space for the student by
1.280     albertel 2716: making the width much smaller than the width of the page.</p>
1.144     bowersj2 2717: 
                   2718: ELEMENTHTML
                   2719: 
                   2720:     return $result;
                   2721: }
                   2722: 
                   2723: # If the user didn't select 1 column, skip this state.
                   2724: sub preprocess {
                   2725:     my $self = shift;
                   2726:     my $helper = Apache::lonhelper::getHelper();
                   2727: 
                   2728:     my $format = $helper->{VARS}->{$self->{'formatvar'}};
                   2729:     if (substr($format, 2, 1) ne '1') {
                   2730:         $helper->changeState($self->{NEXTSTATE});
                   2731:     }
                   2732:    
                   2733:     return 1;
                   2734: }
                   2735: 
                   2736: sub postprocess {
                   2737:     my $self = shift;
                   2738: 
                   2739:     my $var = $self->{'variable'};
                   2740:     my $helper = Apache::lonhelper->getHelper();
1.373     albertel 2741:     my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"}; 
                   2742:     my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"}; 
                   2743:     my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"}; 
                   2744:     $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"}; 
                   2745:     $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"}; 
                   2746:     $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"}; 
1.144     bowersj2 2747: 
                   2748:     my $error = '';
                   2749: 
                   2750:     # /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed 
                   2751:     # by an optional period, followed by digits, ending the string
                   2752: 
                   2753:     if ($width !~  /^-?[0-9]+(\.[0-9]*)?$/) {
                   2754:         $error .= "Invalid width; please type only a number.<br />\n";
                   2755:     }
                   2756:     if ($height !~  /^-?[0-9]+(\.[0-9]*)?$/) {
                   2757:         $error .= "Invalid height; please type only a number.<br />\n";
                   2758:     }
                   2759:     if ($lmargin !~  /^-?[0-9]+(\.[0-9]*)?$/) {
                   2760:         $error .= "Invalid left margin; please type only a number.<br />\n";
                   2761:     }
                   2762: 
                   2763:     if (!$error) {
                   2764:         Apache::lonhelper::getHelper()->changeState($self->{NEXTSTATE});
                   2765:         return 1;
                   2766:     } else {
                   2767:         $self->{ERROR_MSG} = $error;
                   2768:         return 0;
                   2769:     }
                   2770: }
                   2771: 
                   2772: 
1.119     bowersj2 2773: 
1.1       www      2774: __END__
1.6       sakharuk 2775: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.