@@ 112,5 112,4 @@ htmlPsuedoFilter s = psuedoClassesFilter s &
addRewrite "readonly" "[readonly], [disabled]" &
addRewrite "read-write" ":not([readonly]):not([disabled])" &
addRewrite "required" "[required]" &
- addRewrite "root" "html" &
- addRewrite "scope" "html"
+ addRewrite "scope" ":root"
@@ 21,7 21,7 @@ import Data.CSS.Syntax.Tokens (Token(..), NumericValue(..))
type SelectorFunc = Element -> Bool
type AttrsFunc = [Attribute] -> Bool
-- Mostly here for the sake of pseudoclasses.
-data IL = Tagname Text | NS Text | Fail | Recursive Bool [Selector] | Nth Bool Integer Integer
+data IL = Tagname Text | NS Text | Fail | Recursive Bool [Selector] | Nth Bool Integer Integer | Root
-- | Converts a parsed CSS selector into a callable function.
compile :: Selector -> SelectorFunc
@@ 43,6 43,7 @@ compileInner' ((Nth ofType n 0:tests), attrs) =
nthChild ofType (fromInteger n) $ compileInner' (tests, attrs)
compileInner' ((Nth ofType a b:tests), attrs) =
nthChild' ofType (fromInteger a) (fromInteger b) $ compileInner' (tests, attrs)
+compileInner' (Root:tests, attrs) = testRoot $ compileInner' (tests, attrs)
compileInner' ([], attrs) = testAttrs (compileAttrs $ sortAttrs attrs) matched
compileAttrs :: [(Text, Maybe Text, String -> Bool)] -> AttrsFunc
compileAttrs ((tag, Nothing, test):attrs) = testAttr tag test $ compileAttrs attrs
@@ 66,6 67,7 @@ lowerInner (Psuedoclass "nth-child" args:s) =
(parseNth False (filter (== Whitespace) args):tests, attrs) where (tests, attrs) = lowerInner s
lowerInner (Psuedoclass "nth-of-type" args:s) =
(parseNth True (filter (== Whitespace) args):tests, attrs) where (tests, attrs) = lowerInner s
+lowerInner (Psuedoclass "root" []:s) = (Root:tests, attrs) where (tests, attrs) = lowerInner s
lowerInner (Psuedoclass c []:s) =
(tests, ("", Nothing, hasWord $ unpack c):attrs) where (tests, attrs) = lowerInner s
lowerInner (Psuedoclass _ _:_) = ([Fail], [])
@@ 154,6 156,10 @@ countPrev ofType el =
maybeStar :: (t -> Maybe t) -> t -> [t]
maybeStar cb x | Just y <- cb x = x : maybeStar cb y
| otherwise = [x]
+
+testRoot :: (Element -> Bool) -> Element -> Bool
+testRoot cb el | Just _ <- parent el = cb el
+ | otherwise = False
--------
---- RuleStore wrapper
--------