package Pencil::Doc::ModExtractor;

use parent 'Pencil::Doc::Extractor';

use warnings;
use strict;
use Carp;
use vars qw($VERSION);

# ---------------------------------------------------------------------- #
sub longtable {
#
#   $doc->module_table()
#   $doc->module_table(sort_files    => 1/0,
#                   print_empty   => 0/1,
#                   descr_width   => '0.7\textwidth',
#                   selfcontained => 0/1)
#
# Output docstrings in a LaTeX {longtable} environment.
#
    my $self = shift;
    my @args = @_;

    my %args;
    # Parse arguments (sort_files => <true/false>, etc.); may be hash or hashref
    if (ref($args[0]) eq 'HASH') { # longtable($hashref)
        %args = %{$args[0]};
    } else {                    # longtable(%hash)
        %args = @args;
    }

    my $docref = $self->{DOC};
    my @files = keys %$docref;

    my $sort = 1;
    $sort = $args{sort_files} if defined $args{sort_files};

    my $print_empty = $args{print_empty} || 0;

    # Sort file names in pre-defined order
    if ($sort) {
        @files = sort { $self->smart_compare($a, $b) } @files;
    }

    my $text  = header(\@files, $args{selfcontained}, $args{descr_width});

    foreach my $module (@files) {
        # Header line for each section of table
        $text .=
            "\\midrule\n";
#          . "  \\multicolumn{2}{c}{Module \\file{$module}} \\\\\n"
#          . "\\midrule\n";

        # Loop through variables
        my @file_docs = @{$docref->{$module}}; # (['var1', 'doc1'],
                                               #  ['var2', 'doc2'], ...)
        foreach my $vardocref (@file_docs) {
            my $var = $vardocref->{var};
            my $doc = $vardocref->{doc};

            next unless ($print_empty || $doc =~ /\S/);

            # Indent continued lines, so LaTeX code is easier to read:
            $doc =~ s{\n}{\n                  }g;

            $text .= sprintf "  %-15s & %s \\\\\n", "\\var{$module}", $doc;
            $module=''
        }

    }

    $text .= $self->footer($args{selfcontained});

}


# ---------------------------------------------------------------------- #
sub header {
#
# Print LaTeX longtable header
#
    my @files =  @{shift()};
    my $selfcontained = shift;
    my $descr_width = (shift || '0.9\textwidth');

    my $string =
        '%% $Id$' . "\n"
      . "%% This file was automatically generated by Pencil::DocExtractor,\n"
      . "%% so think twice before you modify it.\n"
      . "%%\n"
      . "%% Source files:\n%%   "
      . join("\n%%   ", @files) . "\n\n";

    if ($selfcontained) {
        $string .=
            "\n\\documentclass[12pt]{article}\n"
          . "\n"
          . "\\usepackage{longtable,booktabs}\n"
          . "\\usepackage{underscore}\n"
          . "\\usepackage{amsmath,newcent,helvet}\n"
          . "\\renewcommand{\\ttdefault}{cmtt} % Courier is too broad\n"
          . "\n"
          . "\\newcommand{\\file}[1]{`\\texttt{#1}'}\n"
          . "\\newcommand{\\var}[1]{\\textsl{#1}}\n"
          . "\n"
          . "\\newcommand{\\vekt}[1] {\\mathbf{#1}}\n"
          . "\n"
          . "\\newcommand{\\Av}{\\vekt{A}}\n"
          . "\\newcommand{\\Bv}{\\vekt{B}}\n"
          . "\\newcommand{\\cs}{c_{\rm s}}\n"
          . "\\newcommand{\\curl}{\\nabla\\times}\n"
          . "\\newcommand{\\jv}{\\vekt{j}}\n"
          . "\\newcommand{\\Strain}{\\boldsymbol{\\mathsf{S}}}\n"
          . "\\newcommand{\\uv}{\\vekt{u}}\n"
          . "\n"
          . "\\begin{document}\n\n"
    }

    $string .=
        "% ---------------------------------------------------------------- %\n"
      . "\\begin{longtable}{lp{$descr_width}}\n"
      . "\\toprule\n"
      . "  \\multicolumn{1}{c}{\\emph{Module}} \& {\\emph{Description}} \\\\\n";

    return $string;
}

# ---------------------------------------------------------------------- #

1;
__END__
