-- -- This file is part of FactorCSS -- Licensed under the MIT License, -- http://www.opensource.org/licenses/mit-license -- Copyright 2004 James Bursa -- -- Tokeniser for CSS 2.1 -- See CSS 2.1 G.2 { module Tokeniser where } %wrapper "basic" $h = [0-9a-f] $nonascii = [\x80-\xff] @unicode = \\$h{1,6}(\r\n|[\ \t\r\n\f])? @escape = @unicode|\\[\x20-\x7e\x80-\xff] @nmstart = [_a-z]|$nonascii|@escape @nmchar = [\-_a-zA-Z0-9]|$nonascii|@escape @nl = \n|\r\n|\r|\f @string1 = \"([\t\ \!\#\x24\x25&\x28-\x7e]|\\@nl|\'|$nonascii|@escape|\.)*\" @string2 = \'([\t\ \!\#\x24\x25&\x28-\x7e]|\\@nl|\"|$nonascii|@escape|\.)*\' @ident = @nmstart@nmchar* @name = @nmchar+ @num = [\-\053]?[0-9]+|[0-9]*"."[0-9]+ @string = @string1|@string2 @url = ([\!\#\x24\x25&\x2a-\x7e]|$nonascii|@escape)* $s = [\ \t\r\n\f] @w = $s* @range = \?{1,6}|$h(\?{0,5}|$h(\?{0,4}|$h(\?{0,3}|$h(\?{0,2}|$h(\??|$h))))) $all = \x00-\xff @comment = \/\*$all#\x2a*\*+($all#[\/\x2a]$all#\x2a*\*+)*\/ tokens :- $s+ ; @comment ; "" ; "~=" { \s -> INCLUDES } "|=" { \s -> DASHMATCH } @w"{" { \s -> LBRACE } @w"+" { \s -> PLUS } @w">" { \s -> GREATER } @w"," { \s -> COMMA } @string { \s -> STRING s } @ident { \s -> IDENT s } "#"@name { \s -> HASH s } "@import" { \s -> IMPORT_SYM } "@page" { \s -> PAGE_SYM } "@media" { \s -> MEDIA_SYM } "@charset" { \s -> CHARSET_SYM } "!"@w"important" { \s -> IMPORTANT_SYM } @num em { \s -> EMS (read (take (length s - 2) s)) } @num ex { \s -> EXS (read (take (length s - 2) s)) } @num px { \s -> LENGTH s } @num cm { \s -> LENGTH s } @num mm { \s -> LENGTH s } @num in { \s -> LENGTH s } @num pt { \s -> LENGTH s } @num pc { \s -> LENGTH s } @num deg { \s -> ANGLE s } @num rad { \s -> ANGLE s } @num grad { \s -> ANGLE s } @num ms { \s -> TIME s } @num s { \s -> TIME s } @num Hz { \s -> FREQ s } @num kHz { \s -> FREQ s } @num @ident { \s -> DIMEN s } @num "%" { \s -> PERCENTAGE (read (take (length s - 1) s)) } @num { \s -> NUMBER (read s) } "url("@w@string@w")" { \s -> URI s } "url("@w@url@w")" { \s -> URI s } @ident"\050" { \s -> FUNCTION s } ";" { \s -> SEMI } "}" { \s -> RBRACE } ":" { \s -> COLON } "/" { \s -> SLASH } "-" { \s -> MINUS } "." { \s -> DOT } "*" { \s -> ASTERISK } "[" { \s -> LBRAC } "]" { \s -> RBRAC } "=" { \s -> EQUALS } ")" { \s -> RPAREN } . { \s -> DELIM (head s) } { data Token = INCLUDES | DASHMATCH | LBRACE | PLUS | GREATER | COMMA | STRING String | IDENT String | HASH String | IMPORT_SYM | PAGE_SYM | MEDIA_SYM | CHARSET_SYM | IMPORTANT_SYM | EMS Float | EXS Float | LENGTH String | ANGLE String | TIME String | FREQ String | DIMEN String | PERCENTAGE Float | NUMBER Float | URI String | FUNCTION String | SEMI | RBRACE | COLON | SLASH | MINUS | DOT | ASTERISK | LBRAC | RBRAC | EQUALS | RPAREN | DELIM Char deriving (Eq, Show) }