module Text.Tabular.Latex where
import Data.List (intersperse)
import Text.Tabular
render :: (rh -> String)
-> (ch -> String)
-> (a -> String)
-> Table rh ch a -> String
render :: (rh -> String)
-> (ch -> String) -> (a -> String) -> Table rh ch a -> String
render = [String]
-> (rh -> String)
-> (ch -> String)
-> (a -> String)
-> Table rh ch a
-> String
forall rh ch a.
[String]
-> (rh -> String)
-> (ch -> String)
-> (a -> String)
-> Table rh ch a
-> String
renderUsing (String -> [String]
forall a. a -> [a]
repeat "r")
renderUsing :: [String]
-> (rh -> String)
-> (ch -> String)
-> (a -> String) -> Table rh ch a -> String
renderUsing :: [String]
-> (rh -> String)
-> (ch -> String)
-> (a -> String)
-> Table rh ch a
-> String
renderUsing cols :: [String]
cols fr :: rh -> String
fr fc :: ch -> String
fc f :: a -> String
f (Table rh :: Header rh
rh ch :: Header ch
ch cells :: [[a]]
cells) =
[String] -> String
unlines ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ ( "\\begin{tabular}{" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
hspec String -> String -> String
forall a. [a] -> [a] -> [a]
++ "}")
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [ String -> String
addTableNl String
header
, String
hline
, ((Either Properties String -> String)
-> [Either Properties String] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Properties -> String)
-> (String -> String) -> Either Properties String -> String
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Properties -> String
vAttr String -> String
addTableNl) ([Either Properties String] -> String)
-> [Either Properties String] -> String
forall a b. (a -> b) -> a -> b
$
Header String -> [Either Properties String]
forall h. Header h -> [Either Properties h]
flattenHeader (Header String -> [Either Properties String])
-> Header String -> [Either Properties String]
forall a b. (a -> b) -> a -> b
$ (([a], String) -> String) -> Header ([a], String) -> Header String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([a], String) -> String
row (Header ([a], String) -> Header String)
-> Header ([a], String) -> Header String
forall a b. (a -> b) -> a -> b
$ [a] -> [[a]] -> Header String -> Header ([a], String)
forall h a. h -> [h] -> Header a -> Header (h, a)
zipHeader [] [[a]]
cells (Header String -> Header ([a], String))
-> Header String -> Header ([a], String)
forall a b. (a -> b) -> a -> b
$ (rh -> String) -> Header rh -> Header String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap rh -> String
fr Header rh
rh)
, "\\end{tabular}" ]
where
ch2 :: Header String
ch2 = Properties -> [Header String] -> Header String
forall h. Properties -> [Header h] -> Header h
Group Properties
DoubleLine [(String -> Header String
forall h. h -> Header h
Header ""),(ch -> String) -> Header ch -> Header String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ch -> String
fc Header ch
ch]
hspec :: String
hspec = (Either Properties (String, String) -> String)
-> [Either Properties (String, String)] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((Properties -> String)
-> ((String, String) -> String)
-> Either Properties (String, String)
-> String
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Properties -> String
hAttr (String, String) -> String
forall a b. (a, b) -> a
fst) ([Either Properties (String, String)] -> String)
-> [Either Properties (String, String)] -> String
forall a b. (a -> b) -> a -> b
$ Header (String, String) -> [Either Properties (String, String)]
forall h. Header h -> [Either Properties h]
flattenHeader
(Header (String, String) -> [Either Properties (String, String)])
-> Header (String, String) -> [Either Properties (String, String)]
forall a b. (a -> b) -> a -> b
$ String -> [String] -> Header String -> Header (String, String)
forall h a. h -> [h] -> Header a -> Header (h, a)
zipHeader "" [String]
cols Header String
ch2
header :: String
header = [String] -> String
texCols ([String] -> String)
-> (Header String -> [String]) -> Header String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
label ([String] -> [String])
-> (Header String -> [String]) -> Header String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Header String -> [String]
forall h. Header h -> [h]
headerContents (Header String -> String) -> Header String -> String
forall a b. (a -> b) -> a -> b
$ Header String
ch2
row :: ([a], String) -> String
row (cs :: [a]
cs,h :: String
h) = [String] -> String
texCols ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String -> String
label String
h String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (a -> String) -> [a] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map a -> String
f [a]
cs
texCols :: [String] -> String
texCols = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse " & "
texRows :: [String] -> [String]
texRows = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
addTableNl
rhStrings :: [rh]
rhStrings = Header rh -> [rh]
forall h. Header h -> [h]
headerContents Header rh
rh
hline :: String
hline :: String
hline = "\\hline"
addTableNl :: String -> String
addTableNl :: String -> String
addTableNl = (String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\\\\\n")
label :: String -> String
label :: String -> String
label s :: String
s = "\\textbf{" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ "}"
hAttr :: Properties -> String
hAttr :: Properties -> String
hAttr NoLine = ""
hAttr SingleLine = "|"
hAttr DoubleLine = "||"
vAttr :: Properties -> String
vAttr :: Properties -> String
vAttr NoLine = ""
vAttr SingleLine = String
hline
vAttr DoubleLine = String
hline String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
hline