diff --git a/lexer.mll b/lexer.mll index a04b19fa32040c9a9730af410f58ab26fe1b87c6..c82a71d206c5963fd8b74569d5a8896ddafa37d5 100644 --- a/lexer.mll +++ b/lexer.mll @@ -81,8 +81,6 @@ let X = ['x' 'X'] let Y = ['y' 'Y'] let Z = ['z' 'Z'] -let uagent = ('-' ("webkit" | "moz" | "ms" | "o") '-')? - rule token = parse | "\r\n" | '\r' | '\n' { new_line lexbuf; S } @@ -105,8 +103,9 @@ rule token = parse | "@charset " { CHARSET_SYM } | '@' F O N T '-' F A C E { FONT_FACE_SYM } | '@' N A M E S P A C E { NAMESPACE_SYM } - | '@' uagent K E Y F R A M E S { KEYFRAMES_SYM } | '@' S U P P O R T S { SUPPORTS_SYM } + | '@' (('-' ident '-')? as prefix) K E Y F R A M E S + { KEYFRAMES_SYM (String.lowercase prefix) } | (s | comment)* s comment* A N D comment* s (s | comment)* { advance_pos lexbuf; WS_AND } diff --git a/parser.mly b/parser.mly index f4dc10fec959e35e3e26d79e76b7c4cf85899dc7..3dac561b11e0a2085ef5f17ef355ca86b3410dc1 100644 --- a/parser.mly +++ b/parser.mly @@ -41,10 +41,10 @@ (* Tokens *) %token S CDO CDC IMPORT_SYM PAGE_SYM MEDIA_SYM CHARSET_SYM FONT_FACE_SYM -%token NAMESPACE_SYM KEYFRAMES_SYM SUPPORTS_SYM IMPORTANT_SYM +%token NAMESPACE_SYM SUPPORTS_SYM IMPORTANT_SYM %token <float> PERCENTAGE NUMBER %token <float * string> UNIT_VALUE -%token <string> COMBINATOR RELATION STRING IDENT HASH URI FUNCTION +%token <string> KEYFRAMES_SYM COMBINATOR RELATION STRING IDENT HASH URI FUNCTION %token LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK SEMICOL COLON COMMA DOT PLUS %token MINUS SLASH STAR ONLY AND (*OR*) NOT FROM TO EOF %token WS_AND WS_OR @@ -141,8 +141,8 @@ descriptor_declaration: { (name, value) } keyframes_rule: - | KEYFRAMES_SYM S* id=IDENT S* LBRACE S* rules=keyframe_ruleset* RBRACE S* - { Keyframes (id, rules) } + | pre=KEYFRAMES_SYM S* id=IDENT S* LBRACE S* rules=keyframe_ruleset* RBRACE S* + { Keyframes (pre, id, rules) } keyframe_ruleset: | selector=keyframe_selector S* decls=decls_block { (selector, decls) } diff --git a/stringify.ml b/stringify.ml index afbafbccdf4a24db6f85c567413307595b024b43..53e224036dbc963ee072da450e1616342ec24c38 100644 --- a/stringify.ml +++ b/stringify.ml @@ -110,11 +110,12 @@ let rec string_of_statement = function "@namespace " ^ string_of_expr uri ^ ";" | Namespace (Some prefix, uri) -> "@namespace " ^ prefix ^ " " ^ string_of_expr uri ^ ";" - | Keyframes (id, rules) -> + | Keyframes (prefix, id, rules) -> let string_of_keyframe_ruleset (expr, decls) = string_of_expr expr ^ block (cat "\n" string_of_declaration decls) in - "@keyframes " ^ id ^ block (cat "\n\n" string_of_keyframe_ruleset rules) + "@" ^ prefix ^ "keyframes " ^ id ^ + block (cat "\n\n" string_of_keyframe_ruleset rules) | Supports (condition, statements) -> "@supports " ^ stringify_condition " " condition ^ block (cat "\n\n" string_of_statement statements) @@ -165,7 +166,8 @@ let rec minify_statement = function | Import (target, []) -> "@import " ^ string_of_expr target ^ ";" | Import (target, queries) -> - "@import " ^ string_of_expr target ^ " " ^ cat "," string_of_media_query queries ^ ";" + "@import " ^ string_of_expr target ^ " " ^ + cat "," string_of_media_query queries ^ ";" | Page (None, decls) -> "@page{" ^ cat ";" minify_declaration decls ^ "}" | Page (Some pseudo, decls) -> @@ -175,11 +177,12 @@ let rec minify_statement = function name ^ ":" ^ string_of_expr value in "@font-face{" ^ cat ";" minify_descriptor_declaration decls ^ "}" - | Keyframes (id, rules) -> + | Keyframes (prefix, id, rules) -> let minify_keyframe_ruleset (expr, decls) = minify_expr expr ^ "{" ^ cat ";" minify_declaration decls ^ "}" in - "@keyframes " ^ id ^ "{" ^ cat "" minify_keyframe_ruleset rules ^ "}" + "@" ^ prefix ^ "keyframes " ^ id ^ + "{" ^ cat "" minify_keyframe_ruleset rules ^ "}" | Supports (condition, statements) -> "@supports " ^ stringify_condition "" condition ^ "{" ^ cat "" minify_statement statements ^ "}" diff --git a/types.ml b/types.ml index a21758936ff441f1f6175df93a75a211a73aac1c..d50b4844a09dd7d00094343c65293eb95084c74d 100644 --- a/types.ml +++ b/types.ml @@ -46,8 +46,8 @@ type statement = (* @font-face { <declarations> } *) | Namespace of string option * expr (* @namespace [<prefix>] "<uri>"; *) - | Keyframes of string * keyframe_ruleset list - (* @keyframes <id> { <rulesets> } *) + | Keyframes of string * string * keyframe_ruleset list + (* @[-<prefix>-]keyframes <id> { <rulesets> } *) | Supports of condition * statement list (* @supports <condition> { <rulesets> } *) diff --git a/util.ml b/util.ml index 34f7fe84a2466d9b0dcaff83a3a311248568e6ba..4b81a810885950cb51c52e7dafc3910e2547a8b3 100644 --- a/util.ml +++ b/util.ml @@ -203,9 +203,9 @@ let transform_stylesheet f stylesheet = | Namespace (prefix, uri) -> let uri = expect_expr uri in f (Statement (Namespace (prefix, uri))) - | Keyframes (id, rules) -> + | Keyframes (prefix, id, rules) -> let rules = trav_all_keyframe_ruleset rules in - f (Statement (Keyframes (id, rules))) + f (Statement (Keyframes (prefix, id, rules))) | Supports (condition, statements) -> let condition = expect_condition condition in let statements = trav_all_statement statements in