[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--