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 )