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

1.1       www         1: # The LearningOnline Network
                      2: # Printout
                      3: #
1.85    ! sakharuk    4: # $Id: lonprintout.pm,v 1.84 2002/10/29 13:42:14 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.1       www        28: # (Internal Server Error Handler
                     29: #
                     30: # (Login Screen
                     31: # 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14,
                     32: # 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer)
                     33: #
                     34: # 3/1/1 Gerd Kortemeyer)
                     35: #
                     36: # 3/1 Gerd Kortemeyer
                     37: #
1.3       sakharuk   38: # 9/17 Alex Sakharuk
                     39: #
1.1       www        40: package Apache::lonprintout;
                     41: 
                     42: use strict;
1.10      albertel   43: use Apache::Constants qw(:common :http);
1.2       sakharuk   44: use Apache::lonxml;
                     45: use Apache::lonnet;
1.54      sakharuk   46: use Apache::loncommon;
1.13      sakharuk   47: use Apache::inputtags;
1.54      sakharuk   48: use Apache::grades;
1.13      sakharuk   49: use Apache::edit;
1.5       sakharuk   50: use Apache::File();
1.68      sakharuk   51: use Apache::lonnavmaps;
1.34      sakharuk   52: use POSIX qw(strftime);
1.60      sakharuk   53: use GDBM_File;
                     54: 
                     55: 
                     56: my %hash;
1.76      sakharuk   57: my $LaTeXwidth = 0;
1.3       sakharuk   58: 
                     59: sub headerform {
1.1       www        60:     my $r = shift;
1.3       sakharuk   61:     $r->print(<<ENDHEADER);
                     62: <html>
                     63: <head>
                     64: <title>LON-CAPA output for printing</title>
                     65: </head>
                     66: <body bgcolor="FFFFFF">
                     67: <form method="post" enctype="multipart/form-data" action="/adm/printout" name="printform">
                     68: ENDHEADER
1.62      sakharuk   69:     if ($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) { 
                     70:     $r->print(<<ENDHEADER1);
                     71: <b>Path to current document: </b><tt>$ENV{'form.postdata'}</tt><p>
                     72: ENDHEADER1
                     73: }
1.3       sakharuk   74: }
                     75: 
1.1       www        76: 
1.3       sakharuk   77: sub menu_for_output {
                     78:     my $r = shift;
1.62      sakharuk   79:     my ($title_for_single_resource,$title_for_sequence,$title_for_main_map) = &details_for_menu;
1.83      sakharuk   80:     my $assignment = $title_for_sequence;
1.60      sakharuk   81:     if ($title_for_single_resource ne '') {$title_for_single_resource = '"'.$title_for_single_resource.'"';}
                     82:     if ($title_for_sequence ne '') {$title_for_sequence = '"'.$title_for_sequence.'"';}
1.62      sakharuk   83:     if ($title_for_main_map ne '') {$title_for_main_map = '"'.$title_for_main_map.'"';}
                     84:     my $subdir_to_print = $ENV{'form.postdata'};
                     85:     $subdir_to_print =~ m/\/([^\/]+)$/;
                     86:     $subdir_to_print =~ s/$1//;
1.28      sakharuk   87:     $r->print(<<ENDMENUOUT1);
1.57      sakharuk   88: <h1>What do you want to print? Make a choice.</h1><br />
1.3       sakharuk   89: <input type="hidden" name="phase" value="two">
1.10      albertel   90: <input type="hidden" name="url" value="$ENV{'form.postdata'}">
1.83      sakharuk   91: <input type="hidden" name="assignment" value="$assignment">
1.60      sakharuk   92: <input type="radio" name="choice" value="Standard LaTeX output for current document" checked>  Current document <b>$title_for_single_resource</b>
1.65      sakharuk   93: (prints what you just saw on the screen)<br />
1.39      sakharuk   94: ENDMENUOUT1
1.48      sakharuk   95:     if ((not $ENV{'request.role'}=~m/^au\./) and (not $ENV{'request.role'}=~m/^ca\./)) {
1.52      sakharuk   96: 	$r->print(<<ENDMENUOUT2);
1.63      albertel   97: <input type="radio" name="choice" value="Standard LaTeX output for the primary sequence">  All problems from <b>$title_for_sequence</b><br />
1.71      sakharuk   98: <input type="radio" name="choice" value="Standard LaTeX output for whole primary sequence">  All problems plus any pages or html/xml files from <b>$title_for_sequence</b><br />
1.28      sakharuk   99: ENDMENUOUT2
1.44      sakharuk  100:     }
1.52      sakharuk  101:     if ($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) { 
                    102: 	$r->print(<<ENDMENUOUT6);
1.62      sakharuk  103: <input type="radio" name="choice" value="Standard LaTeX output for the top level sequence">  All problems in this course (<b>warning:</b> this may be time consuming) <br />
1.59      sakharuk  104: <br />
1.63      albertel  105: <input type="radio" name="choice" value="All class print">  All problems from <b>$title_for_sequence</b> for selected students<br /><br />
1.52      sakharuk  106: ENDMENUOUT6
                    107:     }
1.39      sakharuk  108:       my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'});
                    109:       $subdirtoprint =~ s/\/[^\/]+$//;
                    110:       if (&Apache::lonnet::allowed('bre',$subdirtoprint) eq 'F') {
                    111: 	  $r->print(<<ENDMENUOUT4);
1.62      sakharuk  112:   <input type="radio" name="choice" value="Subdirectory print">  Problems from current subdirectory <b>$subdir_to_print</b><br />
1.39      sakharuk  113: ENDMENUOUT4
                    114:       }
                    115:     $r->print(<<ENDMENUOUT5);
1.16      sakharuk  116: <br /><hr /><br />
                    117: <h1>And what page format do you prefer?</h1>
1.36      sakharuk  118: <table>
                    119:  <tr>
                    120:    <td>
                    121:      <input type="radio" name="layout" value="CBI"> Landscape <br />
                    122:      <input type="radio" name="layout" value="CAPA" checked>  Portrait <br />
                    123:    </td>
                    124:    <td>&nbsp;</td>
                    125:    <td rawspan="2">
1.44      sakharuk  126:      Number of columns: <select name="numberofcolumns">
1.59      sakharuk  127:                          <option> 1 </option>
                    128:                          <option selected> 2 </option>
1.44      sakharuk  129:                         </select> 
1.36      sakharuk  130:    </td>
1.59      sakharuk  131:    <td rawspan="2">
                    132:      Paper size (format [width x height]): <select name="papersize">
1.62      sakharuk  133:                                             <option selected> Letter [8 1/2x11 in] </option>
                    134:                                             <option> Legal [8 1/2x14 in] </option>
                    135:                                             <option> Ledger/Tabloid [11x17 in] </option>
                    136:                                             <option> Executive [7 1/2x10 in] </option>
1.59      sakharuk  137:                                             <option> A2 [420x594 mm] </option>
                    138:                                             <option> A3 [297x420 mm] </option>
                    139:                                             <option> A4 [210x297 mm] </option>
                    140:                                             <option> A5 [148x210 mm] </option>
                    141:                                             <option> A6 [105x148 mm] </option>
                    142:                                            </select> 
                    143:    </td>
1.36      sakharuk  144:  </tr>
                    145: </table>
                    146: </br> 
1.16      sakharuk  147: <input type="submit" value="Submit your choice">
1.52      sakharuk  148: ENDMENUOUT5
                    149: }
                    150: 
                    151: 
1.58      sakharuk  152: sub problem_choice_menu {
                    153:     my $r = shift;
                    154:     my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'});
                    155:     $subdirtoprint =~ s/\/[^\/]+$//;
                    156:     my @list_of_files = ();
                    157:     if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) {
                    158: 	$subdirtoprint =~ s/^[^~]*~(\w+)\//\/home\/$1\/public_html\//;
                    159:     } else {
                    160: 	$subdirtoprint =~ s/.*(\/res\/)/$1/;
                    161:     }
                    162:     my @content_directory = ();
                    163:     if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) {
                    164: 	@content_directory = &Apache::lonnet::dirlist($subdirtoprint,$ENV{'user.domain'}, $ENV{'user.name'},'');
                    165:     } else {
                    166: 	@content_directory = &Apache::lonnet::dirlist($subdirtoprint);
                    167:     }
                    168:     for (my $iy=0;$iy<=$#content_directory;$iy++) {
                    169: 	my @tempo_array = split(/&/,$content_directory[$iy]);
                    170: 	if ($tempo_array[0] =~ m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/) {
                    171: 	    push(@list_of_files,$tempo_array[0]);
                    172: 	}
                    173:     }
                    174:     $subdirtoprint =~ s/\/$//;
                    175:     for (my $i=0;$i<=$#list_of_files;$i++) {
                    176: 	$list_of_files[$i] = $subdirtoprint.'/'.$list_of_files[$i];
                    177:     }
                    178:     $r->print(<<ENDMENUOUT1);
                    179: <input type="hidden" name="url" value="$ENV{'form.url'}">
                    180: <input type="hidden" name="choice" value="$ENV{'form.choice'}">
                    181: <input type="hidden" name="layout" value="$ENV{'form.layout'}">
                    182: <input type="hidden" name="numberofcolumns" value="$ENV{'form.numberofcolumns'}">
                    183: <h1>Mark problems which you want to print</h1>
                    184: <script>
                    185:     function checkall() {
                    186: 	for (i=0; i<document.forms.printform.elements.length; i++) {
                    187:             if 
                    188:           (document.forms.printform.elements[i].name.indexOf('whattoprint')==0) {
                    189: 	      document.forms.printform.elements[i].checked=true;
                    190:             }
                    191:         }
                    192:     }
                    193: 
                    194: 
                    195:     function uncheckall() {
                    196: 	for (i=0; i<document.forms.printform.elements.length; i++) {
                    197:             if 
                    198:           (document.forms.printform.elements[i].name.indexOf('whattoprint')==0) {
                    199: 	      document.forms.printform.elements[i].checked=false;
                    200:             }
                    201:         }
                    202:     }
                    203: </script>
