home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __all__ = [
- 'CSSCapture',
- 'csscombine']
- __docformat__ = 'restructuredtext'
- __version__ = '$Id: parse.py 1323 2008-07-06 18:13:57Z cthedot $'
- import HTMLParser
- import codecs
- import cssutils
- import errno
- import logging
- import os
- import sys
- import urllib2
- import urlparse
-
- try:
- import cssutils.encutils as encutils
- except ImportError:
-
- try:
- import encutils
- except ImportError:
- sys.exit('You need encutils from http://cthedot.de/encutils/')
- except:
- None<EXCEPTION MATCH>ImportError
-
-
- None<EXCEPTION MATCH>ImportError
-
- LINK = 0
- STYLE = 1
-
- class CSSCaptureHTMLParser(HTMLParser.HTMLParser):
- curtag = u''
- sheets = []
-
- def _loweratts(self, atts):
- return []([ (a.lower(), v.lower()) for a, v in atts ])
-
-
- def handle_starttag(self, tag, atts):
- if tag == u'link':
- atts = self._loweratts(atts)
- if u'text/css' == atts.get(u'type', u''):
- self.sheets.append((LINK, atts))
-
- elif tag == u'style':
- atts = self._loweratts(atts)
- if u'text/css' == atts.get(u'type', u''):
- self.sheets.append((STYLE, [
- atts,
- u'']))
- self.curtag = tag
-
- else:
- self.curtag = u''
-
-
- def handle_data(self, data):
- if self.curtag == u'style':
- self.sheets[-1][1][1] = data
-
-
-
- def handle_comment(self, data):
- self.handle_data(data)
-
-
- def handle_endtag(self, tag):
- self.curtag = u''
-
-
-
- class CSSCapture(object):
-
- def __init__(self, ua = None, log = None, defaultloglevel = logging.INFO):
- self._ua = ua
- if log:
- self._log = log
- else:
- self._log = logging.getLogger('CSSCapture')
- hdlr = logging.StreamHandler(sys.stderr)
- formatter = logging.Formatter('%(message)s')
- hdlr.setFormatter(formatter)
- self._log.addHandler(hdlr)
- self._log.setLevel(defaultloglevel)
- self._log.debug(u'Using default log')
- self._htmlparser = CSSCaptureHTMLParser()
- self._cssparser = cssutils.CSSParser(log = self._log)
-
-
- def _doRequest(self, url):
- self._log.debug(u' CSSCapture._doRequest\n * URL: %s' % url)
- req = urllib2.Request(url)
- if self._ua:
- req.add_header('User-agent', self._ua)
- self._log.info(' * Using User-Agent: %s', self._ua)
-
-
- try:
- res = urllib2.urlopen(req)
- except urllib2.HTTPError:
- e = None
- self._log.critical(' %s\n%s %s\n%s' % (e.geturl(), e.code, e.msg, e.headers))
- return (None, None)
-
- if url != res.geturl():
- url = res.geturl()
- self._log.info(' URL retrieved: %s', url)
-
- return (url, res)
-
-
- def _createStyleSheet(self, href = None, media = None, parentStyleSheet = None, title = u'', cssText = None, encoding = None):
- if cssText is None:
- (encoding, enctype, cssText) = cssutils.util._readUrl(href, parentEncoding = self.docencoding)
- encoding = None
-
- sheet = self._cssparser.parseString(cssText, href = href, media = media, title = title, encoding = encoding)
- if not sheet:
- return None
- self._log.info(u' %s\n' % sheet)
- self._nonparsed[sheet] = cssText
- return sheet
-
-
- def _findStyleSheets(self, docurl, doctext):
- self._htmlparser.feed(doctext)
- for typ, data in self._htmlparser.sheets:
- sheet = None
- if LINK == typ:
- self._log.info(u'+ PROCESSING <link> %r' % data)
- atts = data
- href = urlparse.urljoin(docurl, atts.get(u'href', None))
- sheet = self._createStyleSheet(href = href, media = atts.get(u'media', None), title = atts.get(u'title', None))
- elif STYLE == typ:
- self._log.info(u'+ PROCESSING <style> %r' % data)
- (atts, cssText) = data
- sheet = self._createStyleSheet(cssText = cssText, href = docurl, media = atts.get(u'media', None), title = atts.get(u'title', None), encoding = self.docencoding)
- if sheet:
- sheet._href = None
-
- print sheet.cssText
-
- if sheet:
- self.stylesheetlist.append(sheet)
- self._doImports(sheet, base = docurl)
- continue
-
-
-
- def _doImports(self, parentStyleSheet, base = None):
- for rule in parentStyleSheet.cssRules:
- if rule.type == rule.IMPORT_RULE:
- self._log.info(u'+ PROCESSING @import:')
- self._log.debug(u' IN: %s\n' % parentStyleSheet.href)
- sheet = rule.styleSheet
- href = urlparse.urljoin(base, rule.href)
- if sheet:
- self._log.info(u' %s\n' % sheet)
- self.stylesheetlist.append(sheet)
- self._doImports(sheet, base = href)
-
- sheet
-
-
-
- def capture(self, url):
- self._log.info(u'\nCapturing CSS from URL:\n %s\n', url)
- self._nonparsed = { }
- self.stylesheetlist = cssutils.stylesheets.StyleSheetList()
- (scheme, loc, path, query, fragment) = urlparse.urlsplit(url)
- self._filename = os.path.basename(path)
- (url, res) = self._doRequest(url)
- if not res:
- sys.exit(1)
-
- rawdoc = res.read()
- self.docencoding = encutils.getEncodingInfo(res, rawdoc, log = self._log).encoding
- self._log.info(u'\nUsing Encoding: %s\n', self.docencoding)
- doctext = rawdoc.decode(self.docencoding)
- self._findStyleSheets(url, doctext)
- return self.stylesheetlist
-
-
- def saveto(self, dir, saveraw = False, minified = False):
- msg = 'parsed'
- if saveraw:
- msg = 'raw'
-
- if minified:
- cssutils.ser.prefs.useMinified()
- msg = 'minified'
-
- inlines = 0
- for i, sheet in enumerate(self.stylesheetlist):
- url = sheet.href
- if not url:
- inlines += 1
- url = u'%s_INLINE_%s.css' % (self._filename, inlines)
-
- (scheme, loc, path, query, fragment) = urlparse.urlsplit(url)
- if path and path.startswith('/'):
- path = path[1:]
-
- path = os.path.normpath(path)
- (path, fn) = os.path.split(path)
- savepath = os.path.join(dir, path)
- savefn = os.path.join(savepath, fn)
-
- try:
- os.makedirs(savepath)
- except OSError:
- e = None
- if e.errno != errno.EEXIST:
- raise e
- e.errno != errno.EEXIST
- self._log.debug(u'Path "%s" already exists.', savepath)
-
- self._log.info(u'SAVING %s, %s %r' % (i + 1, msg, savefn))
- sf = open(savefn, 'wb')
- if saveraw:
- cssText = self._nonparsed[sheet]
- uf = codecs.getwriter('css')(sf)
- uf.write(cssText)
- else:
- sf.write(sheet.cssText)
- sf.close()
-
-
-
-
- def csscombine(path = None, url = None, sourceencoding = None, targetencoding = None, minify = True):
- cssutils.log.info(u'Combining files from %r' % url, neverraise = True)
- if sourceencoding is not None:
- cssutils.log.info(u'Using source encoding %r' % sourceencoding, neverraise = True)
-
- if path:
- src = cssutils.parseFile(path, encoding = sourceencoding)
- elif url:
- src = cssutils.parseUrl(url, encoding = sourceencoding)
- else:
- sys.exit('Path or URL must be given')
- result = cssutils.resolveImports(src)
- result.encoding = targetencoding
- cssutils.log.info(u'Using target encoding: %r' % targetencoding, neverraise = True)
- if minify:
- oldser = cssutils.ser
- cssutils.setSerializer(cssutils.serialize.CSSSerializer())
- cssutils.ser.prefs.useMinified()
- cssText = result.cssText
- cssutils.setSerializer(oldser)
- else:
- cssText = result.cssText
- return cssText
-
-