[LON-CAPA-cvs] cvs: loncom /interface lonprintout.pm

bowersj2 lon-capa-cvs@mail.lon-capa.org
Tue, 22 Apr 2003 19:54:39 -0000


This is a MIME encoded message

--bowersj21051041279
Content-Type: text/plain

bowersj2		Tue Apr 22 15:54:39 2003 EDT

  Modified files:              
    /loncom/interface	lonprintout.pm 
  Log:
  Helper interface for lonprintout.pm mostly working on the helper end.
  Still need multi-choice resource selections, multi-choice resource
  selection shortcuts, and to check the directory file selection code.
  
  
--bowersj21051041279
Content-Type: text/plain
Content-Disposition: attachment; filename="bowersj2-20030422155439.txt"

Index: loncom/interface/lonprintout.pm
diff -u loncom/interface/lonprintout.pm:1.130 loncom/interface/lonprintout.pm:1.131
--- loncom/interface/lonprintout.pm:1.130	Mon Apr 21 13:53:10 2003
+++ loncom/interface/lonprintout.pm	Tue Apr 22 15:54:39 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.130 2003/04/21 17:53:10 sakharuk Exp $
+# $Id: lonprintout.pm,v 1.131 2003/04/22 19:54:39 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -100,11 +100,6 @@
 <input type="radio" name="choice" value="Standard LaTeX output for whole primary sequence">  Problem(s) plus page(s) or html/xml file(s) from <b>$title_for_sequence</b><br />
 ENDMENUOUT2
     }
-    if ($ENV{'request.role.adv'}) {
-	$r->print(<<ENDMENUOUT27);
-<input type="radio" name="choice" value="Standard LaTeX output for the primary sequence with answers">  Problem(s) from <b>$title_for_sequence</b> with <font color="red"><b><i>answers</i></b></font><br />
-ENDMENUOUT27
-    }
     if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($ENV{'form.postdata'}=~/\/res\//)) { 
 	$r->print(<<ENDMENUOUT6);
 <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 />
@@ -509,8 +504,7 @@
 	  $result.=' \end{document}'
       }
     } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or 
