gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / lib / cssutils / css / cssunknownrule.py @ 475
History | View | Annotate | Download (8.24 KB)
1 |
"""CSSUnknownRule implements DOM Level 2 CSS CSSUnknownRule."""
|
---|---|
2 |
__all__ = ['CSSUnknownRule']
|
3 |
__docformat__ = 'restructuredtext'
|
4 |
__version__ = '$Id$'
|
5 |
|
6 |
import cssrule |
7 |
import cssutils |
8 |
import xml.dom |
9 |
|
10 |
class CSSUnknownRule(cssrule.CSSRule): |
11 |
"""
|
12 |
Represents an at-rule not supported by this user agent, so in
|
13 |
effect all other at-rules not defined in cssutils.
|
14 |
|
15 |
Format::
|
16 |
|
17 |
@xxx until ';' or block {...}
|
18 |
"""
|
19 |
def __init__(self, cssText=u'', parentRule=None, |
20 |
parentStyleSheet=None, readonly=False): |
21 |
"""
|
22 |
:param cssText:
|
23 |
of type string
|
24 |
"""
|
25 |
super(CSSUnknownRule, self).__init__(parentRule=parentRule, |
26 |
parentStyleSheet=parentStyleSheet) |
27 |
self._atkeyword = None |
28 |
if cssText:
|
29 |
self.cssText = cssText
|
30 |
|
31 |
self._readonly = readonly
|
32 |
|
33 |
def __repr__(self): |
34 |
return u"cssutils.css.%s(cssText=%r)" % ( |
35 |
self.__class__.__name__,
|
36 |
self.cssText)
|
37 |
|
38 |
def __str__(self): |
39 |
return u"<cssutils.css.%s object cssText=%r at 0x%x>" % ( |
40 |
self.__class__.__name__,
|
41 |
self.cssText,
|
42 |
id(self)) |
43 |
|
44 |
def _getCssText(self): |
45 |
"""Return serialized property cssText."""
|
46 |
return cssutils.ser.do_CSSUnknownRule(self) |
47 |
|
48 |
def _setCssText(self, cssText): |
49 |
"""
|
50 |
:exceptions:
|
51 |
- :exc:`~xml.dom.SyntaxErr`:
|
52 |
Raised if the specified CSS string value has a syntax error and
|
53 |
is unparsable.
|
54 |
- :exc:`~xml.dom.InvalidModificationErr`:
|
55 |
Raised if the specified CSS string value represents a different
|
56 |
type of rule than the current one.
|
57 |
- :exc:`~xml.dom.HierarchyRequestErr`:
|
58 |
Raised if the rule cannot be inserted at this point in the
|
59 |
style sheet.
|
60 |
- :exc:`~xml.dom.NoModificationAllowedErr`:
|
61 |
Raised if the rule is readonly.
|
62 |
"""
|
63 |
super(CSSUnknownRule, self)._setCssText(cssText) |
64 |
tokenizer = self._tokenize2(cssText)
|
65 |
attoken = self._nexttoken(tokenizer, None) |
66 |
if not attoken or self._type(attoken) != self._prods.ATKEYWORD: |
67 |
self._log.error(u'CSSUnknownRule: No CSSUnknownRule found: %s' % |
68 |
self._valuestr(cssText),
|
69 |
error=xml.dom.InvalidModificationErr) |
70 |
else:
|
71 |
# for closures: must be a mutable
|
72 |
new = {'nesting': [], # {} [] or () |
73 |
'wellformed': True |
74 |
} |
75 |
|
76 |
def CHAR(expected, seq, token, tokenizer=None): |
77 |
type_, val, line, col = token |
78 |
if expected != 'EOF': |
79 |
if val in u'{[(': |
80 |
new['nesting'].append(val)
|
81 |
elif val in u'}])': |
82 |
opening = {u'}': u'{', u']': u'[', u')': u'('}[val] |
83 |
try:
|
84 |
if new['nesting'][-1] == opening: |
85 |
new['nesting'].pop()
|
86 |
else:
|
87 |
raise IndexError() |
88 |
except IndexError: |
89 |
new['wellformed'] = False |
90 |
self._log.error(u'CSSUnknownRule: Wrong nesting of ' |
91 |
u'{, [ or (.', token=token)
|
92 |
|
93 |
if val in u'};' and not new['nesting']: |
94 |
expected = 'EOF'
|
95 |
|
96 |
seq.append(val, type_, line=line, col=col) |
97 |
return expected
|
98 |
else:
|
99 |
new['wellformed'] = False |
100 |
self._log.error(u'CSSUnknownRule: Expected end of rule.', |
101 |
token=token) |
102 |
return expected
|
103 |
|
104 |
def FUNCTION(expected, seq, token, tokenizer=None): |
105 |
# handled as opening (
|
106 |
type_, val, line, col = token |
107 |
val = self._tokenvalue(token)
|
108 |
if expected != 'EOF': |
109 |
new['nesting'].append(u'(') |
110 |
seq.append(val, type_, line=line, col=col) |
111 |
return expected
|
112 |
else:
|
113 |
new['wellformed'] = False |
114 |
self._log.error(u'CSSUnknownRule: Expected end of rule.', |
115 |
token=token) |
116 |
return expected
|
117 |
|
118 |
def EOF(expected, seq, token, tokenizer=None): |
119 |
"close all blocks and return 'EOF'"
|
120 |
for x in reversed(new['nesting']): |
121 |
closing = {u'{': u'}', u'[': u']', u'(': u')'}[x] |
122 |
seq.append(closing, closing) |
123 |
new['nesting'] = []
|
124 |
return 'EOF' |
125 |
|
126 |
def INVALID(expected, seq, token, tokenizer=None): |
127 |
# makes rule invalid
|
128 |
self._log.error(u'CSSUnknownRule: Bad syntax.', |
129 |
token=token, error=xml.dom.SyntaxErr) |
130 |
new['wellformed'] = False |
131 |
return expected
|
132 |
|
133 |
def STRING(expected, seq, token, tokenizer=None): |
134 |
type_, val, line, col = token |
135 |
val = self._stringtokenvalue(token)
|
136 |
if expected != 'EOF': |
137 |
seq.append(val, type_, line=line, col=col) |
138 |
return expected
|
139 |
else:
|
140 |
new['wellformed'] = False |
141 |
self._log.error(u'CSSUnknownRule: Expected end of rule.', |
142 |
token=token) |
143 |
return expected
|
144 |
|
145 |
def URI(expected, seq, token, tokenizer=None): |
146 |
type_, val, line, col = token |
147 |
val = self._uritokenvalue(token)
|
148 |
if expected != 'EOF': |
149 |
seq.append(val, type_, line=line, col=col) |
150 |
return expected
|
151 |
else:
|
152 |
new['wellformed'] = False |
153 |
self._log.error(u'CSSUnknownRule: Expected end of rule.', |
154 |
token=token) |
155 |
return expected
|
156 |
|
157 |
def default(expected, seq, token, tokenizer=None): |
158 |
type_, val, line, col = token |
159 |
if expected != 'EOF': |
160 |
seq.append(val, type_, line=line, col=col) |
161 |
return expected
|
162 |
else:
|
163 |
new['wellformed'] = False |
164 |
self._log.error(u'CSSUnknownRule: Expected end of rule.', |
165 |
token=token) |
166 |
return expected
|
167 |
|
168 |
# unknown : ATKEYWORD S* ... ; | }
|
169 |
newseq = self._tempSeq()
|
170 |
wellformed, expected = self._parse(expected=None, |
171 |
seq=newseq, tokenizer=tokenizer, |
172 |
productions={'CHAR': CHAR,
|
173 |
'EOF': EOF,
|
174 |
'FUNCTION': FUNCTION,
|
175 |
'INVALID': INVALID,
|
176 |
'STRING': STRING,
|
177 |
'URI': URI,
|
178 |
'S': default # overwrite default default! |
179 |
}, |
180 |
default=default, |
181 |
new=new) |
182 |
|
183 |
# wellformed set by parse
|
184 |
wellformed = wellformed and new['wellformed'] |
185 |
|
186 |
# post conditions
|
187 |
if expected != 'EOF': |
188 |
wellformed = False
|
189 |
self._log.error(u'CSSUnknownRule: No ending ";" or "}" found: ' |
190 |
u'%r' % self._valuestr(cssText)) |
191 |
elif new['nesting']: |
192 |
wellformed = False
|
193 |
self._log.error(u'CSSUnknownRule: Unclosed "{", "[" or "(": %r' |
194 |
% self._valuestr(cssText))
|
195 |
|
196 |
# set all
|
197 |
if wellformed:
|
198 |
self.atkeyword = self._tokenvalue(attoken) |
199 |
self._setSeq(newseq)
|
200 |
|
201 |
cssText = property(fget=_getCssText, fset=_setCssText,
|
202 |
doc=u"(DOM) The parsable textual representation.")
|
203 |
|
204 |
type = property(lambda self: self.UNKNOWN_RULE, |
205 |
doc=u"The type of this rule, as defined by a CSSRule "
|
206 |
u"type constant.")
|
207 |
|
208 |
wellformed = property(lambda self: bool(self.atkeyword)) |
209 |
|