--- loncom/interface/lonprintout.pm 2003/05/01 20:37:32 1.140 +++ loncom/interface/lonprintout.pm 2003/05/02 19:22:20 1.145 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.140 2003/05/01 20:37:32 sakharuk Exp $ +# $Id: lonprintout.pm,v 1.145 2003/05/02 19:22:20 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1389,21 +1389,27 @@ ENDPART if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { - #-- single document - problem, page, html, xml, ... + #-- single document - problem, page, html, xml, ... + my $currentURL; + if (defined $helper->{'VARS'}->{'url'}) { + $currentURL=$helper->{'VARS'}->{'url'}; + } else { + $currentURL=$helper->{'VARS'}->{'postdata'}; + } $selectionmade = 1; - if ($helper->{'VARS'}->{'url'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + if ($currentURL=~/\.(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',$helper->{'VARS'}->{'url'})) { - $helper->{'VARS'}->{'url'}=~s/http:\/\/[^\/]+//; - } - $moreenv{'request.filename'}=$helper->{'VARS'}->{'url'}; + if (&Apache::lonnet::allowed('bre',$currentURL)) { + $currentURL=~s/http:\/\/[^\/]+//; + } + $moreenv{'request.filename'}=$currentURL; $moreenv{'form.textwidth'}=$LaTeXwidth; &Apache::lonnet::appenv(%moreenv); - my $texversion=&Apache::lonnet::ssi($helper->{'VARS'}->{'url'}); + my $texversion=&Apache::lonnet::ssi($currentURL); &Apache::lonnet::delenv('form.grade_target','form.textwidth','form.counter'); $result .= $texversion; - if ($helper->{'VARS'}->{'url'}=~m/\.page\s*$/) { + if ($currentURL=~m/\.page\s*$/) { ($result,$number_of_columns) = &page_cleanup($result); } } else { @@ -1417,50 +1423,53 @@ ENDPART } -# } 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'; + } 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'}; + +# foreach my $key (@master_seq) { +# $r->print(' '.$key.'
'); # } -# &Apache::lonnet::delenv('form.counter'); -# if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;} -# $result .= '\end{document}'; +# return OK; + + for (my $i=0;$i<=$#master_seq;$i++) { + $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 $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; @@ -1636,7 +1645,7 @@ ENDPART } print $temp_file $result; - +# $r->print(< @@ -1664,8 +1673,9 @@ sub handler { # foreach $key (keys %{$helper->{'VARS'}}) { # $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'
'); # } +# return OK; + - &output_data_new($r,$helper); @@ -1811,7 +1821,7 @@ sub printHelper { my $paramHash; # We can always print the current screen. - push @{$printChoices}, ["$resourceTitle (exactly what was on the screen)", 'current_document', 'FINAL']; + push @{$printChoices}, ["$resourceTitle (exactly what was on the screen)", 'current_document', 'PAGESIZE']; # If we're in a sequence... if ($helper->{VARS}->{'postdata'} =~ /\/res\//) { @@ -1827,10 +1837,9 @@ sub printHelper { my $helperFragment = < Select problems to print: - - FINAL - return $isProblemOrMap - return $isProblem + + PAGESIZE + return $isProblem $map return $symb @@ -1838,9 +1847,9 @@ sub printHelper { Select resources to print: - - FINAL - return $isNotMap; + + PAGESIZE + return $isNotMap; $map return $symb @@ -1863,7 +1872,7 @@ HELPERFRAGMENT Select problems to print: - FINAL + PAGESIZE return $isProblemOrMap return $isProblem return $symb @@ -1872,7 +1881,7 @@ HELPERFRAGMENT Select the students you wish to print the problems for: - + CHOOSE_STUDENTS } @@ -1886,7 +1895,7 @@ CHOOSE_STUDENTS Select problems you wish to print from $subdir - FINAL + PAGESIZE return '$subdir'; CHOOSE_FROM_SUBDIR @@ -1912,6 +1921,12 @@ CHOOSE_FROM_SUBDIR 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'); + + $helper->process(); # MANUAL BAILOUT CONDITION: @@ -1989,9 +2004,6 @@ sub render { my $helper = Apache::lonhelper::getHelper(); my $result = ''; my $var = $self->{'variable'}; - my $curVal = $helper->{VARS}->{$var}; - - my ($layout, $cols, $paper) = split(/\|/, $curVal); $result .= <\n"; } else { $result .= "\n"; @@ -2050,5 +2062,160 @@ sub postprocess { 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__