1 """SelectorList is a list of CSS Selector objects.
2
3 TODO
4 - ??? CSS2 gives a special meaning to the comma (,) in selectors.
5 However, since it is not known if the comma may acquire other
6 meanings in future versions of CSS, the whole statement should be
7 ignored if there is an error anywhere in the selector, even though
8 the rest of the selector may look reasonable in CSS2.
9
10 Illegal example(s):
11
12 For example, since the "&" is not a valid token in a CSS2 selector,
13 a CSS2 user agent must ignore the whole second line, and not set
14 the color of H3 to red:
15 """
16 __all__ = ['SelectorList']
17 __docformat__ = 'restructuredtext'
18 __author__ = '$LastChangedBy: cthedot $'
19 __date__ = '$LastChangedDate: 2007-08-20 21:57:18 +0200 (Mo, 20 Aug 2007) $'
20 __version__ = '$LastChangedRevision: 254 $'
21
22 import xml.dom
23 import cssutils
24 from selector import Selector
25
27 """
28 (cssutils) a list of Selectors of a CSSStyleRule
29
30 Properties
31 ==========
32 length: of type unsigned long, readonly
33 The number of Selector elements in the list.
34 selectorText: of type DOMString
35 The textual representation of the selector for the rule set. The
36 implementation may have stripped out insignificant whitespace while
37 parsing the selector.
38 seq:
39 A list of interwoven Selector objects and u','
40 """
41 - def __init__(self, selectorText=None, readonly=False):
51
53 """
54 append a new Selector made from newSelector
55 returns new Selector
56
57 DOMException on setting
58
59 - SYNTAX_ERR: (self)
60 Raised if the specified CSS string value has a syntax error
61 and is unparsable.
62 - NO_MODIFICATION_ALLOWED_ERR: (self)
63 Raised if this rule is readonly.
64 """
65 self._checkReadonly()
66 tokens = self._tokenize(newSelector)
67 newS = Selector(tokens)
68 if not newS.selectorText:
69 self._log.error(u'SelectorList: Not a valid selector: "%s".' %
70 self._valuestr(newSelector), error=xml.dom.SyntaxErr)
71 return
72 else:
73 if len(self.seq) > 0:
74 self.seq.append(u',')
75 self.seq.append(newS)
76 self.append(newS)
77
78 return newS
79
82
83 length = property(_getLength,
84 doc="The number of Selector elements in the list.")
85
87 """ returns serialized format """
88 return cssutils.ser.do_css_SelectorList(self)
89
90 - def _setSelectorText(self, selectorText):
91 """
92 DOMException on setting
93
94 - SYNTAX_ERR: (self)
95 Raised if the specified CSS string value has a syntax error
96 and is unparsable.
97 - NO_MODIFICATION_ALLOWED_ERR: (self)
98 Raised if this rule is readonly.
99 """
100 self._checkReadonly()
101 tokens = self._tokenize(selectorText)
102 if tokens:
103 oldseq, self.seq = self.seq, []
104 self.seq = []
105 selectorparts = []
106 found = None
107 for i in range(len(tokens)):
108 t = tokens[i]
109 if self._ttypes.COMMA == t.type:
110 found = 'comma'
111 try:
112 done = self.appendSelector(selectorparts)
113 except xml.dom.SyntaxErr, e:
114 self.seq = oldseq
115 self._log.error(e)
116 return
117 selectorparts = []
118 else:
119 found = 'selectorpart'
120 selectorparts.append(t)
121
122 if found == 'comma':
123 self._log.error(u'SelectorList: Selectorlist ends with ",".')
124 self.seq = oldseq
125 return
126 elif selectorparts:
127 try:
128 done = self.appendSelector(selectorparts)
129 except xml.dom.SyntaxErr, e:
130 self.seq = oldseq
131 self._log.error(e)
132 return
133
134 else:
135 self._log.error(u'SelectorList: No selectors found.')
136
137 selectorText = property(_getSelectorText, _setSelectorText,
138 doc="""(cssutils) The textual representation of the selector for
139 a rule set.""")
140
141
142 if __name__ == '__main__':
143 cssutils.css.cssstylerule.Selector = Selector
144 L = SelectorList()
145 L.selectorText = 'a'
146 print 1, L.selectorText
147 try:
148 L.selectorText = ','
149 except Exception, e:
150 print e
151 print 2, L.selectorText
152