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)