Package cssutils :: Module css2productions
[hide private]
[frames] | no frames]

Source Code for Module cssutils.css2productions

  1  """productions for CSS 2.1 
  2   
  3  CSS2_1_MACROS and CSS2_1_PRODUCTIONS are from both 
  4  http://www.w3.org/TR/CSS21/grammar.html and 
  5  http://www.w3.org/TR/css3-syntax/#grammar0 
  6   
  7   
  8  """ 
  9  __all__ = ['CSSProductions', 'MACROS', 'PRODUCTIONS'] 
 10  __docformat__ = 'restructuredtext' 
 11  __version__ = '$Id: css2productions.py 1116 2008-03-05 13:52:23Z cthedot $' 
 12   
 13  # option case-insensitive 
 14  MACROS = { 
 15      'h': r'[0-9a-f]', 
 16      #'nonascii': r'[\200-\377]', 
 17      'nonascii': r'[^\0-\177]', # CSS3 
 18      'unicode': r'\\{h}{1,6}(\r\n|[ \t\r\n\f])?', 
 19   
 20      'escape': r'{unicode}|\\[^\r\n\f0-9a-f]', 
 21      'nmstart': r'[_a-zA-Z]|{nonascii}|{escape}', 
 22      'nmchar': r'[_a-zA-Z0-9-]|{nonascii}|{escape}', 
 23      'string1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*\"', 
 24      'string2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*\'", 
 25      'invalid1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*', 
 26      'invalid2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*", 
 27      'comment': r'\/\*[^*]*\*+([^/*][^*]*\*+)*\/', 
 28   
 29      'ident':  r'[-]?{nmstart}{nmchar}*', 
 30      'name': r'{nmchar}+', 
 31      # CHANGED TO SPEC: added "-?" 
 32      'num': r'-?[0-9]*\.[0-9]+|[0-9]+', 
 33      'string': r'{string1}|{string2}', 
 34      'invalid': r'{invalid1}|{invalid2}', 
 35      'url': r'([!#$%&*-~]|{nonascii}|{escape})*', 
 36      's': r'[ \t\r\n\f]+', 
 37      'w': r'{s}?', 
 38      'nl': r'\n|\r\n|\r|\f', 
 39      'range': r'\?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h})))))', 
 40   
 41      'A': r'a|\\0{0,4}(41|61)(\r\n|[ \t\r\n\f])?', 
 42      'C': r'c|\\0{0,4}(43|63)(\r\n|[ \t\r\n\f])?', 
 43      'D': r'd|\\0{0,4}(44|64)(\r\n|[ \t\r\n\f])?', 
 44      'E': r'e|\\0{0,4}(45|65)(\r\n|[ \t\r\n\f])?', 
 45      'F': r'f|\\0{0,4}(46|66)(\r\n|[ \t\r\n\f])?', 
 46      'G': r'g|\\0{0,4}(47|67)(\r\n|[ \t\r\n\f])?|\\g', 
 47      'H': r'h|\\0{0,4}(48|68)(\r\n|[ \t\r\n\f])?|\\h', 
 48      'I': r'i|\\0{0,4}(49|69)(\r\n|[ \t\r\n\f])?|\\i', 
 49      'K': r'k|\\0{0,4}(4b|6b)(\r\n|[ \t\r\n\f])?|\\k', 
 50      'M': r'm|\\0{0,4}(4d|6d)(\r\n|[ \t\r\n\f])?|\\m', 
 51      'N': r'n|\\0{0,4}(4e|6e)(\r\n|[ \t\r\n\f])?|\\n', 
 52      'O': r'o|\\0{0,4}(51|71)(\r\n|[ \t\r\n\f])?|\\o', 
 53      'P': r'p|\\0{0,4}(50|70)(\r\n|[ \t\r\n\f])?|\\p', 
 54      'R': r'r|\\0{0,4}(52|72)(\r\n|[ \t\r\n\f])?|\\r', 
 55      'S': r's|\\0{0,4}(53|73)(\r\n|[ \t\r\n\f])?|\\s', 
 56      'T': r't|\\0{0,4}(54|74)(\r\n|[ \t\r\n\f])?|\\t', 
 57      'X': r'x|\\0{0,4}(58|78)(\r\n|[ \t\r\n\f])?|\\x', 
 58      'Z': r'z|\\0{0,4}(5a|7a)(\r\n|[ \t\r\n\f])?|\\z', 
 59      } 
 60   
 61  PRODUCTIONS = [ 
 62      ('URI', r'url\({w}{string}{w}\)'), #"url("{w}{string}{w}")"    {return URI;} 
 63      ('URI', r'url\({w}{url}{w}\)'), #"url("{w}{url}{w}")"    {return URI;} 
 64      ('FUNCTION', r'{ident}\('), #{ident}"("        {return FUNCTION;} 
 65   
 66      ('IMPORT_SYM', r'@{I}{M}{P}{O}{R}{T}'), #"@import"        {return IMPORT_SYM;} 
 67      ('PAGE_SYM', r'@{P}{A}{G}{E}'), #"@page"            {return PAGE_SYM;} 
 68      ('MEDIA_SYM', r'@{M}{E}{D}{I}{A}'), #"@media"        {return MEDIA_SYM;} 
 69      ('FONT_FACE_SYM', r'@{F}{O}{N}{T}\-{F}{A}{C}{E}'), #"@font-face"        {return FONT_FACE_SYM;} 
 70   
 71      # CHANGED TO SPEC: only @charset 
 72      ('CHARSET_SYM', r'@charset '), #"@charset "        {return CHARSET_SYM;} 
 73   
 74      ('NAMESPACE_SYM', r'@{N}{A}{M}{E}{S}{P}{A}{C}{E}'), #"@namespace"        {return NAMESPACE_SYM;} 
 75   
 76      # CHANGED TO SPEC: ATKEYWORD 
 77      ('ATKEYWORD', r'\@{ident}'), 
 78   
 79      ('IDENT', r'{ident}'), #{ident}            {return IDENT;} 
 80      ('STRING', r'{string}'), #{string}        {return STRING;} 
 81      ('INVALID', r'{invalid}'), #        {return INVALID; /* unclosed string */} 
 82      ('HASH', r'\#{name}'), #"#"{name}        {return HASH;} 
 83      ('PERCENTAGE', r'{num}%'), #{num}%            {return PERCENTAGE;} 
 84      ('LENGTH', r'{num}{E}{M}'), #{num}em            {return EMS;} 
 85      ('LENGTH', r'{num}{E}{X}'), #{num}ex            {return EXS;} 
 86      ('LENGTH', r'{num}{P}{X}'), #{num}px            {return LENGTH;} 
 87      ('LENGTH', r'{num}{C}{M}'), #{num}cm            {return LENGTH;} 
 88      ('LENGTH', r'{num}{M}{M}'), #{num}mm            {return LENGTH;} 
 89      ('LENGTH', r'{num}{I}{N}'), #{num}in            {return LENGTH;} 
 90      ('LENGTH', r'{num}{P}{T}'), #{num}pt            {return LENGTH;} 
 91      ('LENGTH', r'{num}{P}{C}'), #{num}pc            {return LENGTH;} 
 92      ('ANGLE', r'{num}{D}{E}{G}'), #{num}deg        {return ANGLE;} 
 93      ('ANGLE', r'{num}{R}{A}{D}'), #{num}rad        {return ANGLE;} 
 94      ('ANGLE', r'{num}{G}{R}{A}{D}'), #{num}grad        {return ANGLE;} 
 95      ('TIME', r'{num}{M}{S}'), #{num}ms            {return TIME;} 
 96      ('TIME', r'{num}{S}'), #{num}s            {return TIME;} 
 97      ('FREQ', r'{num}{H}{Z}'), #{num}Hz            {return FREQ;} 
 98      ('FREQ', r'{num}{K}{H}{Z}'), #{num}kHz        {return FREQ;} 
 99      ('DIMEN', r'{num}{ident}'), #{num}{ident}        {return DIMEN;} 
100      ('NUMBER', r'{num}'), #{num}            {return NUMBER;} 
101      #('UNICODERANGE', r'U\+{range}'), #U\+{range}        {return UNICODERANGE;} 
102      #('UNICODERANGE', r'U\+{h}{1,6}-{h}{1,6}'), #U\+{h}{1,6}-{h}{1,6}    {return UNICODERANGE;} 
103      # --- CSS3 --- 
104      ('UNICODE-RANGE', r'[0-9A-F?]{1,6}(\-[0-9A-F]{1,6})?'), 
105      ('CDO', r'\<\!\-\-'), #"<!--"            {return CDO;} 
106      ('CDC', r'\-\-\>'), #"-->"            {return CDC;} 
107      ('S', r'{s}'),#             {return S;} 
108   
109      # \/\*[^*]*\*+([^/*][^*]*\*+)*\/            /* ignore comments */ 
110      # {s}+\/\*[^*]*\*+([^/*][^*]*\*+)*\/        {unput(' '); /*replace by space*/} 
111   
112      ('INCLUDES', r'\~\='), #"~="                        {return INCLUDES;} 
113      ('DASHMATCH', r'\|\='), #"|="                       {return DASHMATCH;} 
114      ('LBRACE', r'\{'), #{w}"{"                  {return LBRACE;} 
115      ('PLUS', r'\+'), #{w}"+"                    {return PLUS;} 
116      ('GREATER', r'\>'), #{w}">"                 {return GREATER;} 
117      ('COMMA', r'\,'), #{w}","                   {return COMMA;} 
118      ('IMPORTANT_SYM', r'\!({w}|{comment})*{I}{M}{P}{O}{R}{T}{A}{N}{T}'), #"!{w}important"        {return IMPORTANT_SYM;} 
119      ('COMMENT', '\/\*[^*]*\*+([^/][^*]*\*+)*\/'), #    /* ignore comments */ 
120      ('CLASS', r'\.'), #.                        {return *yytext;} 
121   
122      # --- CSS3! --- 
123      ('CHAR', r'[^"\']'), 
124      ] 
125   
126 -class CSSProductions(object):
127 pass
128 for i, t in enumerate(PRODUCTIONS): 129 setattr(CSSProductions, t[0].replace('-', '_'), t[0]) 130