summaryrefslogtreecommitdiffhomepage
path: root/src/lib/Xmobar/Run/Template.hs
diff options
context:
space:
mode:
authorjao <jao@gnu.org>2018-11-25 07:35:54 +0000
committerjao <jao@gnu.org>2018-11-25 07:35:54 +0000
commit426c931d5b0ebc6d53396c34ec38eb342be501c3 (patch)
tree85ee8fc4b09384017b52a4822b61ebceffb8e95b /src/lib/Xmobar/Run/Template.hs
parentc763954685fd3f4d8998cd26cb4b9625fe6cb8e6 (diff)
downloadxmobar-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.hs65
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