Unicode Tables
(require uni-table) | package: uni-table |
This package is an easy-to-use terminal table renderer. It requires terminal with UTF-8 support and can leverage ECMA-48 SGR control sequences for styling both the table borders and cellsβ content.
The public API is inspired by tabular from scribble/base and of course the text-table documentation. Based on this prior work, the package aims to be usable with the same expectations about argument names and their behavior. However, some design decisions had to be made, which have lead to slight differences.
Currently supported features are:
Multi-line cell support with horizontal and vertical alignment specification,
clipping cell contents to specified width or automatic character or word wrapping,
merging borders, alignment and text styles based on row, column or table-global settings,
foreground and background colors, single and double underlines, italic font, reverse video, blink, bold and half-bright intensity,
thick (heavy) and thin (light) border lines, solid or dashed variants, co-existing in different cells of one table - double-line box drawing characters are neither supported, nor is such support planned in the future,
separate border specification for the whole table (for convenience),
row and column template styling with explicit and implicit repetitions, and
optional explicit column width specification.
Example usage:
> (require uni-table racket/string)
> (define lipsum (string-join (list "Lorem ipsum dolor sit amet, consectetur adipiscing elit," "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut" "enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi" "ut aliquip ex ea commodo consequat. Duis aute irure dolor in" "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla" "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in" "culpa qui officia deserunt mollit anim id est laborum.") " "))
> (define tbl (for/list ((y 4)) (for/list ((x 4)) (case (list x y) (((0 0)) "") (((0 1)) "Clip") (((0 2)) "Wrap") (((0 3)) "Reflow") (((1 0)) "Left") (((2 0)) "Right") (((3 0)) "Center") (else lipsum)))))
> (print-uni-table tbl #:col-widths '((8)(35)) #:table-border '(heavy solid) #:col-align '((middle center)(left ("\t\\\\"))(right)(center)) #:row-align '((center)(clip)(wrap)(reflow)) #:col-borders '((solid heavy) (left light dashed)) #:row-borders '((solid heavy) (top light dashed)))
ββββββββββ³ββββββββββββββββββββββββββββββββββββ³ββββββββββββββββββββββββββββββββββββ³ββββββββββββββββββββββββββββββββββββ
β β Left β Right β Center β
β£βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ«
β Clip βLorem ipsum dolor sit amet, conse\\βLorem ipsum dolor sit amet, consectβLorem ipsum dolor sit amet, consectβ
β£βββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ¨
β βLorem ipsum dolor sit amet, conse\\βLorem ipsum dolor sit amet, consectβLorem ipsum dolor sit amet, consectβ
β βctetur adipiscing elit, sed do ei\\βetur adipiscing elit, sed do eiusmoβetur adipiscing elit, sed do eiusmoβ
β βusmod tempor incididunt ut labore\\βd tempor incididunt ut labore et doβd tempor incididunt ut labore et doβ
β β et dolore magna aliqua. Ut enim \\βlore magna aliqua. Ut enim ad minimβlore magna aliqua. Ut enim ad minimβ
β βad minim veniam, quis nostrud exe\\β veniam, quis nostrud exercitation β veniam, quis nostrud exercitation β
β βrcitation ullamco laboris nisi ut\\βullamco laboris nisi ut aliquip ex βullamco laboris nisi ut aliquip ex β
β Wrap β aliquip ex ea commodo consequat.\\βea commodo consequat. Duis aute iruβea commodo consequat. Duis aute iruβ
β β Duis aute irure dolor in reprehe\\βre dolor in reprehenderit in voluptβre dolor in reprehenderit in voluptβ
β βnderit in voluptate velit esse ci\\βate velit esse cillum dolore eu fugβate velit esse cillum dolore eu fugβ
β βllum dolore eu fugiat nulla paria\\βiat nulla pariatur. Excepteur sint βiat nulla pariatur. Excepteur sint β
β βtur. Excepteur sint occaecat cupi\\βoccaecat cupidatat non proident, suβoccaecat cupidatat non proident, suβ
β βdatat non proident, sunt in culpa\\βnt in culpa qui officia deserunt moβnt in culpa qui officia deserunt moβ
β β qui officia deserunt mollit anim\\β llit anim id est laborum.β llit anim id est laborum. β
β β id est laborum. β β β
β£βββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ¨
β βLorem ipsum dolor sit amet, \\β Lorem ipsum dolor sit amet,β Lorem ipsum dolor sit amet, β
β βconsectetur adipiscing elit, sed \\βconsectetur adipiscing elit, sed doβconsectetur adipiscing elit, sed doβ
β βdo eiusmod tempor incididunt ut \\βeiusmod tempor incididunt ut laboreβeiusmod tempor incididunt ut laboreβ
β βlabore et dolore magna aliqua. \\β et dolore magna aliqua. Ut enim adβet dolore magna aliqua. Ut enim ad β
β βUt enim ad minim veniam, quis \\β minim veniam, quis nostrudβ minim veniam, quis nostrud β
β βnostrud exercitation ullamco \\β exercitation ullamco laboris nisiβ exercitation ullamco laboris nisi β
β βlaboris nisi ut aliquip ex ea \\βut aliquip ex ea commodo consequat.βut aliquip ex ea commodo consequat.β
β Reflow βcommodo consequat. Duis aute \\β Duis aute irure dolor inβ Duis aute irure dolor in β
β βirure dolor in reprehenderit in \\β reprehenderit in voluptate velitβ reprehenderit in voluptate velit β
β βvoluptate velit esse cillum \\β esse cillum dolore eu fugiat nullaβesse cillum dolore eu fugiat nulla β
β βdolore eu fugiat nulla pariatur. \\β pariatur. Excepteur sint occaecatβ pariatur. Excepteur sint occaecat β
β βExcepteur sint occaecat \\β cupidatat non proident, sunt inβ cupidatat non proident, sunt in β
β βcupidatat non proident, sunt in \\β culpa qui officia deserunt mollitβ culpa qui officia deserunt mollit β
β βculpa qui officia deserunt \\β anim id est laborum.β anim id est laborum. β
β βmollit anim id est laborum. β β β
ββββββββββ»ββββββββββββββββββββββββββββββββββββ·ββββββββββββββββββββββββββββββββββββ·ββββββββββββββββββββββββββββββββββββ
Colored example:
(print-uni-table tbl #:col-borders '((solid heavy) (left light dashed)) #:row-borders '((solid heavy) (top light dashed)) #:row-style '((brred) () ... (White)) #:col-style '((brmagenta) ()) #:col-align '(4 (bottom) ()) #:border-style '(cyan) #:col-widths '((8)(35)) #:col-align '((middle center)(left ("\t\\\\"))(right)(center)) #:row-align '((center)(clip)(wrap)(reflow)) #:table-border '(heavy solid)) The output in the text terminal should look like this:
To see this colored example, run: racket -l uni-table
procedure
(uni-table->string tbl [ #:cell-borders cell-borders-spec #:row-borders rows-borders-spec #:column-borders columns-borders-spec #:col-borders alt-columns-borders-spec #:border-style border-style-spec #:cell-align cell-align-spec #:row-align row-align-spec #:column-align column-align-spec #:col-align alt-column-align-spec #:cell-style cell-style-spec #:row-style row-style-spec #:column-style column-style-spec #:col-style alt-column-style-spec #:table-border table-borders-spec #:column-widths column-widths-spec #:col-widths alt-column-widths-spec]) β string? tbl : table/c cell-borders-spec : borders-spec/c = '() rows-borders-spec : (spec-template-of borders-spec/c) = '() columns-borders-spec : (spec-template-of borders-spec/c) = '()
alt-columns-borders-spec : (spec-template-of borders-spec/c) = '() border-style-spec : sgr-style-spec/c = '() cell-align-spec : alignment-spec/c = '() row-align-spec : (spec-template-of alignment-spec/c) = '() column-align-spec : (spec-template-of alignment-spec/c) = '()
alt-column-align-spec : (spec-template-of alignment-spec/c) = '() cell-style-spec : sgr-style-spec/c = '() row-style-spec : (spec-template-of sgr-style-spec/c) = '() column-style-spec : (spec-template-of sgr-style-spec/c) = '()
alt-column-style-spec : (spec-template-of sgr-style-spec/c) = '() table-borders-spec : borders-spec/c = '() column-widths-spec : column-widths-spec/c = '() alt-column-widths-spec : column-widths-spec/c = '()
procedure
(print-uni-table tbl [ #:cell-borders cell-borders-spec #:row-borders rows-borders-spec #:column-borders columns-borders-spec #:col-borders alt-columns-borders-spec #:border-style border-style-spec #:cell-align cell-align-spec #:row-align row-align-spec #:column-align column-align-spec #:col-align alt-column-align-spec #:cell-style cell-style-spec #:row-style row-style-spec #:column-style column-style-spec #:col-style alt-column-style-spec #:table-border table-borders-spec #:column-widths column-widths-spec #:col-widths alt-column-widths-spec]) β void? tbl : table/c cell-borders-spec : borders-spec/c = '() rows-borders-spec : (spec-template-of borders-spec/c) = '() columns-borders-spec : (spec-template-of borders-spec/c) = '()
alt-columns-borders-spec : (spec-template-of borders-spec/c) = '() border-style-spec : sgr-style-spec/c = '() cell-align-spec : alignment-spec/c = '() row-align-spec : (spec-template-of alignment-spec/c) = '() column-align-spec : (spec-template-of alignment-spec/c) = '()
alt-column-align-spec : (spec-template-of alignment-spec/c) = '() cell-style-spec : sgr-style-spec/c = '() row-style-spec : (spec-template-of sgr-style-spec/c) = '() column-style-spec : (spec-template-of sgr-style-spec/c) = '()
alt-column-style-spec : (spec-template-of sgr-style-spec/c) = '() table-borders-spec : borders-spec/c = '() column-widths-spec : column-widths-spec/c = '() alt-column-widths-spec : column-widths-spec/c = '()
procedure
(uni-cell content [ #:borders borders-spec #:align align-spec #:style style-spec]) β ut:cell? content : any/c borders-spec : borders-spec/c = '() align-spec : alignment-spec/c = '() style-spec : sgr-style-spec/c = '()