xmonad-wallpaper-0.0.1.1: src/XMonad/Wallpaper/Expand.hs
module XMonad.Wallpaper.Expand (expand) where
import Control.Monad.State
import Data.List
import Data.Char
import System.Posix.Env
import Data.Maybe
import Control.Applicative
data AST = Variable String | Literal String
deriving (Show)
isExpr a = isAlphaNum a || a == '_'
literal str =
let (a, b) = break (== '$') str in (Literal a, b)
variable ('{':as) =
let (a, b) = break (== '}') as in (Variable a, tail b)
variable as =
let (a, b) = break (not . isExpr) as in (Variable a, b)
parse [] = []
parse ('$':as) =
let (a, b) = variable as in a : parse b
parse as =
let (a, b) = literal as in a : parse b
interpolate (Variable var) = maybe "" id <$> getEnv var
interpolate (Literal str) = return str
expand :: String -> IO String
{- |
Expand string using environment variables.
The following syntax are supported
> epxand $HOME/Pictures
\/home\/user/Pictures
> expand ${HOME}ABC
\/home\/userABC
-}
expand str = do
let ast = parse str
concat <$> mapM interpolate ast