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

Source Code for Module cssutils.cssproductions

  1  """productions for cssutils based on a mix of CSS 2.1 and CSS 3 Syntax 
  2  productions 
  3   
  4  - http://www.w3.org/TR/css3-syntax 
  5  - http://www.w3.org/TR/css3-syntax/#grammar0 
  6   
  7  open issues 
  8      - numbers contain "-" if present 
  9      - HASH: #aaa is, #000 is not anymore, 
 10              CSS2.1: 'nmchar': r'[_a-z0-9-]|{nonascii}|{escape}', 
 11              CSS3: 'nmchar': r'[_a-z-]|{nonascii}|{escape}', 
 12  """ 
 13  __all__ = ['CSSProductions', 'MACROS', 'PRODUCTIONS', 'RE_UNICODE'] 
 14  __docformat__ = 'restructuredtext' 
 15  __version__ = '$Id: cssproductions.py 1116 2008-03-05 13:52:23Z cthedot $' 
 16   
 17  RE_UNICODE = r'\\[0-9a-fA-F]{1,6}[\t|\r|\n|\f|\x20]?' 
 18   
 19  # a complete list of css3 macros 
 20  MACROS = { 
 21      'ident': r'[-]?{nmstart}{nmchar}*', 
 22      'name': r'{nmchar}+', 
 23      'nmstart': r'[_a-zA-Z]|{nonascii}|{escape}', 
 24      'nonascii': r'[^\0-\177]', 
 25      'unicode': r'\\[0-9a-f]{1,6}{wc}?', 
 26      'escape': r'{unicode}|\\[ -~\200-\777]', 
 27      #   'escape': r'{unicode}|\\[ -~\200-\4177777]', 
 28      'nmchar': r'[-_a-zA-Z0-9]|{nonascii}|{escape}', 
 29   
 30      'num': r'[0-9]*\.[0-9]+|[0-9]+', #r'[-]?\d+|[-]?\d*\.\d+', 
 31      'string':  r"""\'({stringesc1}|{stringchar}|")*\'""" + "|" + '''\"({stringesc2}|{stringchar}|')*\"''', 
 32      # seems an error in CSS 3 but is allowed in CSS 2.1 
 33      'stringesc1' : r"\\'", 
 34      'stringesc2' : r'\\"', 
 35   
 36      'stringchar':  r'{urlchar}| |\\{nl}', 
 37   
 38      # urlchar  ::= [#x9#x21#x23-#x26#x27-#x7E] | nonascii | escape 
 39      # 0x27 is "'" which should not be in here..., should ) be in here??? 
 40      'urlchar':  r'[\x09\x21\x23-\x26\x28-\x7E]|{nonascii}|{escape}', 
 41   
 42      # from CSS2.1 
 43      'invalid': r'{invalid1}|{invalid2}', 
 44      'invalid1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*', 
 45      'invalid2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*", 
 46   
 47      # what if \r\n, \n matches first? 
 48      'nl': r'\n|\r\n|\r|\f', 
 49      'w': r'{wc}*', 
 50      'wc': r'\t|\r|\n|\f|\x20', 
 51   
 52      'comment': r'\/\*[^*]*\*+([^/][^*]*\*+)*\/', 
 53   
 54      'A': r'A|a|\\0{0,4}(?:41|61)(?:\r\n|[ \t\r\n\f])?', 
 55      'C': r'C|c|\\0{0,4}(?:43|63)(?:\r\n|[ \t\r\n\f])?', 
 56      'D': r'D|d|\\0{0,4}(?:44|64)(?:\r\n|[ \t\r\n\f])?', 
 57      'E': r'E|e|\\0{0,4}(?:45|65)(?:\r\n|[ \t\r\n\f])?', 
 58      'F': r'F|f|\\0{0,4}(?:46|66)(?:\r\n|[ \t\r\n\f])?', 
 59      'G': r'G|g|\\0{0,4}(?:47|67)(?:\r\n|[ \t\r\n\f])?|\\G|\\g', 
 60      'H': r'H|h|\\0{0,4}(?:48|68)(?:\r\n|[ \t\r\n\f])?|\\H|\\h', 
 61      'I': r'I|i|\\0{0,4}(?:49|69)(?:\r\n|[ \t\r\n\f])?|\\I|\\i', 
 62      'K': r'K|k|\\0{0,4}(?:4b|6b)(?:\r\n|[ \t\r\n\f])?|\\K|\\k', 
 63      'L': r'L|l|\\0{0,4}(?:4c|6c)(?:\r\n|[ \t\r\n\f])?|\\L|\\l', 
 64      'M': r'M|m|\\0{0,4}(?:4d|6d)(?:\r\n|[ \t\r\n\f])?|\\M|\\m', 
 65      'N': r'N|n|\\0{0,4}(?:4e|6e)(?:\r\n|[ \t\r\n\f])?|\\N|\\n', 
 66      'O': r'O|o|\\0{0,4}(?:4f|6f)(?:\r\n|[ \t\r\n\f])?|\\O|\\o', 
 67      'P': r'P|p|\\0{0,4}(?:50|70)(?:\r\n|[ \t\r\n\f])?|\\P|\\p', 
 68      'R': r'R|r|\\0{0,4}(?:52|72)(?:\r\n|[ \t\r\n\f])?|\\R|\\r', 
 69      'S': r'S|s|\\0{0,4}(?:53|73)(?:\r\n|[ \t\r\n\f])?|\\S|\\s', 
 70      'T': r'T|t|\\0{0,4}(?:54|74)(?:\r\n|[ \t\r\n\f])?|\\T|\\t', 
 71      'U': r'U|u|\\0{0,4}(?:55|75)(?:\r\n|[ \t\r\n\f])?|\\U|\\u', 
 72      'X': r'X|x|\\0{0,4}(?:58|78)(?:\r\n|[ \t\r\n\f])?|\\X|\\x', 
 73      'Z': r'Z|z|\\0{0,4}(?:5a|7a)(?:\r\n|[ \t\r\n\f])?|\\Z|\\z', 
 74      } 
 75   
 76  # The following productions are the complete list of tokens 
 77  # used by cssutils, a mix of CSS3 and some CSS2.1 productions. 
 78  # The productions are **ordered**: 
 79  PRODUCTIONS = [ 
 80      ('BOM', r'\xFEFF'), 
 81      ('URI', r'{U}{R}{L}\({w}({string}|{urlchar}*){w}\)'), 
 82      ('FUNCTION', r'{ident}\('), 
 83   
 84      # from CSS2.1 
 85      ('IMPORT_SYM', r'@{I}{M}{P}{O}{R}{T}'),#'), 
 86      ('PAGE_SYM', r'@{P}{A}{G}{E}'), 
 87      ('MEDIA_SYM', r'@{M}{E}{D}{I}{A}'), 
 88      ('FONT_FACE_SYM', r'@{F}{O}{N}{T}\\?\-{F}{A}{C}{E}'), 
 89      ('CHARSET_SYM', r'@charset '), # from Errata includes ending space! 
 90      ('NAMESPACE_SYM', r'@{N}{A}{M}{E}{S}{P}{A}{C}{E}'), 
 91      # from CSS3 
 92      ('ATKEYWORD', r'@{ident}'), 
 93   
 94      # in CSS2.1: r'\!({w}|{comment})*{I}{M}{P}{O}{R}{T}{A}{N}{T}'), 
 95      ##('IMPORTANT_SYM', r'{I}{M}{P}{O}{R}{T}{A}{N}{T}'), 
 96   
 97      ('IDENT', r'{ident}'), 
 98      ('STRING', r'{string}'), 
 99      # from CSS2.1 
100      ('INVALID', r'{invalid}'), 
101   
102      ('HASH', r'\#{name}'), 
103      ('PERCENTAGE', r'{num}\%'), 
104      ('DIMENSION', r'{num}{ident}'), 
105      ('NUMBER', r'{num}'), 
106      #??? 
107      ('UNICODE-RANGE', r'[0-9A-F?]{1,6}(\-[0-9A-F]{1,6})?'), 
108      ('CDO', r'\<\!\-\-'), 
109      ('CDC', r'\-\-\>'), 
110      ('S', r'{wc}+'), 
111      ('INCLUDES', '\~\='), 
112      ('DASHMATCH', r'\|\='), 
113      ('PREFIXMATCH', r'\^\='), 
114      ('SUFFIXMATCH', r'\$\='), 
115      ('SUBSTRINGMATCH', r'\*\='), 
116   
117      # checked specially if fullsheet is parsed 
118      ('COMMENT', r'{comment}'), #r'\/\*[^*]*\*+([^/][^*]*\*+)*\/'), 
119   
120      # MUST always be last 
121      ('CHAR', r'[^"\']') 
122      ] 
123   
124 -class CSSProductions(object):
125 """ 126 most attributes are set later 127 """ 128 EOF = True
129 130 for i, t in enumerate(PRODUCTIONS): 131 setattr(CSSProductions, t[0].replace('-', '_'), t[0]) 132