diff options
author | jao <jao@gnu.org> | 2018-11-25 07:35:54 +0000 |
---|---|---|
committer | jao <jao@gnu.org> | 2018-11-25 07:35:54 +0000 |
commit | 426c931d5b0ebc6d53396c34ec38eb342be501c3 (patch) | |
tree | 85ee8fc4b09384017b52a4822b61ebceffb8e95b /src/lib/Xmobar/Run/Template.hs | |
parent | c763954685fd3f4d8998cd26cb4b9625fe6cb8e6 (diff) | |
download | xmobar-426c931d5b0ebc6d53396c34ec38eb342be501c3.tar.gz xmobar-426c931d5b0ebc6d53396c34ec38eb342be501c3.tar.bz2 |
Refactoring: Xmobar.Run
Diffstat (limited to 'src/lib/Xmobar/Run/Template.hs')
-rw-r--r-- | src/lib/Xmobar/Run/Template.hs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/lib/Xmobar/Run/Template.hs b/src/lib/Xmobar/Run/Template.hs new file mode 100644 index 0000000..5bada89 --- /dev/null +++ b/src/lib/Xmobar/Run/Template.hs @@ -0,0 +1,65 @@ +------------------------------------------------------------------------------ +-- | +-- Module: Xmobar.Template +-- Copyright: (c) 2018 Jose Antonio Ortega Ruiz +-- License: BSD3-style (see LICENSE) +-- +-- Maintainer: jao@gnu.org +-- Stability: unstable +-- Portability: portable +-- Created: Sun Nov 25, 2018 05:49 +-- +-- +-- Handling the top-level output template +-- +------------------------------------------------------------------------------ + + +module Xmobar.Run.Template(parseCommands) where + +import qualified Data.Map as Map +import Text.ParserCombinators.Parsec + +import Xmobar.Run.Commands +import Xmobar.Run.Runnable +import Xmobar.Config + +-- | Parses the output template string +templateStringParser :: Config -> Parser (String,String,String) +templateStringParser c = do + s <- allTillSep c + com <- templateCommandParser c + ss <- allTillSep c + return (com, s, ss) + +-- | Parses the command part of the template string +templateCommandParser :: Config -> Parser String +templateCommandParser c = + let chr = char . head . sepChar + in between (chr c) (chr c) (allTillSep c) + +-- | Combines the template parsers +templateParser :: Config -> Parser [(String,String,String)] +templateParser = many . templateStringParser + +-- | Actually runs the template parsers +parseCommands :: Config -> String -> IO [(Runnable,String,String)] +parseCommands c s = + do str <- case parse (templateParser c) "" s of + Left _ -> return [("", s, "")] + Right x -> return x + let cl = map alias (commands c) + m = Map.fromList $ zip cl (commands c) + return $ combine c m str + +-- | Given a finite "Map" and a parsed template produce the resulting +-- output string. +combine :: Config -> Map.Map String Runnable + -> [(String, String, String)] -> [(Runnable,String,String)] +combine _ _ [] = [] +combine c m ((ts,s,ss):xs) = (com, s, ss) : combine c m xs + where com = Map.findWithDefault dflt ts m + dflt = Run $ Com ts [] [] 10 + +allTillSep :: Config -> Parser String +allTillSep = many . noneOf . sepChar |