--- loncom/interface/lonprintout.pm 2002/04/26 18:19:05 1.24 +++ loncom/interface/lonprintout.pm 2006/08/14 10:52:04 1.478 @@ -1,7 +1,8 @@ +# # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.24 2002/04/26 18:19:05 sakharuk Exp $ +# $Id: lonprintout.pm,v 1.478 2006/08/14 10:52:04 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,17 +26,6 @@ # # http://www.lon-capa.org/ # -# (Internal Server Error Handler -# -# (Login Screen -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, -# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) -# -# 3/1/1 Gerd Kortemeyer) -# -# 3/1 Gerd Kortemeyer -# -# 9/17 Alex Sakharuk # package Apache::lonprintout; @@ -43,186 +33,817 @@ use strict; use Apache::Constants qw(:common :http); use Apache::lonxml; use Apache::lonnet; +use Apache::loncommon; use Apache::inputtags; +use Apache::grades; use Apache::edit; use Apache::File(); +use Apache::lonnavmaps; +use Apache::lonratedt; +use POSIX qw(strftime); +use Apache::lonlocal; +use Carp; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + +my %perm; +my %parmhash; +my $resources_printed; + + +# Format a header according to a format. +# + +# Substitutions: +# %a - Assignment name. +# %c - Course name. +# %n - Student name. +# +sub format_page_header { + my ($format, $assignment, $course, $student) = @_; + + # Default format? + + if ($format eq '') { + $format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; + + } else { + $format =~ s/%a/$assignment/g; + $format =~ s/%c/$course/g; + $format =~ s/%n/$student/g; + } + + return $format; + +} +# +# Convert a numeric code to letters +# +sub num_to_letters { + my ($num) = @_; + my @nums= split('',$num); + my @num_to_let=('A'..'Z'); + my $word; + foreach my $digit (@nums) { $word.=$num_to_let[$digit]; } + return $word; +} +# Convert a letter code to numeric. +# +sub letters_to_num { + my ($letters) = @_; + my @letters = split('', uc($letters)); + my %substitution; + my $digit = 0; + foreach my $letter ('A'..'J') { + $substitution{$letter} = $digit; + $digit++; + } + # The substitution is done as below to preserve leading + # zeroes which are needed to keep the code size exact + # + my $result =""; + foreach my $letter (@letters) { + $result.=$substitution{$letter}; + } + return $result; +} -sub headerform { - my $r = shift; - $r->print(< - -LON-CAPA output for printing - - -
-

What do you want to print? Make a choice.


-ENDHEADER +# Determine if a code is a valid numeric code. Valid +# numeric codes must be comprised entirely of digits and +# have a correct number of digits. +# +# Parameters: +# value - proposed code value. +# num_digits - Number of digits required. +# +sub is_valid_numeric_code { + my ($value, $num_digits) = @_; + # Remove leading/trailing whitespace; + $value =~ s/^\s*//g; + $value =~ s/\s*$//g; + + # All digits? + if ($value !~ /^[0-9]+$/) { + return "Numeric code $value has invalid characters - must only be digits"; + } + if (length($value) != $num_digits) { + return "Numeric code $value incorrect number of digits (correct = $num_digits)"; + } + return undef; +} +# Determines if a code is a valid alhpa code. Alpha codes +# are ciphers that map [A-J,a-j] -> 0..9 0..9. +# They also have a correct digit count. +# Parameters: +# value - Proposed code value. +# num_letters - correct number of letters. +# Note: +# leading and trailing whitespace are ignored. +# +sub is_valid_alpha_code { + my ($value, $num_letters) = @_; + + # strip leading and trailing spaces. + + $value =~ s/^\s*//g; + $value =~ s/\s*$//g; + + # All alphas in the right range? + if ($value !~ /^[A-J,a-j]+$/) { + return "Invalid letter code $value must only contain A-J"; + } + if (length($value) != $num_letters) { + return "Letter code $value has incorrect number of letters (correct = $num_letters)"; + } + return undef; } +# Determine if a code entered by the user in a helper is valid. +# valid depends on the code type and the type of code selected. +# The type of code selected can either be numeric or +# Alphabetic. If alphabetic, the code, in fact is a simple +# substitution cipher for the actual numeric code: 0->A, 1->B ... +# We'll be nice and be case insensitive for alpha codes. +# Parameters: +# code_value - the value of the code the user typed in. +# code_option - The code type selected from the set in the scantron format +# table. +# Returns: +# undef - The code is valid. +# other - An error message indicating what's wrong. +# +sub is_code_valid { + my ($code_value, $code_option) = @_; + my ($code_type, $code_length) = ('letter', 6); # defaults. + open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); + foreach my $line () { + my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; + if($name eq $code_option) { + $code_length = $length; + if($type eq 'number') { + $code_type = 'number'; + } + } + } + my $valid; + if ($code_type eq 'number') { + return &is_valid_numeric_code($code_value, $code_length); + } else { + return &is_valid_alpha_code($code_value, $code_length); + } -sub menu_for_output { - my $r = shift; - $r->print(< - - Current document -(you will print what you see on the screen)
- All problems from the primary sequence
- The whole primary sequence (problems plus all html and xml files)
- All problems from the top level sequence
-


-

And what page format do you prefer?