1.60      sakharuk  204: <input type=button onClick="checkall()" value="Check All">&nbsp;
                    205: <input type=button onClick="uncheckall()" value="Uncheck">
1.58      sakharuk  206: <p>
                    207: ENDMENUOUT1
1.82      sakharuk  208:     my $i=0;
1.58      sakharuk  209:     foreach my $file (@list_of_files) {
                    210: 	$r->print('<br /><input type=checkbox name="whattoprint'.$i.'" value="'.$file.'"> '.
                    211:                   $file);
                    212: 	$i++;
                    213:     }
                    214:     $r->print(<<ENDMENUOUT2);
                    215: <br />
                    216: <input type="hidden" name="numberofproblems" value="$i">
                    217: <input type="hidden" name="phase" value="three">
                    218: <input type="submit" value="Submit">
                    219: ENDMENUOUT2
                    220: }
                    221: 
                    222: 
1.52      sakharuk  223: sub additional_class_menu {
                    224:     my $r = shift;
                    225:     $r->print(<<ENDMENUOUT1);
                    226: <input type="hidden" name="url" value="$ENV{'form.url'}">
                    227: <input type="hidden" name="choice" value="$ENV{'form.choice'}">
                    228: <input type="hidden" name="layout" value="$ENV{'form.layout'}">
                    229: <input type="hidden" name="numberofcolumns" value="$ENV{'form.numberofcolumns'}">
1.83      sakharuk  230: <input type="hidden" name="assignment" value="$ENV{'form.assignment'}">
1.78      sakharuk  231: <h1>Select student(s) whose assignment you want to print</h1>
1.52      sakharuk  232: ENDMENUOUT1
1.57      sakharuk  233:     my %courselist=&Apache::lonnet::dump(
                    234:                    'classlist',
                    235: 		   $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
                    236: 		   $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
                    237:     my $now=time;
                    238:     $r->print(<<ENDDISHEADER);
                    239: <script>
                    240:     function checkall() {
                    241: 	for (i=0; i<document.forms.printform.elements.length; i++) {
                    242:             if 
                    243:           (document.forms.printform.elements[i].name.indexOf('whomtoprint')==0) {
                    244: 	      document.forms.printform.elements[i].checked=true;
                    245:             }
                    246:         }
                    247:     }
                    248: 
                    249:     function checksec() {
                    250: 	for (i=0; i<document.forms.printform.elements.length; i++) {
                    251:             if 
                    252:           (document.forms.printform.elements[i].value.indexOf
                    253:            (document.forms.printform.chksec.value)==0) {
                    254: 	      document.forms.printform.elements[i].checked=true;
                    255:             }
                    256:         }
                    257:     }
                    258: 
                    259:     function uncheckall() {
                    260: 	for (i=0; i<document.forms.printform.elements.length; i++) {
                    261:             if 
                    262:           (document.forms.printform.elements[i].name.indexOf('whomtoprint')==0) {
                    263: 	      document.forms.printform.elements[i].checked=false;
                    264:             }
                    265:         }
1.52      sakharuk  266:     }
1.57      sakharuk  267: </script>
1.60      sakharuk  268: <input type=button onClick="checkall()" value="Check All">&nbsp;
                    269: <input type=button onClick="checksec()" value="Check Section/Group">
1.57      sakharuk  270: <input type=text size=5 name=chksec>&nbsp;
1.60      sakharuk  271: <input type=button onClick="uncheckall()" value="Uncheck">
1.57      sakharuk  272: <p>
                    273: ENDDISHEADER
1.54      sakharuk  274:     my $i = 0;
1.57      sakharuk  275:     foreach (sort keys %courselist) {
                    276:         my ($end,$start)=split(/\:/,$courselist{$_});
                    277:         my $active=1;
                    278:         if (($end) && ($now>$end)) { $active=0; }
                    279:         if ($active) {
                    280:            my ($sname,$sdom)=split(/\:/,$_);
                    281:            my %reply=&Apache::lonnet::get('environment',
                    282:               ['firstname','middlename','lastname','generation'],
                    283:               $sdom,$sname);
                    284:            my $section=&Apache::lonnet::usection
                    285: 	       ($sdom,$sname,$ENV{'request.course.id'});
                    286:            $r->print(
                    287:         '<br /><input type=checkbox name="whomtoprint'.$i.'" value="'.$section.':'.$_.'"> '.
                    288: 		      $reply{'firstname'}.' '. 
                    289:                       $reply{'middlename'}.' '.
                    290:                       $reply{'lastname'}.' '.
                    291:                       $reply{'generation'}.
                    292:                       ' ('.$_.') '.$section);
                    293: 	   $i++;
                    294:         } 
1.52      sakharuk  295:     }
                    296:     $r->print(<<ENDMENUOUT2);
1.57      sakharuk  297: <br />
1.76      sakharuk  298: <input type="hidden" name="papersize" value="$ENV{'form.papersize'}">
1.54      sakharuk  299: <input type="hidden" name="numberofstudents" value="$i">
1.52      sakharuk  300: <input type="hidden" name="phase" value="three">
                    301: <input type="submit" value="Submit">
                    302: ENDMENUOUT2
                    303: }
                    304: 
                    305: 
                    306: sub additional_print_menu { 
                    307:     my $r = shift;
1.54      sakharuk  308:     my $what_to_print = '';
                    309:     for (my $i=0; $i<$ENV{'form.numberofstudents'};$i++) {
                    310: 	$what_to_print .= '<input type="hidden" name="whomtoprint'.$i.'" value="'.$ENV{'form.whomtoprint'.$i}.'">';
                    311:     }
1.58      sakharuk  312:     for (my $i=0; $i<$ENV{'form.numberofproblems'};$i++) {
                    313: 	$what_to_print .= '<input type="hidden" name="whattoprint'.$i.'" value="'.$ENV{'form.whattoprint'.$i}.'">';
                    314:     }
1.52      sakharuk  315:     $r->print(<<ENDMENUOUT);
1.54      sakharuk  316:     $what_to_print
1.52      sakharuk  317: <input type="hidden" name="url" value="$ENV{'form.url'}">
                    318: <input type="hidden" name="choice" value="$ENV{'form.choice'}">
                    319: <input type="hidden" name="layout" value="$ENV{'form.layout'}">
1.76      sakharuk  320: <input type="hidden" name="papersize" value="$ENV{'form.papersize'}">
1.54      sakharuk  321: <input type="hidden" name="numberofstudents" value="$ENV{'form.numberofstudents'}">
1.58      sakharuk  322: <input type="hidden" name="numberofproblems" value="$ENV{'form.numberofproblems'}">
1.52      sakharuk  323: <input type="hidden" name="numberofcolumns" value="$ENV{'form.numberofcolumns'}">
1.83      sakharuk  324: <input type="hidden" name="assignment" value="$ENV{'form.assignment'}">
1.73      sakharuk  325: Define one column layout parameters: <br />
1.57      sakharuk  326: <b>Width</b>: <input type="text" name="width" width="8" value="9cm"> <br />
                    327: <b>Height</b>: <input type="text" name="height" width="8" value="25.9cm"> <br />
                    328: <b>Left margin</b>: <input type="text" name="leftmargin" width="8" value="-0.57in"> <br />
1.52      sakharuk  329: <input type="hidden" name="phase" value="four">
                    330: <input type="submit" value="Submit">
1.3       sakharuk  331: </form>
                    332: </body>
                    333: </html>
1.52      sakharuk  334: ENDMENUOUT
1.3       sakharuk  335: }
1.2       sakharuk  336: 
                    337: 
1.3       sakharuk  338: sub output_data {
                    339:     my $r = shift;
                    340:     $r->print(<<ENDPART);
                    341: <html>
                    342: <head>
                    343: <title>LON-CAPA output for printing</title>
                    344: </head>
                    345: <body bgcolor="FFFFFF">
                    346: <hr>
                    347: ENDPART
1.2       sakharuk  348: 
1.3       sakharuk  349:     my $choice = $ENV{'form.choice'};
1.16      sakharuk  350:     my $layout = $ENV{'form.layout'};
1.74      sakharuk  351:     my $numberofcolumns = $ENV{'form.numberofcolumns'};  
                    352:     my $papersize = $ENV{'form.papersize'};          
1.16      sakharuk  353:     my $laystyle = 'book';
1.83      sakharuk  354:     my $assignment =  $ENV{'form.assignment'};
1.82      sakharuk  355:     if ($choice eq 'Subdirectory print') {
                    356: 	$layout = 'CAPA';
                    357: 	$papersize = 'Letter [8 1/2x11 in]';
                    358: 	$numberofcolumns = 2;
                    359:     }
                    360:     if (($choice eq 'Standard LaTeX output for current document') && ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./)) {
                    361: 	$layout = 'CAPA';
                    362: 	$papersize = 'Letter [8 1/2x11 in]';
                    363: 	$numberofcolumns = 1;
                    364:     }
1.2       sakharuk  365:     my $result = '';
1.71      sakharuk  366:     my $number_of_columns = 1; #used only for pages to determine the width of the cell
1.59      sakharuk  367:     my $selectionmade = '';
1.76      sakharuk  368:     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$layout,$numberofcolumns);
                    369:     my $LaTeXwidth;