-             $choice eq 'Standard LaTeX output for whole primary sequence' or 
-             $choice eq 'Standard LaTeX output for the primary sequence with answers') {
+             $choice eq 'Standard LaTeX output for whole primary sequence') {
       #-- minimal sequence to which the current document belongs
         #-- where is the primary sequence containing file?
         my @master_seq = ();
@@ -532,11 +526,10 @@
 	   my %moreenv;
 	   $moreenv{'form.grade_target'}='tex';
 	   $moreenv{'form.textwidth'}=$LaTeXwidth;
-	   if ($choice eq 'Standard LaTeX output for the primary sequence with answers') {$moreenv{'form.texaward'}='SHOW_ANSWER';}
 	   &Apache::lonnet::appenv(%moreenv);
 	   #&Apache::lonnet::logthis("Trying to get $urlp with symb $symb");
 	   my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
-	   &Apache::lonnet::delenv('form.grade_target','form.textwidth','form.texaward');
+	   &Apache::lonnet::delenv('form.grade_target','form.textwidth');
 	   if ($urlp =~ m/\.page/) {
 	     ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
 	     if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
@@ -917,7 +910,7 @@
     $result =~ s/&\#153;/\\texttrademark /g;
     $result =~ s/&\#156;/\\oe/g;
     $result =~ s/&\#159;/\\\"Y/g;
-    $result =~ s/&(\#160|nbsp);?//g;
+    $result =~ s/&(\#160|nbsp);//g;
     $result =~ s/&(\#161|iexcl);/!\`/g;
     $result =~ s/&(\#162|cent);/\\textcent /g;
     $result =~ s/&(\#163|pound);/\\pounds /g; 
@@ -1228,19 +1221,23 @@
 sub handler {
 
     my $r = shift;
+    my $helper;
 
     # A hook for me to work without disturbing Alex.
-    if ($ENV{'form.jeremy'}) {
-	printWizard($r);
-	return OK;
+    if (!$ENV{'form.jeremy'}) {
+        my $result = printHelper($r);
+        if (!ref($result)) {
+            return $result;
+        }
+        $helper = $result;
     }
 
-#    my $loaderror=&Apache::lonnet::overloaderror($r);
-#    if ($loaderror) { return $loaderror; }
-#    $loaderror=
-#       &Apache::lonnet::overloaderror($r,
-#         $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
-#    if ($loaderror) { return $loaderror; }
+    my $loaderror=&Apache::lonnet::overloaderror($r);
+    if ($loaderror) { return $loaderror; }
+    $loaderror=
+       &Apache::lonnet::overloaderror($r,
+         $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
+    if ($loaderror) { return $loaderror; }
 
     $r->content_type('text/html');
     $r->send_http_header;
@@ -1263,8 +1260,6 @@
 	     &sequence_content_menu(0,$r);
 	 } elsif($ENV{'form.choice'} eq 'Standard LaTeX output for the primary sequence') {
 	     &sequence_content_menu(1,$r);
-	 } elsif($ENV{'form.choice'} eq 'Standard LaTeX output for the primary sequence with answers') {
-	     &sequence_content_menu(1,$r);
 	 } elsif($ENV{'form.choice'} eq 'All class print') {
 	     &additional_class_menu($r);
 	 } elsif($ENV{'form.choice'} eq 'Subdirectory print') {
@@ -1290,423 +1285,180 @@
    
 } 
 
-sub new_output_data {
-    my $r = shift;
-    $r->print(<<ENDPART);
-<html>
-<head>
-<title>LON-CAPA output for printing</title>
-</head>
-<body bgcolor="FFFFFF">
-<hr>
-ENDPART
+use Apache::lonhelper;
 
-    my $choice = $ENV{'form.PRINT_TYPE'};
-    my $layout = $ENV{'form.FORMAT.layout'};
-    my $numberofcolumns = $ENV{'form.FORMAT.cols'};  
-    my $papersize = $ENV{'form.FORMAT.paper'};          
-    my $laystyle = 'book';
-    my $assignment =  $ENV{'form.assignment'};
-    if ($choice eq 'Subdirectory print') {
-	if ($ENV{'form.layout'} eq '') {$layout = 'CAPA';}
-	if ($ENV{'form.papersize'} eq '') {$papersize = 'Letter [8 1/2x11 in]';}
-	if ($ENV{'form.numberofcolumns'} eq '') {$numberofcolumns = 2;}
-    }
-    if (($choice eq 'current_document') && ($ENV{'form.url'}=~m|^/~|)) {
-	if ($ENV{'form.FORMAT.layout'} eq '') {$layout = 'CAPA';}
-	if ($ENV{'form.FORMAT.paper'} eq '') {$papersize = 'Letter [8 1/2x11 in]';}
-	if ($ENV{'form.FORMAT.cols'} eq '') {$numberofcolumns = 2;}
-    }
-    my $result = '';
-    my $number_of_columns = 1; #used only for pages to determine the width of the cell
-    my $selectionmade = '';
-    my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$layout,$numberofcolumns);
-    if ($numberofcolumns == 1) {
-	$textwidth=$ENV{'form.width'};
-	$textheight=$ENV{'form.height'};
-    }
-    my $LaTeXwidth; 
-    if ($textwidth=~/(\d+\s*cm)/) {
-	$LaTeXwidth = $1*10;
-    } elsif ($textwidth=~/(\d+\s*mm)/) {
-	$LaTeXwidth = $1;
-    }
-    if ($choice eq 'current_document') {
-      #-- single document - problem, page, html, xml, ...  
-      $selectionmade = 1;
-      if ($ENV{'form.url'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
-        my %moreenv;
-        $moreenv{'form.grade_target'}='tex';
-        if (&Apache::lonnet::allowed('bre',$ENV{'form.url'})) {
-	  $ENV{'form.url'}=~s/http:\/\/[^\/]+//;
-        }
-        $moreenv{'request.filename'}=$ENV{'form.url'};
-        $moreenv{'form.textwidth'}=$LaTeXwidth;
-        &Apache::lonnet::appenv(%moreenv);
-        my $texversion=&Apache::lonnet::ssi($ENV{'form.url'});
-        &Apache::lonnet::delenv('form.grade_target','form.textwidth','form.counter');
-        $result .= $texversion;
-        if ($ENV{'form.url'}=~m/\.page\s*$/) {
-	  ($result,$number_of_columns) = &page_cleanup($result);
-        }
-      } else {
-	  $result='\documentclass[letterpaper]{article}\usepackage{calc}\begin{document}Printout of this type of document is currently not supported: ';
-	  if ($ENV{'form.url'}=~/\/(aboutme|syllabus|bulletinboard|smppg)$/) {
-	      $result.=$1;
-	  } else {
-	      $result.=$ENV{'form.url'};
-	  }
-	  $result.=' \end{document}'
-      }
-    } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or 
-             $choice eq 'Standard LaTeX output for whole primary sequence') {
-      #-- minimal sequence to which the current document belongs
-        #-- where is the primary sequence containing file?
-        my @master_seq = ();
-	for (my $i=0; $i<$ENV{'form.numberoffiles'};$i++) {
-	    if ($ENV{'form.whatfile'.$i}=~/\S/) {
-		push @master_seq,$ENV{'form.whatfile'.$i};
-	    }
-	}
-        #-- produce an output string
-	my $flag_latex_header_remove = 'NO';
-	my $flag_page_in_sequence = 'NO';
-	for (my $i=0;$i<=$#master_seq;$i++) {
-           my ($urlp,$symb) = split /&&/, $master_seq[$i];
-	    if ($choice eq 'Standard LaTeX output for the primary sequence') {
-              $selectionmade = 2;
-	    } elsif ($choice eq 'Standard LaTeX output for whole primary sequence') {
-              $selectionmade = 3;
-	    }
-	   my %moreenv;
-	   $moreenv{'form.grade_target'}='tex';
-	   $moreenv{'form.textwidth'}=$LaTeXwidth;
-	   &Apache::lonnet::appenv(%moreenv);
-	   #&Apache::lonnet::logthis("Trying to get $urlp with symb $symb");
-	   my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
-	   &Apache::lonnet::delenv('form.grade_target','form.textwidth');
-	   if ($urlp =~ m/\.page/) {
-	     ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
-	     if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
-	     $texversion =~ s/\\end{document}\d*/\\end{document}/;
-	     $flag_page_in_sequence = 'YES';
-	   } 
-	   if ($flag_latex_header_remove ne 'NO') {
-	     $texversion = &latex_header_footer_remove($texversion);
-	   } else {
-	     $texversion =~ s/\\end{document}//;
-	   }
-	   $result .= $texversion;         
-	   $flag_latex_header_remove = 'YES';   
-	}
-	&Apache::lonnet::delenv('form.counter');
-	if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;}	
-	$result .= '\end{document}';
-    }  elsif ($choice eq 'Standard LaTeX output for the top level sequence') {
-        # where is the main sequence of the course?
-	$selectionmade = 4;
-	my $main_seq=&Apache::lonnet::clutter($ENV{'request.course.uri'});
-	my @file_seq = &coming_from_hash($main_seq);
-	for (my $i=0;$i<=$#file_seq;$i++) {
-	    my ($path,$title,$symb) = split /&&/,$file_seq[$i];
-	    $file_seq[$i] = $path.'&&'.$symb;
-	}
-	my $flag_latex_header_remove = 'NO';
-        #-- produce an output string
-	for (my $i=0;$i<=$#file_seq;$i++) {
-	   if (not $file_seq[$i]=~/^&&/) {
-	     my ($urlp,$symb) = split /&&/, $file_seq[$i];
-	     $urlp=~s/\/home\/httpd\/html//;	    
-	     if ($urlp=~m/\.(problem|exam|quiz|assess|survey|form|library)/) {
-		my %moreenv;
-		$moreenv{'form.grade_target'}='tex';
-		$moreenv{'form.textwidth'}=$LaTeXwidth;
-		&Apache::lonnet::appenv(%moreenv);
-		my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
-		&Apache::lonnet::delenv('form.grade_target','form.textwidth');		    
-		if ($flag_latex_header_remove ne 'NO') {
-		    $texversion = &latex_header_footer_remove($texversion);
-		} else {
-		    $texversion =~ s/\\end{document}//;
-		}
-		$result .= $texversion;  
-		$flag_latex_header_remove = 'YES';
-	     }		
-	   }
-	}	    
-	$result .= '\end{document}';
-    } elsif ($choice eq 'All class print') { 
-    #-- prints assignments for whole class or for selected students  
-	$selectionmade = 5;
-        my @students = ();
-	for (my $i=0; $i<$ENV{'form.numberofstudents'};$i++) {
-	    if ($ENV{'form.whomtoprint'.$i}=~/:/) {
-		push @students,$ENV{'form.whomtoprint'.$i};
-	    }
-	}
-	#where is the primary sequence containing current resource (the same for all students)?
-	my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'});
-	my @sequence = split('___',$symbolic);
-	my $primary_sequence;
-
-	$primary_sequence=&Apache::lonnet::clutter($sequence[0]);
-	my @master_seq = &coming_from_hash($primary_sequence); 
-	for (my $i=0;$i<=$#master_seq;$i++) {
-	    my ($path,$title,$symb) = split /&&/,$master_seq[$i];
-	    $master_seq[$i] = $path.'&&'.$symb;
-	}
-        #loop over students
-	my $flag_latex_header_remove = 'NO'; 
-	my %moreenv;
-	$moreenv{'form.textwidth'}=$LaTeXwidth;
-	&Apache::lonnet::appenv(%moreenv);
-	my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1);
-	foreach my $person (@students) {
-	    my $current_output = ''; 
-	    my ($usersection,$username,$userdomain) = split /:/,$person;
-	    my $fullname = &get_name($username,$userdomain);
-            #goes through all resources, checks if they are available for current student, and produces output   
-	    foreach my $curresline (@master_seq)  {
-		my ($curres,$symb) = split /&&/, $curresline;
-                if ($curres=~ m/\.(problem|exam|quiz|assess|survey|form|library)/) {
-		    my ($map,$id,$res_url) = split(/___/,$symb);
-		    if (&Apache::lonnet::allowed('bre',$res_url)) {
-			my $rendered = &Apache::loncommon::get_student_view($symb,$username,$userdomain,
-                                                                        $ENV{'request.course.id'},'tex');
-			if ($flag_latex_header_remove eq 'YES') {
-			    $rendered = &latex_header_footer_remove($rendered);
-			} else {
-			    $rendered =~ s/\\end{document}//;
-			}
-			$current_output .= $rendered;
-		    }
-		    $flag_latex_header_remove = 'YES';
-		}
-	    }
-	    my $courseidinfo = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
-	    if ($current_output=~/\\documentclass/) {
-		$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{} \\begin{document}\\noindent\\lhead{\\textit{\\textbf{$fullname}} - $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}\\vskip 3 mm /;
-	    } else {
-		my $blanspages = '';
-		for (my $j=0;$j<$ENV{'form.addedpages'};$j++) {$blanspages.='\clearpage\strut\clearpage';}
-		$current_output = '\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 }\\newpage \\vskip 3mm'.$blanspages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}} - '.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}\hskip 1.4in } \vskip 5 mm '.$current_output;
-	    }
-	    $result .= $current_output;
-	    &Apache::lonnet::delenv('form.counter');	    
-	    &Apache::lonxml::init_counter(); 
-	    &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
-						    'last student '.$fullname);
-	}
-	&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
-	$result .= '\end{document}';
-	&Apache::lonnet::delenv('form.textwidth');
-    } elsif ($choice eq 'Subdirectory print') {      
-    #prints selected problems from the subdirectory 
-	$selectionmade = 6;
-        my @list_of_files = ();
-	for (my $i=0; $i<$ENV{'form.numberofproblems'};$i++) {
-	    if ($ENV{'form.whattoprint'.$i}=~/^\//) {
-		push @list_of_files,$ENV{'form.whattoprint'.$i};
-	    }
-	}	
-	my $flag_latex_header_remove = 'NO';  
-	for (my $i=0;$i<=$#list_of_files;$i++) {
-	    my $urlp = $list_of_files[$i];
-	    if ($urlp=~/\//) {
-		my %moreenv;
-		$moreenv{'form.grade_target'}='tex';
-		$moreenv{'form.textwidth'}=$LaTeXwidth;
-		&Apache::lonnet::appenv(%moreenv);
-		if ($urlp =~ m|/home/([^/]+)/public_html|) {
-		    $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
-		} else {
-		    $urlp =~ s|^/home/httpd/html||;
-		}
-		my $texversion=&Apache::lonnet::ssi($urlp);
-		&Apache::lonnet::delenv('form.grade_target','form.textwidth');
-                #this chunck is responsible for printing the path to problem
-		my $newurlp = '';
-		my $HowMany = length($urlp)*2;
-		if ($HowMany > $LaTeXwidth) {
-		    my @temporrary = split '/',$urlp;
-		    my $HowManyNew = 0;
-		    for (my $ii=0;$ii<=$#temporrary;$ii++) {
-			if ($temporrary[$ii] ne '') {
-			    $HowManyNew += length($temporrary[$ii])*2;
-			    if ($HowManyNew < $LaTeXwidth ) {
-				$newurlp .=  '/'.$temporrary[$ii];
-			    } else {
-				$HowManyNew = 0;
-				$newurlp .=  '|\vskip -1 mm \noindent \verb|';
-				$ii--;
-			    }
-			}
-		    }
-		}
-		$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 {\\small\\noindent\\verb|$newurlp\|\\vskip 0 mm}/;
-		if ($flag_latex_header_remove ne 'NO') {
-		    $texversion = &latex_header_footer_remove($texversion);
-		} else {
-		    $texversion =~ s/\\end{document}//;
-		}
-		$result .= $texversion;
-	    }
-	    $flag_latex_header_remove = 'YES';  
-	}
-	$result .= '\end{document}';      	
-    }
-#-------------------------------------------------------- corrections for the different page formats
-    $result = &page_format_transformation($papersize,$layout,$numberofcolumns,$choice,$result,$assignment);
-    if ($layout eq 'CBI') {
-        $laystyle = 'album';
-    }
-    $result = &latex_corrections($number_of_columns,$result);
-    #changes page's parameters for the one column output 
-    if ($ENV{'form.numberofcolumns'} == 1) {
-	$result =~ s/\\textwidth= 9cm/\\textwidth= $ENV{'form.width'}/;
-	$result =~ s/\\textheight 25\.9cm/\\textheight $ENV{'form.height'}/;
-	$result =~ s/\\evensidemargin = -0\.57in/\\evensidemargin= $ENV{'form.leftmargin'}/;
-	$result =~ s/\\oddsidemargin = -0\.57in/\\oddsidemargin= $ENV{'form.leftmargin'}/;
-    }
-#-- writing .tex file in prtspool 
-    my $temp_file;
-    my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex";
-    unless ($temp_file = Apache::File->new('>'.$filename)) {
-	$r->log_error("Couldn't open $filename for output $!");
-	return SERVER_ERROR; 
-    } 
-    print $temp_file $result;
-$r->print(<<FINALEND);
-<meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$filename&$laystyle&$numberofcolumns&$selectionmade">
-</body>
-</html>
-FINALEND
-}
-
-
-
-########################################################################################
-
-use Apache::lonwizard;
-
-sub printWizard {
+sub printHelper {
     my $r = shift;
 
     if ($ENV{'request.course.id'}) {
-      my $fn=$ENV{'request.course.fn'};
-      tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);
+	my $fn=$ENV{'request.course.fn'};
+	tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);
     }
 
     if ($r->header_only) {
-      if ($ENV{'browser.mathml'}) {
-        $r->content_type('text/xml');
-      } else {
-        $r->content_type('text/html');
-      }
-      $r->send_http_header;
-      return OK;
+        if ($ENV{'browser.mathml'}) {
+            $r->content_type('text/xml');
+        } else {
+            $r->content_type('text/html');
+        }
+        $r->send_http_header;
+        return OK;
     }
 
+    # Send header, nocache
     if ($ENV{'browser.mathml'}) {
-      $r->content_type('text/xml');
+        $r->content_type('text/xml');
     } else {
-      $r->content_type('text/html');
+        $r->content_type('text/html');
     }
     &Apache::loncommon::no_cache($r);
     $r->send_http_header;
     $r->rflush();
 
-    my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu;
-    #if the resource doesn't have a title, use the filename
-    if (!$resourceTitle) {
-      my $url = $ENV{'form.postdata'};
-      $resourceTitle = substr($url, rindex($url, '/') + 1);
-    }
-
-    my $wizard = Apache::lonwizard->new("Printing Wizard", $ENV{QUERY_STRING});   
+    # Unfortunately, this helper is so complicated we have to
+    # write it by hand
 
-    $wizard->declareVars(['PRINT_TYPE', 'FORMAT', 'url', 'symb', 'postdata' , 'RESOURCES', 'FILES', 'STUDENTS']);             
+    Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
+    
+    my $helper = Apache::lonhelper::helper->new("Printing Wizard");
+    
+    # This will persistently load in the data we want from the
+    # very first screen.
+    if (defined($ENV{'form.symb'})) {
+        $helper->{VARS}->{'symb'} = $ENV{'form.symb'};
+    }
+    if (defined($ENV{'form.postdata'})) {
+        $helper->{VARS}->{'postdata'} = $ENV{'form.postdata'};
+    }
+    if (defined($ENV{'form.url'})) {
+        $helper->{VARS}->{'url'} = $ENV{'form.url'};
+    }
 
-    $wizard->{VARS}->{'postdata'} = $ENV{'form.postdata'}; 
-    $wizard->{VARS}->{'url'} = $ENV{'form.postdata'};                                
-    $wizard->{VARS}->{'symb'} = &Apache::lonnet::symbread($ENV{'form.postdata'}); 
+    my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu;
+    if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
+        my $url = $helper->{VARS}->{'postdata'};
+        $resourceTitle = substr($url, rindex($url, '/') + 1);
+    }
 
-    my $subdir = &Apache::lonnet::filelocation("", $ENV{'form.postdata'});
-    $subdir =~ s|/[^/]+$||;
+    Apache::lonhelper::registerHelperTags();
 
-    my $symb = $wizard->{VARS}->{'symb'};  # Extract map
+    # Extract map
+    my $symb = $helper->{VARS}->{'symb'};
     my ($map, $id, $url) = split(/__/, $symb);
 
+    my $subdir = &Apache::lonnet::filelocation("", $helper->{VARS}->{'postdata'});
 
-    # This really ought to be in some repository in loncommon or something where it can just be grabbed.
-    my $problemFilter = sub { 
-        my $name = shift;
-        return $name =~ m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/;
-    };
-
-    # What can be printed is a very dynamic decision based on lots of factors. So we need to dynamically build this list.
-    # To prevent security leaks, states are only added to the wizard if they can be reached, which ensures manipulating the 
-    # querystring won't allow anyone to reach states they shouldn't have permission to reach.
-
-    my $printChoices = []; 
+    # "Delete everything after the last slash."
+    $subdir =~ s|/[^/]+$||;
 
+    # What can be printed is a very dynamic decision based on
+    # lots of factors. So we need to dynamically build this list.
+    # To prevent security leaks, states are only added to the wizard
+    # if they can be reached, which ensures manipulating the form input
+    # won't allow anyone to reach states they shouldn't have permission
+    # to reach.
+
+    # printChoices is tracking the kind of printing the user can
+    # do, and will be used in a choices construction later.
+    # In the meantime we will be adding states and elements to
+    # the helper by hand.
+    my $printChoices = [];
+    my $paramHash;
     # We can always print the current screen.
-    push @{$printChoices}, ['current_document', "Current resource \"<b>$resourceTitle</b>\" (prints what you just saw on the screen)", 'CHOOSE_FORMAT'];
 
-    if ($ENV{'form.postdata'}=~ /\/res\//) {
-        # Allow problems from sequence
-        push @{$printChoices}, ['map_problems', "Problems from <b>$sequenceTitle</b>", 'CHOOSE_PROBLEMS'];
-        Apache::lonwizard::resource_multichoice->new($wizard, "CHOOSE_PROBLEMS", 'Select Problems', "Select problems to print from <b>$sequenceTitle</b>:", 'CHOOSE_FORMAT', 'RESOURCES', sub {my $res = shift; return $res->is_problem()}, undef, $map);
+    push @{$printChoices}, ["<b>$resourceTitle</b> (exactly what was on the screen)", 'current_document', 'FINAL'];
 
+    # If we're in a sequence...
+    if ($helper->{VARS}->{'postdata'} =~ /\/res\//) {
+        # Allow problems from sequence
+        push @{$printChoices}, ["Problems from <b>$sequenceTitle</b>", 'map_problems', 'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence
-        push @{$printChoices}, ['map_problems_pages', "Problem(s) and page(s) or html/xml file(s) from \"<b>$sequenceTitle</b>\"", 'CHOOSE_PROBLEMS_HTML'];
-        Apache::lonwizard::resource_multichoice->new($wizard, "CHOOSE_PROBLEMS_HTML", 'Select Resources', "Select resources to print from <b>$sequenceTitle</b>:", "CHOOSE_FORMAT", 'RESOURCES', sub {my $res = shift; return !$res->is_map()}, undef, $map);
+        push @{$printChoices}, ["Problems and pages from <b>$sequenceTitle</b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
+
+        my $isProblem = '$res->is_problem();';
+        my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
+        my $isNotMap = '!$res->is_map();';
+        my $helperFragment = <<HELPERFRAGMENT;
+  <state name="CHOOSE_PROBLEMS" title="Select Problems">
+    <message>Select problems to print:</message>
+    <resource variable="RESOURCES" multichoice="1">
+      <nextstate>FINAL</nextstate>
+      <filterfunc>return $isProblemOrMap</filterfunc>
+      <choicefunc>return $isProblem</choicefunc>
+      <mapurl>$map</mapurl>
+      </resource>
+    </state>
+
+  <state name="CHOOSE_PROBLEMS_HTML" title="Select Resources">
+    <message>Select resources to print:</message>
+    <resource variable="RESOURCES" multichoice="1">
+      <nextstate>FINAL</nextstate>
+      <choicefunc>return $isNotMap;</choicefunc>
+      <mapurl>$map</mapurl>
+      </resource>
+    </state>
+HELPERFRAGMENT
+
+        &Apache::lonxml::xmlparse($r, 'helper', $helperFragment); 
     }
 
     # If the user is priviledged, allow them to print all 
     # problems in the course, optionally for selected students
-    if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($ENV{'form.postdata'}=~/\/res\//)) { 
-        push @{$printChoices}, ['all_problems', 'All problems in this course (<b>warning:</b> this may be time consuming)', 'CHOOSE_FORMAT'];
-        push @{$printChoices}, ['problems_for_students', "Problems from <b>$sequenceTitle</b> for selected students", 'CHOOSE_STUDENTS'];
-        Apache::lonwizard::choose_student->new($wizard, "CHOOSE_STUDENTS", "Choose Students", "Select the students you wish to print the problems for:", 'CHOOSE_FORMAT', 'STUDENTS', 1);
+    if (($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) and ($helper->{VARS}->{'postdata'}=~/\/res\//)) { 
+        push @{$printChoices}, ['<b>All problems</b> in course (may take a lot of time)', 'all_problems', 'FINAL'];
+        push @{$printChoices}, ["Problems from <b>$sequenceTitle</b> for selected students", 'problems_for_students', 'CHOOSE_STUDENTS'];
+
+        &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
+  <state name="CHOOSE_STUDENTS" title="Choose Students">
+    <message>Select the students you wish to print the problems for:</message>
+    <student multichoice='1' variable="STUDENTS" nextstate="FINAL" />
+    </state>
+CHOOSE_STUDENTS
     }
 
     # FIXME: That RE should come from a library somewhere.
-    if ((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($ENV{'form.postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) {    
-        push @{$printChoices}, ['problems_from_directory', "Problems from current subdirectory <br /><b><small>$subdir</small></b>", 'CHOOSE_FROM_SUBDIR'];
-        Apache::lonwizard::choose_files->new($wizard, "CHOOSE_FROM_SUBDIR", "Select Files","Select problems you wish to print from <b>$subdir</b>:", 'CHOOSE_FORMAT', 'FILES', $subdir, $problemFilter);
-    }
-
-
-
-
-    # Despite the appearance of states before here, this is the first state. 
-    Apache::lonwizard::switch_state->new($wizard, "START", "What do you want to print? Make a choice.", "PRINT_TYPE", $printChoices, "", "");
- 
-
-
-
-
-
-
-    Apache::lonprintout::page_format_state->new($wizard, "CHOOSE_FORMAT", "You can change page layout parameters here.", "FORMAT");   
-
-
-
-
-    if ($ENV{'form.printWizDone'} ne 1) {
-      $r->print($wizard->display());
-    } else {
-      &new_output_data($r);
-    }
-
-
+    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)/)) {    
+        push @{$printChoices}, ["Problems from <b>$subdir</b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
+        
+        my $f = '$filename';
+        &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_SUBDIR);
+  <state name="CHOOSE_FROM_SUBDIR" title="Select Files">
+    <message>Select problems you wish to print from <b>$subdir</b></message>
+    <files variable="FILES">
+      <nextstate>FINAL</nextstate>
+      <filechoice>$subdir</filechoice>
+      <filefilter>return $f =~ 
+           m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/;
+      </filefilter>
+    </state>
+CHOOSE_FROM_SUBDIR
+    }
+
+    # Generate the first state, to select which resources get printed.
+    Apache::lonhelper::state->new("START", "Selecting Resources to Print");
+    $paramHash = Apache::lonhelper::getParamHash();
+    $paramHash->{MESSAGE_TEXT} = "What do you want to print?";
+    Apache::lonhelper::message->new();
+    $paramHash = Apache::lonhelper::getParamHash();
+    $paramHash->{'variable'} = 'PRINT_TYPE';
+    $paramHash->{CHOICES} = $printChoices;
+    Apache::lonhelper::choices->new();
+    Apache::lonprintout::page_format_state->new("FORMAT");
+
+    $helper->process();
+
+    # MANUAL BAILOUT CONDITION:
+    # If we're in the "final" state, bailout and return to handler
+    if ($helper->{STATE} eq 'FINAL') {
+        return $helper;
+    }    
 
+    $r->print($helper->display());
 
+    Apache::lonhelper::unregisterHelperTags();
 
     untie %hash;
 
-
     return OK;
 }
 
@@ -1717,24 +1469,31 @@
 
 =pod
 
-=head1 Wizard state: page_format_state
+=head1 Helper element: page_format_state
+
+See lonhelper.pm documentation for discussion of the helper framework.
 
-See lonwizard.pm documentation for discussion of the wizard framework.
+Apache::lonprintout::page_format_state is an element that gives the 
+user an opportunity to select the page layout they wish to print 
+with: Number of columns, portrait/landscape, and paper size. If you 
+want to change the paper size choices, change the @paperSize array 
+contents in this package.
 
-Apache::lonprintout::page_format_state is a state that gives the user an opportunity to select the page layout they wish to print with: Number of columns, portrait/landscape, and paper size. If you want to change the paper size choices, change the @paperSize array contents in this package.
+page_format_state is always directly invoked in lonprintout.pm, so there
+is no tag interface. You actually pass parameters to the constructor.
 
 =over 4
 
-=item * B<new>(parentLonWizReference, stateName, stateTitle, varName, nextState): varName is where the print information will be stored in the format FIXME. nextState is the state that follows this one.
+=item * B<new>(varName): varName is where the print information will be stored in the format FIXME.
 
 =back
 
 =cut
 
-use Apache::lonwizard;
+use Apache::lonhelper;
 
 no strict;
-@ISA = ("Apache::lonwizard::state");
+@ISA = ("Apache::lonhelper::element");
 use strict;
 
 my $maxColumns = 2;
@@ -1747,47 +1506,41 @@
 #                   Paper type
 
 sub new { 
-    my $proto = shift;
-    my $class = ref($proto) || $proto;
-    my $self = bless $proto->SUPER::new(shift, shift, shift);
+    my $self = Apache::lonhelper::element->new();
 
-    $self->{VAR_NAME} = shift;
-    $self->{NEXT_STATE} = shift;
+    $self->{'variable'} = shift;
+    bless($self);
     return $self;
 }
 
 sub render {
     my $self = shift;
-    my $wizard = $self->{WIZARD};
+    my $helper = Apache::lonhelper::getHelper();
     my $result = '';
-    my $var = $self->{VAR_NAME};
-    my $curVal = $self->{WIZARD}->{VARS}->{$var};
+    my $var = $self->{'variable'};
+    my $curVal = $helper->{VARS}->{$var};
 
     my ($layout, $cols, $paper) = split(/\|/, $curVal);
 
-    my $landscapeChecked = ($layout ne "L")? '' : 'checked ';
-    my $portraitChecked = $landscapeChecked ? '' : 'checked ';
-
     $result .= <<STATEHTML;
 
 <p>How should the printing be formatted?</p>
 <table cellpadding="3">
   <tr>
-    <td align="center"><b>Orientation</b></td>
-    <td align="center"><b>Number of Columns</b></td>
-    <td align="center"><b>Paper size (<small>[width x height]</small>)</b></td>
+    <td align="center"><b>Layout</b></td>
+    <td align="center"><b>Columns</b></td>
+    <td align="center"><b>Paper type</b></td>
   </tr>
   <tr>
     <td>
-      <input type="radio" name="${var}.layout" value="CBI" $landscapeChecked> Landscape<br />
-      <input type="radio" name="${var}.layout" value="CAPA" $portraitChecked> Portrait
+      <input type="radio" name="${var}.layout" value="L" checked='1' /> Landscape<br />
+      <input type="radio" name="${var}.layout" value="P" /> Portrait
     </td>
-    <td align="center">
+    <td>
       <select name="${var}.cols">
 STATEHTML
 
     my $i;
-    $cols = 2;
     for ($i = 1; $i <= $maxColumns; $i++) {
         if ($i == $cols) {
             $result .= "<option value='$i' selected>$i</option>\n";
@@ -1802,15 +1555,14 @@
     $i = 0;
     foreach (@paperSize) {
         if ($paper == $i) {
-            $result .= "<option selected value='$paperSize[$i]'>" . $paperSize[$i] . "</option>\n";
+            $result .= "<option selected value='$i'>" . $paperSize[$i] . "</option>\n";
         } else {
-            $result .= "<option value='$paperSize[$i]'>" . $paperSize[$i] . "</option>\n";
+            $result .= "<option value='$i'>" . $paperSize[$i] . "</option>\n";
         }
         $i++;
     }
 
     $result .= "</select></td></tr></table>";
-    $result .= '<input type="hidden" name="printWizDone" value="1" />';
     return $result;
 }
 

--bowersj21051041279--