module Stylist( PropertyParser(..), TrivialPropertyParser(..), StyleSheet(..), TrivialStyleSheet(..), Props, Element(..), Attribute(..)) where import Data.Text (Text, unpack) import Data.CSS.Syntax.Tokens (Token) import Stylist.Parse (StyleSheet(..), TrivialStyleSheet(..)) -- | Defines how to parse CSS properties into an output "style" format. class PropertyParser a where -- | Default styles. temp :: a -- | Creates a style inherited from a parent style. inherit :: a -> a inherit = id -- | Expand a shorthand property into longhand properties. shorthand :: a -> Text -> [Token] -> [(Text, [Token])] shorthand self key value | Just _ <- longhand self self key value = [(key, value)] | otherwise = [] -- longhand parent self name value longhand :: a -> a -> Text -> [Token] -> Maybe a -- | Retrieve stored variables, optional. getVars :: a -> Props getVars _ = [] -- | Save variable values, optional. setVars :: Props -> a -> a setVars _ = id -- | "key: value;" entries to be parsed into an output type. type Props = [(Text, [Token])] -- | Gathers properties as a key'd list. -- Works well with `lookup`. data TrivialPropertyParser = TrivialPropertyParser [(String, [Token])] deriving (Show, Eq) instance PropertyParser TrivialPropertyParser where temp = TrivialPropertyParser [] longhand _ (TrivialPropertyParser self) key value = Just $ TrivialPropertyParser ((unpack key, value):self) -- | An inversely-linked tree of elements, to apply CSS selectors to. data Element = ElementNode { -- | The element's parent in the tree. parent :: Maybe Element, -- | The element's previous sibling in the tree. previous :: Maybe Element, -- | The element's name. name :: Text, -- | The element's namespace. namespace :: Text, -- | The element's attributes, in sorted order. attributes :: [Attribute] } -- | A key-value attribute. data Attribute = Attribute Text Text String deriving (Eq, Ord)