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 __author__ = '$LastChangedBy: cthedot $'
16 __date__ = '$LastChangedDate: 2007-09-01 15:55:42 +0200 (Sa, 01 Sep 2007) $'
17 __version__ = '$LastChangedRevision: 300 $'
18
19 RE_UNICODE = r'\\[0-9a-fA-F]{1,6}[\t|\r|\n|\f|\x20]?'
20
21
22 MACROS = {
23 'ident': r'[-]?{nmstart}{nmchar}*',
24 'name': r'{nmchar}+',
25 'nmstart': r'[_a-zA-Z]|{nonascii}|{escape}',
26 'nonascii': r'[^\0-\177]',
27 'unicode': r'\\[0-9a-f]{1,6}{wc}?',
28 'escape': r'{unicode}|\\[ -~\200-\777]',
29
30 'nmchar': r'[-_a-zA-Z0-9]|{nonascii}|{escape}',
31
32 'num': r'[0-9]*\.[0-9]+|[0-9]+',
33 'string': r"""\'({stringesc1}|{stringchar}|")*\'""" + "|" + '''\"({stringesc2}|{stringchar}|')*\"''',
34
35 'stringesc1' : r"\\'",
36 'stringesc2' : r'\\"',
37
38 'stringchar': r'{urlchar}| |\\{nl}',
39
40
41
42 'urlchar': r'[\x09\x21\x23-\x26\x28-\x7E]|{nonascii}|{escape}',
43
44
45 'invalid': r'{invalid1}|{invalid2}',
46 'invalid1': r'\"([^\n\r\f\\"]|\\{nl}|{escape})*',
47 'invalid2': r"\'([^\n\r\f\\']|\\{nl}|{escape})*",
48
49
50 'nl': r'\n|\r\n|\r|\f',
51 'w': r'{wc}*',
52 'wc': r'\t|\r|\n|\f|\x20',
53
54 'comment': r'\/\*[^*]*\*+([^/][^*]*\*+)*\/',
55
56 'A': r'A|a|\\0{0,4}(?:41|61)(?:\r\n|[ \t\r\n\f])?',
57 'C': r'C|c|\\0{0,4}(?:43|63)(?:\r\n|[ \t\r\n\f])?',
58 'D': r'D|d|\\0{0,4}(?:44|64)(?:\r\n|[ \t\r\n\f])?',
59 'E': r'E|e|\\0{0,4}(?:45|65)(?:\r\n|[ \t\r\n\f])?',
60 'F': r'F|f|\\0{0,4}(?:46|66)(?:\r\n|[ \t\r\n\f])?',
61 'G': r'G|g|\\0{0,4}(?:47|67)(?:\r\n|[ \t\r\n\f])?|\\G|\\g',
62 'H': r'H|h|\\0{0,4}(?:48|68)(?:\r\n|[ \t\r\n\f])?|\\H|\\h',
63 'I': r'I|i|\\0{0,4}(?:49|69)(?:\r\n|[ \t\r\n\f])?|\\I|\\i',
64 'K': r'K|k|\\0{0,4}(?:4b|6b)(?:\r\n|[ \t\r\n\f])?|\\K|\\k',
65 'L': r'L|l|\\0{0,4}(?:4c|6c)(?:\r\n|[ \t\r\n\f])?|\\L|\\l',
66 'M': r'M|m|\\0{0,4}(?:4d|6d)(?:\r\n|[ \t\r\n\f])?|\\M|\\m',
67 'N': r'N|n|\\0{0,4}(?:4e|6e)(?:\r\n|[ \t\r\n\f])?|\\N|\\n',
68 'O': r'O|o|\\0{0,4}(?:4f|6f)(?:\r\n|[ \t\r\n\f])?|\\O|\\o',
69 'P': r'P|p|\\0{0,4}(?:50|70)(?:\r\n|[ \t\r\n\f])?|\\P|\\p',
70 'R': r'R|r|\\0{0,4}(?:52|72)(?:\r\n|[ \t\r\n\f])?|\\R|\\r',
71 'S': r'S|s|\\0{0,4}(?:53|73)(?:\r\n|[ \t\r\n\f])?|\\S|\\s',
72 'T': r'T|t|\\0{0,4}(?:54|74)(?:\r\n|[ \t\r\n\f])?|\\T|\\t',
73 'U': r'U|u|\\0{0,4}(?:55|75)(?:\r\n|[ \t\r\n\f])?|\\U|\\u',
74 'X': r'X|x|\\0{0,4}(?:58|78)(?:\r\n|[ \t\r\n\f])?|\\X|\\x',
75 'Z': r'Z|z|\\0{0,4}(?:5a|7a)(?:\r\n|[ \t\r\n\f])?|\\Z|\\z',
76 }
77
78
79
80
81 PRODUCTIONS = [
82 ('BOM', r'\xFEFF'),
83 ('URI', r'{U}{R}{L}\({w}({string}|{urlchar}*){w}\)'),
84 ('FUNCTION', r'{ident}\('),
85
86
87 ('IMPORT_SYM', r'@{I}{M}{P}{O}{R}{T}'),
88 ('PAGE_SYM', r'@{P}{A}{G}{E}'),
89 ('MEDIA_SYM', r'@{M}{E}{D}{I}{A}'),
90 ('FONT_FACE_SYM', r'@{F}{O}{N}{T}\\?\-{F}{A}{C}{E}'),
91 ('CHARSET_SYM', r'@charset '),
92 ('NAMESPACE_SYM', r'@{N}{A}{M}{E}{S}{P}{A}{C}{E}'),
93
94 ('ATKEYWORD', r'@{ident}'),
95
96
97
98
99 ('IDENT', r'{ident}'),
100 ('STRING', r'{string}'),
101
102 ('INVALID', r'{invalid}'),
103
104 ('HASH', r'\#{name}'),
105 ('PERCENTAGE', r'{num}\%'),
106 ('DIMENSION', r'{num}{ident}'),
107 ('NUMBER', r'{num}'),
108
109 ('UNICODE-RANGE', r'[0-9A-F?]{1,6}(\-[0-9A-F]{1,6})?'),
110 ('CDO', r'\<\!\-\-'),
111 ('CDC', r'\-\-\>'),
112 ('S', r'{wc}+'),
113 ('INCLUDES', '\~\='),
114 ('DASHMATCH', r'\|\='),
115 ('PREFIXMATCH', r'\^\='),
116 ('SUFFIXMATCH', r'\$\='),
117 ('SUBSTRINGMATCH', r'\*\='),
118
119
120 ('COMMENT', r'{comment}'),
121
122
123 ('CHAR', r'[^"\']')
124 ]
125
127 """
128 most attributes are set later
129 """
130 EOF = True
131
132
133 for i, t in enumerate(PRODUCTIONS):
134 setattr(CSSProductions, t[0].replace('-', '_'), t[0])
135