--- loncom/xml/londefdef.pm 2008/11/24 18:55:01 1.397
+++ loncom/xml/londefdef.pm 2009/01/20 12:01:00 1.398
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.397 2008/11/24 18:55:01 jms Exp $
+# $Id: londefdef.pm,v 1.398 2009/01/20 12:01:00 foxr Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -42,6 +42,7 @@ package Apache::londefdef;
use Apache::lonnet;
use strict;
use Apache::lonxml;
+use Apache::lontable;
use Apache::File();
use Image::Magick;
use Apache::lonmenu();
@@ -58,20 +59,7 @@ BEGIN {
}
-#
-# Dumps all elements of the table structure.
-# Need this 'cause evidently when given an array, Data::Dumper only seems
-# to dump element 0.
-#
-#sub debug_dump_table {
-# my $lastrow = $#Apache::londefdef::table;
-# &Apache::lonnet::logthis("Dumping table: Last row index: $lastrow");
-# my $row;
-# for ($row =0; $row <= $lastrow; $row++ ) {
-# my $text = Dumper($Apache::londefdef::table[$row]);
-# &Apache::lonnet::logthis("table [ $row ]".$text);
-# }
-#}
+
sub initialize_londefdef {
$Apache::londefdef::TD_redirection=0;
@Apache::londefdef::table = ();
@@ -208,6 +196,12 @@ sub start_html {
'\usepackage{pifont}' ."\n".
'\usepackage{latexsym}'."\n".
'\usepackage{epsfig}'.
+ "\\usepackage{xtab}\n".
+ "\\usepackage{tabularx}\n".
+ "\\usepackage{booktabs}\n".
+ "\\usepackage{array}\n".
+ "\\usepackage{colortbl}\n".
+ "\\usepackage{xcolor}\n".
'\usepackage{calc}'.
'\usepackage{amsmath}'.
'\usepackage{amssymb}'.
@@ -2018,7 +2012,8 @@ sub end_dd {
# only way I could think of to allow
in
#
bodies
#
-#list of supported attributes: border,width,TeXwidth
+#list of supported attributes: border,width,TeXwidth,TeXtheme
+# align
sub start_table {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $textwidth = '';
@@ -2027,6 +2022,59 @@ sub start_table {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
&disable_para(); # Can't have paras in a table.
+
+
+ # New table code:
+
+ # Get the parameters that we can do something about:
+
+ my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0);
+ my $width = &Apache::lonxml::get_param('TeXwidth', $parstack, $safeeval, undef, 0);
+ my $theme = &Apache::lonxml::get_param('TeXtheme', $parstack, $safeeval, undef, 0);
+ my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 0);
+
+ # The only thing that needs any figuring out is the width.. and then only if it is
+ # a percent. If not it's assumed to be some valid TeX measurement unit e.g. 3.0cm
+ #
+
+ my $table = new Apache::lontable();
+ if ($border ne '') {
+ $table->table_border(1);
+ $table->cell_border(1);
+ }
+ if ($theme ne '') {
+ $table->theme($theme);
+ }
+ if ($align ne '') {
+ $table->alignment($align);
+ }
+
+ # Missing width is most of page width
+
+ if ($width eq "") {
+ $width = '70%';
+ }
+
+ # If a percentage, need to calculate what this means in terms of
+ # page width:
+
+ if ($width =~ /%$/) {
+ my $textwidth = &recalc($env{'form.textwidth'}); # Page width in mm.
+ $width =~ s/%//;
+ $width = $width * $textwidth / 100.0;
+ $width .= " mm";
+ $table->width($width);
+ }
+
+ push(@Apache::londefdef::table, $table);
+ $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)
@@ -2101,7 +2149,7 @@ sub start_table {
$Apache::londefdef::table[-1]{'content'}=[];
$Apache::londefdef::table[-1]{'align'}=[];
$currentstring.=' \keephidden{NEW TABLE ENTRY}';
-
+ }
}
return $currentstring;
@@ -2113,6 +2161,20 @@ sub end_table {
if ($target eq 'web' || $target eq 'webgrade') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
+
+
+ # New table code:
+
+ my $table = pop(@Apache::londefdef::table);
+ my $t = $table->generate();
+ $currentstring = $t->generate_string();
+ &enable_para();
+ #--------------------------------------------------------------
+ # Old table code:
+ #--------------------------------------------------------------
+
+ if (0) {
+
my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);
my $inmemory = '';
my $output = '';
@@ -2528,6 +2590,7 @@ sub end_table {
}
&enable_para();
}
+ }
return $currentstring;
}
@@ -2538,6 +2601,19 @@ sub start_tr {
if ($target eq 'web' || $target eq 'webgrade') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
+
+ my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);
+ $Apache::londefdef::table[-1]->start_row();
+
+ if ($align ne '') {
+ $Apache::londefdef::table[-1]->configure_row({default_halign => $align});
+ }
+
+ #---------------------------------------------------------------
+ # Old table code.
+ #---------------------------------------------------------------
+
+ if (0) {
$Apache::londefdef::table[-1]{'row_number'}++;
my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
if ($alignchar ne '') {
@@ -2556,6 +2632,7 @@ sub start_tr {
push @ {$Apache::londefdef::table[-1]{'minlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'content'}}, [];
+ }
}
return $currentstring;
}
@@ -2566,6 +2643,19 @@ sub end_tr {
if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
+
+ # In case the user is missing a or | tag:
+
+ if ($Apache::londefdef::TD_redirection) {
+ &end_td_tex($parstack,$parser,$safeeval);
+ }
+ $Apache::londefdef::table[-1]->end_row();
+
+ #-----------------------------------------------
+ # Old table code
+ #-----------------------------------------------
+
+ if (0) {
if ($Apache::londefdef::TD_redirection) {
&end_td_tex($parstack,$parser,$safeeval);
}
@@ -2574,7 +2664,7 @@ sub end_tr {
if ($Apache::londefdef::table[-1]{'prior_columns'} > $Apache::londefdef::table[-1]{'counter_columns'}) {
$Apache::londefdef::table[-1]{'counter_columns'} = $Apache::londefdef::table[-1]{'prior_columns'};
}
-
+ }
}
@@ -2610,9 +2700,50 @@ sub tag_check {
}
return '';
}
+
+#
+# Factor out cell configuration hash generation:
+#
+
+sub cell_config_hash {
+ my ($align, $rowspan, $colspan) = @_;
+ my %config;
+ if ($align ne '') {
+ $config{'halign'} = $align;
+ }
+ if ($colspan ne "") {
+ $config{'colspan'} = $colspan;
+ }
+ if ($rowspan ne '') {
+ $config{'rowspan'} = $rowspan;
+ }
+ return \%config;
+}
sub start_td_tex {
my ($parstack,$parser,$safeeval) = @_;
+
+ # At this stage, an empty cell is created with the
+ # appropriate rowspan/colspan and alignment
+ # attributes, but empty of text. end_td_tex will
+ # fetch the contents from the recursive parse and
+ # fill the cell with them:
+ my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);
+ my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1);
+ my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1);
+
+ my $config = &cell_config_hash($align, $rowspan, $colspan);
+
+ my $table = $Apache::londefdef::table[-1];
+ $table->add_cell('', $config);
+
+
+ #------------------------------------------------
+ # Old table code.
+ #------------------------------------------------
+
+ if (0) {
+
my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
if ($alignchar eq '') {
$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1];
@@ -2625,11 +2756,22 @@ sub start_td_tex {
$current_length=~/(\d+\.?\d*)/;
push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1;
}
+ }
&Apache::lonxml::startredirection();
return '';
}
sub end_td_tex {
+
+ my $text = &Apache::lonxml::endredirection();
+ my $table = $Apache::londefdef::table[-1];
+ $table->append_cell_text($text);
+
+ #-------------------------------------------------
+ # Old table code
+ #-------------------------------------------------
+
+ if (0) {
my ($parstack,$parser,$safeeval) = @_;
my $current_row = $Apache::londefdef::table[-1]{'row_number'};
my $current_column = $Apache::londefdef::table[-1]{'counter_columns'};
@@ -2794,7 +2936,7 @@ sub end_td_tex {
}
-
+ }
return '';
}
@@ -2843,6 +2985,24 @@ sub tagg_check {
sub start_th_tex {
my ($parstack,$parser,$safeeval) = @_;
+
+ my $alignment = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef,1);
+ my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1);
+ my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1);
+
+ my $config = cell_config_hash($alignment, $rowspan, $colspan);
+ my $table = $Apache::londefdef::table[-1];
+ $table->add_cell('\textbf{', $config);
+
+ #-------------------------------------------------------------------------------------
+ #
+ # Old table code.
+ #
+ #--------------------------------------------------------------------------------------
+
+ if (0) {
+
+
my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
if ($alignchar eq '') {
$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1];
@@ -2855,12 +3015,26 @@ sub start_th_tex {
$current_length=~/(\d+\.?\d*)/;
push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1;
}
+ }
+
+ # Accept xml until the tag.
+
&Apache::lonxml::startredirection();
return '';
}
sub end_th_tex {
my ($parstack,$parser,$safeeval) = @_;
+
+ my $table = $Apache::londefdef::table[-1];
+ my $text = &Apache::lonxml::endredirection();
+ $table->append_cell_text($text.'}');
+
+ #-----------------------------------------------------------------------------
+ # Old table code:
+ #-----------------------------------------------------------------------------
+
+ if (0) {
my $current_row = $Apache::londefdef::table[-1]{'row_number'};
my $data=&Apache::lonxml::endredirection();
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
@@ -2925,6 +3099,7 @@ sub end_th_tex {
#make data bold
$data='\textbf{'.$data.'}';
push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data;
+ }
return'';
}