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

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?.