@@ 43,7 43,7 @@ data QueryableStyleSheet' store parser = QueryableStyleSheet' {
parser :: parser,
-- | Whether author, useragent, or user styles are currently being parsed.
-- The tail of this list indicates which Cascade Layer is active.
- priority :: [Int], -- author vs user agent vs user styles, incorporates Cascade Layers
+ priorities :: [Int], -- author vs user agent vs user styles, incorporates Cascade Layers
-- | Parse data for @layer, to give webdevs explicit control over the cascade.
layers :: AtLayer.Tree,
--- | The name of the @layer we're within.
@@ 54,17 54,17 @@ data QueryableStyleSheet' store parser = QueryableStyleSheet' {
queryableStyleSheet :: PropertyParser p => QueryableStyleSheet p
queryableStyleSheet = QueryableStyleSheet' {
store = new, parser = temp, layers = AtLayer.emptyTree,
- priority = [0], layerNamespace = [] }
+ priorities = [0], layerNamespace = [] }
instance (RuleStore s, PropertyParser p) => StyleSheet (QueryableStyleSheet' s p) where
- setPriorities vs self = self { priority = vs }
+ setPriorities vs self = self { priorities = vs }
addRule self@(QueryableStyleSheet' store' _ priority' _ _) rule = self {
store = addStyleRule store' priority' $ styleRule' rule
}
- addAtRule self@QueryableStyleSheet' { layerNamespace = ns, layers = layers_, priority = v:_ }
+ addAtRule self@QueryableStyleSheet' { layerNamespace = ns, layers = layers_, priorities = v:_ }
"layer" toks =
case parseAtLayer ns toks layers_ $ \ns' path -> self {
- priority = v : path, layerNamespace = ns'
+ priorities = v : path, layerNamespace = ns'
} of
(layers', Just self', toks') -> (self { store = store self', layers = layers' }, toks')
(layers', Nothing, toks') -> (self { layers = layers' }, toks')
@@ 12,7 12,8 @@ import Stylist (PropertyParser(..), Props)
-- TODO do performance tests to decide beside between strict/lazy,
-- or is another Map implementation better?
-import Data.HashMap.Strict
+import Data.Hashable (Hashable)
+import Data.HashMap.Strict as HM
import qualified Data.HashMap.Lazy as HML
import Data.Text (unpack, pack, isPrefixOf)
@@ 44,13 45,20 @@ cascade styles overrides base =
-- | Variant of `cascade` which allows configuring base styles seperate from parent.
cascadeWithParent :: PropertyParser p => [StyleRule'] -> Props -> p -> p -> p
cascadeWithParent styles overrides parent' base = constructWithParent parent' base $
- HML.toList $ cascadeRules (getVars base ++ overrides) styles
+ toPrioList (priority base) $ cascadeRules (getVars base ++ overrides) styles
cascadeRules :: Props -> [StyleRule'] -> HashMap Text [Token]
cascadeRules overrides rules = cascadeProperties overrides $ concat $ Prelude.map properties rules
cascadeProperties :: Props -> Props -> HashMap Text [Token]
cascadeProperties overrides props = HML.fromList (props ++ overrides)
+toPrioList :: Hashable k => [k] -> HashMap k v -> [(k, v)]
+toPrioList (key:keys) map
+ | Just val <- key `HM.lookup` map =
+ (key, val):toPrioList keys (delete key map)
+ | otherwise = toPrioList keys map
+toPrioList [] map = toList map
+
constructWithParent :: PropertyParser p => p -> p -> Props -> p
constructWithParent parent' base props = dispatch parent' child props
where child = setVars [item | item@(n, _) <- props, isPrefixOf "--" n] base