{-# LANGUAGE OverloadedStrings #-} module Data.CSS.Style.Selector.LowerWhere( WhereLowerer(..) ) where import Data.CSS.Syntax.Selector import Data.CSS.Style.Common lowerSelector :: Selector -> [Selector] lowerSelector :: Selector -> [Selector] lowerSelector (Element [Psuedoclass Text c [Token] args]) | Text c Text -> [Text] -> Bool forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [Text "is", Text "where"], ([Selector] args', []) <- Parser [Selector] parseSelectors [Token] args = [Selector] args' lowerSelector (Element [SimpleSelector] sel) = [[SimpleSelector] -> Selector Element ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector forall a b. (a -> b) -> a -> b $ [SimpleSelector] -> [SimpleSelector] lowerSelector' [SimpleSelector] sel] lowerSelector (Child Selector sel [SimpleSelector] x) = [Selector -> [SimpleSelector] -> Selector Child Selector sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector forall a b. (a -> b) -> a -> b $ [SimpleSelector] -> [SimpleSelector] lowerSelector' [SimpleSelector] x | Selector sel' <- Selector -> [Selector] lowerSelector Selector sel] lowerSelector (Descendant Selector sel [SimpleSelector] x) = [Selector -> [SimpleSelector] -> Selector Descendant Selector sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector forall a b. (a -> b) -> a -> b $ [SimpleSelector] -> [SimpleSelector] lowerSelector' [SimpleSelector] x | Selector sel' <- Selector -> [Selector] lowerSelector Selector sel] lowerSelector (Adjacent Selector sel [SimpleSelector] x) = [Selector -> [SimpleSelector] -> Selector Adjacent Selector sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector forall a b. (a -> b) -> a -> b $ [SimpleSelector] -> [SimpleSelector] lowerSelector' [SimpleSelector] x | Selector sel' <- Selector -> [Selector] lowerSelector Selector sel] lowerSelector (Sibling Selector sel [SimpleSelector] x) = [Selector -> [SimpleSelector] -> Selector Sibling Selector sel' ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector forall a b. (a -> b) -> a -> b $ [SimpleSelector] -> [SimpleSelector] lowerSelector' [SimpleSelector] x | Selector sel' <- Selector -> [Selector] lowerSelector Selector sel] lowerSelector' :: [SimpleSelector] -> [SimpleSelector] lowerSelector' :: [SimpleSelector] -> [SimpleSelector] lowerSelector' (Psuedoclass Text c [Token] args:[SimpleSelector] sel) | Text c Text -> [Text] -> Bool forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `elem` [Text "is", Text "where"], ([Element [SimpleSelector] arg'], []) <- Parser [Selector] parseSelectors [Token] args = [SimpleSelector] arg' [SimpleSelector] -> [SimpleSelector] -> [SimpleSelector] forall a. [a] -> [a] -> [a] ++ [SimpleSelector] -> [SimpleSelector] lowerSelector' [SimpleSelector] sel lowerSelector' (SimpleSelector test:[SimpleSelector] tests) = SimpleSelector test SimpleSelector -> [SimpleSelector] -> [SimpleSelector] forall a. a -> [a] -> [a] : [SimpleSelector] -> [SimpleSelector] lowerSelector' [SimpleSelector] tests lowerSelector' [] = [] data WhereLowerer s = WhereLowerer s instance RuleStore s => RuleStore (WhereLowerer s) where new :: WhereLowerer s new = s -> WhereLowerer s forall s. s -> WhereLowerer s WhereLowerer s forall a. RuleStore a => a new addStyleRule :: WhereLowerer s -> Int -> StyleRule' -> WhereLowerer s addStyleRule (WhereLowerer s self) Int priority StyleRule' rule = s -> WhereLowerer s forall s. s -> WhereLowerer s WhereLowerer (s -> WhereLowerer s) -> s -> WhereLowerer s forall a b. (a -> b) -> a -> b $ (s -> Selector -> s) -> s -> [Selector] -> s forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl s -> Selector -> s forall a. RuleStore a => a -> Selector -> a addStyleRule' s self ([Selector] -> s) -> [Selector] -> s forall a b. (a -> b) -> a -> b $ Selector -> [Selector] lowerSelector Selector sel where addStyleRule' :: a -> Selector -> a addStyleRule' a self' Selector sel' = a -> Int -> StyleRule' -> a forall a. RuleStore a => a -> Int -> StyleRule' -> a addStyleRule a self' Int priority (StyleRule' -> a) -> StyleRule' -> a forall a b. (a -> b) -> a -> b $ StyleRule' rule { inner :: StyleRule inner = Selector -> [(Text, [Token])] -> Text -> StyleRule StyleRule Selector sel' [(Text, [Token])] props Text psuedo } StyleRule Selector sel [(Text, [Token])] props Text psuedo = StyleRule' -> StyleRule inner StyleRule' rule lookupRules :: WhereLowerer s -> Element -> [StyleRule'] lookupRules (WhereLowerer s self) Element el = s -> Element -> [StyleRule'] forall a. RuleStore a => a -> Element -> [StyleRule'] lookupRules s self Element el