diff options
| author | jao <jao@gnu.org> | 2018-11-25 15:10:29 +0000 | 
|---|---|---|
| committer | jao <jao@gnu.org> | 2018-11-25 15:10:29 +0000 | 
| commit | 77df1ac30fa7af5948f7ff64f5fee9aed64552b3 (patch) | |
| tree | 647a4eb67ff1c293a5c530538ee88fc0093b577a /src/Xmobar/System/Environment.hs | |
| parent | e0d6da82de8d0d1cef98896164c6016b84e47068 (diff) | |
| download | xmobar-77df1ac30fa7af5948f7ff64f5fee9aed64552b3.tar.gz xmobar-77df1ac30fa7af5948f7ff64f5fee9aed64552b3.tar.bz2 | |
Back to app/src, since it seems they're the default convention for stack
Diffstat (limited to 'src/Xmobar/System/Environment.hs')
| -rw-r--r-- | src/Xmobar/System/Environment.hs | 49 | 
1 files changed, 49 insertions, 0 deletions
| diff --git a/src/Xmobar/System/Environment.hs b/src/Xmobar/System/Environment.hs new file mode 100644 index 0000000..86197db --- /dev/null +++ b/src/Xmobar/System/Environment.hs @@ -0,0 +1,49 @@ +----------------------------------------------------------------------------- +-- | +-- Module      :  XMobar.Environment +-- Copyright   :  (c) William Song +-- License     :  BSD-style (see LICENSE) +-- +-- Maintainer  :  Will Song <incertia@incertia.net> +-- Stability   :  stable +-- Portability :  portable +-- +-- A function to expand environment variables in strings +-- +----------------------------------------------------------------------------- +module Xmobar.System.Environment(expandEnv) where + +import Control.Applicative  ((<$>)) +import Data.Maybe (fromMaybe) +import System.Environment   (lookupEnv) + +expandEnv :: String -> IO String +expandEnv "" = return "" +expandEnv (c:s) = case c of +  '$'       -> do +    envVar <- fromMaybe "" <$> lookupEnv e +    remainder <- expandEnv s' +    return $ envVar ++ remainder +    where (e, s') = getVar s +          getVar "" = ("", "") +          getVar ('{':s'') = (takeUntil "}" s'', drop 1 . dropUntil "}" $ s'') +          getVar s'' = (takeUntil filterstr s'', dropUntil filterstr s'') +          filterstr = ",./? \t;:\"'~`!@#$%^&*()<>-+=\\|" +          takeUntil f = takeWhile (not . flip elem f) +          dropUntil f = dropWhile (not . flip elem f) + +  '\\' -> case s == "" of +    True  -> return "\\" +    False -> do +      remainder <- expandEnv $ drop 1 s +      return $ escString s ++ remainder +      where escString s' = let (cc:_) = s' in +              case cc of +                't' -> "\t" +                'n' -> "\n" +                '$' -> "$" +                _   -> [cc] + +  _    -> do +    remainder <- expandEnv s +    return $ c : remainder | 