1.36      sakharuk  370:  
1.76      sakharuk  371:     if ($textwidth=~/(\d+\s*cm)/) {
                    372: 	$LaTeXwidth = $1*10;
                    373:     } elsif ($textwidth=~/(\d+\s*mm)/) {
                    374: 	$LaTeXwidth = $1;
                    375:     }
1.3       sakharuk  376:     if ($choice eq 'Standard LaTeX output for current document') {
1.36      sakharuk  377:       #-- single document - problem, page, html, xml  
1.59      sakharuk  378:       $selectionmade = 1;
1.14      albertel  379:       my %moreenv;
                    380:       $moreenv{'form.grade_target'}='tex';
1.48      sakharuk  381:       if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) {
                    382: 	  $ENV{'form.url'}=~s/http:\/\/[^\/]+//;
                    383:       }
1.14      albertel  384:       $moreenv{'request.filename'}=$ENV{'form.url'};
1.76      sakharuk  385:       $moreenv{'form.textwidth'}=$LaTeXwidth;
1.14      albertel  386:       &Apache::lonnet::appenv(%moreenv);
                    387:       my $texversion=&Apache::lonnet::ssi($ENV{'form.url'});
1.79      sakharuk  388:       &Apache::lonnet::delenv('form.grade_target','form.textwidth','form.counter');
1.14      albertel  389:       $result .= $texversion;
1.40      sakharuk  390:       if ($ENV{'form.url'}=~m/\.page\s*$/) {
                    391: 	  ($result,$number_of_columns) = &page_cleanup($result);
                    392:       }
                    393:     } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or 
                    394:              $choice eq 'Standard LaTeX output for whole primary sequence') {
1.36      sakharuk  395:       #-- minimal sequence to which the current document belongs
                    396:         #-- where is the primary sequence containing file?
1.18      sakharuk  397: 	my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'});
1.74      sakharuk  398: 	my @sequence = split('___',$symbolic);
                    399: 	my $primary_sequence = '/res/'.$sequence[0];   
                    400: 	my @master_seq = &coming_from_hash($primary_sequence,$sequence[0]);
1.36      sakharuk  401:         #-- produce an output string
1.71      sakharuk  402: 	my $flag_latex_header_remove = 'NO';
                    403: 	my $flag_page_in_sequence = 'NO';
1.18      sakharuk  404: 	for (my $i=0;$i<=$#master_seq;$i++) {
1.68      sakharuk  405:             my ($urlp,$symb) = split /&&/, $master_seq[$i];		
1.20      sakharuk  406: 	    if ($choice eq 'Standard LaTeX output for the primary sequence') {
1.72      sakharuk  407:             #prints only problems
1.59      sakharuk  408: 		$selectionmade = 2;
1.61      sakharuk  409:  		if ($urlp =~ m/\.(problem|exam|quiz|assess|survey|form|library)/) {
1.20      sakharuk  410: 		    my %moreenv;
                    411: 		    $moreenv{'form.grade_target'}='tex';
1.76      sakharuk  412: 		    $moreenv{'form.textwidth'}=$LaTeXwidth;
1.20      sakharuk  413: 		    &Apache::lonnet::appenv(%moreenv);
1.74      sakharuk  414: 		    &Apache::lonnet::logthis("Trying to get $urlp with symb $symb");
1.68      sakharuk  415: 		    my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
1.76      sakharuk  416: 		    &Apache::lonnet::delenv('form.grade_target','form.textwidth');
1.71      sakharuk  417: 		    if ($flag_latex_header_remove ne 'NO') {
                    418: 			$texversion = &latex_header_footer_remove($texversion);
                    419: 		    } else {
                    420: 			$texversion =~ s/\\end{document}//;
                    421: 		    }
1.20      sakharuk  422: 		    $result .= $texversion;        
1.71      sakharuk  423: 		    $flag_latex_header_remove = 'YES';
1.20      sakharuk  424: 		}
1.53      albertel  425: 	    } elsif ($urlp =~ /\S+/) {
1.72      sakharuk  426:               #prints problems, pages and any html/xml files
1.59      sakharuk  427: 		$selectionmade = 3;
1.36      sakharuk  428: 		my %moreenv;
1.18      sakharuk  429: 		$moreenv{'form.grade_target'}='tex';
                    430: 		&Apache::lonnet::appenv(%moreenv);
1.69      sakharuk  431: 		my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
1.18      sakharuk  432: 		&Apache::lonnet::delenv('form.grade_target');
1.71      sakharuk  433: 		if ($urlp =~ m/\.page/) {
                    434: 		    ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
                    435: 		    if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
                    436: 		    $texversion =~ s/\\end{document}\d*/\\end{document}/;
                    437: 		    $flag_page_in_sequence = 'YES';
                    438: 		} 
                    439: 		if ($flag_latex_header_remove ne 'NO') {
                    440: 		    $texversion = &latex_header_footer_remove($texversion);
                    441: 		} else {
                    442: 		    $texversion =~ s/\\end{document}//;
                    443: 		}
                    444: 		$result .= $texversion;         
                    445: 		$flag_latex_header_remove = 'YES';   
1.16      sakharuk  446: 	    }
1.77      sakharuk  447: 	}
                    448: 	&Apache::lonnet::delenv('form.counter');
1.71      sakharuk  449: 	if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;}	
                    450: 	$result .= '\end{document}';
1.13      sakharuk  451:     }  elsif ($choice eq 'Standard LaTeX output for the top level sequence') {
1.47      sakharuk  452:         # where is the main sequence of the course?
1.59      sakharuk  453: 	$selectionmade = 4;
1.13      sakharuk  454: 	my $main_seq = '/res/'.$ENV{'request.course.uri'};
1.74      sakharuk  455: 	my @file_seq = &coming_from_hash_whole($main_seq);
1.72      sakharuk  456: 	my $flag_latex_header_remove = 'NO';
1.52      sakharuk  457:         #-- produce an output string
1.49      sakharuk  458: 	for (my $i=0;$i<=$#file_seq;$i++) {
1.69      sakharuk  459:             my ($urlp,$symb) = split /&&/, $file_seq[$i];
1.49      sakharuk  460: 	    $urlp=~s/\/home\/httpd\/html//;	    
                    461:             if ($urlp=~m/\.(problem|exam|quiz|assess|survey|form|library)/) {
                    462: 		my %moreenv;
                    463: 		$moreenv{'form.grade_target'}='tex';
1.76      sakharuk  464: 		$moreenv{'form.textwidth'}=$LaTeXwidth;
1.49      sakharuk  465: 		&Apache::lonnet::appenv(%moreenv);
1.74      sakharuk  466: 		my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
1.76      sakharuk  467: 		&Apache::lonnet::delenv('form.grade_target','form.textwidth');		    
1.72      sakharuk  468: 		if ($flag_latex_header_remove ne 'NO') {
                    469: 		    $texversion = &latex_header_footer_remove($texversion);
                    470: 		} else {
                    471: 		    $texversion =~ s/\\end{document}//;
                    472: 		}
1.74      sakharuk  473: 		$result .= $texversion;  
                    474: 		$flag_latex_header_remove = 'YES';
1.72      sakharuk  475: 	    }		
1.49      sakharuk  476: 	}	    
1.72      sakharuk  477: 	$result .= '\end{document}';
1.52      sakharuk  478:     } elsif ($choice eq 'All class print') { 
1.54      sakharuk  479:     #-- prints assignments for whole class or for selected students  
1.59      sakharuk  480: 	$selectionmade = 5;
1.73      sakharuk  481:         my @students = ();
1.54      sakharuk  482: 	for (my $i=0; $i<$ENV{'form.numberofstudents'};$i++) {
                    483: 	    if ($ENV{'form.whomtoprint'.$i}=~/:/) {
                    484: 		push @students,$ENV{'form.whomtoprint'.$i};
                    485: 	    }
                    486: 	}
                    487: 	#where is the primary sequence containing current resource (the same for all students)?
                    488: 	my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'});
1.74      sakharuk  489: 	my @sequence = split('___',$symbolic);
                    490: 	my $primary_sequence = '/res/'.$sequence[0]; 	
1.75      sakharuk  491: 	my @master_seq = &coming_from_hash($primary_sequence,$sequence[0]); 
1.72      sakharuk  492:         #loop over students
1.80      sakharuk  493: 	my $flag_latex_header_remove = 'NO'; 
                    494: 	my %moreenv;
                    495: 	$moreenv{'form.textwidth'}=$LaTeXwidth;
                    496: 	&Apache::lonnet::appenv(%moreenv);
1.54      sakharuk  497: 	foreach my $person (@students) {
                    498: 	    my $current_output = ''; 
1.57      sakharuk  499: 	    my ($usersection,$username,$userdomain) = split /:/,$person;
1.54      sakharuk  500: 	    my $fullname = &Apache::grades::get_fullname($username,$userdomain);
1.72      sakharuk  501:             #goes through all resources, checks if they are available for current student, and produces output   
1.69      sakharuk  502: 	    foreach my $curresline (@master_seq)  {
                    503: 		my ($curres,$symb) = split /&&/, $curresline;
1.73      sakharuk  504:                 if ($curres=~ m/\.(problem|exam|quiz|assess|survey|form|library)/) {
1.54      sakharuk  505: 		    my ($map,$id,$res_url) = split(/___/,$symb);
                    506: 		    if (&Apache::lonnet::allowed('bre',$res_url)) {
                    507: 			my $rendered = &Apache::loncommon::get_student_view($symb,$username,$userdomain,
                    508:                                                                         $ENV{'request.course.id'},'tex');
1.73      sakharuk  509: 			if ($flag_latex_header_remove eq 'YES') {
1.72      sakharuk  510: 			    $rendered = &latex_header_footer_remove($rendered);
                    511: 			} else {
                    512: 			    $rendered =~ s/\\end{document}//;
                    513: 			}
1.54      sakharuk  514: 			$current_output .= $rendered;
                    515: 		    }
1.73      sakharuk  516: 		    $flag_latex_header_remove = 'YES';
1.54      sakharuk  517: 		}
1.72      sakharuk  518: 	    }
                    519: 	    if ($current_output=~/\\documentclass/) {
1.84      sakharuk  520: 		my $courseidinfo = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
1.85    ! sakharuk  521: 		$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm}\\setlength{\\headheight}{1cm}\\setlength{\\headsep}{0.5cm}\\pagestyle{myheadings}\\markboth{}{{\\textbf{$fullname} $courseidinfo  - $assignment}}\\begin{document} /;
1.72      sakharuk  522: 	    } else {
                    523: 		$current_output = '\\vskip 3mm\noindent\parbox{\minipagewidth}{\noindent\fbox{\textbf{'.$fullname.'}}\hskip 1.4in } \vskip 5 mm '.$current_output;
1.54      sakharuk  524: 	    }
                    525: 	    $result .= $current_output;
1.80      sakharuk  526: 	    &Apache::lonnet::delenv('form.counter');
1.54      sakharuk  527: 	}
1.80      sakharuk  528: 	$result .= '\end{document}';
                    529: 	&Apache::lonnet::delenv('form.textwidth');