- CBI
- CAPA
- - - - -ENDMENUOUT } +# Compare two students by name. The students are in the form +# returned by the helper: +# user:domain:section:last, first:status +# This is a helper function for the perl sort built-in therefore: +# Implicit Inputs: +# $a - The first element to compare (global) +# $b - The second element to compare (global) +# Returns: +# -1 - $a < $b +# 0 - $a == $b +# +1 - $a > $b +# Note that the initial comparison is done on the last names with the +# first names only used to break the tie. +# +# +sub compare_names { + # First split the names up into the primary fields. + my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a); + my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b); + # Now split the last name and first name of each n: + # -sub output_data { - my $r = shift; - $r->print(< - -LON-CAPA output for printing - - -
-ENDPART + my ($l1,$f1) = split(/,/, $n1); + my ($l2,$f2) = split(/,/, $n2); - my $choice = $ENV{'form.choice'}; - my $layout = $ENV{'form.layout'}; - my $laystyle = 'book'; - my $result = ''; - my %mystyle; - my $filename; + # We don't bother to remove the leading/trailing whitespace from the + # firstname, unless the last names compare identical. - if ($choice eq 'Standard LaTeX output for current document') { - my %moreenv; - my $currequest=$ENV{'request.filename'}; - $moreenv{'form.grade_target'}='tex'; - $moreenv{'request.filename'}=$ENV{'form.url'}; - &Apache::lonnet::appenv(%moreenv); - my $texversion=&Apache::lonnet::ssi($ENV{'form.url'}); - &Apache::lonnet::delenv('form.grade_target'); - %moreenv = (); - $moreenv{'request.filename'}=$currequest; - &Apache::lonnet::appenv(%moreenv); - $result .= $texversion; - - } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or $choice eq 'Standard LaTeX output for whole primary sequence') { -#-- where is the primary sequence containing file? - my %moreenv; - my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'}); - $_ = $symbolic; - m/([^_]+)_/; - my $primary_sequence = '/res/'.$1; -#-- open and analyses the primary sequence - my $sequence_file=&Apache::lonnet::filelocation("",$primary_sequence); - my $sequencefilecontents=&Apache::lonnet::getfile($sequence_file); - my @master_seq = &content_map($sequencefilecontents); -#-- produce an output string - for (my $i=0;$i<=$#master_seq;$i++) { - $_ = $master_seq[$i]; - m/\"(.*)\"/; - $_ = $1; - my $urlp = $1; - if ($choice eq 'Standard LaTeX output for the primary sequence') { - if (/\.(problem|exam|quiz|assess|survey|form|library)/) { - my %moreenv; - $moreenv{'form.grade_target'}='tex'; - &Apache::lonnet::appenv(%moreenv); - my $texversion=&Apache::lonnet::ssi($urlp); - &Apache::lonnet::delenv('form.grade_target'); - $result .= $texversion; - } - } else { - $moreenv{'form.grade_target'}='tex'; - &Apache::lonnet::appenv(%moreenv); - my $texversion=&Apache::lonnet::ssi($urlp); - &Apache::lonnet::delenv('form.grade_target'); - $result .= $texversion; - } - } -#-- additional cleanup for output - my $first_app = index($result,'\documentclass',0); - $first_app = index($result,'\documentclass',$first_app+5); - while ($first_app != -1) { - my $second_app = index($result,'begin{document}',$first_app); - $first_app = rindex($result,'\end{document}',$first_app); - substr($result,$first_app,$second_app-$first_app+15) = '\vskip 3 mm'; - $first_app = index($result,'\documentclass',$first_app+5); - } - } elsif ($choice eq 'Standard LaTeX output for the top level sequence') { - my @master_seq = (); - my @add_file_seq = (); -#-- where is the main sequence of the course? - my $main_seq = '/res/'.$ENV{'request.course.uri'}; - my $file=&Apache::lonnet::filelocation("",$main_seq); - my $filecontents=&Apache::lonnet::getfile($file); - my @file_seq = &content_map($filecontents); -#-- do we have any other sequence inside? - my $i=0; - while ($i<=$#file_seq) { - $_ = $file_seq[$i]; - if (/\.sequence$/) { - $file = &Apache::lonnet::filelocation("",$file_seq[$i]); - $filecontents=&Apache::lonnet::getfile($file); - @add_file_seq = &content_map($filecontents); - splice(@file_seq,$i,1,@add_file_seq); - @add_file_seq = (); - $i = -1; - } - $i++; + if($l1 lt $l2) { + return -1; + } + if($l1 gt $l2) { + return 1; + } + + # Break the tie on the first name, but there are leading (possibly trailing + # whitespaces to get rid of first + # + $f1 =~ s/^\s+//; # Remove leading... + $f1 =~ s/\s+$//; # Trailing spaces from first 1... + + $f2 =~ s/^\s+//; + $f2 =~ s/\s+$//; # And the same for first 2... + + if($f1 lt $f2) { + return -1; + } + if($f1 gt $f2) { + return 1; + } + + # Must be the same name. + + return 0; +} + +sub latex_header_footer_remove { + my $text = shift; + $text =~ s/\\end{document}//; + $text =~ s/\\documentclass([^&]*)\\begin{document}//; + return $text; +} +# +# If necessary, encapsulate text inside +# a minipage env. +# necessity is determined by the problem_split param. +# +sub encapsulate_minipage { + my ($text) = @_; + if (!($env{'form.problem.split'} =~ /yes/i)) { + $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; + } + return $text; +} +# +# The NUMBER_TO_PRINT and SPLIT_PDFS +# variables interact, this sub looks at these two parameters +# and comes up with a final value for NUMBER_TO_PRINT which can be: +# all - if SPLIT_PDFS eq 'all'. +# 1 - if SPLIT_PDFS eq 'oneper' +# section - if SPLIT_PDFS eq 'sections' +# - if SPLIT_PDFS eq 'usenumber' +# +sub adjust_number_to_print { + my $helper = shift; + + my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'}; + + if ($split_pdf eq 'all') { + $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all'; + } elsif ($split_pdf eq 'oneper') { + $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 1; + } elsif ($split_pdf eq 'sections') { + $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'section'; + } elsif ($split_pdf eq 'usenumber') { + # Unmodified. + } else { + # Error!!!! + + croak "bad SPLIT_PDFS: $split_pdf in lonprintout::adjust_number_to_print"; + } +} + +sub character_chart { + my $result = shift; + $result =~ s/&\#0?0?(7|9);//g; + $result =~ s/&\#0?(10|13);//g; + $result =~ s/&\#0?32;/ /g; + $result =~ s/&\#0?33;/!/g; + $result =~ s/&(\#0?34|quot);/\"/g; + $result =~ s/&\#0?35;/\\\#/g; + $result =~ s/&\#0?36;/\\\$/g; + $result =~ s/&\#0?37;/\\%/g; + $result =~ s/&(\#0?38|amp);/\\&/g; + $result =~ s/&\#(0?39|146);/\'/g; + $result =~ s/&\#0?40;/(/g; + $result =~ s/&\#0?41;/)/g; + $result =~ s/&\#0?42;/\*/g; + $result =~ s/&\#0?43;/\+/g; + $result =~ s/&\#(0?44|130);/,/g; + $result =~ s/&\#0?45;/-/g; + $result =~ s/&\#0?46;/\./g; + $result =~ s/&\#0?47;/\//g; + $result =~ s/&\#0?48;/0/g; + $result =~ s/&\#0?49;/1/g; + $result =~ s/&\#0?50;/2/g; + $result =~ s/&\#0?51;/3/g; + $result =~ s/&\#0?52;/4/g; + $result =~ s/&\#0?53;/5/g; + $result =~ s/&\#0?54;/6/g; + $result =~ s/&\#0?55;/7/g; + $result =~ s/&\#0?56;/8/g; + $result =~ s/&\#0?57;/9/g; + $result =~ s/&\#0?58;/:/g; + $result =~ s/&\#0?59;/;/g; + $result =~ s/&(\#0?60|lt|\#139);/\$<\$/g; + $result =~ s/&\#0?61;/\\ensuremath\{=\}/g; + $result =~ s/&(\#0?62|gt|\#155);/\\ensuremath\{>\}/g; + $result =~ s/&\#0?63;/\?/g; + $result =~ s/&\#0?65;/A/g; + $result =~ s/&\#0?66;/B/g; + $result =~ s/&\#0?67;/C/g; + $result =~ s/&\#0?68;/D/g; + $result =~ s/&\#0?69;/E/g; + $result =~ s/&\#0?70;/F/g; + $result =~ s/&\#0?71;/G/g; + $result =~ s/&\#0?72;/H/g; + $result =~ s/&\#0?73;/I/g; + $result =~ s/&\#0?74;/J/g; + $result =~ s/&\#0?75;/K/g; + $result =~ s/&\#0?76;/L/g; + $result =~ s/&\#0?77;/M/g; + $result =~ s/&\#0?78;/N/g; + $result =~ s/&\#0?79;/O/g; + $result =~ s/&\#0?80;/P/g; + $result =~ s/&\#0?81;/Q/g; + $result =~ s/&\#0?82;/R/g; + $result =~ s/&\#0?83;/S/g; + $result =~ s/&\#0?84;/T/g; + $result =~ s/&\#0?85;/U/g; + $result =~ s/&\#0?86;/V/g; + $result =~ s/&\#0?87;/W/g; + $result =~ s/&\#0?88;/X/g; + $result =~ s/&\#0?89;/Y/g; + $result =~ s/&\#0?90;/Z/g; + $result =~ s/&\#0?91;/[/g; + $result =~ s/&\#0?92;/\\ensuremath\{\\setminus\}/g; + $result =~ s/&\#0?93;/]/g; + $result =~ s/&\#(0?94|136);/\\ensuremath\{\\wedge\}/g; + $result =~ s/&\#(0?95|138|154);/\\underline{\\makebox[2mm]{\\strut}}/g; + $result =~ s/&\#(0?96|145);/\`/g; + $result =~ s/&\#0?97;/a/g; + $result =~ s/&\#0?98;/b/g; + $result =~ s/&\#0?99;/c/g; + $result =~ s/&\#100;/d/g; + $result =~ s/&\#101;/e/g; + $result =~ s/&\#102;/f/g; + $result =~ s/&\#103;/g/g; + $result =~ s/&\#104;/h/g; + $result =~ s/&\#105;/i/g; + $result =~ s/&\#106;/j/g; + $result =~ s/&\#107;/k/g; + $result =~ s/&\#108;/l/g; + $result =~ s/&\#109;/m/g; + $result =~ s/&\#110;/n/g; + $result =~ s/&\#111;/o/g; + $result =~ s/&\#112;/p/g; + $result =~ s/&\#113;/q/g; + $result =~ s/&\#114;/r/g; + $result =~ s/&\#115;/s/g; + $result =~ s/&\#116;/t/g; + $result =~ s/&\#117;/u/g; + $result =~ s/&\#118;/v/g; + $result =~ s/&\#119;/w/g; + $result =~ s/&\#120;/x/g; + $result =~ s/&\#121;/y/g; + $result =~ s/&\#122;/z/g; + $result =~ s/&\#123;/\\{/g; + $result =~ s/&\#124;/\|/g; + $result =~ s/&\#125;/\\}/g; + $result =~ s/&\#126;/\~/g; + $result =~ s/&\#131;/\\textflorin /g; + $result =~ s/&\#132;/\"/g; + $result =~ s/&\#133;/\\ensuremath\{\\ldots\}/g; + $result =~ s/&\#134;/\\ensuremath\{\\dagger\}/g; + $result =~ s/&\#135;/\\ensuremath\{\\ddagger\}/g; + $result =~ s/&\#137;/\\textperthousand /g; + $result =~ s/&\#140;/{\\OE}/g; + $result =~ s/&\#147;/\`\`/g; + $result =~ s/&\#148;/\'\'/g; + $result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g; + $result =~ s/&\#150;/--/g; + $result =~ s/&\#151;/---/g; + $result =~ s/&\#152;/\\ensuremath\{\\sim\}/g; + $result =~ s/&\#153;/\\texttrademark /g; + $result =~ s/&\#156;/\\oe/g; + $result =~ s/&\#159;/\\\"Y/g; + $result =~ s/&(\#160|nbsp);/~/g; + $result =~ s/&(\#161|iexcl);/!\`/g; + $result =~ s/&(\#162|cent);/\\textcent /g; + $result =~ s/&(\#163|pound);/\\pounds /g; + $result =~ s/&(\#164|curren);/\\textcurrency /g; + $result =~ s/&(\#165|yen);/\\textyen /g; + $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g; + $result =~ s/&(\#167|sect);/\\textsection /g; + $result =~ s/&(\#168|uml);/\\texthighdieresis /g; + $result =~ s/&(\#169|copy);/\\copyright /g; + $result =~ s/&(\#170|ordf);/\\textordfeminine /g; + $result =~ s/&(\#172|not);/\\ensuremath\{\\neg\}/g; + $result =~ s/&(\#173|shy);/ - /g; + $result =~ s/&(\#174|reg);/\\textregistered /g; + $result =~ s/&(\#175|macr);/\\ensuremath\{^{-}\}/g; + $result =~ s/&(\#176|deg);/\\ensuremath\{^{\\circ}\}/g; + $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g; + $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g; + $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g; + $result =~ s/&(\#180|acute);/\\textacute /g; + $result =~ s/&(\#181|micro);/\\ensuremath\{\\mu\}/g; + $result =~ s/&(\#182|para);/\\P/g; + $result =~ s/&(\#183|middot);/\\ensuremath\{\\cdot\}/g; + $result =~ s/&(\#184|cedil);/\\c{\\strut}/g; + $result =~ s/&(\#185|sup1);/\\ensuremath\{^1\}/g; + $result =~ s/&(\#186|ordm);/\\textordmasculine /g; + $result =~ s/&(\#188|frac14);/\\textonequarter /g; + $result =~ s/&(\#189|frac12);/\\textonehalf /g; + $result =~ s/&(\#190|frac34);/\\textthreequarters /g; + $result =~ s/&(\#191|iquest);/?\`/g; + $result =~ s/&(\#192|Agrave);/\\\`{A}/g; + $result =~ s/&(\#193|Aacute);/\\\'{A}/g; + $result =~ s/&(\#194|Acirc);/\\^{A}/g; + $result =~ s/&(\#195|Atilde);/\\~{A}/g; + $result =~ s/&(\#196|Auml);/\\\"{A}/g; + $result =~ s/&(\#197|Aring);/{\\AA}/g; + $result =~ s/&(\#198|AElig);/{\\AE}/g; + $result =~ s/&(\#199|Ccedil);/\\c{c}/g; + $result =~ s/&(\#200|Egrave);/\\\`{E}/g; + $result =~ s/&(\#201|Eacute);/\\\'{E}/g; + $result =~ s/&(\#202|Ecirc);/\\^{E}/g; + $result =~ s/&(\#203|Euml);/\\\"{E}/g; + $result =~ s/&(\#204|Igrave);/\\\`{I}/g; + $result =~ s/&(\#205|Iacute);/\\\'{I}/g; + $result =~ s/&(\#206|Icirc);/\\^{I}/g; + $result =~ s/&(\#207|Iuml);/\\\"{I}/g; + $result =~ s/&(\#209|Ntilde);/\\~{N}/g; + $result =~ s/&(\#210|Ograve);/\\\`{O}/g; + $result =~ s/&(\#211|Oacute);/\\\'{O}/g; + $result =~ s/&(\#212|Ocirc);/\\^{O}/g; + $result =~ s/&(\#213|Otilde);/\\~{O}/g; + $result =~ s/&(\#214|Ouml);/\\\"{O}/g; + $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g; + $result =~ s/&(\#216|Oslash);/{\\O}/g; + $result =~ s/&(\#217|Ugrave);/\\\`{U}/g; + $result =~ s/&(\#218|Uacute);/\\\'{U}/g; + $result =~ s/&(\#219|Ucirc);/\\^{U}/g; + $result =~ s/&(\#220|Uuml);/\\\"{U}/g; + $result =~ s/&(\#221|Yacute);/\\\'{Y}/g; + $result =~ s/&(\#223|szlig);/{\\ss}/g; + $result =~ s/&(\#224|agrave);/\\\`{a}/g; + $result =~ s/&(\#225|aacute);/\\\'{a}/g; + $result =~ s/&(\#226|acirc);/\\^{a}/g; + $result =~ s/&(\#227|atilde);/\\~{a}/g; + $result =~ s/&(\#228|auml);/\\\"{a}/g; + $result =~ s/&(\#229|aring);/{\\aa}/g; + $result =~ s/&(\#230|aelig);/{\\ae}/g; + $result =~ s/&(\#231|ccedil);/\\c{c}/g; + $result =~ s/&(\#232|egrave);/\\\`{e}/g; + $result =~ s/&(\#233|eacute);/\\\'{e}/g; + $result =~ s/&(\#234|ecirc);/\\^{e}/g; + $result =~ s/&(\#235|euml);/\\\"{e}/g; + $result =~ s/&(\#236|igrave);/\\\`{i}/g; + $result =~ s/&(\#237|iacute);/\\\'{i}/g; + $result =~ s/&(\#238|icirc);/\\^{i}/g; + $result =~ s/&(\#239|iuml);/\\\"{i}/g; + $result =~ s/&(\#240|eth);/\\ensuremath\{\\partial\}/g; + $result =~ s/&(\#241|ntilde);/\\~{n}/g; + $result =~ s/&(\#242|ograve);/\\\`{o}/g; + $result =~ s/&(\#243|oacute);/\\\'{o}/g; + $result =~ s/&(\#244|ocirc);/\\^{o}/g; + $result =~ s/&(\#245|otilde);/\\~{o}/g; + $result =~ s/&(\#246|ouml);/\\\"{o}/g; + $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g; + $result =~ s/&(\#248|oslash);/{\\o}/g; + $result =~ s/&(\#249|ugrave);/\\\`{u}/g; + $result =~ s/&(\#250|uacute);/\\\'{u}/g; + $result =~ s/&(\#251|ucirc);/\\^{u}/g; + $result =~ s/&(\#252|uuml);/\\\"{u}/g; + $result =~ s/&(\#253|yacute);/\\\'{y}/g; + $result =~ s/&(\#255|yuml);/\\\"{y}/g; + $result =~ s/&\#295;/\\ensuremath\{\\hbar\}/g; + $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g; +#Greek Alphabet + $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g; + $result =~ s/&(beta|\#946);/\\ensuremath\{\\beta\}/g; + $result =~ s/&(gamma|\#947);/\\ensuremath\{\\gamma\}/g; + $result =~ s/&(delta|\#948);/\\ensuremath\{\\delta\}/g; + $result =~ s/&(epsilon|\#949);/\\ensuremath\{\\epsilon\}/g; + $result =~ s/&(zeta|\#950);/\\ensuremath\{\\zeta\}/g; + $result =~ s/&(eta|\#951);/\\ensuremath\{\\eta\}/g; + $result =~ s/&(theta|\#952);/\\ensuremath\{\\theta\}/g; + $result =~ s/&(iota|\#953);/\\ensuremath\{\\iota\}/g; + $result =~ s/&(kappa|\#954);/\\ensuremath\{\\kappa\}/g; + $result =~ s/&(lambda|\#955);/\\ensuremath\{\\lambda\}/g; + $result =~ s/&(mu|\#956);/\\ensuremath\{\\mu\}/g; + $result =~ s/&(nu|\#957);/\\ensuremath\{\\nu\}/g; + $result =~ s/&(xi|\#958);/\\ensuremath\{\\xi\}/g; + $result =~ s/&(omicron|\#959);/o/g; + $result =~ s/&(pi|\#960);/\\ensuremath\{\\pi\}/g; + $result =~ s/&(rho|\#961);/\\ensuremath\{\\rho\}/g; + $result =~ s/&(sigma|\#963);/\\ensuremath\{\\sigma\}/g; + $result =~ s/&(tau|\#964);/\\ensuremath\{\\tau\}/g; + $result =~ s/&(upsilon|\#965);/\\ensuremath\{\\upsilon\}/g; + $result =~ s/&(phi|\#966);/\\ensuremath\{\\phi\}/g; + $result =~ s/&(chi|\#967);/\\ensuremath\{\\chi\}/g; + $result =~ s/&(psi|\#968);/\\ensuremath\{\\psi\}/g; + $result =~ s/&(omega|\#969);/\\ensuremath\{\\omega\}/g; + $result =~ s/&(thetasym|\#977);/\\ensuremath\{\\vartheta\}/g; + $result =~ s/&(piv|\#982);/\\ensuremath\{\\varpi\}/g; + $result =~ s/&(Alpha|\#913);/A/g; + $result =~ s/&(Beta|\#914);/B/g; + $result =~ s/&(Gamma|\#915);/\\ensuremath\{\\Gamma\}/g; + $result =~ s/&(Delta|\#916);/\\ensuremath\{\\Delta\}/g; + $result =~ s/&(Epsilon|\#917);/E/g; + $result =~ s/&(Zeta|\#918);/Z/g; + $result =~ s/&(Eta|\#919);/H/g; + $result =~ s/&(Theta|\#920);/\\ensuremath\{\\Theta\}/g; + $result =~ s/&(Iota|\#921);/I/g; + $result =~ s/&(Kappa|\#922);/K/g; + $result =~ s/&(Lambda|\#923);/\\ensuremath\{\\Lambda\}/g; + $result =~ s/&(Mu|\#924);/M/g; + $result =~ s/&(Nu|\#925);/N/g; + $result =~ s/&(Xi|\#926);/\\ensuremath\{\\Xi\}/g; + $result =~ s/&(Omicron|\#927);/O/g; + $result =~ s/&(Pi|\#928);/\\ensuremath\{\\Pi\}/g; + $result =~ s/&(Rho|\#929);/P/g; + $result =~ s/&(Sigma|\#931);/\\ensuremath\{\\Sigma\}/g; + $result =~ s/&(Tau|\#932);/T/g; + $result =~ s/&(Upsilon|\#933);/\\ensuremath\{\\Upsilon\}/g; + $result =~ s/&(Phi|\#934);/\\ensuremath\{\\Phi\}/g; + $result =~ s/&(Chi|\#935);/X/g; + $result =~ s/&(Psi|\#936);/\\ensuremath\{\\Psi\}/g; + $result =~ s/&(Omega|\#937);/\\ensuremath\{\\Omega\}/g; +#Arrows (extended HTML 4.01) + $result =~ s/&(larr|\#8592);/\\ensuremath\{\\leftarrow\}/g; + $result =~ s/&(uarr|\#8593);/\\ensuremath\{\\uparrow\}/g; + $result =~ s/&(rarr|\#8594);/\\ensuremath\{\\rightarrow\}/g; + $result =~ s/&(darr|\#8595);/\\ensuremath\{\\downarrow\}/g; + $result =~ s/&(harr|\#8596);/\\ensuremath\{\\leftrightarrow\}/g; + $result =~ s/&(lArr|\#8656);/\\ensuremath\{\\Leftarrow\}/g; + $result =~ s/&(uArr|\#8657);/\\ensuremath\{\\Uparrow\}/g; + $result =~ s/&(rArr|\#8658);/\\ensuremath\{\\Rightarrow\}/g; + $result =~ s/&(dArr|\#8659);/\\ensuremath\{\\Downarrow\}/g; + $result =~ s/&(hArr|\#8660);/\\ensuremath\{\\Leftrightarrow\}/g; +#Mathematical Operators (extended HTML 4.01) + $result =~ s/&(forall|\#8704);/\\ensuremath\{\\forall\}/g; + $result =~ s/&(part|\#8706);/\\ensuremath\{\\partial\}/g; + $result =~ s/&(exist|\#8707);/\\ensuremath\{\\exists\}/g; + $result =~ s/&(empty|\#8709);/\\ensuremath\{\\emptyset\}/g; + $result =~ s/&(nabla|\#8711);/\\ensuremath\{\\nabla\}/g; + $result =~ s/&(isin|\#8712);/\\ensuremath\{\\in\}/g; + $result =~ s/&(notin|\#8713);/\\ensuremath\{\\notin\}/g; + $result =~ s/&(ni|\#8715);/\\ensuremath\{\\ni\}/g; + $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g; + $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g; + $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g; + $result =~ s/–/\\ensuremath\{-\}/g; + $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g; + $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g; + $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g; + $result =~ s/&(infin|\#8734);/\\ensuremath\{\\infty\}/g; + $result =~ s/&(ang|\#8736);/\\ensuremath\{\\angle\}/g; + $result =~ s/&(and|\#8743);/\\ensuremath\{\\wedge\}/g; + $result =~ s/&(or|\#8744);/\\ensuremath\{\\vee\}/g; + $result =~ s/&(cap|\#8745);/\\ensuremath\{\\cap\}/g; + $result =~ s/&(cup|\#8746);/\\ensuremath\{\\cup\}/g; + $result =~ s/&(int|\#8747);/\\ensuremath\{\\int\}/g; + $result =~ s/&(sim|\#8764);/\\ensuremath\{\\sim\}/g; + $result =~ s/&(cong|\#8773);/\\ensuremath\{\\cong\}/g; + $result =~ s/&(asymp|\#8776);/\\ensuremath\{\\approx\}/g; + $result =~ s/&(ne|\#8800);/\\ensuremath\{\\not=\}/g; + $result =~ s/&(equiv|\#8801);/\\ensuremath\{\\equiv\}/g; + $result =~ s/&(le|\#8804);/\\ensuremath\{\\leq\}/g; + $result =~ s/&(ge|\#8805);/\\ensuremath\{\\geq\}/g; + $result =~ s/&(sub|\#8834);/\\ensuremath\{\\subset\}/g; + $result =~ s/&(sup|\#8835);/\\ensuremath\{\\supset\}/g; + $result =~ s/&(nsub|\#8836);/\\ensuremath\{\\not\\subset\}/g; + $result =~ s/&(sube|\#8838);/\\ensuremath\{\\subseteq\}/g; + $result =~ s/&(supe|\#8839);/\\ensuremath\{\\supseteq\}/g; + $result =~ s/&(oplus|\#8853);/\\ensuremath\{\\oplus\}/g; + $result =~ s/&(otimes|\#8855);/\\ensuremath\{\\otimes\}/g; + $result =~ s/&(perp|\#8869);/\\ensuremath\{\\perp\}/g; + $result =~ s/&(sdot|\#8901);/\\ensuremath\{\\cdot\}/g; +#Geometric Shapes (extended HTML 4.01) + $result =~ s/&(loz|\#9674);/\\ensuremath\{\\Diamond\}/g; +#Miscellaneous Symbols (extended HTML 4.01) + $result =~ s/&(spades|\#9824);/\\ensuremath\{\\spadesuit\}/g; + $result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g; + $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g; + $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g; + return $result; +} + + + #width, height, oddsidemargin, evensidemargin, topmargin +my %page_formats= + ('letter' => { + 'book' => { + '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'], + '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'] + }, + 'album' => { + '1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.83 in','1 cm'], + '2' => [ '4.4 in', '6.8 in','-0.5 in', '-1.5 in','3.5 in'] + }, + }, + 'legal' => { + 'book' => { + '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'], + '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in'] + }, + 'album' => { + '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'], + '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in'] + }, + }, + 'tabloid' => { + 'book' => { + '1' => ['9.8 in','16 in','-0.57 in','-0.57 in','-0.5 in'], + '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in'] + }, + 'album' => { + '1' => ['16 in','9.8 in','-0.57 in','-0.57 in','-0.5 in'], + '2' => ['16 in','4.9 in','-0.57 in','-0.57 in','-0.5 in'] + }, + }, + 'executive' => { + 'book' => { + '1' => ['6.8 in','9 in','-0.57 in','-0.57 in','1.2 in'], + '2' => ['3.1 in','9 in','-0.57 in','-0.57 in','1.2 in'] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a2' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a3' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a4' => { + 'book' => { + '1' => ['17.6 cm','27.2 cm','-0.55 in','-0.83 in','-0.5 in'], + '2' => [ '9.1 cm','27.2 cm','-0.55 in','-0.83 in','-0.5 in'] + }, + 'album' => { + '1' => ['8.5 in','7.7 in','-0.55 in','-0.83 in','0 in'], + '2' => ['3.9 in','7.7 in','-0.55 in','-0.83 in','0 in'] + }, + }, + 'a5' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a6' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + ); + +sub page_format { +# +#Supported paper format: "Letter [8 1/2x11 in]", "Legal [8 1/2x14 in]", +# "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]", +# "A2 [420x594 mm]", "A3 [297x420 mm]", +# "A4 [210x297 mm]", "A5 [148x210 mm]", +# "A6 [105x148 mm]" +# + my ($papersize,$layout,$numberofcolumns) = @_; + return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}}; +} + + +sub get_name { + my ($uname,$udom)=@_; + if (!defined($uname)) { $uname=$env{'user.name'}; } + if (!defined($udom)) { $udom=$env{'user.domain'}; } + my $plainname=&Apache::loncommon::plainname($uname,$udom); + if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; } + $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header'); + return $plainname; +} + +sub get_course { + my $courseidinfo; + if (defined($env{'request.course.id'})) { + $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); + } + return $courseidinfo; +} + +sub page_format_transformation { + my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; + my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); + + if ($selectionmade eq '4') { + $assignment='Problems from the Whole Course'; + } else { + $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); + } + ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); + + + my $name = &get_name(); + my $courseidinfo = &get_course(); + if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } + my $header_text = $parmhash{'print_header_format'}; + $header_text = &format_page_header($header_text, $assignment, + $courseidinfo, $name); + my $topmargintoinsert = ''; + if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';} + my $fancypagestatement=''; + if ($numberofcolumns eq '2') { + $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}"; + } else { + $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; + } + if ($layout eq 'album') { + $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; + } elsif ($layout eq 'book') { + if ($choice ne 'All class print') { + $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; + } else { + $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; } - @master_seq = @file_seq; -#-- produce an output string - for (my $i=0;$i<=$#master_seq;$i++) { - $_ = $master_seq[$i]; - m/\"(.*)\"/; - $_ = $1; - my $urlp = $1; - if (/\.(problem|exam|quiz|assess|survey|form|library)/) { - my %moreenv; - $moreenv{'form.grade_target'}='tex'; - &Apache::lonnet::appenv(%moreenv); - my $texversion=&Apache::lonnet::ssi($urlp); - &Apache::lonnet::delenv('form.grade_target'); - $result .= $texversion; - } - } -#-- additional cleanup for output - my $first_app = index($result,'\documentclass',0); - $first_app = index($result,'\documentclass',$first_app+5); - while ($first_app != -1) { - my $second_app = index($result,'begin{document}',$first_app); - $first_app = rindex($result,'\end{document}',$first_app); - substr($result,$first_app,$second_app-$first_app+15) = '\vskip 3 mm'; - $first_app = index($result,'\documentclass',$first_app+5); - } - } -#-- corrections for the different page formats - if ($layout eq 'CBI') { - $result =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{-40pt}\\setlength{\\evensidemargin}{-60pt}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{4\.4in}\\setlength{\\textheight}{6\.8in}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt} \\begin{document}/; - $laystyle = 'album'; - } elsif ($layout eq 'CAPA') { - my $courseidinfo = $ENV{'request.role'}; - $_ = $courseidinfo; - m/.*\/(.*)/; - $courseidinfo = $ENV{'course.physnet_'.$1.'.description'}; - $result =~ s/\\documentclass\[letterpaper\]{article}/\\documentclass\[twocolumn\]{article}/; - $result =~ s/\\begin{document}/\\textheight 25\.9cm\\oddsidemargin = -0\.57in\\evensidemargin = -0\.57in\\textwidth= 7\.7in\\renewcommand{\\ref}{\\keephidden\}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}\\noindent\\fbox{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}}}\\hskip 1\.4in $courseidinfo \\vskip 5 mm /; - $result =~ s/\\includegraphics/\\includegraphics\[width=9\.0 cm\]/g; - $result =~ s/(\\end{document})/\\newline\\noindent\\makebox\[9.0cm\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Dept\. of Physics and Astronomy, MSU\\makebox\[1.5cm\]\[b\]{\\hfill}LON-CAPA\\copyright MSU GNU\/GPS $1/; + if ($papersize eq 'a4') { + $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/; + } + } + if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} + if ($indexlist eq 'yes') { + $text=~s/(\\begin{document})/\\makeindex $1/; + $text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/; + } + return $text; +} + + +sub page_cleanup { + my $result = shift; + + $result =~ m/\\end{document}(\d*)$/; + my $number_of_columns = $1; + my $insert = '{'; + for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; } + $insert .= '}'; + $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g; + $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g; + return $result,$number_of_columns; +} + + +sub details_for_menu { + my ($helper)=@_; + my $postdata=$env{'form.postdata'}; + if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; } + my $name_of_resource = &Apache::lonnet::gettitle($postdata); + my $symbolic = &Apache::lonnet::symbread($postdata); + my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic); + $map=&Apache::lonnet::clutter($map); + my $name_of_sequence = &Apache::lonnet::gettitle($map); + if ($name_of_sequence =~ /^\s*$/) { + $map =~ m|([^/]+)$|; + $name_of_sequence = $1; + } + my $name_of_map = &Apache::lonnet::gettitle($env{'request.course.uri'}); + if ($name_of_map =~ /^\s*$/) { + $env{'request.course.uri'} =~ m|([^/]+)$|; + $name_of_map = $1; } + return ($name_of_resource,$name_of_sequence,$name_of_map); +} + +sub copyright_line { + return '\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\vspace*{-2 mm}\newline\noindent{\tiny Printed from LON-CAPA\copyright MSU{\hfill} Licensed under GNU General Public License } '; +} +my $end_of_student = "\n".'\special{ps:ENDOFSTUDENTSTAMP}'."\n"; + +sub latex_corrections { + my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; +# $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g; + my $copyright = ©right_line(); + if ($selectionmade eq '1' || $answer_mode eq 'only') { + $result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; + } else { + $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; + } + $result =~ s/\$number_of_columns/$number_of_columns/g; + $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g; + $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g; #-- LaTeX corrections my $first_comment = index($result,' + +ELEMENTHTML + + return $result; +} + + +sub preprocess { + my $self = shift; + my $helper = Apache::lonhelper::getHelper(); + + my $format = $helper->{VARS}->{$self->{'formatvar'}}; + + # If the user does not have 'pav' privilege, set default widths and + # on to the next state right away. + # + if (!$perm{'pav'}) { + my $var = $self->{'variable'}; + my $format = $helper->{VARS}->{$self->{'formatvar'}}; + + my ($laystyle, $cols, $papersize) = split(/\|/, $format); + ($papersize) = split(/ /, $papersize); + + + if ($laystyle eq 'L') { + $laystyle = 'album'; + } else { + $laystyle = 'book'; + } + # Figure out some good defaults for the print out and set them: + + my %size; + ($size{'width'}, + $size{'height'}, + $size{'lmargin'})= + &Apache::lonprintout::page_format($papersize, $laystyle, $cols); + + foreach my $dim ('width', 'height', 'lmargin') { + my ($value, $units) = split(/ /, $size{$dim}); + + $helper->{VARS}->{"$var.".$dim} = $value; + $helper->{VARS}->{"$var.".$dim.'unit'} = $units; + + } + + + # Transition to the next state + + $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"; + } else { + # Adjust for LaTeX 1.0 inch margin: + + if ($env{"form.${var}.lmarginunit"} eq "in") { + $helper->{VARS}->{$var.'.lmargin'} = $lmargin - 1; + } else { + $helper->{VARS}->{$var.'.lmargin'} = $lmargin - 2.54; + } + } + + if (!$error) { + Apache::lonhelper::getHelper()->changeState($self->{NEXTSTATE}); + return 1; + } else { + $self->{ERROR_MSG} = $error; + return 0; + } +} + + + +__END__ -#### Test block -# my $ere; -# foreach $ere (%ENV) { -# $result .= ' SS '.$ere.' => '.$ENV{$ere}.' FF '."\n\n"; -# } -#### 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.