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
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
28 'nmchar': r'[-_a-zA-Z0-9]|{nonascii}|{escape}',
29
30 'num': r'[0-9]*\.[0-9]+|[0-9]+',
31 'string': r"""\'({stringesc1}|{stringchar}|")*\'""" + "|" + '''\"({stringesc2}|{stringchar}|')*\"''',
32
33 'stringesc1' : r"\\'",
34 'stringesc2' : r'\\"',
35
36 'stringchar': r'{urlchar}| |\\{nl}',
37
38
39
40 'urlchar': r'[\x09\x21\x23-\x26\x28-\x7E]|{nonascii}|{escape}',
41
42
43 'invalid': r'{invalid1}|{invalid2}',
44 'invalid1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*',
45 'invalid2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*",
46
47
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
77
78
79 PRODUCTIONS = [
80 ('BOM', r'\xFEFF'),
81 ('URI', r'{U}{R}{L}\({w}({string}|{urlchar}*){w}\)'),
82 ('FUNCTION', r'{ident}\('),
83
84
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 '),
90 ('NAMESPACE_SYM', r'@{N}{A}{M}{E}{S}{P}{A}{C}{E}'),
91
92 ('ATKEYWORD', r'@{ident}'),
93
94
95
96
97 ('IDENT', r'{ident}'),
98 ('STRING', r'{string}'),
99
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
118 ('COMMENT', r'{comment}'),
119
120
121 ('CHAR', r'[^"\']')
122 ]
123
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