1.31      sakharuk  530:     } elsif ($choice eq 'Subdirectory print') {      
1.58      sakharuk  531:     #prints selected problems from the subdirectory 
1.59      sakharuk  532: 	$selectionmade = 6;
1.58      sakharuk  533:         my @list_of_files = ();
                    534: 	for (my $i=0; $i<$ENV{'form.numberofproblems'};$i++) {
                    535: 	    if ($ENV{'form.whattoprint'.$i}=~/^\//) {
                    536: 		push @list_of_files,$ENV{'form.whattoprint'.$i};
1.28      sakharuk  537: 	    }
1.72      sakharuk  538: 	}	
                    539: 	my $flag_latex_header_remove = 'NO';  
1.31      sakharuk  540: 	for (my $i=0;$i<=$#list_of_files;$i++) {
1.58      sakharuk  541: 	    my $urlp = $list_of_files[$i];
                    542: 	    if ($urlp=~/\//) {
                    543: 		my %moreenv;
                    544: 		$moreenv{'form.grade_target'}='tex';
1.76      sakharuk  545: 		$moreenv{'form.textwidth'}=$LaTeXwidth;
1.58      sakharuk  546: 		&Apache::lonnet::appenv(%moreenv);
                    547: 		if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) { 
                    548: 		    $urlp =~ s/\/home\/([^\/]*)\/public_html/\/~$1/; 
                    549: 		}
                    550: 		my $texversion=&Apache::lonnet::ssi($urlp);
1.76      sakharuk  551: 		&Apache::lonnet::delenv('form.grade_target','form.textwidth');
1.83      sakharuk  552:                 #this chunck is responsible for printing the path to problem
                    553: 		my $newurlp = '';
                    554: 		my $HowMany = length($urlp)*2;
                    555: 		if ($HowMany > $LaTeXwidth) {
                    556: 		    my @temporrary = split '/',$urlp;
                    557: 		    my $HowManyNew = 0;
                    558: 		    for (my $ii=0;$ii<=$#temporrary;$ii++) {
                    559: 			if ($temporrary[$ii] ne '') {
                    560: 			    $HowManyNew += length($temporrary[$ii])*2;
                    561: 			    if ($HowManyNew < $LaTeXwidth ) {
                    562: 				$newurlp .=  '/'.$temporrary[$ii];
                    563: 			    } else {
                    564: 				$HowManyNew = 0;
                    565: 				$newurlp .=  '|\vskip -1 mm \noindent \verb|';
                    566: 				$ii--;
                    567: 			    }
                    568: 			}
                    569: 		    }
                    570: 		}
                    571: 		$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 {\\small\\noindent\\verb|$newurlp\|\\vskip 0 mm}/;
1.72      sakharuk  572: 		if ($flag_latex_header_remove ne 'NO') {
                    573: 		    $texversion = &latex_header_footer_remove($texversion);
                    574: 		} else {
                    575: 		    $texversion =~ s/\\end{document}//;
                    576: 		}
1.58      sakharuk  577: 		$result .= $texversion;
1.72      sakharuk  578: 	    }
                    579: 	    $flag_latex_header_remove = 'YES';  
1.31      sakharuk  580: 	}
1.72      sakharuk  581: 	$result .= '\end{document}';      	
1.7       sakharuk  582:     }
1.74      sakharuk  583: #-------------------------------------------------------- corrections for the different page formats
1.83      sakharuk  584:     $result = &page_format_transformation($papersize,$layout,$numberofcolumns,$choice,$result,$assignment);
1.76      sakharuk  585:     if ($layout eq 'CBI') {
1.16      sakharuk  586:         $laystyle = 'album';
                    587:     }
1.76      sakharuk  588:     $result = &latex_corrections($number_of_columns,$result);
1.52      sakharuk  589:     #changes page's parameters for the one column output 
                    590:     if ($ENV{'form.numberofcolumns'} == 1) {
                    591: 	$result =~ s/\\textwidth= 9cm/\\textwidth= $ENV{'form.width'}/;
1.59      sakharuk  592: 	$result =~ s/\\textheight 25\.9cm/\\textheight $ENV{'form.height'}/;
                    593: 	$result =~ s/\\evensidemargin = -0\.57in/\\evensidemargin= $ENV{'form.leftmargin'}/;
                    594: 	$result =~ s/\\oddsidemargin = -0\.57in/\\oddsidemargin= $ENV{'form.leftmargin'}/;
1.52      sakharuk  595:     }
1.7       sakharuk  596: #-- writing .tex file in prtspool 
1.16      sakharuk  597:     my $temp_file;
1.33      sakharuk  598:     my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex";
1.16      sakharuk  599:     unless ($temp_file = Apache::File->new('>'.$filename)) {
                    600: 	$r->log_error("Couldn't open $filename for output $!");
                    601: 	return SERVER_ERROR; 
                    602:     } 
                    603:     print $temp_file $result;
1.3       sakharuk  604: $r->print(<<FINALEND);
1.59      sakharuk  605: <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$filename&$laystyle&$numberofcolumns&$selectionmade">
1.3       sakharuk  606: </body>
                    607: </html>
                    608: FINALEND
                    609: }
1.61      sakharuk  610: 
                    611: 
1.73      sakharuk  612: sub coming_from_hash_whole {
                    613: 
                    614:     my $mainsequence = shift;
                    615:     my @resourcelist = ();
                    616:     my $mapid = $hash{'map_pc_'.$mainsequence};
                    617:     my $mapstart = $hash{'map_start_'.$mainsequence};
                    618:     my $mapfinish = $hash{'map_finish_'.$mainsequence};
                    619:     my $current_resource = $mapstart;
                    620:     while ($current_resource ne $mapfinish) {
                    621: 	if ($hash{'src_'.$current_resource}=~/\.sequence$/) {
1.74      sakharuk  622: 	    push @resourcelist,&coming_from_hash_whole($hash{'src_'.$current_resource});
1.73      sakharuk  623: 	} else {
1.74      sakharuk  624:             $mainsequence =~ /\/res\/(.*)$/;
                    625: 	    my $presymb = $1;
                    626: 	    my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
                    627:             if ($rid=~/,/) {
                    628: 		my @rid = split /,/, $rid;
                    629: 		foreach my $rid_element (@rid) {
                    630: 		    if ($rid_element =~ m/^$mapid\.(\d*)/) {
                    631: 			$rid = $1; 
                    632: 			last;
                    633: 		    }
                    634: 		}
                    635: 	    } else {
                    636: 		$rid =~ m/^$mapid\.(\d*)/;
                    637:                 $rid = $1;  
                    638: 	    }
                    639: 	    $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
                    640: 	    my $symb = $presymb.'___'.$rid.'___'.$1;	    
                    641: 	    push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
1.73      sakharuk  642: 	}
1.74      sakharuk  643: 	$current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}};
1.73      sakharuk  644:     }
                    645:     return @resourcelist;
                    646: }
                    647: 
                    648: 
