----------------------------------------------------------------------------- -- | -- Module : Distribution.PrettyUtils -- Copyright : (c) The University of Glasgow 2004 -- License : BSD3 -- -- Maintainer : cabal-devel@haskell.org -- Portability : portable -- -- Utilities for pretty printing. {-# OPTIONS_HADDOCK hide #-} module Distribution.PrettyUtils ( Separator, -- * Internal showFilePath, showToken, showTestedWith, showFreeText, indentWith, ) where import Prelude () import Distribution.Compat.Prelude import Distribution.Compiler (CompilerFlavor) import Distribution.Version (VersionRange) import Distribution.Text (disp) import Text.PrettyPrint (Doc, text, vcat, (<+>)) type Separator = ([Doc] -> Doc) showFilePath :: FilePath -> Doc showFilePath "" = mempty showFilePath x = showToken x showToken :: String -> Doc showToken str | not (any dodgy str) && not (null str) = text str | otherwise = text (show str) where dodgy c = isSpace c || c == ',' showTestedWith :: (CompilerFlavor, VersionRange) -> Doc showTestedWith (compiler, vr) = text (show compiler) <+> disp vr -- | Pretty-print free-format text, ensuring that it is vertically aligned, -- and with blank lines replaced by dots for correct re-parsing. showFreeText :: String -> Doc showFreeText "" = mempty showFreeText s = vcat [text (if null l then "." else l) | l <- lines_ s] -- | 'lines_' breaks a string up into a list of strings at newline -- characters. The resulting strings do not contain newlines. lines_ :: String -> [String] lines_ [] = [""] lines_ s = let (l, s') = break (== '\n') s in l : case s' of [] -> [] (_:s'') -> lines_ s'' -- | the indentation used for pretty printing indentWith :: Int indentWith = 4