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

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

import Data.Text as Txt hiding (elem)
import Data.Maybe (fromMaybe, listToMaybe)
import Data.HashMap.Lazy as HM
import Data.Function ((&))

--------
---- 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 Int
p 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 LowerPsuedoClasses s
self 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 LowerPsuedoClasses s
self Text
"namespace" (Ident Text
ns:[Token]
toks) | (Url Text
url:[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 LowerPsuedoClasses s
self Text
name [Token]
toks = let (s
inner', [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 Selector
sel [(Text, [Token])]
props Text
"")
    | Just 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 Selector
sel [(Text, [Token])]
props 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 [Text]
ps (Element [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl [Text]
ps (Child Selector
_ [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl [Text]
ps (Descendant Selector
_ [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl [Text]
ps (Adjacent Selector
_ [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl [Text]
ps (Sibling Selector
_ [SimpleSelector]
sel) = [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel
extractPseudoEl' :: [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' :: [Text] -> [SimpleSelector] -> Maybe Text
extractPseudoEl' [Text]
ps [SimpleSelector]
sel = [Text] -> Maybe Text
forall a. [a] -> Maybe a
listToMaybe [Text
p | Psuedoclass Text
p [] <- [SimpleSelector]
sel, Text
p Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
ps]

lowerSelector :: HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector :: HashMap Text Text -> RewriteMap -> Selector -> Selector
lowerSelector HashMap Text Text
ns RewriteMap
rewrites (Element [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 HashMap Text Text
ns RewriteMap
rewrites (Child Selector
p [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 HashMap Text Text
ns RewriteMap
rewrites (Descendant Selector
p [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 HashMap Text Text
ns RewriteMap
rewrites (Adjacent Selector
sib [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 HashMap Text Text
ns RewriteMap
rewrites (Sibling Selector
sib [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' HashMap Text Text
namespaces' RewriteMap
rewrites (Namespace Text
ns:[SimpleSelector]
sels) =
    Text -> SimpleSelector
Namespace (Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"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' HashMap Text Text
ns RewriteMap
rewrites (Psuedoclass Text
name [Token]
args:[SimpleSelector]
sels)
    | Just [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' HashMap Text Text
ns RewriteMap
rewrites (SimpleSelector
sel:[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' HashMap Text Text
_ RewriteMap
_ [] = []

--------
---- constructors
--------
psuedoClassesFilter :: StyleSheet s => s -> LowerPsuedoClasses s
psuedoClassesFilter :: s -> LowerPsuedoClasses s
psuedoClassesFilter 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 [Text
"before", Text
"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 Text
ps 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 Text
name Text
sel 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' Text
name [Token]
sel LowerPsuedoClasses s
self =
    Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
forall s.
Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
addTest' Text
name (\[Token]
args -> [Text -> [Token] -> SimpleSelector
Psuedoclass Text
"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 Text
"_":[Token]
toks) (Token
arg:[Token]
args) = Token
arg Token -> [Token] -> [Token]
forall a. a -> [a] -> [a]
: [Token] -> [Token] -> [Token]
spliceArgs [Token]
toks [Token]
args
    spliceArgs (Token
tok:[Token]
toks) [Token]
args = Token
tok Token -> [Token] -> [Token]
forall a. a -> [a] -> [a]
: [Token] -> [Token] -> [Token]
spliceArgs [Token]
toks [Token]
args
    spliceArgs [Token]
_ [Token]
_ = [Text -> Token
Ident Text
"\tfail"]

addTest :: Text -> Maybe Text -> Text -> PropertyFunc -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addTest :: Text
-> Maybe Text
-> Text
-> PropertyFunc
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
addTest Text
name Maybe Text
ns Text
attr PropertyFunc
test 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 [SimpleSelector]
sel [] = [SimpleSelector]
sel
        noArg [SimpleSelector]
_ [a]
_ = [Text -> [Token] -> SimpleSelector
Psuedoclass Text
" fail" []]
addTest' :: Text -> ([Token] -> [SimpleSelector]) -> LowerPsuedoClasses s -> LowerPsuedoClasses s
addTest' :: Text
-> ([Token] -> [SimpleSelector])
-> LowerPsuedoClasses s
-> LowerPsuedoClasses s
addTest' Text
name [Token] -> [SimpleSelector]
sel 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 Text
ns Text
uri 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 -> 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 Text
"link" Text
"[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 Text
"any-link" Text
"[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 Text
"blank" Text
"[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 Text
"checked" Text
"[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 Text
"dir" Text
"[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 Text
"disabled" Text
"[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 Text
"enabled" Text
":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 Text
"first-child" Text
":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 Text
"first-of-type" Text
":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 Text
"indeterminate" Text
"[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 Text
"lang" Text
"[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 Text
"last-child" Text
":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 Text
"last-of-type" Text
":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 Text
"only-child" Text
":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 Text
"only-of-type" Text
":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 Text
"optional" Text
":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 Text
"placeholder-shown" Text
"[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 Text
"readonly" Text
"[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 Text
"read-write" Text
":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 Text
"required" Text
"[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 Text
"scope" Text
":root"