On this page:
Unicode Tables
uni-table->string
print-uni-table
uni-cell
8.16

Unicode TablesπŸ”—β„Ή

Dominik Pantůček <dominik.pantucek@trustica.cz>

 (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:

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:

image

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 = '()
Effectively an exported alias for table->string - which in turn just captures the output of print-table without trailing newline.

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 = '()
Formats given table/c two-dimensional table and displays it using displayln to (current-output-port). Effectively this is just a thin wrapper around print-table.

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 = '()
Creates styled ut:cell?.