Note: the core types and comibnators from this module are from Toxaris in a #haskell conversation on 2008-08-24
- data Properties
- = NoLine
- | SingleLine
- | DoubleLine
- data Header h
- = Header h
- | Group Properties [Header h]
- data Table rh ch a = Table (Header rh) (Header ch) [[a]]
- headerContents :: Header h -> [h]
- zipHeader :: h -> [h] -> Header a -> Header (h, a)
- flattenHeader :: Header h -> [Either Properties h]
- squish :: (Properties -> b -> b) -> (h -> b) -> Header h -> [b]
- data SemiTable h a = SemiTable (Header h) [a]
- empty :: Table rh ch a
- col :: ch -> [a] -> SemiTable ch a
- colH :: ch -> SemiTable ch a
- row :: rh -> [a] -> SemiTable rh a
- rowH :: rh -> SemiTable rh a
- beside :: Properties -> Table rh ch a -> SemiTable ch a -> Table rh ch a
- below :: Properties -> Table rh ch a -> SemiTable rh a -> Table rh ch a
- (^..^) :: Table rh ch a -> SemiTable ch a -> Table rh ch a
- (^|^) :: Table rh ch a -> SemiTable ch a -> Table rh ch a
- (^||^) :: Table rh ch a -> SemiTable ch a -> Table rh ch a
- (+.+) :: Table rh ch a -> SemiTable rh a -> Table rh ch a
- (+----+) :: Table rh ch a -> SemiTable rh a -> Table rh ch a
- (+====+) :: Table rh ch a -> SemiTable rh a -> Table rh ch a
Documentation
example = Table (Group SingleLine [ Group NoLine [Header "A 1", Header "A 2"] , Group NoLine [Header "B 1", Header "B 2", Header "B 3"] ]) (Group DoubleLine [ Group SingleLine [Header "memtest 1", Header "memtest 2"] , Group SingleLine [Header "time test 1", Header "time test 2"] ]) [ ["hog", "terrible", "slow", "slower"] , ["pig", "not bad", "fast", "slowest"] , ["good", "awful" , "intolerable", "bearable"] , ["better", "no chance", "crawling", "amazing"] , ["meh", "well...", "worst ever", "ok"] ]
-- Text.Tabular.AsciiArt.render example id -- -- || memtest 1 | memtest 2 || time test | time test 2 -- ====++===========+===========++=============+============ -- A 1 || hog | terrible || slow | slower -- A 2 || pig | not bad || fast | slowest -- ----++-----------+-----------++-------------+------------ -- B 1 || good | awful || intolerable | bearable -- B 2 || better | no chance || crawling | amazing -- B 3 || meh | well... || worst ever | ok
Helper functions for rendering
headerContents :: Header h -> [h]Source
Retrieve the contents of a header
zipHeader :: h -> [h] -> Header a -> Header (h, a)Source
zipHeader
e
ss
h
returns the same structure
as h
except with all the text replaced by the contents
of ss
.
If ss
has too many cells, the excess is ignored.
If it has too few cells, the missing ones (at the end)
and replaced with the empty contents e
flattenHeader :: Header h -> [Either Properties h]Source
squish :: (Properties -> b -> b) -> (h -> b) -> Header h -> [b]Source
The idea is to deal with the fact that Properties (e.g. borders) are not standalone cells but attributes of a cell. A border is just a CSS decoration of a TD element.
squish decorator f h
applies f
to every item
in the list represented by h
(see flattenHeader
),
additionally applying decorator
if the item is
followed by some kind of boundary
So
o o o | o o o | o o
gets converted into
O O X O O X O O
Combinators
Convenience type for just one row (or column). To be used with combinators as follows:
example2 = empty ^..^ col "memtest 1" [] ^|^ col "memtest 2" [] ^||^ col "time test "[] ^|^ col "time test 2" [] +.+ row "A 1" ["hog", "terrible", "slow", "slower"] +.+ row "A 2" ["pig", "not bad", "fast", "slowest"] +----+ row "B 1" ["good", "awful", "intolerable", "bearable"] +.+ row "B 2" ["better", "no chance", "crawling", "amazing"] +.+ row "B 3" ["meh", "well...", "worst ever", "ok"]