Copyright | (c) Eric Kow <E.Y.Kow@brighton.ac.uk> |
---|---|
License | BSD3 |
Maintainer | Christian.Maeder@dfki.de |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe-Inferred |
- data Properties
- 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
- render :: (rh -> String) -> (ch -> String) -> (a -> String) -> Table rh ch a -> String
- renderColumns :: [Int] -> Header String -> String
- renderHLine :: [Int] -> Header String -> Properties -> [String]
- renderHLine' :: [Int] -> Char -> Header String -> String
Documentation
data Table rh ch a
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"] ] > putStr $ render id id id example +-----++-----------+-----------++-------------+-------------+ | || memtest 1 | memtest 2 || time test 1 | 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]
Retrieve the contents of a header
zipHeader :: h -> [h] -> Header a -> Header (h, a)
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]
squish :: (Properties -> b -> b) -> (h -> b) -> Header h -> [b]
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
data SemiTable h a
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"]
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
ascii art
render :: (rh -> String) -> (ch -> String) -> (a -> String) -> Table rh ch a -> String
for simplicity, we assume that each cell is rendered on a single line
We stop rendering on the shortest list!
:: [Int] | width specifications |
-> Header String | |
-> Properties | |
-> [String] |