From d47030fdf3eb4d295f139b3b161a82370b25f721 Mon Sep 17 00:00:00 2001 From: Adrian Cochrane Date: Mon, 17 Jun 2019 17:04:41 +1200 Subject: [PATCH] Handle !important CSS declarations. --- src/Stylish/Style/Selector.hs | 9 +++---- src/Stylish/Style/Selector/Importance.hs | 29 +++++++++++++++++++++++ src/Stylish/Style/Selector/Specificity.hs | 2 +- test/Test.hs | 2 +- 4 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 src/Stylish/Style/Selector/Importance.hs diff --git a/src/Stylish/Style/Selector.hs b/src/Stylish/Style/Selector.hs index 308df4c..98b9701 100644 --- a/src/Stylish/Style/Selector.hs +++ b/src/Stylish/Style/Selector.hs @@ -5,13 +5,14 @@ module Stylish.Style.Selector( import Stylish.Style.Selector.Index import Stylish.Style.Selector.Interpret import Stylish.Style.Selector.Specificity +import Stylish.Style.Selector.Importance import Stylish.Style.Selector.Common -ruleStore = OrderedRuleStore (InterpretedRuleStore styleIndex) 0 +ruleStore = ImportanceSplitter $ OrderedRuleStore (InterpretedRuleStore styleIndex) 0 -data QueryableStyleSheet = QueryableStyleSheet { - store :: RuleStore, +data QueryableStyleSheet store = QueryableStyleSheet { + store :: store, priority :: Int -- author vs user agent vs user styles } -queryableStyleSheet = QueryableStyleSheet {store = ruleStore, proirity = 0} +queryableStyleSheet = QueryableStyleSheet {store = ruleStore, priority = 0} diff --git a/src/Stylish/Style/Selector/Importance.hs b/src/Stylish/Style/Selector/Importance.hs new file mode 100644 index 0000000..35c88e2 --- /dev/null +++ b/src/Stylish/Style/Selector/Importance.hs @@ -0,0 +1,29 @@ +{-# LANGUAGE OverloadedStrings #-} +module Stylish.Style.Selector.Importance ( + splitProperties, ImportanceSplitter(..) + ) where + +import Data.CSS.Syntax.Tokens +import Data.Text.Internal (Text(..)) +import Stylish.Parse (StyleRule(..)) +import Stylish.Style.Selector.Common + +type Property = (Text, [Token]) +splitProperties :: [Property] -> ([Property], [Property]) +splitProperties (prop@(name, value):rest) + | (Ident "important":Delim '!':value') <- reverse value = + (unimportant, (name, reverse value'):important) + | otherwise = (prop:unimportant, important) + where (unimportant, important) = splitProperties rest + +data ImportanceSplitter a = ImportanceSplitter a +instance RuleStore inner => RuleStore (ImportanceSplitter inner) where + addStyleRule (ImportanceSplitter self) priority rule = + ImportanceSplitter $ addStyleRule ( + addStyleRule self (negate priority) $ buildRule important + ) priority $ buildRule unimportant + where + (important, unimportant) = splitProperties properties + (StyleRule selector properties) = inner rule + buildRule properties = rule {inner = StyleRule selector properties} + lookupRules (ImportanceSplitter self) el = lookupRules self el diff --git a/src/Stylish/Style/Selector/Specificity.hs b/src/Stylish/Style/Selector/Specificity.hs index 0b9d6f0..6b809d8 100644 --- a/src/Stylish/Style/Selector/Specificity.hs +++ b/src/Stylish/Style/Selector/Specificity.hs @@ -1,5 +1,5 @@ module Stylish.Style.Selector.Specificity( - OrderedRuleStore + OrderedRuleStore(..) ) where import Stylish.Parse.Selector diff --git a/test/Test.hs b/test/Test.hs index acc47d4..d60ddbd 100644 --- a/test/Test.hs +++ b/test/Test.hs @@ -9,8 +9,8 @@ import Stylish.Parse import Stylish.Style.Selector.Index import Stylish.Element import Stylish.Style.Selector.Interpret -import Stylish.Style.Selector.Specificity import Stylish.Style.Selector.Common +import Stylish.Style.Selector main = hspec spec -- 2.30.2