--- loncom/interface/lonprintout.pm 2003/02/07 19:47:48 1.112 +++ loncom/interface/lonprintout.pm 2006/08/03 00:26:39 1.475 @@ -1,7 +1,8 @@ +# # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.112 2003/02/07 19:47:48 sakharuk Exp $ +# $Id: lonprintout.pm,v 1.475 2006/08/03 00:26:39 albertel 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; @@ -49,1313 +39,3144 @@ use Apache::grades; use Apache::edit; use Apache::File(); use Apache::lonnavmaps; +use Apache::lonratedt; use POSIX qw(strftime); -use GDBM_File; +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; + +} -my %hash; -my $LaTeXwidth = 0; +# +# 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 - - -
-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; +} - if ($ENV{'form.postdata'}=~m|^/res/|) { - $r->print(<Path to current document: $ENV{'form.postdata'}

-ENDHEADER1 +# 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); } + } +# 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. -sub menu_for_output { - my $r = shift; - my ($title_for_single_resource,$title_for_sequence,$title_for_main_map) = &details_for_menu; - my $assignment = $title_for_sequence; - if ($title_for_single_resource ne '') {$title_for_single_resource = '"'.$title_for_single_resource.'"';} - if ($title_for_sequence ne '') {$title_for_sequence = '"'.$title_for_sequence.'"';} - if ($title_for_main_map ne '') {$title_for_main_map = '"'.$title_for_main_map.'"';} - $ENV{'form.postdata'} =~ s|http://[^/]+||; - my $subdir_to_print = $ENV{'form.postdata'}; - $subdir_to_print =~ m/\/([^\/]+)$/; - $subdir_to_print =~ s/\Q$1\E//; - $r->print(<What do you want to print? Make a choice.
- - - - Current document $title_for_single_resource -(prints what you just saw on the screen)
-ENDMENUOUT1 - if ($ENV{'form.postdata'}=~/\/res\//) { - $r->print(< Problem(s) from $title_for_sequence
- Problem(s) plus page(s) or html/xml file(s) from $title_for_sequence
-ENDMENUOUT2 - } - 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(< All problems in this course (warning: this may be time consuming)
-
- All problems from $title_for_sequence for selected students

-ENDMENUOUT6 + 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: + # + + my ($l1,$f1) = split(/,/, $n1); + my ($l2,$f2) = split(/,/, $n2); + + # We don't bother to remove the leading/trailing whitespace from the + # firstname, unless the last names compare identical. + + if($l1 lt $l2) { + return -1; + } + if($l1 gt $l2) { + return 1; } - my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'}); - $subdirtoprint =~ s/\/[^\/]+$//; - if ((&Apache::lonnet::allowed('bre',$subdirtoprint) eq 'F') and ($ENV{'form.postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) { - $r->print(< Problems from current subdirectory $subdir_to_print
-ENDMENUOUT4 - } - $r->print(<



-

And what page format do you prefer?

- - - - - - - -
- Landscape
- Portrait
-
  - Number of columns: - - Paper size (format [width x height]): -
-
- -ENDMENUOUT5 + # 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; -sub sequence_content_menu { - my ($key_to,$r) = @_; - my $primary_sequence; - my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'}); - my @sequence = split('___',$symbolic); - if ($sequence[0]=~/^uploaded/) {$primary_sequence = '/'.$sequence[0];} - else {$primary_sequence = '/res/'.$sequence[0];} - my @master_seq = &coming_from_hash($primary_sequence); - my @titles_master_seq = (); - for (my $i=0;$i<=$#master_seq;$i++) { - my ($path,$title,$symb) = split /&&/,$master_seq[$i]; - $master_seq[$i] = $path.'&&'.$symb; - push @titles_master_seq, $title; - } - my @master_seq_view = @master_seq; - if ($ENV{'user.adv'}) { - for (my $i=0;$i<=$#master_seq_view;$i++) { - $master_seq_view[$i]=~/___\d+___(.+)$/; - $master_seq_view[$i]='/'.$1; - } + 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 { - for (my $i=0;$i<=$#master_seq_view;$i++) { - $master_seq_view[$i]=' '; - } - } - $r->print(< - - - - - -

Mark item(s) which you want to print

- -DDD=$#titles_master_seq $titles_master_seq[0]
-  -  - -

-ENDMENUOUT1 - my $inc=0; - for (my $i=0;$i<=$#master_seq_view;$i++) { - if ($key_to==1 && $master_seq[$i]=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { - $r->print('
'."\n".''. - $titles_master_seq[$i].'   '.$master_seq_view[$i].''); - $inc++; - } elsif ($key_to==0 && $master_seq[$i]=~/\.(problem|exam|quiz|assess|survey|form|library|xml|htm|html|page)$/) { - $r->print('
'."\n".''. - $titles_master_seq[$i].'   '.$master_seq_view[$i].''); - $inc++; - } - } - $r->print(<
- - -  -  - -ENDMENUOUT2 +} +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; } -sub problem_choice_menu { - my $r = shift; - my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'}); - $subdirtoprint =~ s/\/[^\/]+$//; - my @list_of_files = (); - my @content_directory = (); - if ($subdirtoprint =~ m|/home/([^/]+)/public_html|) { - #localmachine CSTR space - my $user=$1; - my $domain=$Apache::lonnet::perlvar{'lonDefDomain'}; - @content_directory = &Apache::lonnet::dirlist($subdirtoprint, - $domain, $user,''); - } else { - #local library server res space (allows to print only from the own library server) - @content_directory = &Apache::lonnet::dirlist($subdirtoprint,$ENV{'user.domain'}, $ENV{'user.name'},''); + #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'); } - for (my $iy=0;$iy<=$#content_directory;$iy++) { - my @tempo_array = split(/&/,$content_directory[$iy]); - if ($tempo_array[0] =~ m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/) { - push(@list_of_files,$tempo_array[0]); - } - } - $subdirtoprint =~ s/\/$//; - for (my $i=0;$i<=$#list_of_files;$i++) { - $list_of_files[$i] = $subdirtoprint.'/'.$list_of_files[$i]; - } - $r->print(< - - - -

Mark problems which you want to print

- -  -  - -

-ENDMENUOUT1 - my $i=0; - foreach my $file (sort @list_of_files) { - $r->print('
'. - $file); - $i++; + 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 /; + } + 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/; } - $r->print(<
- - - -  -  - -ENDMENUOUT2 + return $text; } -sub additional_class_menu { - my $r = shift; - $r->print(< - - - - -

Select student(s) whose assignment you want to print

-ENDMENUOUT1 - my %courselist=&Apache::lonnet::dump( - 'classlist', - $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); - my $now=time; - $r->print(< - function checkall() { - for (i=0; i{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); +} - function uncheckall() { - for (i=0; i -  - -  - -

-ENDDISHEADER - my $i = 0; - foreach (sort keys %courselist) { - my ($end,$start)=split(/\:/,$courselist{$_}); - my $active=1; - if (($end) && ($now>$end)) { $active=0; } - if ($active) { - my ($sname,$sdom)=split(/\:/,$_); - my %reply=&Apache::lonnet::get('environment', - ['firstname','middlename','lastname','generation'], - $sdom,$sname); - my $section=&Apache::lonnet::usection - ($sdom,$sname,$ENV{'request.course.id'}); - $r->print( - '
'. - $reply{'firstname'}.' '. - $reply{'middlename'}.' '. - $reply{'lastname'}.' '. - $reply{'generation'}. - ' ('.$_.') '.$section); - $i++; - } + $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,'',$first_comment); + substr($result,$first_comment,$end_comment-$first_comment+3) = ''; + $first_comment = index($result,'',$first_comment); - substr($result,$first_comment,$end_comment-$first_comment+3) = ''; - $first_comment = index($result,' + +ELEMENTHTML return $result; } -sub handler { +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; + + } + - my $r = shift; + # Transition to the next state + + $helper->changeState($self->{NEXTSTATE}); + } + + return 1; +} - 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; } +sub postprocess { + my $self = shift; - $r->content_type('text/html'); - $r->send_http_header; - $r->print(&Apache::loncommon::bodytag("Printing")); + 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 ($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); + 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 { - $ENV{'form.phase'} = 'four'; + $helper->{VARS}->{$var.'.lmargin'} = $lmargin - 2.54; } } -#-- core part - if ($ENV{'form.phase'} eq 'four') { - &output_data($r); - } - untie %hash; - return OK; - -} + + if (!$error) { + Apache::lonhelper::getHelper()->changeState($self->{NEXTSTATE}); + return 1; + } else { + $self->{ERROR_MSG} = $error; + return 0; + } +} + -1; __END__ 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.