{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module OpenSuse.StripSpace ( stripSpace ) where
import OpenSuse.Prelude
import qualified Data.Text as Text
-- | A (quite possibly inefficient) re-implementation of @git stripspace@. This
-- function normalizes a 'Text' buffer to conform to the following rules:
--
-- * All trailing white space is stripped.
--
-- * Empty lines at the beginning or at the end of the buffer are stripped.
--
-- * Consecutive empty lines between paragraphs are collapsed into one.
--
-- * @\r\n@ line endings are normalized into @\n@.
--
-- * If the buffer is not empty, then its last line is terminated by @\n@.
--
-- * If the buffer is empty (i.e. it contains only white space), then it comes
-- out as the empty string.
stripSpace :: Text -> Text
stripSpace = Text.unlines
. normalizeEndOfText
. normalizeEmptyLines Skip
. map Text.stripEnd
. Text.lines
data Mode = Skip | Keep
normalizeEmptyLines :: Mode -> [Text] -> [Text]
normalizeEmptyLines _ [] = []
normalizeEmptyLines Skip ("":ls) = normalizeEmptyLines Skip ls
normalizeEmptyLines Keep ("":ls) = "" : normalizeEmptyLines Skip ls
normalizeEmptyLines _ (l:ls) = l : normalizeEmptyLines Keep ls
normalizeEndOfText :: [Text] -> [Text]
normalizeEndOfText = reverse . dropWhile Text.null . reverse