| 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 |
Common.Lib.Tabular
Description
- 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 Properties
Constructors
| NoLine | |
| SingleLine | |
| DoubleLine |
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!
Arguments
| :: [Int] | width specifications |
| -> Header String | |
| -> Properties | |
| -> [String] |