Diff for /loncom/xml/lontable.pm between versions 1.7 and 1.8

version 1.7, 2008/12/29 11:57:37 version 1.8, 2009/01/20 12:01:01
Line 56 Line 56
 package Apache::lontable;  package Apache::lontable;
 use strict;  use strict;
 use LaTeX::Table;  use LaTeX::Table;
   use Apache::lonnet; # for trace logging.
   
   my $tracing = 0; # Set to 1 to enable log tracing. 2 for local sub tracing.
   
 =pod  =pod
   
Line 135  when the table text is generated. Line 137  when the table text is generated.
   
 =item width  =item width
   
 The width of the table.  This can be expressed as fractions of full width, or in any  The width of the table.   in any
 TeX unit measure e.g. 0.75 for 75% of the width, or 10.8cm  This forces the table to the  TeX unit measure e.g.  10.8cm  This forces the table to the
 tabularx environment.  tabularx environment.  It also forces the declarations for
   cells to be paragraph mode which supports more internal formatting.
   
 =back  =back
   
Line 252  The contents of the cell. Line 255  The contents of the cell.
 sub new {  sub new {
     my ($class, $configuration) = @_;      my ($class, $configuration) = @_;
   
       if($tracing) {&Apache::lonnet::logthis("new table object");}
   
     #  Initialize the object member data with the default values      #  Initialize the object member data with the default values
     #  then override with any stuff in $configuration.      #  then override with any stuff in $configuration.
   
Line 298  Regardless, the current alignment is use Line 303  Regardless, the current alignment is use
 sub alignment {  sub alignment {
     my ($self, $new_value) = @_;      my ($self, $new_value) = @_;
   
       if ($tracing) {&Apache::lonnet::logthis("alignment = $new_value");}
   
     if (defined($new_value)) {      if (defined($new_value)) {
  $self->{'alignment'} = $new_value;   $self->{'alignment'} = $new_value;
     }      }
Line 323  the final value of the outer_border requ Line 330  the final value of the outer_border requ
 sub table_border {  sub table_border {
     my ($self, $new_value) = @_;      my ($self, $new_value) = @_;
   
       if ($tracing) {&Apache::lonnet::logthis("table_border $new_value");}
   
     if (defined($new_value)) {      if (defined($new_value)) {
  $self->{'outer_border'} = $new_value;   $self->{'outer_border'} = $new_value;
     }      }
Line 348  value of that configuration parameter is Line 357  value of that configuration parameter is
   
 sub cell_border {  sub cell_border {
     my ($self, $new_value) = @_;      my ($self, $new_value) = @_;
       if($tracing) {&Apache::lonnet::logthis("cell_border: $new_value"); }
     if (defined($new_value)) {      if (defined($new_value)) {
  $self->{'inner_border'} = $new_value;   $self->{'inner_border'} = $new_value;
     }      }
Line 373  the table.  If a parameter is supplied i Line 382  the table.  If a parameter is supplied i
 sub caption {  sub caption {
     my ($self, $new_value) = @_;      my ($self, $new_value) = @_;
   
       if($tracing) {&Apache::lonnet::logthis("caption: $new_value"); }
     if (defined($new_value)) {      if (defined($new_value)) {
  $self->{'caption'} = $new_value;   $self->{'caption'} = $new_value;
     }      }
Line 397  will be the new theme selection. Line 407  will be the new theme selection.
   
 sub theme {  sub theme {
     my ($self, $new_value) = @_;      my ($self, $new_value) = @_;
       if($tracing) {&Apache::lonnet::logthis("theme $new_value"); }
     if (defined($new_value)) {      if (defined($new_value)) {
  $self->{'theme'} = $new_value;   $self->{'theme'} = $new_value;
     }      }
Line 412  Gets and optionally sets the width of th Line 422  Gets and optionally sets the width of th
   
 =head 3 Examples:  =head 3 Examples:
   
  $table->width("0.8");    # 80% of the column width.  
  my $newwidth = $table->width("10cm");   # 10cm width returns "10cm".   my $newwidth = $table->width("10cm");   # 10cm width returns "10cm".
   
 =cut  =cut
 sub width {  sub width {
     my ($self, $new_value) = @_;      my ($self, $new_value) = @_;
       if($tracing) {&Apache::lonnet::logthis("width = $new_value"); }
   
     if (defined($new_value)) {      if (defined($new_value)) {
  $self->{'width'} = $new_value;   $self->{'width'} = $new_value;
     }      }
Line 454  The default vertical alignment of the ro Line 465  The default vertical alignment of the ro
   
 sub start_row {  sub start_row {
     my ($self, $config) = @_;      my ($self, $config) = @_;
       if($tracing) {&Apache::lonnet::logthis("start_row"); }
     if ($self->{'row_open'}) {       if ($self->{'row_open'}) { 
  $self->end_row();   $self->end_row();
     }      }
Line 495  Closes off a row.  Once closed, cells ca Line 506  Closes off a row.  Once closed, cells ca
   
 sub end_row {  sub end_row {
     my ($self) = @_;      my ($self) = @_;
       if($tracing) {&Apache::lonnet::logthis("end_row"); }
     if ($self->{'row_open'}) {      if ($self->{'row_open'}) {
   
  # Mostly we need to determine if this row has the maximum   # Mostly we need to determine if this row has the maximum
Line 543  The default vertical alignment for text Line 554  The default vertical alignment for text
   
 sub configure_row {  sub configure_row {
     my ($self, $config) = @_;      my ($self, $config) = @_;
       if($tracing) {&Apache::lonnet::logthis("configure_row");}
     if (!$self->{'row_open'}) {      if (!$self->{'row_open'}) {
  $self->start_row();   $self->start_row();
     }      }
Line 601  Number of columns the cell spans. Line 612  Number of columns the cell spans.
 sub add_cell {  sub add_cell {
     my ($self, $text, $config) = @_;      my ($self, $text, $config) = @_;
   
       if($tracing) {&Apache::lonnet::logthis("add_cell : $text"); }
   
     # If a row is not open, we must open it:      # If a row is not open, we must open it:
   
     if (!$self->{'row_open'}) {      if (!$self->{'row_open'}) {
Line 627  sub add_cell { Line 640  sub add_cell {
  # end point of the pulled down cell.   # end point of the pulled down cell.
   
  my $prior_cell = $last_row->{'cells'}->[$prior_cell_index];   my $prior_cell = $last_row->{'cells'}->[$prior_cell_index];
    if (!defined($prior_cell)) {
       last;
    }
  if (($prior_cell->{'start_col'} == $last_coord) &&   if (($prior_cell->{'start_col'} == $last_coord) &&
     ($prior_cell->{'rowspan'}  > 1)) {      ($prior_cell->{'rowspan'}  > 1)) {
           
Line 666  sub add_cell { Line 682  sub add_cell {
     $current_row->{'cell_width'} += $cell->{'colspan'};      $current_row->{'cell_width'} += $cell->{'colspan'};
   
     push(@$current_cells, $cell);      push(@$current_cells, $cell);
   
       if ($tracing) { &Apache::lonnet::logthis("add_cell done"); }
 }  }
   
   
   =pod
   
   =head2  append_cell_text
   
   Sometimes it's necessary to create/configure the cell and then later add text to it.
   This sub allows text to be appended to the most recently created cell.
   
   =head3 Parameters
   
   The text to add to the cell.
   
   =cut
   sub append_cell_text {
       my ($this, $text) = @_;
   
       if($tracing) {&Apache::lonnet::logthis("append_cell_text: $text"); }
       my $rows         = $this->{'rows'};
       my $current_row  = $rows->[-1];
       my $cells        = $current_row->{'cells'};
       my $current_cell = $cells->[-1];
       $current_cell->{'contents'} .= $text;
       
   }
   
   
 =pod  =pod
   
 =head2 generate  =head2 generate
Line 681  The caller can then ask the table object Line 725  The caller can then ask the table object
 =cut  =cut
 sub generate {  sub generate {
     my ($this) = @_;      my ($this) = @_;
       my $useP   = 0;
       my $colwidth;
       my $colunits;
   
       if($tracing) {&Apache::lonnet::logthis("generate"); }
     my $table = LaTeX::Table->new();      my $table = LaTeX::Table->new();
       $table->set_center(0); # loncapa tables don't float.
       $table->set_environment(0);
   
   
     # Add the caption if supplied.      # Add the caption if supplied.
   
     if ($this->{'caption'} ne "") {      if ($this->{'caption'} ne "") {
  $table->set_caption($this->caption);   $table->set_caption($this->caption);
     }      }
   
           
     # Set the width if defined:      # Set the width if defined:
   
     if (defined ($this->{'width'})) {      if (defined ($this->{'width'})) {
  $table->set_width($this->{'width'});  # $table->set_width($this->{'width'});
  $table->set_width_environment('tabularx');  # $table->set_width_environment('tabularx');
    $useP = 1;
    ($colwidth, $colunits) = split(/ /, $this->{'width'});
    $colwidth = $colwidth/$this->{'column_count'};
   
     }      }
   
     # Build up the data:      # Build up the data:
Line 715  sub generate { Line 769  sub generate {
  my $startcol   = 1;   my $startcol   = 1;
  my @underlines; # Array of \cline cells if cellborder on.   my @underlines; # Array of \cline cells if cellborder on.
   
   
  for (my $cell  = 0; $cell < $cell_count; $cell++) {   for (my $cell  = 0; $cell < $cell_count; $cell++) {
     my $contents = $cells->[$cell]->{'contents'};      my $contents = $cells->[$cell]->{'contents'};
   
Line 732  sub generate { Line 787  sub generate {
     # Create the horizontal alignment character:      # Create the horizontal alignment character:
   
     my $col_align = 'l';      my $col_align = 'l';
       my $embeddedAlignStart = "";
       my $embeddedAlignEnd   = "";
   
     if ($halign eq 'right') {      if ($halign eq 'right') {
  $col_align = 'r';   $col_align = 'r';
    $embeddedAlignStart = '\begin{flushright} ';
    $embeddedAlignEnd   = ' \end{flushright}';
     }      }
     if ($halign eq 'center') {      if ($halign eq 'center') {
  $col_align = 'c';   $col_align = 'c';
    $embeddedAlignStart = '\begin{center}';
    $embeddedAlignEnd   = '\end{center}';
     }      }
   
       # If the width has been specified, turn these into
       # para mode; and wrap the contents in the start/stop stuff:
   
       if ($useP) {
    my $cw = $colwidth * $cells->[$cell]->{'colspan'};
    $col_align = "p{$cw $colunits}";
    $contents = $embeddedAlignStart . $contents .  $embeddedAlignEnd;
       }
   
     if ($inner_border || ($outer_border && ($cell == 0))) {      if ($inner_border || ($outer_border && ($cell == 0))) {
  $col_align = '|'.$col_align;   $col_align = '|'.$col_align;
     }      }
Line 749  sub generate { Line 821  sub generate {
   
     my $cspan    = $cells->[$cell]->{'colspan'};      my $cspan    = $cells->[$cell]->{'colspan'};
     my $nextcol  = $startcol + $cspan;      my $nextcol  = $startcol + $cspan;
     $contents = '\multicolumn{'.$cspan.'}{'.$col_align.'}{'.$contents.'}';  
       # If we can avoid the \multicolumn directive that's best as
       # that makes some things like \parpic invalid in LaTeX which
               # screws everything up.
   
       if (($cspan > 1) || !($col_align =~ /l/)) {
   
    $contents = '\multicolumn{'.$cspan.'}{'.$col_align.'}{'.$contents.'}';
   
    # A nasty edge case.  If there's only one cell, the software will assume
    # we're in complete control of the row so we need to end the row ourselves.
   
    if ($cell_count == 1) {
       $contents .= '  \\\\';
    }
       }
     if ($inner_border && ($cells->[$cell]->{'rowspan'} == 1)) {      if ($inner_border && ($cells->[$cell]->{'rowspan'} == 1)) {
  my $lastcol = $nextcol -1;   my $lastcol = $nextcol -1;
  push(@underlines, "\\cline{$startcol-$lastcol}");   push(@underlines, "\\cline{$startcol-$lastcol}");
Line 757  sub generate { Line 844  sub generate {
     $startcol = $nextcol;      $startcol = $nextcol;
     # Rowspans should take care of themselves.      # Rowspans should take care of themselves.
           
   
     push(@row, $contents);      push(@row, $contents);
   
  }   }
Line 776  sub generate { Line 862  sub generate {
  $coldef .= '|';   $coldef .= '|';
     }      }
     for (my $i =0; $i < $column_count; $i++) {      for (my $i =0; $i < $column_count; $i++) {
  $coldef .= 'l';   if ($useP) {
       $coldef .= "p{$colwidth $colunits}";
    } else {
       $coldef .= 'l';
    }
  if ($inner_border ||    if ($inner_border || 
     ($outer_border && ($i == $column_count-1))) {      ($outer_border && ($i == $column_count-1))) {
     $coldef .= '|';      $coldef .= '|';
Line 786  sub generate { Line 876  sub generate {
   
     # Return the table:      # Return the table:
   
       if ($tracing) { &Apache::lonnet::logthis("Leaving generate"); }
   
     return $table;      return $table;
   
 }  }
Line 795  sub generate { Line 887  sub generate {
   
 sub get_object_attribute {  sub get_object_attribute {
     my ($self, $attribute) = @_;      my ($self, $attribute) = @_;
       if ($tracing > 1) { &Apache::lonnet::logthis("get_object_attribute: $attribute"); }
     return $self->{$attribute};      return $self->{$attribute};
 }  }
   
 sub get_row {  sub get_row {
     my ($self, $row) = @_;      my ($self, $row) = @_;
       if ($tracing > 1) { &Apache::lonnet::logthis("get_row"); }
   
     my $rows = $self->{'rows'};  # ref to an array....      my $rows = $self->{'rows'};  # ref to an array....
     return $rows->[$row];         # ref to the row hash for the selected row.      return $rows->[$row];         # ref to the row hash for the selected row.
 }  }

Removed from v.1.7  
changed lines
  Added in v.1.8


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>