1.61      sakharuk  649: sub coming_from_hash {
                    650: 
1.73      sakharuk  651:     my ($mainsequence,$symb) = @_;
1.61      sakharuk  652:     my @resourcelist = ();
1.68      sakharuk  653:     my $mapid = $hash{'map_pc_'.$mainsequence};
1.61      sakharuk  654:     my $mapstart = $hash{'map_start_'.$mainsequence};
                    655:     my $mapfinish = $hash{'map_finish_'.$mainsequence};
1.70      albertel  656:     my ($presymb) = split(/___/,$symb);
                    657:     $presymb = $presymb.'___';
1.61      sakharuk  658:     my $current_resource = $mapstart;
                    659:     while ($current_resource ne $mapfinish) {
                    660: 	if (not $hash{'src_'.$current_resource}=~/\.sequence$/) {
1.68      sakharuk  661: 	    my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
                    662:             if ($rid=~/,/) {
                    663: 		my @rid = split /,/, $rid;
                    664: 		foreach my $rid_element (@rid) {
                    665: 		    if ($rid_element =~ m/^$mapid\.(\d*)/) {
                    666: 			$rid = $1; 
                    667: 			last;
                    668: 		    }
                    669: 		}
                    670: 	    } else {
                    671: 		$rid =~ m/^$mapid\.(\d*)/;
                    672:                 $rid = $1;  
                    673: 	    }
                    674: 	    $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
                    675: 	    $symb = $presymb.$rid.'___'.$1;
                    676: 	    push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
1.61      sakharuk  677: 	} else {
                    678: 	    push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource});
                    679: 	}
                    680: 	$current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}};
                    681:     }
1.68      sakharuk  682:     #needs if final resource in the map (type="finish") contains something
1.65      sakharuk  683:     if (not $hash{'src_'.$current_resource}=~/\.sequence$/) {
1.68      sakharuk  684: 		    my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
                    685:             if ($rid=~/,/) {
                    686: 		my @rid = split /,/, $rid;
                    687: 		foreach my $rid_element (@rid) {
                    688: 		    if ($rid_element =~ m/^$mapid\.(\d*)/) {
                    689: 			$rid = $1; 
                    690: 			last;
                    691: 		    }
                    692: 		}
                    693: 	    } else {
                    694: 		$rid =~ m/^$mapid\.(\d*)/;
                    695:                 $rid = $1;  
                    696: 	    }
                    697: 	    $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
                    698: 	    $symb = $presymb.$rid.'___'.$1;
                    699: 	push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
1.65      sakharuk  700:     } else {
                    701: 	push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource});
                    702:     }
1.61      sakharuk  703:     return @resourcelist;
                    704: }
                    705: 
1.2       sakharuk  706: 
1.71      sakharuk  707: sub latex_header_footer_remove {
                    708:     my $text = shift;
                    709:     $text =~ s/\\end{document}//;
                    710:     $text =~ s/\\documentclass([^&]*)\\begin{document}//;
                    711:     return $text;
                    712: }
                    713: 
                    714: 
