Annotation of loncom/xml/lonlatextable.pm, revision 1.3

1.1       foxr        1: #  Generating TeX tables.
                      2: #
1.3     ! foxr        3: # $Id: lonlatextable.pm,v 1.2 2010/08/27 09:42:48 foxr Exp $
1.1       foxr        4: # 
                      5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: ## Copyright for TtHfunc and TtMfunc by Ian Hutchinson. 
                     28: # TtHfunc and TtMfunc (the "Code") may be compiled and linked into 
                     29: # binary executable programs or libraries distributed by the 
                     30: # Michigan State University (the "Licensee"), but any binaries so 
                     31: # distributed are hereby licensed only for use in the context
                     32: # of a program or computational system for which the Licensee is the 
                     33: # primary author or distributor, and which performs substantial 
                     34: # additional tasks beyond the translation of (La)TeX into HTML.
                     35: # The C source of the Code may not be distributed by the Licensee
                     36: # to any other parties under any circumstances.
                     37: #
                     38: 
                     39: # This module is a support packkage that helps londefdef generate
                     40: # LaTeX tables using the LaTeX::Table package.  A prerequisite is that
                     41: # the print generator must have added the following to the LaTeX 
                     42: #
                     43: #  \usepackage{xtab}
                     44: #  \usepackage{booktabs}
                     45: #  \usepackage{array}
                     46: #  \usepackage{colortbl}
                     47: #  \usepackage{xcolor}
                     48: #
                     49: #  These packages are installed in the packaged LaTeX distributions we know of as of
                     50: #  11/24/2008
                     51: #
                     52: 
                     53: 
                     54: # 
                     55: #  This module provides a sub-set substitute for LaTeX::table 
                     56: #  which is a great module but unfortunately not usable in safe space
                     57: #  
                     58: 
                     59: 
                     60: =pod
                     61: 
                     62: =head1  NAME
                     63: 
                     64: Apache:lonltextable
                     65: 
                     66: =head1 SYNOPSIS
                     67: 
                     68:     use Apache::lonlatextable;
                     69: 
                     70:     $table = Apache::lonlatextable->new();
                     71:     $table->set_caption("some text");
                     72:     $table->set_data(cell_descriptions);
                     73:     $table->{'coldef'} = column_definitions;
                     74:     $table->generate_string();
                     75: 
                     76: =head1 DETAILS
                     77: 
                     78: =cut
                     79: 
                     80: package Apache::lonlatextable;
1.3     ! foxr       81: use Data::Dumper;
        !            82: use Apache::lonnet;
1.1       foxr       83: use strict;
                     84: 
                     85: =pod
                     86: 
                     87: =head2 new
                     88: 
                     89: Creates a new instance of a lonlatextable.  The returned value should be used on the left side of the
                     90: -> for further calls to object methods
                     91: 
                     92: =head3 Example:
                     93:    
                     94:     my $latexTable = &Apache::lonlatextable->new();
                     95: 
                     96: =cut
                     97: 
                     98: 
                     99: sub new {
                    100:     my ($class) = @_;
                    101: 
                    102:     my $self = {
                    103: 	caption           => '',
                    104: 	data              => [],
                    105: 	coldef            =>  '',
                    106: 	
                    107:     };
                    108:     bless($self, $class);
                    109:     return $self;
                    110: }
                    111: 
                    112: =pod
                    113: 
                    114: =head2 set_caption(some_text)
                    115: 
                    116: Set the table caption value.  If this string is empty, the table will be generated without a caption.
                    117: some_text will be the  new table caption value.
                    118: 
                    119: =head3 Example:
                    120: 
                    121:     $table = Apache::lonlatextable->new();
                    122:     $table->set_caption("Some very interesting table");
                    123: 
                    124: =cut
                    125: 
                    126: sub set_caption {
                    127:     my ($self, $caption) = @_;
                    128:     $self->{'caption'} = $caption;
                    129: }
                    130: 
                    131: =pod
                    132: 
                    133: =head2 set_data(cell_descriptions)
                    134: 
                    135: Sets the table cell data.  Table data in its simplest is an aray of arrays.  Each outer 
                    136: array element is a table row. However:
                    137:   
                    138: =over 3
                    139: 
                    140: =item Single column rows sarting with \
                    141: 
                    142: These are treated as LaTeX/TeX commands and, when the table is generated, 
                    143: passed without interpretation.
                    144: 
1.2       foxr      145: =item Lines with one cell that is empty.
1.1       foxr      146: 
                    147: These produce a horizontal rule that spans the width of the table.
                    148: 
                    149: =back
                    150: 
1.3     ! foxr      151: Calling this multiple times will continue to append cell data.
        !           152: 
1.1       foxr      153: =head3 Example
                    154: 
                    155:     $table->set_data([ ['Gnu', '92.52'], [], ['Emu', '33.33'] ]);
                    156: 
                    157: Produces
                    158:     +--------------+--------------+
                    159:     |   Gnu        | 92.52        |
                    160:     +--------------+--------------+ (due to the empty row).
                    161:     |   Emu        | 33.33        |
                    162:     +--------------+--------------+
                    163: 
