1
2 """a validating CSSParser
3 """
4 __all__ = ['CSSParser']
5 __docformat__ = 'restructuredtext'
6 __version__ = '$Id: parse.py 1264 2008-05-28 16:24:41Z cthedot $'
7
8 import os
9 import codecs
10 import urllib
11 import cssutils
14 """
15 parses a CSS StyleSheet string or file and
16 returns a DOM Level 2 CSS StyleSheet object
17
18 Usage::
19
20 parser = CSSParser()
21
22 # optionally
23 parser.setFetcher(fetcher)
24
25 sheet = parser.parseFile('test1.css', 'ascii')
26
27 print sheet.cssText
28 """
29 - def __init__(self, log=None, loglevel=None, raiseExceptions=False,
30 fetcher=None):
49
50 - def parseString(self, cssText, encoding=None, href=None, media=None,
51 title=None):
52 """Return parsed CSSStyleSheet from given string cssText.
53
54 cssText
55 CSS string to parse
56 encoding
57 If ``None`` the encoding will be read from BOM or an @charset
58 rule or defaults to UTF-8.
59 If given overrides any found encoding including the ones for
60 imported sheets.
61 It also will be used to decode ``cssText`` if given as a (byte)
62 string.
63 href
64 The href attribute to assign to the parsed style sheet.
65 Used to resolve other urls in the parsed sheet like @import hrefs
66 media
67 The media attribute to assign to the parsed style sheet
68 (may be a MediaList, list or a string)
69 title
70 The title attribute to assign to the parsed style sheet
71 """
72 if isinstance(cssText, str):
73 cssText = codecs.getdecoder('css')(cssText, encoding=encoding)[0]
74
75 sheet = cssutils.css.CSSStyleSheet(href=href,
76 media=cssutils.stylesheets.MediaList(media),
77 title=title)
78 sheet._setFetcher(self.__fetcher)
79
80 sheet._setCssTextWithEncodingOverride(self.__tokenizer.tokenize(cssText,
81 fullsheet=True),
82 encoding)
83 return sheet
84
85 - def parseFile(self, filename, encoding=None,
86 href=None, media=None, title=None):
87 """Retrieve and return a CSSStyleSheet from given filename.
88
89 filename
90 of the CSS file to parse, if no ``href`` is given filename is
91 converted to a (file:) URL and set as ``href`` of resulting
92 stylesheet.
93 If href is given it is set as ``sheet.href``. Either way
94 ``sheet.href`` is used to resolve e.g. stylesheet imports via
95 @import rules.
96 encoding
97 Value ``None`` defaults to encoding detection via BOM or an
98 @charset rule.
99 Other values override detected encoding for the sheet at
100 ``filename`` including any imported sheets.
101
102 for other parameters see ``parseString``
103 """
104 if not href:
105
106 href = u'file:' + urllib.pathname2url(os.path.abspath(filename))
107
108 return self.parseString(open(filename, 'rb').read(),
109 encoding=encoding,
110 href=href, media=media, title=title)
111
112 - def parseUrl(self, href, encoding=None, media=None, title=None):
113 """Retrieve and return a CSSStyleSheet from given href (an URL).
114
115 href
116 URL of the CSS file to parse, will also be set as ``href`` of
117 resulting stylesheet
118 encoding
119 Value ``None`` defaults to encoding detection via HTTP, BOM or an
120 @charset rule.
121 A value overrides detected encoding for the sheet at ``href``
122 including any imported sheets.
123
124 for other parameters see ``parseString``
125 """
126 encoding, text = cssutils.util._readUrl(href,
127 overrideEncoding=encoding)
128 if text is not None:
129 return self.parseString(text,
130 encoding=encoding,
131 href=href, media=media, title=title)
132
134 """Replace the default URL fetch function with a custom one.
135 The fetcher function gets a single parameter
136
137 ``url``
138 the URL to read
139
140 and returns ``(encoding, content)`` where ``encoding`` is the HTTP
141 charset normally given via the Content-Type header (which may simply
142 omit the charset) and ``content`` being the (byte) string content.
143 The Mimetype should be 'text/css' but this has to be checked by the
144 fetcher itself (the default fetcher emits a warning if encountering
145 a different mimetype).
146
147 Calling ``setFetcher`` with ``fetcher=None`` resets cssutils
148 to use its default function.
149 """
150 self.__fetcher = fetcher
151
152 @cssutils.util.Deprecated('Use cssutils.CSSParser().parseFile() instead.')
153 - def parse(self, filename, encoding=None,
154 href=None, media=None, title=None):
156