1.37      sakharuk  715: sub character_chart {
                    716:     my $result = shift;	
1.41      sakharuk  717:     $result =~ s/&#0?0?7;//g;
1.40      sakharuk  718:     $result =~ s/&#0?0?9;//g;
                    719:     $result =~ s/&#0?10;//g;
                    720:     $result =~ s/&#0?13;//g;
                    721:     $result =~ s/&#0?32;/ /g;
                    722:     $result =~ s/&#0?33;/!/g;
                    723:     $result =~ s/&#0?34;/"/g;
1.76      sakharuk  724:     $result =~ s/&quot;/"/g;   #"
1.40      sakharuk  725:     $result =~ s/&#0?35;/\\#/g;
                    726: #    $result =~ s/&#0?36;/\\\$/g;
                    727:     $result =~ s/&#0?37;/\\%/g; 
                    728:     $result =~ s/&#0?38;/\\&/g; 
1.37      sakharuk  729:     $result =~ s/&amp;/\\&/g;
1.40      sakharuk  730:     $result =~ s/&#0?39;/'/g;
                    731:     $result =~ s/&#0?40;/(/g;
                    732:     $result =~ s/&#0?41;/)/g;
                    733:     $result =~ s/&#0?42;/\*/g;
                    734:     $result =~ s/&#0?43;/\+/g;
                    735:     $result =~ s/&#0?44;/,/g;
                    736:     $result =~ s/&#0?45;/-/g;
                    737:     $result =~ s/&#0?46;/\./g;
                    738:     $result =~ s/&#0?47;/\//g;
                    739:     $result =~ s/&#0?48;/0/g;
                    740:     $result =~ s/&#0?49;/1/g;
                    741:     $result =~ s/&#0?50;/2/g;
                    742:     $result =~ s/&#0?51;/3/g;
                    743:     $result =~ s/&#0?52;/4/g;
                    744:     $result =~ s/&#0?53;/5/g;
                    745:     $result =~ s/&#0?54;/6/g;
                    746:     $result =~ s/&#0?55;/7/g;
                    747:     $result =~ s/&#0?56;/8/g;
                    748:     $result =~ s/&#0?57;/9/g;
                    749:     $result =~ s/&#0?58;/:/g;
                    750:     $result =~ s/&#0?59;/;/g;
                    751:     $result =~ s/&#0?60;/\$<\$/g;
1.37      sakharuk  752:     $result =~ s/&lt;/\$<\$/g;
1.40      sakharuk  753:     $result =~ s/&#0?61;/\$=\$/g;
                    754:     $result =~ s/&#0?62;/\$>\$/g;
1.37      sakharuk  755:     $result =~ s/&gt;/\$>\$/g;
1.40      sakharuk  756:     $result =~ s/&#0?63;/?/g;
                    757: #    $result =~ s/&#0?64;//g;
                    758:     $result =~ s/&#0?65;/A/g;
                    759:     $result =~ s/&#0?66;/B/g;
                    760:     $result =~ s/&#0?67;/C/g;
                    761:     $result =~ s/&#0?68;/D/g;
                    762:     $result =~ s/&#0?69;/E/g;
                    763:     $result =~ s/&#0?70;/F/g;
                    764:     $result =~ s/&#0?71;/G/g;
                    765:     $result =~ s/&#0?72;/H/g;
                    766:     $result =~ s/&#0?73;/I/g;
                    767:     $result =~ s/&#0?74;/J/g;
                    768:     $result =~ s/&#0?75;/K/g;
                    769:     $result =~ s/&#0?76;/L/g;
                    770:     $result =~ s/&#0?77;/M/g;
                    771:     $result =~ s/&#0?78;/N/g;
                    772:     $result =~ s/&#0?79;/O/g;
                    773:     $result =~ s/&#0?80;/P/g;
                    774:     $result =~ s/&#0?81;/Q/g;
                    775:     $result =~ s/&#0?82;/R/g;
                    776:     $result =~ s/&#0?83;/S/g;
                    777:     $result =~ s/&#0?84;/T/g;
                    778:     $result =~ s/&#0?85;/U/g;
                    779:     $result =~ s/&#0?86;/V/g;
                    780:     $result =~ s/&#0?87;/W/g;
                    781:     $result =~ s/&#0?88;/X/g;
                    782:     $result =~ s/&#0?89;/Y/g;
                    783:     $result =~ s/&#0?90;/Z/g;
                    784:     $result =~ s/&#0?91;/[/g;
                    785:     $result =~ s/&#0?92;/\\/g;
                    786:     $result =~ s/&#0?93;/]/g;
                    787: #    $result =~ s/&#0?94;//g;
                    788: #    $result =~ s/&#0?95;//g;
                    789:     $result =~ s/&#0?96;/`/g;
                    790:     $result =~ s/&#0?97;/a/g;
                    791:     $result =~ s/&#0?98;/b/g;
                    792:     $result =~ s/&#0?99;/c/g;
1.37      sakharuk  793:     $result =~ s/&#100;/d/g;
                    794:     $result =~ s/&#101;/e/g;
                    795:     $result =~ s/&#102;/f/g;
                    796:     $result =~ s/&#103;/g/g;
                    797:     $result =~ s/&#104;/h/g;
                    798:     $result =~ s/&#105;/i/g;
                    799:     $result =~ s/&#106;/j/g;
                    800:     $result =~ s/&#107;/k/g;
                    801:     $result =~ s/&#108;/l/g;
                    802:     $result =~ s/&#109;/m/g;
                    803:     $result =~ s/&#110;/n/g;
                    804:     $result =~ s/&#111;/o/g;
                    805:     $result =~ s/&#112;/p/g;
                    806:     $result =~ s/&#113;/q/g;
                    807:     $result =~ s/&#114;/r/g;
                    808:     $result =~ s/&#115;/s/g;
                    809:     $result =~ s/&#116;/t/g;
                    810:     $result =~ s/&#117;/u/g;
                    811:     $result =~ s/&#118;/v/g;
                    812:     $result =~ s/&#119;/w/g;
                    813:     $result =~ s/&#120;/x/g;
                    814:     $result =~ s/&#121;/y/g;
                    815:     $result =~ s/&#122;/z/g;
                    816:     $result =~ s/&#123;/\\{/g;
                    817:     $result =~ s/&#124;/\|/g;
                    818:     $result =~ s/&#125;/\\}/g;
                    819:     $result =~ s/&#126;/\~/g;
                    820:     $result =~ s/&#130;/,/g;
                    821: #    $result =~ s/&#131;//g;
                    822:     $result =~ s/&#132;/''/g;
                    823:     $result =~ s/&#133;/\$\\ldots\$/g;
                    824:     $result =~ s/&#134;/\$\\dagger\$/g;
                    825:     $result =~ s/&#135;/\$\\ddagger\$/g;
                    826: #    $result =~ s/&#136;//g;
                    827: #    $result =~ s/&#137;//g;
                    828: #    $result =~ s/&#138;//g;
                    829:     $result =~ s/&#139;/\$<\$/g;
                    830: #    $result =~ s/&#140;//g;
                    831:     $result =~ s/&#145;/`/g;
                    832:     $result =~ s/&#146;/'/g;
                    833:     $result =~ s/&#147;/``/g;
                    834:     $result =~ s/&#148;/''/g;
                    835:     $result =~ s/&#149;/\$\\bullet\$/g;
                    836: #    $result =~ s/&#150;//g;
                    837: #    $result =~ s/&#151;//g;
                    838:     $result =~ s/&#152;/~/g;
                    839: #    $result =~ s/&#153;//g;
                    840: #    $result =~ s/&#154;//g;
                    841:     $result =~ s/&#155;/\$>\$/g;
                    842:     $result =~ s/&#156;/\\{\\oe\\}/g;
                    843:     $result =~ s/&#159;/\\"\\{Y\\}/g;
                    844:     $result =~ s/&#160;//g;
                    845:     $result =~ s/&nbsp;//g;
                    846:     $result =~ s/&#161;/!`/g;
                    847:     $result =~ s/&iexcl;/!`/g; #`
                    848: #    $result =~ s/&#162;//g;
                    849: #    $result =~ s/&cent;//g;
                    850:     $result =~ s/&#163;/\\pounds/g; 
                    851:     $result =~ s/&pound;/\\pounds/g;
                    852: #    $result =~ s/&#164;//g;
                    853: #    $result =~ s/&curren;//g;
                    854: #    $result =~ s/&#165;//g;
                    855: #    $result =~ s/&yen;//g;
                    856: #    $result =~ s/&#166;//g;
                    857: #    $result =~ s/&brvbar;//g;
                    858: #    $result =~ s/&#167;//g;
                    859: #    $result =~ s/&sect;//g;
                    860: #    $result =~ s/&#168;//g;
                    861: #    $result =~ s/&uml;//g;
                    862:     $result =~ s/&#169;/\\copyright/g;
                    863:     $result =~ s/&copy;/\\copyright/g;
                    864: #    $result =~ s/&#170;//g;
                    865: #    $result =~ s/&ordf;//g;
                    866: #    $result =~ s/&#171;//g;
                    867: #    $result =~ s/&laquo;//g;
                    868:     $result =~ s/&#172;/\$\\neg\$/g;
                    869:     $result =~ s/&not;/\$\\neg\$/g;
                    870: #    $result =~ s/&#173;//g;
                    871: #    $result =~ s/&shy;//g;
                    872: #    $result =~ s/&#174;//g;
                    873: #    $result =~ s/&reg;//g;
                    874: #    $result =~ s/&#175;//g;
                    875: #    $result =~ s/&macr;//g;
1.42      sakharuk  876:     $result =~ s/&#176;/\$^{\\circ}\$/g;
                    877:     $result =~ s/&deg;/\$^{\\circ}\$/g;
1.37      sakharuk  878:     $result =~ s/&#177;/\$\\pm\$/g;
                    879:     $result =~ s/&plusmn;/\$\\pm\$/g;
                    880:     $result =~ s/&#178;/\$^2\$/g;
                    881:     $result =~ s/&sup2;/\$^2\$/g;
                    882:     $result =~ s/&#179;/\$^3\$/g;
                    883:     $result =~ s/&sup3;/\$^3\$/g;
                    884: #    $result =~ s/&#180;//g;
                    885: #    $result =~ s/&acute;//g;
                    886:     $result =~ s/&#181;/\$\\mu\$/g;
                    887:     $result =~ s/&micro;/\$\\mu\$/g;
                    888:     $result =~ s/&#182;/\\P/g;
                    889:     $result =~ s/&para;/\\P/g;
                    890:     $result =~ s/&#183;/\$\\cdot\$/g;
                    891:     $result =~ s/&middot;/\$\\cdot\$/g;
                    892: #    $result =~ s/&#184;//g;
                    893: #    $result =~ s/&cedil;//g;
                    894:     $result =~ s/&#185;/\$^1\$/g;
                    895:     $result =~ s/&sup1;/\$^1\$/g;
                    896: #    $result =~ s/&#186;//g;
                    897: #    $result =~ s/&ordm;//g;
                    898: #    $result =~ s/&#187;//g;
                    899: #    $result =~ s/&raquo;//g;
                    900: #    $result =~ s/&#188;//g;
                    901: #    $result =~ s/&frac14;//g;
                    902: #    $result =~ s/&#189;//g;
                    903: #    $result =~ s/&frac12;//g;
                    904: #    $result =~ s/&#190;//g;
                    905: #    $result =~ s/&frac34;//g;
1.76      sakharuk  906:     $result =~ s/&#191;/?`/g;   
                    907:     $result =~ s/&iquest;/?`/g;      #`
                    908:     $result =~ s/&#192;/\\`{A}/g; 
                    909:     $result =~ s/&Agrave;/\\`{A}/g;  #` 
1.37      sakharuk  910:     $result =~ s/&#193;/\\'{A}/g; 
1.76      sakharuk  911:     $result =~ s/&Aacute;/\\'{A}/g;  #'
1.37      sakharuk  912:     $result =~ s/&#194;/\\^{A}/g;
                    913:     $result =~ s/&Acirc;/\\^{A}/g;
                    914:     $result =~ s/&#195;/\\~{A}/g;
                    915:     $result =~ s/&Atilde;/\\~{A}/g;
                    916:     $result =~ s/&#196;/\\"{A}/g; 
1.76      sakharuk  917:     $result =~ s/&Auml;/\\"{A}/g;    #"
1.37      sakharuk  918:     $result =~ s/&#197;/{\\AA}/g;
                    919:     $result =~ s/&Aring;/{\\AA}/g;
                    920:     $result =~ s/&#198;/{\\AE}/g;
                    921:     $result =~ s/&AElig;/{\\AE}/g;
                    922: #    $result =~ s/&#199;//g;
                    923: #    $result =~ s/&Ccedil;//g;
1.76      sakharuk  924:     $result =~ s/&#200;/\\`{E}/g;  
                    925:     $result =~ s/&Egrave;/\\`{E}/g;  #`
                    926:     $result =~ s/&#201;/\\'{E}/g;    #'
                    927:     $result =~ s/&Eacute;/\\'{E}/g;  #'
1.37      sakharuk  928:     $result =~ s/&#202;/\\^{E}/g;
                    929:     $result =~ s/&Ecirc;/\\^{E}/g;
                    930:     $result =~ s/&#203;/\\`{E}/g;
1.76      sakharuk  931:     $result =~ s/&Euml;/\\`{E}/g;    #`
1.37      sakharuk  932:     $result =~ s/&#204;/\\`{I}/g;
1.76      sakharuk  933:     $result =~ s/&Igrave;/\\`{I}/g;  #`
                    934:     $result =~ s/&#205;/\\'{I}/g;    
                    935:     $result =~ s/&Iacute;/\\'{I}/g;  #'
1.37      sakharuk  936:     $result =~ s/&#206;/\\^{I}/g;
                    937:     $result =~ s/&Icirc;/\\^{I}/g;
1.76      sakharuk  938:     $result =~ s/&#207;/\\"{I}/g;    
                    939:     $result =~ s/&Iuml;/\\"{I}/g;    #"
1.37      sakharuk  940: #    $result =~ s/&#208;//g;
                    941: #    $result =~ s/&ETH;//g;
                    942:     $result =~ s/&#209;/\\~{N}/g;
                    943:     $result =~ s/&Ntilde;/\\~{N}/g;
                    944:     $result =~ s/&#210;/\\`{O}/g;
1.76      sakharuk  945:     $result =~ s/&Ograve;/\\`{O}/g;  #`
1.37      sakharuk  946:     $result =~ s/&#211;/\\'{O}/g;
1.76      sakharuk  947:     $result =~ s/&Oacute;/\\'{O}/g;  #'
1.37      sakharuk  948:     $result =~ s/&#212;/\\^{O}/g;
                    949:     $result =~ s/&Ocirc;/\\^{O}/g;
                    950:     $result =~ s/&#213;/\\~{O}/g;
                    951:     $result =~ s/&Otilde;/\\~{O}/g;
1.76      sakharuk  952:     $result =~ s/&#214;/\\"{O}/g;    
                    953:     $result =~ s/&Ouml;/\\"{O}/g;    #"
1.37      sakharuk  954:     $result =~ s/&#215;/\$\\times\$/g;
                    955:     $result =~ s/&times;/\$\\times\$/g;
                    956:     $result =~ s/&#216;/{\\O}/g;
                    957:     $result =~ s/&Oslash;/{\\O}/g;
1.76      sakharuk  958:     $result =~ s/&#217;/\\`{U}/g;    
                    959:     $result =~ s/&Ugrave;/\\`{U}/g;  #`
                    960:     $result =~ s/&#218;/\\'{U}/g;    #'
                    961:     $result =~ s/&Uacute;/\\'{U}/g;  #'
1.37      sakharuk  962:     $result =~ s/&#219;/\\^{U}/g;
                    963:     $result =~ s/&Ucirc;/\\^{U}/g;
1.76      sakharuk  964:     $result =~ s/&#220;/\\"{U}/g;    #"
                    965:     $result =~ s/&Uuml;/\\"{U}/g;    #"
1.37      sakharuk  966:     $result =~ s/&#221;/\\'{Y}/g;
1.76      sakharuk  967:     $result =~ s/&Yacute;/\\'{Y}/g;  #'
1.37      sakharuk  968: #    $result =~ s/&#222;//g;
                    969: #    $result =~ s/&THORN;//g;
                    970: #    $result =~ s/&#223;//g;
                    971: #    $result =~ s/&szlig;//g;
                    972:     $result =~ s/&#224;/\\`{a}/g;
1.76      sakharuk  973:     $result =~ s/&agrave;/\\`{a}/g;  #`
1.37      sakharuk  974:     $result =~ s/&#225;/\\'{a}/g;
1.76      sakharuk  975:     $result =~ s/&aacute;/\\'{a}/g;  #'
1.37      sakharuk  976:     $result =~ s/&#226;/\\^{a}/g;
                    977:     $result =~ s/&acirc;/\\^{a}/g;
                    978:     $result =~ s/&#227;/\\~{a}/g;
                    979:     $result =~ s/&atilde;/\\~{a}/g;
                    980:     $result =~ s/&#228;/\\"{a}/g;
1.76      sakharuk  981:     $result =~ s/&auml;/\\"{a}/g;    #"
1.37      sakharuk  982:     $result =~ s/&#229;/{\\aa}/g;
                    983:     $result =~ s/&aring;/{\\aa}/g;
                    984:     $result =~ s/&#230;/{\\ae}/g;
                    985:     $result =~ s/&aelig;/{\\ae}/g;
                    986: #    $result =~ s/&#231;//g;
                    987: #    $result =~ s/&ccedil;//g;
                    988:     $result =~ s/&#232;/\\`{e}/g;
1.76      sakharuk  989:     $result =~ s/&egrave;/\\`{e}/g;  #`
1.37      sakharuk  990:     $result =~ s/&#233;/\\'{e}/g;
1.76      sakharuk  991:     $result =~ s/&eacute;/\\'{e}/g;  #'
1.37      sakharuk  992:     $result =~ s/&#234;/\\^{e}/g;
                    993:     $result =~ s/&ecirc;/\\^{e}/g;
                    994:     $result =~ s/&#235;/\\"{e}/g;
1.76      sakharuk  995:     $result =~ s/&euml;/\\"{e}/g;    #"
1.37      sakharuk  996:     $result =~ s/&#236;/\\`{i}/g;
1.76      sakharuk  997:     $result =~ s/&igrave;/\\`{i}/g;  #`
1.37      sakharuk  998:     $result =~ s/&#237;/\\'{i}/g;
1.76      sakharuk  999:     $result =~ s/&iacute;/\\'{i}/g;  #'
1.37      sakharuk 1000:     $result =~ s/&#238;/\\^{i}/g;
                   1001:     $result =~ s/&icirc;/\\^{i}/g;
                   1002:     $result =~ s/&#239;/\\"{i}/g;
1.76      sakharuk 1003:     $result =~ s/&iuml;/\\"{i}/g;    #"
1.37      sakharuk 1004: #    $result =~ s/&#240;//g;
                   1005: #    $result =~ s/&eth;//g;
                   1006:     $result =~ s/&#241;/\\~{n}/g;
                   1007:     $result =~ s/&ntilde;/\\~{n}/g;
                   1008:     $result =~ s/&#242;/\\`{o}/g;
1.76      sakharuk 1009:     $result =~ s/&ograve;/\\`{o}/g;  #`
1.37      sakharuk 1010:     $result =~ s/&#243;/\\'{o}/g;
1.76      sakharuk 1011:     $result =~ s/&oacute;/\\'{o}/g;  #'
1.37      sakharuk 1012:     $result =~ s/&#244;/\\^{o}/g;
                   1013:     $result =~ s/&ocirc;/\\^{o}/g;
                   1014:     $result =~ s/&#245;/\\~{o}/g;
                   1015:     $result =~ s/&otilde;/\\~{o}/g;
                   1016:     $result =~ s/&#246;/\\"{o}/g;
1.76      sakharuk 1017:     $result =~ s/&ouml;/\\"{o}/g;    #"
1.37      sakharuk 1018:     $result =~ s/&#247;/\$\\div\$/g;
                   1019:     $result =~ s/&divide;/\$\\div\$/g;
                   1020:     $result =~ s/&#248;/{\\o}/g;
                   1021:     $result =~ s/&oslash;/{\\o}/g;
                   1022:     $result =~ s/&#249;/\\`{u}/g; 
1.76      sakharuk 1023:     $result =~ s/&ugrave;/\\`{u}/g;  #` 
1.37      sakharuk 1024:     $result =~ s/&#250;/\\'{u}/g;
1.76      sakharuk 1025:     $result =~ s/&uacute;/\\'{u}/g;  #'
1.37      sakharuk 1026:     $result =~ s/&#251;/\\^{u}/g;
                   1027:     $result =~ s/&ucirc;/\\^{u}/g;
                   1028:     $result =~ s/&#252;/\\"{u}/g;
1.76      sakharuk 1029:     $result =~ s/&uuml;/\\"{u}/g;    #"
1.37      sakharuk 1030:     $result =~ s/&#253;/\\'{y}/g;
1.76      sakharuk 1031:     $result =~ s/&yacute;/\\'{y}/g;  #'
1.37      sakharuk 1032: #    $result =~ s/&#254;//g;
                   1033: #    $result =~ s/&thorn;//g;
                   1034:     $result =~ s/&#255;/\\"{y}/g;
1.76      sakharuk 1035:     $result =~ s/&yuml;/\\"{y}/g;    #"
1.75      sakharuk 1036:     $result =~ s/&#952;/\$\\theta\$/g; #converts theta from html into tex
1.37      sakharuk 1037:     return $result;
                   1038: }
