language-css-0.0.3.1: src/Language/Css/Syntax.hs
-- | Css2.1 syntax
--
-- haskell translation of css 2.1 grammar.
--
-- See <http://www.w3.org/TR/CSS2/grammar.html> and <http://www.w3.org/TR/CSS2/syndata.html>
module Language.Css.Syntax (
-- * Stylesheet
StyleSheet(..), StyleBody(..),
-- * AtRule
AtCharSet(..),
AtImport(..), ImportHead(..),
AtMedia(..),
AtPage(..), PseudoPage,
AtFontFace(..),
-- * RuleSet
RuleSet(..), Decl(..), Prop, Prio(..), Expr(..),
-- * Selectors
Sel(..), SimpleSel(..), SubSel(..),
Element, Attr(..), Class, Id, AttrIdent, AttrVal, PseudoVal(..),
-- * Values
Value(..),
-- * Primitives
Ident(..), Func(..),
Deg(..),
Rad(..),
Grad(..),
Color(..),
Hz(..),
KHz(..),
Em(..),
Ex(..),
Px(..),
In(..),
Cm(..),
Mm(..),
Pc(..),
Pt(..),
Percentage(..),
Ms(..),
S(..),
Uri(..)
) where
import Text.PrettyPrint
data Ident = Ident String
deriving (Eq, Show)
--------------------------------------------------------
-- Stylesheet
data StyleSheet = StyleSheet (Maybe AtCharSet) [AtImport] [StyleBody]
deriving (Eq, Show)
data StyleBody = SRuleSet RuleSet
| SAtMedia AtMedia
| SAtPage AtPage
| SAtFontFace AtFontFace
deriving (Eq, Show)
---------------------------------------------------------
-- AtRules
-- | \@charset
data AtCharSet = AtCharSet String
deriving (Eq, Show)
-- | \@import
data AtImport = AtImport ImportHead [Ident]
deriving (Eq, Show)
data ImportHead = IStr String | IUri Uri
deriving (Eq, Show)
-- | \@media
data AtMedia = AtMedia [Ident] [RuleSet]
deriving (Eq, Show)
-- | \@page
data AtPage = AtPage (Maybe Ident) (Maybe PseudoPage) [Decl]
deriving (Eq, Show)
type PseudoPage = Ident
-- | \@font-face
data AtFontFace = AtFontFace [Decl]
deriving (Eq, Show)
---------------------------------------------------------
-- Rules
data RuleSet = RuleSet [Sel] [Decl]
deriving (Eq, Show)
-- | Declaration
data Decl = Decl (Maybe Prio) Prop Expr
deriving (Eq, Show)
-- | Property
type Prop = Ident
-- | sets @!important@ declaration
data Prio = Important
deriving (Eq, Show)
---------------------------------------------------------
-- Selectors
-- | Selector
data Sel = SSel SimpleSel -- ^ single selector
| DescendSel Sel Sel -- ^ ' '
| ChildSel Sel Sel -- ^ \'>\'
| AdjSel Sel Sel -- ^ \'+\'
deriving (Eq, Show)
-- | Simple selector
data SimpleSel = UnivSel [SubSel] -- ^ Universal selector
| TypeSel Element [SubSel] -- ^ Type selector
deriving (Eq, Show)
data SubSel = AttrSel Attr -- ^ attribute selector
| ClassSel Class -- ^ \'.\'
| IdSel Id -- ^ \'#\'
| PseudoSel PseudoVal -- ^ pseudo classes/elements
deriving (Eq, Show)
-- | attribute selector
data Attr = Attr AttrIdent
| AttrIs AttrIdent AttrVal -- ^ \'=\'
| AttrIncl AttrIdent AttrVal -- ^ \'~=\'
| AttrBegins AttrIdent AttrVal -- ^ \'|=\'
deriving (Eq, Show)
type Element = String
type Class = String
type Id = String
type AttrIdent = String
type AttrVal = String
data PseudoVal = PIdent Ident
| PFunc Func
deriving (Eq, Show)
-------------------------------------------------------------------
-- Values
data Expr = EVal Value -- ^ single value
| SlashSep Expr Expr -- ^ slash separated expressions
| CommaSep Expr Expr -- ^ comma separated expressions
| SpaceSep Expr Expr -- ^ space separated expressions
deriving (Eq, Show)
data Value = VDeg Deg |
VRad Rad |
VGrad Grad |
VColor Color |
VHz Hz |
VKHz KHz |
VFunc Func |
VIdent Ident |
VInt Int |
VEm Em |
VEx Ex |
VPx Px |
VIn In |
VCm Cm |
VMm Mm |
VPc Pc |
VPt Pt |
VDouble Double |
VPercentage Percentage |
VString String |
VMs Ms |
VS S |
VUri Uri
deriving (Eq, Show)
data Func = Func Ident Expr
deriving (Eq, Show)
-- | \<angle\>
data Deg = Deg Double
deriving (Eq, Show)
-- | \<angle\>
data Rad = Rad Double
deriving (Eq, Show)
-- | \<angle\>
data Grad = Grad Double
deriving (Eq, Show)
-- | \<color\>
data Color = Cword String |
Crgb Int Int Int
deriving (Eq, Show)
-- | \<frequency\>
data Hz = Hz Double
deriving (Eq, Show)
-- | \<frequency\>
data KHz = KHz Double
deriving (Eq, Show)
-- | \<length\>
data Em = Em Double
deriving (Eq, Show)
-- | \<length\>
data Ex = Ex Double
deriving (Eq, Show)
-- | \<length\>
data Px = Px Int
deriving (Eq, Show)
-- | \<length\>
data In = In Double
deriving (Eq, Show)
-- | \<length\>
data Cm = Cm Double
deriving (Eq, Show)
-- | \<length\>
data Mm = Mm Double
deriving (Eq, Show)
-- | \<length\>
data Pc = Pc Double
deriving (Eq, Show)
-- | \<length\>
data Pt = Pt Int
deriving (Eq, Show)
-- | \<percentage\>
data Percentage = Percentage Double
deriving (Eq, Show)
-- | \<time\>
data Ms = Ms Double
deriving (Eq, Show)
-- | \<time\>
data S = S Double
deriving (Eq, Show)
-- | \<uri\>
data Uri = Uri String
deriving (Eq, Show)