Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Text.Layout.Table
Contents
Description
This module provides tools to layout text as grid or table. Besides basic things like specifying column positioning, alignment on the same character and length restriction it also provides advanced features like justifying text and fancy tables with styling support.
Some examples
Layouting text as a plain grid:
>>>
putStrLn $ layoutToString [["a", "b"], ["c", "d"]] (repeat def)
a b c d
Fancy table without header:
>>>
putStrLn $ layoutTableToString [rowGroup [["Jack", "184.74"]], rowGroup [["Jane", "162.2"]]] Nothing [def , numL] unicodeRoundS
╭──────┬────────╮ │ Jack │ 184.74 │ ├──────┼────────┤ │ Jane │ 162.2 │ ╰──────┴────────╯
Fancy table with header:
>>>
putStrLn $ layoutTableToString [ rowGroup [["A very long text", "0.42000000"]]
, rowGroup [["Short text", "100200.5"]] ] (Just (["Title", "Length"], repeat def)) [ fixedLeftL 20 , ColSpec (fixed 10) center dotAlign ellipsisCutMark ] unicodeRoundS ╭──────────────────────┬────────────╮ │ Title │ Length │ ╞══════════════════════╪════════════╡ │ A very long text │ 0.4200… │ ├──────────────────────┼────────────┤ │ Short text │ …200.5 │ ╰──────────────────────┴────────────╯
- data ColSpec
- column :: LenSpec -> Position H -> AlignSpec -> CutMarkSpec -> ColSpec
- numCol :: ColSpec
- fixedCol :: Int -> Position H -> ColSpec
- fixedLeftCol :: Int -> ColSpec
- data LenSpec
- expand :: LenSpec
- fixed :: Int -> LenSpec
- expandUntil :: Int -> LenSpec
- fixedUntil :: Int -> LenSpec
- data Position orientation
- data H
- left :: Position H
- right :: Position H
- center :: Position o
- data AlignSpec
- noAlign :: AlignSpec
- charAlign :: Char -> AlignSpec
- predAlign :: (Char -> Bool) -> AlignSpec
- dotAlign :: AlignSpec
- isAligned :: AlignSpec -> Bool
- data OccSpec
- data CutMarkSpec
- ellipsisCutMark :: CutMarkSpec
- noCutMark :: CutMarkSpec
- singleCutMark :: String -> CutMarkSpec
- cutMark :: String -> String -> CutMarkSpec
- module Data.Default.Class
- layoutToCells :: [[String]] -> [ColSpec] -> [[String]]
- layoutToLines :: [[String]] -> [ColSpec] -> [String]
- layoutToString :: [[String]] -> [ColSpec] -> String
- altLines :: [a -> b] -> [a] -> [b]
- checkeredCells :: (a -> b) -> (a -> b) -> [[a]] -> [[b]]
- data RowGroup
- rowGroup :: [[String]] -> RowGroup
- data HeaderColSpec
- headerColumn :: Position H -> Maybe CutMarkSpec -> HeaderColSpec
- layoutTableToLines :: [RowGroup] -> Maybe ([String], [HeaderColSpec]) -> [ColSpec] -> TableStyle -> [String]
- layoutTableToString :: [RowGroup] -> Maybe ([String], [HeaderColSpec]) -> [ColSpec] -> TableStyle -> String
- justify :: Int -> [String] -> [String]
- justifyText :: Int -> String -> [String]
- columnsAsGrid :: Position V -> [[[a]]] -> [[[a]]]
- top :: Position V
- bottom :: Position V
- data V
- justifyTextsAsGrid :: [(Int, String)] -> [[String]]
- justifyWordListsAsGrid :: [(Int, [String])] -> [[String]]
- module Text.Layout.Table.Style
- pad :: Position o -> Int -> String -> String
- trimOrPad :: Position o -> CutMarkSpec -> Int -> String -> String
- align :: OccSpec -> AlignInfo -> String -> String
- alignFixed :: Position o -> CutMarkSpec -> Int -> OccSpec -> AlignInfo -> String -> String
- data ColModInfo
- widthCMI :: ColModInfo -> Int
- unalignedCMI :: ColModInfo -> ColModInfo
- ensureWidthCMI :: Int -> Position H -> ColModInfo -> ColModInfo
- ensureWidthOfCMI :: String -> Position H -> ColModInfo -> ColModInfo
- columnModifier :: Position H -> CutMarkSpec -> ColModInfo -> String -> String
- data AlignInfo
- widthAI :: AlignInfo -> Int
- deriveColModInfos :: [(LenSpec, AlignSpec)] -> [[String]] -> [ColModInfo]
- deriveAlignInfo :: OccSpec -> String -> AlignInfo
Layout types and combinators
Specify the layout of columns.
fixedCol :: Int -> Position H -> ColSpec Source
Fixes the column length and positions according to the given Position
.
fixedLeftCol :: Int -> ColSpec Source
Fixes the column length and positions on the left.
expandUntil :: Int -> LenSpec Source
The column will expand as long as it is smaller as the given width.
fixedUntil :: Int -> LenSpec Source
The column will be at least as wide as the given width.
data CutMarkSpec Source
Specifies how the place looks where a String
has been cut. Note that the
cut mark may be cut itself, to fit into a column.
Instances
ellipsisCutMark :: CutMarkSpec Source
A single unicode character showing three dots is used as cut mark.
noCutMark :: CutMarkSpec Source
Don't use a cut mark.
singleCutMark :: String -> CutMarkSpec Source
Use the same cut mark for left and right.
cutMark :: String -> String -> CutMarkSpec Source
Display custom characters on a cut.
module Data.Default.Class
Basic grid and table layout
layoutToCells :: [[String]] -> [ColSpec] -> [[String]] Source
Modifies cells according to the given ColSpec
.
layoutToLines :: [[String]] -> [ColSpec] -> [String] Source
Behaves like layoutCells
but produces lines by joining with whitespace.
layoutToString :: [[String]] -> [ColSpec] -> String Source
Behaves like layoutCells
but produces a String
by joining with the
newline character.
Grid modification functions
altLines :: [a -> b] -> [a] -> [b] Source
Applies functions alternating to given lines. This makes it easy to color lines to improve readability in a row.
checkeredCells :: (a -> b) -> (a -> b) -> [[a]] -> [[b]] Source
Applies functions alternating to cells for every line, every other line gets shifted by one. This is useful for distinguishability of single cells in a grid arrangement.
Advanced table layout
data HeaderColSpec Source
Specifies how a header is layout, by omitting the cut mark it will use the
one specified in the ColSpec
like the other cells in that column.
headerColumn :: Position H -> Maybe CutMarkSpec -> HeaderColSpec Source
Arguments
:: [RowGroup] | Groups |
-> Maybe ([String], [HeaderColSpec]) | Optional header details |
-> [ColSpec] | Layout specification of columns |
-> TableStyle | Visual table style |
-> [String] |
Layouts a good-looking table with a optional header. Note that specifying fewer layout specifications than columns or vice versa will result in not showing them.
layoutTableToString :: [RowGroup] -> Maybe ([String], [HeaderColSpec]) -> [ColSpec] -> TableStyle -> String Source
Text justification
Text can easily be justified and distributed over multiple lines. Such columns can easily be combined with other columns.
justify :: Int -> [String] -> [String] Source
Fits as many words on a line, depending on the given width. Every line, but the last one, gets equally filled with spaces between the words, as far as possible.
justifyText :: Int -> String -> [String] Source
columnsAsGrid :: Position V -> [[[a]]] -> [[[a]]] Source
Merges multiple columns together and merges them to a valid grid without holes. The following example clarifies this:
>>>
columnsAsGrid top [justifyText 10 "This text will not fit on one line.", ["42", "23"]]
[["This text","42"],["will not","23"],["fit on one",""],["line.",""]]
justifyTextsAsGrid :: [(Int, String)] -> [[String]] Source
Justifies texts and presents the resulting lines in a grid structure (each text in one column).
justifyWordListsAsGrid :: [(Int, [String])] -> [[String]] Source
Justifies lists of words and presents the resulting lines in a grid structure (each list of words in one column). This is useful if you don't want to split just at whitespaces.
Table styles
module Text.Layout.Table.Style
Column modification functions
align :: OccSpec -> AlignInfo -> String -> String Source
Align a column by first finding the position to pad with and then padding the missing lengths to the maximum value. If no such position is found, it will align it such that it gets aligned before that position.
This function assumes:
ai <> deriveAlignInfo s = ai
alignFixed :: Position o -> CutMarkSpec -> Int -> OccSpec -> AlignInfo -> String -> String Source
Aligns a column using a fixed width, fitting it to the width by either filling or cutting while respecting the alignment.
Column modifaction primitives
data ColModInfo Source
Specifies how a column should be modified.
widthCMI :: ColModInfo -> Int Source
Get the exact width after the modification.
unalignedCMI :: ColModInfo -> ColModInfo Source
Remove alignment from a ColModInfo
. This is used to change alignment of
headers, while using the combined width information.
ensureWidthCMI :: Int -> Position H -> ColModInfo -> ColModInfo Source
Ensures that the modification provides a minimum width, but only if it is not limited.
ensureWidthOfCMI :: String -> Position H -> ColModInfo -> ColModInfo Source
Ensures that the given String
will fit into the modified columns.
columnModifier :: Position H -> CutMarkSpec -> ColModInfo -> String -> String Source
Generates a function which modifies a given String
according to
'Position H', CutMarkSpec
and ColModInfo
.
Specifies the length before and after a letter.
deriveColModInfos :: [(LenSpec, AlignSpec)] -> [[String]] -> [ColModInfo] Source
Derive the ColModInfo
by using layout specifications and looking at the
cells.