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 = '()