Diff for /loncom/xml/londefdef.pm between versions 1.423 and 1.436

version 1.423, 2010/09/14 03:48:36 version 1.436, 2011/11/14 00:20:42
Line 1 Line 1
   
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Tags Default Definition Module   # Tags Default Definition Module 
 #  #
Line 43  use Apache::lonnet; Line 44  use Apache::lonnet;
 use strict;  use strict;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lontable;  use Apache::lontable;
 use Apache::File();  
 use Image::Magick;  use Image::Magick;
 use Apache::lonmenu();  use Apache::lonmenu();
 use Apache::lonmeta();  use Apache::lonmeta();
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::loncommon();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use File::Basename;  use File::Basename;
 use LONCAPA();  use LONCAPA();
Line 383  sub start_meta { Line 384  sub start_meta {
  } else {   } else {
     $currentstring = $token->[4];      $currentstring = $token->[4];
  }   }
           if ($env{'form.grade_imsexport'}) {
               $currentstring = '';
           }
     } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
  unless (&Apache::lonxml::get_param   unless (&Apache::lonxml::get_param
  ('http-equiv',$parstack,$safeeval,undef,1)) {   ('http-equiv',$parstack,$safeeval,undef,1)) {
Line 541  sub start_body { Line 545  sub start_body {
     # Breadcrumbs      # Breadcrumbs
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     if ($env{'request.state'} eq 'construct') {      if ($env{'request.state'} eq 'construct') {
           my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'});
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
             'text'  => 'Construction Space',              'text'  => 'Construction Space',
             'href'  => &Apache::loncommon::authorspace(),              'href'  => &Apache::loncommon::authorspace($url),
         });          });
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
             'text'  => 'HTML Editor',              'text'  => 'HTML Editor',
Line 589  sub start_body { Line 594  sub start_body {
 sub edit_controls {  sub edit_controls {
     my ($nochgview) = @_;      my ($nochgview) = @_;
     my $result .= '      my $result .= '
 <form method="post">  <form method="post" action="">
 <div class="LC_edit_problem_header">';  <div class="LC_edit_problem_header">';
     unless ($nochgview) {      unless ($nochgview) {
         $result .= '          $result .= '
Line 601  sub edit_controls { Line 606  sub edit_controls {
     $result .= '      $result .= '
 <div><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" />';  <div><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" />';
     if (($env{'request.course.id'}) && ($env{'form.forceedit'})) {      if (($env{'request.course.id'}) && ($env{'form.forceedit'})) {
         $result .= ('&nbsp;' x 3).'<input type="button" value="'.&mt('Course View').'" onclick="javascript:location.href=currentURL" />';          my $viewtext = &mt('Course View');
           if (&Apache::loncommon::course_type() eq 'Community') {
               $viewtext = &mt('Community View');
           }
           $result .= ('&nbsp;' x 3).'<input type="button" value="'.
                      $viewtext.'" onclick="javascript:location.href=currentURL" />';
     }      }
     $result .= '</div>      $result .= '</div>
 </div>  </div>
Line 2039  sub start_table { Line 2049  sub start_table {
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &disable_para(); # Can't have paras in a table.   &disable_para(); # Can't have paras in a table.
   
   
  #  New table code:  
   
  #  Get the parameters that we can do something about:   #  Get the parameters that we can do something about:
   
  my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0);   my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0);
Line 2058  sub start_table { Line 2065  sub start_table {
  if ((defined $border) && ($border > 0)) {   if ((defined $border) && ($border > 0)) {
  #    &Apache::lonnet::logthis("Turning on table borders: $border");   #    &Apache::lonnet::logthis("Turning on table borders: $border");
     $table->table_border(1);      $table->table_border(1);
     if ($cell_border ne 'none') {      if (!defined $cell_border) {
  $table->cell_border(1); # html specs that border turns on both...unless rules='none'.   $table->cell_border(1); # Default for rules is all if rules not defined.
     }      }
  }   }
  # Only all or nothing for cell borders for now:  
   
  if ((defined $cell_border) && ($cell_border ne 'none')) {   if ((defined $cell_border)) {
  #    &Apache::lonnet::logthis("Turning on cell borders: $cell_border");      if ($cell_border eq 'all') {
     $table->cell_border(1);   $table->cell_border(1);
       } elsif ($cell_border eq 'rows') {
    $table->cell_border(2);
       } elsif ($cell_border eq 'cols') {
    $table->cell_border(3);
       } elsif($cell_border eq 'groups') {
    $table->cell_border(4);
       } else {
    $table->cell_border(0);
       }
  }   }
  if (defined $theme) {   if (defined $theme) {
     $table->theme($theme);      $table->theme($theme);
Line 2095  sub start_table { Line 2110  sub start_table {
  push(@Apache::londefdef::table, $table);   push(@Apache::londefdef::table, $table);
         $currentstring.=' \keephidden{NEW TABLE ENTRY}';          $currentstring.=' \keephidden{NEW TABLE ENTRY}';
   
  #--------------------------------------------------------  
  #  Old table code here.  
  #--------------------------------------------------------  
   
   
  if (0) {  
  push(@Apache::londefdef::table, {});   
  $Apache::londefdef::table[-1]{'row_number'} = -1;  
         #maximum table's width (default coincides with text line length)  
  if ($#Apache::londefdef::table==0) {  
     $textwidth=&recalc($env{'form.textwidth'}); #result is always in mm  
     $textwidth=~/(\d+\.?\d*)/;  
     $textwidth=0.85*$1; #accounts "internal" LaTeX space for table frame  
  } else {  
     if ($Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]=~/\d/) {  
  #the maximum width of nested table is determined by LATeX width of parent cell  
  $textwidth=$Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}];   
     } else {  
               #try to use all space not used before (minus 5% for LaTeX table internal) - rather silly  
  $textwidth=$Apache::londefdef::table[-2]{'width'};  
  for (my $i=0;$i<$Apache::londefdef::table[-2]{'counter_columns'};$i++) {  
     $textwidth=$textwidth-$Apache::londefdef::table[-2]{'TeXlen'}[0][$i];  
  }  
     }  
  }  
   
  # width either comes forced from the TeXwidth or the width parameters.  
  # in either case it can be a percentage or absolute width.  
  # in the width case we ignore absolute width   
  my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);  
  if (!defined($TeXwidth)) {  
     my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,  
        $safeeval,undef,1);  
     if ($htmlwidth =~ /%/) {  
  $TeXwidth = $htmlwidth;  
     } else {   
  $TeXwidth = $textwidth;  
     }  
  }  
  # if the width is specified as a % it is converted to an absolute width.  
  # otherwise.. just plugged right in the hash  
   
  if ($TeXwidth=~/%/) {  
     $TeXwidth=~/(\d+)/;  
             $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;  
  } else {  
     $Apache::londefdef::table[-1]{'width'}=$TeXwidth;  
  }  
         #  In the end, however the table width cannot be wider than $textwidth...  
   
  if ($Apache::londefdef::table[-1]{'width'} > $textwidth) {  
     $Apache::londefdef::table[-1]{'width'} = $textwidth;  
  }  
         #table's border  
  my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);   
         my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);  
  unless (defined $border) { $border = 0; }  
  if ($border) {   
     $Apache::londefdef::table[-1]{'hinc'} = '\hline ';   
     $Apache::londefdef::table[-1]{'vinc'} = '&';   
     $Apache::londefdef::table[-1]{'vvinc'} = '|';  
  } else {  
     $Apache::londefdef::table[-1]{'hinc'} = '';   
     $Apache::londefdef::table[-1]{'vinc'} = '&';   
     $Apache::londefdef::table[-1]{'vvinc'} = '';  
  }  
  if ($#Apache::londefdef::table==0) {  
     #    Note that \newline seems to destroy the alignment envs.  
     # $Apache::londefdef::table[-1]{'output'}='\strut\newline\strut\setlength{\tabcolsep}{1 mm}';  
     $Apache::londefdef::table[-1]{'output'}='\strut'.'\\\\'."\n".'\strut\setlength{\tabcolsep}{1 mm}';  
  }  
  $Apache::londefdef::table[-1]{'output'}.=' \noindent \begin{tabular} ';  
         $Apache::londefdef::table[-1]{'TeXlen'}=[];  
         $Apache::londefdef::table[-1]{'objectlen'}=[];  
         $Apache::londefdef::table[-1]{'objectsignal'}=[];  
         $Apache::londefdef::table[-1]{'maxlen'}=[];  
         $Apache::londefdef::table[-1]{'minlen'}=[];  
         $Apache::londefdef::table[-1]{'content'}=[];  
         $Apache::londefdef::table[-1]{'align'}=[];  
         $currentstring.=' \keephidden{NEW TABLE ENTRY}';  
     }  
   
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 2187  sub end_table { Line 2120  sub end_table {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];     
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
   
   
  #  New table code:  
   
  my $table = pop(@Apache::londefdef::table);   my $table = pop(@Apache::londefdef::table);
  my $t     = $table->generate();   my $t     = $table->generate();
  # &Apache::lonnet::logthis("Generating string");   # &Apache::lonnet::logthis("Generating string");
  $currentstring = $t->generate_string();   $currentstring = $t->generate_string();
  # &Apache::lonnet::logthis("Generated: $currentstring");   # &Apache::lonnet::logthis("Generated: $currentstring");
  &enable_para();   &enable_para();
  #--------------------------------------------------------------  
  #  Old table code:  
  #--------------------------------------------------------------  
   
  if (0) {  
   
  my $border =  &Apache::lonxml::get_param('border',$parstack,$safeeval);  
  my $inmemory = '';  
  my $output = '';  
  my $WARNING='';  
         #width of columns from TeXwidth attributes  
   
  # Protect against unbalanced </table> tag.  
   
  if (scalar(@Apache::londefdef::table) > 0) {  
   
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
     for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {  
  if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) {  
     $Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]=$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn];  
  }  
     }  
  }  
         #free space and number of empty columns  
  my ($available_space,$empty_columns)=($Apache::londefdef::table[-1]{'width'},0);  
  if ($#Apache::londefdef::table ne 0) {$available_space=0.9*$available_space;}   
  for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {  
     if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]==0) {  
  $empty_columns++;  
     } else {  
  $available_space=$available_space-$Apache::londefdef::table[-1]{'TeXlen'}[0][$jn];  
     }  
  }  
   
         #boundaries for contents columns  
  my @min_len=();#columns can not be narrower   
  my @max_len=();#maximum length of column  
  my $avg_max;  
  my $avg_min;  
  my $counter_cols = $Apache::londefdef::table[-1]{'counter_columns'};  
  for (my $jn=0;$jn<=$counter_cols; $jn++) {  
  my ($localmin,$localmax)=(0,0);  
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
     if ($localmin<$Apache::londefdef::table[-1]{'minlen'}[$in][$jn]) {  
  $localmin=$Apache::londefdef::table[-1]{'minlen'}[$in][$jn];  
     }  
     if ($localmax<$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn]) {  
  $localmax=$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn];  
     }  
  }  
  push @min_len, $localmin;  
  push @max_len, $localmax;  
  $avg_max = $localmax + $avg_max;  
  $avg_min = $localmin + $avg_min;  
  }  
  # Does not really matter what the average max/min are if there are no cols.  
  # and this prevents div 0 in that case.  
   
  if ($counter_cols != 0) {  
     $avg_max = $avg_max/$counter_cols;  
     $avg_min = $avg_min/$counter_cols;  
  }  
   
   
  #  I don't think the below is needed.. but just in case:  
   
  if ($avg_min > $avg_max) {  
     my $temp = $avg_min;  
     $avg_min = $avg_max;  
     $avg_max = $temp;  
  }  
   
   
  for (my $jn=0;$jn<=$counter_cols;$jn++) {  
     my $localmin=0,;  
     for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
  if ($localmin<$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]) {  
     $localmin=$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn];  
  }  
     }  
     if ($max_len[$jn]<$localmin) {  
  $max_len[$jn]=$localmin;  
      $Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;  
     }#object size is bigger  
     if ($min_len[$jn]<$localmin) {  
  $min_len[$jn]=$localmin;  
  $Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;  
     }#object size is bigger  
     if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]!=0) {  
  $min_len[$jn]=0;  
  $max_len[$jn]=0;  
     }  
     #  Spans seem to be really bothered by max/min = 0.  So if we have one  
     #  make it an average joe max/min.  
       
     if ($max_len[$jn] == 0) {  
  $max_len[$jn] = $avg_max;  
     }  
     if ($min_len[$jn] == 0) {  
  $min_len[$jn] = $avg_min;  
     }  
   
  }  
        #final adjustment of column width  
  my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array  
  my @adjust=();  
         #step 1. adjustment by maximum value  
  my $space_needed=0;  
  for (my $jn=0;$jn<=$#max_len;$jn++) {  
     $space_needed=$space_needed+$max_len[$jn];  
  }  
  if ($space_needed<=$available_space) {  
   
     for (my $jn=0;$jn<=$#max_len;$jn++) {  
  if ($fwidth[$jn]==0) {  
     $fwidth[$jn]=$max_len[$jn];  
  }  
     }  
  } else {  
         #step 2. adjustment by minimum value (estimation)  
     $space_needed=0;  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  $space_needed+=$min_len[$jn];  
     }  
     if ($space_needed>$available_space) {  
  $WARNING=' \textbf{NOT ENOUGH SPACE FOR TABLE} ';  
  for (my $jn=0;$jn<=$#max_len;$jn++) {  
     if ($fwidth[$jn]==0) {  
  $fwidth[$jn]=$min_len[$jn];  
     }  
  }  
  #check if we have objects which can be scaled  
  my $how_many_to_scale=0;  
  my @to_scale=();  
  for (my $jn=0;$jn<=$#max_len;$jn++) {  
     if ($Apache::londefdef::table[-1]{'objectsignal'}[$jn] eq '1') {  
  $how_many_to_scale++;  
  push @to_scale, $jn;  
     }  
  }  
  if ($how_many_to_scale>0) {  
     my $space_to_adjust=($space_needed-$available_space)/$how_many_to_scale;  
     foreach my $jn (@to_scale) {  
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
     $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/;  
     if ($1 ne '') {  
  my $current_length=&recalc($1);  
  $current_length=~/(\d+\.?\d*)/;  
  $current_length=$current_length-$space_to_adjust;  
  $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/width=$current_length mm/;  
     }  
     $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/\[(\d+\.?\d*)\s*mm\]/;  
     if ($1 ne '') {  
  my $current_length=$1;  
  $current_length=$current_length-$space_to_adjust;  
  $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/\[(\d+\.?\d*)\s*mm\]/\[$current_length mm\]/;  
     }  
  }  
  $fwidth[$jn]=$fwidth[$jn]-$space_to_adjust;  
     }  
  }  
     } else {  
       #step 3. adjustment over minimal + corrections  
  my $enlarge_coef=$available_space/$space_needed;  
  my $acsessive=0;  
  for (my $jn=0;$jn<=$#min_len;$jn++) {  
     $adjust[$jn]=$min_len[$jn]*$enlarge_coef;  
     if ($adjust[$jn]>$max_len[$jn]) {  
  $fwidth[$jn]=$max_len[$jn];  
  $acsessive=$acsessive+$adjust[$jn]-$max_len[$jn];  
  $adjust[$jn]=0;  
   
     }  
  }  
  if ($acsessive>0) {  
  #we have an excess of space and can redistribute it  
     my $notempty_columns=0;  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  if ($adjust[$jn]!=0) {  
     $notempty_columns++;  
  }  
     }  
     my $per_column=$acsessive/$notempty_columns;  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  if ($adjust[$jn]!=0) {  
     $adjust[$jn]+=$per_column;  
     $fwidth[$jn]=$adjust[$jn];  
  }  
     }  
  } else {  
     for (my $jn=0;$jn<=$#min_len;$jn++) {  
  $fwidth[$jn]=$adjust[$jn];  
     }  
  }  
     }  
  }  
         # use all available width or specified width as if not specified,  
  # the specified width gets defaulted to the available width.  
   
  my $current=0;   
  for (my $i=0;$i<=$#fwidth;$i++) {    
     $current+=$fwidth[$i];  
  }  
  if ($current == 0) {  
             $current = $Apache::londefdef::table[-1]{'width'};  
         }  
  my $coef=$Apache::londefdef::table[-1]{'width'}/$current;  
  for (my $i=0;$i<=$#fwidth;$i++) {    
     $fwidth[$i]*=$coef;  
  }  
         #removing of empty columns if allowed  
         my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);  
  if ($permission eq 'yes') {  
     my @cleaned_table=();  
             my @cleaned_header=();  
     my $colind=0;  
     for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {  
  if ($fwidth[$jn]!=0) {  
     #we need to copy column  
     for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
  $cleaned_table[$in][$colind]=$Apache::londefdef::table[-1]{'content'}[$in][$jn];  
  $cleaned_header[$colind]=$fwidth[$jn];  
     }  
     $colind++;  
  }  
     }  
     $Apache::londefdef::table[-1]{'content'}=\@cleaned_table;  
     @fwidth=@cleaned_header;  
  }  
   
   
  #construct header of the table  
  my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};  
  for (my $in=0;$in<=$#fwidth;$in++) {  
     $header_of_table.='p{'.$fwidth[$in].' mm}'.$Apache::londefdef::table[-1]{'vvinc'};  
  }  
  $header_of_table .= '}';  
   
  #fill the table  
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {  
     my $have_rowspan = 0;  
     for (my $jn=0;$jn<=$#fwidth;$jn++) {  
   
  #-----------------------------------------------------------  
                 #   I think this order of doing things will ensure that  
  #   single rowspan, columspan and combined row/colspans will  
                 #   work correctly.  LaTeX is delicate here.  
  #    RF.  
   
  # Start a rowspan if necessary:  
   
  my $primary_col_width = $fwidth[$jn]; # Width of primary column.  
  my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];  
  my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn];  
  #  
  #  Do the appropriate magic if this has a colspan  
  #   
   
  my $border_char = "";  
  if ($border) {  
     $border_char = "|";  
  }  
  my $spanwidth = 0;  
  if ($colspan > 1) {  
     for (my $spancol = $jn; $spancol < $jn + $colspan; $spancol++) {  
  $spanwidth += $fwidth[$spancol];  
     }  
     $output .= '\multicolumn{'.  
  $colspan  
  ."}";  
     if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {  
  $output .= '{'.$border_char.'c'.$border_char.'}{';  
     } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {  
  $output .= '{'.$border_char.'r'.$border_char.'}{';  
     }  
     else {  
  $output .= '{'.$border_char."p{$spanwidth mm}".$border_char.'}{';  
     }  
       
  } else {  
     $spanwidth = $primary_col_width; # If no span width will be just colwidth  
  }  
   
  # Rowspan... if colspan is 1, and there's an alignment we'll need  
  # to kick in a multicolumn in order to get the alignment spec.  
  # this must precede the multirow or LaTex gets quite upset.  
  # Naturally if colspan > 1 we've already done that above ^  
  #  
  my $multirow_aligned = 0;  
  if ($rowspan > 1) {  
     if ($colspan == 1) {  
  if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {  
     $output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';  
     $multirow_aligned = 1;  
  } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {  
     $output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';  
     $multirow_aligned = 1;  
  }  
     }  
     $have_rowspan++;  
     if ($multirow_aligned) {  
  $output .= '\multirow{'.$rowspan.'}[0]{*}{';  
     } else {  
  $output .= '\multirow{'.$rowspan."}[0]{$spanwidth mm}{";  
     }  
       
     $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~  
  s{^\s*\\par\s*}{};  
     $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~  
  s{\s*\\vskip\s*0pt\s*$}{};  
     
     #  
     # If we did not throw in a multicolumn to align, then add   
     # an extra {  
     # so we close correctly without having to keep additional state  
     # around  
     #  
     if (!$multirow_aligned) {  
  $output .= '{';  
     }  
  }  
  if (($rowspan eq '^') || ($rowspan eq '_')) {  
     $have_rowspan++;  
  }  
     #--------------------------------------------------------------  
   
   
  # For right and center alignment of single cells.  
  # we are going to use a multicolumn with a span of 1 to specify alignment.  
  #  
  if ($colspan == 1  && $rowspan == 1) {  
     if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {  
  $output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';  
     } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {  
  $output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';  
     }  
  }  
   
  $output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn];  
   
  if (($colspan == 1 && $rowspan == 1)   &&  
     (($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') ||  
      ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r'))) {  
     $output .= '}';  
  }  
   
  # Close off any open multirow:  
   
  if ($rowspan > 1) {  
     $output .= '}}';  
  }  
  #  Close off the colspan...  
  #  
  if ($colspan > 1)  {  
     $output .= '}';  
     $jn += $colspan-1; # Adjust for number of rows really left.  
  }  
                 if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};}  
     }  
     #  If have_rowspan > 0, and borders are on, then   
     #  we need to do more than put an \hline at the bottom of row.  
     #  we need to do the appropriate \cline to ensure that  
     #  the spanned rows don't have \hlines through them.  
   
     if (($Apache::londefdef::table[-1]{'hinc'} =~ /\\hline/) && $have_rowspan) {  
  $output .= ' \\\\ ';  
  for (my $jn=0; $jn<=$#fwidth;$jn++) {  
     my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];  
     if ($rowspan ne "^") {  
  if (($rowspan <= 1) || ($rowspan eq '_')) {  
     my $column = $jn+1;  
     $output .= '\cline{'.$column.'-'.$column.'} ';  
  }  
     }  
  }  
   
     } else {  
  $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';  
     }  
  }  
  # Note that \newline destroys alignment env's produced  by e.g. <div>  
  # $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut ';  
  $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut'.'\\\\'."\n".'\strut ';  
  if ($#Apache::londefdef::table > 0) {      
     my $inmemory = $Apache::londefdef::table[-1]{'output'};  
     # Figure out max/and min width  by summing us and then  
     # apply that to the current column of the table we nest in  
     # if it's larger than the current width or the current width  
     # is undefined.  
     #  
     my $min_nested_width = 0;  
     my $max_nested_width = 0;  
     for (my $col = 0; $col <= $Apache::londefdef::table[-1]{'counter_columns'}; $col++) {  
  $min_nested_width +=  $min_len[$col];  
  $max_nested_width +=  $max_len[$col];  
   
     }  
     # Fudge in an extra 5 mm for borders etc:  
       
     $min_nested_width += 5;  
     $max_nested_width += 5;  
   
     my $outer_column = $Apache::londefdef::table[-2]{'counter_columns'};  
     my $outer_row    = $Apache::londefdef::table[-2]{'row_number'};  
     if ($min_nested_width > $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column]) {  
  $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column] = $min_nested_width;  
     }  
     if ($max_nested_width > $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column]) {  
  $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column] = $max_nested_width;  
     }  
   
     pop @Apache::londefdef::table;  
     push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory;  
  } else {  
     $currentstring .= $Apache::londefdef::table[-1]{'output'};  
     pop @Apache::londefdef::table;  
     undef @Apache::londefdef::table;  
  }  
  }  
  &enable_para();  
     }  
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 2734  sub tag_check { Line 2245  sub tag_check {
 #  #
   
 sub cell_config_hash {  sub cell_config_hash {
     my ($align, $rowspan, $colspan) = @_;      my ($align, $rowspan, $colspan, $width) = @_;
       if ($rowspan ne '') {
           $rowspan =~ s/^\s+|\s+$//g; 
       }
       if ($colspan ne '') {
           $colspan =~ s/^\s+|\s+$//g;
       }
     my %config;      my %config;
     if ($align ne '') {      if ($align ne '') {
  $config{'halign'} = $align;   $config{'halign'} = $align;
     }      }
     if ($colspan ne "") {      if (($colspan =~ /^\d+$/) && ($colspan > 0)) {
  $config{'colspan'} = $colspan;   $config{'colspan'} = $colspan;
     }      }
     if ($rowspan ne '') {      if (($rowspan =~ /^\d+$/) && ($rowspan > 0)) {
  $config{'rowspan'} = $rowspan;   $config{'rowspan'} = $rowspan;
     }      }
       if ($width ne '') {
    $config{'width'} = $width;
       }
     return \%config;      return \%config;
 }  }
     
Line 2756  sub start_td_tex { Line 2276  sub start_td_tex {
     # attributes, but empty of text.  end_td_tex will      # attributes, but empty of text.  end_td_tex will
     # fetch the contents from the recursive parse and      # fetch the contents from the recursive parse and
     # fill the cell with them:      # fill the cell with them:
     my $align   = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);      my $align   = &Apache::lonxml::get_param('align', $parstack, $safeeval);
     my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1);      my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval);
     my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1);      my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval);
       my $width   = &Apache::lonxml::get_param('TeXwidth', $parstack, $safeeval);
     my $config = &cell_config_hash($align, $rowspan, $colspan);      my $config = &cell_config_hash($align, $rowspan, $colspan, $width);
   
     my $table = $Apache::londefdef::table[-1];      my $table = $Apache::londefdef::table[-1];
     $table->add_cell('', $config);      $table->add_cell('', $config);
