{-# LANGUAGE FlexibleContexts, CPP #-}
module Xmobar.Config.Parse(readConfig
, parseConfig
, indexedFont
, indexedOffset
, colorComponents) where
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Number (int)
import Text.ParserCombinators.Parsec.Perm ((<|?>), (<$?>), permute)
import Control.Monad.IO.Class (liftIO)
import Data.Functor ((<&>))
import Xmobar.Config.Types
import qualified System.IO as S (readFile)
colorComponents :: Config -> String -> (String, String)
colorComponents :: Config -> String -> (String, String)
colorComponents Config
conf String
c =
case forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
==Char
',') String
c of
(String
f,Char
',':String
b) -> (String
f, String
b)
(String
f, String
_) -> (String
f, Config -> String
bgColor Config
conf)
stripComments :: String -> String
=
[String] -> String
unlines forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (forall a. FontIndex -> [a] -> [a]
drop FontIndex
5 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String -> String
strip Bool
False forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. FontIndex -> a -> [a]
replicate FontIndex
5 Char
' 'forall a. [a] -> [a] -> [a]
++)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines
where strip :: Bool -> String -> String
strip Bool
m (Char
'-':Char
'-':String
xs) = if Bool
m then String
"--" forall a. [a] -> [a] -> [a]
++ Bool -> String -> String
strip Bool
m String
xs else String
""
strip Bool
m (Char
'"':String
xs) = Char
'"'forall a. a -> [a] -> [a]
: Bool -> String -> String
strip (Bool -> Bool
not Bool
m) String
xs
strip Bool
m (Char
x:String
xs) = Char
x forall a. a -> [a] -> [a]
: Bool -> String -> String
strip Bool
m String
xs
strip Bool
_ [] = []
parseConfig :: Config -> String -> Either ParseError (Config,[String])
parseConfig :: Config -> String -> Either ParseError (Config, [String])
parseConfig Config
defaultConfig =
forall tok st a.
GenParser tok st a -> st -> String -> [tok] -> Either ParseError a
runParser ParsecT String [String] Identity (Config, [String])
parseConf [String]
fields String
"Config" forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
stripComments
where
parseConf :: ParsecT String [String] Identity (Config, [String])
parseConf = do
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
forall {u}. [String] -> ParsecT String u Identity ()
sepEndSpc [String
"Config",String
"{"]
Config
x <- Parsec String [String] Config
perms
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
[String]
s <- forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
forall (m :: * -> *) a. Monad m => a -> m a
return (Config
x, [String]
s)
perms :: Parsec String [String] Config
perms = forall s tok st a.
Stream s Identity tok =>
StreamPermParser s st a -> Parsec s st a
permute forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> String
-> String
-> String
-> String
-> XPosition
-> Bool
-> TextOutputFormat
-> FontIndex
-> [FontIndex]
-> FontIndex
-> Border
-> String
-> FontIndex
-> FontIndex
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> [Runnable]
-> String
-> String
-> String
-> Bool
-> SignalChan
-> Double
-> Config
Config
forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> (a, Parsec s st a) -> StreamPermParser s st b
<$?> (String, ParsecT String [String] Identity String)
pFont forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> ([String], ParsecT String [String] Identity [String])
pFontList forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pWmClass forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pWmName
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pBgColor forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pFgColor forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (XPosition, ParsecT String [String] Identity XPosition)
pPosition
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pTextOutput forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (TextOutputFormat,
ParsecT String [String] Identity TextOutputFormat)
pTextOutputFormat
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (FontIndex, ParsecT String [String] Identity FontIndex)
pTextOffset forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> ([FontIndex], ParsecT String [String] Identity [FontIndex])
pTextOffsets
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (FontIndex, ParsecT String [String] Identity FontIndex)
pIconOffset forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Border, ParsecT String [String] Identity Border)
pBorder
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pBdColor forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (FontIndex, ParsecT String [String] Identity FontIndex)
pBdWidth forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (FontIndex, ParsecT String [String] Identity FontIndex)
pAlpha forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pHideOnStart
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pAllDesktops forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pOverrideRedirect forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pPickBroadest
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pLowerOnStart forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pPersistent forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pIconRoot
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> ([Runnable], ParsecT String [String] Identity [Runnable])
pCommands forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pSepChar forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pAlignSep forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (String, ParsecT String [String] Identity String)
pTemplate
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Bool, ParsecT String [String] Identity Bool)
pVerbose forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> forall {b}. (SignalChan, ParsecT String [String] Identity b)
pSignal forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (Double, ParsecT String [String] Identity Double)
pDpi
fields :: [String]
fields = [ String
"font", String
"additionalFonts", String
"bgColor", String
"fgColor"
, String
"wmClass", String
"wmName", String
"sepChar"
, String
"alignSep" , String
"border", String
"borderColor" ,String
"template"
, String
"position" , String
"textOffset", String
"textOffsets", String
"iconOffset"
, String
"allDesktops", String
"overrideRedirect", String
"pickBroadest"
, String
"hideOnStart", String
"lowerOnStart", String
"persistent", String
"iconRoot"
, String
"alpha", String
"commands", String
"verbose", String
"signal", String
"textOutput"
, String
"textOutputFormat", String
"dpi"
]
pTextOutput :: (Bool, ParsecT String [String] Identity Bool)
pTextOutput = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
textOutput String
"textOutput"
pTextOutputFormat :: (TextOutputFormat,
ParsecT String [String] Identity TextOutputFormat)
pTextOutputFormat = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> TextOutputFormat
textOutputFormat String
"textOutputFormat"
pFont :: (String, ParsecT String [String] Identity String)
pFont = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
font String
"font"
pFontList :: ([String], ParsecT String [String] Identity [String])
pFontList = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity [String])
strListField Config -> [String]
additionalFonts String
"additionalFonts"
pWmClass :: (String, ParsecT String [String] Identity String)
pWmClass = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
wmClass String
"wmClass"
pWmName :: (String, ParsecT String [String] Identity String)
pWmName = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
wmName String
"wmName"
pBgColor :: (String, ParsecT String [String] Identity String)
pBgColor = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
bgColor String
"bgColor"
pFgColor :: (String, ParsecT String [String] Identity String)
pFgColor = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
fgColor String
"fgColor"
pBdColor :: (String, ParsecT String [String] Identity String)
pBdColor = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
borderColor String
"borderColor"
pSepChar :: (String, ParsecT String [String] Identity String)
pSepChar = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
sepChar String
"sepChar"
pAlignSep :: (String, ParsecT String [String] Identity String)
pAlignSep = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
alignSep String
"alignSep"
pTemplate :: (String, ParsecT String [String] Identity String)
pTemplate = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> String
template String
"template"
pTextOffset :: (FontIndex, ParsecT String [String] Identity FontIndex)
pTextOffset = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> FontIndex
textOffset String
"textOffset"
pTextOffsets :: ([FontIndex], ParsecT String [String] Identity [FontIndex])
pTextOffsets = forall {a}.
(Config -> a)
-> String -> (a, ParsecT String [String] Identity [FontIndex])
readIntList Config -> [FontIndex]
textOffsets String
"textOffsets"
pIconOffset :: (FontIndex, ParsecT String [String] Identity FontIndex)
pIconOffset = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> FontIndex
iconOffset String
"iconOffset"
pPosition :: (XPosition, ParsecT String [String] Identity XPosition)
pPosition = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> XPosition
position String
"position"
pHideOnStart :: (Bool, ParsecT String [String] Identity Bool)
pHideOnStart = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
hideOnStart String
"hideOnStart"
pLowerOnStart :: (Bool, ParsecT String [String] Identity Bool)
pLowerOnStart = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
lowerOnStart String
"lowerOnStart"
pPersistent :: (Bool, ParsecT String [String] Identity Bool)
pPersistent = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
persistent String
"persistent"
pBorder :: (Border, ParsecT String [String] Identity Border)
pBorder = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Border
border String
"border"
pBdWidth :: (FontIndex, ParsecT String [String] Identity FontIndex)
pBdWidth = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> FontIndex
borderWidth String
"borderWidth"
pAllDesktops :: (Bool, ParsecT String [String] Identity Bool)
pAllDesktops = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
allDesktops String
"allDesktops"
pOverrideRedirect :: (Bool, ParsecT String [String] Identity Bool)
pOverrideRedirect = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
overrideRedirect String
"overrideRedirect"
pPickBroadest :: (Bool, ParsecT String [String] Identity Bool)
pPickBroadest = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
pickBroadest String
"pickBroadest"
pIconRoot :: (String, ParsecT String [String] Identity String)
pIconRoot = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> String
iconRoot String
"iconRoot"
pAlpha :: (FontIndex, ParsecT String [String] Identity FontIndex)
pAlpha = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> FontIndex
alpha String
"alpha"
pVerbose :: (Bool, ParsecT String [String] Identity Bool)
pVerbose = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Bool
verbose String
"verbose"
pDpi :: (Double, ParsecT String [String] Identity Double)
pDpi = forall {b} {a}.
Read b =>
(Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> Double
dpi String
"dpi"
pSignal :: (SignalChan, ParsecT String [String] Identity b)
pSignal = forall {a} {b}.
(Config -> a)
-> String
-> ParsecT String [String] Identity b
-> (a, ParsecT String [String] Identity b)
field Config -> SignalChan
signal String
"signal" forall a b. (a -> b) -> a -> b
$
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"signal is meant for use with Xmobar as a library.\n It is not meant for use in the configuration file."
pCommands :: ([Runnable], ParsecT String [String] Identity [Runnable])
pCommands = forall {a} {b}.
(Config -> a)
-> String
-> ParsecT String [String] Identity b
-> (a, ParsecT String [String] Identity b)
field Config -> [Runnable]
commands String
"commands" forall {u}. ParsecT String u Identity [Runnable]
readCommands
staticPos :: ParsecT String u Identity String
staticPos = do forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"Static"
forall {s} {m :: * -> *} {u} {b}.
Stream s m Char =>
ParsecT s u m b -> ParsecT s u m b
wrapSkip (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"{")
String
p <- forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"}")
forall {s} {m :: * -> *} {u} {b}.
Stream s m Char =>
ParsecT s u m b -> ParsecT s u m b
wrapSkip (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"}")
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
","
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"Static {" forall a. [a] -> [a] -> [a]
++ String
p forall a. [a] -> [a] -> [a]
++ String
"}")
tillFieldEnd :: ParsecT String u Identity String
tillFieldEnd = forall {u}. ParsecT String u Identity String
staticPos forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
",}\n\r")
commandsEnd :: ParsecT String u Identity String
commandsEnd = forall {s} {m :: * -> *} {u} {b}.
Stream s m Char =>
ParsecT s u m b -> ParsecT s u m b
wrapSkip (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"]") forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"}" forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall {u}. ParsecT String u Identity String
notNextRun)
notNextRun :: ParsecT String u Identity String
notNextRun = do {forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
","
; forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy forall a b. (a -> b) -> a -> b
$ forall {s} {m :: * -> *} {u} {b}.
Stream s m Char =>
ParsecT s u m b -> ParsecT s u m b
wrapSkip forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"Run"
; forall (m :: * -> *) a. Monad m => a -> m a
return String
","
}
readCommands :: ParsecT String u Identity [Runnable]
readCommands = forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar (forall tok st a. GenParser tok st a -> GenParser tok st a
try forall {u}. ParsecT String u Identity String
commandsEnd) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
forall {a} {m :: * -> *}.
(Read a, MonadFail m) =>
String -> String -> m a
read' String
commandsErr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. [a] -> [a] -> [a]
(++) String
"]"
strField :: (Config -> a)
-> String -> (a, ParsecT String [String] Identity String)
strField Config -> a
e String
n = forall {a} {b}.
(Config -> a)
-> String
-> ParsecT String [String] Identity b
-> (a, ParsecT String [String] Identity b)
field Config -> a
e String
n forall {u}. ParsecT String u Identity String
strMulti
strMulti :: ParsecT String u Identity String
strMulti = forall {u}. Char -> ParsecT String u Identity String
scan Char
'"'
where
scan :: Char -> ParsecT String u Identity String
scan Char
lead = do
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
lead
String
s <- forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar (forall {u}. ParsecT String u Identity String
rowCont forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall {u}. ParsecT String u Identity String
unescQuote)
(forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return String
s) forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String
s forall a. [a] -> [a] -> [a]
++) (Char -> ParsecT String u Identity String
scan Char
'\\')
rowCont :: GenParser Char st String
rowCont = forall tok st a. GenParser tok st a -> GenParser tok st a
try forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"\n"
unescQuote :: ParsecT String u Identity String
unescQuote = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"\\") forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"\"")
strListField :: (Config -> a)
-> String -> (a, ParsecT String [String] Identity [String])
strListField Config -> a
e String
n = forall {a} {b}.
(Config -> a)
-> String
-> ParsecT String [String] Identity b
-> (a, ParsecT String [String] Identity b)
field Config -> a
e String
n forall {u}. ParsecT String u Identity [String]
strList
strList :: ParsecT String u Identity [String]
strList = do
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'['
[String]
list <- forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
sepBy (forall {u}. ParsecT String u Identity String
strMulti forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \String
x -> forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return String
x) (forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',')
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']'
forall (m :: * -> *) a. Monad m => a -> m a
return [String]
list
wrapSkip :: ParsecT s u m b -> ParsecT s u m b
wrapSkip ParsecT s u m b
x = forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m b
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
r -> forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return b
r
sepEndSpc :: [String] -> ParsecT String u Identity ()
sepEndSpc = forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall {s} {m :: * -> *} {u} {b}.
Stream s m Char =>
ParsecT s u m b -> ParsecT s u m b
wrapSkip forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall tok st a. GenParser tok st a -> GenParser tok st a
try forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string)
fieldEnd :: ParsecT String u Identity String
fieldEnd = forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
",}"
field :: (Config -> a)
-> String
-> ParsecT String [String] Identity b
-> (a, ParsecT String [String] Identity b)
field Config -> a
e String
n ParsecT String [String] Identity b
c = (,) (Config -> a
e Config
defaultConfig) forall a b. (a -> b) -> a -> b
$
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
updateState (forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
/= String
n)) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall {u}. [String] -> ParsecT String u Identity ()
sepEndSpc [String
n,String
"="] forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
forall {s} {m :: * -> *} {u} {b}.
Stream s m Char =>
ParsecT s u m b -> ParsecT s u m b
wrapSkip ParsecT String [String] Identity b
c forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \b
r -> forall {u}. ParsecT String u Identity String
fieldEnd forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return b
r
readField :: (Config -> a) -> String -> (a, ParsecT String [String] Identity b)
readField Config -> a
a String
n = forall {a} {b}.
(Config -> a)
-> String
-> ParsecT String [String] Identity b
-> (a, ParsecT String [String] Identity b)
field Config -> a
a String
n forall a b. (a -> b) -> a -> b
$ forall {u}. ParsecT String u Identity String
tillFieldEnd forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {a} {m :: * -> *}.
(Read a, MonadFail m) =>
String -> String -> m a
read' String
n
readIntList :: (Config -> a)
-> String -> (a, ParsecT String [String] Identity [FontIndex])
readIntList Config -> a
d String
n = forall {a} {b}.
(Config -> a)
-> String
-> ParsecT String [String] Identity b
-> (a, ParsecT String [String] Identity b)
field Config -> a
d String
n forall {u}. ParsecT String u Identity [FontIndex]
intList
intList :: ParsecT String u Identity [FontIndex]
intList = do
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'['
[FontIndex]
list <- forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
sepBy (forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall i st. Integral i => CharParser st i
int forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \FontIndex
x-> forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return FontIndex
x) (forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',')
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']'
forall (m :: * -> *) a. Monad m => a -> m a
return [FontIndex]
list
read' :: String -> String -> m a
read' String
d String
s = case forall a. Read a => ReadS a
reads String
s of
[(a
x, String
_)] -> forall (m :: * -> *) a. Monad m => a -> m a
return a
x
[(a, String)]
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"error reading the " forall a. [a] -> [a] -> [a]
++ String
d forall a. [a] -> [a] -> [a]
++ String
" field: " forall a. [a] -> [a] -> [a]
++ String
s
commandsErr :: String
commandsErr :: String
commandsErr = String
"commands: this usually means that a command could not" forall a. [a] -> [a] -> [a]
++
String
"\nbe parsed." forall a. [a] -> [a] -> [a]
++
String
"\nThe error could be located at the begining of the command" forall a. [a] -> [a] -> [a]
++
String
"\nwhich follows the offending one."
readConfig :: Config -> FilePath -> IO (Either ParseError (Config,[String]))
readConfig :: Config -> String -> IO (Either ParseError (Config, [String]))
readConfig Config
defaultConfig String
f =
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (String -> IO String
S.readFile String
f) forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> Config -> String -> Either ParseError (Config, [String])
parseConfig Config
defaultConfig
indexedFont :: Config -> FontIndex -> String
indexedFont :: Config -> FontIndex -> String
indexedFont Config
config FontIndex
idx =
if FontIndex
idx forall a. Ord a => a -> a -> Bool
< FontIndex
1 Bool -> Bool -> Bool
|| FontIndex
idx forall a. Ord a => a -> a -> Bool
> forall (t :: * -> *) a. Foldable t => t a -> FontIndex
length (Config -> [String]
additionalFonts Config
config)
then Config -> String
font Config
config else Config -> [String]
additionalFonts Config
config forall a. [a] -> FontIndex -> a
!! (FontIndex
idx forall a. Num a => a -> a -> a
- FontIndex
1)
indexedOffset :: Config -> FontIndex -> Int
indexedOffset :: Config -> FontIndex -> FontIndex
indexedOffset Config
config FontIndex
idx =
if FontIndex
idx forall a. Ord a => a -> a -> Bool
< FontIndex
1 Bool -> Bool -> Bool
|| FontIndex
idx forall a. Ord a => a -> a -> Bool
> forall (t :: * -> *) a. Foldable t => t a -> FontIndex
length (Config -> [FontIndex]
textOffsets Config
config)
then Config -> FontIndex
textOffset Config
config else Config -> [FontIndex]
textOffsets Config
config forall a. [a] -> FontIndex -> a
!! (FontIndex
idx forall a. Num a => a -> a -> a
- FontIndex
1)