1.3     ! foxr      164: 
1.1       foxr      165: =cut
                    166: 
                    167: sub set_data {
                    168:     my ($self, $data) = @_;
1.3     ! foxr      169:     &Apache::lonnet::logthis("--------------- set_data ------------");
        !           170:     &Apache::lonnet::logthis(Dumper($self->{'data'}));
        !           171:     &Apache::lonnet::logthis("---------------------------------------");
        !           172:     &Apache::lonnet::logthis(Dumper($data));
        !           173:     my $current_data = $self->{'data'};
        !           174:     push (@$current_data, @$data);
        !           175:     $self->{'data'} = $current_data;
        !           176: 
1.1       foxr      177: 
                    178: }
                    179: 
                    180: =pod
                    181: 
                    182: =head2 Column  definitions.
                    183: 
                    184: The hash value 'coldef' can overide the column definitions computed by default for the table.
                    185: 
                    186: =head3 Example
                    187: 
                    188:     $table->{'coldef'} = 'lrcr';
                    189: 
                    190: Produces table header output of:
                    191: 
                    192:     \begin{tabular}{lrcr}
                    193: 
                    194: The default is to produce a set of left aligned columns.  The number of columns produced
                    195: will be determined by the size of the longest row.
                    196: 
                    197: =cut
                    198: 
                    199: =pod
                    200: 
                    201: =head2   $table->generate_string()
                    202: 
                    203: Generates the LaTeX for the table as a string that is returned to the caller.
                    204: 
                    205: =head3 Example
                    206: 
                    207:     $latex = $table->generate_string();
                    208: 
                    209: =cut
                    210: 
                    211: sub generate_string {
                    212: 
                    213:     my ($self) = @_;
                    214:     my $result;
                    215: 
                    216:     $result  = $self->table_header();
                    217:     $result .= $self->table_body();
                    218:     $result .= $self->table_trailer();
                    219: 
                    220: 
                    221: 
                    222:     return $result;
                    223: }
                    224:  
                    225: 
                    226: ###################################################################################
                    227: #
                    228: #  Private methods:
                    229: #
                    230: 
                    231: #  generate the table header.
                    232: #  If coldef is an empty string, the default column definition is computed instead.
                    233: #
                    234: sub table_header()
                    235: {
                    236:     my ($self) = @_;
1.2       foxr      237:     my $result = '\begin{tabular}{';
1.1       foxr      238:     my $coldef = $self->{'coldef'};
                    239: 
                    240:     if ($coldef eq '') {
                    241: 	my @rows   = @$self->{'data'};
                    242: 	my $longest = 0;
                    243: 	foreach my $row (@rows) {
                    244: 	    my $length = scalar @{$row};
                    245: 	    if ($length > $longest) {
                    246: 		$longest = $length;
                    247: 	    }
                    248:         } 
                    249: 	# $longest cells all left aligned.
                    250: 	# There's got to be a better way than this in perl?
                    251: 
                    252: 	for (my $i =0; $i < $longest; $i++) {
                    253: 	    $coldef .= 'l';
                    254: 	}
                    255:     }
                    256:     
                    257:     $result .= $coldef . '}';
                    258:     $result .= "\n";
                    259: 
                    260:     return $result;
                    261: }
                    262: #
                    263: #   Generate the table body
                    264: #
                    265: sub table_body()
                    266: {
1.2       foxr      267:     my ($self) = @_;
                    268:     my $result = '';
                    269:     foreach my $row (@{$self->{'data'}}) {
                    270: 	#
                    271: 	# If a row has only a single cell we need to deal with the two special cases
                    272: 	# Pass LaTeX uninterpreted or \hline.
                    273: 	#
                    274: 	if ((scalar @{$row}) == 1) {
                    275: 	    my $cell = $row->[0];
                    276: 	    if ($cell eq '') {
                    277: 		$result .= '\hline' . "\n";
                    278: 	    } elsif (substr($cell, 0, 1) eq "\\") {
                    279: 		$result .= $cell . "\n";
                    280: 	    } else {
                    281: 		# could just be a table with one col...
                    282: 
                    283: 		$result .= $cell . ' \\\\ ' ."\n";
                    284: 	    }
                    285: 	} else {
                    286: 	    my $line = '';
                    287: 	    foreach my $cell (@{$row}) {
                    288: 		$line .= $cell . ' & ';
                    289: 	    }
                    290: 	    #  Replace the last ' & ' with \\ and a line terminator..
                    291: 	    #  and append the line to the result.
                    292: 
                    293: 	    $line =~ s/ & $/ \\\\\n/;
                    294: 	    $result .= $line;
                    295: 	}
                    296:     }
                    297:     return $result;
1.1       foxr      298: }
                    299: 
                    300: #
                    301: #  Generate the table trailer
                    302: #
                    303: sub table_trailer {
                    304:     my ($self) = @_;
                    305: 
                    306:     my $result = '\end{tabular}' . "\n";
                    307:     if ($self->{'caption'} ne '') {
                    308: 	$result .= '\caption{' . $self->{'caption'} . '}' . "\n";
                    309:     }
                    310:     return $result;
                    311: }
                    312: 
                    313: 
                    314: 
                    315: 1;
                    316: __END__

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