use Data::ShowTable;
ShowTable { parameter => value , ... };
ShowTable \@titles, \@types, \@widths, \&row_sub [, \&fmt_sub ];
ShowDatabases \@dbnames;
ShowDatabases { parameter => value , ... };
ShowTables \@tblnames;
ShowTables { parameter => value , ... };
ShowColumns \@columns, \@col_types, \@col_lengths, \@col_attrs;
ShowColumns { parameter => value , ... };
ShowBoxTable \@titles, \@types, \@widths, \&row_sub [, \&fmt_sub ];
ShowBoxTable { parameter => value , ... };
ShowSimpleTable \@titles, \@types, \@widths, \&row_sub [, \&fmt_sub];
ShowSimpleTable { parameter => value , ... };
ShowHTMLTable \@titles, \@types, \@widths, \&row_sub [, \&fmt_sub];
ShowHTMLTable { parameter => value , ... };
ShowListTable \@titles, \@types, \@widths, \&row_sub [, \&fmt_sub];
ShowListTable { parameter => value , ... };
package Data::ShowTable
;
$Show_Mode = 'mode';
$Max_Table_Width = number;
$Max_List_Width = number;
$No_Escape = flag;
%URL_Keys = { ``$colname'' => ``$col_URL'', ... };
@Title_Formats = ( fmt1_html, <fmt2_html>, ... );
@Data_Formats = ( fmt1_html, <fmt2_html>, ... );
ShowRow $rewindflag, \$index, $col_array_1 [, $col_array_2, ...;]
$fmt = ShowTableValue $value , $type , $max_width , $width , $precision ;
[$plaintext = ] PlainText [$htmltext];
The output format for any one invocation can be one of four possible styles:
+
'', ``-
'', and ``|
'' characters. See ``ShowBoxTable'' for details.
All of these subroutines, and others, are described in detail in the following sections.
ShowTable { parameter => value , ... };
ShowTable \@titles, \@types, \@widths, \&row_sub [, \&fmt_sub [, $max_width ] [, $show_mode ] ];
The ShowTable subroutine displays tabular data aligned in columns, with headers. ShowTable supports four modes of display: Box , Table , List , and HTML . Each mode is described separately below.
The arguments to ShowTable may be given in one of two ways: as a hashed-array, or by a combination of fixed order arguments, and some package-global variable settings. The hash-array parameters correspond to the fixed arguments and the global-parameter settings.
In the list below, both the hash-array parameter name and the fixed-order argument name is given as the value. In the case where there is no fixed-order argument for a given parameter-value pair, then the corresponding global variable name is given.
Field_I
types
=> \@types
A reference to an array of types, one for each column. These types are
passed to the fmt_sub for appropriate formatting. Also, if a column
type matches the regexp ``/text|char|string/i
'', then the column
alignment will be left-justified, otherwise it will be right-justified.
widths
=> \@widths
A reference to an array of column widths, which may be given as an integer, or
as a string of the form: ``
width
.
precision
''.
row_sub
=> \&row_sub
A reference to a subroutine which successively returns rows of values in an array.
It is called for two purposes, each described separately:
* To fetch successive rows of data:
@row = &$row_sub(0);
When given a null, zero, or empty argument, the next row is returned.
* To initialize or rewind the data traversal.
$rewindable = &$row_sub(1);
When invoked with a non-null argument, the subroutine should rewind its
row pointer to start at the first row of data. If the data which
row_sub
is traversing is not rewindable, it must return zero or null.
If the data is rewindable, a non-null, non-zero value should be returned.
The
row_sub
must expect to be invoked once with a non-null argument,
in order to discover whether or not the data is rewindable. If the data
cannot be rewound,
row_sub
will thereafter only be called with a zero
argument.
Specifically,
row_sub
subroutine is used in this manner:
$rewindable = &$row_sub(1);
if ($rewindable) {
while ((@row = &$row_sub(0)), $#row >= 0) {
# examine lengths for optimal formatting
}
&$row_sub(1); # rewind
}
while ((@row = &$row_sub(0)), $#row >= 0) {
# format the data
}
The consequence of data that is not rewindable, a reasonably nice table
will still be formatted, but it may contain fairly large amounts of
whitespace for wide columns.
fmtsub
=> \&fmt_sub
A reference to a subroutine which formats a value, according to its
type, width, precision, and the current column width. It is invoked
either with a fixed list of arguments, or with a hash-array of parameter
and value pairs.
$string = &fmt_sub { I => I, ... };
$string = &fmt_sub($value, $type, $max_width, $width, $precision)
If \&fmt_sub is omitted, then a default subroutine,
ShowTableValue
,
will be used, which will use Perl's standard string formatting rules.
The arguments to \&fmt_sub, either as values passed in a fixed
order, or as part of the parameter value pair, are described in the
section on "ShowTableValue below.
max_width
=> number,
The maximum table width, including the table formatting characters. If
not given, defaults to the global variable
$Max_Table_Width
;
show_mode
=> 'mode',
The display mode of the output. One of five strings: 'Box'
,
'Table'
, 'Simple'
, 'List'
, and 'HTML'
.
.
ShowDatabases
Show a list of database names.
ShowDatabases \@dbnames;
ShowDatabases { 'data' => \@dbnames, parameter =>
value
, ...};
ShowDatabases is intended to be used to display a list of database
names, under the column heading of ``Databases''. It is a special case
usage of ShowTable (and can thus be passed any parameter suitable
for ShowTable.
The argument, \@dbnames, is a reference to an array of strings, used
as the values of the single column display.
ShowTables
Show an array of table names.
ShowTables \@tblnames;
ShowTables { 'data' => \@tblnames, parameter =>
value
, ...};
ShowTables is used to display a list of table names, under the column
heading of ``Tables''. It is a special case usage of ShowTable, and can
be passed any ``ShowTable'' argument parameter.
ShowColumns
Display a table of column names, types, and attributes.
ShowColumns { parameter => values, ... };
ShowColumns \@columns, \@col_types, \@col_lengths, \@col_attrs;
The ShowColumns subroutine displays a table of column names, types, lengths,
and other attributes in a nicely formatted table. It is a special case usage
of ShowTable, and can be passed any argument suitable for ``ShowTable'';
The arguments are:
-
columns
= \@columns
-
An array of column names. This provides the value for the first column
of the output.
-
col_types
= \@col_types
-
An array of column types names. This provides the value for the second
column.
-
col_lengths
= \@col_lengths
-
An array of maximum lengths for corresponding columns. This provides
the value for the third column of the output.
-
col_attrs
= \@col_attrs
-
An array of column attributes array references (ie: an array of arrays).
The attributes array for the first column are at ``$col_attrs-\>[0]''.
The first attribute of the second column is ``$col_attrs-\>[1][0]''.
The columns, types, lengths, and attributes are displayed in a table.with the column headings: ``Column'', ``Type'', ``Length'', and ``Attributes''.
This is a special case usage of ShowTable, and can be passed
additional arguments suitable for ``ShowTable''.
ShowBoxTable
Show tabular data in a box.
ShowBoxTable { parameter =
value
, ... };
ShowBoxTable \@titles, \@types, \@widths, \&row_sub
[, [ \&fmt_sub ] [,
$max_width
] ];
The ShowBoxTable displays tabular data in titled columns using a ``box''
of ASCII graphics, looking something like this:
+------------+----------+-----+----------+
| Column1 | Column2 | ... | ColumnN |
+------------+----------+-----+----------+
| Value11 | Value12 | ... | Value 1M |
| Value21 | Value22 | ... | Value 2M |
| Value31 | Value32 | ... | Value 3M |
| ... | ... | ... | ... |
| ValueN1 | ValueN2 | ... | Value NM |
+------------+----------+-----+----------+
The arguments are the same as with ``ShowTable''. If the @titles array
is empty, the header row is omitted.
ShowSimpleTable
Display a table of data using a simple table format.
ShowSimpleTable \@titles, \@types, \@widths, \&row_sub [, \&fmt_sub];
ShowSimpleTable { parameter => values, ... };
The ShowSimpleTable subroutine formats data into a simple table of
aligned columns, in the following example:
Column1 Column2 Column3
------- ------- -------
Value1 Value2 Value3
Value12 Value22 Value32
Columns are auto-sized by the data's widths, plus two spaces between columns.
Values which are too long for the maximum colulmn width are wrapped within
the column.
ShowHTMLTable
Display a table of data nicely using HTML tables.
ShowHTMLTable { parameter =>
value
, ... };
ShowHTMLTable \@titles, \@types, \@widths, \&row_sub
[, \&fmt_sub [,
$max_width
[, \
%URL_Keys
[, $no_escape
[, I<\@title_formats [, I<\@data_formats ] ] ] ] ] ];
The ShowHTMLTable displays one or more rows of columns of data using
the HTML \<TABLE\``ShowTable'', the following parameter arguments are allowed:
-
url_keys
=> \
%URL_Keys
,
-
This is a hash array of column names (titles) and corresponding base
URLs. The values of any columns occuring as keys in the hash array will
be generated as hypertext anchors using the associated base URL and the
column name and value as a querystring for the ``col'' and ``val''
parameters, respectively.
If this variable is not given, it will default to the global variable
\
%URL_Keys
.
-
no_escape
=> boolean,
-
Unless $no_escape is set, HTML-escaping is performed on the data
values in order to properly display the special HTML formatting
characters : '\<', '\>', and '&'. If you wish to display data with
embedded HTML text, you must set $no_escape.
If the @titles array is empty, no header row is generated.
-
title_formats
= \@title_formats,
-
-
tformats
= \@title_formats,
-
An array of HTML formatting elements for the column titles, one for each
column. Each array element is a list of one or more HTML elements,
given as
\<ELEMENT\ELEMENT
, and separated by a comma
','
, semi-colon ';'
, or vertical bar '|'
. Each given HTML
element is prepended to the corresponding column title, in the order
given. The corresponding HTML closing elements are appended in the
opposite order.
For example, if \@title_formats contains the two elements:
[ 'FONT SIZE=+2,BOLD', 'FONT COLOR=red,EM' ]
then the text output for the title of the first column would be:
I
If
title_formats
is omitted, the global variable @Title_Formats
is used by default.
-
data_formats
= \@data_formats,
-
-
dformats
= \@data_formats,
-
Similar to
title_formats
, this array provides HTML formatting for
the columns of each row of data. If
data_formats
is omitted or
null, then the global variable \@Data_Formats is used by default.
For example, if we define the array:.
$base_url = ``http://www.$domain/cgi/lookup'';
%url_cols = ('Author' => $base_url,
'Name' => $base_url);
Then, the values in the Author
column will be generated with the following
HTML text:
othervalue
ShowListTable
Display a table of data using a list format.
ShowListTable
{ parameter =>
value
, ... };
ShowListTable
\@titles, \@types, \@widths, \&row_sub
[, \&fmt_sub [,
$max_width
[, $wrap_margin ] ] ];
The arguments for
ShowListTable
are the same as for ``ShowTable'',
except for those described next.
-
max_width
= number,
-
-
wrap_margin
= number,
-
Lines are truncated, and wrapped when their length exceeds
$max_width
. Wrapping is done on a word-basis, unless the resulting
right margin exceeds $wrap_margin, in which case the line is simply
truncated at the
$max_width
limit.
The
$max_width
variable defaults to
$Max_List_Width
. The
$wrap_margin defaults to
$List_Wrap_Margin
.
In
List
mode, columns (called ``fields'' in List mode) are displayed.wth a field name and value pair per line, with records being one or
more fields . In other words, the output of a table would
look something like this:
Field1_1: Value1_1
Field1_2: Value1_2
Field1_3: Value1_3
...
Field1-N: Value1_M
Field2_1: Value2_1
Field2_2: Value2_2
Field2_3: Value2_3
...
Field2_N: Value2_N
...
FieldM_1: ValueM_1
FieldM_2: ValueM_2
...
FieldM_N: ValueM_N
Characteristics of
List
mode:
- two empty lines indicate the end of data.
- An empty field (column) may be omitted, or may have a label, but no
data.
- A long line can be continue by a null field (column):
Field2: blah blah blah
: blah blah blah
- On a continuation, the null field is an arbitrary number of leading
white space, a colon ':', a single blank or tab, followed by the
continued text.
- Embedded newlines are indicated by the escape mechanism ``\n''.
Similarly, embedded tabs are indicated with ``\t'', returns with ``\r''.
- If the @titles array is empty, the field names ``
Field_
NN'' are used
instead.
.
ShowRow
Fetch rows successively from one or more columns of data.
ShowRow $rewindflag, \$index, $col_array_1 [, $col_array_2, ...;]
The ShowRow subroutine returns a row of data from one or more
columns of data. It is designed to be used as a callback routine,
within the ShowTable routine. It can be used to select elements
from one or more array reference arguments.
If passed two or more array references as arguments, elements of the
arrays selected by $index are returned as the ``row'' of data.
If a single array argument is passed, and each element of the array is
itself an array, the subarray is returned as the ``row'' of data.
If the $rewindflag flag is set, then the $index pointer is reset
to zero, and ``true'' is returned (a scalar 1). This indicates that the
data is rewindable to the ShowTable routines.
When the $rewindflag is not set, then the current row of data, as
determined by $index is returned, and $index will
have been incremented.
An actual invocation (from ShowColumns) is:
ShowTable \@titles, \@types, \@lengths,
sub { &ShowRow( $_[0], \$current_row, $col_names, $col_types,
$col_lengths, \@col_attrs); };
In the example above, after each invocation, the $current_row argument
will have been incremented.
ShowTableValue
Prepare and return a formatted representation of a value. A value
argument, using its corresponding type, effective width, and precision
is formatted into a field of a given maximum width.
$fmt =
ShowTableValue
$value
,
$type
,
$max_width
,
$width
,
$precision
;
-
width
=>
$width
-
-
$width
-
The width of the current value. If omittied,
$max_width
is assumed.
-
precision
=>
$precision
-
-
$precision
-
The number of decimal digits; zero is assumed if omittied.
-
value
=>
$value
-
-
$value
-
The value to be formatted.
-
$type
-
The type name of the value; eg:
char
, varchar
, int
, etc.
-
maxwidth
=>
$max_width
-
-
$max_width
-
The maximum width of any value in the current value's column. If
$width
is zero or null,
$max_width
is used by default.
$max_width
is also
used as a minimum width, in case
$width
is a smaller value.
-
$width
-
The default width of the value, obtained from the width specification of the
column in which this value occurs.
-
$precision
-
The precision specification, if any, from the column width specification.
.
PlainText
$plaintext = &PlainText($htmltext);
&PlainText
This function removes any HTML formatting sequences from the input argument,
or from $_
if no argument is given. The resulting plain text is returned
as the result.
VARIABLES
The following variables may be set by the user to affect the display (with
the defaults enclosed in square brackets [..]):
-
$Show_Mode
[Box]
-
This is the default display mode when using ShowTable. The
environment variable,
$ENV{'SHOW_MODE'}
, is used when this variable is
null or the empty string. The possible values for this variable are:
``Box''
, ``List''
, ``Table''
, and ``HTML''
. Case is insignificant.
-
$List_Wrap_Margin
[2]
-
This variable's value determines how large a margin to keep before wrarpping a
long value's display in a column. This value is only used in ``List'' mode.
-
$Max_List_Width
[80]
-
This variable, used in ``List'' mode, is used to determine how long an output line
may be before wrapping it. The environment variable,
$ENV{'COLUMNS'}
, is
used to define this value when it is null.
-
$Max_Table_Width
['']
-
This variable, when set, causes all tables to have their columns scaled
such that their total combined width does not exceed this value. When
this variable is not set, which is the default case, there is no maximum
table width, and no scaling will be done.
-
$No_Escape
['']
-
If set, allows embedded HTML text to be included in the data displayed
in an HTML-formatted table. By default, the HTML formatting characters
(``<'', ``>'', and ``&'') occuring in values are escaped.
-
%URL_Keys
-
In HTML mode, this variable is used to recognize which columns are to be
displayed with a corresponding hypertext anchor. See ``ShowHTMLTable''
for more details.
-
@HTML_Elements
-
An array of HTML elements (as of HTML 3.0) used to recognize and strip for
width calculations.
-
$HTML_Elements
-
A regular expression string formed from the elements of
@HTML_Elements
.
.
INTERNAL SUBROUTINES
get_params
my $args = &get_params \@argv, \%params, \@arglist;
Given the @argv originally passed to the calling sub, and the hash of
named parameters as %params, and the array of parameter names in the
order expected for a pass-by-value invocation, set the values of each of
the variables named in @vars.
If the only element of the @argv is a hash array, then set the
variables to the values of their corresponding parameters used as keys
to the hash array. If the parameter is not a key of the %params
hash, and is not a key in the global hash %ShowTableParams, then an
error is noted.
When @argv has multiple elements, or is not a hash array, set each
variable, in the order given within @arglist, to the values from the
@argv, setting the variables named by each value in %params.
Variables may given either by name or by reference.
The result is a HASH array reference, either corresponding directly to
the HASH array passed as the single argument, or one created by
associating the resulting variable values to the parameter names
associated with the variable names.
html_formats
($prefixes,$suffixes) =
html_formats
\@html_formats;
The html_format function takes an array reference of HTML formatting
elements \@html_formats, and builds two arrays of strings: the first:
$prefixes, is an array of prefixes containing the corresponding HTML
formatting elements from \@html_formats, and the second,
$suffixes, containing the appropriate HTML closing elements, in the
opposite order.
The result is designed to be used as prefixes and suffixes for the
corresponding titles and column values.
The array \@html_formats contains lists of HTML formatting elements,
one for each column (either title or data). Each array element is a
list of one or more HTML elements, either given in HTML syntax, or as a
``plain'' name (ie: given as \<ELEMENT\ELEMENT
).
Multiple elements are separated by a comma ','
.
The resulting array of $prefixes contains the corresponding opening
elements, in the order given, with the proper HTML element syntax. The
resulting array of $suffixes contains the closing elements, in the
opposite order given, with the proper HTML element syntax.
For example, if \@html_formats contains the two elements:
[ 'FONT SIZE=+2,BOLD', 'FONT COLOR=red,EM' ]
then the resulting two arrays will be returned as:
[ [ '', '' ],
[ ' ', '' ] ]
calc_widths
(
$num_cols
,
$widths
,
$precision
,
$max_widths
) =
&calc_widths(
$widthspec
,
$titles
,
$rewindable
,
$row_sub
,
$fmt_sub
,
$types
,
$showmode
,
$max_width
);
DESCRIPTION
calc_widths
is a generalized subroutine used by all the ShowTable
variant subroutines to setup internal variables prior to formatting for
display. Calc_widths handles the column width and precision
analysis, including scanning the data (if rewindable) for appropriate
default values.
The number of columns in the data is returned, as well as three arrays:
the declared column widths, the column precision values, and the maximum
column widths.
RETURN VALUES
-
$num_cols
-
is the number of columns in the data. If the data is not rewindable,
this is computed as the maximum of the number of elements in the
$widthspec
array and the number of elements in the
$titles
array. When the data is rewindable, this is the maximum of the number
of columns of each row of data.
-
$widths
-
is the column widths array ref, without the precision specs (if any).
Each column's width value is determined by the original
$widthspec
value and/or the maximum length of the formatted data for the column.
-
$precision
-
is the precision component (if any) of the original
$widthspec
array ref. If there was no original precision component from the
$widthspec
,
and the data is rewindable, then the data is examined to determine the
maximum default precision.
-
$max_widths
-
is the ref to the array of maximum widths for the given columns.
ARGUMENTS
-
$widthspec
-
A reference to an array of column width (or length) values, each given
as an integer, real number, or a string value of
``
width
.
precision
''. If a value is zero or null, the length of the
corresponding formatted data (if rewindable) and column title length are
used to determine a reasonable default.
If a column's
width
portion is a positive, non-zero number, then the
column will be this wide, regardless of the values lengths of the data
in the column.
If the column's
width
portion is given as a negative number, then the
positive value is used as a minimum column width, with no limit on the
maximum column width. In other words, the column will be at least
width
characters wide.
If the data is not rewindable, and a column's width value is null or
zero, then the length of the column title is used. This may cause severe
wrapping of data in the column, if the column data lengths are much
greater than the column title widths.
-
$titles
-
The array ref to the column titles; used to determine the minimum
acceptable width, as well as the default number of columns. If the
$titles
array is empty, then the
$widthspec
array is used to
determine the default number of columns.
-
$rewindable
-
A flag indicating whether or not the data being formatted is rewindable.
If this is true, a pass over the data will be done in order to calculate
the maximum lengths of the actual formatted data, using
$fmt_sub
(below), rather than just rely on the declared column lengths. This
allows for optimal column width adjustments (ie: the actual column
widths may be less than the declared column widths).
If it is not desired to have the column widths dynamically adjusted,
then set the
$rewindable
argument to 0, even if the data is
rewindable.
-
$row_sub
-
The code reference to the subroutine which returns the data; invoked
only if
$rewindable
is non-null.
-
$fmt_sub
-
The subroutine used to determine the length of the data when formatted;
if this is omitted or null, the length of the data is used by default.
The
$fmt_sub
is used only when the data is rewindable.
-
$types
-
An array reference to the types of each of the value columns; used only
when
$fmt_sub
is invoked.
-
$showmode
-
A string indicating the mode of the eventual display; one of four strings:
``
box
'', ``table
'', ``list
'', and ``html
''. Used to adjust widths
for formatting requirements.
-
$max_width
-
The maximum width of the table being formatted. If set, and the total
sum of the individual columns exceeds this value, the column widths are
scaled down uniformly. If not set (null), no column width scaling is done.
.
putcell
$wrapped = &putcell( \@cells, $c, $cell_width, \@prefix, \@suffix, $wrap_flag );
Output the contents of an array cell at $cell[$c], causing text
longer than $cell_width to be saved for output on subsequent calls.
Prefixing the output of each cell's value is a string from the
two-element array @prefix. Suffixing each cell's value is a string
from the two-element array @suffix. The first element of either
array is selected when $wrap_flag is zero or null, or when there is
no more text in the current to be output. The second element
is selected when $wrap_flag is non-zero, and when there is more text in
the current cell to be output.
In the case of text longer than $cell_width, a non-zero value is
returned.
Cells with undefined data are not output, nor are the prefix or suffix
strings.
center
Center a string within a given width.
$field = center $string,
$width
;
max
Compute the maximum value from a list of values.
$max = &max( @values );
min
Compute the minum value from a list of values.
$min = &min( @values );
max_length
Compute the maximum length of a set of strings in an array reference.
$maxlength = &max_length( \@array_ref );
htmltext
Translate regular text for output into an HTML document. This means
certain characters, such as ``&'', ``>'', and ``<'' must be escaped.
$output = &htmltext( $input );
AUTHOR
Alan K. Stebbens <aks@sgi.com>
BUGS
- Currently, there is no way to specify vertical or horizontal alignment
on an individual HTML table cell, only on a per-column basis.
Generally, the HTML formatting techniques have not been given much
consideration -- feel free to provide constructive feedback.