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

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

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.