1 """CSSStyleRule implements DOM Level 2 CSS CSSStyleRule.
2 """
3 __all__ = ['CSSStyleRule']
4 __docformat__ = 'restructuredtext'
5 __author__ = '$LastChangedBy: cthedot $'
6 __date__ = '$LastChangedDate: 2008-01-02 22:28:39 +0100 (Mi, 02 Jan 2008) $'
7 __version__ = '$LastChangedRevision: 789 $'
8
9 import xml.dom
10 import cssrule
11 import cssutils
12 from selectorlist import SelectorList
13 from cssstyledeclaration import CSSStyleDeclaration
14
16 """
17 The CSSStyleRule object represents a ruleset specified (if any) in a CSS
18 style sheet. It provides access to a declaration block as well as to the
19 associated group of selectors.
20
21 Properties
22 ==========
23 selectorText: of type DOMString
24 The textual representation of the selector for the rule set. The
25 implementation may have stripped out insignificant whitespace while
26 parsing the selector.
27 style: of type CSSStyleDeclaration, (DOM)
28 The declaration-block of this rule set.
29
30 inherited properties:
31 - cssText
32 - parentRule
33 - parentStyleSheet
34 - type: STYLE_RULE
35
36 cssutils only
37 -------------
38 selectorList: of type SelectorList (cssutils only)
39 A list of all Selector elements for the rule set.
40
41 Format
42 ======
43 ruleset::
44
45 : selector [ COMMA S* selector ]*
46 LBRACE S* declaration [ ';' S* declaration ]* '}' S*
47 ;
48 """
49 type = cssrule.CSSRule.STYLE_RULE
50
51 - def __init__(self, selectorText=None, style=None, readonly=False):
75
76 - def _getCssText(self):
77 """
78 returns serialized property cssText
79 """
80 return cssutils.ser.do_CSSStyleRule(self)
81
82 - def _setCssText(self, cssText):
83 """
84 DOMException on setting
85
86 - SYNTAX_ERR: (self, StyleDeclaration, etc)
87 Raised if the specified CSS string value has a syntax error and
88 is unparsable.
89 - INVALID_MODIFICATION_ERR: (self)
90 Raised if the specified CSS string value represents a different
91 type of rule than the current one.
92 - HIERARCHY_REQUEST_ERR: (CSSStylesheet)
93 Raised if the rule cannot be inserted at this point in the
94 style sheet.
95 - NO_MODIFICATION_ALLOWED_ERR: (CSSRule)
96 Raised if the rule is readonly.
97 """
98 super(CSSStyleRule, self)._setCssText(cssText)
99
100 tokenizer = self._tokenize2(cssText)
101 selectortokens = self._tokensupto2(tokenizer, blockstartonly=True)
102 styletokens = self._tokensupto2(tokenizer, blockendonly=True)
103
104 if not selectortokens or self._tokenvalue(
105 selectortokens[0]).startswith(u'@'):
106 self._log.error(u'CSSStyleRule: No content or no style rule.',
107 error=xml.dom.InvalidModificationErr)
108
109 else:
110 valid = True
111
112 bracetoken = selectortokens.pop()
113 if self._tokenvalue(bracetoken) != u'{':
114 valid = False
115 self._log.error(
116 u'CSSStyleRule: No start { of style declaration found: %r' %
117 self._valuestr(cssText), bracetoken)
118 elif not selectortokens:
119 valid = False
120 self._log.error(u'CSSStyleRule: No selector found: %r.' %
121 self._valuestr(cssText), bracetoken)
122
123 newselectorlist = SelectorList(selectorText=selectortokens)
124
125 newstyle = CSSStyleDeclaration()
126 if not styletokens:
127 valid = False
128 self._log.error(
129 u'CSSStyleRule: No style declaration or "}" found: %r' %
130 self._valuestr(cssText))
131 else:
132 braceorEOFtoken = styletokens.pop()
133 val, typ = self._tokenvalue(braceorEOFtoken), self._type(braceorEOFtoken)
134 if val != u'}' and typ != 'EOF':
135 valid = False
136 self._log.error(
137 u'CSSStyleRule: No "}" after style declaration found: %r' %
138 self._valuestr(cssText))
139 else:
140 if 'EOF' == typ:
141
142 styletokens.append(braceorEOFtoken)
143 newstyle.cssText = styletokens
144
145 if valid:
146 self.valid = True
147 self.selectorList = newselectorlist
148 self.style = newstyle
149
150 cssText = property(_getCssText, _setCssText,
151 doc="(DOM) The parsable textual representation of the rule.")
152
154 """
155 (cssutils)
156 set the SelectorList of this rule
157
158 selectorList
159 instance of SelectorList
160
161 DOMException on setting
162
163 - NO_MODIFICATION_ALLOWED_ERR:
164 Raised if this rule is readonly.
165 """
166 self._checkReadonly()
167 self._selectorList = selectorList
168 self._selectorList.parentRule = self
169
171 """
172 (cssutils)
173 returns the SelectorList of this rule
174 see selectorText for a textual representation
175 """
176 return self._selectorList
177
178 selectorList = property(_getSelectorList, _setSelectorList,
179 doc="The SelectorList of this rule.")
180
182 """
183 wrapper for cssutils SelectorList object
184 """
185 return self._selectorList.selectorText
186
187 - def _setSelectorText(self, selectorText):
188 """
189 wrapper for cssutils SelectorList object
190
191 selector
192 of type string, might also be a comma separated list of
193 selectors
194
195 DOMException on setting
196
197 - SYNTAX_ERR: (SelectorList, Selector)
198 Raised if the specified CSS string value has a syntax error
199 and is unparsable.
200 - NO_MODIFICATION_ALLOWED_ERR: (self)
201 Raised if this rule is readonly.
202 """
203 self._checkReadonly()
204 self._selectorList = SelectorList(selectorText)
205 self._selectorList.parentRule = self
206
207 selectorText = property(_getSelectorText, _setSelectorText,
208 doc="""(DOM) The textual representation of the selector for the
209 rule set.""")
210
213
225
226 style = property(_getStyle, _setStyle,
227 doc="(DOM) The declaration-block of this rule set.")
228
230 return "cssutils.css.%s(selectorText=%r, style=%r)" % (
231 self.__class__.__name__, self.selectorText, self.style.cssText)
232
234 return "<cssutils.css.%s object selector=%r style=%r at 0x%x>" % (
235 self.__class__.__name__, self.selectorText, self.style.cssText,
236 id(self))
237