-----------------------------------------------------------------------------
-- |
-- 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