1.41      sakharuk 1039: 
                   1040: 
1.76      sakharuk 1041:     sub page_format {
                   1042: 	my ($papersize,$layout,$numberofcolumns) = @_; 
                   1043: 	my ($textwidth,$textheight,$oddoffset,$evenoffset) = (0,0,0,0);
                   1044: 	if ($papersize=~/Letter/) {
                   1045: 	    if ($layout eq 'CAPA') {
                   1046: 		if ($numberofcolumns == 1) {
                   1047: 		    $textwidth = '18 cm';
                   1048: 		    $textheight = '25.9 cm';
                   1049: 		    $oddoffset = '-0.57 in';
                   1050: 		    $evenoffset = '-0.57 in';
                   1051: 		} elsif ($numberofcolumns == 2) {
1.81      sakharuk 1052: 		    $textwidth = '93 mm';
1.76      sakharuk 1053: 		    $textheight = '25.9 cm';
                   1054: 		    $oddoffset = '-0.57 in';
                   1055: 		    $evenoffset = '-0.57 in';
                   1056: 		}
                   1057: 	    } elsif ($layout eq 'CBI') {
                   1058: 		if ($numberofcolumns eq '1') {
                   1059: 		    $textwidth = '8.8 in';
                   1060: 		    $textheight = '6.8 in';
                   1061: 		    $oddoffset = '-40 pt';
                   1062: 		    $evenoffset = '-60 pt';
                   1063: 		} elsif ($numberofcolumns == 2) {
                   1064: 		    $textwidth = '4.2 in';
                   1065: 		    $textheight = '6.8 in';
                   1066: 		    $oddoffset = '-40 pt';
                   1067: 		    $evenoffset = '-60 pt';
                   1068: 		}
                   1069: 	    }
                   1070: #    } elsif($papersize=~/Legal/) {
                   1071: #    } elsif($papersize=~/Ledger/) {
                   1072: #    } elsif($papersize=~/Executive/) {
                   1073:     } elsif($papersize=~/A4/) {
                   1074: 	    if ($layout eq 'CAPA') {
                   1075: 		if ($numberofcolumns == 1) {
                   1076: 		    $textwidth = '18 cm';
                   1077: 		    $textheight = '28 cm';
                   1078: 		    $oddoffset = '-0.57 in';
                   1079: 		    $evenoffset = '-0.57 in';
                   1080: 		} elsif ($numberofcolumns == 2) {
1.81      sakharuk 1081: 		    $textwidth = '96 mm';
1.76      sakharuk 1082: 		    $textheight = '2 cm';
                   1083: 		    $oddoffset = '-0.57 in';
                   1084: 		    $evenoffset = '-0.57 in';
                   1085: 		}
                   1086: 	    } elsif ($layout eq 'CBI') {
                   1087: 		if ($numberofcolumns eq '1') {
                   1088: 		    $textwidth = '8.5 in';
                   1089: 		    $textheight = '7.7 in';
                   1090: 		    $oddoffset = '-40 pt';
                   1091: 		    $evenoffset = '-60 pt';
                   1092: 		} elsif ($numberofcolumns == 2) {
                   1093: 		    $textwidth = '3.9 in';
                   1094: 		    $textheight = '7.7 in';
                   1095: 		    $oddoffset = '-40 pt';
                   1096: 		    $evenoffset = '-60 pt';
                   1097: 		}
                   1098: 	    }
                   1099: #    } elsif($papersize=~/A3/) {
                   1100: #    } elsif($papersize=~/A2/) {
                   1101: #    } elsif($papersize=~/A5/) {
                   1102: #    } elsif($papersize=~/A6/) {
                   1103: 	}
                   1104: 	return $textwidth,$textheight,$oddoffset,$evenoffset;
                   1105:     }
                   1106: 
                   1107: 
                   1108: sub page_format_transformation {
1.83      sakharuk 1109: 	my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment) = @_; 
1.76      sakharuk 1110: 	my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$layout,$numberofcolumns);
                   1111: 	my $courseidinfo = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
                   1112: 	if ($layout eq 'CBI') {
                   1113: 	    $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm} \\begin{document}\\setcounter{page}{1}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fbox{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}}} \\hfill  $courseidinfo} \\vskip 5 mm /;
                   1114: 	} elsif ($layout eq 'CAPA') {
                   1115:  	    if ($choice ne 'All class print') { 
1.84      sakharuk 1116: 		$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\}\\setlength{\\topmargin}{1cm}\\setlength{\\headheight}{1cm}\\setlength{\\headsep}{0.5cm}\\markboth{}{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}} $courseidinfo  - $assignment}\\pagestyle{myheadings}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}/;
1.76      sakharuk 1117: 	    } else {
1.78      sakharuk 1118: 		$text =~ s/\\begin{document}/\\setlength{\\textheight}{$textheight}\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}\\setlength{\\textwidth}{$textwidth}\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}  \\vskip 5 mm /;
1.76      sakharuk 1119: 	    }
                   1120: 	}
                   1121: 	return $text;
                   1122: }
