Boxes
boxes is a pretty-printing library for laying out text in two dimensions. It is a direct port of the Haskell library boxes by Brent Yorgey.
boxes' core data type is the Box
, which has a width, a
height and some contents. A box's contents can be text or other boxes.
There are functions for creating boxes from text and for combining boxes
into bigger boxes.
The text
function can be used to create a box from a
string, which will have height 1 and length N, where N is the length of
the string (Nx1). char
creates a 1x1 box containing a
single character. emptyBox
creates an empty box of
arbitrary width and height.
para :: Alignment -> Int -> String -> Box
creates a box from a string with a specific width. The box will be as
high as necessary to fit the text, which is layed out according to the
given alignment.
The <>
and <+>
operators
combine boxes horizontally with and without a column of space between
both boxes, respectively. The //
and /+/
operators are similar, but combine boxes vertically instead of
horizontally. hcat
and vcat
are versions of
<>
and //
that combine whole lists of
boxes instead of two at a time. hsep
and vsep
are versions of <+>
and /+/
that operate
on lists, with a configurable amount of space between each two boxes.
punctuateH
and punctuateV
also combine lists
of boxes horizontally and vertically, but allow us to specify another
box which is copied in between each two boxes.
The align
, alignVert
and
alignHoriz
functions can be used to create new boxes which
contain other boxes in some alignment. moveUp
,
moveLeft
, moveDown
and moveRight
move boxes by some amount inside larger boxes.
table
creates a table from a list of rows and a list of
widths for each column.
The render
function renders a box to a string. The
printBox
function prints a box to stdout.