@@ 0,0 1,64 @@
+{-# LANGUAGE OverloadedStrings #-}
+-- | Lowers certain CSS properties to plain text.
+module Data.CSS.Preprocessor.Text(TextStyle, resolve) where
+
+import Data.CSS.Syntax.Tokens (Token(..), NumericValue(..))
+import Data.CSS.Style (PropertyParser(..))
+import Data.Text
+import Data.Maybe (fromMaybe)
+
+-- | `PropertyParser` decorator that parses & lowers certain CSS properties to plain text.
+data TextStyle p = TextStyle {
+    inner :: p,
+    content :: [Token],
+
+    counterReset :: [(Text, Integer)],
+    counterIncrement :: [(Text, Integer)],
+    counterSet :: [(Text, Integer)]
+}
+
+instance PropertyParser p => PropertyParser (TextStyle p) where
+    temp = TextStyle {
+            inner = temp,
+            content = [],
+            counterReset = [],
+            counterIncrement = [],
+            counterSet = []
+        }
+    inherit parent = TextStyle {
+            inner = inherit $ inner parent,
+            content = [],
+            counterReset = [],
+            counterIncrement = [],
+            counterSet = []
+        }
+
+    shorthand self "content" value = shorthand (inner self) "content" $ removeCounters value
+    shorthand _ key value
+        | key `elem` ["counter-reset", "counter-increment", "counter-set"],
+            Just _ <- parseCounters 0 value = [(key, value)]
+    shorthand self key value = shorthand (inner self) key value
+
+    longhand _ self "content" value = Just $ self {content = value}
+    longhand _ self "counter-reset" value = (\v -> self {counterReset = v}) <$> parseCounters 0 value
+    longhand _ self "counter-increment" value = (\v -> self {counterIncrement = v}) <$> parseCounters 1 value
+    longhand _ self "counter-set" value = (\v -> self {counterSet = v}) <$> parseCounters 0 value
+    longhand parent self key value = (\v -> self {inner = v}) <$> longhand (inner parent ) (inner self) key value
+
+removeCounters :: [Token] -> [Token]
+removeCounters (Function "counter":Ident _:RightParen:toks) = String "" : removeCounters toks
+removeCounters (Function "counters":Ident _:Comma:String _:toks) = String "" : removeCounters toks
+removeCounters (tok:toks) = tok : removeCounters toks
+removeCounters [] = []
+
+parseCounters :: Integer -> [Token] -> Maybe [(Text, Integer)]
+parseCounters _ [Ident "none"] = Just []
+parseCounters _ [] = Just []
+parseCounters x (Ident counter : Number _ (NVInteger count') : toks) =
+    (:) (counter, count') <$> parseCounters x toks
+parseCounters x (Ident counter : toks) = (:) (counter, x) <$> parseCounters x toks
+parseCounters _ _ = Nothing
+
+resolve :: PropertyParser p => TextStyle p -> p
+resolve TextStyle {inner = inner', content = content'} =
+    fromMaybe inner' $ longhand temp inner' "content" content'
 
@@ 56,7 56,7 @@ library
   exposed-modules:     Data.CSS.Syntax.StyleSheet, Data.CSS.Syntax.Selector,
                        Data.CSS.Style,
                        Data.CSS.Preprocessor.Conditions, Data.CSS.Preprocessor.Conditions.Expr,
-                       Data.CSS.Preprocessor.Assets
+                       Data.CSS.Preprocessor.Assets, Data.CSS.Preprocessor.Text
   
   -- Modules included in this library but not exported.
   other-modules:       Data.CSS.Syntax.StylishUtil,