packages feed

Tablify-0.8: src/FixedWidth.hs

module FixedWidth
    (Joints, fixedWidthTable) where

import Prelude hiding (length, replicate)
import Data.List hiding (length, replicate)

import Utilities

pad :: Integer -> String -> String
pad n str = str ++ replicate (n - length str) ' '

-- given a table, return a list of the maximum widths of each column
columnWidths :: Table -> [Integer]
columnWidths table = map (maximum . map length) $ transpose table

boxRow :: [Integer] -> Char -> String -> String -> String -> String
boxRow widths sp left mid right = 
       left 
    ++ intercalate mid (map (\x -> replicate (x+2) sp) widths)
    ++ right

type Joints = (String,String,String)

surround :: Char -> String -> String
surround c s = [c] ++ s ++ [c]

-- We used to call this ASCII art, but these days it's Unicode.
fixedWidthTable :: Joints -> Joints -> Joints -> Char -> Char -> Table -> String
fixedWidthTable (tl,tm,tr) (ml, mm, mr) (bl, bm, br) h v table = 
        intercalate "\n" [btop, bhead, bmid, body, bbot]
    where
        -- I'm pattern matching the (0,0) as a way of 
        -- checking that the table is valid
        widths = columnWidths table
                
        btop = boxRow widths h tl tm tr
        bmid = boxRow widths h ml mm mr
        bbot = boxRow widths h bl bm br
        
        bhead, body :: String
        bhead = formatRow (head table)
        body  = intercalate "\n" $ map formatRow (tail table)

        formatRow row = surround v $ intercalate [v] $ 
                        zipWith formatCell row widths
        formatCell :: String -> Integer -> String
        formatCell val width = surround ' ' $ pad width val