{-# 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