'''Tabulate''' is a command line utility that converts the standard input into pretty-printed tables. It is also a Tcl [module] that does the same with lists of lists. It was inspired by https://github.com/joepvd/table. Tabulate works in Tcl 8.5+ and [Jim Tcl].
It is now developed as part of the [Sqawk] project.
Download the latest version: `curl https://raw.githubusercontent.com/dbohdan/sqawk/master/lib/tabulate.tcl > tabulate.tcl`
** Use example **
*** Command line ***
======
$ ps | jimsh ./tabulate.tcl
┌─────┬─────┬────────┬─────┐
│ PID │ TTY │ TIME │ CMD │
├─────┼─────┼────────┼─────┤
│20583│pts/3│00:00:01│ zsh │
├─────┼─────┼────────┼─────┤
│23301│pts/3│00:00:00│ ne │
├─────┼─────┼────────┼─────┤
│28007│pts/3│00:00:00│ ps │
├─────┼─────┼────────┼─────┤
│28008│pts/3│00:00:00│jimsh│
└─────┴─────┴────────┴─────┘
======
*** tclsh ***
======
% source tabulate.tcl
% ::tabulate::tabulate -data {{Hello World} {11 101}}
┌─────┬─────┐
│Hello│World│
├─────┼─────┤
│ 11 │ 101 │
└─────┴─────┘
======
** Usage **
Below are the options you can pass to `tabulate.tcl` on the command line and/or the procedure `::tabulate::tabulate` in Tcl.
%| Option | Description | Example |%
&| `-FS` (command line only) | The field separator for the input. If set to an empty string, which is the default, any Tcl [whitespace] is treated as a separator. | `-FS ,` |&
&| `-data` (Tcl only) | The data to format. | `-data {{foo bar} {11 101}}` |&
&| `-style` | The characters with which to draw the table. Set to `default` for Unicode or `loFi` for 7-bit ASCII. | `-style loFi` |&
&| `-align` or `-alignments` | Which way (`left`, `right`, or `center`, the default) to align the text in each column. This only makes a difference if a cell's contents is narrower than the full width of the column. It has no effect if all cells' contents is the same width. | `-align "left center right"` |&
&| `-margins` | The number of extra spaces to put on each side of the contents of each cell (zero by default). | `-margins 5` |&
** `::tabulate::options` DSL **
Tabulate's code includes a DSL for processing [named arguments] stored in [args].
*** Use example ***
======
proc ::tabulate::tabulate args {
options::process $args \
store -data in data \
store -style in style default $::tabulate::style::default \
store -alignments or -align in align default {} \
store -margins in margins default 0
# ...
}
======
** Discussion **
[JM] 2015-08-03: I am probably doing something wrong:<
>
% info tclversion
8.6
% info patchlevel
8.6.4
% source tabulate.tcl
% ::tabulate::tabulate -data {{Hello World!}}
wrong # args: should be "dict exists dictionary key ?key ...?"
[dbohdan] 2015-08-03: I cannot reproduce that on my system by just following your transcript. Could you file an issue at https://github.com/dbohdan/sqawk/issues?
[JM] 2015-08-03: never mind, I found the error on my side...there were spaces after the "\" line continuations, hence breaking the command. Somehow I got that from the copy-paste from the source.
+------------------------------+
¦Thanks¦for¦sharing¦ ¦ ¦
+------+---+-------+------+----¦
¦ This ¦ is¦ a ¦second¦line¦
+------------------------------+
[APN] 2015-11-20: Neat and useful. One small caveat - you have to remember to use `-encoding utf-8` with the source command since the style::default variable embeds graphics as raw UTF-8 characters. For cases where you don't have control of the source command used to pull in the tabulate.tcl file (for example with [critcl]), below is the equivalent using escape sequences.
======
variable default {
top {
left \U250C
padding \U2500
separator \U252C
right \U2510
}
separator {
left \U251C
padding \U2500
separator \U253C
right \U2524
}
row {
left \U2502
padding { }
separator \U2502
right \U2502
}
bottom {
left \U2514
padding \U2500
separator \U2534
right \U2518
}
}
======
** Code **
See https://github.com/dbohdan/sqawk/blob/master/lib/tabulate.tcl.
** See also **
* [report]
* [http://core.tcl-lang.org/tcllib/doc/trunk/embedded/www/tcllib/files/modules/report/report.html#section7%|%Report examples]
<> Application | Argument Processing | Jim Package | Text Screen