{-# LANGUAGE OverloadedStrings #-}
-- | Lowers psuedoclasses to rawer syntactic forms.
module Data.CSS.Preprocessor.PsuedoClasses(LowerPsuedoClasses(..),
    psuedoClassesFilter, htmlPsuedoFilter,
    addRewrite, addRewrite', addTest, addContains, PropertyTest,
    addPsuedoEl, addNamespace) where

import Data.CSS.Syntax.StyleSheet
import Data.CSS.Syntax.Selector
import Data.CSS.Syntax.Tokens

import Data.Text as Txt
import Data.Maybe (fromMaybe, listToMaybe)
import Data.HashMap.Lazy as HM
import Data.Function ((&))
import Data.List as L (intercalate)

--------
---- core
--------
type RewriteMap = HashMap Text ([Token] -> [SimpleSelector])
data LowerPsuedoClasses s = LowerPsuedoClasses {
    LowerPsuedoClasses s -> s
inner :: s,
    LowerPsuedoClasses s -> RewriteMap
rewriteRules :: RewriteMap,
    LowerPsuedoClasses s -> [Text]
psuedoEls :: [Text],
    LowerPsuedoClasses s -> HashMap Text Text
namespaces :: HashMap Text Text
}

instance StyleSheet s => StyleSheet (LowerPsuedoClasses s) where
    setPriority :: Int -> LowerPsuedoClasses s -> LowerPsuedoClasses s
setPriority p :: Int
p self :: LowerPsuedoClasses s
self = LowerPsuedoClasses s
self { inner :: s
inner = Int -> s -> s
forall s. StyleSheet s => Int -> s -> s
setPriority Int
p (s -> s) -> s -> s
forall a b. (a -> b) -> a -> b
$ LowerPsuedoClasses s -> s
forall s. LowerPsuedoClasses s -> s
inner LowerPsuedoClasses s
self }
    addRule :: LowerPsuedoClasses s -> StyleRule -> LowerPsuedoClasses s
addRule self :: LowerPsuedoClasses s
self rule :: StyleRule
rule = LowerPsuedoClasses s
self { inner :: s
inner = s -> StyleRule -> s
forall s. StyleSheet s => s -> StyleRule -> s
addRule (LowerPsuedoClasses s -> s
forall s. LowerPsuedoClasses s -> s
inner LowerPsuedoClasses s
self) (StyleRule -> s) -> StyleRule -> s
forall a b. (a -> b) -> a -> b
$ LowerPsuedoClasses s -> StyleRule -> StyleRule
forall t. LowerPsuedoClasses t -> StyleRule -> StyleRule
lowerRule LowerPsuedoClasses s
self StyleRule
rule }

    addAtRule :: LowerPsuedoClasses s
-> Text -> [Token] -> (LowerPsuedoClasses s, [Token])
addAtRule self :: LowerPsuedoClasses s
self "namespace" (Ident ns :: Text
ns:toks :: [Token]
toks) | (Url url :: Text
url:toks' :: [Token]
toks') <- [Token] -> [Token]
skipSpace [Token]
toks =
        (Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addNamespace Text
ns Text
url LowerPsuedoClasses s
self, [Token]
toks')
    addAtRule self :: LowerPsuedoClasses s
self name :: Text
name toks :: [Token]
toks = let (inner' :: s
inner', toks' :: [Token]
toks') = s -> Text -> [Token] -> (s, [Token])
forall s. StyleSheet s => s -> Text -> [Token] -> (s, [Token])
addAtRule (LowerPsuedoClasses s -> s
forall s. LowerPsuedoClasses s -> s
inner LowerPsuedoClasses s
self) Text
name [Token]
toks
        in (LowerPsuedoClasses s
self { inner :: s
inner = s
inner' }, [Token]
toks')

lowerRule :: LowerPsuedoClasses t -> StyleRule -> StyleRule
lowerRule :: LowerPsuedoClasses t -> StyleRule -> StyleRule
lowerRule self :: LowerPsuedoClasses t
self@(LowerPsuedoClasses { psuedoEls :: forall s. LowerPsuedoClasses s -> [Text]
psuedoEls = [Text]
psuedos }) (StyleRule sel :: Selector
sel props :: [(Text, [Token])]
props "")
    | Just pseudo :: Text
pseudo <- [Text] -> Selector -> Maybe Text
extractPseudoEl [Text]
psuedos Selector
sel =
        LowerPsuedoClasses t -> StyleRule -> StyleRule
forall t. LowerPsuedoClasses t -> StyleRule -> StyleRule
lowerRule (Text -> [Token] -> LowerPsuedoClasses t -> LowerPsuedoClasses t
forall s.
Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite' Text
pseudo [] LowerPsuedoClasses t
self) (StyleRule -> StyleRule) -> StyleRule -> StyleRule
forall a b. (a -> b) -> a -> b
$ Selector -> [(Text, [Token])] -> Text -> StyleRule
StyleRule Selector
sel [(Text, [Token])]
props Text
pseudo
lowerRule LowerPsuedoClasses { namespaces :: forall s. LowerPsuedoClasses s -> HashMap Text Text
namespaces = HashMap Text Text
ns, rewriteRules :: forall s. LowerPsuedoClasses s -> RewriteMap
rewriteRules = RewriteMap
rewrites } (StyleRule sel :: Selector
sel props :: [(Text, [Token])]
props pseudoel :: Text
pseudoel) =
    Selector -> [(Text, [Token])] -> Text -> StyleRule
StyleRule (HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector HashMap Text Text
ns RewriteMap
rewrites Selector
sel) [(Text, [Token])]
props Text
pseudoel

extractPseudoEl :: [Text] -> Selector -> Maybe Text
extractPseudoEl :: [Text] -> Selector -> Maybe Text
extractPseudoEl ps :: [Text]
ps (Element sel :: [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl ps :: [Text]
ps (Child _ sel :: [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl ps :: [Text]
ps (Descendant _ sel :: [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl ps :: [Text]
ps (Adjacent _ sel :: [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl ps :: [Text]
ps (Sibling _ sel :: [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl' :: [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' :: [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' ps :: [Text]
ps sel :: [SimpleSelector]
sel = [Text] -> Maybe Text
forall a. [a] -> Maybe a
listToMaybe [Text
p | Psuedoclass p :: Text
p [] <- [SimpleSelector]
sel, Text
p Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`Prelude.elem` [Text]
ps]

lowerSelector :: HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector :: HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector ns :: HashMap Text Text
ns rewrites :: RewriteMap
rewrites (Element sel' :: [SimpleSelector]
sel') = [SimpleSelector] -> Selector
Element ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
ns RewriteMap
rewrites [SimpleSelector]
sel'
lowerSelector ns :: HashMap Text Text
ns rewrites :: RewriteMap
rewrites (Child p :: Selector
p sel' :: [SimpleSelector]
sel') =
    Selector -> [SimpleSelector] -> Selector
Child (HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector HashMap Text Text
ns RewriteMap
rewrites Selector
p) ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
ns RewriteMap
rewrites [SimpleSelector]
sel'
lowerSelector ns :: HashMap Text Text
ns rewrites :: RewriteMap
rewrites (Descendant p :: Selector
p sel' :: [SimpleSelector]
sel') =
    Selector -> [SimpleSelector] -> Selector
Descendant (HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector HashMap Text Text
ns RewriteMap
rewrites Selector
p) ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
ns RewriteMap
rewrites [SimpleSelector]
sel'
lowerSelector ns :: HashMap Text Text
ns rewrites :: RewriteMap
rewrites (Adjacent sib :: Selector
sib sel' :: [SimpleSelector]
sel') =
    Selector -> [SimpleSelector] -> Selector
Adjacent (HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector HashMap Text Text
ns RewriteMap
rewrites Selector
sib) ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
ns RewriteMap
rewrites [SimpleSelector]
sel'
lowerSelector ns :: HashMap Text Text
ns rewrites :: RewriteMap
rewrites (Sibling sib :: Selector
sib sel' :: [SimpleSelector]
sel') =
    Selector -> [SimpleSelector] -> Selector
Sibling (HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector HashMap Text Text
ns RewriteMap
rewrites Selector
sib) ([SimpleSelector] -> Selector) -> [SimpleSelector] -> Selector
forall a b. (a -> b) -> a -> b
$ HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
ns RewriteMap
rewrites [SimpleSelector]
sel'

lowerSelector' :: HashMap Text Text -> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' :: HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' namespaces' :: HashMap Text Text
namespaces' rewrites :: RewriteMap
rewrites (Namespace ns :: Text
ns:sels :: [SimpleSelector]
sels) =
    Text -> SimpleSelector
Namespace (Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe "about:invalid" (Maybe Text -> Text) -> Maybe Text -> Text
forall a b. (a -> b) -> a -> b
$ Text -> HashMap Text Text -> Maybe Text
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HM.lookup Text
ns HashMap Text Text
namespaces') SimpleSelector -> [SimpleSelector] -> [SimpleSelector]
forall a. a -> [a] -> [a]
: HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
namespaces' RewriteMap
rewrites [SimpleSelector]
sels
lowerSelector' ns :: HashMap Text Text
ns rewrites :: RewriteMap
rewrites (Psuedoclass name :: Text
name args :: [Token]
args:sels :: [SimpleSelector]
sels)
    | Just value :: [Token] -> [SimpleSelector]
value <- Text
name Text -> RewriteMap -> Maybe ([Token] -> [SimpleSelector])
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
`HM.lookup` RewriteMap
rewrites = [Token] -> [SimpleSelector]
value [Token]
args [SimpleSelector] -> [SimpleSelector] -> [SimpleSelector]
forall a. [a] -> [a] -> [a]
++ HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
ns RewriteMap
rewrites [SimpleSelector]
sels
lowerSelector' ns :: HashMap Text Text
ns rewrites :: RewriteMap
rewrites (sel :: SimpleSelector
sel:sels :: [SimpleSelector]
sels) = SimpleSelector
sel SimpleSelector -> [SimpleSelector] -> [SimpleSelector]
forall a. a -> [a] -> [a]
: HashMap Text Text
-> RewriteMap -> [SimpleSelector] -> [SimpleSelector]
lowerSelector' HashMap Text Text
ns RewriteMap
rewrites [SimpleSelector]
sels
lowerSelector' _ _ [] = []

--------
---- constructors
--------
psuedoClassesFilter :: StyleSheet s => s -> LowerPsuedoClasses s
psuedoClassesFilter :: s -> LowerPsuedoClasses s
psuedoClassesFilter s :: s
s = s
-> RewriteMap
-> [Text]
-> HashMap Text Text
-> LowerPsuedoClasses s
forall s.
s
-> RewriteMap
-> [Text]
-> HashMap Text Text
-> LowerPsuedoClasses s
LowerPsuedoClasses s
s RewriteMap
forall k v. HashMap k v
HM.empty ["before", "after"] HashMap Text Text
forall k v. HashMap k v
HM.empty

addPsuedoEl :: Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addPsuedoEl :: Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addPsuedoEl ps :: Text
ps self :: LowerPsuedoClasses s
self = LowerPsuedoClasses s
self { psuedoEls :: [Text]
psuedoEls = LowerPsuedoClasses s -> [Text]
forall s. LowerPsuedoClasses s -> [Text]
psuedoEls LowerPsuedoClasses s
self [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++ Text -> [Text]
Txt.words Text
ps }

addRewrite :: Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite :: Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite name :: Text
name sel :: Text
sel self :: LowerPsuedoClasses s
self = Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite' Text
name (Text -> [Token]
tokenize Text
sel) LowerPsuedoClasses s
self
addRewrite' :: Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite' :: Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite' name :: Text
name sel :: [Token]
sel self :: LowerPsuedoClasses s
self =
    Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
forall s.
Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
addTest' Text
name (\args :: [Token]
args -> [Text -> [Token] -> SimpleSelector
Psuedoclass "where" ([Token] -> SimpleSelector) -> [Token] -> SimpleSelector
forall a b. (a -> b) -> a -> b
$ [Token] -> [Token] -> [Token]
spliceArgs [Token]
sel [Token]
args]) LowerPsuedoClasses s
self
  where
    spliceArgs :: [Token] -> [Token] -> [Token]
spliceArgs [] [] = []
    spliceArgs (Ident "_":toks :: [Token]
toks) (arg :: Token
arg:args :: [Token]
args) = Token
arg Token -> [Token] -> [Token]
forall a. a -> [a] -> [a]
: [Token] -> [Token] -> [Token]
spliceArgs [Token]
toks [Token]
args
    spliceArgs (tok :: Token
tok:toks :: [Token]
toks) args :: [Token]
args = Token
tok Token -> [Token] -> [Token]
forall a. a -> [a] -> [a]
: [Token] -> [Token] -> [Token]
spliceArgs [Token]
toks [Token]
args
    spliceArgs _ _ = [Text -> Token
Ident "\tfail"]

addContains :: Text -> [Int] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addContains :: Text -> [Int] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addContains name :: Text
name path :: [Int]
path self :: LowerPsuedoClasses s
self =
    Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> [Token] -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite' Text
name ([Token] -> [[Token]] -> [Token]
forall a. [a] -> [[a]] -> [a]
L.intercalate [Token
Comma] ([[Token]] -> [Token]) -> [[Token]] -> [Token]
forall a b. (a -> b) -> a -> b
$ [Int] -> [Token] -> [[Token]]
forall a. (Show a, Integral a) => [a] -> [Token] -> [[Token]]
buildSelector [Int]
path [Token
Colon, Text -> Token
Ident "root"]) LowerPsuedoClasses s
self
  where
    buildSelector :: [a] -> [Token] -> [[Token]]
buildSelector (p :: a
p:ps :: [a]
ps) prefix :: [Token]
prefix =
        let prefix' :: [Token]
prefix' = [Token]
prefix [Token] -> [Token] -> [Token]
forall a. [a] -> [a] -> [a]
++ [Char -> Token
Delim '>', Token
Colon, Text -> Token
Function "nth-child", a -> Token
forall a. (Show a, Integral a) => a -> Token
num a
p, Token
RightParen]
        in [Token]
prefix' [Token] -> [[Token]] -> [[Token]]
forall a. a -> [a] -> [a]
: [a] -> [Token] -> [[Token]]
buildSelector [a]
ps [Token]
prefix'
    buildSelector [] _ = []
    num :: a -> Token
num x :: a
x = Text -> NumericValue -> Token
Number (String -> Text
Txt.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ a -> String
forall a. Show a => a -> String
show a
x) (NumericValue -> Token) -> NumericValue -> Token
forall a b. (a -> b) -> a -> b
$ Integer -> NumericValue
NVInteger (a -> Integer
forall a. Integral a => a -> Integer
toInteger a
x)

addTest :: Text -> Maybe Text -> Text -> PropertyFunc -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addTest :: Text
-> Maybe Text
-> Text
-> PropertyFunc
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
addTest name :: Text
name ns :: Maybe Text
ns attr :: Text
attr test :: PropertyFunc
test self :: LowerPsuedoClasses s
self = Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
forall s.
Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
addTest' Text
name ([SimpleSelector] -> [Token] -> [SimpleSelector]
forall a. [SimpleSelector] -> [a] -> [SimpleSelector]
noArg [Maybe Text -> Text -> PropertyTest -> SimpleSelector
Property Maybe Text
ns Text
attr (PropertyTest -> SimpleSelector) -> PropertyTest -> SimpleSelector
forall a b. (a -> b) -> a -> b
$ PropertyFunc -> PropertyTest
Callback PropertyFunc
test]) LowerPsuedoClasses s
self
    where
        noArg :: [SimpleSelector] -> [a] -> [SimpleSelector]
noArg sel :: [SimpleSelector]
sel [] = [SimpleSelector]
sel
        noArg _ _ = [Text -> [Token] -> SimpleSelector
Psuedoclass " fail" []]
addTest' :: Text -> ([Token] -> [SimpleSelector]) -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addTest' :: Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
addTest' name :: Text
name sel :: [Token] -> [SimpleSelector]
sel self :: LowerPsuedoClasses s
self = LowerPsuedoClasses s
self {rewriteRules :: RewriteMap
rewriteRules = Text -> ([Token] -> [SimpleSelector]) -> RewriteMap -> RewriteMap
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
insert Text
name [Token] -> [SimpleSelector]
sel (RewriteMap -> RewriteMap) -> RewriteMap -> RewriteMap
forall a b. (a -> b) -> a -> b
$ LowerPsuedoClasses s -> RewriteMap
forall s. LowerPsuedoClasses s -> RewriteMap
rewriteRules LowerPsuedoClasses s
self }

addNamespace :: Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addNamespace :: Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addNamespace ns :: Text
ns uri :: Text
uri self :: LowerPsuedoClasses s
self = LowerPsuedoClasses s
self { namespaces :: HashMap Text Text
namespaces = Text -> Text -> HashMap Text Text -> HashMap Text Text
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
insert Text
ns Text
uri (HashMap Text Text -> HashMap Text Text)
-> HashMap Text Text -> HashMap Text Text
forall a b. (a -> b) -> a -> b
$ LowerPsuedoClasses s -> HashMap Text Text
forall s. LowerPsuedoClasses s -> HashMap Text Text
namespaces LowerPsuedoClasses s
self }

htmlPsuedoFilter :: StyleSheet s => s -> LowerPsuedoClasses s
htmlPsuedoFilter :: s -> LowerPsuedoClasses s
htmlPsuedoFilter s :: s
s = s -> LowerPsuedoClasses s
forall s. StyleSheet s => s -> LowerPsuedoClasses s
psuedoClassesFilter s
s LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "link" "[href]" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "any-link" "[href]" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "blank" "[value=''], :not([value])" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "checked" "[checked]" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "dir" "[dir=_], [dir=_] *" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "disabled" "[disabled]" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "enabled" ":not([disabled])" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "first-child" ":nth-child(1)" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "first-of-type" ":nth-of-type(1)" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "indeterminate" "[indeterminate]" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "lang" "[lang|=_], [lang|=_] *" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    -- Not sure if I ever really want to support these, but might as well list them.
    -- Requires more data to be fed to the core CSS engine.
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "last-child" ":nth-last-child(1)" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "last-of-type" ":nth-last-of-type(1)" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "only-child" ":nth-child(1):nth-last-child(1)" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "only-of-type" ":nth-of-type(1):nth-last-of-type(1)" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    -- No issue with remainder.
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "optional" ":not([required])" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "placeholder-shown" "[value=''][placeholder], [placeholder]:not([value])" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "readonly" "[readonly], [disabled]" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "read-write" ":not([readonly]):not([disabled])" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "required" "[required]" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "scope" ":root" LowerPsuedoClasses s
-> (LowerPsuedoClasses s -> LowerPsuedoClasses s)
-> LowerPsuedoClasses s
forall a b. a -> (a -> b) -> b
&
    Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
forall s.
Text -> Text -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addRewrite "root" "html"