Line 3366  sub start_applet { Line 2886  sub start_applet {
     &Apache::lonxml::extlink($archive);      &Apache::lonxml::extlink($archive);
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
         $currentstring = &Apache::lonenc::encrypt_ref($token,          $currentstring = $token->[4];
                                                       {'code'=>$code,  
                                                        'archive'=>$archive}  
                                                      );  
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
         # Turn off some stuff we can't be inside thank you LaTeX          # Turn off some stuff we can't be inside thank you LaTeX
   
Line 3867  sub end_col { Line 3384  sub end_col {
     return $currentstring;      return $currentstring;
 }  }
   
 #-- <colgroup> tag (end tag optional)  #-- <colgroup tag (end tag optional)
 sub start_colgroup {  sub start_colgroup {
     my ($target,$token) = @_;      my ($target,$token,$tagstack, $parstack, $parser, $safeeval, $style) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
    # TODO: Ensure this tag is in a table:
   
    # Fetch the attributes and build the hash for the
    # call to define_colgroup.
   
    my $span    = &Apache::lonxml::get_param('span',   $parstack, $safeeval);
    my $halign  = &Apache::lonxml::get_param('halign', $parstack, $safeeval);
   
    my %colgroup_params;
    if ($span ne '') {
       $colgroup_params{'span'} = $span;
    }
    if ($halign ne '') {
       $colgroup_params{'halign'} = $halign;
    }
   
    my $table = $Apache::londefdef::table[-1];
    $table->define_colgroup(\%colgroup_params);
   
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4367  sub start_tbody { Line 3905  sub start_tbody {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
    # TODO: Ensure this tag is within a table:
   
    my $table = $Apache::londefdef::table[-1];
    $table->start_body();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4376  sub end_tbody { Line 3920  sub end_tbody {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];    
     }       } 
       if($target eq 'tex') {
    # TODO: Ensure this tag is within a table:
   
    my $table = $Apache::londefdef::table[-1];
    $table->end_body();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4386  sub start_tfoot { Line 3936  sub start_tfoot {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
           # TODO: ensure this is within a table tag.
    my $table = $Apache::londefdef::table[-1];
    $table->start_foot();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4395  sub end_tfoot { Line 3950  sub end_tfoot {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];    
     }       } 
       if ($target eq 'tex') {
    #  TODO: Ensure this is in side a table 
    my $table = $Apache::londefdef::table[-1];
    $table->end_foot();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4405  sub start_thead { Line 3965  sub start_thead {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
       if ($target eq 'tex') {
    # Assume we're in a table... TODO: Verify that and ignore tag if not.
    my $table = $Apache::londefdef::table[-1];
    $table->start_head();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4414  sub end_thead { Line 3979  sub end_thead {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];    
     }       } 
       if ($target eq 'tex') {
         # TODO: Verify we are in a table and ignore tag if not.
   
    my $table = $Apache::londefdef::table[-1];
    $table->end_head();
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4616  sub get_eps_image { Line 4187  sub get_eps_image {
   
  #if replication failed try to produce eps file dynamically   #if replication failed try to produce eps file dynamically
  $src=~s/\.ps$/\.eps/;   $src=~s/\.ps$/\.eps/;
  my $temp_file;   if (open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat")) {
  open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");      my $newsrc=$orig_src;
  my $newsrc=$orig_src;      $newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;
  $newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;      &Apache::lonxml::debug("queueing $newsrc for dynamic eps production.");
  &Apache::lonxml::debug("queueing $newsrc for dynamic eps production.");      print FILE ("$newsrc\n");
  print FILE ("$newsrc\n");      close(FILE);
  close(FILE);                  }
  $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;   $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
  $src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;   $src=~s|/home/httpd/html/priv/[^/]+/([^/]*)/|/home/httpd/prtspool/$1/|;
  if ($sext ne "") { # Put the ext. back in to uniquify.   if ($sext ne "") { # Put the ext. back in to uniquify.
     $src =~ s/\.eps$/$sext.eps/;      $src =~ s/\.eps$/$sext.eps/;
  }   }
Line 4643  sub get_eps_image { Line 4214  sub get_eps_image {
  print FILE "$src\n";   print FILE "$src\n";
  close FILE;   close FILE;
  $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;   $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
  $src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;   $src=~s|/home/httpd/html/priv/[^/]+/([^/]*)/|/home/httpd/prtspool/$1/|;
     }      }
     my ($path,$file)=($src=~m|(.*)/([^/]*)$|);      my ($path,$file)=($src=~m|(.*)/([^/]*)$|);
     $path =~ s/ /\_/g;      $path =~ s/ /\_/g;
Line 4655  sub get_eps_image { Line 4226  sub get_eps_image {
 sub eps_generation {  sub eps_generation {
     my ($src,$file,$width_param) = @_;           my ($src,$file,$width_param) = @_;     
     my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";      my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
     my $temp_file = Apache::File->new('>>'.$filename);       if (open(my $tmpfile,">>$filename")) { 
     print $temp_file "$src\n";          print $tmpfile "$src\n";
           close($tmpfile);
       }
     my $newsrc = $src;      my $newsrc = $src;
     $newsrc =~ s/(\.bmp|\.gif|\.jpg|\.jpeg)$/\.eps/i;      $newsrc =~ s/(\.bmp|\.gif|\.jpg|\.jpeg)$/\.eps/i;
     $newsrc=~s{/home/httpd/html/res}{};      $newsrc=~s{/home/httpd/html/res}{};
     $newsrc=~s{/home/($LONCAPA::username_re)/public_html/}{/$1/};      $newsrc=~s{/home/httpd/html/priv/[^/]+/($LONCAPA::username_re)/}{/$1/};
     $newsrc=~s{/\./}{/};      $newsrc=~s{/\./}{/};
     $newsrc=~s{/([^/]+)\.(ps|eps)}{/};      $newsrc=~s{/([^/]+)\.(ps|eps)}{/};
     if ($newsrc=~m{/home/httpd/lonUsers/}) {      if ($newsrc=~m{/home/httpd/lonUsers/}) {

Removed from v.1.423  
changed lines
  Added in v.1.436


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
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.