1 """CSSFontFaceRule implements DOM Level 2 CSS CSSFontFaceRule.
2 """
3 __all__ = ['CSSFontFaceRule']
4 __docformat__ = 'restructuredtext'
5 __author__ = '$LastChangedBy: cthedot $'
6 __date__ = '$LastChangedDate: 2007-10-18 22:44:54 +0200 (Do, 18 Okt 2007) $'
7 __version__ = '$LastChangedRevision: 507 $'
8
9 import xml.dom
10 import cssrule
11 import cssutils
12 from cssstyledeclaration import CSSStyleDeclaration
13
15 """
16 The CSSFontFaceRule interface represents a @font-face rule in a CSS
17 style sheet. The @font-face rule is used to hold a set of font
18 descriptions.
19
20 Properties
21 ==========
22 cssText: of type DOMString
23 The parsable textual representation of this rule
24 style: of type CSSStyleDeclaration
25 The declaration-block of this rule.
26
27 cssutils only
28 -------------
29 atkeyword:
30 the literal keyword used
31
32 Inherits properties from CSSRule
33
34 Format
35 ======
36 ::
37
38 font_face
39 : FONT_FACE_SYM S*
40 '{' S* declaration [ ';' S* declaration ]* '}' S*
41 ;
42 """
43 type = cssrule.CSSRule.FONT_FACE_RULE
44
45 - def __init__(self, style=None, readonly=False):
63
64 - def _getCssText(self):
65 """
66 returns serialized property cssText
67 """
68 return cssutils.ser.do_CSSFontFaceRule(self)
69
70 - def _setCssText(self, cssText):
71 """
72 DOMException on setting
73
74 - SYNTAX_ERR: (self, StyleDeclaration)
75 Raised if the specified CSS string value has a syntax error and
76 is unparsable.
77 - INVALID_MODIFICATION_ERR: (self)
78 Raised if the specified CSS string value represents a different
79 type of rule than the current one.
80 - HIERARCHY_REQUEST_ERR: (CSSStylesheet)
81 Raised if the rule cannot be inserted at this point in the
82 style sheet.
83 - NO_MODIFICATION_ALLOWED_ERR: (CSSRule)
84 Raised if the rule is readonly.
85 """
86 super(CSSFontFaceRule, self)._setCssText(cssText)
87
88 tokenizer = self._tokenize2(cssText)
89 attoken = self._nexttoken(tokenizer, None)
90 if not attoken or u'@font-face' != self._tokenvalue(
91 attoken, normalize=True):
92 self._log.error(u'CSSFontFaceRule: No CSSFontFaceRule found: %s' %
93 self._valuestr(cssText),
94 error=xml.dom.InvalidModificationErr)
95 else:
96 valid = True
97 beforetokens = self._tokensupto2(tokenizer, blockstartonly=True)
98 try:
99 bracetoken = beforetokens.pop()
100 except IndexError:
101 bracetoken = None
102 if self._tokenvalue(bracetoken) != u'{':
103 valid = False
104 self._log.error(
105 u'CSSFontFaceRule: No start { of style declaration found: %r' %
106 self._valuestr(cssText), bracetoken)
107
108
109 new = {'valid': True}
110 newseq = []
111 beforevalid, expected = self._parse(expected=':',
112 seq=newseq, tokenizer=self._tokenize2(beforetokens),
113 productions={})
114 valid = valid and beforevalid and new['valid']
115
116 styletokens = self._tokensupto2(tokenizer, blockendonly=True)
117 newstyle = CSSStyleDeclaration()
118 if not styletokens:
119 valid = False
120 self._log.error(
121 u'CSSFontFaceRule: No style declaration or "}" found: %r' %
122 self._valuestr(cssText))
123
124 braceorEOFtoken = styletokens.pop()
125 val, typ = self._tokenvalue(braceorEOFtoken), self._type(braceorEOFtoken)
126 if val != u'}' and typ != 'EOF':
127 valid = False
128 self._log.error(
129 u'CSSFontFaceRule: No "}" after style declaration found: %r' %
130 self._valuestr(cssText))
131 else:
132 if 'EOF' == typ:
133
134 styletokens.append(braceorEOFtoken)
135 newstyle.cssText = styletokens
136
137 if valid:
138 self.valid = True
139 self.style = newstyle
140 self.seq = newseq
141
142 cssText = property(_getCssText, _setCssText,
143 doc="(DOM) The parsable textual representation of the rule.")
144
147
159
160 style = property(_getStyle, _setStyle,
161 doc="(DOM) The declaration-block of this rule set.")
162
164 return "cssutils.css.%s(style=%r)" % (
165 self.__class__.__name__, self.style.cssText)
166
168 return "<cssutils.css.%s object style=%r at 0x%x>" % (
169 self.__class__.__name__, self.style.cssText, id(self))
170