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

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

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.