'); return OK;
+ $texversion=~s/(\\end{document})/$answer$1/;
}
- }
+ $result .= $texversion;
+ if ($currentURL=~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 (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or
+ ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
+ ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')) {
#-- produce an output string
my $flag_latex_header_remove = 'NO';
my $flag_page_in_sequence = 'NO';
+ my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
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;
+ $master_seq[$i]=~/___\d+___(.*)$/;
+ my $urlp='/res/'.$1;
+ if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
+ $selectionmade = 2;
+ } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
+ $selectionmade = 3;
+ } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {
+ $selectionmade = 4;
}
- 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';
+ my %moreenv;
+ $moreenv{'form.grade_target'}='tex';
+ $moreenv{'form.textwidth'}=$LaTeXwidth;
+ &Apache::lonnet::appenv(%moreenv);
+ #&Apache::lonnet::logthis("Trying to get $urlp with symb $master_seq[$i]");
+ my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$master_seq[$i]));
+ &Apache::lonnet::delenv('form.grade_target','form.textwidth');
+ if ($urlp=~/\.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) {
+ } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {
+ #-- prints assignments for whole class or for selected students
+ $selectionmade=5;
+ my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'};
+ my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
+ #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 ($usersection,$username,$userdomain) = split /:/,$person;
+ my ($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 ($curresline=~ m/\.(problem|exam|quiz|assess|survey|form|library)$/) {
+ my ($map,$id,$res_url) = split(/___/,$curresline);
if (&Apache::lonnet::allowed('bre',$res_url)) {
- my $rendered = &Apache::loncommon::get_student_view($symb,$username,$userdomain,
+ my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,
$ENV{'request.course.id'},'tex');
if ($flag_latex_header_remove eq 'YES') {
$rendered = &latex_header_footer_remove($rendered);
@@ -1488,7 +1491,7 @@ ENDPART
$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';}
+ for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$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;
@@ -1500,15 +1503,11 @@ ENDPART
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
$result .= '\end{document}';
&Apache::lonnet::delenv('form.textwidth');
- } elsif ($choice eq 'Subdirectory print') {
+ } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') {
#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 @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
+ @list_of_files=sort @list_of_files;
my $flag_latex_header_remove = 'NO';
for (my $i=0;$i<=$#list_of_files;$i++) {
my $urlp = $list_of_files[$i];
@@ -1556,18 +1555,18 @@ ENDPART
$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 = &page_format_transformation_new($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'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'}/;
- }
+# #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";
@@ -1576,6 +1575,8 @@ ENDPART
return SERVER_ERROR;
}
print $temp_file $result;
+
+#
$r->print(<
@@ -1585,128 +1586,358 @@ FINALEND
-########################################################################################
+sub handler {
+
+ my $r = shift;
+ my $helper;
+
+ # A hook for me to work without disturbing Alex.
+ if (!$ENV{'form.jeremy'}) {
+ my $result = printHelper($r);
+ if (!ref($result)) {
+ return $result;
+ }
+ $helper = $result;
+
+
+
+ my $key;
+ foreach $key (keys %{$helper->{'VARS'}}) {
+ $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<- ');
+ }
+# return OK;
+
+
+ &output_data_new($r,$helper);
+
+
+
+
+
+
+ return OK;
+ }
+# 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;
+ $r->print(&Apache::loncommon::bodytag("Printing"));
+
+ if ($ENV{'request.course.id'}) {
+ my $fn=$ENV{'request.course.fn'};
+ tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);
+ }
+
+#-- start form
+ &headerform($r);
+#-- menu for output
+ unless ($ENV{'form.phase'}) {
+ &menu_for_output($r);
+ }
+#-- additional menu for class printing
+ if ($ENV{'form.phase'} eq 'two') {
+ if($ENV{'form.choice'} eq 'Standard LaTeX output for whole primary sequence') {
+ &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 'All class print') {
+ &additional_class_menu($r);
+ } elsif($ENV{'form.choice'} eq 'Subdirectory print') {
+ &problem_choice_menu($r);
+ } else {
+ $ENV{'form.phase'} = 'three';
+ }
+ }
+#-- additional menu for page layout (one column case)
+ if ($ENV{'form.phase'} eq 'three') {
+ if($ENV{'form.numberofcolumns'} == 1) {
+ &additional_print_menu($r);
+ } else {
+ $ENV{'form.phase'} = 'four';
+ }
+ }
+#-- core part
+ if ($ENV{'form.phase'} eq 'four') {
+ &output_data($r);
+ }
+ untie %hash;
+ return OK;
+
+}
-use Apache::lonwizard;
+use Apache::lonhelper;
-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);
+ # Unfortunately, this helper is so complicated we have to
+ # write it by hand
+
+ Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
+
+ my $helper = Apache::lonhelper::helper->new("Printing Wizard");
+ $helper->declareVar('symb');
+ $helper->declareVar('postdata');
+ $helper->declareVar('filename');
+ $helper->declareVar('construction');
+
+ # This will persistently load in the data we want from the
+ # very first screen.
+ # Detect whether we're coming from construction space
+ if ($ENV{'form.postdata'} =~ /http:\/\// ) {
+ $ENV{'form.postdata'} =~ /http:\/\/[a-zA-Z.]+\/~([a-zA-Z0-9]+)\/(.*)/;
+ $helper->{VARS}->{'filename'} = "/home/$1/public_html/$2";
+ $helper->{VARS}->{'construction'} = 1;
+ } else {
+ if ($ENV{'form.postdata'}) {
+ $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($ENV{'form.postdata'});
+ }
+ if ($ENV{'form.symb'}) {
+ $helper->{VARS}->{'symb'} = $ENV{'form.symb'};
+ }
+ if ($ENV{'form.url'}) {
+ $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
+ }
}
- my $wizard = Apache::lonwizard->new("Printing Wizard", $ENV{QUERY_STRING});
+ if ($ENV{'form.symb'}) {
+ $helper->{VARS}->{'symb'} = $ENV{'form.symb'};
+ }
+ if ($ENV{'form.url'}) {
+ $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
- $wizard->declareVars(['PRINT_TYPE', 'FORMAT', 'url', 'symb', 'postdata' , 'RESOURCES', 'FILES', 'STUDENTS']);
+ }
+
+ my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu;
+ $helper->{VARS}->{'assignment'} = $sequenceTitle;
- $wizard->{VARS}->{'postdata'} = $ENV{'form.postdata'};
- $wizard->{VARS}->{'url'} = $ENV{'form.postdata'};
- $wizard->{VARS}->{'symb'} = &Apache::lonnet::symbread($ENV{'form.postdata'});
+
+ # Extract map
+ my $symb = $helper->{VARS}->{'symb'};
+ my ($map, $id, $url);
+ my $subdir;
+
+ # Get the resource name from construction space
+ if ($helper->{VARS}->{'construction'}) {
+ $resourceTitle = substr($helper->{VARS}->{'filename'},
+ rindex($helper->{VARS}->{'filename'}, '/')+1);
+ $subdir = substr($helper->{VARS}->{'filename'},
+ 0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
+ } else {
+ ($map, $id, $url) = split(/___/, $symb);
+ $helper->{VARS}->{'postdata'} = Apache::lonnet::clutter($url);
- my $subdir = &Apache::lonnet::filelocation("", $ENV{'form.postdata'});
- $subdir =~ s|/[^/]+$||;
+ if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
+ my $url = $helper->{VARS}->{'postdata'};
+ $resourceTitle = substr($url, rindex($url, '/') + 1);
+ }
+ $subdir = &Apache::lonnet::filelocation("", $url);
+ }
- my $symb = $wizard->{VARS}->{'symb'}; # Extract map
- my ($map, $id, $url) = split(/__/, $symb);
+ Apache::lonhelper::registerHelperTags();
+ # "Delete everything after the last slash."
+ $subdir =~ s|/[^/]+$||;
+ if (not $helper->{VARS}->{'construction'}) {
+ $subdir='/home/httpd/html/res/'.$subdir;
+ }
- # 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.
+ # 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.
- my $printChoices = [];
+ # 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 \"$resourceTitle\" (prints what you just saw on the screen)", 'CHOOSE_FORMAT'];
+ if ($resourceTitle) {
+ push @{$printChoices}, ["$resourceTitle (prints what you just saw on the screen)", 'current_document', 'PAGESIZE'];
+ }
- if ($ENV{'form.postdata'}=~ /\/res\//) {
- # Allow problems from sequence
- push @{$printChoices}, ['map_problems', "Problems from $sequenceTitle", 'CHOOSE_PROBLEMS'];
- Apache::lonwizard::resource_multichoice->new($wizard, "CHOOSE_PROBLEMS", 'Select Problems', "Select problems to print from $sequenceTitle:", 'CHOOSE_FORMAT', 'RESOURCES', sub {my $res = shift; return $res->is_problem()}, undef, $map);
+ $r->print($helper->{VARS}->{'postdata'});
+ # If we're in a sequence...
+ if ($helper->{'VARS'}->{'construction'} ne '1') {
+ # Allow problems from sequence
+ push @{$printChoices}, ["Problem(s) from $sequenceTitle", '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 \"$sequenceTitle\"", 'CHOOSE_PROBLEMS_HTML'];
- Apache::lonwizard::resource_multichoice->new($wizard, "CHOOSE_PROBLEMS_HTML", 'Select Resources', "Select resources to print from $sequenceTitle:", "CHOOSE_FORMAT", 'RESOURCES', sub {my $res = shift; return !$res->is_map()}, undef, $map);
+ push @{$printChoices}, ["Everything (problem(s), page(s), html/xml file(s)) from $sequenceTitle", '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 $symb = '$res->symb();';
+ my $helperFragment = <
+ (mark them then click "next" button)
+
+ PAGESIZE
+ return $isProblem
+ $map
+ return $symb
+
+
+
+
+ (mark them then click "next" button)
+
+ PAGESIZE
+ return $isNotMap;
+ $map
+ return $symb
+
+
+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 (warning: this may be time consuming)', 'CHOOSE_FORMAT'];
- push @{$printChoices}, ['problems_for_students', "Problems from $sequenceTitle 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}, ['Problems in this course', 'all_problems', 'ALL_PROBLEMS'];
+ push @{$printChoices}, ["Problems from $sequenceTitle for selected students", 'problems_for_students', 'CHOOSE_STUDENTS'];
+
+ my $isProblem = '$res->is_problem();';
+ my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
+ my $symb = '$res->symb();';
+ &Apache::lonxml::xmlparse($r, 'helper', <
+ (mark them then click "next" button)
+
+ PAGESIZE
+ return $isProblemOrMap
+ return $isProblem
+ return $symb
+
+
+
+
+ (do not forget to select assignment itself - make another selection below)
+
+ Select resources for the assignment
+
+ return $isProblem
+ $map
+ return $symb
+
+ How should the results be printed?
+
+ Print students assignments without separations (as uniform flow)
+ Start student assignment from new page (add pagefeed after each student)
+ Add one emty page after each student assignment
+ Add two emty page after each student assignment
+
+
+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 $subdir", 'CHOOSE_FROM_SUBDIR'];
- Apache::lonwizard::choose_files->new($wizard, "CHOOSE_FROM_SUBDIR", "Select Files","Select problems you wish to print from $subdir:", '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 (((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) {
+ push @{$printChoices}, ["Problems from current subdirectory $subdir", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
+
+ my $f = '$filename';
+ my $xmlfrag = <
+ (mark them then click "next" button)
+
+ PAGESIZE
+ return '$subdir';
+CHOOSE_FROM_SUBDIR
+
+ $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
+ return $filename =~
+ m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/;
+
+
+
+CHOOSE_FROM_SUBDIR
+ &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
+ }
+
+ # Generate the first state, to select which resources get printed.
+ Apache::lonhelper::state->new("START", "What do you want to print? Make a choice.");
+ $paramHash = Apache::lonhelper::getParamHash();
+ $paramHash->{MESSAGE_TEXT} = "";
+ Apache::lonhelper::message->new();
+ $paramHash = Apache::lonhelper::getParamHash();
+ $paramHash->{'variable'} = 'PRINT_TYPE';
+ $helper->declareVar('PRINT_TYPE');
+ $paramHash->{CHOICES} = $printChoices;
+ Apache::lonhelper::choices->new();
+ if ($ENV{'request.role.adv'}) {
+ $paramHash = Apache::lonhelper::getParamHash();
+ $paramHash->{MESSAGE_TEXT} = " Next option is available only for advanced users: ";
+ Apache::lonhelper::message->new();
+ $paramHash = Apache::lonhelper::getParamHash();
+ $paramHash->{'variable'} = 'ANSWER_TYPE';
+ $helper->declareVar('ANSWER_TYPE');
+ $paramHash->{CHOICES} = [
+ ['Print without answer', 'yes'],
+ ['Print with answers', 'no'] ];
+ Apache::lonhelper::choices->new();
+ }
+ Apache::lonprintout::page_format_state->new("FORMAT");
+ # Generate the PAGESIZE state which will offer the user the margin
+ # choices if they select one column
+ Apache::lonhelper::state->new("PAGESIZE", "Set Margins");
+ Apache::lonprintout::page_size_state->new('pagesize', 'FORMAT', 'FINAL');
- if ($ENV{'form.printWizDone'} ne 1) {
- $r->print($wizard->display());
- } else {
- &new_output_data($r);
- }
+ $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 +1948,31 @@ package Apache::lonprintout::page_format
=pod
-=head1 Wizard state: page_format_state
+=head1 Helper element: page_format_state
-See lonwizard.pm documentation for discussion of the wizard framework.
+See lonhelper.pm documentation for discussion of the helper framework.
-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.
+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.
+
+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(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(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,49 +1985,44 @@ my @paperSize = ("Letter [8 1/2x11 in]",
# 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();
+
+ shift;
- $self->{VAR_NAME} = shift;
- $self->{NEXT_STATE} = shift;
+ $self->{'variable'} = shift;
+ my $helper = Apache::lonhelper::getHelper();
+ $helper->declareVar($self->{'variable'});
+ 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 ($layout, $cols, $paper) = split(/\|/, $curVal);
-
- my $landscapeChecked = ($layout ne "L")? '' : 'checked ';
- my $portraitChecked = $landscapeChecked ? '' : 'checked ';
+ my $var = $self->{'variable'};
$result .= <How should the printing be formatted?
+
What page format do you prefer?
-
Orientation
-
Number of Columns
-
Paper size ([width x height])
+
Page layout
+
Number of columns
+
Paper type
- Landscape
- Portrait
+ Landscape
+ Portrait
";
- $result .= '';
return $result;
}
+sub postprocess {
+ my $self = shift;
+
+ my $var = $self->{'variable'};
+ my $helper = Apache::lonhelper->getHelper();
+ $helper->{VARS}->{$var} =
+ $ENV{"form.$var.layout"} . '|' . $ENV{"form.$var.cols"} . '|' .
+ $ENV{"form.$var.paper"};
+ return 1;
+}
+
1;
+package Apache::lonprintout::page_size_state;
+
+=pod
+
+=head1 Helper element: page_size_state
+
+See lonhelper.pm documentation for discussion of the helper framework.
+
+Apache::lonprintout::page_size_state is an element that gives the
+user the opportunity to further refine the page settings if they
+select a single-column page.
+
+page_size_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(varName): varName is where the print information will be stored in the format FIXME.
+
+=back
+
+=cut
+
+use Apache::lonhelper;
+
+no strict;
+@ISA = ("Apache::lonhelper::element");
+use strict;
+
+
+
+sub new {
+ my $self = Apache::lonhelper::element->new();
+
+ shift; # disturbs me (probably prevents subclassing) but works (drops
+ # package descriptor)... - Jeremy
+
+ $self->{'variable'} = shift;
+ my $helper = Apache::lonhelper::getHelper();
+ $helper->declareVar($self->{'variable'});
+
+ # The variable name of the format element, so we can look into
+ # $helper->{VARS} to figure out whether the columns are one or two
+ $self->{'formatvar'} = shift;
+
+ # The state to transition to after selection, or after discovering
+ # the cols are not set to 1
+ $self->{NEXTSTATE} = shift;
+ bless($self);
+ return $self;
+}
+
+sub render {
+ my $self = shift;
+ my $helper = Apache::lonhelper::getHelper();
+ my $result = '';
+ my $var = $self->{'variable'};
+
+ if (defined $self->{ERROR_MSG}) {
+ $result .= ' ' . $self->{ERROR_MSG} . ' ';
+ }
+
+ $result .= <How should the column be formatted?
+
+
+
+
Width:
+
+
+
+
+
+
+
Height:
+
+
+
+
+
+
+
Left margin:
+
+
+
+
+
+
+
+
Hint: Some instructors like to leave scratch space for the student by
+making the width much smaller then the width of the page.
+
+ELEMENTHTML
+
+ return $result;
+}
+
+# If the user didn't select 1 column, skip this state.
+sub preprocess {
+ my $self = shift;
+ my $helper = Apache::lonhelper::getHelper();
+
+ my $format = $helper->{VARS}->{$self->{'formatvar'}};
+ if (substr($format, 2, 1) ne '1') {
+ $helper->changeState($self->{NEXTSTATE});
+ }
+
+ return 1;
+}
+
+sub postprocess {
+ my $self = shift;
+
+ my $var = $self->{'variable'};
+ my $helper = Apache::lonhelper->getHelper();
+ my $width = $helper->{VARS}->{$var .'.width'} = $ENV{"form.${var}.width"};
+ my $height = $helper->{VARS}->{$var .'.height'} = $ENV{"form.${var}.height"};
+ my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $ENV{"form.${var}.lmargin"};
+ $helper->{VARS}->{$var .'.widthunit'} = $ENV{"form.${var}.widthunit"};
+ $helper->{VARS}->{$var .'.heightunit'} = $ENV{"form.${var}.heightunit"};
+ $helper->{VARS}->{$var .'.lmarginunit'} = $ENV{"form.${var}.lmarginunit"};
+
+ my $error = '';
+
+ # /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed
+ # by an optional period, followed by digits, ending the string
+
+ if ($width !~ /^-?[0-9]+(\.[0-9]*)?$/) {
+ $error .= "Invalid width; please type only a number. \n";
+ }
+ if ($height !~ /^-?[0-9]+(\.[0-9]*)?$/) {
+ $error .= "Invalid height; please type only a number. \n";
+ }
+ if ($lmargin !~ /^-?[0-9]+(\.[0-9]*)?$/) {
+ $error .= "Invalid left margin; please type only a number. \n";
+ }
+
+ if (!$error) {
+ Apache::lonhelper::getHelper()->changeState($self->{NEXTSTATE});
+ return 1;
+ } else {
+ $self->{ERROR_MSG} = $error;
+ return 0;
+ }
+}
+
+
+
__END__