diff options
author | Will Song <incertia9474@gmail.com> | 2016-07-16 16:15:33 -0500 |
---|---|---|
committer | jao <jao@gnu.org> | 2016-07-27 01:00:06 +0200 |
commit | a93755b2d1e9efbd63723f5302ca7c8f43521aa8 (patch) | |
tree | fd6478184be41063af8c618e2bb0932179ba18a5 /src/Environment.hs | |
parent | c98752cad2343932d42d2fef2229581f0c266800 (diff) | |
download | xmobar-a93755b2d1e9efbd63723f5302ca7c8f43521aa8.tar.gz xmobar-a93755b2d1e9efbd63723f5302ca7c8f43521aa8.tar.bz2 |
Add expandEnv function and use it in PipeReader family of monitors
expandEnv takes a string and expands the environment variables it can
find. variable substringing (e.g. ${VAR:1} to lop off the first
character) is not supported, but $VAR and ${VAR} formats are, with the
former being delimited by punctuation, but not underscores.
Diffstat (limited to 'src/Environment.hs')
-rw-r--r-- | src/Environment.hs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/Environment.hs b/src/Environment.hs new file mode 100644 index 0000000..ebdf733 --- /dev/null +++ b/src/Environment.hs @@ -0,0 +1,48 @@ +----------------------------------------------------------------------------- +-- | +-- 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 Environment where + +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:ss) = s in + case cc of + 't' -> "\t" + 'n' -> "\n" + '$' -> "$" + _ -> [cc] + + _ -> do + remainder <- expandEnv s + return $ c : remainder |