1.68      sakharuk 1123: 
                   1124: 
1.33      sakharuk 1125: sub page_cleanup {
                   1126:     my $result = shift;	
1.65      sakharuk 1127:  
                   1128:     $result =~ m/\\end{document}(\d*)$/;
1.34      sakharuk 1129:     my $number_of_columns = $1;
1.33      sakharuk 1130:     my $insert = '{';
1.34      sakharuk 1131:     for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }
1.33      sakharuk 1132:     $insert .= '}';
1.65      sakharuk 1133:     $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;
1.34      sakharuk 1134:     $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;
                   1135:     return $result,$number_of_columns;
1.7       sakharuk 1136: }
1.5       sakharuk 1137: 
1.3       sakharuk 1138: 
1.60      sakharuk 1139: sub details_for_menu {
                   1140: 
                   1141:     my $name_of_resourse = $hash{'title_'.$hash{'ids_'.$ENV{'form.postdata'}}};
                   1142:     my $symbolic = &Apache::lonnet::symbread($ENV{'form.postdata'});
1.63      albertel 1143:     my ($map,$id,$resource)=split(/___/,$symbolic);
                   1144:     my $name_of_sequence = $hash{'title_'.$hash{'ids_/res/'.$map}};
                   1145:     if ($name_of_sequence =~ /^\s*$/) {
                   1146:       $map =~ m|([^/]+)$|;
                   1147:       $name_of_sequence = $1;
                   1148:     }
1.62      sakharuk 1149:     my $name_of_map = $hash{'title_'.$hash{'ids_/res/'.$ENV{'request.course.uri'}}};
1.63      albertel 1150:     if ($name_of_map =~ /^\s*$/) {
                   1151:       $ENV{'request.course.uri'} =~ m|([^/]+)$|;
                   1152:       $name_of_map = $1;
1.83      sakharuk 1153:     }  
1.63      albertel 1154:     return ($name_of_resourse,$name_of_sequence,$name_of_map);
1.60      sakharuk 1155: 
1.76      sakharuk 1156: }
                   1157: 
                   1158: 
                   1159: sub latex_corrections {
                   1160: 
                   1161:     my ($number_of_columns,$result) = @_;
                   1162: 
1.77      sakharuk 1163:     $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;
1.76      sakharuk 1164:     $result =~ s/\$number_of_columns/$number_of_columns/g;
1.81      sakharuk 1165:     $result =~ s/(\\end{document})/\\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/;
1.76      sakharuk 1166:     $result =~ s/(\\end{longtable}\s*)(\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;
                   1167:     $result =~ s/(\\end{longtable}\s*)\\newline/$1/g;
                   1168: #-- LaTeX corrections     
                   1169:     my $first_comment = index($result,'<!--',0);
                   1170:     while ($first_comment != -1) {
                   1171: 	my $end_comment = index($result,'-->',$first_comment);
                   1172: 	substr($result,$first_comment,$end_comment-$first_comment+3) = '';
                   1173: 	$first_comment = index($result,'<!--',$first_comment);
                   1174:     }
                   1175:     $result =~ s/^\s+$//gm; #remove empty lines
                   1176:     $result =~ s/(\s)+/$1/g; #removes more than one empty space
                   1177:     $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
                   1178:     $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
                   1179:     $result =~ s/{\\par }\s*\\\\/\\\\/gm;
                   1180: 	$result =~ s/\\\\\s+\[/ \[/g;
                   1181:     $result =~ s/\b__+\b/\\makebox\[1 cm\]\[b\]{\\hrulefill}/g;
                   1182:     #conversion of html characters to LaTeX equivalents
                   1183:     if ($result =~ m/&(\w+|#\d+);/) {
                   1184: 	$result = &character_chart($result);
                   1185:     }
                   1186:     $result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g;
                   1187:     $result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g;
                   1188: 
                   1189:     return $result;
1.60      sakharuk 1190: }
                   1191: 
1.3       sakharuk 1192: 
                   1193: sub handler {
                   1194: 
                   1195:     my $r = shift;
1.67      www      1196: 
                   1197:     my $loaderror=&Apache::lonnet::overloaderror($r);
                   1198:     if ($loaderror) { return $loaderror; }
                   1199:     $loaderror=
                   1200:        &Apache::lonnet::overloaderror($r,
                   1201:          $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
                   1202:     if ($loaderror) { return $loaderror; }
                   1203: 
1.3       sakharuk 1204:     $r->content_type('text/html');
                   1205:     $r->send_http_header;
1.59      sakharuk 1206:     $r->print(&Apache::loncommon::bodytag("Printing"));
1.3       sakharuk 1207: 
1.60      sakharuk 1208:     if ($ENV{'request.course.id'}) {
                   1209: 	my $fn=$ENV{'request.course.fn'};
                   1210: 	tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);
                   1211:     }
                   1212: 
1.3       sakharuk 1213: #-- start form
                   1214:     &headerform($r);
                   1215: #-- menu for output
1.16      sakharuk 1216:     unless  ($ENV{'form.phase'}) {
1.3       sakharuk 1217: 	&menu_for_output($r);
                   1218:     }
1.52      sakharuk 1219: #-- additional menu for class printing
                   1220:      if ($ENV{'form.phase'} eq 'two') {
                   1221: 	 if($ENV{'form.choice'} eq 'All class print') {
                   1222: 	     &additional_class_menu($r);
1.58      sakharuk 1223: 	 } elsif($ENV{'form.choice'} eq 'Subdirectory print') {
                   1224: 	     &problem_choice_menu($r);
1.52      sakharuk 1225: 	 } else {
                   1226: 	     $ENV{'form.phase'} = 'three';
                   1227: 	 }
                   1228:      }
                   1229: #-- additional menu for page layout (one column case)
                   1230:     if ($ENV{'form.phase'} eq 'three') {
                   1231: 	if($ENV{'form.numberofcolumns'} == 1) {
                   1232: 	    &additional_print_menu($r);
                   1233: 	} else {
                   1234: 	    $ENV{'form.phase'} = 'four';
                   1235: 	}
                   1236:     }
1.3       sakharuk 1237: #-- core part 
1.52      sakharuk 1238:     if ($ENV{'form.phase'} eq 'four') {
1.3       sakharuk 1239: 	&output_data($r);
1.60      sakharuk 1240:     }	
                   1241:     untie %hash;
1.2       sakharuk 1242:     return OK;
1.60      sakharuk 1243:    
                   1244: } 
1.2       sakharuk 1245: 
1.1       www      1246: 
                   1247: 1;
                   1248: __END__
1.6       sakharuk 1249: 

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.