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']
14 __docformat__ = 'restructuredtext'
15 __author__ = '$LastChangedBy: cthedot $'
16 __date__ = '$LastChangedDate: 2007-09-01 15:55:42 +0200 (Sa, 01 Sep 2007) $'
17 __version__ = '$LastChangedRevision: 300 $'
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 'M': r'M|m|\\0{0,4}(?:4d|6d)(?:\r\n|[ \t\r\n\f])?|\\M|\\m',
64 'N': r'N|n|\\0{0,4}(?:4e|6e)(?:\r\n|[ \t\r\n\f])?|\\N|\\n',
65 'O': r'O|o|\\0{0,4}(?:4f|6f)(?:\r\n|[ \t\r\n\f])?|\\O|\\o',
66 'P': r'P|p|\\0{0,4}(?:50|70)(?:\r\n|[ \t\r\n\f])?|\\P|\\p',
67 'R': r'R|r|\\0{0,4}(?:52|72)(?:\r\n|[ \t\r\n\f])?|\\R|\\r',
68 'S': r'S|s|\\0{0,4}(?:53|73)(?:\r\n|[ \t\r\n\f])?|\\S|\\s',
69 'T': r'T|t|\\0{0,4}(?:54|74)(?:\r\n|[ \t\r\n\f])?|\\T|\\t',
70 'X': r'X|x|\\0{0,4}(?:58|78)(?:\r\n|[ \t\r\n\f])?|\\X|\\x',
71 'Z': r'Z|z|\\0{0,4}(?:5a|7a)(?:\r\n|[ \t\r\n\f])?|\\Z|\\z',
72 }
73
74
75
76
77 PRODUCTIONS = [
78 ('BOM', r'\xFEFF'),
79 ('URI', r'url\({w}({string}|{urlchar}*){w}\)'),
80 ('FUNCTION', r'{ident}\('),
81
82
83 ('IMPORT_SYM', r'@{I}{M}{P}{O}{R}{T}'),
84 ('PAGE_SYM', r'@{P}{A}{G}{E}'),
85 ('MEDIA_SYM', r'@{M}{E}{D}{I}{A}'),
86 ('FONT_FACE_SYM', r'@{F}{O}{N}{T}\\?\-{F}{A}{C}{E}'),
87 ('CHARSET_SYM', r'@charset '),
88 ('NAMESPACE_SYM', r'@{N}{A}{M}{E}{S}{P}{A}{C}{E}'),
89
90 ('ATKEYWORD', r'@{ident}'),
91
92
93
94
95 ('IDENT', r'{ident}'),
96 ('STRING', r'{string}'),
97
98 ('INVALID', r'{invalid}'),
99
100 ('HASH', r'\#{name}'),
101 ('PERCENTAGE', r'{num}\%'),
102 ('DIMENSION', r'{num}{ident}'),
103 ('NUMBER', r'{num}'),
104
105 ('UNICODE-RANGE', r'[0-9A-F?]{1,6}(\-[0-9A-F]{1,6})?'),
106 ('CDO', r'\<\!\-\-'),
107 ('CDC', r'\-\-\>'),
108 ('S', r'{wc}+'),
109 ('INCLUDES', '\~\='),
110 ('DASHMATCH', r'\|\='),
111 ('PREFIXMATCH', r'\^\='),
112 ('SUFFIXMATCH', r'\$\='),
113 ('SUBSTRINGMATCH', r'\*\='),
114
115
116 ('COMMENT', r'{comment}'),
117
118
119 ('CHAR', r'[^"\']')
120 ]
121
123 """
124 most attributes are set later
125 """
126 EOF = True
127
128
129 for i, t in enumerate(PRODUCTIONS):
130 setattr(CSSProductions, t[0].replace('-', '_'), t[0])
131