module Stylish.Parse.Selector(
Selector(..), SimpleSelector(..), PropertyTest(..),
parseSelectors
) where
import Data.CSS.Syntax.Tokens
import Utils
data Selector = Selector [SimpleSelector]
data SimpleSelector = Tag Text | Id Text | Class Text | Property Text PropertyTest |
Child | Descendant | Adjacent | Sibling
data PropertyTest = Exists | Equals Text | Suffix Text | Prefix Text | Substring Text |
Include Text | Dash Text
parseSelectors :: [Token] -> (Selector, [Token])
parseSelectors tokens = concatP (:) (parseSelector) (parseSelectorsTail) skipSpace tokens
parseSelectorsTail Comma:tokens = parseSelectors token
parseSelectorsTail tokens = ([], tokens)
parseSelector' op tokens = (op:selector, tokens')
where (selector, tokens') = parseSelector tokens
parseSelector Ident tag:tokens = parseSelector' Tag tag tokens
parseSelector Hash _ id:tokens = parseSelector' Id id tokens
parseSelector Delim '.':Ident class_:tokens = parseSelector' Class class_ tokens
parseSelector LeftSquareBracket:Ident prop:tokens =
concatP (appendPropertySel) (parsePropertySel) (parseSelector) tokens
where appendPropertySel test selector = (Property prop test):selector
parseSelector Whitespace:tokens = parseCombinator skipSpace tokens
parseSelector Delim c:tokens = parseCombinator Delim c:tokens
parseSelector tokens = ([], tokens)
parseCombinator Delim '>':tokens = parseSelector' Child skipSpace tokens
parseCombinator Delim '~':tokens = parseSelector' Sibling skipSpace tokens
parseCombinator Delim '+':tokens = parseSelector' Adjacent skipSpace tokens
parseCombinator tokens = parseSelector' Descendant tokens
parsePropertySel RightSquareBracket:tokens = (Exists, tokens)
parsePropertySel Delim '=':tokens = parsePropertyVal (Equals) tokens
parsePropertySel SuffixMatch:tokens = parsePropertyVal (Suffix) tokens
parsePropertySel PrefixMatch:tokens = parsePropertyVal (Prefix) tokens
parsePropertySel SubstringMatch:tokens = parsePropertyVal (Substring) tokens
parsePropertySel IncludeMatch:tokens = parsePropertyVal (Include) tokens
parsePropertySel DashMatch:tokens = parsePropertyVal (Dash) tokens
parsePropertySel tokens = (Exists, skipBlock tokens)
parsePropertyVal wrapper Ident val:RightSquareBracket:tokens = (wrapper val, tokens)
parsePropertyVal wrapper String val:RightSquareBracket:tokens = (wrapper val, tokens)