{-# LANGUAGE TemplateHaskellQuotes #-}
module Css3.Selector.QuasiQuoters (
csssel, cssselFile, parseCss
) where
import Css3.Selector.Core(SelectorGroup, toPattern)
import Css3.Selector.Lexer(alexScanTokens)
import Css3.Selector.Parser(cssselector)
import Data.Data(Data, cast)
import Data.Text(pack, unpack)
import Language.Haskell.TH.Quote(QuasiQuoter(QuasiQuoter, quoteExp, quotePat, quoteType, quoteDec), quoteFile)
import Language.Haskell.TH.Syntax(Exp(AppE, VarE), Q, Type(ConT), dataToExpQ, lift, reportWarning)
parseCss :: String
-> SelectorGroup
parseCss :: String -> SelectorGroup
parseCss String
st = Either String [TokenLoc] -> SelectorGroup
al (String -> Either String [TokenLoc]
alexScanTokens String
st')
where st' :: String
st' = forall a. (a -> Bool) -> [a] -> [a]
filter (Char
'\r' forall a. Eq a => a -> a -> Bool
/=) String
st
al :: Either String [TokenLoc] -> SelectorGroup
al (Left String
er) = forall a. HasCallStack => String -> a
error String
er
al (Right [TokenLoc]
val) = [TokenLoc] -> SelectorGroup
cssselector [TokenLoc]
val
liftDataWithText :: Data a => a -> Q Exp
liftDataWithText :: forall a. Data a => a -> Q Exp
liftDataWithText = forall (m :: * -> *) a.
(Quote m, Data a) =>
(forall b. Data b => b -> Maybe (m Exp)) -> a -> m Exp
dataToExpQ ((((Exp -> Exp -> Exp
AppE (Name -> Exp
VarE 'pack) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast)
csssel :: QuasiQuoter
csssel :: QuasiQuoter
csssel = QuasiQuoter {
quoteExp :: String -> Q Exp
quoteExp = forall a. Data a => a -> Q Exp
liftDataWithText forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SelectorGroup
parseCss,
quotePat :: String -> Q Pat
quotePat = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToCssSelector a => a -> Pat
toPattern forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SelectorGroup
parseCss,
quoteType :: String -> Q Type
quoteType = forall a b. a -> b -> a
const (String -> Q ()
reportWarning String
"The type of the quasiquoter will always use the SelectorGroup type." forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (f :: * -> *) a. Applicative f => a -> f a
pure (Name -> Type
ConT ''SelectorGroup)),
quoteDec :: String -> Q [Dec]
quoteDec = forall a b. a -> b -> a
const (String -> Q ()
reportWarning String
"The use of this quasiquoter will not make any declarations." forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (f :: * -> *) a. Applicative f => a -> f a
pure [])
}
cssselFile :: QuasiQuoter
cssselFile :: QuasiQuoter
cssselFile = QuasiQuoter -> QuasiQuoter
quoteFile QuasiQuoter
csssel