LaTeX-Table
view release on metacpan or search on metacpan
bin/ltpretty view on Meta::CPAN
#!/usr/bin/perl
use strict;
use warnings;
use LaTeX::Table;
use Carp;
use version; our $VERSION = qv('1.0.6');
my $line_id = 0;
my @input;
my $paramline;
while ( my $line = <> ) {
chomp $line;
$line =~ s{\s+}{ }xmsg;
$line =~ s{\A \s* | \s* \z}{}xmsg;
# remove trailing \\, we do that later
$line =~ s{\A \\\\ \z}{}xmsg;
if ( $line_id == 0 ) { #first line contains the parameters
$paramline = $line;
}
else {
push @input, $line;
}
$line_id++;
}
# remove trailing empty lines
while ( !length $input[-1] ) {
pop @input;
}
# uncomment original input
_say( join q{}, map {"\n % $_"} ( $paramline, @input ) );
# create rows/column array[array_ref], remove leading and trailing spaces
@input = map {
[ map { m{\A \s* (.*) \s* \z}xms ? $1 : $_ } split m{ & }xms ]
} @input;
# store the paramline in a hash
my %params = map { _parse_param($_) } split m{ ; }xms, $paramline;
my $table = LaTeX::Table->new(
{ header => [ $input[0] ],
data => [ @input[ 1 .. $#input ] ],
%params,
}
);
_say( "\n" . $table->generate_string() );
sub _parse_param {
my ($s) = @_;
if ( $s =~ m{ \A (.*?) = (.*) \z}xms ) {
return $1 => $2;
}
else {
croak q{Invalid parameter line};
}
return;
}
sub _say {
my ($s) = @_;
print "$s\n" or croak q{Can't print to stdout.};
return;
}
__END__
=head1 NAME
ltpretty - Use LaTeX::Table from within your text editor.
=head1 SYNOPSIS
ltpretty < lazytable
=head1 DESCRIPTION
This program takes a I<lazy formatted> LaTeX table from STDIN (typically piped
from Vim or emacs) and outputs a completely formatted table.
=head1 LAZY FORMAT
The first line must contain the L<LaTeX::Table> options (separated by
semicolons C<;>) in the format C<optionname=value>. The
second line must contain the header, the following lines the data.
Columns are separated by C<&>. Trailing empty lines are ignored, other
empty lines generate horizontal rules (as in L<LaTeX::Table>).
=head1 EXAMPLE
theme=Meyrin;label=test;position=htb
Item:2c & Price
Gnat& per gram& 13.65
& each& 0.01
Gnu& stuffed& 92.59
Emu& stuffed& 33.33
Armadillo& frozen& 8.99
( run in 2.247 seconds using v1.01-cache-2.11-cpan-71847e10f99 )