PK¨“m8“×2EGG-INFO/dependency_links.txt PK¨“m8&¦]00EGG-INFO/entry_points.txt[console_scripts] pisa = sx.pisa3.pisa:command PK¨“m8“×2EGG-INFO/not-zip-safe PK¨“m8G‘Ýï¨ ¨ EGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: pisa Version: 3.0.15 Summary: PDF generator using HTML and CSS Home-page: http://www.htmltopdf.org/ Author: Dirk Holtwick Author-email: holtwick@web.de License: Qt Public License (QPL) Download-URL: http://www.htmltopdf.org/download.html Description: pisa is a html2pdf converter using the ReportLab Toolkit, the HTML5lib and pyPdf. It supports HTML 5 and CSS 2.1 (and some of CSS 3). It is completely written in pure Python so it is platform independent. The main benefit of this tool that a user with Web skills like HTML and CSS is able to generate PDF templates very quickly without learning new technologies. Easy integration into Python frameworks like CherryPy, KID Templating, TurboGears, Django, Zope, Plone, etc. (see 'demo' folder for examples) Keywords: HTML,CSS,PDF Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Environment :: Web Environment Classifier: Intended Audience :: Customer Service Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Financial and Insurance Industry Classifier: Intended Audience :: Healthcare Industry Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: Legal Industry Classifier: Intended Audience :: Manufacturing Classifier: Intended Audience :: Science/Research Classifier: Intended Audience :: System Administrators Classifier: Intended Audience :: Telecommunications Industry Classifier: License :: Free for non-commercial use Classifier: License :: OSI Approved :: Qt Public License (QPL) Classifier: Natural Language :: English Classifier: Natural Language :: German Classifier: Operating System :: MacOS Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft Classifier: Operating System :: Microsoft :: MS-DOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: Other OS Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: Unix Classifier: Topic :: Documentation Classifier: Topic :: Internet Classifier: Topic :: Multimedia Classifier: Topic :: Office/Business Classifier: Topic :: Office/Business :: Financial Classifier: Topic :: Office/Business :: Financial :: Accounting Classifier: Topic :: Printing Classifier: Topic :: Text Processing Classifier: Topic :: Text Processing :: Fonts Classifier: Topic :: Text Processing :: Markup Classifier: Topic :: Text Processing :: Markup :: HTML Classifier: Topic :: Text Processing :: Markup :: XML Classifier: Topic :: Utilities PK¨“m80hXò  EGG-INFO/SOURCES.txtCHANGELOG.txt LICENSE.pdf LICENSE.txt MANIFEST.in README-MAC.txt README-WINDOWS.txt README.txt TODO.txt VERSION.txt check_parse_css.py check_parse_html5.py check_parse_html5_dom.py check_parse_reportlab.py pisa.bat pisa.py pisa23.bat pisa24.bat pisa25.bat setup.bat setup.cfg setup.py setup_egg.py setup_exe.bat setup_exe.py setup_version.py statsvn.bat statsvn.jar demo/README.txt demo/cherrypy/demo-cherrypy.bat demo/cherrypy/demo-cherrypy.conf demo/cherrypy/demo-cherrypy.html demo/cherrypy/demo-cherrypy.py demo/djangoproject/__init__.py demo/djangoproject/django-admin.py demo/djangoproject/manage.py demo/djangoproject/settings.py demo/djangoproject/urls.py demo/djangoproject/views.py demo/tgpisa/README.txt demo/tgpisa/dev.cfg demo/tgpisa/sample-prod.cfg demo/tgpisa/setup.py demo/tgpisa/start-tgpisa.py demo/tgpisa/test.cfg demo/tgpisa/tgpisa/__init__.py demo/tgpisa/tgpisa/commands.py demo/tgpisa/tgpisa/controllers.py demo/tgpisa/tgpisa/json.py demo/tgpisa/tgpisa/model.py demo/tgpisa/tgpisa/release.py demo/tgpisa/tgpisa.egg-info/PKG-INFO demo/tgpisa/tgpisa.egg-info/SOURCES.txt demo/tgpisa/tgpisa.egg-info/dependency_links.txt demo/tgpisa/tgpisa.egg-info/entry_points.txt demo/tgpisa/tgpisa.egg-info/not-zip-safe demo/tgpisa/tgpisa.egg-info/paster_plugins.txt demo/tgpisa/tgpisa.egg-info/requires.txt demo/tgpisa/tgpisa.egg-info/sqlobject.txt demo/tgpisa/tgpisa.egg-info/top_level.txt demo/tgpisa/tgpisa/config/__init__.py demo/tgpisa/tgpisa/config/app.cfg demo/tgpisa/tgpisa/config/log.cfg demo/tgpisa/tgpisa/static/css/style.css demo/tgpisa/tgpisa/static/images/favicon.ico demo/tgpisa/tgpisa/static/images/header_inner.png demo/tgpisa/tgpisa/static/images/info.png demo/tgpisa/tgpisa/static/images/ok.png demo/tgpisa/tgpisa/static/images/tg_under_the_hood.png demo/tgpisa/tgpisa/static/images/under_the_hood_blue.png demo/tgpisa/tgpisa/templates/__init__.py demo/tgpisa/tgpisa/templates/login.kid demo/tgpisa/tgpisa/templates/master.kid demo/tgpisa/tgpisa/templates/welcome.kid demo/tgpisa/tgpisa/tests/__init__.py demo/tgpisa/tgpisa/tests/test_controllers.py demo/tgpisa/tgpisa/tests/test_model.py dist/pisa-3.0.1.tar.gz dist/pisa-3.0.10.tar.gz dist/pisa-3.0.12.tar.gz dist/pisa-3.0.2.tar.gz dist/pisa-3.0.3.tar.gz dist/pisa-3.0.4.tar.gz dist/pisa-3.0.5.tar.gz dist/pisa-3.0.6.tar.gz dist/pisa-3.0.7.tar.gz dist/pisa-3.0.8.tar.gz dist/pisa-3.0.9.tar.gz doc/DejaVuSans.ttf doc/DejaVuSansMono.ttf doc/DejaVuSerif.ttf doc/README.txt doc/background.ai doc/background.pdf doc/pisa-de.html doc/pisa-de.pdf doc/pisa-en.html doc/pisa-en.pdf doc/pisa.css doc/q_license.html doc/q_license.pdf doc/screen.css ho/__init__.py ho/pisa/__init__.py lib/html5lib/__init__.py lib/html5lib/constants.py lib/html5lib/html5parser.py lib/html5lib/inputstream.py lib/html5lib/liberalxmlparser.py lib/html5lib/sanitizer.py lib/html5lib/tokenizer.py lib/html5lib/utils.py lib/html5lib/filters/__init__.py lib/html5lib/filters/_base.py lib/html5lib/filters/formfiller.py lib/html5lib/filters/inject_meta_charset.py lib/html5lib/filters/iso639codes.py lib/html5lib/filters/lint.py lib/html5lib/filters/optionaltags.py lib/html5lib/filters/rfc2046.py lib/html5lib/filters/rfc3987.py lib/html5lib/filters/sanitizer.py lib/html5lib/filters/validator.py lib/html5lib/filters/whitespace.py lib/html5lib/serializer/__init__.py lib/html5lib/serializer/htmlserializer.py lib/html5lib/serializer/xhtmlserializer.py lib/html5lib/treebuilders/__init__.py lib/html5lib/treebuilders/_base.py lib/html5lib/treebuilders/dom.py lib/html5lib/treebuilders/etree.py lib/html5lib/treebuilders/simpletree.py lib/html5lib/treebuilders/soup.py lib/html5lib/treewalkers/__init__.py lib/html5lib/treewalkers/_base.py lib/html5lib/treewalkers/dom.py lib/html5lib/treewalkers/etree.py lib/html5lib/treewalkers/genshistream.py lib/html5lib/treewalkers/lxmletree.py lib/html5lib/treewalkers/pulldom.py lib/html5lib/treewalkers/simpletree.py lib/html5lib/treewalkers/soup.py lib/pyPdf/__init__.py lib/pyPdf/filters.py lib/pyPdf/generic.py lib/pyPdf/pdf.py lib/pyPdf/utils.py pisa.egg-info/PKG-INFO pisa.egg-info/SOURCES.txt pisa.egg-info/dependency_links.txt pisa.egg-info/entry_points.txt pisa.egg-info/top_level.txt sx/__init__.py sx/pisa3/__init__.py sx/pisa3/pisa.py sx/pisa3/pisa_context.py sx/pisa3/pisa_default.py sx/pisa3/pisa_document.py sx/pisa3/pisa_parser.py sx/pisa3/pisa_reportlab.py sx/pisa3/pisa_tables.py sx/pisa3/pisa_tags.py sx/pisa3/pisa_turbogears.py sx/pisa3/pisa_util.py sx/pisa3/pisa_version.py sx/w3c/LICENSE.txt sx/w3c/__init__.py sx/w3c/css.py sx/w3c/cssDOMElementInterface.py sx/w3c/cssParser.py sx/w3c/cssSpecial.py test/default.css test/pdf.css test/simple-css.html test/simple-test.html test/simple.py test/test-align.html test/test-background.html test/test-barcode.html test/test-blocks.html test/test-collapse.html test/test-css-body.html test/test-css-border.html test/test-css-fontface.html test/test-css-id.html test/test-css-media-1.css test/test-css-media-2.css test/test-css-media-4.css test/test-css-media.html test/test-css.html test/test-entities.html test/test-font.html test/test-image.html test/test-invoice-bg.pdf test/test-invoice.html test/test-lineg.html test/test-link.html test/test-list.html test/test-loremipsum.html test/test-margins.html test/test-page-box.html test/test-pre.html test/test-syntax.html test/test-tables.html test/test-template.html test/test-w3c-css.html test/css/spirito-content.css test/css/spirito-reset.css test/css/test-css-media-3.css test/font/DejaVuSans-Bold.ttf test/font/DejaVuSans-BoldOblique.ttf test/font/DejaVuSans-Oblique.ttf test/font/DejaVuSans.ttf test/font/DejaVuSansMono-Bold.ttf test/font/DejaVuSansMono-BoldOblique.ttf test/font/DejaVuSansMono-Oblique.ttf test/font/DejaVuSansMono.ttf test/font/Forelle.afm test/font/Forelle.pfb test/font/leerc.afm test/font/leerc.pfb test/font/milano.ttf test/font/rina.ttf test/img/beach.jpg test/img/test.jpg test/pdf/background-sample.pdf PK¨“m8H‘ÞEGG-INFO/top_level.txtsx ho PK«*8ùRü22ho/__init__.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __version__ = "$Revision: 128 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2008-01-10 21:26:42 +0100 (Do, 10 Jan 2008) $" __svnid__ = "$Id: __init__.py 128 2008-01-10 20:26:42Z holtwick $" # Also look in other packages with the same name from pkgutil import extend_path __path__ = extend_path(__path__, __name__) PK¨“m8hh±--ho/__init__.pyc;ò è~†Gc@s8dZdZdZdZdklZeeeƒZdS(s$Revision: 128 $s$Author: holtwick $s4$Date: 2008-01-10 21:26:42 +0100 (Do, 10 Jan 2008) $s4$Id: __init__.py 128 2008-01-10 20:26:42Z holtwick $(s extend_pathN(s __version__s __author__s__date__s __svnid__spkgutils extend_paths__path__s__name__(s extend_paths__path__s __author__s__date__s __svnid__s __version__((s$build\bdist.win32\egg\ho\__init__.pys?s  PK¨“m8hh±--ho/__init__.pyo;ò è~†Gc@s8dZdZdZdZdklZeeeƒZdS(s$Revision: 128 $s$Author: holtwick $s4$Date: 2008-01-10 21:26:42 +0100 (Do, 10 Jan 2008) $s4$Id: __init__.py 128 2008-01-10 20:26:42Z holtwick $(s extend_pathN(s __version__s __author__s__date__s __svnid__spkgutils extend_paths__path__s__name__(s extend_paths__path__s __author__s__date__s __svnid__s __version__((s$build\bdist.win32\egg\ho\__init__.pys?s  PK7”l8OÍ…ho/pisa/__init__.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# """ In the near future pisa will be moved into the namespace "ho" This is a helper for migration """ __reversion__ = "$Revision: 160 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2008-03-12 16:40:03 +0100 (Mi, 12 Mrz 2008) $" from sx.pisa3.pisa import * __version__ = VERSION PK¨“m8 J ""ho/pisa/__init__.pyc;ò úØGc@s)dZdZdZdZdkTeZdS(s^ In the near future pisa will be moved into the namespace "ho" This is a helper for migration s$Revision: 160 $s$Author: holtwick $s4$Date: 2008-03-12 16:40:03 +0100 (Mi, 12 Mrz 2008) $(s*N(s__doc__s __reversion__s __author__s__date__s sx.pisa3.pisasVERSIONs __version__(s__date__s __version__s __reversion__s __author__((s)build\bdist.win32\egg\ho\pisa\__init__.pys? s PK¨“m8 J ""ho/pisa/__init__.pyo;ò úØGc@s)dZdZdZdZdkTeZdS(s^ In the near future pisa will be moved into the namespace "ho" This is a helper for migration s$Revision: 160 $s$Author: holtwick $s4$Date: 2008-03-12 16:40:03 +0100 (Mi, 12 Mrz 2008) $(s*N(s__doc__s __reversion__s __author__s__date__s sx.pisa3.pisasVERSIONs __version__(s__date__s __version__s __reversion__s __author__((s)build\bdist.win32\egg\ho\pisa\__init__.pys? s PK«*8ùRü22sx/__init__.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __version__ = "$Revision: 128 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2008-01-10 21:26:42 +0100 (Do, 10 Jan 2008) $" __svnid__ = "$Id: __init__.py 128 2008-01-10 20:26:42Z holtwick $" # Also look in other packages with the same name from pkgutil import extend_path __path__ = extend_path(__path__, __name__) PK¨“m8O‚­Ê--sx/__init__.pyc;ò è~†Gc@s8dZdZdZdZdklZeeeƒZdS(s$Revision: 128 $s$Author: holtwick $s4$Date: 2008-01-10 21:26:42 +0100 (Do, 10 Jan 2008) $s4$Id: __init__.py 128 2008-01-10 20:26:42Z holtwick $(s extend_pathN(s __version__s __author__s__date__s __svnid__spkgutils extend_paths__path__s__name__(s extend_paths__path__s __author__s__date__s __svnid__s __version__((s$build\bdist.win32\egg\sx\__init__.pys?s  PK¨“m8O‚­Ê--sx/__init__.pyo;ò è~†Gc@s8dZdZdZdZdklZeeeƒZdS(s$Revision: 128 $s$Author: holtwick $s4$Date: 2008-01-10 21:26:42 +0100 (Do, 10 Jan 2008) $s4$Id: __init__.py 128 2008-01-10 20:26:42Z holtwick $(s extend_pathN(s __version__s __author__s__date__s __svnid__spkgutils extend_paths__path__s__name__(s extend_paths__path__s __author__s__date__s __svnid__s __version__((s$build\bdist.win32\egg\sx\__init__.pys?s  PK)’m8ÐýÚ~Ñ%Ñ%sx/pisa3/pisa.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 20 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $" import getopt import sys import os import os.path import urllib2 import urlparse import tempfile # import logging from pisa_version import * from pisa_document import * from pisa_util import log from pisa_default import DEFAULT_CSS __version__ = VERSION # Backward compatibility CreatePDF = pisaDocument USAGE = (VERSION_STR + """ USAGE: pisa [options] Name of a HTML file or a file pattern using * placeholder. If you want to read from stdin use "-" as file name. You may also load an URL over HTTP. Take care of putting the in quotes if it contains characters like "?". Name of the generated PDF file or "-" if you like to send the result to stdout. Take care that the destination file is not alread opened by an other application like the Adobe Reader. If the destination is not writeable a similar name will be calculated automatically. [options] --css, -c: path to default css file --css-dump: dumps the default css definitions to STDOUT --debug, -d: show debugging informations --help, -h: show this help text --quiet, -q: show no messages --start-viewer, -s: start PDF default viewer on Windows and MacOSX (e.g. AcrobatReader) --version: show version information --warn, -w: show warnings """).strip() COPYRIGHT = VERSION_STR BENCH = """ BENCHMARKING: parsing %.4f sec document %.4f sec create %.4f sec """.strip() LOG_FORMAT = "%(levelname)s [%(name)s] %(message)s" LOG_FORMAT_DEBUG = "%(levelname)s [%(name)s] %(pathname)s line %(lineno)d in %(funcName)s: %(message)s" def usage(): print USAGE class pisaLinkLoader: """ Helper to load page from an URL and load corresponding files to temporary files. If getFileName is called it returns the temporty filename and takes care to delete it when pisaLinkLoader is unloaded. """ def __init__(self, src, quiet=True): self.quiet = quiet self.src = src self.tfileList = [] def __del__(self): for path in self.tfileList: # print "DELETE", path os.remove(path) def getFileName(self, name, relative=None): try: url = urlparse.urljoin(relative or self.src, name) suffix = urlparse.urlsplit(url)[2].split(".")[-1] if suffix.lower() not in ("css", "gif", "jpg", "png"): return None ufile = urllib2.urlopen(url) path = tempfile.mktemp(suffix = "." + suffix) tfile = file(path, "wb") while True: data = ufile.read(1024) if not data: break # print data tfile.write(data) ufile.close() tfile.close() self.tfileList.append(path) if not self.quiet: print " Loading", url, "to", path return path except Exception, e: if not self.quiet: print " ERROR:", e return None def command(): import os import os.path import glob try: opts, args = getopt.getopt(sys.argv[1:], "bdhpqstwc", [ "benchmark", "quiet", "help", "start-viewer", "debug=", "copyright", "version", "warn", "booklet=", "multivalent=", "multivalent-path=", "parse", "tempdir=", "format=", "css=", "css-dump", ]) except getopt.GetoptError: usage() sys.exit(2) startviewer = 0 quiet = 0 bench = 0 debug = 0 warn = 0 tidy = 0 multivalent_path = "" booklet = "" # parse = 0 tempdir = None format = "pdf" css = None log_level = logging.ERROR log_format = LOG_FORMAT for o, a in opts: if o in ("-h", "--help"): # Hilfe anzeigen usage() sys.exit() if o in ("-s", "--start-viewer"): # Anzeigeprogramm starten startviewer = 1 if o in ("-q", "--quiet"): # Output unterdrücken quiet = 1 if o in ("-b", "--benchmark"): # Zeiten ausgeben bench = 1 if o in ("-w", "--warn"): # Warnings warn = 1 log_level = min(log_level, logging.WARN) # If also -d ignore -w if o in ("-d", "--debug"): # Debug log_level = logging.DEBUG log_format = LOG_FORMAT_DEBUG # debug = 10 if a: log_level = int(a) if o in ("--multivalent", "--multivalent-path"): # Multivalent.jar für Booklet multivalent_path = a if o in ("--booklet",): # Booklet booklet = a if o in ("--copyright", "--version"): print COPYRIGHT sys.exit(0) #if o in ("-p", "--parse"): # # Print parse # parse = 1 if o in ("--tempdir",): # Tempdir tempdir = a if o in ("-t", "--format"): # Format format = a if o in ("-c", "--css"): # CSS # css = "@import url('%s');" % a css = file(a, "r").read() if o in ("--css-dump",): # CSS dump print DEFAULT_CSS return if not quiet: try: logging.basicConfig(level=log_level, format=log_format) except: # XXX Logging doesn't work for Python 2.3 logging.basicConfig() if len(args) not in (1, 2): usage() sys.exit(2) if len(args)==2: a_src, a_dest = args else: a_src = args[0] a_dest = None if "*" in a_src: a_src = glob.glob(a_src) # print a_src else: a_src = [a_src] for src in a_src: lc = None wpath = None if src=="-": fsrc = sys.stdin wpath = os.getcwd() else: # fsrc = open(src, "r") if src.startswith("http:"): # print "+++", src wpath = src fsrc = urllib2.urlopen(src) lc = pisaLinkLoader(src, quiet=quiet).getFileName src = "".join(urlparse.urlsplit(src)[1:3]).replace("/", "-") else: fsrc = wpath = os.path.abspath(src) fsrc = open(fsrc, "rb") if a_dest is None: dest_part = src if dest_part.lower().endswith(".html") or dest_part.lower().endswith(".htm"): dest_part = ".".join(src.split(".")[:-1]) dest = dest_part + "." + format.lower() for i in range(10): try: open(dest, "wb").close() break except: pass dest = dest_part + "-%d.%s" % (i, format.lower()) else: dest = a_dest fdestclose = 0 if dest=="-": if sys.platform == "win32": import os, msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) fdest = sys.stdout startviewer = 0 else: dest = os.path.abspath(dest) try: open(dest, "wb").close() except: print "File '%s' seems to be in use of another application." % dest sys.exit(2) fdest = open(dest, "wb") fdestclose = 1 if not quiet: print "Converting %s to %s..." % (src, dest) pdf = pisaDocument( fsrc, fdest, debug = debug, path = wpath, errout = sys.stdout, multivalent_path = multivalent_path, booklet = booklet, tempdir = tempdir, format = format, link_callback = lc, default_css = css, ) if fdestclose: fdest.close() if not quiet: #if pdf.log and (pdf.err or (pdf.warn and warn)): # for mode, line, msg, code in pdf.log: # print "%s in line %d: %s" % (mode, line, msg) if pdf.err: print "*** %d ERRORS OCCURED" % pdf.err else: if bench: print BENCH % tuple(pdf.bench) if (not pdf.err) and startviewer: if not quiet: print "Open viewer for file %s" % dest try: # print repr(dest) os.startfile(dest) except: # try to opan a la apple # cmd = 'nohup /Applications/Preview.app/Contents/MacOS/Preview "%s" &' % dest cmd = 'open "%s"' % dest # print cmd os.system(cmd) if __name__=="__main__": main() PK¨“m8µØ # #sx/pisa3/pisa.pyc;ò žaÙGc@sôdZdZdZdkZdkZdkZdkZdkZdkZdk Z dk Tdk Tdk l Z dklZeZeZediƒZeZdiƒZd Zd Zd „Zd fd „ƒYZd„Zedjo eƒndS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $N(s*(slog(s DEFAULT_CSSsÎ USAGE: pisa [options] Name of a HTML file or a file pattern using * placeholder. If you want to read from stdin use "-" as file name. You may also load an URL over HTTP. Take care of putting the in quotes if it contains characters like "?". Name of the generated PDF file or "-" if you like to send the result to stdout. Take care that the destination file is not alread opened by an other application like the Adobe Reader. If the destination is not writeable a similar name will be calculated automatically. [options] --css, -c: path to default css file --css-dump: dumps the default css definitions to STDOUT --debug, -d: show debugging informations --help, -h: show this help text --quiet, -q: show no messages --start-viewer, -s: start PDF default viewer on Windows and MacOSX (e.g. AcrobatReader) --version: show version information --warn, -w: show warnings sH BENCHMARKING: parsing %.4f sec document %.4f sec create %.4f sec s$%(levelname)s [%(name)s] %(message)ssR%(levelname)s [%(name)s] %(pathname)s line %(lineno)d in %(funcName)s: %(message)scCs tGHdS(N(sUSAGE(((s&build\bdist.win32\egg\sx\pisa3\pisa.pysusageOsspisaLinkLoadercBs/tZdZed„Zd„Zed„ZRS(sß Helper to load page from an URL and load corresponding files to temporary files. If getFileName is called it returns the temporty filename and takes care to delete it when pisaLinkLoader is unloaded. cCs||_||_g|_dS(N(squietsselfssrcs tfileList(sselfssrcsquiet((s&build\bdist.win32\egg\sx\pisa3\pisa.pys__init__[s  cCs%x|iD]}ti|ƒq WdS(N(sselfs tfileListspathsossremove(sselfspath((s&build\bdist.win32\egg\sx\pisa3\pisa.pys__del__`s c CsSyti|p|i|ƒ}ti|ƒdidƒd} | i ƒddddfjot Snt i |ƒ}tidd| ƒ}t|d ƒ}x5to-|id ƒ}| oPn|i|ƒqW|iƒ|iƒ|ii|ƒ|i od G|Gd G|GHn|SWn-tj o!}|i o d G|GHqKnXt SdS(Nis.iÿÿÿÿscsssgifsjpgspngssuffixswbis Loadingstos ERROR:(surlparsesurljoinsrelativesselfssrcsnamesurlsurlsplitssplitssuffixslowersNonesurllib2surlopensufilestempfilesmktempspathsfilestfilesTruesreadsdataswritescloses tfileListsappendsquiets Exceptionse( sselfsnamesrelativesesurlsdatastfilespathsufilessuffix((s&build\bdist.win32\egg\sx\pisa3\pisa.pys getFileNamees0     (s__name__s __module__s__doc__sTrues__init__s__del__sNones getFileName(((s&build\bdist.win32\egg\sx\pisa3\pisa.pyspisaLinkLoaderRs   c!Csdk}dk}dk}yVtitiddddddddd d d d d dddddgƒ\} }Wn*tij ot ƒti dƒnXd}d}d}d}d}d}d}d} t}d} t} ti}t}xß| D]×\}}|ddfjot ƒti ƒn|ddfjo d}n|ddfjo d}n|ddfjo d}n|dd fjod}t|tiƒ}n|d!d"fjo*ti }t!}|ot"|ƒ}qín|d#d$fjo |}n|d%fjo |} n|d&d'fjot#GHti dƒn|d(fjo |}n|d)d*fjo |} n|d+d,fjot$|d-ƒi%ƒ} n|d.fjo t&GHdSqöqöW| o2yti'd/|d0|ƒWq ti'ƒq Xnt(|ƒddfjot ƒti dƒnt(|ƒdjo|\}}n|d}t}d1|jo|i|ƒ}n |g}x||D]t}t}t}|d2joti.}|i0ƒ}n|i1d3ƒoY|}t2i3|ƒ}t4|d|ƒi5}di6t7i8|ƒdd4!ƒi9d5d2ƒ}n&|i:i;|ƒ}}t<|d6ƒ}|tjo½|} | i>ƒi?d7ƒp| i>ƒi?d8ƒo d9i6|i@d9ƒd: ƒ} n| d9| i>ƒ} xZtBd;ƒD]B}yt<| d<ƒiDƒPWnnX| d=|| i>ƒf} qåWn|} d}| d2joUtiFd>jo2dk}dkG}|iHtiIiJƒ|iKƒntiI}d}n_|i:i;| ƒ} yt<| d<ƒiDƒWnd?| GHti dƒnXt<| d<ƒ}d}| od@|| fGHntM||dA|dB|dCtiIdD|dE| dF|d0| dG|dH| ƒ }|o|iDƒn| o;|iOodI|iOGHq¶|otPtQ|i ƒGHq¶n|iO o|oK| o dJ| GHny|iR| ƒWqdK| }|iT|ƒqXqŸqŸWdS(LNis bdhpqstwcs benchmarksquietshelps start-viewersdebug=s copyrightsversionswarnsbooklet=s multivalent=smultivalent-path=sparsestempdir=sformat=scss=scss-dumpiisspdfs-hs--helps-ss--start-viewers-qs--quiets-bs --benchmarks-ws--warns-ds--debugs --multivalents--multivalent-paths --booklets --copyrights --versions --tempdirs-ts--formats-cs--csssrs --css-dumpslevelsformats*s-shttp:is/srbs.htmls.htms.iÿÿÿÿi swbs-%d.%sswin32s4File '%s' seems to be in use of another application.sConverting %s to %s...sdebugspathserroutsmultivalent_pathsbookletstempdirs link_callbacks default_csss*** %d ERRORS OCCUREDsOpen viewer for file %ss open "%s"(Usossos.pathsglobsgetoptssyssargvsoptssargss GetoptErrorsusagesexits startviewersquietsbenchsdebugswarnstidysmultivalent_pathsbookletsNonestempdirsformatscsssloggingsERRORs log_levels LOG_FORMATs log_formatsosasminsWARNsDEBUGsLOG_FORMAT_DEBUGsints COPYRIGHTsfilesreads DEFAULT_CSSs basicConfigslensa_srcsa_destssrcslcswpathsstdinsfsrcsgetcwds startswithsurllib2surlopenspisaLinkLoaders getFileNamesjoinsurlparsesurlsplitsreplacespathsabspathsopens dest_partslowersendswithssplitsdestsrangesiscloses fdestclosesplatformsmsvcrtssetmodesstdoutsfilenosO_BINARYsfdests pisaDocumentspdfserrsBENCHstuples startfilescmdssystem(!s fdestclosescmdstidysa_srcsmsvcrts log_levelslcsbenchstempdirscsss dest_partsformatsdestsbookletsglobsargsswarnsmultivalent_pathsa_dests startviewerssrcsasfdestsiswpathsquietsosfsrcsdebugspdfs log_formatsossopts((s&build\bdist.win32\egg\sx\pisa3\pisa.pyscommands   V                / ,  "          s__main__( s __reversion__s __author__s__date__sgetoptssyssossos.pathsurllib2surlparsestempfiles pisa_versions pisa_documents pisa_utilslogs pisa_defaults DEFAULT_CSSsVERSIONs __version__s pisaDocuments CreatePDFs VERSION_STRsstripsUSAGEs COPYRIGHTsBENCHs LOG_FORMATsLOG_FORMAT_DEBUGsusagespisaLinkLoaderscommands__name__smain(sLOG_FORMAT_DEBUGs COPYRIGHTs CreatePDFsBENCHs LOG_FORMATs DEFAULT_CSSsurlparseslogstempfilesusagesgetopts __version__surllib2s __author__ssyssUSAGEs __reversion__s__date__scommandspisaLinkLoadersos((s&build\bdist.win32\egg\sx\pisa3\pisa.pys?s2         %  - æ PK¨“m8µØ # #sx/pisa3/pisa.pyo;ò žaÙGc@sôdZdZdZdkZdkZdkZdkZdkZdkZdk Z dk Tdk Tdk l Z dklZeZeZediƒZeZdiƒZd Zd Zd „Zd fd „ƒYZd„Zedjo eƒndS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $N(s*(slog(s DEFAULT_CSSsÎ USAGE: pisa [options] Name of a HTML file or a file pattern using * placeholder. If you want to read from stdin use "-" as file name. You may also load an URL over HTTP. Take care of putting the in quotes if it contains characters like "?". Name of the generated PDF file or "-" if you like to send the result to stdout. Take care that the destination file is not alread opened by an other application like the Adobe Reader. If the destination is not writeable a similar name will be calculated automatically. [options] --css, -c: path to default css file --css-dump: dumps the default css definitions to STDOUT --debug, -d: show debugging informations --help, -h: show this help text --quiet, -q: show no messages --start-viewer, -s: start PDF default viewer on Windows and MacOSX (e.g. AcrobatReader) --version: show version information --warn, -w: show warnings sH BENCHMARKING: parsing %.4f sec document %.4f sec create %.4f sec s$%(levelname)s [%(name)s] %(message)ssR%(levelname)s [%(name)s] %(pathname)s line %(lineno)d in %(funcName)s: %(message)scCs tGHdS(N(sUSAGE(((s&build\bdist.win32\egg\sx\pisa3\pisa.pysusageOsspisaLinkLoadercBs/tZdZed„Zd„Zed„ZRS(sß Helper to load page from an URL and load corresponding files to temporary files. If getFileName is called it returns the temporty filename and takes care to delete it when pisaLinkLoader is unloaded. cCs||_||_g|_dS(N(squietsselfssrcs tfileList(sselfssrcsquiet((s&build\bdist.win32\egg\sx\pisa3\pisa.pys__init__[s  cCs%x|iD]}ti|ƒq WdS(N(sselfs tfileListspathsossremove(sselfspath((s&build\bdist.win32\egg\sx\pisa3\pisa.pys__del__`s c CsSyti|p|i|ƒ}ti|ƒdidƒd} | i ƒddddfjot Snt i |ƒ}tidd| ƒ}t|d ƒ}x5to-|id ƒ}| oPn|i|ƒqW|iƒ|iƒ|ii|ƒ|i od G|Gd G|GHn|SWn-tj o!}|i o d G|GHqKnXt SdS(Nis.iÿÿÿÿscsssgifsjpgspngssuffixswbis Loadingstos ERROR:(surlparsesurljoinsrelativesselfssrcsnamesurlsurlsplitssplitssuffixslowersNonesurllib2surlopensufilestempfilesmktempspathsfilestfilesTruesreadsdataswritescloses tfileListsappendsquiets Exceptionse( sselfsnamesrelativesesurlsdatastfilespathsufilessuffix((s&build\bdist.win32\egg\sx\pisa3\pisa.pys getFileNamees0     (s__name__s __module__s__doc__sTrues__init__s__del__sNones getFileName(((s&build\bdist.win32\egg\sx\pisa3\pisa.pyspisaLinkLoaderRs   c!Csdk}dk}dk}yVtitiddddddddd d d d d dddddgƒ\} }Wn*tij ot ƒti dƒnXd}d}d}d}d}d}d}d} t}d} t} ti}t}xß| D]×\}}|ddfjot ƒti ƒn|ddfjo d}n|ddfjo d}n|ddfjo d}n|dd fjod}t|tiƒ}n|d!d"fjo*ti }t!}|ot"|ƒ}qín|d#d$fjo |}n|d%fjo |} n|d&d'fjot#GHti dƒn|d(fjo |}n|d)d*fjo |} n|d+d,fjot$|d-ƒi%ƒ} n|d.fjo t&GHdSqöqöW| o2yti'd/|d0|ƒWq ti'ƒq Xnt(|ƒddfjot ƒti dƒnt(|ƒdjo|\}}n|d}t}d1|jo|i|ƒ}n |g}x||D]t}t}t}|d2joti.}|i0ƒ}n|i1d3ƒoY|}t2i3|ƒ}t4|d|ƒi5}di6t7i8|ƒdd4!ƒi9d5d2ƒ}n&|i:i;|ƒ}}t<|d6ƒ}|tjo½|} | i>ƒi?d7ƒp| i>ƒi?d8ƒo d9i6|i@d9ƒd: ƒ} n| d9| i>ƒ} xZtBd;ƒD]B}yt<| d<ƒiDƒPWnnX| d=|| i>ƒf} qåWn|} d}| d2joUtiFd>jo2dk}dkG}|iHtiIiJƒ|iKƒntiI}d}n_|i:i;| ƒ} yt<| d<ƒiDƒWnd?| GHti dƒnXt<| d<ƒ}d}| od@|| fGHntM||dA|dB|dCtiIdD|dE| dF|d0| dG|dH| ƒ }|o|iDƒn| o;|iOodI|iOGHq¶|otPtQ|i ƒGHq¶n|iO o|oK| o dJ| GHny|iR| ƒWqdK| }|iT|ƒqXqŸqŸWdS(LNis bdhpqstwcs benchmarksquietshelps start-viewersdebug=s copyrightsversionswarnsbooklet=s multivalent=smultivalent-path=sparsestempdir=sformat=scss=scss-dumpiisspdfs-hs--helps-ss--start-viewers-qs--quiets-bs --benchmarks-ws--warns-ds--debugs --multivalents--multivalent-paths --booklets --copyrights --versions --tempdirs-ts--formats-cs--csssrs --css-dumpslevelsformats*s-shttp:is/srbs.htmls.htms.iÿÿÿÿi swbs-%d.%sswin32s4File '%s' seems to be in use of another application.sConverting %s to %s...sdebugspathserroutsmultivalent_pathsbookletstempdirs link_callbacks default_csss*** %d ERRORS OCCUREDsOpen viewer for file %ss open "%s"(Usossos.pathsglobsgetoptssyssargvsoptssargss GetoptErrorsusagesexits startviewersquietsbenchsdebugswarnstidysmultivalent_pathsbookletsNonestempdirsformatscsssloggingsERRORs log_levels LOG_FORMATs log_formatsosasminsWARNsDEBUGsLOG_FORMAT_DEBUGsints COPYRIGHTsfilesreads DEFAULT_CSSs basicConfigslensa_srcsa_destssrcslcswpathsstdinsfsrcsgetcwds startswithsurllib2surlopenspisaLinkLoaders getFileNamesjoinsurlparsesurlsplitsreplacespathsabspathsopens dest_partslowersendswithssplitsdestsrangesiscloses fdestclosesplatformsmsvcrtssetmodesstdoutsfilenosO_BINARYsfdests pisaDocumentspdfserrsBENCHstuples startfilescmdssystem(!s fdestclosescmdstidysa_srcsmsvcrts log_levelslcsbenchstempdirscsss dest_partsformatsdestsbookletsglobsargsswarnsmultivalent_pathsa_dests startviewerssrcsasfdestsiswpathsquietsosfsrcsdebugspdfs log_formatsossopts((s&build\bdist.win32\egg\sx\pisa3\pisa.pyscommands   V                / ,  "          s__main__( s __reversion__s __author__s__date__sgetoptssyssossos.pathsurllib2surlparsestempfiles pisa_versions pisa_documents pisa_utilslogs pisa_defaults DEFAULT_CSSsVERSIONs __version__s pisaDocuments CreatePDFs VERSION_STRsstripsUSAGEs COPYRIGHTsBENCHs LOG_FORMATsLOG_FORMAT_DEBUGsusagespisaLinkLoaderscommands__name__smain(sLOG_FORMAT_DEBUGs COPYRIGHTs CreatePDFsBENCHs LOG_FORMATs DEFAULT_CSSsurlparseslogstempfilesusagesgetopts __version__surllib2s __author__ssyssUSAGEs __reversion__s__date__scommandspisaLinkLoadersos((s&build\bdist.win32\egg\sx\pisa3\pisa.pys?s2         %  - æ PK}m8/¶ c~~sx/pisa3/pisa_context.py# -*- coding: utf-8 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 20 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $" from pisa_util import * from pisa_reportlab import * import pisa_default import re import cStringIO import urlparse import types from reportlab.platypus.paraparser import ParaParser, ParaFrag, ps2tt, tt2ps, ABag from reportlab.platypus.paragraph import cleanBlockQuotedText from reportlab.platypus.tableofcontents import TableOfContents from reportlab.lib.styles import ParagraphStyle import reportlab.rl_config reportlab.rl_config.warnOnMissingFontGlyphs = 0 from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.lib.fonts import addMapping from sx.w3c import css, cssDOMElementInterface from html5lib.sanitizer import * sizeDelta = 2 # amount to reduce font size by for super and sub script subFraction = 0.4 # fraction of font size that a sub script should be lowered superFraction = 0.4 def getParaFrag(style): frag = ParaFrag() frag.sub = 0 frag.super = 0 frag.rise = 0 frag.underline = 0 # XXX Need to be able to set color to fit CSS tests frag.strike = 0 frag.greek = 0 frag.link = None frag.text = "" # frag.lineBreak = 0 #if bullet: # frag.fontName, frag.bold, frag.italic = ps2tt(style.bulletFontName) # frag.fontSize = style.bulletFontSize # frag.textColor = hasattr(style,'bulletColor') and style.bulletColor or style.textColor #else: frag.fontName, frag.bold, frag.italic = ps2tt(style.fontName) frag.fontName = "Times-Roman" frag.fontSize = style.fontSize frag.textColor = style.textColor # Extras frag.leading = 0 frag.leadingSource = "150%" frag.backColor = white frag.borderWidth = 1 frag.borderPadding = 0 frag.borderColor = None frag.spaceBefore = 0 frag.spaceAfter = 0 frag.leftIndent = 0 frag.rightIndent = 0 frag.firstLineIndent = 0 frag.keepWithNext = False frag.alignment = TA_LEFT frag.vAlign = None frag.borderLeftWidth = 0 frag.borderLeftColor = None frag.borderLeftStyle = None frag.borderRightWidth = 0 frag.borderRightColor = None frag.borderRightStyle = None frag.borderTopWidth = 0 frag.borderTopColor = None frag.borderTopStyle = None frag.borderBottomWidth = 0 frag.borderBottomColor = None frag.borderBottomStyle = None frag.paddingLeft = 0 frag.paddingRight = 0 frag.paddingTop = 0 frag.paddingBottom = 0 frag.listStyleType = None frag.whiteSpace = "normal" frag.pageNumber = False frag.height = None frag.width = None frag.bulletIndent = 0 frag.bulletText = None frag.zoom = 1.0 frag.outline = False frag.outlineLevel = 0 frag.outlineOpen = False return frag def getDirName(path): if path and not path.lower().startswith("http:"): return os.path.dirname(os.path.abspath(path)) return path class pisaCSSBuilder(css.CSSBuilder): def atFontFace(self, declarations): " Embed fonts " result = self.ruleset([self.selector('*')], declarations) # print "@FONT-FACE", declarations, result try: data = result[0].values()[0] names = data["font-family"] # Font weight fweight = str(data.get("font-weight", "")).lower() bold = fweight in ("bold", "bolder", "500", "600", "700", "800", "900") if not bold and fweight<>"normal": log.warn("@fontface, unknown value font-weight '%s'", fweight) pass # XXX WARNING # Font style italic = str(data.get("font-style", "")).lower() in ("italic", "oblique") src = self.c.getFile(data["src"]) self.c.loadFont( names, src, bold=bold, italic=italic) except Exception, e: log.exception("@fontface") self.c.warning(ErrorMsg()) return {}, {} def _pisaDimensions(self, data): " Calculate dimensions of a box " box = data.get("-pdf-frame-box", []) # print 123, box if len(box)==4: return [getSize(x) for x in box] top = getSize(data.get("top", 0)) left = getSize(data.get("left", 0)) bottom = -getSize(data.get("bottom", 0)) right = -getSize(data.get("right", 0)) width = getSize(data.get("width", 0)) height = getSize(data.get("height", 0)) if height: if (not top) and bottom: top = bottom - height else: bottom = top + height if width: if (not left) and right: left = right - width else: right = left + width top += getSize(data.get("margin-top", 0)) left += getSize(data.get("margin-left", 0)) bottom -= getSize(data.get("margin-bottom", 0)) right -= getSize(data.get("margin-right", 0)) # box = getCoords(left, top, width, height, self.c.pageSize) # print "BOX", box return left, top, right, bottom def _pisaAddFrame(self, name, data, first=False, border=None): c = self.c if not name: name = "-pdf-frame-%d" % c.UID() x, y, w, h = self._pisaDimensions(data) # print name, x, y, w, h #if not (w and h): # return None if first: return ( name, None, data.get("-pdf-frame-border", border), x, y, w, h) return ( name, data.get("-pdf-frame-content", None), data.get("-pdf-frame-border", border), x, y, w, h) def atPage(self, name, pseudopage, declarations): try: c = self.c data = {} name = name or "body" pageBorder = None if declarations: result = self.ruleset([self.selector('*')], declarations) # print "@PAGE", name, pseudopage, declarations, result if declarations: data = result[0].values()[0] pageBorder = data.get("-pdf-frame-border", None) for prop in [ "margin-top", "margin-left", "margin-right", "margin-bottom", "top", "left", "right", "bottom", "width", "height" ]: if data.has_key(prop): c.frameList.append(self._pisaAddFrame(name, data, first=True, border=pageBorder)) break if c.templateList.has_key(name): self.warning("template '%s' has already been defined" % name) if data.has_key("-pdf-page-size"): c.pageSize = pisa_default.PML_PAGESIZES.get(str(data["-pdf-page-size"]).lower(), c.pageSize) if data.has_key("size"): size = data["size"] # print size, c.pageSize if type(size) is not types.ListType: size = [size] isLandscape = False sizeList = [] for value in size: valueStr = str(value).lower() if type(value) is types.TupleType: sizeList.append(getSize(value)) elif valueStr == "landscape": isLandscape = True elif pisa_default.PML_PAGESIZES.has_key(valueStr): c.pageSize = pisa_default.PML_PAGESIZES[valueStr] else: c.warning("Unknown size value for @page") if len(sizeList) == 2: c.pageSize = sizeList if isLandscape: c.pageSize = landscape(c.pageSize) # self._drawing = PmlPageDrawing(self._pagesize) #if not c.frameList: # c.warning("missing frame definitions for template") # return {}, {} # Frames have to be calculated after we know the pagesize frameList = [] staticList = [] for fname, static, border, x, y, w, h in c.frameList: x, y, w, h = getCoords(x, y, w, h, c.pageSize) if w<=0 or h<=0: self.c.warning("Negative width or height of frame. Check @frame definitions.") frame = Frame( x, y, w, h, id = fname, leftPadding = 0, rightPadding = 0, bottomPadding = 0, topPadding = 0, showBoundary = border or pageBorder) if static: frame.pisaStaticStory = [] c.frameStatic[static] = [frame] + c.frameStatic.get(static, []) staticList.append(frame) else: frameList.append(frame) background = data.get("background-image", None) if background: background = c.getFile(background) # print background # print frameList if not frameList: # print 999 c.warning("missing explicit frame definition for content or just static frames") fname, static, border, x, y, w, h = self._pisaAddFrame(name, data, first=True, border=pageBorder) x, y, w, h = getCoords(x, y, w, h, c.pageSize) if w<=0 or h<=0: self.c.warning("Negative width or height of frame. Check @page definitions.") frameList.append(Frame( x, y, w, h, id = fname, leftPadding = 0, rightPadding = 0, bottomPadding = 0, topPadding = 0, showBoundary = border or pageBorder)) pt = PmlPageTemplate( id = name, frames = frameList, pagesize = c.pageSize, ) pt.pisaStaticList = staticList pt.pisaBackground = background pt.pisaBackgroundList = c.pisaBackgroundList # self._pagesize) # pt.pml_statics = self._statics # pt.pml_draw = self._draw # pt.pml_drawing = self._drawing # pt.pml_background = attrs.background # pt.pml_bgstory = self._bgstory c.templateList[name] = pt c.template = None c.frameList = [] c.frameStaticList = [] except Exception, e: # print ErrorMsg() log.exception("@page") self.c.warning(ErrorMsg()) return {}, {} def atFrame(self, name, declarations): if declarations: result = self.ruleset([self.selector('*')], declarations) # print "@BOX", name, declarations, result try: data = result[0] if data: data = data.values()[0] self.c.frameList.append( self._pisaAddFrame( name, data)) except Exception, e: log.exception("@frame") self.c.warning(ErrorMsg()) return {}, {} class pisaCSSParser(css.CSSParser): def parseExternal(self, cssResourceName): # print "@import", self.rootPath, cssResourceName oldRootPath = self.rootPath cssFile = self.c.getFile(cssResourceName, relative=self.rootPath) # cStringIO.StringIO("") result = [] if self.rootPath and self.rootPath.startswith("http:"): self.rootPath = urlparse.urljoin(self.rootPath, cssResourceName) else: self.rootPath = getDirName(cssFile) # print "###", self.rootPath if not cssFile: return None cssFile = file(cssFile, "r") result = self.parseFile(cssFile, True) self.rootPath = oldRootPath return result class pisaContext: """ Helper class for creation of reportlab story and container for varoius data. """ def __init__(self, path, debug=0): self.fontList = copy.copy(pisa_default.DEFAULT_FONT) self.path = [] self.node = None self.toc = TableOfContents() self.story = [] self.text = [] self.log = [] self.err = 0 self.warn = 0 self.debugLevel = debug self.text = u"" self.uidctr = 0 self.pageSize = A4 self.template = None self.templateList = {} self.frameList = [] self.frameStatic = {} self.frameStaticList = [] self.pisaBackgroundList = [] self.anchorFrag = [] self.anchorName = [] self.tableData = None self.frag = self.fragBlock = getParaFrag(ParagraphStyle('default%d' % self.UID())) self.fragList = [] self.fragAnchor = [] self.fragStack = [] self.fragStrip = True self.listCounter = 0 self.cssText = "" self.pathCallback = None # External callback function for path calculations # Store path to document self.pathDocument = path or "__dummy__" if not self.pathDocument.lower().startswith("http:"): self.pathDocument = os.path.abspath(self.pathDocument) self.pathDirectory = getDirName(self.pathDocument) self.meta = dict( author = "", title = "", subject = "", keywords = "", pagesize = A4, ) def debug(self, level, *args): try: if self.debugLevel > level: # log.debug() print "DEBUG [%s]:" % level, for a in args: print a, print except: pass def UID(self): self.uidctr += 1 return self.uidctr # METHODS FOR CSS def addCSS(self, value): self.cssText += value def parseCSS(self): #print repr(self.cssText) self.debug(9, self.cssText) # XXX Must be handled in a better way! self.cssText = self.cssText.replace("", "\n") self.cssText = self.cssText.replace("", "\n") #self.debug(9, self.cssText) # print repr(self.cssText) # file("pisa.css", "wb").write(self.cssText.encode("utf8")) # self.cssText = re.compile(r"url\((.*?\))", re.M).sub('"\1"', self.cssText) # self.cssText = re.compile(r"\-moz\-.*?([\;\}]+)", re.M).sub(r"\1", self.cssText) # XXX Import has to be implemented! # self.cssText = re.compile(r"\@import.*;", re.M).sub("", self.cssText) if 0: try: # Sanitize CSS import cssutils import logging cssutils.log.setlog(logging.getLogger('csslog')) cssutils.log.setloglevel(logging.DEBUG) sheet = cssutils.parseString(self.cssText) self.cssText = sheet.cssText #err = csslog.getvalue() except ImportError, e: pass except Exception, e: self.error("Error parsing CSS by cssutils: %s" % ErrorMsg(e)) # print self.cssText # file("pisa-sanitized.css", "w").write(self.cssText.encode("utf8")) # print self.cssText self.cssBuilder = pisaCSSBuilder(mediumSet=["all", "print", "pdf"]) self.cssBuilder.c = self self.cssParser = pisaCSSParser(self.cssBuilder) self.cssParser.rootPath = self.pathDirectory self.cssParser.c = self self.css = self.cssParser.parse(self.cssText) self.cssCascade = css.CSSCascadeStrategy(self.css) self.cssCascade.parser = self.cssParser # METHODS FOR STORY def addStory(self, data): self.story.append(data) def swapStory(self, story=[]): self.story, story = copy.copy(story), copy.copy(self.story) return story def addTOC(self): self.addStory(self.toc) def addPara(self, force=False): # Cleanup the trail try: rfragList = reversed(self.fragList) except: # For Python 2.3 compatibility rfragList = copy.copy(self.fragList) rfragList.reverse() for frag in rfragList: frag.text = frag.text.rstrip() if frag.text: break if force or (self.text.strip() and self.fragList): # Strip trailing whitespaces #for f in self.fragList: # f.text = f.text.lstrip() # if f.text: # break #self.fragList[-1].lineBreak = self.fragList[-1].text.rstrip() # Update paragraph style by style of first fragment first = self.fragBlock style = ParagraphStyle('default%d' % self.UID(), keepWithNext = first.keepWithNext) style.fontName = first.fontName style.fontSize = first.fontSize style.leading = max(first.leading, first.fontSize * 1.25) style.backColor = first.backColor style.spaceBefore = first.spaceBefore style.spaceAfter = first.spaceAfter style.leftIndent = first.leftIndent style.rightIndent = first.rightIndent style.firstLineIndent = first.firstLineIndent style.alignment = first.alignment style.bulletFontName = first.fontName style.bulletFontSize = first.fontSize style.bulletIndent = first.bulletIndent # Border handling for Paragraph style.borderWidth = 0 if getBorderStyle(first.borderTopStyle): style.borderWidth = max( first.borderLeftWidth, first.borderRightWidth, first.borderTopWidth, first.borderBottomWidth) style.borderPadding = first.borderPadding # + first.borderWidth style.borderColor = first.borderTopColor # If no border color is given, the text color is used (XXX Tables!) if (style.borderColor is None) and style.borderWidth: style.borderColor = first.textColor # borderRadius: None, # print repr(self.text.strip()), style.leading, "".join([repr(x.text) for x in self.fragList]) # print first.leftIndent, first.listStyleType,repr(self.text) # Add paragraph to story if len(self.fragAnchor + self.fragList)>0: para = PmlParagraph( self.text, style, frags=self.fragAnchor + self.fragList, bulletText=copy.copy(first.bulletText)) # XXX ??? para.outline = first.outline para.outlineLevel = first.outlineLevel para.outlineOpen = first.outlineOpen self.addStory(para) self.fragAnchor = [] first.bulletText = None self.clearFrag() # METHODS FOR FRAG def clearFrag(self): self.fragList = [] self.fragStrip = True self.text = u"" def newFrag(self, **kw): self.frag = copy.deepcopy(self.frag) for k, v in kw.items(): setattr(self.frag, k, v) return self.frag def _appendFrag(self, frag): if frag.link and frag.link.startswith("#"): self.anchorFrag.append((frag, frag.link[1:])) self.fragList.append(frag) def addFrag(self, text="", frag=None): frag = baseFrag = copy.deepcopy(self.frag) # if sub and super are both on they will cancel each other out if frag.sub == 1 and frag.super == 1: frag.sub = 0 frag.super = 0 # XXX Has to be replaced by CSS styles like vertical-align and font-size if frag.sub: frag.rise = -frag.fontSize*subFraction frag.fontSize = max(frag.fontSize-sizeDelta,3) elif frag.super: frag.rise = frag.fontSize*superFraction frag.fontSize = max(frag.fontSize-sizeDelta,3) if frag.greek: frag.fontName = 'symbol' data = _greekConvert(data) # bold, italic, and underline frag.fontName = tt2ps(frag.fontName,frag.bold,frag.italic) # Modify text for optimal whitespace handling # XXX Support Unicode whitespaces? # XXX What about images? # - Replace ­ by blank text = text.replace(u"\xad", "") # Replace ­ with blank if frag.whiteSpace == "pre": for text in re.split(r'(\r\n|\n|\r)', text): self.text += text if "\n" in text or "\r" in text: frag = copy.deepcopy(baseFrag) frag.text = "" frag.lineBreak = 1 self._appendFrag(frag) else: text = text.replace(u"\t", 8 * u" ") for text in re.split(r'(\ )', text): frag = copy.deepcopy(baseFrag) if text == " ": text = '\xc2\xa0' # XXX Don't ask me what's that! u"\xc2\xa0" frag.text = text self._appendFrag(frag) else: if text == u"\xa0": frag.text = '\xc2\xa0' self.text += text self._appendFrag(frag) else: frag.text = " ".join(("x" + text + "x").split())[1:-1] if self.fragStrip: frag.text = frag.text.lstrip() if frag.text: self.fragStrip = False self.text += frag.text self._appendFrag(frag) def pushFrag(self): self.fragStack.append(self.frag) self.newFrag() def pullFrag(self): self.frag = self.fragStack.pop() # XXX def _getFragment(self, l=20): try: return repr(" ".join(self.node.toxml().split()[:l])) except: return "" def _getLineNumber(self): return 0 def context(self, msg): return "line %s: %s\n%s" % ( self._getLineNumber(), str(msg), self._getFragment(50)) def warning(self, msg): self.warn += 1 if self.debugLevel > 1: print "WARNING #%s %s %s: %s" % ( self.warn, self._getLineNumber(), str(msg), self._getFragment(50)) log.warn(self.context(msg)) self.log.append((pisa_default.PML_WARNING, self._getLineNumber(), str(msg), self._getFragment(50))) def error(self, msg): self.err += 1 if self.debugLevel > 0: print "ERROR #%s %s %s: %s" % ( self.err, self._getLineNumber(), str(msg), self._getFragment(50)) log.error(self.context(msg)) self.log.append((pisa_default.PML_ERROR, self._getLineNumber(), str(msg), self._getFragment(50))) # UTILS def getFile(self, name, relative=None): """ Returns a file name or None """ if self.pathCallback is not None: nv = self.pathCallback(name, relative) else: path = relative or self.pathDirectory nv = os.path.normpath(os.path.join(path, name)) if not(nv and os.path.isfile(nv)): nv = None if nv is None: self.warning("file '%s' does not exist" % (name)) return nv def getFontName(self, names, default="helvetica"): """ Name of a font """ # print names, self.fontList if type(names) is not types.ListType: names = str(names).strip().split(",") for name in names: font = self.fontList.get(str(name).strip().lower(), None) if font is not None: return font return self.fontList.get(default, None) def registerFont(self, fontname, alias=[]): self.fontList[str(fontname).lower()] = str(fontname) for a in alias: self.fontList[str(a)] = str(fontname) def loadFont(self, names, src, encoding="WinAnsiEncoding", bold=0, italic=0): if names and src: if type(names) is types.ListType: fontAlias = names else: fontAlias = [x.lower().strip() for x in names.split(",") if x] # XXX Problems with unicode here fontAlias = [str(x) for x in fontAlias] src = str(src) fontName = fontAlias[0] baseName, suffix = src.rsplit(".", 1) suffix = suffix.lower() try: if suffix == "ttf": # determine full font name according to weight and style fullFontName = "%s_%d%d" % (fontName, bold, italic) # check if font has already been registered if fullFontName in self.fontList: self.warning("Repeated font embed for %s, skip new embed " % fullFontName) else: # Register TTF font and special name pdfmetrics.registerFont(TTFont(fullFontName, src)) # Add or replace missing styles for bold in (0, 1): for italic in (0, 1): if ("%s_%d%d" % (fontName, bold, italic)) not in self.fontList: addMapping(fontName, bold, italic, fullFontName) # Register "normal" name and the place holder for style self.registerFont(fontName, fontAlias + [fullFontName]) elif suffix in ("afm", "pfb"): afm = baseName + ".afm" pfb = baseName + ".pfb" # determine full font name according to weight and style fullFontName = "%s_%d%d" % (fontName, bold, italic) #fontNameOriginal = "" #for line in open(afm).readlines()[:-1]: # if line[:16] == 'StartCharMetrics': # self.error("Font name not found") # if line[:8] == 'FontName': # fontNameOriginal = line[9:].strip() # break # check if font has already been registered if fullFontName in self.fontList: self.warning("Repeated font embed for %s, skip new embed" % fontName) else: # Include font face = pdfmetrics.EmbeddedType1Face(afm, pfb) fontNameOriginal = face.name pdfmetrics.registerTypeFace(face) #print fontName, fontNameOriginal, fullFontName justFont = pdfmetrics.Font(fullFontName, fontNameOriginal, encoding) pdfmetrics.registerFont(justFont) # Add or replace missing styles for bold in (0, 1): for italic in (0, 1): if ("%s_%d%d" % (fontName, bold, italic)) not in self.fontList: addMapping(fontName, bold, italic, fontNameOriginal) # Register "normal" name and the place holder for style self.registerFont(fontName, fontAlias + [fullFontName, fontNameOriginal]) #import pprint #pprint.pprint(self.fontList) else: self.error("wrong attributes for ") except Exception, e: log.exception("Loading font '%s'", fontName) self.warning(ErrorMsg()) PK¨“m8ýì!îeîesx/pisa3/pisa_context.pyc;ò ó<ÙGc@s\dZdZdZdkTdkTdkZdkZdkZdkZdk Z dk l Z l Z l Z lZlZdklZdklZdklZdkZd ei_d klZd klZd klZd k l!Z!l"Z"dk#TdZ$dZ%dZ&d„Z'd„Z(de!i)fd„ƒYZ*de!i+fd„ƒYZ,dfd„ƒYZ-dS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(s*N(s ParaParsersParaFragsps2ttstt2pssABag(scleanBlockQuotedText(sTableOfContents(sParagraphStylei(s pdfmetrics(sTTFont(s addMapping(scssscssDOMElementInterfaceif0.40000000000000002cCs tƒ}d|_d|_d|_d|_d|_d|_t|_ d|_ t |i ƒ\|_ |_|_d|_ |i|_|i|_d|_d|_t|_d|_d|_t|_d|_d|_d|_d|_d|_t|_t |_!t|_"d|_#t|_$t|_%d|_&t|_'t|_(d|_)t|_*t|_+d|_,t|_-t|_.d|_/d|_0d|_1d|_2t|_3d|_4t|_5t|_6t|_7d|_8t|_9d|_:t|_;d|_<t|_=|SdS(Niss Times-Romans150%isnormalf1.0(>sParaFragsfragssubssupersrises underlinesstrikesgreeksNoneslinkstextsps2ttsstylesfontNamesboldsitalicsfontSizes textColorsleadings leadingSourceswhites backColors borderWidths borderPaddings borderColors spaceBefores spaceAfters leftIndents rightIndentsfirstLineIndentsFalses keepWithNextsTA_LEFTs alignmentsvAlignsborderLeftWidthsborderLeftColorsborderLeftStylesborderRightWidthsborderRightColorsborderRightStylesborderTopWidthsborderTopColorsborderTopStylesborderBottomWidthsborderBottomColorsborderBottomStyles paddingLefts paddingRights paddingTops paddingBottoms listStyleTypes whiteSpaces pageNumbersheightswidths bulletIndents bulletTextszoomsoutlines outlineLevels outlineOpen(sstylesfrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getParaFrag(sn         !                                            cCsF|o|iƒidƒ o tiitii|ƒƒSn|SdS(Nshttp:(spathslowers startswithsossdirnamesabspath(spath((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getDirNamers spisaCSSBuildercBs;tZd„Zd„Zeed„Zd„Zd„ZRS(Nc CsM|i|idƒg|ƒ}yé|diƒd}|d} t|i ddƒƒi ƒ}|dddd d d d fj}| o |d jot id|ƒnt|i ddƒƒi ƒddfj}|ii|dƒ}|ii| |d|d|ƒWn5tj o)}t idƒ|iitƒƒnXhhfSdS(s Embed fonts s*is font-familys font-weightssboldsbolders500s600s700s800s900snormals)@fontface, unknown value font-weight '%s's font-stylesitalicsobliquessrcs @fontfaceN(sselfsrulesetsselectors declarationssresultsvaluessdatasnamessstrsgetslowersfweightsboldslogswarnsitalicscsgetFilessrcsloadFonts Exceptionses exceptionswarningsErrorMsg( sselfs declarationsssrcsesboldsitalicsresultsfweightsdatasnames((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys atFontFaceys( !*  c CsÎ|idgƒ}t|ƒdjo/gi}|D]}|t|ƒƒq3~Snt|iddƒƒ} t|iddƒƒ} t|iddƒƒ }t|iddƒƒ }t|iddƒƒ}t|id dƒƒ}|o+| o|o||} q| |}n|o+| o|o||} qJ| |}n| t|id dƒƒ7} | t|id dƒƒ7} |t|id dƒƒ8}|t|id dƒƒ8}| | ||fSdS(s Calculate dimensions of a box s-pdf-frame-boxistopisleftsbottomsrightswidthsheights margin-tops margin-lefts margin-bottoms margin-rightN(sdatasgetsboxslensappends_[1]sxsgetSizestopsleftsbottomsrightswidthsheight( sselfsdatasboxsrightsbottomsheights_[1]swidthsxstopsleft((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys_pisaDimensions—s./c Cs¥|i}| od|iƒ}n|i|ƒ\} }}}|o)|t |i d|ƒ| |||fSn||i dt ƒ|i d|ƒ| |||fSdS(Ns -pdf-frame-%ds-pdf-frame-borders-pdf-frame-content(sselfscsnamesUIDs_pisaDimensionssdatasxsyswshsfirstsNonesgetsborder( sselfsnamesdatasfirstsborderscswshsysx((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys _pisaAddFrame¶s )cCsQy |i}h}|pd}t}|o¿|i|idƒg|ƒ}|o–|di ƒd}|i dtƒ}xmddddd d d d d dg D]C} |i | ƒo-|ii|i||dtd|ƒƒPqœqœWqën|ii |ƒo|id|ƒn|i dƒo/tii t|dƒiƒ|iƒ|_n|i dƒo|d} t| ƒtij o | g} nt}g}x˜| D]}t|ƒiƒ}t|ƒti"jo|it#|ƒƒq¢|djo t}q¢tii |ƒoti||_q¢|idƒq¢Wt$|ƒdjo ||_n|ot%|iƒ|_qwng} g}x |iD]\} }}}}}}t.|||||iƒ\}}}}|djp |djo|iidƒnt/||||d| ddddddddd|p|ƒ}|o=g|_1|g|i2i |gƒ|i2|<|i|ƒq| i|ƒqW|i dtƒ}|o|i4|ƒ}n| oà|idƒ|i||dtd|ƒ\} }}}}}}t.|||||iƒ\}}}}|djp |djo|iid ƒn| it/||||d| ddddddddd|p|ƒƒnt5d|d!| d"|iƒ} || _7|| _8|i9| _9| |i|i?d#ƒ|iit@ƒƒnXhhfSdS($Nsbodys*is-pdf-frame-borders margin-tops margin-lefts margin-rights margin-bottomstopsleftsrightsbottomswidthsheightsfirstsborders&template '%s' has already been defineds-pdf-page-sizessizes landscapesUnknown size value for @pageis<Negative width or height of frame. Check @frame definitions.sids leftPaddings rightPaddings bottomPaddings topPaddings showBoundarysbackground-imagesCmissing explicit frame definition for content or just static framess;Negative width or height of frame. Check @page definitions.sframesspagesizes@page(AsselfscsdatasnamesNones pageBorders declarationssrulesetsselectorsresultsvaluessgetspropshas_keys frameListsappends _pisaAddFramesTrues templateListswarnings pisa_defaults PML_PAGESIZESsstrslowerspageSizessizestypestypessListTypesFalses isLandscapessizeListsvaluesvalueStrs TupleTypesgetSizeslens landscapes staticListsfnamesstaticsbordersxsyswshs getCoordssFramesframespisaStaticStorys frameStatics backgroundsgetFilesPmlPageTemplatesptspisaStaticListspisaBackgroundspisaBackgroundListstemplatesframeStaticLists Exceptionseslogs exceptionsErrorMsg(sselfsnames pseudopages declarationssframes staticListsstaticsresultsborderssizesptspropsfnames frameListsws pageBorders backgrounds isLandscapesdatascssizeListsvalueshsysxsvalueStrse((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatPageÊs°  % (/       ' # 3'        cCs·|o¢|i|idƒg|ƒ}yH|d}|o3|iƒd}|iii |i ||ƒƒnWq©t j o)}tidƒ|iitƒƒq©XnhhfSdS(Ns*is@frame(s declarationssselfsrulesetsselectorsresultsdatasvaluesscs frameListsappends _pisaAddFramesnames Exceptionseslogs exceptionswarningsErrorMsg(sselfsnames declarationssesresultsdata((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatFrameTs  ( s__name__s __module__s atFontFaces_pisaDimensionssFalsesNones _pisaAddFramesatPagesatFrame(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspisaCSSBuilderws    Šs pisaCSSParsercBstZd„ZRS(NcCs´|i}|ii|d|iƒ}g}|io|iidƒot i |i|ƒ|_nt |ƒ|_| ot Snt |dƒ}|i|tƒ}||_|SdS(Nsrelativeshttp:sr(sselfsrootPaths oldRootPathscsgetFilescssResourceNamescssFilesresults startswithsurlparsesurljoins getDirNamesNonesfiles parseFilesTrue(sselfscssResourceNamescssFiles oldRootPathsresult((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys parseExternalgs  (s__name__s __module__s parseExternal(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaCSSParseress pisaContextcBs tZdZdd„Zd„Zd„Zd„Zd„Zd„Zgd„Z d „Z e d „Z d „Z d „Zd „Zded„Zd„Zd„Zdd„Zd„Zd„Zd„Zd„Zed„Zdd„Zgd„Zdddd„ZRS(s_ Helper class for creation of reportlab story and container for varoius data. ic CsÀtitiƒ|_g|_t|_tƒ|_ g|_ g|_ g|_ d|_ d|_||_d|_ d|_t|_t|_h|_g|_h|_g|_g|_g|_g|_t|_ttd|iƒƒƒ|_ |_!g|_"g|_#g|_$t%|_&d|_'d|_(t|_)|pd|_*|i*i+ƒi,dƒ ot-ii.|i*ƒ|_*nt/|i*ƒ|_0t1ddddd dd dd tƒ|_2dS( Nius default%dss __dummy__shttp:sauthorstitlessubjectskeywordsspagesize(3scopys pisa_defaults DEFAULT_FONTsselfsfontListspathsNonesnodesTableOfContentsstocsstorystextslogserrswarnsdebugs debugLevelsuidctrsA4spageSizestemplates templateLists frameLists frameStaticsframeStaticListspisaBackgroundLists anchorFrags anchorNames tableDatas getParaFragsParagraphStylesUIDsfrags fragBlocksfragLists fragAnchors fragStacksTrues fragStrips listCounterscssTexts pathCallbacks pathDocumentslowers startswithsossabspaths getDirNames pathDirectorysdictsmeta(sselfspathsdebug((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys__init__€sN                     &        cGsDy6|i|jo"d|Gx|D] }|Gq"WHnWnnXdS(Ns DEBUG [%s]:(sselfs debugLevelslevelsargssa(sselfslevelsargssa((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysdebug¶s cCs|id7_|iSdS(Ni(sselfsuidctr(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysUIDÁscCs|i|7_dS(N(sselfscssTextsvalue(sselfsvalue((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddCSSÇscCs|id|iƒ|iiddƒ|_|iiddƒ|_|iiddƒ|_|iiddƒ|_tddd d gƒ|_||i_t|iƒ|_|i |i_ ||i_|ii |iƒ|_ t i |i ƒ|_|i|i_dS( Ni ss s mediumSetsallsprintspdf(sselfsdebugscssTextsreplacespisaCSSBuilders cssBuilderscs pisaCSSParsers cssParsers pathDirectorysrootPathsparsescsssCSSCascadeStrategys cssCascadesparser(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysparseCSSÊs   cCs|ii|ƒdS(N(sselfsstorysappendsdata(sselfsdata((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddStoryscCs2ti|ƒti|iƒf\|_}|SdS(N(scopysstorysself(sselfsstory((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys swapStorys*cCs|i|iƒdS(N(sselfsaddStorystoc(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddTOCscCsyt|iƒ}Wn#ti|iƒ}|iƒnXx/|D]'}|iiƒ|_|ioPq@q@W|p|ii ƒo|ioó|i }t d|iƒd|iƒ}|i|_|i|_t|i|idƒ|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_d|_t |i!ƒojt|i"|i#|i$|i%ƒ|_|i&|_&|i'|_(|i(t)jo|io|i*|_(qãnt+|i,|iƒdjoit-|i|d|i,|idti|i.ƒƒ}|i0|_0|i1|_1|i2|_2|i3|ƒng|_,t)|_.n|i4ƒdS(Ns default%ds keepWithNextf1.25isfragss bulletText(5sreversedsselfsfragLists rfragListscopysreversesfragstextsrstripsforcesstrips fragBlocksfirstsParagraphStylesUIDs keepWithNextsstylesfontNamesfontSizesmaxsleadings backColors spaceBefores spaceAfters leftIndents rightIndentsfirstLineIndents alignmentsbulletFontNamesbulletFontSizes bulletIndents borderWidthsgetBorderStylesborderTopStylesborderLeftWidthsborderRightWidthsborderTopWidthsborderBottomWidths borderPaddingsborderTopColors borderColorsNones textColorslens fragAnchors PmlParagraphs bulletTextsparasoutlines outlineLevels outlineOpensaddStorys clearFrag(sselfsforcesfragsstylesparas rfragListsfirst((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddPara s`  !                        cCsg|_t|_d|_dS(Nu(sselfsfragListsTrues fragStripstext(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys clearFrag_s  cKsPti|iƒ|_x-|iƒD]\}}t|i||ƒq"W|iSdS(N( scopysdeepcopysselfsfragskwsitemssksvssetattr(sselfskwsvsk((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysnewFragds  cCsR|io|iidƒo!|ii||idfƒn|ii|ƒdS(Ns#i(sfragslinks startswithsselfs anchorFragsappendsfragList(sselfsfrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys _appendFragjs!scCsÀti|iƒ}}|idjo |idjod|_d|_n|io.|i t|_ t |it dƒ|_n8|io-|it |_ t |it dƒ|_n|i od|_t|ƒ}nt|i|i|iƒ|_|iddƒ}|idjoëx›tid|ƒD]Ð}|i|7_d |jp d |jo2ti|ƒ}d|_d|_|i|ƒq1|id d d ƒ}xVtid|ƒD]B}ti|ƒ}|djo d}n||_|i|ƒq»Wq1Wn´|djo)d|_|i|7_|i|ƒn~did|diƒƒdd!|_|io-|iiƒ|_|io t|_qn|i|i7_|i|ƒdS(Niiissymbolu­sspres (\r\n|\n|\r)s s u iu s(\ )s s u sxiÿÿÿÿ(scopysdeepcopysselfsfragsbaseFragssubssupersfontSizes subFractionsrisesmaxs sizeDeltas superFractionsgreeksfontNames _greekConvertsdatastt2pssboldsitalicstextsreplaces whiteSpacesressplits lineBreaks _appendFragsjoins fragStripslstripsFalse(sselfstextsfragsdatasbaseFrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddFragosV              '  cCs!|ii|iƒ|iƒdS(N(sselfs fragStacksappendsfragsnewFrag(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspushFrag¬scCs|iiƒ|_dS(N(sselfs fragStackspopsfrag(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspullFrag°sicCs<y*tdi|iiƒiƒ| ƒƒSWn dSnXdS(Ns s(sreprsjoinsselfsnodestoxmlssplitsl(sselfsl((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys _getFragmentµs*cCsdSdS(Ni((sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys_getLineNumber»scCs*d|iƒt|ƒ|idƒfSdS(Nsline %s: %s %si2(sselfs_getLineNumbersstrsmsgs _getFragment(sselfsmsg((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyscontext¾scCsž|id7_|idjo1d|i|iƒt|ƒ|idƒfGHnti|i|ƒƒ|ii t i |iƒt|ƒ|idƒfƒdS(NisWARNING #%s %s %s: %si2( sselfswarns debugLevels_getLineNumbersstrsmsgs _getFragmentslogscontextsappends pisa_defaults PML_WARNING(sselfsmsg((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyswarningÄs 1cCsž|id7_|idjo1d|i|iƒt|ƒ|idƒfGHnti|i |ƒƒ|ii t i |iƒt|ƒ|idƒfƒdS(NiisERROR #%s %s %s: %si2( sselfserrs debugLevels_getLineNumbersstrsmsgs _getFragmentslogserrorscontextsappends pisa_defaults PML_ERROR(sselfsmsg((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyserrorÏs 1cCs¦|itj o|i||ƒ}nW|p|i}tii tii ||ƒƒ}|otii |ƒ o t}n|tjo|i d|ƒn|SdS(s- Returns a file name or None sfile '%s' does not existN( sselfs pathCallbacksNonesnamesrelativesnvs pathDirectoryspathsossnormpathsjoinsisfileswarning(sselfsnamesrelativespathsnv((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysgetFileÜs!  s helveticacCs™t|ƒtij ot|ƒiƒidƒ}nxJ|D]B}|i i t|ƒiƒi ƒt ƒ}|t j o|Sq<q<W|i i |t ƒSdS(s Name of a font s,N(stypesnamesstypessListTypesstrsstripssplitsnamesselfsfontListsgetslowersNonesfontsdefault(sselfsnamessdefaultsnamesfont((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getFontNameës'  cCsMt|ƒ|it|ƒiƒsLoading font '%s'(+snamesssrcstypestypessListTypes fontAliassappends_[1]ssplitsxslowersstripsstrsfontNamesrsplitsbaseNamessuffixsboldsitalics fullFontNamesselfsfontListswarnings pdfmetricss registerFontsTTFonts addMappingsafmspfbsEmbeddedType1FacesfacesnamesfontNameOriginalsregisterTypeFacesFontsencodingsjustFontserrors Exceptionseslogs exceptionsErrorMsg(sselfsnamesssrcsencodingsboldsitalicsfontNamessuffixs fontAliassafmspfbsjustFontsfontNameOriginalsesbaseNamesfaces_[1]sxs fullFontName((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysloadFontýsX G-              (s__name__s __module__s__doc__s__init__sdebugsUIDsaddCSSsparseCSSsaddStorys swapStorysaddTOCsFalsesaddParas clearFragsnewFrags _appendFragsNonesaddFragspushFragspullFrags _getFragments_getLineNumberscontextswarningserrorsgetFiles getFontNames registerFontsloadFont(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaContextys2  6   6    U   =       (.s __reversion__s __author__s__date__s pisa_utilspisa_reportlabs pisa_defaultsres cStringIOsurlparsestypessreportlab.platypus.paraparsers ParaParsersParaFragsps2ttstt2pssABagsreportlab.platypus.paragraphscleanBlockQuotedTexts"reportlab.platypus.tableofcontentssTableOfContentssreportlab.lib.stylessParagraphStylesreportlab.rl_configs reportlabs rl_configswarnOnMissingFontGlyphssreportlab.pdfbases pdfmetricssreportlab.pdfbase.ttfontssTTFontsreportlab.lib.fontss addMappingssx.w3cscssscssDOMElementInterfaceshtml5lib.sanitizers sizeDeltas subFractions superFractions getParaFrags getDirNames CSSBuilderspisaCSSBuilders CSSParsers pisaCSSParsers pisaContext(s cStringIOs pisa_defaults addMappingscssDOMElementInterfacesps2ttsurlparses reportlabsParaFrags getParaFragsTableOfContentssres sizeDeltas superFractionscsssParagraphStylesTTFontsABags __author__s ParaParsers pdfmetricss pisaCSSParserspisaCSSBuilderstypesscleanBlockQuotedTexts __reversion__s pisaContexts__date__s getDirNames subFractionstt2ps((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys?s8     %         J îPK¨“m8ýì!îeîesx/pisa3/pisa_context.pyo;ò ó<ÙGc@s\dZdZdZdkTdkTdkZdkZdkZdkZdk Z dk l Z l Z l Z lZlZdklZdklZdklZdkZd ei_d klZd klZd klZd k l!Z!l"Z"dk#TdZ$dZ%dZ&d„Z'd„Z(de!i)fd„ƒYZ*de!i+fd„ƒYZ,dfd„ƒYZ-dS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(s*N(s ParaParsersParaFragsps2ttstt2pssABag(scleanBlockQuotedText(sTableOfContents(sParagraphStylei(s pdfmetrics(sTTFont(s addMapping(scssscssDOMElementInterfaceif0.40000000000000002cCs tƒ}d|_d|_d|_d|_d|_d|_t|_ d|_ t |i ƒ\|_ |_|_d|_ |i|_|i|_d|_d|_t|_d|_d|_t|_d|_d|_d|_d|_d|_t|_t |_!t|_"d|_#t|_$t|_%d|_&t|_'t|_(d|_)t|_*t|_+d|_,t|_-t|_.d|_/d|_0d|_1d|_2t|_3d|_4t|_5t|_6t|_7d|_8t|_9d|_:t|_;d|_<t|_=|SdS(Niss Times-Romans150%isnormalf1.0(>sParaFragsfragssubssupersrises underlinesstrikesgreeksNoneslinkstextsps2ttsstylesfontNamesboldsitalicsfontSizes textColorsleadings leadingSourceswhites backColors borderWidths borderPaddings borderColors spaceBefores spaceAfters leftIndents rightIndentsfirstLineIndentsFalses keepWithNextsTA_LEFTs alignmentsvAlignsborderLeftWidthsborderLeftColorsborderLeftStylesborderRightWidthsborderRightColorsborderRightStylesborderTopWidthsborderTopColorsborderTopStylesborderBottomWidthsborderBottomColorsborderBottomStyles paddingLefts paddingRights paddingTops paddingBottoms listStyleTypes whiteSpaces pageNumbersheightswidths bulletIndents bulletTextszoomsoutlines outlineLevels outlineOpen(sstylesfrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getParaFrag(sn         !                                            cCsF|o|iƒidƒ o tiitii|ƒƒSn|SdS(Nshttp:(spathslowers startswithsossdirnamesabspath(spath((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getDirNamers spisaCSSBuildercBs;tZd„Zd„Zeed„Zd„Zd„ZRS(Nc CsM|i|idƒg|ƒ}yé|diƒd}|d} t|i ddƒƒi ƒ}|dddd d d d fj}| o |d jot id|ƒnt|i ddƒƒi ƒddfj}|ii|dƒ}|ii| |d|d|ƒWn5tj o)}t idƒ|iitƒƒnXhhfSdS(s Embed fonts s*is font-familys font-weightssboldsbolders500s600s700s800s900snormals)@fontface, unknown value font-weight '%s's font-stylesitalicsobliquessrcs @fontfaceN(sselfsrulesetsselectors declarationssresultsvaluessdatasnamessstrsgetslowersfweightsboldslogswarnsitalicscsgetFilessrcsloadFonts Exceptionses exceptionswarningsErrorMsg( sselfs declarationsssrcsesboldsitalicsresultsfweightsdatasnames((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys atFontFaceys( !*  c CsÎ|idgƒ}t|ƒdjo/gi}|D]}|t|ƒƒq3~Snt|iddƒƒ} t|iddƒƒ} t|iddƒƒ }t|iddƒƒ }t|iddƒƒ}t|id dƒƒ}|o+| o|o||} q| |}n|o+| o|o||} qJ| |}n| t|id dƒƒ7} | t|id dƒƒ7} |t|id dƒƒ8}|t|id dƒƒ8}| | ||fSdS(s Calculate dimensions of a box s-pdf-frame-boxistopisleftsbottomsrightswidthsheights margin-tops margin-lefts margin-bottoms margin-rightN(sdatasgetsboxslensappends_[1]sxsgetSizestopsleftsbottomsrightswidthsheight( sselfsdatasboxsrightsbottomsheights_[1]swidthsxstopsleft((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys_pisaDimensions—s./c Cs¥|i}| od|iƒ}n|i|ƒ\} }}}|o)|t |i d|ƒ| |||fSn||i dt ƒ|i d|ƒ| |||fSdS(Ns -pdf-frame-%ds-pdf-frame-borders-pdf-frame-content(sselfscsnamesUIDs_pisaDimensionssdatasxsyswshsfirstsNonesgetsborder( sselfsnamesdatasfirstsborderscswshsysx((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys _pisaAddFrame¶s )cCsQy |i}h}|pd}t}|o¿|i|idƒg|ƒ}|o–|di ƒd}|i dtƒ}xmddddd d d d d dg D]C} |i | ƒo-|ii|i||dtd|ƒƒPqœqœWqën|ii |ƒo|id|ƒn|i dƒo/tii t|dƒiƒ|iƒ|_n|i dƒo|d} t| ƒtij o | g} nt}g}x˜| D]}t|ƒiƒ}t|ƒti"jo|it#|ƒƒq¢|djo t}q¢tii |ƒoti||_q¢|idƒq¢Wt$|ƒdjo ||_n|ot%|iƒ|_qwng} g}x |iD]\} }}}}}}t.|||||iƒ\}}}}|djp |djo|iidƒnt/||||d| ddddddddd|p|ƒ}|o=g|_1|g|i2i |gƒ|i2|<|i|ƒq| i|ƒqW|i dtƒ}|o|i4|ƒ}n| oà|idƒ|i||dtd|ƒ\} }}}}}}t.|||||iƒ\}}}}|djp |djo|iid ƒn| it/||||d| ddddddddd|p|ƒƒnt5d|d!| d"|iƒ} || _7|| _8|i9| _9| |i|i?d#ƒ|iit@ƒƒnXhhfSdS($Nsbodys*is-pdf-frame-borders margin-tops margin-lefts margin-rights margin-bottomstopsleftsrightsbottomswidthsheightsfirstsborders&template '%s' has already been defineds-pdf-page-sizessizes landscapesUnknown size value for @pageis<Negative width or height of frame. Check @frame definitions.sids leftPaddings rightPaddings bottomPaddings topPaddings showBoundarysbackground-imagesCmissing explicit frame definition for content or just static framess;Negative width or height of frame. Check @page definitions.sframesspagesizes@page(AsselfscsdatasnamesNones pageBorders declarationssrulesetsselectorsresultsvaluessgetspropshas_keys frameListsappends _pisaAddFramesTrues templateListswarnings pisa_defaults PML_PAGESIZESsstrslowerspageSizessizestypestypessListTypesFalses isLandscapessizeListsvaluesvalueStrs TupleTypesgetSizeslens landscapes staticListsfnamesstaticsbordersxsyswshs getCoordssFramesframespisaStaticStorys frameStatics backgroundsgetFilesPmlPageTemplatesptspisaStaticListspisaBackgroundspisaBackgroundListstemplatesframeStaticLists Exceptionseslogs exceptionsErrorMsg(sselfsnames pseudopages declarationssframes staticListsstaticsresultsborderssizesptspropsfnames frameListsws pageBorders backgrounds isLandscapesdatascssizeListsvalueshsysxsvalueStrse((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatPageÊs°  % (/       ' # 3'        cCs·|o¢|i|idƒg|ƒ}yH|d}|o3|iƒd}|iii |i ||ƒƒnWq©t j o)}tidƒ|iitƒƒq©XnhhfSdS(Ns*is@frame(s declarationssselfsrulesetsselectorsresultsdatasvaluesscs frameListsappends _pisaAddFramesnames Exceptionseslogs exceptionswarningsErrorMsg(sselfsnames declarationssesresultsdata((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatFrameTs  ( s__name__s __module__s atFontFaces_pisaDimensionssFalsesNones _pisaAddFramesatPagesatFrame(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspisaCSSBuilderws    Šs pisaCSSParsercBstZd„ZRS(NcCs´|i}|ii|d|iƒ}g}|io|iidƒot i |i|ƒ|_nt |ƒ|_| ot Snt |dƒ}|i|tƒ}||_|SdS(Nsrelativeshttp:sr(sselfsrootPaths oldRootPathscsgetFilescssResourceNamescssFilesresults startswithsurlparsesurljoins getDirNamesNonesfiles parseFilesTrue(sselfscssResourceNamescssFiles oldRootPathsresult((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys parseExternalgs  (s__name__s __module__s parseExternal(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaCSSParseress pisaContextcBs tZdZdd„Zd„Zd„Zd„Zd„Zd„Zgd„Z d „Z e d „Z d „Z d „Zd „Zded„Zd„Zd„Zdd„Zd„Zd„Zd„Zd„Zed„Zdd„Zgd„Zdddd„ZRS(s_ Helper class for creation of reportlab story and container for varoius data. ic CsÀtitiƒ|_g|_t|_tƒ|_ g|_ g|_ g|_ d|_ d|_||_d|_ d|_t|_t|_h|_g|_h|_g|_g|_g|_g|_t|_ttd|iƒƒƒ|_ |_!g|_"g|_#g|_$t%|_&d|_'d|_(t|_)|pd|_*|i*i+ƒi,dƒ ot-ii.|i*ƒ|_*nt/|i*ƒ|_0t1ddddd dd dd tƒ|_2dS( Nius default%dss __dummy__shttp:sauthorstitlessubjectskeywordsspagesize(3scopys pisa_defaults DEFAULT_FONTsselfsfontListspathsNonesnodesTableOfContentsstocsstorystextslogserrswarnsdebugs debugLevelsuidctrsA4spageSizestemplates templateLists frameLists frameStaticsframeStaticListspisaBackgroundLists anchorFrags anchorNames tableDatas getParaFragsParagraphStylesUIDsfrags fragBlocksfragLists fragAnchors fragStacksTrues fragStrips listCounterscssTexts pathCallbacks pathDocumentslowers startswithsossabspaths getDirNames pathDirectorysdictsmeta(sselfspathsdebug((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys__init__€sN                     &        cGsDy6|i|jo"d|Gx|D] }|Gq"WHnWnnXdS(Ns DEBUG [%s]:(sselfs debugLevelslevelsargssa(sselfslevelsargssa((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysdebug¶s cCs|id7_|iSdS(Ni(sselfsuidctr(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysUIDÁscCs|i|7_dS(N(sselfscssTextsvalue(sselfsvalue((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddCSSÇscCs|id|iƒ|iiddƒ|_|iiddƒ|_|iiddƒ|_|iiddƒ|_tddd d gƒ|_||i_t|iƒ|_|i |i_ ||i_|ii |iƒ|_ t i |i ƒ|_|i|i_dS( Ni ss s mediumSetsallsprintspdf(sselfsdebugscssTextsreplacespisaCSSBuilders cssBuilderscs pisaCSSParsers cssParsers pathDirectorysrootPathsparsescsssCSSCascadeStrategys cssCascadesparser(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysparseCSSÊs   cCs|ii|ƒdS(N(sselfsstorysappendsdata(sselfsdata((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddStoryscCs2ti|ƒti|iƒf\|_}|SdS(N(scopysstorysself(sselfsstory((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys swapStorys*cCs|i|iƒdS(N(sselfsaddStorystoc(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddTOCscCsyt|iƒ}Wn#ti|iƒ}|iƒnXx/|D]'}|iiƒ|_|ioPq@q@W|p|ii ƒo|ioó|i }t d|iƒd|iƒ}|i|_|i|_t|i|idƒ|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_d|_t |i!ƒojt|i"|i#|i$|i%ƒ|_|i&|_&|i'|_(|i(t)jo|io|i*|_(qãnt+|i,|iƒdjoit-|i|d|i,|idti|i.ƒƒ}|i0|_0|i1|_1|i2|_2|i3|ƒng|_,t)|_.n|i4ƒdS(Ns default%ds keepWithNextf1.25isfragss bulletText(5sreversedsselfsfragLists rfragListscopysreversesfragstextsrstripsforcesstrips fragBlocksfirstsParagraphStylesUIDs keepWithNextsstylesfontNamesfontSizesmaxsleadings backColors spaceBefores spaceAfters leftIndents rightIndentsfirstLineIndents alignmentsbulletFontNamesbulletFontSizes bulletIndents borderWidthsgetBorderStylesborderTopStylesborderLeftWidthsborderRightWidthsborderTopWidthsborderBottomWidths borderPaddingsborderTopColors borderColorsNones textColorslens fragAnchors PmlParagraphs bulletTextsparasoutlines outlineLevels outlineOpensaddStorys clearFrag(sselfsforcesfragsstylesparas rfragListsfirst((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddPara s`  !                        cCsg|_t|_d|_dS(Nu(sselfsfragListsTrues fragStripstext(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys clearFrag_s  cKsPti|iƒ|_x-|iƒD]\}}t|i||ƒq"W|iSdS(N( scopysdeepcopysselfsfragskwsitemssksvssetattr(sselfskwsvsk((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysnewFragds  cCsR|io|iidƒo!|ii||idfƒn|ii|ƒdS(Ns#i(sfragslinks startswithsselfs anchorFragsappendsfragList(sselfsfrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys _appendFragjs!scCsÀti|iƒ}}|idjo |idjod|_d|_n|io.|i t|_ t |it dƒ|_n8|io-|it |_ t |it dƒ|_n|i od|_t|ƒ}nt|i|i|iƒ|_|iddƒ}|idjoëx›tid|ƒD]Ð}|i|7_d |jp d |jo2ti|ƒ}d|_d|_|i|ƒq1|id d d ƒ}xVtid|ƒD]B}ti|ƒ}|djo d}n||_|i|ƒq»Wq1Wn´|djo)d|_|i|7_|i|ƒn~did|diƒƒdd!|_|io-|iiƒ|_|io t|_qn|i|i7_|i|ƒdS(Niiissymbolu­sspres (\r\n|\n|\r)s s u iu s(\ )s s u sxiÿÿÿÿ(scopysdeepcopysselfsfragsbaseFragssubssupersfontSizes subFractionsrisesmaxs sizeDeltas superFractionsgreeksfontNames _greekConvertsdatastt2pssboldsitalicstextsreplaces whiteSpacesressplits lineBreaks _appendFragsjoins fragStripslstripsFalse(sselfstextsfragsdatasbaseFrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysaddFragosV              '  cCs!|ii|iƒ|iƒdS(N(sselfs fragStacksappendsfragsnewFrag(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspushFrag¬scCs|iiƒ|_dS(N(sselfs fragStackspopsfrag(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspullFrag°sicCs<y*tdi|iiƒiƒ| ƒƒSWn dSnXdS(Ns s(sreprsjoinsselfsnodestoxmlssplitsl(sselfsl((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys _getFragmentµs*cCsdSdS(Ni((sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys_getLineNumber»scCs*d|iƒt|ƒ|idƒfSdS(Nsline %s: %s %si2(sselfs_getLineNumbersstrsmsgs _getFragment(sselfsmsg((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyscontext¾scCsž|id7_|idjo1d|i|iƒt|ƒ|idƒfGHnti|i|ƒƒ|ii t i |iƒt|ƒ|idƒfƒdS(NisWARNING #%s %s %s: %si2( sselfswarns debugLevels_getLineNumbersstrsmsgs _getFragmentslogscontextsappends pisa_defaults PML_WARNING(sselfsmsg((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyswarningÄs 1cCsž|id7_|idjo1d|i|iƒt|ƒ|idƒfGHnti|i |ƒƒ|ii t i |iƒt|ƒ|idƒfƒdS(NiisERROR #%s %s %s: %si2( sselfserrs debugLevels_getLineNumbersstrsmsgs _getFragmentslogserrorscontextsappends pisa_defaults PML_ERROR(sselfsmsg((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyserrorÏs 1cCs¦|itj o|i||ƒ}nW|p|i}tii tii ||ƒƒ}|otii |ƒ o t}n|tjo|i d|ƒn|SdS(s- Returns a file name or None sfile '%s' does not existN( sselfs pathCallbacksNonesnamesrelativesnvs pathDirectoryspathsossnormpathsjoinsisfileswarning(sselfsnamesrelativespathsnv((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysgetFileÜs!  s helveticacCs™t|ƒtij ot|ƒiƒidƒ}nxJ|D]B}|i i t|ƒiƒi ƒt ƒ}|t j o|Sq<q<W|i i |t ƒSdS(s Name of a font s,N(stypesnamesstypessListTypesstrsstripssplitsnamesselfsfontListsgetslowersNonesfontsdefault(sselfsnamessdefaultsnamesfont((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getFontNameës'  cCsMt|ƒ|it|ƒiƒsLoading font '%s'(+snamesssrcstypestypessListTypes fontAliassappends_[1]ssplitsxslowersstripsstrsfontNamesrsplitsbaseNamessuffixsboldsitalics fullFontNamesselfsfontListswarnings pdfmetricss registerFontsTTFonts addMappingsafmspfbsEmbeddedType1FacesfacesnamesfontNameOriginalsregisterTypeFacesFontsencodingsjustFontserrors Exceptionseslogs exceptionsErrorMsg(sselfsnamesssrcsencodingsboldsitalicsfontNamessuffixs fontAliassafmspfbsjustFontsfontNameOriginalsesbaseNamesfaces_[1]sxs fullFontName((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysloadFontýsX G-              (s__name__s __module__s__doc__s__init__sdebugsUIDsaddCSSsparseCSSsaddStorys swapStorysaddTOCsFalsesaddParas clearFragsnewFrags _appendFragsNonesaddFragspushFragspullFrags _getFragments_getLineNumberscontextswarningserrorsgetFiles getFontNames registerFontsloadFont(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaContextys2  6   6    U   =       (.s __reversion__s __author__s__date__s pisa_utilspisa_reportlabs pisa_defaultsres cStringIOsurlparsestypessreportlab.platypus.paraparsers ParaParsersParaFragsps2ttstt2pssABagsreportlab.platypus.paragraphscleanBlockQuotedTexts"reportlab.platypus.tableofcontentssTableOfContentssreportlab.lib.stylessParagraphStylesreportlab.rl_configs reportlabs rl_configswarnOnMissingFontGlyphssreportlab.pdfbases pdfmetricssreportlab.pdfbase.ttfontssTTFontsreportlab.lib.fontss addMappingssx.w3cscssscssDOMElementInterfaceshtml5lib.sanitizers sizeDeltas subFractions superFractions getParaFrags getDirNames CSSBuilderspisaCSSBuilders CSSParsers pisaCSSParsers pisaContext(s cStringIOs pisa_defaults addMappingscssDOMElementInterfacesps2ttsurlparses reportlabsParaFrags getParaFragsTableOfContentssres sizeDeltas superFractionscsssParagraphStylesTTFontsABags __author__s ParaParsers pdfmetricss pisaCSSParserspisaCSSBuilderstypesscleanBlockQuotedTexts __reversion__s pisaContexts__date__s getDirNames subFractionstt2ps((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys?s8     %         J îPKeym8Æï¨ 7 7sx/pisa3/pisa_default.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 20 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $" from reportlab.lib.pagesizes import * PML_WARNING = "warning" PML_ERROR = "error" PML_EXCEPTION = "PML Exception" PML_PREFIX = "pdf:" #CLASS = 1 BOOL = 2 FONT = 3 COLOR = 4 FILE = 5 SIZE = 6 INT = 7 STRING = 8 BOX = 9 POS = 10 #STYLE = 11 MUST = 23 """ Definition of all known tags. Also used for building the reference """ TAGS = { # FORMAT #"document": (1, { # "format": (["a0", "a1", "a2", "a3", "a4", "a5", "a6", # "b0", "b1", "b2", "b3", "b4", "b5", "b6", # "letter", "legal", "elevenseventeen"], "a4"), # "orientation": ["portrait", "landscape"], # "fullscreen": (BOOL, "0"), # "author": (STRING, ""), # "subject": (STRING, ""), # "title": (STRING, ""), # "duration": INT, # "showoutline": (BOOL, "0"), # "outline": INT, # }), "pdftemplate": (1, { "name": (STRING, "body"), "format": (["a0", "a1", "a2", "a3", "a4", "a5", "a6", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "letter", "legal", "elevenseventeen"], "a4"), "orientation": ["portrait", "landscape"], "background": FILE, }), "pdfframe": (0, { "name": (STRING, ""), "box": (BOX, MUST), "border": (BOOL, "0"), "static": (BOOL, "0"), }), #"static": (1, { # "name": STRING, # "box": (BOX, MUST), # "border": (BOOL, "0"), # }), "pdfnexttemplate": (0, { "name": (STRING, "body"), }), "pdfnextpage": (0, { "name": (STRING, ""), # "background": FILE, }), "pdfnextframe": (0, {}), "pdffont": (0, { "src": (FILE, MUST), "name": (STRING, MUST), # "print": (BOOL, "0"), "encoding": (STRING, "WinAnsiEncoding"), }), "pdfdrawline": (0, { "from": (POS, MUST), "to": (POS, MUST), "color": (COLOR, "#000000"), "width": (SIZE, 1), }), "drawpoint": (0, { "pos": (POS, MUST), "color": (COLOR, "#000000"), "width": (SIZE, 1), }), "pdfdrawlines": (0, { "coords": (STRING, MUST), "color": (COLOR, "#000000"), "width": (SIZE, 1), }), "pdfdrawstring": (0, { "pos": (POS, MUST), "text": (STRING, MUST), "color": (COLOR, "#000000"), "align": (["left", "center", "right"], "right"), "valign": (["top", "middle", "bottom"], "bottom"), # "class": CLASS, "rotate": (INT, "0"), }), "pdfdrawimg": (0, { "pos": (POS, MUST), "src": (FILE, MUST), "width": SIZE, "height": SIZE, "align": (["left", "center", "right"], "right"), "valign": (["top", "middle", "bottom"], "bottom"), }), "pdfspacer" : (0, { "height": (SIZE, MUST), }), "pdfpagenumber": (0, { "example": (STRING, "0"), }), "pdftoc": (0, { }), "pdfversion": (0, { }), "pdfkeeptogether": (1, { }), "pdfkeepinframe": (1, { "maxwidth": SIZE, "maxheight": SIZE, "mergespace": (INT, 1), "mode": (["error", "overflow", "shrink", "truncate"], "shrink"), "name": (STRING, "") }), # The chart example, see pml_charts "pdfchart": (1, { "type": (["spider","bar"], "bar"), "strokecolor": (COLOR, "#000000"), "width": (SIZE, MUST), "height": (SIZE, MUST), }), "pdfchartdata": (0, { "set": (STRING, MUST), "value": (STRING), # "label": (STRING), "strokecolor": (COLOR), "fillcolor": (COLOR), "strokewidth": (SIZE), }), "pdfchartlabel": (0, { "value": (STRING, MUST), }), "pdfbarcode": (0, { "value": (STRING, MUST), "align": (["left", "center", "right"], "left"), }), # ======================================================== "link": (0, { "href": (STRING, MUST), "rel": (STRING, ""), "type": (STRING, ""), "media": (STRING, "screen"), "charset": (STRING, "latin1"), # XXX Must be something else... }), "meta": (0, { "name": (STRING, ""), "content": (STRING, ""), }), "style": (0, { "type": (STRING, ""), "media": (STRING, "all"), }), "img": (0, { "src": (FILE, MUST), "width": SIZE, "height": SIZE, "align": (["left", "center", "right"], "left"), }), "table": (1, { "align": (["left", "center", "right"], "left"), "valign": (["top", "bottom", "middle"], "middle"), "border": (SIZE, "0"), "bordercolor": (COLOR, "#000000"), "bgcolor": COLOR, "cellpadding": (SIZE, "0"), "cellspacing": (SIZE, "0"), "repeat": (INT, "1"), # XXX Remove this! Set to 0 "width": STRING, "keepmaxwidth": SIZE, "keepmaxheight": SIZE, "keepmergespace": (INT, 1), "keepmode": (["error", "overflow", "shrink", "truncate"], "shrink"), }), "tr": (1, { "bgcolor": COLOR, "valign": ["top", "bottom", "middle"], "border": SIZE, "bordercolor": (COLOR, "#000000"), }), "td": (1, { "align": ["left", "center", "right", "justify"], "valign": ["top", "bottom", "middle"], "width": STRING, "bgcolor": COLOR, "border": SIZE, "bordercolor": (COLOR, "#000000"), "colspan": INT, "rowspan": INT, }), "th": (1, { "align": ["left", "center", "right", "justify"], "valign": ["top", "bottom", "middle"], "width": STRING, "bgcolor": COLOR, "border": SIZE, "bordercolor": (COLOR, "#000000"), "colspan": INT, "rowspan": INT, }), "dl": (1, { }), "dd": (1, { }), "dt": (1, { }), "ol": (1, { "type": (["1", "a", "A", "i", "I"], "1"), }), "ul": (1, { "type": (["circle", "disk", "square"], "disk"), }), "li": (1, { }), "hr": (0, { "color": (COLOR, "#000000"), "size": (SIZE, "1"), "align": ["left", "center", "right", "justify"], }), "div": (1, { "align": ["left", "center", "right", "justify"], }), "p": (1, { "align": ["left", "center", "right", "justify"], }), "br": (0, { }), "h1": (1, { "outline": STRING, "closed": (INT, 0), "align": ["left", "center", "right", "justify"], }), "h2": (1, { "outline": STRING, "closed": (INT, 0), "align": ["left", "center", "right", "justify"], }), "h3": (1, { "outline": STRING, "closed": (INT, 0), "align": ["left", "center", "right", "justify"], }), "h4": (1, { "outline": STRING, "closed": (INT, 0), "align": ["left", "center", "right", "justify"], }), "h5": (1, { "outline": STRING, "closed": (INT, 0), "align": ["left", "center", "right", "justify"], }), "h6": (1, { "outline": STRING, "closed": (INT, 0), "align": ["left", "center", "right", "justify"], }), "font": (1, { "face": FONT, "color": COLOR, "size": SIZE, }), "a": (1, { "href": STRING, "name": STRING, }), } DEFAULT_CSS = """ html { font-family: Helvetica; font-size: 10px; font-weight: normal; color: #000000; background-color: transparent; margin: 0; padding: 0; line-height: 150%; border: 1px none; display: inline; width: auto; height: auto; white-space: normal; } b, strong { font-weight: bold; } i, em { font-style: italic; } u { text-decoration: underline; } s, strike { text-decoration: line-through; } a { text-decoration: underline; color: blue; } ins { color: green; text-decoration: underline; } del { color: red; text-decoration: line-through; } pre, code, kbd, samp, tt { font-family: "Courier New"; } h1, h2, h3, h4, h5, h6 { font-weight:bold; -pdf-keep-with-next: true; -pdf-outline: true; -pdf-outline-open: false; -keep-with-next: true; } h1 { /*18px via YUI Fonts CSS foundation*/ font-size:138.5%; -pdf-outline-level: 0; } h2 { /*16px via YUI Fonts CSS foundation*/ font-size:123.1%; -pdf-outline-level: 1; } h3 { /*14px via YUI Fonts CSS foundation*/ font-size:108%; -pdf-outline-level: 2; } h4 { -pdf-outline-level: 3; } h5 { -pdf-outline-level: 4; } h6 { -pdf-outline-level: 5; } h1, h2, h3, h4, h5, h6, p, pre, img, hr { margin:1em 0; } address, blockquote, body, center, dl, dir, div, fieldset, form, h1, h2, h3, h4, h5, h6, hr, isindex, img, menu, noframes, noscript, ol, p, pre, table, th, tr, td, ul, li, dd, dt { display: block; } tr, th, td { vertical-align: top; width: auto; } center { text-align: center; } big { font-size: 125%; } small { font-size: 75%; } ul { margin-left: 1.5em; list-style-type: disc; } ul ul { list-style-type: circle; } ul ul ul { list-style-type: square; } ol { list-style-type: decimal; margin-left: 1.5em; } pre { white-space: pre; } """ DEFAULT_FONT = { "courier": "Courier", "courier-bold": "Courier-Bold", "courier-boldoblique": "Courier-BoldOblique", "courier-oblique": "Courier-Oblique", "helvetica": "Helvetica", "helvetica-bold": "Helvetica-Bold", "helvetica-boldoblique": "Helvetica-BoldOblique", "helvetica-oblique": "Helvetica-Oblique", "times": "Times-Roman", "times-roman": "Times-Roman", "times-bold": "Times-Bold", "times-boldoblique": "Times-BoldOblique", "times-oblique": "Times-Oblique", "symbol": "Symbol", "zapfdingbats": "ZapfDingbats", "zapf-dingbats": "ZapfDingbats", # Alias "arial": "Helvetica", "times new roman": "Times-Roman", "georgia": "Times-Roman", 'serif':'Times-Roman', 'sansserif':'Helvetica', 'sans':'Helvetica', 'monospaced':'Courier', 'monospace':'Courier', 'mono':'Courier', 'courier new':'Courier', 'verdana':'Helvetica', 'geneva':'Helvetica', } PML_PAGESIZES = { "a0": A0, "a1": A1, "a2": A2, "a3": A3, "a4": A4, "a5": A5, "a6": A6, "b0": B0, "b1": B1, "b2": B2, "b3": B3, "b4": B4, "b5": B5, "b6": B6, "letter": LETTER, "legal": LEGAL, "ledger": ELEVENSEVENTEEN, "elevenseventeen": ELEVENSEVENTEEN, }PK¨“m8·CX]D!D!sx/pisa3/pisa_default.pyc;ò ÿ5ÙGc@sž dZdZdZdkTdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZhddhdedf<ddddddddddd d!d"d#d$d%d&d'gdf<d(d)d*g<d+e f<d?e dff<d?e dff<d?e dff<dFdGdHdIgdIf<dJdKdLdMgdMf<dNe d1ff<d?e ef<dPe eff<dye <dze d1f<d{e d1f<d|e d}f<d?e<d~e <de <d€e df<ddd\d]d^gd]fff<d…e <d†e f<d…e <d†e f<d–e d}f<dFdGdHdId„gf<d?e dff<d?e dff<d?e dff<dFdGdHdIgdIf<dJdKdLdMgdMf<dNe d1ff<d?e ef<dPe eff<dye <dze d1f<d{e d1f<d|e d}f<d?e<d~e <de <d€e df<ddd\d]d^gd]fff<d…e <d†e f<d…e <d†e f<d–e d}f<dFdGdHdId„g%d error(s) occured:

" % c.err) for mode, line, msg, code in c.log: if mode=="error": out.write("

%s in line %d: %s
" % (mode, line, cgi.escape(msg))) out.write("

%d warning(s) occured:

" % c.warn) for mode, line, msg, code in c.log: if mode=="warning": out.write("

%s in line %d: %s

" % (mode, line, cgi.escape(msg))) return pisaDocument(out.getvalue(), dest) def pisaDocument( src, dest, path = None, link_callback = None, debug = 0, show_error_as_pdf = False, default_css = None, **kw): try: c = pisaContext( path, debug = debug) c.pathCallback = link_callback # XXX Handle strings and files if type(src) in types.StringTypes: src = cStringIO.StringIO(src) if default_css is None: default_css = DEFAULT_CSS pisaParser(src, c, default_css) if 0: import reportlab.pdfbase.pdfmetrics as pm pm.dumpFontData() # Avoid empty pages if not c.story: c.addPara(force=True) # Remove anchors if they do not exist (because of a bug in Reportlab) for frag, anchor in c.anchorFrag: if anchor not in c.anchorName: frag.link = None out = cStringIO.StringIO() doc = PmlBaseDoc( out, pagesize = c.pageSize, author = c.meta["author"].strip(), subject = c.meta["subject"].strip(), keywords = [x.strip() for x in c.meta["keywords"].strip().split(",") if x], title = c.meta["title"].strip(), showBoundary = 0, allowSplitting = 1) # XXX It is not possible to access PDF info, because it is private in canvas # doc.info.producer = "pisa " if c.templateList.has_key("body"): body = c.templateList["body"] del c.templateList["body"] else: x, y, w, h = getBox("1cm 1cm -1cm -1cm", c.pageSize) body = PmlPageTemplate( id="body", frames=[ Frame(x, y, w, h, id = "body", leftPadding = 0, rightPadding = 0, bottomPadding = 0, topPadding = 0)], pagesize = c.pageSize) # print body.frames # print [body] + c.templateList.values() doc.addPageTemplates([body] + c.templateList.values()) doc.multiBuild(c.story) # doc.build(c.story) # Add watermarks if pyPdf: # print c.pisaBackgroundList for bgouter in c.pisaBackgroundList: # If we have at least one background, then lets do it if bgouter: istream = out # istream.seek(2,0) #cStringIO.StringIO(data) try: output = pyPdf.PdfFileWriter() input1 = pyPdf.PdfFileReader(istream) ctr = 0 for bg in c.pisaBackgroundList: page = input1.getPage(ctr) if bg: if os.path.exists(bg): # print "BACK", bg bginput = pyPdf.PdfFileReader(open(bg, "rb")) # page.mergePage(bginput.getPage(0)) pagebg = bginput.getPage(0) pagebg.mergePage(page) page = pagebg else: c.warning("Background PDF %s doesn't exist." % bg) output.addPage(page) ctr += 1 out = cStringIO.StringIO() output.write(out) # data = sout.getvalue() except Exception, e: c.error("Exception: %s" % str(e)) # istream.close() # Found a background? So leave loop after first occurence break else: c.warning("pyPDF not installed!") # Get result data = out.getvalue() dest.write(data) except: c.error(ErrorMsg()) if c.err and show_error_as_pdf: return pisaErrorDocument(dest, c) return c PK¨“m8šq|øÞÞsx/pisa3/pisa_document.pyc;ò õ×Gc@sdZdZdZdklZdklZdkTdkTdk l Z dk Z dk Z dk Z dkZd„Zeed eed „ZdS( s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(s pisaContext(s pisaParser(s*(s DEFAULT_CSSNcCsótiƒ}|id|iƒxQ|iD]F\}}}}|djo'|id||t i |ƒfƒq*q*W|id|i ƒxQ|iD]F\}}}}|djo'|id||t i |ƒfƒq’q’Wt|iƒ|ƒSdS(NsI

%d error(s) occured:

serrors

%s in line %d: %s
s-

%d warning(s) occured:

swarnings

%s in line %d: %s

(s cStringIOsStringIOsoutswritescserrslogsmodeslinesmsgscodescgisescapeswarns pisaDocumentsgetvaluesdest(sdestscscodesmodesmsgslinesout((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pyspisaErrorDocuments   +  +icKsïy«t|d|ƒ}||_t|ƒti jot i |ƒ}n|t jo t}nt|||ƒ|i o|idtƒnx4|iD])\}}||ijo t |_q—q—Wt i ƒ} t| d|id|idiƒd|idiƒdgi}|idiƒidƒD]!}|o||iƒƒq,q,~d|idiƒd d d d ƒ}|i"i#d ƒo|i"d }|i"d =nmt%d|iƒ\}}}}t)dd dt*||||dd dd dd dd dd ƒgd|iƒ}|i+|g|i"i,ƒƒ|i-|iƒt.o>xH|i/D],}|o| } yåt.i2ƒ} t.i4| ƒ} d }x¤|i/D]™}| i8|ƒ}|oft:ii;|ƒo>t.i4t<|dƒƒ}|i8d ƒ}|i?|ƒ|}q|i@d|ƒn| iA|ƒ|d 7}q‘Wt i ƒ} | iB| ƒWq{tCj o }|iEdtF|ƒƒq{XnPqPWn|i@dƒ| iGƒ} |iB| ƒWn|iEtJƒƒnX|iKo|otM||ƒSn|SdS(Nsdebugsforcespagesizesauthorssubjectskeywordss,stitles showBoundaryisallowSplittingisbodys1cm 1cm -1cm -1cmsidsframess leftPaddings rightPaddings bottomPaddings topPaddingsrbs Background PDF %s doesn't exist.s Exception: %sspyPDF not installed!(Ns pisaContextspathsdebugscs link_callbacks pathCallbackstypessrcstypess StringTypess cStringIOsStringIOs default_csssNones DEFAULT_CSSs pisaParsersstorysaddParasTrues anchorFragsfragsanchors anchorNameslinksouts PmlBaseDocspageSizesmetasstripsappends_[1]ssplitsxsdocs templateListshas_keysbodysgetBoxsyswshsPmlPageTemplatesFramesaddPageTemplatessvaluess multiBuildspyPdfspisaBackgroundListsbgoutersistreams PdfFileWritersoutputs PdfFileReadersinput1sctrsbgsgetPagespagesossexistssopensbginputspagebgs mergePageswarningsaddPageswrites ExceptionseserrorsstrsgetvaluesdatasdestsErrorMsgserrsshow_error_as_pdfspisaErrorDocument(ssrcsdestspaths link_callbacksdebugsshow_error_as_pdfs default_cssskwsbgoutersinput1soutsoutputsdatasistreamsfragsbgsbodysyscsesctrsdocsbginputspages_[1]swshsxspagebgsanchor((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys pisaDocument$s’         N               (s __reversion__s __author__s__date__s pisa_contexts pisaContexts pisa_parsers pisaParsers pisa_utilspisa_reportlabs pisa_defaults DEFAULT_CSSs cStringIOsosstypesscgispisaErrorDocumentsNonesFalses pisaDocument( scgis cStringIOsoss pisaParsers __reversion__s pisaContexts __author__s__date__spisaErrorDocuments pisaDocuments DEFAULT_CSSstypes((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys?s        PK¨“m8šq|øÞÞsx/pisa3/pisa_document.pyo;ò õ×Gc@sdZdZdZdklZdklZdkTdkTdk l Z dk Z dk Z dk Z dkZd„Zeed eed „ZdS( s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(s pisaContext(s pisaParser(s*(s DEFAULT_CSSNcCsótiƒ}|id|iƒxQ|iD]F\}}}}|djo'|id||t i |ƒfƒq*q*W|id|i ƒxQ|iD]F\}}}}|djo'|id||t i |ƒfƒq’q’Wt|iƒ|ƒSdS(NsI

%d error(s) occured:

serrors

%s in line %d: %s
s-

%d warning(s) occured:

swarnings

%s in line %d: %s

(s cStringIOsStringIOsoutswritescserrslogsmodeslinesmsgscodescgisescapeswarns pisaDocumentsgetvaluesdest(sdestscscodesmodesmsgslinesout((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pyspisaErrorDocuments   +  +icKsïy«t|d|ƒ}||_t|ƒti jot i |ƒ}n|t jo t}nt|||ƒ|i o|idtƒnx4|iD])\}}||ijo t |_q—q—Wt i ƒ} t| d|id|idiƒd|idiƒdgi}|idiƒidƒD]!}|o||iƒƒq,q,~d|idiƒd d d d ƒ}|i"i#d ƒo|i"d }|i"d =nmt%d|iƒ\}}}}t)dd dt*||||dd dd dd dd dd ƒgd|iƒ}|i+|g|i"i,ƒƒ|i-|iƒt.o>xH|i/D],}|o| } yåt.i2ƒ} t.i4| ƒ} d }x¤|i/D]™}| i8|ƒ}|oft:ii;|ƒo>t.i4t<|dƒƒ}|i8d ƒ}|i?|ƒ|}q|i@d|ƒn| iA|ƒ|d 7}q‘Wt i ƒ} | iB| ƒWq{tCj o }|iEdtF|ƒƒq{XnPqPWn|i@dƒ| iGƒ} |iB| ƒWn|iEtJƒƒnX|iKo|otM||ƒSn|SdS(Nsdebugsforcespagesizesauthorssubjectskeywordss,stitles showBoundaryisallowSplittingisbodys1cm 1cm -1cm -1cmsidsframess leftPaddings rightPaddings bottomPaddings topPaddingsrbs Background PDF %s doesn't exist.s Exception: %sspyPDF not installed!(Ns pisaContextspathsdebugscs link_callbacks pathCallbackstypessrcstypess StringTypess cStringIOsStringIOs default_csssNones DEFAULT_CSSs pisaParsersstorysaddParasTrues anchorFragsfragsanchors anchorNameslinksouts PmlBaseDocspageSizesmetasstripsappends_[1]ssplitsxsdocs templateListshas_keysbodysgetBoxsyswshsPmlPageTemplatesFramesaddPageTemplatessvaluess multiBuildspyPdfspisaBackgroundListsbgoutersistreams PdfFileWritersoutputs PdfFileReadersinput1sctrsbgsgetPagespagesossexistssopensbginputspagebgs mergePageswarningsaddPageswrites ExceptionseserrorsstrsgetvaluesdatasdestsErrorMsgserrsshow_error_as_pdfspisaErrorDocument(ssrcsdestspaths link_callbacksdebugsshow_error_as_pdfs default_cssskwsbgoutersinput1soutsoutputsdatasistreamsfragsbgsbodysyscsesctrsdocsbginputspages_[1]swshsxspagebgsanchor((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys pisaDocument$s’         N               (s __reversion__s __author__s__date__s pisa_contexts pisaContexts pisa_parsers pisaParsers pisa_utilspisa_reportlabs pisa_defaults DEFAULT_CSSs cStringIOsosstypesscgispisaErrorDocumentsNonesFalses pisaDocument( scgis cStringIOsoss pisaParsers __reversion__s pisaContexts __author__s__date__spisaErrorDocuments pisaDocuments DEFAULT_CSSstypes((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys?s        PKÏem8€3’N’Nsx/pisa3/pisa_parser.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 20 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $" import pprint import copy import types import re import os import os.path import cStringIO import html5lib from html5lib import treebuilders, serializer, treewalkers from xml.dom import Node import xml.dom.minidom from pisa_default import * from pisa_util import * from pisa_tags import * from pisa_tables import * from sx.w3c import css, cssDOMElementInterface rxhttpstrip = re.compile("http://[^/]+(.*)", re.M|re.I) class AttrContainer(dict): def __getattr__(self, name): try: return dict.__getattr__(self, name) except: return self[name] def pisaGetAttributes(c, tag, attributes): global TAGS attrs = {} if attributes: for k, v in attributes.items(): try: attrs[str(k)] = str(v) # XXX no Unicode! Reportlab fails with template names except: attrs[k] = v nattrs = {} if TAGS.has_key(tag): block, adef = TAGS[tag] adef["id"] = STRING # print block, adef for k, v in adef.items(): nattrs[k] = None # print k, v # defaults, wenn vorhanden if type(v) == types.TupleType: if v[1] == MUST: if not attrs.has_key(k): c.error("attribute '%s' must be set!" % (k)) nv = attrs.get(k, v[1]) dfl = v[1] v = v[0] else: nv = attrs.get(k, None) dfl = None try: if nv is not None: if type(v)==types.ListType: nv = nv.strip().lower() if nv not in v: #~ raise PML_EXCEPTION, "attribute '%s' of wrong value, allowed is one of: %s" % (k, repr(v)) c.warning("attribute '%s' of wrong value, allowed is one of: %s" % (k, repr(v))) nv = dfl elif v == BOOL: nv = nv.strip().lower() nv = nv in ("1", "y", "yes", "true", str(k)) elif v == SIZE: try: nv = getSize(nv) except: c.error("attribute '%s' expects a size value" % (k)) elif v == BOX: nv = getBox(nv, c.pageSize) elif v == POS: nv = getPos(nv, c.pageSize) elif v == INT: nv = int(nv) elif v == COLOR: nv = getColor(nv) elif v == FILE: nv = c.getFile(nv) elif v == FONT: nv = c.getFontName(nv) nattrs[k] = nv #for k in attrs.keys(): # if not nattrs.has_key(k): # c.warning("attribute '%s' for tag <%s> not supported" % (k, tag)) except Exception, e: msg = ErrorMsg() #print msg c.error(msg) #else: # c.warning("tag <%s> is not supported" % tag) return AttrContainer(nattrs) def getCSSAttr(self, cssCascade, attrName, default=NotImplemented): if attrName in self.cssAttrs: return self.cssAttrs[attrName] result = None attrValue = self.attributes.get(attrName, None) if attrValue is not None: result = cssCascade.parser.parseSingleAttr(attrValue.value) if result is None: result = cssCascade.findStyleFor(self.cssElement, attrName, default) if result == 'inherit': if hasattr(self.parentNode, 'getCSSAttr'): result = self.parentNode.getCSSAttr(cssCascade, attrName, default) elif default is not NotImplemented: return default else: raise LookupError("Could not find inherited CSS attribute value for '%s'" % (attrName,)) self.cssAttrs[attrName] = result return result xml.dom.minidom.Element.getCSSAttr = getCSSAttr def pisaPreLoop(node, c, collect=False): """ Collect all CSS definitions """ if node.nodeType == Node.TEXT_NODE and collect: c.addCSS(node.data) # c.debug(repr(node.data) elif node.nodeType == Node.ELEMENT_NODE: name = node.tagName.lower() # print name, node.attributes.items() if name in ("style", "link"): attr = pisaGetAttributes(c, name, node.attributes) # print " ", attr media = [x.strip() for x in attr.media.lower().split(",")] if (attr.type.lower() in ("", "text/css") and ( "all" in media or "print" in media or "pdf" in media)): if name=="style": # print "CSS STYLE", attr for node in node.childNodes: pisaPreLoop(node, c, collect=True) return #collect = True if name=="link" and attr.href and attr.rel.lower()=="stylesheet": # print "CSS LINK", attr c.addCSS('\n@import "%s" %s;' % (attr.href, ",".join(media))) # c.addCSS(unicode(file(attr.href, "rb").read(), attr.charset)) #else: # print node.nodeType for node in node.childNodes: pisaPreLoop(node, c, collect=collect) attrNames = ''' color font-family font-size font-weight font-style text-decoration line-height background-color display margin-left margin-right margin-top margin-bottom padding-left padding-right padding-top padding-bottom border-top-color border-top-style border-top-width border-bottom-color border-bottom-style border-bottom-width border-left-color border-left-style border-left-width border-right-color border-right-style border-right-width text-align vertical-align width height zoom page-break-after page-break-before list-style-type white-space text-indent -pdf-page-break -pdf-frame-break -pdf-next-page -pdf-keep-with-next -pdf-outline -pdf-outline-level -pdf-outline-open '''.strip().split() def pisaLoop(node, c, path=[], **kw): # Initialize KW if not kw: kw = { "margin-top": 0, "margin-bottom": 0, "margin-left": 0, "margin-right": 0, } else: kw = copy.copy(kw) indent = len(path) * " " # TEXT if node.nodeType == Node.TEXT_NODE: # print indent, "#", repr(node.data) #, c.frag c.addFrag(node.data) # c.text.append(node.value) # ELEMENT elif node.nodeType == Node.ELEMENT_NODE: node.tagName = node.tagName.replace(":", "").lower() if node.tagName in ("style", "script"): return path = copy.copy(path) + [node.tagName] # Prepare attributes attr = pisaGetAttributes(c, node.tagName, node.attributes) c.debug(1, indent, "<%s %s>" % (node.tagName, attr), node.attributes.items()) #, path # Calculate styles c.cssAttr = {} if c.css: node.cssElement = cssDOMElementInterface.CSSDOMElementInterface(node) node.cssAttrs = {} node.cssElement.onCSSParserVisit(c.cssCascade.parser) cssAttrMap = {} for cssAttrName in attrNames: try: cssAttrMap[cssAttrName] = node.getCSSAttr(c.cssCascade, cssAttrName) except Exception, e: # print indent, "CSSERR", cssAttrName, e # print ErrorMsg() pass # print indent, "STYLE", node.tagName, node.cssAttrs c.cssAttr = node.cssAttrs c.node = node # Block? pageBreakAfter = False frameBreakAfter = False display = c.cssAttr.get("display", "inline").lower() # print indent, node.tagName, display, c.cssAttr.get("background-color", None), attr isBlock = (display == "block") if isBlock: c.addPara() # Page break by CSS if c.cssAttr.has_key("-pdf-next-page"): c.addStory(NextPageTemplate(str(c.cssAttr["-pdf-next-page"]))) if c.cssAttr.has_key("-pdf-page-break"): if str(c.cssAttr["-pdf-page-break"]).lower() == "before": c.addStory(PageBreak()) if c.cssAttr.has_key("-pdf-frame-break"): if str(c.cssAttr["-pdf-frame-break"]).lower() == "before": c.addStory(FrameBreak()) if str(c.cssAttr["-pdf-frame-break"]).lower() == "after": frameBreakAfter = True if c.cssAttr.has_key("page-break-before"): if str(c.cssAttr["page-break-before"]).lower() == "always": c.addStory(PageBreak()) if c.cssAttr.has_key("page-break-after"): if str(c.cssAttr["page-break-after"]).lower() == "always": pageBreakAfter = True if display == "none": # print "none!" return # Translate CSS to frags # Save previous frag styles c.pushFrag() # COLORS if c.cssAttr.has_key("color"): c.frag.textColor = getColor(c.cssAttr["color"]) if c.cssAttr.has_key("background-color"): c.frag.backColor = getColor(c.cssAttr["background-color"]) # FONT SIZE, STYLE, WEIGHT if c.cssAttr.has_key("font-family"): c.frag.fontName = c.getFontName(c.cssAttr["font-family"]) if c.cssAttr.has_key("font-size"): # XXX inherit c.frag.fontSize = getSize("".join(c.cssAttr["font-size"]), c.frag.fontSize) if c.cssAttr.has_key("line-height"): leading = "".join(c.cssAttr["line-height"]) c.frag.leading = getSize(leading, c.frag.fontSize) c.frag.leadingSource = leading else: c.frag.leading = getSize(c.frag.leadingSource, c.frag.fontSize) if c.cssAttr.has_key("font-weight"): value = c.cssAttr["font-weight"].lower() if value in ("bold", "bolder", "500", "600", "700", "800", "900"): c.frag.bold = 1 else: c.frag.bold = 0 for value in toList(c.cssAttr.get("text-decoration","")): if "underline" in value: c.frag.underline = 1 if "line-through" in value: c.frag.strike = 1 if "none" in value: c.frag.underline = 0 c.frag.strike = 0 if c.cssAttr.has_key("font-style"): value = c.cssAttr["font-style"].lower() if value in ("italic", "oblique"): c.frag.italic = 1 else: c.frag.italic = 0 if c.cssAttr.has_key("white-space"): # normal | pre | nowrap c.frag.whiteSpace = str(c.cssAttr["white-space"]).lower() # ALIGN & VALIGN if c.cssAttr.has_key("text-align"): c.frag.alignment = getAlign(c.cssAttr["text-align"]) if c.cssAttr.has_key("vertical-align"): c.frag.vAlign = c.cssAttr["vertical-align"] # HEIGHT & WIDTH if c.cssAttr.has_key("height"): c.frag.height = "".join(toList(c.cssAttr["height"])) # XXX Relative is not correct! if c.frag.height in ("auto",): c.frag.height = None if c.cssAttr.has_key("width"): # print c.cssAttr["width"] c.frag.width = "".join(toList(c.cssAttr["width"])) # XXX Relative is not correct! if c.frag.width in ("auto",): c.frag.width = None # ZOOM if c.cssAttr.has_key("zoom"): # print c.cssAttr["width"] zoom = "".join(toList(c.cssAttr["zoom"])) # XXX Relative is not correct! if zoom.endswith("%"): zoom = float(zoom[:-1]) / 100.0 c.frag.zoom = float(zoom) # MARGINS & LIST INDENT, STYLE if isBlock: if c.cssAttr.has_key("margin-top"): c.frag.spaceBefore = getSize(c.cssAttr["margin-top"], c.frag.fontSize) if c.cssAttr.has_key("margin-bottom"): c.frag.spaceAfter = getSize(c.cssAttr["margin-bottom"], c.frag.fontSize) if c.cssAttr.has_key("margin-left"): c.frag.bulletIndent = kw["margin-left"] # For lists kw["margin-left"] += getSize(c.cssAttr["margin-left"], c.frag.fontSize) c.frag.leftIndent = kw["margin-left"] # print "MARGIN LEFT", kw["margin-left"], c.frag.bulletIndent if c.cssAttr.has_key("margin-right"): kw["margin-right"] += getSize(c.cssAttr["margin-right"], c.frag.fontSize) c.frag.rigthIndent = kw["margin-right"] # print c.frag.rigthIndent if c.cssAttr.has_key("list-style-type"): c.frag.listStyleType = str(c.cssAttr["list-style-type"]).lower() if c.cssAttr.has_key("text-indent"): c.frag.firstLineIndent = getSize(c.cssAttr["text-indent"], c.frag.fontSize) # PADDINGS if isBlock: if c.cssAttr.has_key("padding-top"): c.frag.paddingTop = getSize(c.cssAttr["padding-top"], c.frag.fontSize) if c.cssAttr.has_key("padding-bottom"): c.frag.paddingBottom = getSize(c.cssAttr["padding-bottom"], c.frag.fontSize) if c.cssAttr.has_key("padding-left"): c.frag.paddingLeft = getSize(c.cssAttr["padding-left"], c.frag.fontSize) if c.cssAttr.has_key("padding-right"): c.frag.paddingRight = getSize(c.cssAttr["padding-right"], c.frag.fontSize) # BORDERS if isBlock: if c.cssAttr.has_key("border-top-width"): c.frag.borderTopWidth = getSize(c.cssAttr["border-top-width"], c.frag.fontSize) if c.cssAttr.has_key("border-bottom-width"): c.frag.borderBottomWidth = getSize(c.cssAttr["border-bottom-width"], c.frag.fontSize) if c.cssAttr.has_key("border-left-width"): c.frag.borderLeftWidth = getSize(c.cssAttr["border-left-width"], c.frag.fontSize) if c.cssAttr.has_key("border-right-width"): c.frag.borderRightWidth = getSize(c.cssAttr["border-right-width"], c.frag.fontSize) if c.cssAttr.has_key("border-top-style"): c.frag.borderTopStyle = c.cssAttr["border-top-style"] if c.cssAttr.has_key("border-bottom-style"): c.frag.borderBottomStyle = c.cssAttr["border-bottom-style"] if c.cssAttr.has_key("border-left-style"): c.frag.borderLeftStyle = c.cssAttr["border-left-style"] if c.cssAttr.has_key("border-right-style"): c.frag.borderRightStyle = c.cssAttr["border-right-style"] if c.cssAttr.has_key("border-top-color"): c.frag.borderTopColor = getColor(c.cssAttr["border-top-color"]) if c.cssAttr.has_key("border-bottom-color"): c.frag.borderBottomColor = getColor(c.cssAttr["border-bottom-color"]) if c.cssAttr.has_key("border-left-color"): c.frag.borderLeftColor = getColor(c.cssAttr["border-left-color"]) if c.cssAttr.has_key("border-right-color"): c.frag.borderRightColor = getColor(c.cssAttr["border-right-color"]) # EXTRAS if c.cssAttr.has_key("-pdf-keep-with-next"): c.frag.keepWithNext = getBool(c.cssAttr["-pdf-keep-with-next"]) if c.cssAttr.has_key("-pdf-outline"): c.frag.outline = getBool(c.cssAttr["-pdf-outline"]) if c.cssAttr.has_key("-pdf-outline-level"): c.frag.outlineLevel = int(c.cssAttr["-pdf-outline-level"]) if c.cssAttr.has_key("-pdf-outline-open"): c.frag.outlineOpen = getBool(c.cssAttr["-pdf-outline-open"]) # BEGIN tag klass = globals().get("pisaTag%s" % node.tagName.replace(":", "").upper(), None) obj = None # Static block elementId = attr.get("id", None) staticFrame = c.frameStatic.get(elementId, None) if staticFrame: oldStory = c.swapStory() # Tag specific operations if klass is not None: obj = klass(node, attr) obj.start(c) # Visit child nodes c.fragBlock = fragBlock = copy.copy(c.frag) for nnode in node.childNodes: pisaLoop(nnode, c, path, **kw) c.fragBlock = fragBlock # END tag if obj: obj.end(c) # Block? if isBlock: c.addPara() # XXX Buggy! # Page break by CSS if pageBreakAfter: c.addStory(PageBreak()) if frameBreakAfter: c.addStory(FrameBreak()) # Static block, END if staticFrame: c.addPara() for frame in staticFrame: frame.pisaStaticStory = c.story c.swapStory(oldStory) c.debug(1, indent, "" % (node.tagName)) # Reset frag style c.pullFrag() # Unknown or not handled else: # c.debug(1, indent, "???", node, node.nodeType, repr(node)) # Loop over children for node in node.childNodes: pisaLoop(node, c, path, **kw) def pisaParser(src, c, default_css="", xhtml=True): """ - Parse HTML and get miniDOM - Extract CSS informations, add default CSS, parse CSS - Handle the document DOM itself and build reportlab story - Return Context object """ if xhtml: parser = html5lib.XHTMLParser(tree=treebuilders.getTreeBuilder("dom")) else: parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom")) # XXX Bugfix for HTML5lib src = src.read().replace("", "\n") src = cStringIO.StringIO(src) document = parser.parse(src) # print document.toprettyxml() if default_css: c.addCSS(default_css) pisaPreLoop(document, c) #try: c.parseCSS() #except: # c.cssText = DEFAULT_CSS # c.parseCSS() c.debug(9, pprint.pformat(c.css)) pisaLoop(document, c) return c PK¨“m8o̳l<l<sx/pisa3/pisa_parser.pyc;ò ÙGc@sNdZdZdZdkZdkZdkZdkZdkZdkZdk Z dk Z dk l Z l Z l Z dklZdkZdkTdkTdkTdkTdklZlZeideieiBƒZd efd „ƒYZd „Ze d „Z!e!ei"i#i$_!e%d „Z&di'ƒi(ƒZ)gd„Z*de+d„Z,dS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $N(s treebuilderss serializers treewalkers(sNode(s*(scssscssDOMElementInterfaceshttp://[^/]+(.*)s AttrContainercBstZd„ZRS(NcCs*yti||ƒSWn||SnXdS(N(sdicts __getattr__sselfsname(sselfsname((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys __getattr__#s(s__name__s __module__s __getattr__(((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys AttrContainer!sc CsIh}|oOxL|iƒD]:\} } yt| ƒ|t| ƒn|ii+d1ƒoLdi:t@|id1ƒƒ|i4_J|i4iJd0fjotI|i4_Jqn|ii+d2ƒoZdi:t@|id2ƒƒ}|iLd3ƒotM|d4 ƒd5}ntM|ƒ|i4_Kn|o|ii+dƒo&t9|id|i4i;ƒ|i4_Nn|ii+dƒo&t9|id|i4i;ƒ|i4_On|ii+dƒoJ|d|i4_P|dct9|id|i4i;ƒ7<|d|i4_Qn|ii+dƒo:|dct9|id|i4i;ƒ7<|d|i4_Rn|ii+d6ƒo#t.|id6ƒiƒ|i4_Sn|ii+d7ƒo&t9|id7|i4i;ƒ|i4_Tq  n|oè|ii+d8ƒo&t9|id8|i4i;ƒ|i4_Un|ii+d9ƒo&t9|id9|i4i;ƒ|i4_Vn|ii+d:ƒo&t9|id:|i4i;ƒ|i4_Wn|ii+d;ƒo&t9|id;|i4i;ƒ|i4_Xq n|oP|ii+d<ƒo&t9|id<|i4i;ƒ|i4_Yn|ii+d=ƒo&t9|id=|i4i;ƒ|i4_Zn|ii+d>ƒo&t9|id>|i4i;ƒ|i4_[n|ii+d?ƒo&t9|id?|i4i;ƒ|i4_\n|ii+d@ƒo|id@|i4_]n|ii+dAƒo|idA|i4_^n|ii+dBƒo|idB|i4__n|ii+dCƒo|idC|i4_`n|ii+dDƒot3|idDƒ|i4_an|ii+dEƒot3|idEƒ|i4_bn|ii+dFƒot3|idFƒ|i4_cn|ii+dGƒot3|idGƒ|i4_dqæ n|ii+dHƒote|idHƒ|i4_fn|ii+dIƒote|idIƒ|i4_gn|ii+dJƒoth|idJƒ|i4_in|ii+dKƒote|idKƒ|i4_jntkƒi'dL|i iddƒilƒtIƒ}tI} |i'dMtIƒ}|ipi'|tIƒ}|o|irƒ}n|tIj o |||ƒ} | it|ƒnti|i4ƒ|_u} x$|ivD]} tx| |||qhW| |_u| o| iy|ƒn|oD|i*ƒ|o|i,t/ƒƒn|o|i,t0ƒƒqñn|o8|i*ƒx|D]}|i{|_|q W|ir|ƒn|id |dN|i ƒ|i}ƒn(x$|ivD]}tx||||qbWdS(ONs margin-topis margin-bottoms margin-lefts margin-rights s:ssstylesscriptis<%s %s>sdisplaysinlinesblocks-pdf-next-pages-pdf-page-breaksbefores-pdf-frame-breaksafterspage-break-beforesalwaysspage-break-aftersnonescolorsbackground-colors font-familys font-sizes line-heights font-weightsboldsbolders500s600s700s800s900stext-decorations underlines line-throughs font-stylesitalicsobliques white-spaces text-alignsvertical-alignsheightsautoswidthszooms%iÿÿÿÿf100.0slist-style-types text-indents padding-topspadding-bottoms padding-lefts padding-rightsborder-top-widthsborder-bottom-widthsborder-left-widthsborder-right-widthsborder-top-stylesborder-bottom-stylesborder-left-stylesborder-right-stylesborder-top-colorsborder-bottom-colorsborder-left-colorsborder-right-colors-pdf-keep-with-nexts -pdf-outlines-pdf-outline-levels-pdf-outline-opens pisaTag%ssids(~skwscopyslenspathsindentsnodesnodeTypesNodes TEXT_NODEscsaddFragsdatas ELEMENT_NODEstagNamesreplaceslowerspisaGetAttributess attributessattrsdebugsitemsscssAttrscssscssDOMElementInterfacesCSSDOMElementInterfaces cssElementscssAttrssonCSSParserVisits cssCascadesparsers cssAttrMaps attrNamess cssAttrNames getCSSAttrs ExceptionsesFalsespageBreakAftersframeBreakAftersgetsdisplaysisBlocksaddParashas_keysaddStorysNextPageTemplatesstrs PageBreaks FrameBreaksTruespushFragsgetColorsfrags textColors backColors getFontNamesfontNamesgetSizesjoinsfontSizesleadings leadingSourcesvaluesboldstoLists underlinesstrikesitalics whiteSpacesgetAligns alignmentsvAlignsheightsNoneswidthszoomsendswithsfloats spaceBefores spaceAfters bulletIndents leftIndents rigthIndents listStyleTypesfirstLineIndents paddingTops paddingBottoms paddingLefts paddingRightsborderTopWidthsborderBottomWidthsborderLeftWidthsborderRightWidthsborderTopStylesborderBottomStylesborderLeftStylesborderRightStylesborderTopColorsborderBottomColorsborderLeftColorsborderRightColorsgetBools keepWithNextsoutlinesints outlineLevels outlineOpensglobalssuppersklasssobjs elementIds frameStatics staticFrames swapStorysoldStorysstarts fragBlocks childNodessnnodespisaLoopsendsframesstoryspisaStaticStoryspullFrag(snodescspathskwsisBlocksframeszoomsframeBreakAfterspageBreakAfters cssAttrNamesnnodesleadingsobjs fragBlocks staticFramesoldStorysindentsattrsvaluesklasss cssAttrMapsdisplays elementIdse((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pyspisaLoopñs„.,       $        /!"    #""&&&&#*&&&*&&&&!.      scCsã|otidtidƒƒ}ntidtidƒƒ}|iƒi ddƒi ddƒ}t i |ƒ}|i |ƒ}|o|i|ƒnt||ƒ|iƒ|idti|iƒƒt||ƒ|SdS(sÅ - Parse HTML and get miniDOM - Extract CSS informations, add default CSS, parse CSS - Handle the document DOM itself and build reportlab story - Return Context object streesdoms i N(sxhtmlshtml5libs XHTMLParsers treebuilderssgetTreeBuildersparsers HTMLParserssrcsreadsreplaces cStringIOsStringIOsparsesdocuments default_cssscsaddCSSs pisaPreLoopsparseCSSsdebugspprintspformatscssspisaLoop(ssrcscs default_csssxhtmlsparsersdocument((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys pisaParsers$   (-s __reversion__s __author__s__date__spprintscopystypessresossos.paths cStringIOshtml5libs treebuilderss serializers treewalkerssxml.domsNodesxml.dom.minidomsxmls pisa_defaults pisa_utils pisa_tagss pisa_tablesssx.w3cscssscssDOMElementInterfacescompilesMsIs rxhttpstripsdicts AttrContainerspisaGetAttributessNotImplementeds getCSSAttrsdomsminidomsElementsFalses pisaPreLoopsstripssplits attrNamesspisaLoopsTrues pisaParser(s cStringIOspisaLoops pisaParsers attrNamess pisaPreLoops getCSSAttrscssDOMElementInterfaceshtml5libsNodes AttrContainerspprints treebuilderssrescsssxmlspisaGetAttributess __author__scopystypess __reversion__s treewalkerss rxhttpstrips__date__soss serializer((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys?s8           U  (1 ÿPK¨“m8o̳l<l<sx/pisa3/pisa_parser.pyo;ò ÙGc@sNdZdZdZdkZdkZdkZdkZdkZdkZdk Z dk Z dk l Z l Z l Z dklZdkZdkTdkTdkTdkTdklZlZeideieiBƒZd efd „ƒYZd „Ze d „Z!e!ei"i#i$_!e%d „Z&di'ƒi(ƒZ)gd„Z*de+d„Z,dS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $N(s treebuilderss serializers treewalkers(sNode(s*(scssscssDOMElementInterfaceshttp://[^/]+(.*)s AttrContainercBstZd„ZRS(NcCs*yti||ƒSWn||SnXdS(N(sdicts __getattr__sselfsname(sselfsname((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys __getattr__#s(s__name__s __module__s __getattr__(((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys AttrContainer!sc CsIh}|oOxL|iƒD]:\} } yt| ƒ|t| ƒn|ii+d1ƒoLdi:t@|id1ƒƒ|i4_J|i4iJd0fjotI|i4_Jqn|ii+d2ƒoZdi:t@|id2ƒƒ}|iLd3ƒotM|d4 ƒd5}ntM|ƒ|i4_Kn|o|ii+dƒo&t9|id|i4i;ƒ|i4_Nn|ii+dƒo&t9|id|i4i;ƒ|i4_On|ii+dƒoJ|d|i4_P|dct9|id|i4i;ƒ7<|d|i4_Qn|ii+dƒo:|dct9|id|i4i;ƒ7<|d|i4_Rn|ii+d6ƒo#t.|id6ƒiƒ|i4_Sn|ii+d7ƒo&t9|id7|i4i;ƒ|i4_Tq  n|oè|ii+d8ƒo&t9|id8|i4i;ƒ|i4_Un|ii+d9ƒo&t9|id9|i4i;ƒ|i4_Vn|ii+d:ƒo&t9|id:|i4i;ƒ|i4_Wn|ii+d;ƒo&t9|id;|i4i;ƒ|i4_Xq n|oP|ii+d<ƒo&t9|id<|i4i;ƒ|i4_Yn|ii+d=ƒo&t9|id=|i4i;ƒ|i4_Zn|ii+d>ƒo&t9|id>|i4i;ƒ|i4_[n|ii+d?ƒo&t9|id?|i4i;ƒ|i4_\n|ii+d@ƒo|id@|i4_]n|ii+dAƒo|idA|i4_^n|ii+dBƒo|idB|i4__n|ii+dCƒo|idC|i4_`n|ii+dDƒot3|idDƒ|i4_an|ii+dEƒot3|idEƒ|i4_bn|ii+dFƒot3|idFƒ|i4_cn|ii+dGƒot3|idGƒ|i4_dqæ n|ii+dHƒote|idHƒ|i4_fn|ii+dIƒote|idIƒ|i4_gn|ii+dJƒoth|idJƒ|i4_in|ii+dKƒote|idKƒ|i4_jntkƒi'dL|i iddƒilƒtIƒ}tI} |i'dMtIƒ}|ipi'|tIƒ}|o|irƒ}n|tIj o |||ƒ} | it|ƒnti|i4ƒ|_u} x$|ivD]} tx| |||qhW| |_u| o| iy|ƒn|oD|i*ƒ|o|i,t/ƒƒn|o|i,t0ƒƒqñn|o8|i*ƒx|D]}|i{|_|q W|ir|ƒn|id |dN|i ƒ|i}ƒn(x$|ivD]}tx||||qbWdS(ONs margin-topis margin-bottoms margin-lefts margin-rights s:ssstylesscriptis<%s %s>sdisplaysinlinesblocks-pdf-next-pages-pdf-page-breaksbefores-pdf-frame-breaksafterspage-break-beforesalwaysspage-break-aftersnonescolorsbackground-colors font-familys font-sizes line-heights font-weightsboldsbolders500s600s700s800s900stext-decorations underlines line-throughs font-stylesitalicsobliques white-spaces text-alignsvertical-alignsheightsautoswidthszooms%iÿÿÿÿf100.0slist-style-types text-indents padding-topspadding-bottoms padding-lefts padding-rightsborder-top-widthsborder-bottom-widthsborder-left-widthsborder-right-widthsborder-top-stylesborder-bottom-stylesborder-left-stylesborder-right-stylesborder-top-colorsborder-bottom-colorsborder-left-colorsborder-right-colors-pdf-keep-with-nexts -pdf-outlines-pdf-outline-levels-pdf-outline-opens pisaTag%ssids(~skwscopyslenspathsindentsnodesnodeTypesNodes TEXT_NODEscsaddFragsdatas ELEMENT_NODEstagNamesreplaceslowerspisaGetAttributess attributessattrsdebugsitemsscssAttrscssscssDOMElementInterfacesCSSDOMElementInterfaces cssElementscssAttrssonCSSParserVisits cssCascadesparsers cssAttrMaps attrNamess cssAttrNames getCSSAttrs ExceptionsesFalsespageBreakAftersframeBreakAftersgetsdisplaysisBlocksaddParashas_keysaddStorysNextPageTemplatesstrs PageBreaks FrameBreaksTruespushFragsgetColorsfrags textColors backColors getFontNamesfontNamesgetSizesjoinsfontSizesleadings leadingSourcesvaluesboldstoLists underlinesstrikesitalics whiteSpacesgetAligns alignmentsvAlignsheightsNoneswidthszoomsendswithsfloats spaceBefores spaceAfters bulletIndents leftIndents rigthIndents listStyleTypesfirstLineIndents paddingTops paddingBottoms paddingLefts paddingRightsborderTopWidthsborderBottomWidthsborderLeftWidthsborderRightWidthsborderTopStylesborderBottomStylesborderLeftStylesborderRightStylesborderTopColorsborderBottomColorsborderLeftColorsborderRightColorsgetBools keepWithNextsoutlinesints outlineLevels outlineOpensglobalssuppersklasssobjs elementIds frameStatics staticFrames swapStorysoldStorysstarts fragBlocks childNodessnnodespisaLoopsendsframesstoryspisaStaticStoryspullFrag(snodescspathskwsisBlocksframeszoomsframeBreakAfterspageBreakAfters cssAttrNamesnnodesleadingsobjs fragBlocks staticFramesoldStorysindentsattrsvaluesklasss cssAttrMapsdisplays elementIdse((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pyspisaLoopñs„.,       $        /!"    #""&&&&#*&&&*&&&&!.      scCsã|otidtidƒƒ}ntidtidƒƒ}|iƒi ddƒi ddƒ}t i |ƒ}|i |ƒ}|o|i|ƒnt||ƒ|iƒ|idti|iƒƒt||ƒ|SdS(sÅ - Parse HTML and get miniDOM - Extract CSS informations, add default CSS, parse CSS - Handle the document DOM itself and build reportlab story - Return Context object streesdoms i N(sxhtmlshtml5libs XHTMLParsers treebuilderssgetTreeBuildersparsers HTMLParserssrcsreadsreplaces cStringIOsStringIOsparsesdocuments default_cssscsaddCSSs pisaPreLoopsparseCSSsdebugspprintspformatscssspisaLoop(ssrcscs default_csssxhtmlsparsersdocument((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys pisaParsers$   (-s __reversion__s __author__s__date__spprintscopystypessresossos.paths cStringIOshtml5libs treebuilderss serializers treewalkerssxml.domsNodesxml.dom.minidomsxmls pisa_defaults pisa_utils pisa_tagss pisa_tablesssx.w3cscssscssDOMElementInterfacescompilesMsIs rxhttpstripsdicts AttrContainerspisaGetAttributessNotImplementeds getCSSAttrsdomsminidomsElementsFalses pisaPreLoopsstripssplits attrNamesspisaLoopsTrues pisaParser(s cStringIOspisaLoops pisaParsers attrNamess pisaPreLoops getCSSAttrscssDOMElementInterfaceshtml5libsNodes AttrContainerspprints treebuilderssrescsssxmlspisaGetAttributess __author__scopystypess __reversion__s treewalkerss rxhttpstrips__date__soss serializer((s-build\bdist.win32\egg\sx\pisa3\pisa_parser.pys?s8           U  (1 ÿPKÊ‚l8“½CŽŽsx/pisa3/pisa_reportlab.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 20 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $" from pisa_util import * from pisa_default import TAGS, STRING # from reportlab.platypus.paragraph import * import copy class PmlBaseDoc(BaseDocTemplate): """ We use our own document template to get access to the canvas and set some informations once. """ def beforePage(self): # Tricky way to set producer, because of not real privateness in Python self.canv._doc.info.producer = "pisa HTML to PDF " ''' # Convert to ASCII because there is a Bug in Reportlab not # supporting other than ASCII. Send to list on 23.1.2007 author = toString(self.pml_data.get("author", "")).encode("ascii","ignore") subject = toString(self.pml_data.get("subject", "")).encode("ascii","ignore") title = toString(self.pml_data.get("title", "")).encode("ascii","ignore") # print repr((author,title,subject)) self.canv.setAuthor(author) self.canv.setSubject(subject) self.canv.setTitle(title) if self.pml_data.get("fullscreen", 0): self.canv.showFullScreen0() if self.pml_data.get("showoutline", 0): self.canv.showOutline() if self.pml_data.get("duration", None) is not None: self.canv.setPageDuration(self.pml_data["duration"]) ''' def afterFlowable(self, flowable): # Does the flowable contain fragments? if not hasattr(flowable, "frags"): return # Collect for frag in flowable.frags: if hasattr(frag, "outline") and frag.outline == True: pageNum = self.page self.notify('TOCEntry', (frag.outlineLevel, frag.text, pageNum)) ''' def afterFlowable(self, flowable): # Does the flowable contain fragments? if not hasattr(flowable, "frags"): return # Collect outline = tag = key = u"" for frag in flowable.frags: if not hasattr(frag, "tag"): continue if not TAGS.has_key(frag.tag): continue if not TAGS[frag.tag][1].has_key('outline'): continue if STRING != TAGS[frag.tag][1]['outline']: continue outline = unicode(frag.tag) + flowable.text key = str(id(flowable)) tag = frag.tag print tag, key, outline if outline and key: self.canv.bookmarkPage(key) self.canv.addOutlineEntry(outline, key, int(tag[1])-1, True) ''' class PmlPageTemplate(PageTemplate): def __init__(self, **kw): self.pisaStaticList = [] self.pisaBackgroundList = [] self.pisaBackground = None PageTemplate.__init__(self, **kw) def beforeDrawPage(self, canvas, doc): canvas.saveState() try: try: # Paint static frames pagenumber = str(canvas.getPageNumber()) for frame in self.pisaStaticList: frame = copy.deepcopy(frame) story = frame.pisaStaticStory # Modify page number for obj in story: if isinstance(obj, PmlParagraph): for frag in obj.frags: if frag.pageNumber: frag.text = pagenumber frame.addFromList(story, canvas) except Exception, e: #print "PMLPAGETEMPLATE", str(e) pass try: self.pisaBackgroundList.append(self.pisaBackground) except: self.pisaBackgroundList.append(None) # canvas.saveState() #try: # self.pml_drawing.draw(canvas) #except Exception, e: # # print "drawing exception", str(e) # pass finally: canvas.restoreState() class PmlImage(Image): def wrap(self, availWidth, availHeight): #print 123, self.drawWidth, self.drawHeight, self.pisaZoom #self.drawWidth *= self.pisaZoom #self.drawHeight *= self.pisaZoom # print 456, self.drawWidth, self.drawHeight width = min(self.drawWidth, availWidth) # print 999, width, self.drawWidth, availWidth factor = float(width) / self.drawWidth # print 123, factor self.drawHeight = self.drawHeight * factor self.drawWidth = width return Image.wrap(self, availWidth, availHeight) class PmlParagraph(Paragraph): def draw(self): # Insert page number if 0: #for line in self.blPara.lines: try: for frag in line.words: #print 111,frag.pageNumber, frag.text if frag.pageNumber: frag.text = str(self.canv.getPageNumber()) except Exception, e: # print line, e pass # Create outline if getattr(self, "outline", False): # Check level and add all levels last = getattr(self.canv, "outlineLast", -1) + 1 while last < self.outlineLevel: # print "(OUTLINE", last, self.text key = getUID() self.canv.bookmarkPage(key) self.canv.addOutlineEntry( copy.deepcopy(self.text), key, last, not self.outlineOpen) last += 1 self.canv.outlineLast = self.outlineLevel key = getUID() # print " OUTLINE", self.outlineLevel, self.text self.canv.bookmarkPage(key) self.canv.addOutlineEntry( copy.deepcopy(self.text), key, self.outlineLevel, not self.outlineOpen) last += 1 #else: # print repr(self.text)[:80] # Usual stuff Paragraph.draw(self)PK¨“m8 ¼Š_ÍÍsx/pisa3/pisa_reportlab.pyc;ò ,õ×Gc@s‘dZdZdZdkTdklZlZdkZdefd„ƒYZ de fd „ƒYZ d e fd „ƒYZ d efd „ƒYZdS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(s*(sTAGSsSTRINGNs PmlBaseDoccBs tZdZd„Zd„ZRS(sj We use our own document template to get access to the canvas and set some informations once. cCsd|iii_dS(Ns+pisa HTML to PDF (sselfscanvs_docsinfosproducer(sself((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys beforePagescCs}t|dƒ odSnx]|iD]R}t|dƒo |itjo,|i}|i d|i |i |fƒq#q#WdS(NsfragssoutlinesTOCEntry( shasattrsflowablesfragssfragsoutlinesTruesselfspagespageNumsnotifys outlineLevelstext(sselfsflowablesfragspageNum((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys afterFlowable3s   (s__name__s __module__s__doc__s beforePages afterFlowable(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys PmlBaseDocs   !sPmlPageTemplatecBstZd„Zd„ZRS(NcKs/g|_g|_t|_ti||dS(N(sselfspisaStaticListspisaBackgroundListsNonespisaBackgrounds PageTemplates__init__skw(sselfskw((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__Xs   c Cs |iƒzïy¢t|iƒƒ}x‰|iD]~}ti |ƒ}|i }xM|D]E}t |tƒo/x,|iD]}|io ||_qqqqWqQqQW|i||ƒq,WWntj o }nXy|ii|iƒWn|iitƒnXWd|iƒXdS(N(scanvass saveStatesstrs getPageNumbers pagenumbersselfspisaStaticListsframescopysdeepcopyspisaStaticStorysstorysobjs isinstances PmlParagraphsfragssfrags pageNumberstexts addFromLists ExceptionsespisaBackgroundListsappendspisaBackgroundsNones restoreState( sselfscanvassdocsfragsobjsstorys pagenumbersesframe((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysbeforeDrawPage^s0     (s__name__s __module__s__init__sbeforeDrawPage(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlPageTemplateVs sPmlImagecBstZd„ZRS(NcCsUt|i|ƒ}t|ƒ|i}|i||_||_ti |||ƒSdS(N( sminsselfs drawWidths availWidthswidthsfloatsfactors drawHeightsImageswraps availHeight(sselfs availWidths availHeightsfactorswidth((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswrap‡s  (s__name__s __module__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlImage…ss PmlParagraphcBstZd„ZRS(NcCst|dtƒoßt|iddƒd}xa||ijoPtƒ}|ii|ƒ|ii t i |i ƒ|||i ƒ|d7}q/W|i|i_tƒ}|ii|ƒ|ii t i |i ƒ||i|i ƒ|d7}nti|ƒdS(Nsoutlines outlineLastiÿÿÿÿi(sgetattrsselfsFalsescanvslasts outlineLevelsgetUIDskeys bookmarkPagesaddOutlineEntryscopysdeepcopystexts outlineOpens outlineLasts Paragraphsdraw(sselfslastskey((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysdraw–s*     (s__name__s __module__sdraw(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys PmlParagraph”s(s __reversion__s __author__s__date__s pisa_utils pisa_defaultsTAGSsSTRINGscopysBaseDocTemplates PmlBaseDocs PageTemplatesPmlPageTemplatesImagesPmlImages Paragraphs PmlParagraph( sPmlPageTemplatesSTRINGsTAGSs PmlBaseDocsPmlImages PmlParagraphs __author__s__date__scopys __reversion__((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys?s F/PK¨“m8 ¼Š_ÍÍsx/pisa3/pisa_reportlab.pyo;ò ,õ×Gc@s‘dZdZdZdkTdklZlZdkZdefd„ƒYZ de fd „ƒYZ d e fd „ƒYZ d efd „ƒYZdS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(s*(sTAGSsSTRINGNs PmlBaseDoccBs tZdZd„Zd„ZRS(sj We use our own document template to get access to the canvas and set some informations once. cCsd|iii_dS(Ns+pisa HTML to PDF (sselfscanvs_docsinfosproducer(sself((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys beforePagescCs}t|dƒ odSnx]|iD]R}t|dƒo |itjo,|i}|i d|i |i |fƒq#q#WdS(NsfragssoutlinesTOCEntry( shasattrsflowablesfragssfragsoutlinesTruesselfspagespageNumsnotifys outlineLevelstext(sselfsflowablesfragspageNum((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys afterFlowable3s   (s__name__s __module__s__doc__s beforePages afterFlowable(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys PmlBaseDocs   !sPmlPageTemplatecBstZd„Zd„ZRS(NcKs/g|_g|_t|_ti||dS(N(sselfspisaStaticListspisaBackgroundListsNonespisaBackgrounds PageTemplates__init__skw(sselfskw((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__Xs   c Cs |iƒzïy¢t|iƒƒ}x‰|iD]~}ti |ƒ}|i }xM|D]E}t |tƒo/x,|iD]}|io ||_qqqqWqQqQW|i||ƒq,WWntj o }nXy|ii|iƒWn|iitƒnXWd|iƒXdS(N(scanvass saveStatesstrs getPageNumbers pagenumbersselfspisaStaticListsframescopysdeepcopyspisaStaticStorysstorysobjs isinstances PmlParagraphsfragssfrags pageNumberstexts addFromLists ExceptionsespisaBackgroundListsappendspisaBackgroundsNones restoreState( sselfscanvassdocsfragsobjsstorys pagenumbersesframe((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysbeforeDrawPage^s0     (s__name__s __module__s__init__sbeforeDrawPage(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlPageTemplateVs sPmlImagecBstZd„ZRS(NcCsUt|i|ƒ}t|ƒ|i}|i||_||_ti |||ƒSdS(N( sminsselfs drawWidths availWidthswidthsfloatsfactors drawHeightsImageswraps availHeight(sselfs availWidths availHeightsfactorswidth((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswrap‡s  (s__name__s __module__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlImage…ss PmlParagraphcBstZd„ZRS(NcCst|dtƒoßt|iddƒd}xa||ijoPtƒ}|ii|ƒ|ii t i |i ƒ|||i ƒ|d7}q/W|i|i_tƒ}|ii|ƒ|ii t i |i ƒ||i|i ƒ|d7}nti|ƒdS(Nsoutlines outlineLastiÿÿÿÿi(sgetattrsselfsFalsescanvslasts outlineLevelsgetUIDskeys bookmarkPagesaddOutlineEntryscopysdeepcopystexts outlineOpens outlineLasts Paragraphsdraw(sselfslastskey((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysdraw–s*     (s__name__s __module__sdraw(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys PmlParagraph”s(s __reversion__s __author__s__date__s pisa_utils pisa_defaultsTAGSsSTRINGscopysBaseDocTemplates PmlBaseDocs PageTemplatesPmlPageTemplatesImagesPmlImages Paragraphs PmlParagraph( sPmlPageTemplatesSTRINGsTAGSs PmlBaseDocsPmlImages PmlParagraphs __author__s__date__scopys __reversion__((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys?s F/PKö|m8«Õ.K4K4sx/pisa3/pisa_tables.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 20 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $" import copy from reportlab.platypus.tables import * from reportlab.platypus.flowables import * from reportlab.platypus.flowables import KeepInFrame from pisa_util import * from pisa_tags import * class PmlTable(Table): def _normWidth(self, w, maxw): " Helper for calculating percentages " if type(w)==type(""): w = ((maxw/100.0) * float(w[:-1])) elif (w is None) or (w=="*"): w = maxw return min(w, maxw) def wrap(self, availWidth, availHeight): # Strange bug, sometime the totalWidth is not set !? try: self.totalWidth except: self.totalWidth = availWidth # Prepare values totalWidth = self._normWidth(self.totalWidth, availWidth) remainingWidth = totalWidth remainingCols = 0 newColWidths = self._colWidths # Calculate widths that are fix # IMPORTANT!!! We can not substitute the private value # self._colWidths therefore we have to modify list in place for i in range(len(newColWidths)): colWidth = newColWidths[i] if (colWidth is not None) or (colWidth=='*'): colWidth = self._normWidth(colWidth, totalWidth) remainingWidth -= colWidth else: remainingCols += 1 colWidth = None newColWidths[i] = (colWidth) # Distribute remaining space if remainingCols: for i in range(len(newColWidths)): if newColWidths[i] is None: newColWidths[i] = (remainingWidth / remainingCols) - 0.1 # print "New values:", totalWidth, newColWidths, sum(newColWidths) # Call original method "wrap()" # self._colWidths = newColWidths return Table.wrap(self, availWidth, availHeight) def _width(value=None): if value is None: return None value = str(value) if value.endswith("%"): return value return getSize(value) class TableData: def __init__(self): self.data = [] self.styles = [] self.span = [] self.mode = "" self.padding = 0 def add_cell(self, data=None): self.col += 1 self.data[len(self.data)-1].append(data) def add_style(self, data): # print self.mode, data self.styles.append(copy.copy(data)) def add_empty(self, x, y): self.span.append((x, y)) def get_data(self): data = self.data for x, y in self.span: try: data[y].insert(x, '') except: pass return data def add_cell_styles(self, c, begin, end, mode="td"): def getColor(a,b): return a self.mode = mode.upper() if c.frag.backColor and mode!="tr": # XXX Stimmt das so? self.add_style(('BACKGROUND', begin, end, c.frag.backColor)) # print 'BACKGROUND', begin, end, c.frag.backColor log.debug("%r", ( begin, end, c.frag.borderTopWidth, c.frag.borderTopStyle, c.frag.borderTopColor, c.frag.borderBottomWidth, c.frag.borderBottomStyle, c.frag.borderBottomColor, c.frag.borderLeftWidth, c.frag.borderLeftStyle, c.frag.borderLeftColor, c.frag.borderRightWidth, c.frag.borderRightStyle, c.frag.borderRightColor, )) if getBorderStyle(c.frag.borderTopStyle) and c.frag.borderTopWidth: self.add_style(('LINEABOVE', begin, (end[0], begin[1]), c.frag.borderTopWidth, getColor(c.frag.borderTopColor, c.frag.textColor), "squared")) if getBorderStyle(c.frag.borderLeftStyle) and c.frag.borderLeftWidth: self.add_style(('LINEBEFORE', begin, (begin[0], end[1]), c.frag.borderLeftWidth, getColor(c.frag.borderLeftColor, c.frag.textColor), "squared")) if getBorderStyle(c.frag.borderRightStyle) and c.frag.borderRightWidth: self.add_style(('LINEAFTER', (end[0], begin[1]), end, c.frag.borderRightWidth, getColor(c.frag.borderRightColor, c.frag.textColor), "squared")) if getBorderStyle(c.frag.borderBottomStyle) and c.frag.borderBottomWidth: self.add_style(('LINEBELOW', (begin[0], end[1]), end, c.frag.borderBottomWidth, getColor(c.frag.borderBottomColor, c.frag.textColor), "squared")) self.add_style(('LEFTPADDING', begin, end, c.frag.paddingLeft or self.padding)) self.add_style(('RIGHTPADDING', begin, end, c.frag.paddingRight or self.padding)) self.add_style(('TOPPADDING', begin, end, c.frag.paddingTop or self.padding)) self.add_style(('BOTTOMPADDING', begin, end, c.frag.paddingBottom or self.padding)) class pisaTagTABLE(pisaTag): def start(self, c): c.addPara() attrs = self.attr # Swap table data c.tableData, self.tableData = TableData(), c.tableData tdata = c.tableData # border #tdata.border = attrs.border #tdata.bordercolor = attrs.bordercolor begin = (0, 0) end = (-1, -1) if attrs.border: tdata.add_style(("GRID", begin, end, attrs.border, attrs.bordercolor)) tdata.padding = attrs.cellpadding if 0: #attrs.cellpadding: tdata.add_style(('LEFTPADDING', begin, end, attrs.cellpadding)) tdata.add_style(('RIGHTPADDING', begin, end, attrs.cellpadding)) tdata.add_style(('TOPPADDING', begin, end, attrs.cellpadding)) tdata.add_style(('BOTTOMPADDING', begin, end, attrs.cellpadding)) # alignment #~ tdata.add_style(('VALIGN', (0,0), (-1,-1), attrs.valign.upper())) # Set Border and padding styles tdata.add_cell_styles(c, (0,0), (-1,-1), "table") # bgcolor #if attrs.bgcolor is not None: # tdata.add_style(('BACKGROUND', (0, 0), (-1, -1), attrs.bgcolor)) tdata.align = attrs.align.upper() tdata.col = 0 tdata.row = 0 tdata.keepinframe = { "maxWidth": attrs["keepmaxwidth"], "maxHeight": attrs["keepmaxheight"], "mode": attrs["keepmode"], "mergeSpace": attrs["keepmergespace"] } tdata.keep_maxwidth = attrs.keepmaxwidth tdata.keep_maxheight = attrs.keepmaxheight tdata.colw = [] tdata.rowh = [] tdata.repeat = attrs.repeat tdata.width = _width(attrs.width) # self.tabdata.append(tdata) def end(self, c): tdata = c.tableData data = tdata.get_data() try: if tdata.data: # log.debug("Table sryles %r", tdata.styles) t = PmlTable( data, colWidths = tdata.colw, rowHeights = tdata.rowh, # totalWidth = tdata.width, splitByRow = 1, # repeatCols = 1, repeatRows = tdata.repeat, hAlign = tdata.align, vAlign = 'TOP', style = TableStyle(tdata.styles)) t.totalWidth = _width(tdata.width) t.spaceBefore = c.frag.spaceBefore t.spaceAfter = c.frag.spaceAfter # t.hAlign = tdata.align c.addStory(t) else: c.warning(" is empty") except: log.exception("
") c.warning("Error in
") # Cleanup and re-swap table data c.clearFrag() c.tableData, self.tableData = self.tableData, None class pisaTagTR(pisaTag): def start(self, c): tdata = c.tableData row = tdata.row begin = (0, row) end = (-1, row) tdata.add_cell_styles(c, begin, end, "tr") c.frag.vAlign = self.attr.valign or c.frag.vAlign tdata.col = 0 tdata.data.append([]) def end(self, c): tdata = c.tableData tdata.row += 1 class pisaTagTD(pisaTag): def start(self, c): if self.attr.align is not None: #print self.attr.align, getAlign(self.attr.align) c.frag.alignment = getAlign(self.attr.align) c.clearFrag() self.story = c.swapStory() # print "#", len(c.story) attrs = self.attr tdata = c.tableData cspan = attrs.colspan rspan = attrs.rowspan row = tdata.row col = tdata.col while 1: for x, y in tdata.span: if x==col and y==row: col += 1 tdata.col += 1 break cs = 0 rs = 0 begin = (col, row) end = (col, row) if cspan: end = (end[0] + cspan - 1, end[1]) if rspan: end = (end[0], end[1] + rspan - 1) if begin!=end: #~ print begin, end tdata.add_style(('SPAN', begin, end)) for x in range(begin[0], end[0]+1): for y in range(begin[1], end[1]+1): if x!=begin[0] or y!=begin[1]: tdata.add_empty(x, y) # Set Border and padding styles tdata.add_cell_styles(c, begin, end, "td") # Calculate widths # Add empty placeholders for new columns if (col + 1) > len(tdata.colw): tdata.colw = tdata.colw + ((col + 1 - len(tdata.colw)) * [_width()]) # Get value of with, if no spanning if not cspan: # print c.frag.width width = c.frag.width or self.attr.width #self._getStyle(None, attrs, "width", "width", mode) # If is value, the set it in the right place in the arry # print width, _width(width) if width is not None: tdata.colw[col] = _width(width) # Calculate heights if row+1 > len(tdata.rowh): tdata.rowh = tdata.rowh + ((row + 1 - len(tdata.rowh)) * [_width()]) if not rspan: height = None #self._getStyle(None, attrs, "height", "height", mode) if height is not None: tdata.rowh[row] = _width(height) tdata.add_style(('FONTSIZE', begin, end, 1.0)) tdata.add_style(('LEADING', begin, end, 1.0)) # Vertical align valign = self.attr.valign or c.frag.vAlign if valign is not None: tdata.add_style(('VALIGN', begin, end, valign.upper())) # Reset border, otherwise the paragraph block will have borders too frag = c.frag frag.borderLeftWidth = 0 frag.borderLeftColor = None frag.borderLeftStyle = None frag.borderRightWidth = 0 frag.borderRightColor = None frag.borderRightStyle = None frag.borderTopWidth = 0 frag.borderTopColor = None frag.borderTopStyle = None frag.borderBottomWidth = 0 frag.borderBottomColor = None frag.borderBottomStyle = None def end(self, c): tdata = c.tableData c.addPara() cell = c.story # Handle empty cells, they otherwise collapse if not cell: cell = ' ' c.swapStory(self.story) # zellen hinzufügen if 0: # tdata.keepinframe["maxWidth"] and tdata.keepinframe["maxHeight"]: # print tdata.keepinframe tdata.keepinframe["content"] = cell cell = KeepInFrame(**tdata.keepinframe) tdata.add_cell(cell) class pisaTagTH(pisaTagTD): pass ''' end_th = end_td def start_keeptogether(self, attrs): self.story.append([]) self.next_para() def end_keeptogether(self): if not self.story[-1]: self.add_noop() self.next_para() s = self.story.pop() self.add_story(KeepTogether(s)) def start_keepinframe(self, attrs): self.story.append([]) self.keepinframe = { "maxWidth": attrs["maxwidth"], "maxHeight": attrs["maxheight"], "mode": attrs["mode"], "name": attrs["name"], "mergeSpace": attrs["mergespace"] } # print self.keepinframe self.next_para() def end_keepinframe(self): if not self.story[-1]: self.add_noop() self.next_para() self.keepinframe["content"] = self.story.pop() self.add_story(KeepInFrame(**self.keepinframe)) '''PK¨“m8Ä4Ñå//sx/pisa3/pisa_tables.pyc;ò ±<ÙGc@sÕdZdZdZdkZdkTdkTdklZdkTdkTde fd„ƒYZ e d„Z d fd „ƒYZ d efd „ƒYZd efd„ƒYZdefd„ƒYZdefd„ƒYZdS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $N(s*(s KeepInFramesPmlTablecBstZd„Zd„ZRS(NcCsjt|ƒtdƒjo|dt|d ƒ}n%|tjp |djo |}nt||ƒSdS(s$ Helper for calculating percentages sf100.0iÿÿÿÿs*N(stypeswsmaxwsfloatsNonesmin(sselfswsmaxw((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pys _normWidths  c Cs)y |iWn||_nX|i|i|ƒ}|}d}|i}xxtt |ƒƒD]d}||}|t j p |djo |i||ƒ}||8}n|d7}t }||| is emptys
sError in
(scs tableDatastdatasget_datasdatasPmlTablescolwsrowhsrepeatsaligns TableStylesstylessts_widthswidths totalWidthsfrags spaceBefores spaceAftersaddStoryswarningslogs exceptions clearFragsselfsNone(sselfscstdatastsdata((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysendÓs,         (s__name__s __module__sstartsend(((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pys pisaTagTABLE™s 8s pisaTagTRcBstZd„Zd„ZRS(NcCs||i}|i}d|f}d|f}|i|||dƒ|ii p |i i |i _ d|_ |i igƒdS(Niiÿÿÿÿstr(scs tableDatastdatasrowsbeginsendsadd_cell_stylessselfsattrsvalignsfragsvAlignscolsdatasappend(sselfscsbeginsendstdatasrow((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysstartõs     cCs|i}|id7_dS(Ni(scs tableDatastdatasrow(sselfscstdata((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysends (s__name__s __module__sstartsend(((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pys pisaTagTRós s pisaTagTDcBstZd„Zd„ZRS(NcCs|iitj ot|iiƒ|i_n|iƒ|i ƒ|_ |i}|i }|i} |i} |i}|i}x^noVxN|iD]C\}}||jo ||jo|d7}|id7_q’q’WPqˆWd}d}||f} ||f}| o |d| d|df}n| o |d|d| df}n| |joœ|id| |fƒxƒt| d|ddƒD]b}xYt| d|ddƒD]<}|| djp|| djo|i||ƒq²q²WqWn|i|| |dƒ|dt|i ƒjo/|i |dt|i ƒt!ƒg|_ n| oA|ii"p |ii"}|tj ot!|ƒ|i | is emptys
sError in
(scs tableDatastdatasget_datasdatasPmlTablescolwsrowhsrepeatsaligns TableStylesstylessts_widthswidths totalWidthsfrags spaceBefores spaceAftersaddStoryswarningslogs exceptions clearFragsselfsNone(sselfscstdatastsdata((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysendÓs,         (s__name__s __module__sstartsend(((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pys pisaTagTABLE™s 8s pisaTagTRcBstZd„Zd„ZRS(NcCs||i}|i}d|f}d|f}|i|||dƒ|ii p |i i |i _ d|_ |i igƒdS(Niiÿÿÿÿstr(scs tableDatastdatasrowsbeginsendsadd_cell_stylessselfsattrsvalignsfragsvAlignscolsdatasappend(sselfscsbeginsendstdatasrow((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysstartõs     cCs|i}|id7_dS(Ni(scs tableDatastdatasrow(sselfscstdata((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysends (s__name__s __module__sstartsend(((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pys pisaTagTRós s pisaTagTDcBstZd„Zd„ZRS(NcCs|iitj ot|iiƒ|i_n|iƒ|i ƒ|_ |i}|i }|i} |i} |i}|i}x^noVxN|iD]C\}}||jo ||jo|d7}|id7_q’q’WPqˆWd}d}||f} ||f}| o |d| d|df}n| o |d|d| df}n| |joœ|id| |fƒxƒt| d|ddƒD]b}xYt| d|ddƒD]<}|| djp|| djo|i||ƒq²q²WqWn|i|| |dƒ|dt|i ƒjo/|i |dt|i ƒt!ƒg|_ n| oA|ii"p |ii"}|tj ot!|ƒ|i | """ def start(self, c): c.addPara() if self.attr.name: c.addStory(NextPageTemplate(self.attr.name)) c.addStory(PageBreak()) class pisaTagPDFNEXTTEMPLATE(pisaTag): """ """ def start(self, c): c.addStory(NextPageTemplate(self.attr["name"])) class pisaTagPDFNEXTFRAME(pisaTag): """ """ def start(self, c): c.addPara() c.addStory(FrameBreak()) class pisaTagPDFSPACER(pisaTag): """ """ def start(self, c): c.addPara() c.addStory(Spacer(1, self.attr.height)) class pisaTagPDFPAGENUMBER(pisaTag): """ """ def start(self, c): c.frag.pageNumber = True c.addFrag(self.attr.example) c.frag.pageNumber = False class pisaTagPDFTOC(pisaTag): """ """ def start(self, c): c.addTOC() class pisaTagPDFFRAME(pisaTag): """ """ def start(self, c): attrs = self.attr name = attrs["name"] if name is None: name = "frame%d" % c.UID() x, y, w, h = attrs.box self.frame = Frame( x, y, w, h, id=name, leftPadding=0, rightPadding=0, bottomPadding=0, topPadding=0, showBoundary=attrs.border) self.static = False if self.attr.static: self.static = True c.addPara() self.story = c.swapStory() else: c.frameList.append(self.frame) def end(self, c): if self.static: c.addPara() self.frame.pisaStaticStory = c.story c.frameStaticList.append(self.frame) c.swapStory(self.story) class pisaTagPDFTEMPLATE(pisaTag): """ """ def start(self, c): attrs = self.attr #print attrs name = attrs["name"] c.frameList = [] c.frameStaticList = [] if c.templateList.has_key(name): self.warning("template '%s' has already been defined" % name) ''' self.oldpagesize = A4 # self._pagesize self._pagesize = PML_PAGESIZES[attrs.format] if attrs.orientation is not None: if attrs.orientation == "landscape": self._pagesize = landscape(self._pagesize) elif attrs.orientation == "portrait": self._pagesize = portrait(self._pagesize) ''' # self._drawing = PmlPageDrawing(self._pagesize) def end(self, c): attrs = self.attr name = attrs["name"] if len(c.frameList) <= 0: c.error("missing frame definitions for template") pt = PmlPageTemplate( id = name, frames = c.frameList, pagesize = A4, ) pt.pisaStaticList = c.frameStaticList pt.pisaBackgroundList = c.pisaBackgroundList pt.pisaBackground = self.attr.background # self._pagesize) # pt.pml_statics = self._statics # pt.pml_draw = self._draw # pt.pml_drawing = self._drawing # pt.pml_background = attrs.background # pt.pml_bgstory = self._bgstory c.templateList[name] = pt c.template = None c.frameList = [] c.frameStaticList = [] class pisaTagPDFFONT(pisaTag): """ """ def start(self, c): log.warn("PDF:FONT is deprecated! Use @font-face!") c.loadFont(self.attr.name, self.attr.src, self.attr.encoding) class pisaTagPDFBARCODE(pisaTag): """ """ def start(self, c): c.addPara() attr = self.attr bc = Standard39() bc.value = attr.value bc.barHeight = 0.5 * inch bc.lquiet = 0 # left padding bc.rquiet = 0 # left padding bc.hAlign = attr.align.upper() c.addStory(bc) c.addPara() PK¨“m8ÒY¬4•P•Psx/pisa3/pisa_tags.pyc;ò H!ØGc@sdZdZdZdkTdkTdklZdklZl Z l Z l Z dk l Z dkTdklZdklZd kZd kZd kZd fd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ d efd!„ƒYZ!d"efd#„ƒYZ"d$efd%„ƒYZ#d&efd'„ƒYZ$d(„Z%d)Z&hd*d+<d,e&<d-e&<d.e&<d/e%<d0e%<d1e%<d2e%<d3e%<d4e%<d5e%<d6e%<d7e%<d8e%<d9e%<d:e%<d;e%<d<e%<d=e%<d>e%<d?e% cCsH|iƒ|iio|it|iiƒƒn|itƒƒdS(N(scsaddParasselfsattrsnamesaddStorysNextPageTemplates PageBreak(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartês  (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFNEXTPAGEæs spisaTagPDFNEXTTEMPLATEcBstZdZd„ZRS(s& cCs|it|idƒƒdS(Nsname(scsaddStorysNextPageTemplatesselfsattr(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartôs(s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFNEXTTEMPLATEðs spisaTagPDFNEXTFRAMEcBstZdZd„ZRS(s# cCs|iƒ|itƒƒdS(N(scsaddParasaddStorys FrameBreak(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartüs (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFNEXTFRAMEøs spisaTagPDFSPACERcBstZdZd„ZRS(s" cCs*|iƒ|itd|iiƒƒdS(Ni(scsaddParasaddStorysSpacersselfsattrsheight(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFSPACERs spisaTagPDFPAGENUMBERcBstZdZd„ZRS(s' cCs/t|i_|i|iiƒt|i_dS(N( sTruescsfrags pageNumbersaddFragsselfsattrsexamplesFalse(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart s (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFPAGENUMBERs s pisaTagPDFTOCcBstZdZd„ZRS(s cCs|iƒdS(N(scsaddTOC(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts(s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagPDFTOCs spisaTagPDFFRAMEcBs tZdZd„Zd„ZRS(s- cCsÛ|i}|d}|tjod|iƒ}n|i\}}}}t ||||d|ddddddddd |i ƒ|_t|_|iio&t|_|iƒ|iƒ|_n|ii|iƒdS( Nsnamesframe%dsids leftPaddingis rightPaddings bottomPaddings topPaddings showBoundary(sselfsattrsattrssnamesNonescsUIDsboxsxsyswshsFramesbordersframesFalsesstaticsTruesaddParas swapStorysstorys frameListsappend(sselfscsnameshsattrsswsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts$       cCsN|io@|iƒ|i|i_|ii|iƒ|i |iƒndS(N( sselfsstaticscsaddParasstorysframespisaStaticStorysframeStaticListsappends swapStory(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend5s   (s__name__s __module__s__doc__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFFRAMEs  spisaTagPDFTEMPLATEcBs tZdZd„Zd„ZRS(sZ cCsQ|i}|d}g|_g|_|ii|ƒo|i d|ƒndS(Nsnames&template '%s' has already been defined( sselfsattrsattrssnamescs frameListsframeStaticLists templateListshas_keyswarning(sselfscsnamesattrs((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartBs     cCs«|i}|d}t|iƒdjo|idƒntd|d|idt ƒ}|i |_ |i |_ |ii|_||i| cCs6tidƒ|i|ii|ii|iiƒdS(Ns'PDF:FONT is deprecated! Use @font-face!( slogswarnscsloadFontsselfsattrsnamessrcsencoding(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartxs (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFFONTts spisaTagPDFBARCODEcBstZdZd„ZRS(s) cCst|iƒ|i}tƒ}|i|_dt|_d|_ d|_ |i i ƒ|_ |i|ƒ|iƒdS(Nf0.5i(scsaddParasselfsattrs Standard39sbcsvaluesinchs barHeightslquietsrquietsalignsuppershAlignsaddStory(sselfscsattrsbc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart€s        (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFBARCODE|s (8s __reversion__s __author__s__date__s pisa_utilspisa_reportlabs pisa_defaults DEFAULT_CSSsreportlab.platypus.paraparsers ParaParsersParaFragsps2ttsABagsreportlab.platypus.paragraphscleanBlockQuotedTextsreportlab.platypus.flowablessreportlab.lib.stylessParagraphStyles!reportlab.graphics.barcode.code39s Standard39spprintsossrespisaTags pisaTagTITLEs pisaTagSTYLEs pisaTagMETAs pisaTagSUPs pisaTagSUBspisaTagAspisaTagPs pisaTagDIVs pisaTagH1s pisaTagH2s pisaTagH3s pisaTagH4s pisaTagH5s pisaTagH6s listDecimals_bullets_list_style_types pisaTagULs pisaTagOLs pisaTagLIs pisaTagBRs pisaTagIMGs pisaTagHRspisaTagPDFNEXTPAGEspisaTagPDFNEXTTEMPLATEspisaTagPDFNEXTFRAMEspisaTagPDFSPACERspisaTagPDFPAGENUMBERs pisaTagPDFTOCspisaTagPDFFRAMEspisaTagPDFTEMPLATEspisaTagPDFFONTspisaTagPDFBARCODE(0spprints pisaTagMETAspisaTagPDFNEXTPAGEspisaTagPDFBARCODEspisaTagPDFSPACERs pisaTagTITLEs DEFAULT_CSSsps2tts_list_style_types Standard39spisaTags pisaTagULsParaFrags pisaTagSUPs pisaTagLIsres pisaTagSTYLEs listDecimals pisaTagDIVs pisaTagHRs pisaTagSUBs pisaTagPDFTOCsParagraphStylespisaTagPDFNEXTFRAMEsABags pisaTagIMGs __author__s ParaParserspisaTagPDFFRAMEs pisaTagH2s pisaTagH3s pisaTagBRs pisaTagH1s pisaTagH6s pisaTagH4s pisaTagH5spisaTagAspisaTagPDFPAGENUMBERscleanBlockQuotedTextsoss_bulletspisaTagPDFTEMPLATEs__date__spisaTagPs pisaTagOLspisaTagPDFFONTs __reversion__spisaTagPDFNEXTTEMPLATE((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys?s^         à   0  $8PK¨“m8ÒY¬4•P•Psx/pisa3/pisa_tags.pyo;ò H!ØGc@sdZdZdZdkTdkTdklZdklZl Z l Z l Z dk l Z dkTdklZdklZd kZd kZd kZd fd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ d efd!„ƒYZ!d"efd#„ƒYZ"d$efd%„ƒYZ#d&efd'„ƒYZ$d(„Z%d)Z&hd*d+<d,e&<d-e&<d.e&<d/e%<d0e%<d1e%<d2e%<d3e%<d4e%<d5e%<d6e%<d7e%<d8e%<d9e%<d:e%<d;e%<d<e%<d=e%<d>e%<d?e% cCsH|iƒ|iio|it|iiƒƒn|itƒƒdS(N(scsaddParasselfsattrsnamesaddStorysNextPageTemplates PageBreak(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartês  (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFNEXTPAGEæs spisaTagPDFNEXTTEMPLATEcBstZdZd„ZRS(s& cCs|it|idƒƒdS(Nsname(scsaddStorysNextPageTemplatesselfsattr(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartôs(s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFNEXTTEMPLATEðs spisaTagPDFNEXTFRAMEcBstZdZd„ZRS(s# cCs|iƒ|itƒƒdS(N(scsaddParasaddStorys FrameBreak(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartüs (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFNEXTFRAMEøs spisaTagPDFSPACERcBstZdZd„ZRS(s" cCs*|iƒ|itd|iiƒƒdS(Ni(scsaddParasaddStorysSpacersselfsattrsheight(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFSPACERs spisaTagPDFPAGENUMBERcBstZdZd„ZRS(s' cCs/t|i_|i|iiƒt|i_dS(N( sTruescsfrags pageNumbersaddFragsselfsattrsexamplesFalse(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart s (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFPAGENUMBERs s pisaTagPDFTOCcBstZdZd„ZRS(s cCs|iƒdS(N(scsaddTOC(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts(s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagPDFTOCs spisaTagPDFFRAMEcBs tZdZd„Zd„ZRS(s- cCsÛ|i}|d}|tjod|iƒ}n|i\}}}}t ||||d|ddddddddd |i ƒ|_t|_|iio&t|_|iƒ|iƒ|_n|ii|iƒdS( Nsnamesframe%dsids leftPaddingis rightPaddings bottomPaddings topPaddings showBoundary(sselfsattrsattrssnamesNonescsUIDsboxsxsyswshsFramesbordersframesFalsesstaticsTruesaddParas swapStorysstorys frameListsappend(sselfscsnameshsattrsswsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts$       cCsN|io@|iƒ|i|i_|ii|iƒ|i |iƒndS(N( sselfsstaticscsaddParasstorysframespisaStaticStorysframeStaticListsappends swapStory(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend5s   (s__name__s __module__s__doc__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFFRAMEs  spisaTagPDFTEMPLATEcBs tZdZd„Zd„ZRS(sZ cCsQ|i}|d}g|_g|_|ii|ƒo|i d|ƒndS(Nsnames&template '%s' has already been defined( sselfsattrsattrssnamescs frameListsframeStaticLists templateListshas_keyswarning(sselfscsnamesattrs((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartBs     cCs«|i}|d}t|iƒdjo|idƒntd|d|idt ƒ}|i |_ |i |_ |ii|_||i| cCs6tidƒ|i|ii|ii|iiƒdS(Ns'PDF:FONT is deprecated! Use @font-face!( slogswarnscsloadFontsselfsattrsnamessrcsencoding(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartxs (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFFONTts spisaTagPDFBARCODEcBstZdZd„ZRS(s) cCst|iƒ|i}tƒ}|i|_dt|_d|_ d|_ |i i ƒ|_ |i|ƒ|iƒdS(Nf0.5i(scsaddParasselfsattrs Standard39sbcsvaluesinchs barHeightslquietsrquietsalignsuppershAlignsaddStory(sselfscsattrsbc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart€s        (s__name__s __module__s__doc__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFBARCODE|s (8s __reversion__s __author__s__date__s pisa_utilspisa_reportlabs pisa_defaults DEFAULT_CSSsreportlab.platypus.paraparsers ParaParsersParaFragsps2ttsABagsreportlab.platypus.paragraphscleanBlockQuotedTextsreportlab.platypus.flowablessreportlab.lib.stylessParagraphStyles!reportlab.graphics.barcode.code39s Standard39spprintsossrespisaTags pisaTagTITLEs pisaTagSTYLEs pisaTagMETAs pisaTagSUPs pisaTagSUBspisaTagAspisaTagPs pisaTagDIVs pisaTagH1s pisaTagH2s pisaTagH3s pisaTagH4s pisaTagH5s pisaTagH6s listDecimals_bullets_list_style_types pisaTagULs pisaTagOLs pisaTagLIs pisaTagBRs pisaTagIMGs pisaTagHRspisaTagPDFNEXTPAGEspisaTagPDFNEXTTEMPLATEspisaTagPDFNEXTFRAMEspisaTagPDFSPACERspisaTagPDFPAGENUMBERs pisaTagPDFTOCspisaTagPDFFRAMEspisaTagPDFTEMPLATEspisaTagPDFFONTspisaTagPDFBARCODE(0spprints pisaTagMETAspisaTagPDFNEXTPAGEspisaTagPDFBARCODEspisaTagPDFSPACERs pisaTagTITLEs DEFAULT_CSSsps2tts_list_style_types Standard39spisaTags pisaTagULsParaFrags pisaTagSUPs pisaTagLIsres pisaTagSTYLEs listDecimals pisaTagDIVs pisaTagHRs pisaTagSUBs pisaTagPDFTOCsParagraphStylespisaTagPDFNEXTFRAMEsABags pisaTagIMGs __author__s ParaParserspisaTagPDFFRAMEs pisaTagH2s pisaTagH3s pisaTagBRs pisaTagH1s pisaTagH6s pisaTagH4s pisaTagH5spisaTagAspisaTagPDFPAGENUMBERscleanBlockQuotedTextsoss_bulletspisaTagPDFTEMPLATEs__date__spisaTagPs pisaTagOLspisaTagPDFFONTs __reversion__spisaTagPDFNEXTTEMPLATE((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys?s^         à   0  $8PKÔ‚l82R®®sx/pisa3/pisa_turbogears.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 20 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $" from turbogears.decorator import weak_signature_decorator import sx.pisa3 as pisa import cStringIO as StringIO import cherrypy def to_pdf(filename=None, content_type="application/pdf"): def entangle(func): def decorated(func, *args, **kw): output = func(*args, **kw) dst = StringIO.StringIO() result = pisa.CreatePDF( StringIO.StringIO(output), dst ) if not result.err: cherrypy.response.headers["Content-Type"] = content_type if filename: cherrypy.response.headers["Content-Disposition"] = "attachment; filename=" + filename output = dst.getvalue() return output return decorated return weak_signature_decorator(entangle) topdf = to_pdf PK¨“m8ܤ¨sx/pisa3/pisa_turbogears.pyc;ò @õ×Gc@sVdZdZdZdklZdkiZdkZ dk Z e dd„Z e Z dS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(sweak_signature_decoratorNsapplication/pdfcs‡‡d†}t|ƒSdS(Ncs‡‡d†}|SdS(Ncsˆ|||Ž}tiƒ}titi|ƒ|ƒ}|i o?ˆt i i d<ˆodˆt i i d="1"): raise ImportError("Reportlab Version 2.1+ is needed!") log = logging.getLogger("ho.pisa") try: import pyPdf except: pyPdf = None try: from reportlab.graphics import renderPM except: renderPM = None try: from reportlab.graphics import renderSVG except: renderSVG = None def ErrorMsg(): """ Helper to get a nice traceback as string """ import traceback, sys, cgi type = value = tb = limit = None type, value, tb = sys.exc_info() list = traceback.format_tb(tb, limit) + traceback.format_exception_only(type, value) return "Traceback (innermost last):\n" + "%-20s %s" % ( string.join(list[:-1], ""), list[-1]) def toList(value): if type(value) not in (types.ListType, types.TupleType): return [value] return list(value) def _toColor(arg, default=None): '''try to map an arbitrary arg to a color instance''' if isinstance(arg, Color): return arg tArg = type(arg) if tArg in (ListType, TupleType): assert 3<=len(arg)<=4, 'Can only convert 3 and 4 sequences to color' assert 0<=min(arg) and max(arg)<=1 return len(arg)==3 and Color(arg[0], arg[1], arg[2]) or CMYKColor(arg[0], arg[1], arg[2], arg[3]) elif tArg == StringType: C = getAllNamedColors() s = string.lower(arg) if C.has_key(s): return C[s] try: return toColor(eval(arg)) except: pass try: return HexColor(arg) except: if default is None: raise ValueError('Invalid color value %r' % arg) return default def getColor(value, default=None): " Convert to color value " try: original = value if isinstance(value, Color): return value value = str(value).lower() if value=="transparent" or value=="none": return default if value.startswith("#") and len(value)==4: value = "#" + value[1] + value[1] + value[2] + value[2] + value[3] + value[3] # XXX Throws illegal in 2.1 e.g. toColor('none'), # therefore we have a workaround here return _toColor(value) except ValueError, e: log.warn("Unknown color %r", original) return default def getBorderStyle(value): if value and (str(value).lower() not in ("none", "hidden")): return value return None mm = cm / 10.0 dpi96 = (1.0 / 96.0 * inch) _absSizeTable = { "xx-small" : 3./5., "x-small": 3./4., "small": 8./9., "medium": 1./1., "large": 6./5., "x-large": 3./2., "xx-large": 2./1., "xxx-large": 3./1., "larger": 1.25, "smaller": 0.75, } def getSize(value, relative=0): """ Converts strings to standard sizes """ try: original = value if value is None: return relative elif type(value) is types.FloatType: return value elif type(value) is types.IntType: return float(value) elif type(value)==types.TupleType: value = "".join(value) value = str(value).strip().lower().replace(",", ".") if value[-2:]=='cm': return float(value[:-2].strip()) * cm elif value[-2:]=='mm': return (float(value[:-2].strip()) * mm) # 1mm = 0.1cm elif value[-2:]=='in': return float(value[:-2].strip()) * inch # 1pt == 1/72inch elif value[-2:]=='inch': return float(value[:-4].strip()) * inch # 1pt == 1/72inch elif value[-2:]=='pt': return float(value[:-2].strip()) elif value[-2:]=='pc': return float(value[:-2].strip()) * 12.0 # 1pt == 12pt elif value[-2:]=='px': return float(value[:-2].strip()) * dpi96 # XXX W3C says, use 96pdi http://www.w3.org/TR/CSS21/syndata.html#length-units elif value[-1:]=='i': # 1pt == 1/72inch return float(value[:-1].strip()) * inch elif value[-2:]=='em': # XXX return (float(value[:-2].strip()) * relative) # 1em = 1 * fontSize elif value[-2:]=='ex': # XXX return (float(value[:-2].strip()) * 2.0) # 1ex = 1/2 fontSize elif value[-1:]=='%': # print "%", value, relative, (relative * float(value[:-1].strip())) / 100.0 return (relative * float(value[:-1].strip())) / 100.0 # 1% = (fontSize * 1) / 100 elif value in ("normal", "inherit"): return relative elif value in ("none", "0", "auto"): return 0.0 elif _absSizeTable.has_key(value): return relative * _absSizeTable[value] return float(value) except Exception, e: log.exception("getSize %r %r", original, relative) # print "ERROR getSize", repr(value), repr(value), e return 0.0 def getCoords(x, y, w, h, pagesize): """ As a stupid programmer I like to use the upper left corner of the document as the 0,0 coords therefore we need to do some fancy calculations """ #~ print pagesize ax, ay = pagesize if x < 0: x = ax + x if y < 0: y = ay + y if w != None and h != None: if w <= 0: w = (ax - x + w) if h <= 0: h = (ay - y + h) return x, (ay - y - h), w, h return x, (ay - y) def getBox(s, pagesize): """ Parse sizes by corners in the form: The last to values with negative values are interpreted as offsets form the right and lower border. """ l = s.split() if len(l)<>4: raise Exception, "box not defined right way" x, y, w, h = map(getSize, l) return getCoords(x, y, w, h, pagesize) def getPos(s, pagesize): """ Pair of coordinates """ l = string.split(s) if len(l)<>2: raise Exception, "position not defined right way" x, y = map(getSize, l) return getCoords(x, y, None, None, pagesize) def getBool(s): " Is it a boolean? " return str(s).lower() in ("y", "yes", "1", "true") _uid = 0 def getUID(): " Unique ID " global _uid _uid += 1 return str(_uid) _alignments = { "left": TA_LEFT, "center": TA_CENTER, "middle": TA_CENTER, "right": TA_RIGHT, "justify": TA_JUSTIFY, } def getAlign(value): return _alignments.get(value.lower(), TA_LEFT) def getVAlign(value): # Unused return value.upper() PK¨“m8Hý¯ÞF%F%sx/pisa3/pisa_util.pyc;ò %+ÙGc@s¤dZdZdZdklZlZdkTdkTdkTdk Tdk l Z dk Tdk lZdkZdkZdkZdkZdkZdkZdkZdkZeidd joeid d j oed ƒ‚neid ƒZy dkZWn eZnXydklZWn eZnXydklZWn eZnXd„Z d„Z!ed„Z"ed„Z#d„Z$edZ%ddeZ&hddd<ddd<ddd<d dd<d!d"d<d#dd$<d%d$d<d&dd<d'd(<d)d*s cCst|tƒo|Snt|ƒ}|ttfjo´dt|ƒjo djnp td‚dt |ƒjot |ƒdjpt‚t|ƒdjot|d|d|dƒp#t |d|d|d|dƒSnd|t joVt ƒ}ti|ƒ}|i|ƒo ||Snytt|ƒƒSWqNqNXnyt|ƒSWn,|tjotd|ƒ‚n|SnXdS( s/try to map an arbitrary arg to a color instanceiis+Can only convert 3 and 4 sequences to coloriiisInvalid color value %rN(s isinstancesargsColorstypestArgsListTypes TupleTypeslensAssertionErrorsminsmaxs CMYKColors StringTypesgetAllNamedColorssCsstringslowerssshas_keystoColorsevalsHexColorsdefaultsNones ValueError(sargsdefaultstArgsCss((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys_toColorCs. .-Y    cCsíy½|}t|tƒo|Snt|ƒiƒ}|djp |djo|Sn|idƒot|ƒdjo:d|d|d|d|d|d|d}nt |ƒSWn%t j o}t i d|ƒnX|Sd S( s Convert to color value s transparentsnones#iiiisUnknown color %rN(svaluesoriginals isinstancesColorsstrslowersdefaults startswithslens_toColors ValueErrorseslogswarn(svaluesdefaultsesoriginal((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetColorZs#:cCs6|ot|ƒiƒddfjo|SntSdS(Nsnoneshidden(svaluesstrslowersNone(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBorderStylels&f10.0f1.0f96.0sxx-smallf3.0f5.0sx-smallf4.0ssmallf8.0f9.0smediumslargef6.0sx-largef2.0sxx-larges xxx-largeslargerf1.25ssmallerf0.75cCs3y|}|tjo|Snlt|ƒtijo|SnNt|ƒtijot|ƒSn*t|ƒti jodi |ƒ}nt |ƒi ƒi ƒiddƒ}|ddjot|d i ƒƒtSn|ddjot|d i ƒƒtSnï|ddjot|d i ƒƒtSnÂ|ddjot|d i ƒƒtSn•|dd jot|d i ƒƒSnl|dd jot|d i ƒƒd Sn?|dd jot|d i ƒƒtSn|ddjot|d i ƒƒtSnå|ddjot|d i ƒƒ|Sn¸|ddjot|d i ƒƒdSn‹|ddjo |t|d i ƒƒdSnZ|ddfjo|Sn?|dddfjodSn!ti|ƒo|t|Snt|ƒSWn,tj o }tid||ƒdSnXdS(s/ Converts strings to standard sizes ss,s.iþÿÿÿscmsmmsinsinchiüÿÿÿsptspcf12.0spxiÿÿÿÿsisemsexf2.0s%f100.0snormalsinheritsnones0sautof0.0s getSize %r %rN(svaluesoriginalsNonesrelativestypestypess FloatTypesIntTypesfloats TupleTypesjoinsstrsstripslowersreplacescmsmmsinchsdpi96s _absSizeTableshas_keys Exceptionseslogs exception(svaluesrelativesesoriginal((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetSizesX $ cCsÈ|\}}|djo||}n|djo||}n|tjo |tjoZ|djo|||}n|djo|||}n||||||fSn|||fSdS(sž As a stupid programmer I like to use the upper left corner of the document as the 0,0 coords therefore we need to do some fancy calculations iN(spagesizesaxsaysxsyswsNonesh(sxsyswshspagesizesaysax((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys getCoords´s     cCsa|iƒ}t|ƒdjo td‚ntt|ƒ\}}}}t |||||ƒSdS(s Parse sizes by corners in the form: The last to values with negative values are interpreted as offsets form the right and lower border. isbox not defined right wayN( ssssplitslslens ExceptionsmapsgetSizesxsyswshs getCoordsspagesize(ssspagesizeshslswsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBoxÈs   cCs^ti|ƒ}t|ƒdjo td‚ntt|ƒ\}}t ||t t |ƒSdS(s Pair of coordinates isposition not defined right wayN( sstringssplitssslslens ExceptionsmapsgetSizesxsys getCoordssNonespagesize(ssspagesizeslsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetPosÕs  cCs&t|ƒiƒddddfjSdS(s Is it a boolean? sysyess1strueN(sstrssslower(ss((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBoolßscCstd7attƒSdS(s Unique ID iN(s_uidsstr(((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetUIDäs sleftscentersmiddlesrightsjustifycCsti|iƒtƒSdS(N(s _alignmentssgetsvalueslowersTA_LEFT(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetAlignòscCs|iƒSdS(N(svaluesupper(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys getVAlignõs(6s __reversion__s __author__s__date__sreportlab.lib.unitssinchscmsreportlab.lib.stylessreportlab.lib.enumssreportlab.lib.colorssreportlab.lib.pagesizessreportlab.pdfbases pdfmetricssreportlab.platypussreportlab.platypus.flowablessFlowables reportlabscopystypessossos.pathspprintssyssloggingsVersions ImportErrors getLoggerslogspyPdfsNonesreportlab.graphicssrenderPMs renderSVGsErrorMsgstoLists_toColorsgetColorsgetBorderStylesmmsdpi96s _absSizeTablesgetSizes getCoordssgetBoxsgetPossgetBools_uidsgetUIDsTA_LEFTs TA_CENTERsTA_RIGHTs TA_JUSTIFYs _alignmentssgetAligns getVAlign(#s __reversion__sgetPosscms getCoordssFlowablespyPdfsgetSizesdpi96s_toColors _absSizeTablestoLists reportlabsgetBorderStyleslogspprintsrenderPMsinchsgetUIDs renderSVGsgetColorsgetBools _alignmentss __author__ssyss pdfmetricsscopystypessgetAlignsloggingsmmsErrorMsgs getVAligns__date__sgetBoxsos((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys?sf          )         € 3   3 PK¨“m8ÇÖe“$“$sx/pisa3/pisa_util.pyo;ò %+ÙGc@s¤dZdZdZdklZlZdkTdkTdkTdk Tdk l Z dk Tdk lZdkZdkZdkZdkZdkZdkZdkZdkZeidd joeid d j oed ƒ‚neid ƒZy dkZWn eZnXydklZWn eZnXydklZWn eZnXd„Z d„Z!ed„Z"ed„Z#d„Z$edZ%ddeZ&hddd<ddd<ddd<d dd<d!d"d<d#dd$<d%d$d<d&dd<d'd(<d)d*s cCs4t|tƒo|Snt|ƒ}|ttfjoYt|ƒdjot|d|d|dƒp#t|d|d|d|dƒSnd|t joVt ƒ}t i |ƒ}|i|ƒo ||Snytt|ƒƒSWqóqóXnyt|ƒSWn,|tjotd|ƒ‚n|SnXdS(s/try to map an arbitrary arg to a color instanceiiiisInvalid color value %rN(s isinstancesargsColorstypestArgsListTypes TupleTypeslens CMYKColors StringTypesgetAllNamedColorssCsstringslowerssshas_keystoColorsevalsHexColorsdefaultsNones ValueError(sargsdefaultsCstArgss((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys_toColorCs. Y    cCsíy½|}t|tƒo|Snt|ƒiƒ}|djp |djo|Sn|idƒot|ƒdjo:d|d|d|d|d|d|d}nt |ƒSWn%t j o}t i d|ƒnX|Sd S( s Convert to color value s transparentsnones#iiiisUnknown color %rN(svaluesoriginals isinstancesColorsstrslowersdefaults startswithslens_toColors ValueErrorseslogswarn(svaluesdefaultsesoriginal((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetColorZs#:cCs6|ot|ƒiƒddfjo|SntSdS(Nsnoneshidden(svaluesstrslowersNone(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBorderStylels&f10.0f1.0f96.0sxx-smallf3.0f5.0sx-smallf4.0ssmallf8.0f9.0smediumslargef6.0sx-largef2.0sxx-larges xxx-largeslargerf1.25ssmallerf0.75cCs3y|}|tjo|Snlt|ƒtijo|SnNt|ƒtijot|ƒSn*t|ƒti jodi |ƒ}nt |ƒi ƒi ƒiddƒ}|ddjot|d i ƒƒtSn|ddjot|d i ƒƒtSnï|ddjot|d i ƒƒtSnÂ|ddjot|d i ƒƒtSn•|dd jot|d i ƒƒSnl|dd jot|d i ƒƒd Sn?|dd jot|d i ƒƒtSn|ddjot|d i ƒƒtSnå|ddjot|d i ƒƒ|Sn¸|ddjot|d i ƒƒdSn‹|ddjo |t|d i ƒƒdSnZ|ddfjo|Sn?|dddfjodSn!ti|ƒo|t|Snt|ƒSWn,tj o }tid||ƒdSnXdS(s/ Converts strings to standard sizes ss,s.iþÿÿÿscmsmmsinsinchiüÿÿÿsptspcf12.0spxiÿÿÿÿsisemsexf2.0s%f100.0snormalsinheritsnones0sautof0.0s getSize %r %rN(svaluesoriginalsNonesrelativestypestypess FloatTypesIntTypesfloats TupleTypesjoinsstrsstripslowersreplacescmsmmsinchsdpi96s _absSizeTableshas_keys Exceptionseslogs exception(svaluesrelativesesoriginal((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetSizesX $ cCsÈ|\}}|djo||}n|djo||}n|tjo |tjoZ|djo|||}n|djo|||}n||||||fSn|||fSdS(sž As a stupid programmer I like to use the upper left corner of the document as the 0,0 coords therefore we need to do some fancy calculations iN(spagesizesaxsaysxsyswsNonesh(sxsyswshspagesizesaysax((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys getCoords´s     cCsa|iƒ}t|ƒdjo td‚ntt|ƒ\}}}}t |||||ƒSdS(s Parse sizes by corners in the form: The last to values with negative values are interpreted as offsets form the right and lower border. isbox not defined right wayN( ssssplitslslens ExceptionsmapsgetSizesxsyswshs getCoordsspagesize(ssspagesizeshslswsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBoxÈs   cCs^ti|ƒ}t|ƒdjo td‚ntt|ƒ\}}t ||t t |ƒSdS(s Pair of coordinates isposition not defined right wayN( sstringssplitssslslens ExceptionsmapsgetSizesxsys getCoordssNonespagesize(ssspagesizeslsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetPosÕs  cCs&t|ƒiƒddddfjSdS(s Is it a boolean? sysyess1strueN(sstrssslower(ss((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBoolßscCstd7attƒSdS(s Unique ID iN(s_uidsstr(((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetUIDäs sleftscentersmiddlesrightsjustifycCsti|iƒtƒSdS(N(s _alignmentssgetsvalueslowersTA_LEFT(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetAlignòscCs|iƒSdS(N(svaluesupper(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys getVAlignõs(6s __reversion__s __author__s__date__sreportlab.lib.unitssinchscmsreportlab.lib.stylessreportlab.lib.enumssreportlab.lib.colorssreportlab.lib.pagesizessreportlab.pdfbases pdfmetricssreportlab.platypussreportlab.platypus.flowablessFlowables reportlabscopystypessossos.pathspprintssyssloggingsVersions ImportErrors getLoggerslogspyPdfsNonesreportlab.graphicssrenderPMs renderSVGsErrorMsgstoLists_toColorsgetColorsgetBorderStylesmmsdpi96s _absSizeTablesgetSizes getCoordssgetBoxsgetPossgetBools_uidsgetUIDsTA_LEFTs TA_CENTERsTA_RIGHTs TA_JUSTIFYs _alignmentssgetAligns getVAlign(#s __reversion__sgetPosscms getCoordssFlowablespyPdfsgetSizesdpi96s_toColors _absSizeTablestoLists reportlabsgetBorderStyleslogspprintsrenderPMsinchsgetUIDs renderSVGsgetColorsgetBools _alignmentss __author__ssyss pdfmetricsscopystypessgetAlignsloggingsmmsErrorMsgs getVAligns__date__sgetBoxsos((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys?sf          )         € 3   3 PK¤“m8«zŠŠsx/pisa3/pisa_version.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2008 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 171 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2008-03-13 18:35:28 +0100 (Do, 13 Mrz 2008) $" __version__ = VERSION = "VERSION{3.0.15}VERSION"[8:-8] __build__ = BUILD = "BUILD{2008-03-13 18:29}BUILD"[6:-6] VERSION_STR = "pisa %s (Build %s)\n(c) Dirk Holtwick , Germany\nWebsite http:www.htmltopdf.org" % ( VERSION, BUILD, ) PK¨“m8g™´ÑÑsx/pisa3/pisa_version.pyc;ò ddÙGc@sHdZdZdZddd!ZZddd!ZZd eefZd S( s$Revision: 171 $s$Author: holtwick $s4$Date: 2008-03-13 18:35:28 +0100 (Do, 13 Mrz 2008) $sVERSION{3.0.15}VERSIONiiøÿÿÿsBUILD{2008-03-13 18:29}BUILDiiúÿÿÿsfpisa %s (Build %s) (c) Dirk Holtwick , Germany Website http:www.htmltopdf.orgN(s __reversion__s __author__s__date__s __version__sVERSIONs __build__sBUILDs VERSION_STR(s __build__s __author__s__date__sVERSIONsBUILDs VERSION_STRs __version__s __reversion__((s.build\bdist.win32\egg\sx\pisa3\pisa_version.pys?s PK¨“m8g™´ÑÑsx/pisa3/pisa_version.pyo;ò ddÙGc@sHdZdZdZddd!ZZddd!ZZd eefZd S( s$Revision: 171 $s$Author: holtwick $s4$Date: 2008-03-13 18:35:28 +0100 (Do, 13 Mrz 2008) $sVERSION{3.0.15}VERSIONiiøÿÿÿsBUILD{2008-03-13 18:29}BUILDiiúÿÿÿsfpisa %s (Build %s) (c) Dirk Holtwick , Germany Website http:www.htmltopdf.orgN(s __reversion__s __author__s__date__s __version__sVERSIONs __build__sBUILDs VERSION_STR(s __build__s __author__s__date__sVERSIONsBUILDs VERSION_STRs __version__s __reversion__((s.build\bdist.win32\egg\sx\pisa3\pisa_version.pys?s PK2„l8õE Tžžsx/pisa3/__init__.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 160 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2008-03-12 16:40:03 +0100 (Mi, 12 Mrz 2008) $" from pisa import * __version__ = VERSIONPK¨“m8P—AL££sx/pisa3/__init__.pyc;ò Ð÷×Gc@s#dZdZdZdkTeZdS(s$Revision: 160 $s$Author: holtwick $s4$Date: 2008-03-12 16:40:03 +0100 (Mi, 12 Mrz 2008) $(s*N(s __reversion__s __author__s__date__spisasVERSIONs __version__(s__date__s __version__s __reversion__s __author__((s*build\bdist.win32\egg\sx\pisa3\__init__.pys?sPK¨“m8P—AL££sx/pisa3/__init__.pyo;ò Ð÷×Gc@s#dZdZdZdkTeZdS(s$Revision: 160 $s$Author: holtwick $s4$Date: 2008-03-12 16:40:03 +0100 (Mi, 12 Mrz 2008) $(s*N(s __reversion__s __author__s__date__spisasVERSIONs __version__(s__date__s __version__s __reversion__s __author__((s*build\bdist.win32\egg\sx\pisa3\__init__.pys?sPK¡E)8 5ú1g1g sx/w3c/css.py#!/usr/bin/env python ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ##~ Copyright (C) 2002-2004 TechGame Networks, LLC. ##~ ##~ This library is free software; you can redistribute it and/or ##~ modify it under the terms of the BSD style License as found in the ##~ LICENSE file included with this distribution. ## ## Modified by Dirk Holtwick , 2007 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """CSS-2.1 engine Primary classes: * CSSElementInterfaceAbstract Provide a concrete implementation for the XML element model used. * CSSCascadeStrategy Implements the CSS-2.1 engine's attribute lookup rules. * CSSParser Parses CSS source forms into usable results using CSSBuilder and CSSMutableSelector. You may want to override parseExternal() * CSSBuilder (and CSSMutableSelector) A concrete implementation for cssParser.CSSBuilderAbstract (and cssParser.CSSSelectorAbstract) to provide usable results to CSSParser requests. Dependencies: python 2.3 (or greater) sets, cssParser, re (via cssParser) """ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Imports #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ import copy import sets import cssParser import cssSpecial #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Constants / Variables / Etc. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CSSParseError = cssParser.CSSParseError #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Definitions #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSElementInterfaceAbstract(object): def getAttr(self, name, default=NotImplemented): raise NotImplementedError('Subclass responsibility') def getIdAttr(self): return self.getAttr('id', '') def getClassAttr(self): return self.getAttr('class', '') def getInlineStyle(self): raise NotImplementedError('Subclass responsibility') def matchesNode(self): raise NotImplementedError('Subclass responsibility') def inPseudoState(self, name, params=()): raise NotImplementedError('Subclass responsibility') def iterXMLParents(self): """Results must be compatible with CSSElementInterfaceAbstract""" raise NotImplementedError('Subclass responsibility') def getPreviousSibling(self): raise NotImplementedError('Subclass responsibility') #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSCascadeStrategy(object): author = None user = None userAgenr = None def __init__(self, author=None, user=None, userAgent=None): if author is not None: self.author = author if user is not None: self.user = user if userAgent is not None: self.userAgenr = userAgent def copyWithUpdate(self, author=None, user=None, userAgent=None): if author is None: author = self.author if user is None: user = self.user if userAgent is None: userAgent = self.userAgenr return self.__class__(author, user, userAgent) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def iterCSSRulesets(self, inline=None): if self.userAgenr is not None: yield self.userAgenr[0] yield self.userAgenr[1] if self.user is not None: yield self.user[0] if self.author is not None: yield self.author[0] yield self.author[1] if inline: yield inline[0] yield inline[1] if self.user is not None: yield self.user[1] #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def findStyleFor(self, element, attrName, default=NotImplemented): """Attempts to find the style setting for attrName in the CSSRulesets. Note: This method does not attempt to resolve rules that return "inherited", "default", or values that have units (including "%"). This is left up to the client app to re-query the CSS in order to implement these semantics. """ rule = self.findCSSRulesFor(element, attrName) return self._extractStyleForRule(rule, attrName, default) def findStylesForEach(self, element, attrNames, default=NotImplemented): """Attempts to find the style setting for attrName in the CSSRulesets. Note: This method does not attempt to resolve rules that return "inherited", "default", or values that have units (including "%"). This is left up to the client app to re-query the CSS in order to implement these semantics. """ rules = self.findCSSRulesForEach(element, attrNames) return [(attrName, self._extractStyleForRule(rule, attrName, default)) for attrName, rule in rules.iteritems()] def findCSSRulesFor(self, element, attrName): rules = [] inline = element.getInlineStyle() for ruleset in self.iterCSSRulesets(inline): rules += ruleset.findCSSRuleFor(element, attrName) rules.sort() return rules def findCSSRulesForEach(self, element, attrNames): rules = dict([(name, []) for name in attrNames]) inline = element.getInlineStyle() for ruleset in self.iterCSSRulesets(inline): for attrName, attrRules in rules.iteritems(): attrRules += ruleset.findCSSRuleFor(element, attrName) for attrRules in rules.itervalues(): attrRules.sort() return rules #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def _extractStyleForRule(self, rule, attrName, default=NotImplemented): if rule: # rule is packed in a list to differentiate from "no rule" vs "rule # whose value evalutates as False" style = rule[-1][1] return style[attrName] elif default is not NotImplemented: return default else: raise LookupError("Could not find style for '%s' in %r" % (attrName, rule)) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ CSS Selectors #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSSelectorBase(object): inline = False _hash = None _specificity = None def __init__(self, completeName='*'): if not isinstance(completeName, tuple): completeName = (None, '*', completeName) self.completeName = completeName def _updateHash(self): self._hash = hash((self.fullName, self.specificity(), self.qualifiers)) def __hash__(self): if self._hash is None: return object.__hash__(self) else: return self._hash def getNSPrefix(self): return self.completeName[0] nsPrefix = property(getNSPrefix) def getName(self): return self.completeName[2] name = property(getName) def getNamespace(self): return self.completeName[1] namespace = property(getNamespace) def getFullName(self): return self.completeName[1:3] fullName = property(getFullName) def __repr__(self): strArgs = (self.__class__.__name__,)+self.specificity()+(self.asString(),) return '<%s %d:%d:%d:%d %s >' % strArgs def __str__(self): return self.asString() def __cmp__(self, other): result = cmp(self.specificity(), other.specificity()) if result != 0: return result result = cmp(self.fullName, other.fullName) if result != 0: return result result = cmp(self.qualifiers, other.qualifiers) return result def specificity(self): if self._specificity is None: self._specificity = self._calcSpecificity() return self._specificity def _calcSpecificity(self): """from http://www.w3.org/TR/CSS21/cascade.html#specificity""" hashCount = 0 qualifierCount = 0 elementCount = int(self.name != '*') for q in self.qualifiers: if q.isHash(): hashCount += 1 elif q.isClass(): qualifierCount += 1 elif q.isAttr(): qualifierCount += 1 elif q.isPseudo(): elementCount += 1 elif q.isCombiner(): i,h,q,e = q.selector.specificity() hashCount += h qualifierCount += q elementCount += e return self.inline, hashCount, qualifierCount, elementCount def matches(self, element=None): if element is None: return False if not element.matchesNode(self.fullName): return False for qualifier in self.qualifiers: if not qualifier.matches(element): return False else: return True def asString(self): result = [] if self.nsPrefix is not None: result.append('%s|%s' % (self.nsPrefix, self.name)) else: result.append(self.name) for q in self.qualifiers: if q.isCombiner(): result.insert(0, q.asString()) else: result.append(q.asString()) return ''.join(result) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSInlineSelector(CSSSelectorBase): inline = True #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSMutableSelector(CSSSelectorBase, cssParser.CSSSelectorAbstract): qualifiers = [] def asImmutable(self): return CSSImmutableSelector(self.completeName, [q.asImmutable() for q in self.qualifiers]) def combineSelectors(klass, selectorA, op, selectorB): selectorB.addCombination(op, selectorA) return selectorB combineSelectors = classmethod(combineSelectors) def addCombination(self, op, other): self._addQualifier(CSSSelectorCombinationQualifier(op, other)) def addHashId(self, hashId): self._addQualifier(CSSSelectorHashQualifier(hashId)) def addClass(self, class_): self._addQualifier(CSSSelectorClassQualifier(class_)) def addAttribute(self, attrName): self._addQualifier(CSSSelectorAttributeQualifier(attrName)) def addAttributeOperation(self, attrName, op, attrValue): self._addQualifier(CSSSelectorAttributeQualifier(attrName, op, attrValue)) def addPseudo(self, name): self._addQualifier(CSSSelectorPseudoQualifier(name)) def addPseudoFunction(self, name, params): self._addQualifier(CSSSelectorPseudoQualifier(name, params)) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def _addQualifier(self, qualifier): if self.qualifiers: self.qualifiers.append(qualifier) else: self.qualifiers = [qualifier] #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSImmutableSelector(CSSSelectorBase): def __init__(self, completeName='*', qualifiers=()): # print completeName, qualifiers self.qualifiers = tuple(qualifiers) CSSSelectorBase.__init__(self, completeName) self._updateHash() def fromSelector(klass, selector): return klass(selector.completeName, selector.qualifiers) fromSelector = classmethod(fromSelector) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ CSS Selector Qualifiers -- see CSSImmutableSelector #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSSelectorQualifierBase(object): def isHash(self): return False def isClass(self): return False def isAttr(self): return False def isPseudo(self): return False def isCombiner(self): return False def asImmutable(self): return self def __str__(self): return self.asString() class CSSSelectorHashQualifier(CSSSelectorQualifierBase): def __init__(self, hashId): self.hashId = hashId def isHash(self): return True def __hash__(self): return hash((self.hashId,)) def asString(self): return '#'+self.hashId def matches(self, element): return element.getIdAttr() == self.hashId class CSSSelectorClassQualifier(CSSSelectorQualifierBase): def __init__(self, classId): self.classId = classId def isClass(self): return True def __hash__(self): return hash((self.classId,)) def asString(self): return '.'+self.classId def matches(self, element): return self.classId in element.getClassAttr().split() class CSSSelectorAttributeQualifier(CSSSelectorQualifierBase): name, op, value = None, None, NotImplemented def __init__(self, attrName, op=None, attrValue=NotImplemented): self.name = attrName if op is not self.op: self.op = op if attrValue is not self.value: self.value = attrValue def isAttr(self): return True def __hash__(self): return hash((self.name, self.op, self.value)) def asString(self): if self.value is NotImplemented: return '[%s]' % (self.name,) else: return '[%s%s%s]' % (self.name, self.op, self.value) def matches(self, element): op = self.op if op is None: return element.getAttr(self.name, NotImplemented) != NotImplemented elif op == '=': return self.value == element.getAttr(self.name, NotImplemented) elif op == '~=': return self.value in element.getAttr(self.name, '').split() elif op == '|=': return self.value in element.getAttr(self.name, '').split('-') else: raise RuntimeError("Unknown operator %r for %r" % (self.op, self)) class CSSSelectorPseudoQualifier(CSSSelectorQualifierBase): def __init__(self, attrName, params=()): self.name = attrName self.params = tuple(params) def isPseudo(self): return True def __hash__(self): return hash((self.name, self.params)) def asString(self): if self.params: return ':'+self.name else: return ':%s(%s)' % (self.name, self.params) def matches(self, element): return element.inPseudoState(self.name, self.params) class CSSSelectorCombinationQualifier(CSSSelectorQualifierBase): def __init__(self, op, selector): self.op = op self.selector = selector def isCombiner(self): return True def __hash__(self): return hash((self.op, self.selector)) def asImmutable(self): return self.__class__(self.op, self.selector.asImmutable()) def asString(self): return '%s%s' % (self.selector.asString(), self.op) def matches(self, element): op, selector = self.op, self.selector if op == ' ': for parent in element.iterXMLParents(): if selector.matches(parent): return True else: return False elif op == '>': for parent in element.iterXMLParents(): if selector.matches(parent): return True else: return False elif op == '+': return selector.matches(element.getPreviousSibling()) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ CSS Misc #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSTerminalFunction(object): def __init__(self, name, params): self.name = name self.params = params def __repr__(self): return '' % (self.name, ', '.join(self.params)) class CSSTerminalOperator(tuple): def __new__(klass, *args): return tuple.__new__(klass, args) def __repr__(self): return 'op' + tuple.__repr__(self) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ CSS Objects #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSDeclarations(dict): pass class CSSRuleset(dict): def findCSSRulesFor(self, element, attrName): ruleResults = [] for nodeFilter, declarations in self.iteritems(): if (attrName in declarations) and (nodeFilter.matches(element)): ruleResults.append((nodeFilter, declarations)) ruleResults.sort() return ruleResults def findCSSRuleFor(self, *args, **kw): # rule is packed in a list to differentiate from "no rule" vs "rule # whose value evalutates as False" return self.findCSSRulesFor(*args, **kw)[-1:] def mergeStyles(self, styles): " XXX Bugfix for use in PISA " for k, v in styles.items(): if self.has_key(k) and self[k]: self[k] = copy.copy(self[k]) self[k].update(v) else: self[k] = v class CSSInlineRuleset(CSSRuleset, CSSDeclarations): def findCSSRulesFor(self, element, attrName): if attrName in self: return [(CSSInlineSelector(), self)] else: return [] def findCSSRuleFor(self, *args, **kw): # rule is packed in a list to differentiate from "no rule" vs "rule # whose value evalutates as False" return self.findCSSRulesFor(*args, **kw)[-1:] #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ CSS Builder #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSBuilder(cssParser.CSSBuilderAbstract): RulesetFactory = CSSRuleset SelectorFactory = CSSMutableSelector MediumSetFactory = sets.Set DeclarationsFactory = CSSDeclarations TermFunctionFactory = CSSTerminalFunction TermOperatorFactory = CSSTerminalOperator xmlnsSynonyms = {} mediumSet = None trackImportance = True charset = None def __init__(self, mediumSet=mediumSet, trackImportance=trackImportance): self.setMediumSet(mediumSet) self.setTrackImportance(trackImportance) def isValidMedium(self, mediums): if not mediums: return False if 'all' in mediums: return True mediums = self.MediumSetFactory(mediums) return bool(self.getMediumSet().intersection(mediums)) def getMediumSet(self): return self.mediumSet def setMediumSet(self, mediumSet): self.mediumSet = self.MediumSetFactory(mediumSet) def updateMediumSet(self, mediumSet): self.getMediumSet().update(mediumSet) def getTrackImportance(self): return self.trackImportance def setTrackImportance(self, trackImportance=True): self.trackImportance = trackImportance #~ helpers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def _pushState(self): _restoreState = self.__dict__ self.__dict__ = self.__dict__.copy() self._restoreState = _restoreState self.namespaces = {} def _popState(self): self.__dict__ = self._restoreState def _declarations(self, declarations, DeclarationsFactory=None): DeclarationsFactory = DeclarationsFactory or self.DeclarationsFactory if self.trackImportance: normal, important = [], [] for d in declarations: if d[-1]: important.append(d[:-1]) else: normal.append(d[:-1]) return DeclarationsFactory(normal), DeclarationsFactory(important) else: return DeclarationsFactory(declarations) def _xmlnsGetSynonym(self, uri): # Don't forget to substitute our namespace synonyms! return self.xmlnsSynonyms.get(uri or None, uri) or None #~ css results ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def beginStylesheet(self): self._pushState() def endStylesheet(self): self._popState() def stylesheet(self, stylesheetElements, stylesheetImports): # XXX Updated for PISA if self.trackImportance: normal, important = self.RulesetFactory(), self.RulesetFactory() for normalStylesheet, importantStylesheet in stylesheetImports: normal.mergeStyles(normalStylesheet) important.mergeStyles(importantStylesheet) for normalStyleElement, importantStyleElement in stylesheetElements: normal.mergeStyles(normalStyleElement) important.mergeStyles(importantStyleElement) return normal, important else: result = self.RulesetFactory() for stylesheet in stylesheetImports: result.mergeStyles(stylesheet) for styleElement in stylesheetElements: result.mergeStyles(styleElement) return result def beginInline(self): self._pushState() def endInline(self): self._popState() def specialRules(self, declarations): return cssSpecial.parseSpecialRules(declarations) def inline(self, declarations): declarations = self.specialRules(declarations) return self._declarations(declarations, CSSInlineRuleset) def ruleset(self, selectors, declarations): # XXX Modified for pisa! declarations = self.specialRules(declarations) # XXX Modified for pisa! if self.trackImportance: normalDecl, importantDecl = self._declarations(declarations) normal, important = self.RulesetFactory(), self.RulesetFactory() for s in selectors: s = s.asImmutable() if normalDecl: normal[s] = normalDecl if importantDecl: important[s] = importantDecl return normal, important else: declarations = self._declarations(declarations) result = [(s.asImmutable(), declarations) for s in selectors] return self.RulesetFactory(result) #~ css namespaces ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def resolveNamespacePrefix(self, nsPrefix, name): if nsPrefix == '*': return (nsPrefix, '*', name) xmlns = self.namespaces.get(nsPrefix, None) xmlns = self._xmlnsGetSynonym(xmlns) return (nsPrefix, xmlns, name) #~ css @ directives ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def atCharset(self, charset): self.charset = charset def atImport(self, import_, mediums, cssParser): if self.isValidMedium(mediums): return cssParser.parseExternal(import_) return None def atNamespace(self, nsprefix, uri): self.namespaces[nsprefix] = uri def atMedia(self, mediums, ruleset): if self.isValidMedium(mediums): return ruleset return None def atPage(self, page, pseudopage, declarations): return self.ruleset([self.selector('*')], declarations) def atFontFace(self, declarations): return self.ruleset([self.selector('*')], declarations) def atIdent(self, atIdent, cssParser, src): return src, NotImplemented #~ css selectors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def selector(self, name): return self.SelectorFactory(name) def combineSelectors(self, selectorA, op, selectorB): return self.SelectorFactory.combineSelectors(selectorA, op, selectorB) #~ css declarations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def property(self, name, value, important=False): if self.trackImportance: return (name, value, important) else: return (name, value) def combineTerms(self, termA, op, termB): if op in (',', ' '): if isinstance(termA, list): termA.append(termB) return termA else: return [termA, termB] elif op is None and termB is None: return [termA] else: if isinstance(termA, list): # Bind these "closer" than the list operators -- i.e. work on # the (recursively) last element of the list termA[-1] = self.combineTerms(termA[-1], op, termB) return termA else: return self.TermOperatorFactory(termA, op, termB) def termIdent(self, value): return value def termNumber(self, value, units=None): if units: return value, units else: return value def termRGB(self, value): return value def termURI(self, value): return value def termString(self, value): return value def termUnicodeRange(self, value): return value def termFunction(self, name, value): return self.TermFunctionFactory(name, value) def termUnknown(self, src): return src, NotImplemented #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ CSS Parser -- finally! #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSParser(cssParser.CSSParser): CSSBuilderFactory = CSSBuilder def __init__(self, cssBuilder=None, create=True, **kw): if not cssBuilder and create: assert cssBuilder is None cssBuilder = self.createCSSBuilder(**kw) cssParser.CSSParser.__init__(self, cssBuilder) def createCSSBuilder(self, **kw): return self.CSSBuilderFactory(**kw) def parseExternal(self, cssResourceName): if os.path.isfile(cssResourceName): cssFile = file(cssResourceName, 'r') return self.parseFile(cssFile, True) else: raise RuntimeError("Cannot resolve external CSS file: \"%s\"" % cssResourceName) PK¨“m8™ù­ˆ„§„§sx/w3c/css.pyc;ò {„Gc@sèdZdkZdkZdkZdkZeiZdefd„ƒYZdefd„ƒYZdefd„ƒYZ de fd „ƒYZ d e ei fd „ƒYZ d e fd „ƒYZ defd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZd efd!„ƒYZd"eefd#„ƒYZd$eifd%„ƒYZd&eifd'„ƒYZdS((s­CSS-2.1 engine Primary classes: * CSSElementInterfaceAbstract Provide a concrete implementation for the XML element model used. * CSSCascadeStrategy Implements the CSS-2.1 engine's attribute lookup rules. * CSSParser Parses CSS source forms into usable results using CSSBuilder and CSSMutableSelector. You may want to override parseExternal() * CSSBuilder (and CSSMutableSelector) A concrete implementation for cssParser.CSSBuilderAbstract (and cssParser.CSSSelectorAbstract) to provide usable results to CSSParser requests. Dependencies: python 2.3 (or greater) sets, cssParser, re (via cssParser) NsCSSElementInterfaceAbstractcBsVtZed„Zd„Zd„Zd„Zd„Zfd„Zd„Z d„Z RS( NcCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesdefault((s#build\bdist.win32\egg\sx\w3c\css.pysgetAttr7scCs|iddƒSdS(Nsids(sselfsgetAttr(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getIdAttr9scCs|iddƒSdS(Nsclasss(sselfsgetAttr(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getClassAttr;scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetInlineStyle>scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pys matchesNodeAscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys inPseudoStateDscCstdƒ‚dS(s;Results must be compatible with CSSElementInterfaceAbstractsSubclass responsibilityN(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysiterXMLParentsGscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetPreviousSiblingKs( s__name__s __module__sNotImplementedsgetAttrs getIdAttrs getClassAttrsgetInlineStyles matchesNodes inPseudoStatesiterXMLParentssgetPreviousSibling(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSElementInterfaceAbstract6s       sCSSCascadeStrategycBs€tZeZeZeZeeed„Zeeed„Zed„Ze d„Z e d„Z d„Z d„Z e d„ZRS( NcCsR|tj o ||_n|tj o ||_n|tj o ||_ndS(N(sauthorsNonesselfsusers userAgents userAgenr(sselfsauthorsusers userAgent((s#build\bdist.win32\egg\sx\w3c\css.pys__init__Us      cCse|tjo |i}n|tjo |i}n|tjo |i}n|i|||ƒSdS(N(sauthorsNonesselfsusers userAgents userAgenrs __class__(sselfsauthorsusers userAgent((s#build\bdist.win32\egg\sx\w3c\css.pyscopyWithUpdate]s      ccs±|itj o|idV|idVn|itj o|idVn|itj o|idV|idVn|o|dV|dVn|itj o|idVndS(Nii(sselfs userAgenrsNonesusersauthorsinline(sselfsinline((s#build\bdist.win32\egg\sx\w3c\css.pysiterCSSRulesetshs   cCs)|i||ƒ}|i|||ƒSdS(sMAttempts to find the style setting for attrName in the CSSRulesets. Note: This method does not attempt to resolve rules that return "inherited", "default", or values that have units (including "%"). This is left up to the client app to re-query the CSS in order to implement these semantics. N(sselfsfindCSSRulesForselementsattrNamesrules_extractStyleForRulesdefault(sselfselementsattrNamesdefaultsrule((s#build\bdist.win32\egg\sx\w3c\css.pys findStyleFor}scCs\|i||ƒ}gi}|iƒD]+\}}|||i |||ƒfƒq&~SdS(sMAttempts to find the style setting for attrName in the CSSRulesets. Note: This method does not attempt to resolve rules that return "inherited", "default", or values that have units (including "%"). This is left up to the client app to re-query the CSS in order to implement these semantics. N( sselfsfindCSSRulesForEachselements attrNamessrulessappends_[1]s iteritemssattrNamesrules_extractStyleForRulesdefault(sselfselements attrNamessdefaultsattrNamesrules_[1]srules((s#build\bdist.win32\egg\sx\w3c\css.pysfindStylesForEachˆscCsTg}|iƒ}x-|i|ƒD]}||i||ƒ7}q"W|i ƒ|SdS(N( srulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesetsfindCSSRuleForsattrNamessort(sselfselementsattrNamesrulessrulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesFor”s  c Csµtgi}|D]}||gfƒq~ƒ}|iƒ} xJ|i | ƒD]9}x0|i ƒD]"\}}||i||ƒ7}qbWqOWx|iƒD]}|iƒq™W|SdS(N(sdictsappends_[1]s attrNamessnamesrulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesets iteritemssattrNames attrRulessfindCSSRuleFors itervaluesssort( sselfselements attrNamessattrNamesnames attrRulessruless_[1]srulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesForEachžs3   cCsP|o|dd}||Sn,|tj o|Sntd||fƒ‚dS(Niÿÿÿÿis#Could not find style for '%s' in %r(srulesstylesattrNamesdefaultsNotImplementeds LookupError(sselfsrulesattrNamesdefaultsstyle((s#build\bdist.win32\egg\sx\w3c\css.pys_extractStyleForRule¬s   (s__name__s __module__sNonesauthorsusers userAgenrs__init__scopyWithUpdatesiterCSSRulesetssNotImplementeds findStyleForsfindStylesForEachsfindCSSRulesForsfindCSSRulesForEachs_extractStyleForRule(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSCascadeStrategyPs  sCSSSelectorBasecBsÎtZeZeZeZdd„Zd„Zd„Z d„Z e e ƒZ d„Z e e ƒZd„Ze eƒZd„Ze eƒZd „Zd „Zd „Zd „Zd „Zed„Zd„ZRS(Ns*cCs1t|tƒ otd|f}n||_dS(Ns*(s isinstances completeNamestuplesNonesself(sselfs completeName((s#build\bdist.win32\egg\sx\w3c\css.pys__init__ÀscCs(t|i|iƒ|ifƒ|_dS(N(shashsselfsfullNames specificitys qualifierss_hash(sself((s#build\bdist.win32\egg\sx\w3c\css.pys _updateHashÅscCs,|itjoti|ƒSn|iSdS(N(sselfs_hashsNonesobjects__hash__(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__ÇscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getNSPrefixÍscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetNameÑscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getNamespaceÕscCs|idd!SdS(Nii(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getFullNameÙscCs2|iif|iƒ|iƒf}d|SdS(Ns<%s %d:%d:%d:%d %s >(sselfs __class__s__name__s specificitysasStringsstrArgs(sselfsstrArgs((s#build\bdist.win32\egg\sx\w3c\css.pys__repr__Ýs&cCs|iƒSdS(N(sselfsasString(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__str__áscCswt|iƒ|iƒƒ}|djo|Snt|i|iƒ}|djo|Snt|i|iƒ}|SdS(Ni(scmpsselfs specificitysothersresultsfullNames qualifiers(sselfsothersresult((s#build\bdist.win32\egg\sx\w3c\css.pys__cmp__äs  cCs.|itjo|iƒ|_n|iSdS(N(sselfs _specificitysNones_calcSpecificity(sself((s#build\bdist.win32\egg\sx\w3c\css.pys specificityîscCsd}d}t|idjƒ}xÇ|iD]¼}|iƒo|d7}q+|i ƒo|d7}q+|i ƒo|d7}q+|i ƒo|d7}q+|i ƒo=|i iƒ\}}}}||7}||7}||7}q+q+W|i|||fSdS(s8from http://www.w3.org/TR/CSS21/cascade.html#specificityis*iN(s hashCountsqualifierCountsintsselfsnames elementCounts qualifierssqsisHashsisClasssisAttrsisPseudos isCombinersselectors specificitysishsesinline(sselfsesisqualifierCountshs hashCountsqs elementCount((s#build\bdist.win32\egg\sx\w3c\css.pys_calcSpecificityós(        cCsf|tjotSn|i|iƒ otSnx.|iD]}|i|ƒ otSq;q;Wt SdS(N( selementsNonesFalses matchesNodesselfsfullNames qualifierss qualifiersmatchessTrue(sselfselements qualifier((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess   cCs¦g}|itj o!|id|i|ifƒn|i|iƒxK|iD]@}|iƒo|i d|i ƒƒqQ|i|i ƒƒqQWdi |ƒSdS(Ns%s|%sis( sresultsselfsnsPrefixsNonesappendsnames qualifierssqs isCombinersinsertsasStringsjoin(sselfsqsresult((s#build\bdist.win32\egg\sx\w3c\css.pysasStrings!  (s__name__s __module__sFalsesinlinesNones_hashs _specificitys__init__s _updateHashs__hash__s getNSPrefixspropertysnsPrefixsgetNamesnames getNamespaces namespaces getFullNamesfullNames__repr__s__str__s__cmp__s specificitys_calcSpecificitysmatchessasString(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorBase»s*                sCSSInlineSelectorcBstZeZRS(N(s__name__s __module__sTruesinline(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSInlineSelector ssCSSMutableSelectorcBsttZgZd„Zd„ZeeƒZd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z RS( NcCs>t|igi}|iD]}||iƒƒq~ƒSdS(N(sCSSImmutableSelectorsselfs completeNamesappends_[1]s qualifierssqs asImmutable(sselfs_[1]sq((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutable(scCs|i||ƒ|SdS(N(s selectorBsaddCombinationsops selectorA(sklasss selectorAsops selectorB((s#build\bdist.win32\egg\sx\w3c\css.pyscombineSelectors+scCs|it||ƒƒdS(N(sselfs _addQualifiersCSSSelectorCombinationQualifiersopsother(sselfsopsother((s#build\bdist.win32\egg\sx\w3c\css.pysaddCombination0scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorHashQualifiershashId(sselfshashId((s#build\bdist.win32\egg\sx\w3c\css.pys addHashId2scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorClassQualifiersclass_(sselfsclass_((s#build\bdist.win32\egg\sx\w3c\css.pysaddClass4scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorAttributeQualifiersattrName(sselfsattrName((s#build\bdist.win32\egg\sx\w3c\css.pys addAttribute6scCs|it|||ƒƒdS(N(sselfs _addQualifiersCSSSelectorAttributeQualifiersattrNamesops attrValue(sselfsattrNamesops attrValue((s#build\bdist.win32\egg\sx\w3c\css.pysaddAttributeOperation8scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorPseudoQualifiersname(sselfsname((s#build\bdist.win32\egg\sx\w3c\css.pys addPseudo:scCs|it||ƒƒdS(N(sselfs _addQualifiersCSSSelectorPseudoQualifiersnamesparams(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pysaddPseudoFunction<scCs.|io|ii|ƒn |g|_dS(N(sselfs qualifierssappends qualifier(sselfs qualifier((s#build\bdist.win32\egg\sx\w3c\css.pys _addQualifierAs (s__name__s __module__s qualifierss asImmutablescombineSelectorss classmethodsaddCombinations addHashIdsaddClasss addAttributesaddAttributeOperations addPseudosaddPseudoFunctions _addQualifier(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSMutableSelector%s          sCSSImmutableSelectorcBs,tZdfd„Zd„ZeeƒZRS(Ns*cCs-t|ƒ|_ti||ƒ|iƒdS(N(stuples qualifierssselfsCSSSelectorBases__init__s completeNames _updateHash(sselfs completeNames qualifiers((s#build\bdist.win32\egg\sx\w3c\css.pys__init__JscCs||i|iƒSdS(N(sklasssselectors completeNames qualifiers(sklasssselector((s#build\bdist.win32\egg\sx\w3c\css.pys fromSelectorPs(s__name__s __module__s__init__s fromSelectors classmethod(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSImmutableSelectorIs sCSSSelectorQualifierBasecBsGtZd„Zd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisHash[scCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisClass]scCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisAttr_scCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisPseudoascCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pys isCombinercscCs|SdS(N(sself(sself((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutableescCs|iƒSdS(N(sselfsasString(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__str__gs( s__name__s __module__sisHashsisClasssisAttrsisPseudos isCombiners asImmutables__str__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorQualifierBaseZs      sCSSSelectorHashQualifiercBs5tZd„Zd„Zd„Zd„Zd„ZRS(NcCs ||_dS(N(shashIdsself(sselfshashId((s#build\bdist.win32\egg\sx\w3c\css.pys__init__kscCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisHashmscCst|ifƒSdS(N(shashsselfshashId(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__oscCsd|iSdS(Ns#(sselfshashId(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringqscCs|iƒ|ijSdS(N(selements getIdAttrsselfshashId(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatchesss(s__name__s __module__s__init__sisHashs__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorHashQualifierjs     sCSSSelectorClassQualifiercBs5tZd„Zd„Zd„Zd„Zd„ZRS(NcCs ||_dS(N(sclassIdsself(sselfsclassId((s#build\bdist.win32\egg\sx\w3c\css.pys__init__wscCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisClassyscCst|ifƒSdS(N(shashsselfsclassId(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__{scCsd|iSdS(Ns.(sselfsclassId(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasString}scCs|i|iƒiƒjSdS(N(sselfsclassIdselements getClassAttrssplit(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess(s__name__s __module__s__init__sisClasss__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorClassQualifiervs     sCSSSelectorAttributeQualifiercBsStZeeef\ZZZeed„Zd„Zd„Z d„Z d„Z RS(NcCsG||_||ij o ||_n||ij o ||_ndS(N(sattrNamesselfsnamesops attrValuesvalue(sselfsattrNamesops attrValue((s#build\bdist.win32\egg\sx\w3c\css.pys__init__…s   cCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisAttr‹scCs t|i|i|ifƒSdS(N(shashsselfsnamesopsvalue(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__scCs@|itjod|ifSnd|i|i|ifSdS(Ns[%s]s[%s%s%s](sselfsvaluesNotImplementedsnamesop(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringscCsæ|i}|tjo|i|itƒtjSn°|djo |i|i|itƒjSnƒ|djo&|i|i|idƒiƒjSnP|djo)|i|i|idƒidƒjSnt d|i|fƒ‚dS(Ns=s~=ss|=s-sUnknown operator %r for %r( sselfsopsNoneselementsgetAttrsnamesNotImplementedsvaluessplits RuntimeError(sselfselementsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatches“s     & )( s__name__s __module__sNonesNotImplementedsnamesopsvalues__init__sisAttrs__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorAttributeQualifier‚s    sCSSSelectorPseudoQualifiercBs8tZfd„Zd„Zd„Zd„Zd„ZRS(NcCs||_t|ƒ|_dS(N(sattrNamesselfsnamestuplesparams(sselfsattrNamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys__init__¡s cCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisPseudo¤scCst|i|ifƒSdS(N(shashsselfsnamesparams(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__¦scCs1|iod|iSnd|i|ifSdS(Ns:s:%s(%s)(sselfsparamssname(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasString¨s cCs|i|i|iƒSdS(N(selements inPseudoStatesselfsnamesparams(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatches­s(s__name__s __module__s__init__sisPseudos__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorPseudoQualifier s     sCSSSelectorCombinationQualifiercBs>tZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCs||_||_dS(N(sopsselfsselector(sselfsopsselector((s#build\bdist.win32\egg\sx\w3c\css.pys__init__±s cCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pys isCombiner´scCst|i|ifƒSdS(N(shashsselfsopsselector(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__¶scCs |i|i|iiƒƒSdS(N(sselfs __class__sopsselectors asImmutable(sself((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutable¸scCsd|iiƒ|ifSdS(Ns%s%s(sselfsselectorsasStringsop(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringºscCsÈ|i|if\}}|djo7xœ|iƒD]}|i|ƒotSq2q2WtSni|djo7xX|iƒD]"}|i|ƒotSqvtSqvWn%|djo|i|i ƒƒSndS(Ns s>s+( sselfsopsselectorselementsiterXMLParentssparentsmatchessTruesFalsesgetPreviousSibling(sselfselementsparentsselectorsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatches¼s       (s__name__s __module__s__init__s isCombiners__hash__s asImmutablesasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorCombinationQualifier°s      sCSSTerminalFunctioncBstZd„Zd„ZRS(NcCs||_||_dS(N(snamesselfsparams(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys__init__Òs cCs!d|idi|iƒfSdS(Nss, (sselfsnamesjoinsparams(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__repr__Ös(s__name__s __module__s__init__s__repr__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSTerminalFunctionÑs sCSSTerminalOperatorcBstZd„Zd„ZRS(NcGsti||ƒSdS(N(stuples__new__sklasssargs(sklasssargs((s#build\bdist.win32\egg\sx\w3c\css.pys__new__ÚscCsdti|ƒSdS(Nsop(stuples__repr__sself(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__repr__Ýs(s__name__s __module__s__new__s__repr__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSTerminalOperatorÙs sCSSDeclarationscBstZRS(N(s__name__s __module__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSDeclarationsäss CSSRulesetcBs#tZd„Zd„Zd„ZRS(NcCsig}xN|iƒD]@\}}||jo |i|ƒo|i||fƒqqW|i ƒ|SdS(N( s ruleResultssselfs iteritemss nodeFilters declarationssattrNamesmatchesselementsappendssort(sselfselementsattrNames nodeFilters declarationss ruleResults((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesForès  cOs|i||ŽdSdS(Niÿÿÿÿ(sselfsfindCSSRulesForsargsskw(sselfsargsskw((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRuleForðscCsrxk|iƒD]]\}}|i|ƒo||o,ti||ƒ||<||i|ƒq |||scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pys matchesNodeAscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys inPseudoStateDscCstdƒ‚dS(s;Results must be compatible with CSSElementInterfaceAbstractsSubclass responsibilityN(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysiterXMLParentsGscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetPreviousSiblingKs( s__name__s __module__sNotImplementedsgetAttrs getIdAttrs getClassAttrsgetInlineStyles matchesNodes inPseudoStatesiterXMLParentssgetPreviousSibling(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSElementInterfaceAbstract6s       sCSSCascadeStrategycBs€tZeZeZeZeeed„Zeeed„Zed„Ze d„Z e d„Z d„Z d„Z e d„ZRS( NcCsR|tj o ||_n|tj o ||_n|tj o ||_ndS(N(sauthorsNonesselfsusers userAgents userAgenr(sselfsauthorsusers userAgent((s#build\bdist.win32\egg\sx\w3c\css.pys__init__Us      cCse|tjo |i}n|tjo |i}n|tjo |i}n|i|||ƒSdS(N(sauthorsNonesselfsusers userAgents userAgenrs __class__(sselfsauthorsusers userAgent((s#build\bdist.win32\egg\sx\w3c\css.pyscopyWithUpdate]s      ccs±|itj o|idV|idVn|itj o|idVn|itj o|idV|idVn|o|dV|dVn|itj o|idVndS(Nii(sselfs userAgenrsNonesusersauthorsinline(sselfsinline((s#build\bdist.win32\egg\sx\w3c\css.pysiterCSSRulesetshs   cCs)|i||ƒ}|i|||ƒSdS(sMAttempts to find the style setting for attrName in the CSSRulesets. Note: This method does not attempt to resolve rules that return "inherited", "default", or values that have units (including "%"). This is left up to the client app to re-query the CSS in order to implement these semantics. N(sselfsfindCSSRulesForselementsattrNamesrules_extractStyleForRulesdefault(sselfselementsattrNamesdefaultsrule((s#build\bdist.win32\egg\sx\w3c\css.pys findStyleFor}scCs\|i||ƒ}gi}|iƒD]+\}}|||i |||ƒfƒq&~SdS(sMAttempts to find the style setting for attrName in the CSSRulesets. Note: This method does not attempt to resolve rules that return "inherited", "default", or values that have units (including "%"). This is left up to the client app to re-query the CSS in order to implement these semantics. N( sselfsfindCSSRulesForEachselements attrNamessrulessappends_[1]s iteritemssattrNamesrules_extractStyleForRulesdefault(sselfselements attrNamessdefaultsattrNamesrules_[1]srules((s#build\bdist.win32\egg\sx\w3c\css.pysfindStylesForEachˆscCsTg}|iƒ}x-|i|ƒD]}||i||ƒ7}q"W|i ƒ|SdS(N( srulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesetsfindCSSRuleForsattrNamessort(sselfselementsattrNamesrulessrulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesFor”s  c Csµtgi}|D]}||gfƒq~ƒ}|iƒ} xJ|i | ƒD]9}x0|i ƒD]"\}}||i||ƒ7}qbWqOWx|iƒD]}|iƒq™W|SdS(N(sdictsappends_[1]s attrNamessnamesrulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesets iteritemssattrNames attrRulessfindCSSRuleFors itervaluesssort( sselfselements attrNamessattrNamesnames attrRulessruless_[1]srulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesForEachžs3   cCsP|o|dd}||Sn,|tj o|Sntd||fƒ‚dS(Niÿÿÿÿis#Could not find style for '%s' in %r(srulesstylesattrNamesdefaultsNotImplementeds LookupError(sselfsrulesattrNamesdefaultsstyle((s#build\bdist.win32\egg\sx\w3c\css.pys_extractStyleForRule¬s   (s__name__s __module__sNonesauthorsusers userAgenrs__init__scopyWithUpdatesiterCSSRulesetssNotImplementeds findStyleForsfindStylesForEachsfindCSSRulesForsfindCSSRulesForEachs_extractStyleForRule(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSCascadeStrategyPs  sCSSSelectorBasecBsÎtZeZeZeZdd„Zd„Zd„Z d„Z e e ƒZ d„Z e e ƒZd„Ze eƒZd„Ze eƒZd „Zd „Zd „Zd „Zd „Zed„Zd„ZRS(Ns*cCs1t|tƒ otd|f}n||_dS(Ns*(s isinstances completeNamestuplesNonesself(sselfs completeName((s#build\bdist.win32\egg\sx\w3c\css.pys__init__ÀscCs(t|i|iƒ|ifƒ|_dS(N(shashsselfsfullNames specificitys qualifierss_hash(sself((s#build\bdist.win32\egg\sx\w3c\css.pys _updateHashÅscCs,|itjoti|ƒSn|iSdS(N(sselfs_hashsNonesobjects__hash__(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__ÇscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getNSPrefixÍscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetNameÑscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getNamespaceÕscCs|idd!SdS(Nii(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getFullNameÙscCs2|iif|iƒ|iƒf}d|SdS(Ns<%s %d:%d:%d:%d %s >(sselfs __class__s__name__s specificitysasStringsstrArgs(sselfsstrArgs((s#build\bdist.win32\egg\sx\w3c\css.pys__repr__Ýs&cCs|iƒSdS(N(sselfsasString(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__str__áscCswt|iƒ|iƒƒ}|djo|Snt|i|iƒ}|djo|Snt|i|iƒ}|SdS(Ni(scmpsselfs specificitysothersresultsfullNames qualifiers(sselfsothersresult((s#build\bdist.win32\egg\sx\w3c\css.pys__cmp__äs  cCs.|itjo|iƒ|_n|iSdS(N(sselfs _specificitysNones_calcSpecificity(sself((s#build\bdist.win32\egg\sx\w3c\css.pys specificityîscCsd}d}t|idjƒ}xÇ|iD]¼}|iƒo|d7}q+|i ƒo|d7}q+|i ƒo|d7}q+|i ƒo|d7}q+|i ƒo=|i iƒ\}}}}||7}||7}||7}q+q+W|i|||fSdS(s8from http://www.w3.org/TR/CSS21/cascade.html#specificityis*iN(s hashCountsqualifierCountsintsselfsnames elementCounts qualifierssqsisHashsisClasssisAttrsisPseudos isCombinersselectors specificitysishsesinline(sselfsesisqualifierCountshs hashCountsqs elementCount((s#build\bdist.win32\egg\sx\w3c\css.pys_calcSpecificityós(        cCsf|tjotSn|i|iƒ otSnx.|iD]}|i|ƒ otSq;q;Wt SdS(N( selementsNonesFalses matchesNodesselfsfullNames qualifierss qualifiersmatchessTrue(sselfselements qualifier((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess   cCs¦g}|itj o!|id|i|ifƒn|i|iƒxK|iD]@}|iƒo|i d|i ƒƒqQ|i|i ƒƒqQWdi |ƒSdS(Ns%s|%sis( sresultsselfsnsPrefixsNonesappendsnames qualifierssqs isCombinersinsertsasStringsjoin(sselfsqsresult((s#build\bdist.win32\egg\sx\w3c\css.pysasStrings!  (s__name__s __module__sFalsesinlinesNones_hashs _specificitys__init__s _updateHashs__hash__s getNSPrefixspropertysnsPrefixsgetNamesnames getNamespaces namespaces getFullNamesfullNames__repr__s__str__s__cmp__s specificitys_calcSpecificitysmatchessasString(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorBase»s*                sCSSInlineSelectorcBstZeZRS(N(s__name__s __module__sTruesinline(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSInlineSelector ssCSSMutableSelectorcBsttZgZd„Zd„ZeeƒZd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z RS( NcCs>t|igi}|iD]}||iƒƒq~ƒSdS(N(sCSSImmutableSelectorsselfs completeNamesappends_[1]s qualifierssqs asImmutable(sselfs_[1]sq((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutable(scCs|i||ƒ|SdS(N(s selectorBsaddCombinationsops selectorA(sklasss selectorAsops selectorB((s#build\bdist.win32\egg\sx\w3c\css.pyscombineSelectors+scCs|it||ƒƒdS(N(sselfs _addQualifiersCSSSelectorCombinationQualifiersopsother(sselfsopsother((s#build\bdist.win32\egg\sx\w3c\css.pysaddCombination0scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorHashQualifiershashId(sselfshashId((s#build\bdist.win32\egg\sx\w3c\css.pys addHashId2scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorClassQualifiersclass_(sselfsclass_((s#build\bdist.win32\egg\sx\w3c\css.pysaddClass4scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorAttributeQualifiersattrName(sselfsattrName((s#build\bdist.win32\egg\sx\w3c\css.pys addAttribute6scCs|it|||ƒƒdS(N(sselfs _addQualifiersCSSSelectorAttributeQualifiersattrNamesops attrValue(sselfsattrNamesops attrValue((s#build\bdist.win32\egg\sx\w3c\css.pysaddAttributeOperation8scCs|it|ƒƒdS(N(sselfs _addQualifiersCSSSelectorPseudoQualifiersname(sselfsname((s#build\bdist.win32\egg\sx\w3c\css.pys addPseudo:scCs|it||ƒƒdS(N(sselfs _addQualifiersCSSSelectorPseudoQualifiersnamesparams(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pysaddPseudoFunction<scCs.|io|ii|ƒn |g|_dS(N(sselfs qualifierssappends qualifier(sselfs qualifier((s#build\bdist.win32\egg\sx\w3c\css.pys _addQualifierAs (s__name__s __module__s qualifierss asImmutablescombineSelectorss classmethodsaddCombinations addHashIdsaddClasss addAttributesaddAttributeOperations addPseudosaddPseudoFunctions _addQualifier(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSMutableSelector%s          sCSSImmutableSelectorcBs,tZdfd„Zd„ZeeƒZRS(Ns*cCs-t|ƒ|_ti||ƒ|iƒdS(N(stuples qualifierssselfsCSSSelectorBases__init__s completeNames _updateHash(sselfs completeNames qualifiers((s#build\bdist.win32\egg\sx\w3c\css.pys__init__JscCs||i|iƒSdS(N(sklasssselectors completeNames qualifiers(sklasssselector((s#build\bdist.win32\egg\sx\w3c\css.pys fromSelectorPs(s__name__s __module__s__init__s fromSelectors classmethod(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSImmutableSelectorIs sCSSSelectorQualifierBasecBsGtZd„Zd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisHash[scCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisClass]scCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisAttr_scCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisPseudoascCstSdS(N(sFalse(sself((s#build\bdist.win32\egg\sx\w3c\css.pys isCombinercscCs|SdS(N(sself(sself((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutableescCs|iƒSdS(N(sselfsasString(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__str__gs( s__name__s __module__sisHashsisClasssisAttrsisPseudos isCombiners asImmutables__str__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorQualifierBaseZs      sCSSSelectorHashQualifiercBs5tZd„Zd„Zd„Zd„Zd„ZRS(NcCs ||_dS(N(shashIdsself(sselfshashId((s#build\bdist.win32\egg\sx\w3c\css.pys__init__kscCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisHashmscCst|ifƒSdS(N(shashsselfshashId(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__oscCsd|iSdS(Ns#(sselfshashId(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringqscCs|iƒ|ijSdS(N(selements getIdAttrsselfshashId(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatchesss(s__name__s __module__s__init__sisHashs__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorHashQualifierjs     sCSSSelectorClassQualifiercBs5tZd„Zd„Zd„Zd„Zd„ZRS(NcCs ||_dS(N(sclassIdsself(sselfsclassId((s#build\bdist.win32\egg\sx\w3c\css.pys__init__wscCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisClassyscCst|ifƒSdS(N(shashsselfsclassId(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__{scCsd|iSdS(Ns.(sselfsclassId(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasString}scCs|i|iƒiƒjSdS(N(sselfsclassIdselements getClassAttrssplit(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess(s__name__s __module__s__init__sisClasss__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorClassQualifiervs     sCSSSelectorAttributeQualifiercBsStZeeef\ZZZeed„Zd„Zd„Z d„Z d„Z RS(NcCsG||_||ij o ||_n||ij o ||_ndS(N(sattrNamesselfsnamesops attrValuesvalue(sselfsattrNamesops attrValue((s#build\bdist.win32\egg\sx\w3c\css.pys__init__…s   cCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisAttr‹scCs t|i|i|ifƒSdS(N(shashsselfsnamesopsvalue(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__scCs@|itjod|ifSnd|i|i|ifSdS(Ns[%s]s[%s%s%s](sselfsvaluesNotImplementedsnamesop(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringscCsæ|i}|tjo|i|itƒtjSn°|djo |i|i|itƒjSnƒ|djo&|i|i|idƒiƒjSnP|djo)|i|i|idƒidƒjSnt d|i|fƒ‚dS(Ns=s~=ss|=s-sUnknown operator %r for %r( sselfsopsNoneselementsgetAttrsnamesNotImplementedsvaluessplits RuntimeError(sselfselementsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatches“s     & )( s__name__s __module__sNonesNotImplementedsnamesopsvalues__init__sisAttrs__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorAttributeQualifier‚s    sCSSSelectorPseudoQualifiercBs8tZfd„Zd„Zd„Zd„Zd„ZRS(NcCs||_t|ƒ|_dS(N(sattrNamesselfsnamestuplesparams(sselfsattrNamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys__init__¡s cCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pysisPseudo¤scCst|i|ifƒSdS(N(shashsselfsnamesparams(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__¦scCs1|iod|iSnd|i|ifSdS(Ns:s:%s(%s)(sselfsparamssname(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasString¨s cCs|i|i|iƒSdS(N(selements inPseudoStatesselfsnamesparams(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatches­s(s__name__s __module__s__init__sisPseudos__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorPseudoQualifier s     sCSSSelectorCombinationQualifiercBs>tZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCs||_||_dS(N(sopsselfsselector(sselfsopsselector((s#build\bdist.win32\egg\sx\w3c\css.pys__init__±s cCstSdS(N(sTrue(sself((s#build\bdist.win32\egg\sx\w3c\css.pys isCombiner´scCst|i|ifƒSdS(N(shashsselfsopsselector(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__¶scCs |i|i|iiƒƒSdS(N(sselfs __class__sopsselectors asImmutable(sself((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutable¸scCsd|iiƒ|ifSdS(Ns%s%s(sselfsselectorsasStringsop(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringºscCsÈ|i|if\}}|djo7xœ|iƒD]}|i|ƒotSq2q2WtSni|djo7xX|iƒD]"}|i|ƒotSqvtSqvWn%|djo|i|i ƒƒSndS(Ns s>s+( sselfsopsselectorselementsiterXMLParentssparentsmatchessTruesFalsesgetPreviousSibling(sselfselementsparentsselectorsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatches¼s       (s__name__s __module__s__init__s isCombiners__hash__s asImmutablesasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorCombinationQualifier°s      sCSSTerminalFunctioncBstZd„Zd„ZRS(NcCs||_||_dS(N(snamesselfsparams(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys__init__Òs cCs!d|idi|iƒfSdS(Nss, (sselfsnamesjoinsparams(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__repr__Ös(s__name__s __module__s__init__s__repr__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSTerminalFunctionÑs sCSSTerminalOperatorcBstZd„Zd„ZRS(NcGsti||ƒSdS(N(stuples__new__sklasssargs(sklasssargs((s#build\bdist.win32\egg\sx\w3c\css.pys__new__ÚscCsdti|ƒSdS(Nsop(stuples__repr__sself(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__repr__Ýs(s__name__s __module__s__new__s__repr__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSTerminalOperatorÙs sCSSDeclarationscBstZRS(N(s__name__s __module__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSDeclarationsäss CSSRulesetcBs#tZd„Zd„Zd„ZRS(NcCsig}xN|iƒD]@\}}||jo |i|ƒo|i||fƒqqW|i ƒ|SdS(N( s ruleResultssselfs iteritemss nodeFilters declarationssattrNamesmatchesselementsappendssort(sselfselementsattrNames nodeFilters declarationss ruleResults((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesForès  cOs|i||ŽdSdS(Niÿÿÿÿ(sselfsfindCSSRulesForsargsskw(sselfsargsskw((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRuleForðscCsrxk|iƒD]]\}}|i|ƒo||o,ti||ƒ||<||i|ƒq |||, 2007 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Imports #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ import css #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Definitions #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSDOMElementInterface(css.CSSElementInterfaceAbstract): """An implementation of css.CSSElementInterfaceAbstract for xml.dom Element Nodes""" #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Constants / Variables / Etc. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ style = None _pseudoStateHandlerLookup = { 'first-child': lambda self: not bool(self.getPreviousSibling()), 'not-first-child': lambda self: bool(self.getPreviousSibling()), 'last-child': lambda self: not bool(self.getNextSibling()), 'not-last-child': lambda self: bool(self.getNextSibling()), 'middle-child': lambda self: not bool(self.getPreviousSibling()) and not bool(self.getNextSibling()), 'not-middle-child': lambda self: bool(self.getPreviousSibling()) or bool(self.getNextSibling()), # XXX 'first-line': } #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Definitions #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def __init__(self, domElement, cssParser=None): self.domElement = domElement # print self.domElement.attributes if cssParser is not None: self.onCSSParserVisit(cssParser) def onCSSParserVisit(self, cssParser): styleSrc = self.getStyleAttr() if styleSrc: style = cssParser.parseInline(styleSrc) self.setInlineStyle(style) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def matchesNode(self, (namespace, tagName)): if tagName not in ('*', self.domElement.tagName): return False if namespace in (None, '', '*'): # matches any namespace return True else: # full compare return namespace == self.domElement.namespaceURI def getAttr(self, name, default=NotImplemented): attrValue = self.domElement.attributes.get(name) if attrValue is not None: return attrValue.value else: return default def getIdAttr(self): return self.getAttr('id', '') def getClassAttr(self): return self.getAttr('class', '') def getStyleAttr(self): return self.getAttr('style', None) def inPseudoState(self, name, params=()): handler = self._pseudoStateHandlerLookup.get(name, lambda self: False) return handler(self) def iterXMLParents(self, includeSelf=False): klass = self.__class__ current = self.domElement if not includeSelf: current = current.parentNode while (current is not None) and (current.nodeType == current.ELEMENT_NODE): yield klass(current) current = current.parentNode def getPreviousSibling(self): sibling = self.domElement.previousSibling while sibling: if sibling.nodeType == sibling.ELEMENT_NODE: return sibling else: sibling = sibling.previousSibling return None def getNextSibling(self): sibling = self.domElement.nextSibling while sibling: if sibling.nodeType == sibling.ELEMENT_NODE: return sibling else: sibling = sibling.nextSibling return None def getInlineStyle(self): return self.style def setInlineStyle(self, style): self.style = style PK¨“m8©Î3Û¶¶!sx/w3c/cssDOMElementInterface.pyc;ò †{„Gc@s&dkZdeifd„ƒYZdS(NsCSSDOMElementInterfacecBsãtZdZeZhdd„<dd„<dd„<dd„<d d „<d d „!ssnot-first-childcCst|iƒƒS(N(sboolsselfsgetPreviousSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys#ss last-childcCst|iƒƒ S(N(sboolsselfsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys&ssnot-last-childcCst|iƒƒS(N(sboolsselfsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys(ss middle-childcCs%t|iƒƒ ot|iƒƒ S(N(sboolsselfsgetPreviousSiblingsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys+ssnot-middle-childcCs#t|iƒƒpt|iƒƒS(N(sboolsselfsgetPreviousSiblingsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys-scCs+||_|tj o|i|ƒndS(N(s domElementsselfs cssParsersNonesonCSSParserVisit(sselfs domElements cssParser((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys__init__7s  cCs7|iƒ}|o |i|ƒ}|i|ƒndS(N(sselfs getStyleAttrsstyleSrcs cssParsers parseInlinesstylessetInlineStyle(sselfs cssParsersstyleSrcsstyle((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysonCSSParserVisit=s cCs_|\}}|d|iifjotSn|tddfjotSn||iijSdS(Ns*s(s namespacestagNamesselfs domElementsFalsesNonesTrues namespaceURI(sselfs.2s namespacestagName((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys matchesNodeEs cCs5|iii|ƒ}|tj o |iSn|SdS(N( sselfs domElements attributessgetsnames attrValuesNonesvaluesdefault(sselfsnamesdefaults attrValue((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetAttrNs  cCs|iddƒSdS(Nsids(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getIdAttrUscCs|iddƒSdS(Nsclasss(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getClassAttrWscCs|idtƒSdS(Nsstyle(sselfsgetAttrsNone(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getStyleAttrYscCs&|ii|d„ƒ}||ƒSdS(NcCstS(N(sFalse(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys]s(sselfs_pseudoStateHandlerLookupsgetsnameshandler(sselfsnamesparamsshandler((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys inPseudoState\sccsf|i}|i}| o |i}nx8|tj o|i|i jo||ƒV|i}q*WdS(N( sselfs __class__sklasss domElementscurrents includeSelfs parentNodesNonesnodeTypes ELEMENT_NODE(sselfs includeSelfscurrentsklass((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysiterXMLParents`s     cCsG|ii}x0|o(|i|ijo|Sq|i}qWtSdS(N(sselfs domElementspreviousSiblingssiblingsnodeTypes ELEMENT_NODEsNone(sselfssibling((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetPreviousSiblingis cCsG|ii}x0|o(|i|ijo|Sq|i}qWtSdS(N(sselfs domElements nextSiblingssiblingsnodeTypes ELEMENT_NODEsNone(sselfssibling((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetNextSiblingqs cCs |iSdS(N(sselfsstyle(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetInlineStylezscCs ||_dS(N(sstylesself(sselfsstyle((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pyssetInlineStyle|s(s__name__s __module__s__doc__sNonesstyles_pseudoStateHandlerLookups__init__sonCSSParserVisits matchesNodesNotImplementedsgetAttrs getIdAttrs getClassAttrs getStyleAttrs inPseudoStatesFalsesiterXMLParentssgetPreviousSiblingsgetNextSiblingsgetInlineStylessetInlineStyle(((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysCSSDOMElementInterfaces N         (scsssCSSElementInterfaceAbstractsCSSDOMElementInterface(sCSSDOMElementInterfacescss((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys?s PK¨“m8©Î3Û¶¶!sx/w3c/cssDOMElementInterface.pyo;ò †{„Gc@s&dkZdeifd„ƒYZdS(NsCSSDOMElementInterfacecBsãtZdZeZhdd„<dd„<dd„<dd„<d d „<d d „!ssnot-first-childcCst|iƒƒS(N(sboolsselfsgetPreviousSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys#ss last-childcCst|iƒƒ S(N(sboolsselfsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys&ssnot-last-childcCst|iƒƒS(N(sboolsselfsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys(ss middle-childcCs%t|iƒƒ ot|iƒƒ S(N(sboolsselfsgetPreviousSiblingsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys+ssnot-middle-childcCs#t|iƒƒpt|iƒƒS(N(sboolsselfsgetPreviousSiblingsgetNextSibling(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys-scCs+||_|tj o|i|ƒndS(N(s domElementsselfs cssParsersNonesonCSSParserVisit(sselfs domElements cssParser((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys__init__7s  cCs7|iƒ}|o |i|ƒ}|i|ƒndS(N(sselfs getStyleAttrsstyleSrcs cssParsers parseInlinesstylessetInlineStyle(sselfs cssParsersstyleSrcsstyle((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysonCSSParserVisit=s cCs_|\}}|d|iifjotSn|tddfjotSn||iijSdS(Ns*s(s namespacestagNamesselfs domElementsFalsesNonesTrues namespaceURI(sselfs.2s namespacestagName((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys matchesNodeEs cCs5|iii|ƒ}|tj o |iSn|SdS(N( sselfs domElements attributessgetsnames attrValuesNonesvaluesdefault(sselfsnamesdefaults attrValue((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetAttrNs  cCs|iddƒSdS(Nsids(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getIdAttrUscCs|iddƒSdS(Nsclasss(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getClassAttrWscCs|idtƒSdS(Nsstyle(sselfsgetAttrsNone(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getStyleAttrYscCs&|ii|d„ƒ}||ƒSdS(NcCstS(N(sFalse(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys]s(sselfs_pseudoStateHandlerLookupsgetsnameshandler(sselfsnamesparamsshandler((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys inPseudoState\sccsf|i}|i}| o |i}nx8|tj o|i|i jo||ƒV|i}q*WdS(N( sselfs __class__sklasss domElementscurrents includeSelfs parentNodesNonesnodeTypes ELEMENT_NODE(sselfs includeSelfscurrentsklass((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysiterXMLParents`s     cCsG|ii}x0|o(|i|ijo|Sq|i}qWtSdS(N(sselfs domElementspreviousSiblingssiblingsnodeTypes ELEMENT_NODEsNone(sselfssibling((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetPreviousSiblingis cCsG|ii}x0|o(|i|ijo|Sq|i}qWtSdS(N(sselfs domElements nextSiblingssiblingsnodeTypes ELEMENT_NODEsNone(sselfssibling((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetNextSiblingqs cCs |iSdS(N(sselfsstyle(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysgetInlineStylezscCs ||_dS(N(sstylesself(sselfsstyle((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pyssetInlineStyle|s(s__name__s __module__s__doc__sNonesstyles_pseudoStateHandlerLookups__init__sonCSSParserVisits matchesNodesNotImplementedsgetAttrs getIdAttrs getClassAttrs getStyleAttrs inPseudoStatesFalsesiterXMLParentssgetPreviousSiblingsgetNextSiblingsgetInlineStylessetInlineStyle(((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pysCSSDOMElementInterfaces N         (scsssCSSElementInterfaceAbstractsCSSDOMElementInterface(sCSSDOMElementInterfacescss((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys?s PKÄvm8øtêCCœCœsx/w3c/cssParser.py#!/usr/bin/env python ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ##~ Copyright (C) 2002-2004 TechGame Networks, LLC. ##~ ##~ This library is free software; you can redistribute it and/or ##~ modify it under the terms of the BSD style License as found in the ##~ LICENSE file included with this distribution. ## ## Modified by Dirk Holtwick , 2007 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """CSS-2.1 parser. The CSS 2.1 Specification this parser was derived from can be found at http://www.w3.org/TR/CSS21/ Primary Classes: * CSSParser Parses CSS source forms into results using a Builder Pattern. Must provide concrete implemenation of CSSBuilderAbstract. * CSSBuilderAbstract Outlines the interface between CSSParser and it's rule-builder. Compose CSSParser with a concrete implementation of the builder to get usable results from the CSS parser. Dependencies: python 2.3 (or greater) re """ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Imports #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ import re import cssSpecial #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Definitions #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def isAtRuleIdent(src, ident): return re.match(r'^@' + ident + r'\s*', src) def stripAtRuleIdent(src): return re.sub(r'^@[a-z\-]+\s*', '', src) class CSSSelectorAbstract(object): """Outlines the interface between CSSParser and it's rule-builder for selectors. CSSBuilderAbstract.selector and CSSBuilderAbstract.combineSelectors must return concrete implementations of this abstract. See css.CSSMutableSelector for an example implementation. """ def addHashId(self, hashId): raise NotImplementedError('Subclass responsibility') def addClass(self, class_): raise NotImplementedError('Subclass responsibility') def addAttribute(self, attrName): raise NotImplementedError('Subclass responsibility') def addAttributeOperation(self, attrName, op, attrValue): raise NotImplementedError('Subclass responsibility') def addPseudo(self, name): raise NotImplementedError('Subclass responsibility') def addPseudoFunction(self, name, value): raise NotImplementedError('Subclass responsibility') class CSSBuilderAbstract(object): """Outlines the interface between CSSParser and it's rule-builder. Compose CSSParser with a concrete implementation of the builder to get usable results from the CSS parser. See css.CSSBuilder for an example implementation """ def setCharset(self, charset): raise NotImplementedError('Subclass responsibility') #~ css results ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def beginStylesheet(self): raise NotImplementedError('Subclass responsibility') def stylesheet(self, elements): raise NotImplementedError('Subclass responsibility') def endStylesheet(self): raise NotImplementedError('Subclass responsibility') def beginInline(self): raise NotImplementedError('Subclass responsibility') def inline(self, declarations): raise NotImplementedError('Subclass responsibility') def endInline(self): raise NotImplementedError('Subclass responsibility') def ruleset(self, selectors, declarations): raise NotImplementedError('Subclass responsibility') #~ css namespaces ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def resolveNamespacePrefix(self, nsPrefix, name): raise NotImplementedError('Subclass responsibility') #~ css @ directives ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def atCharset(self, charset): raise NotImplementedError('Subclass responsibility') def atImport(self, import_, mediums, cssParser): raise NotImplementedError('Subclass responsibility') def atNamespace(self, nsPrefix, uri): raise NotImplementedError('Subclass responsibility') def atMedia(self, mediums, ruleset): raise NotImplementedError('Subclass responsibility') def atPage(self, page, pseudopage, declarations): raise NotImplementedError('Subclass responsibility') def atFontFace(self, declarations): raise NotImplementedError('Subclass responsibility') def atIdent(self, atIdent, cssParser, src): return src, NotImplemented #~ css selectors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def combineSelectors(self, selectorA, combiner, selectorB): """Return value must implement CSSSelectorAbstract""" raise NotImplementedError('Subclass responsibility') def selector(self, name): """Return value must implement CSSSelectorAbstract""" raise NotImplementedError('Subclass responsibility') #~ css declarations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def property(self, name, value, important=False): raise NotImplementedError('Subclass responsibility') def combineTerms(self, termA, combiner, termB): raise NotImplementedError('Subclass responsibility') def termIdent(self, value): raise NotImplementedError('Subclass responsibility') def termNumber(self, value, units=None): raise NotImplementedError('Subclass responsibility') def termRGB(self, value): raise NotImplementedError('Subclass responsibility') def termURI(self, value): raise NotImplementedError('Subclass responsibility') def termString(self, value): raise NotImplementedError('Subclass responsibility') def termUnicodeRange(self, value): raise NotImplementedError('Subclass responsibility') def termFunction(self, name, value): raise NotImplementedError('Subclass responsibility') def termUnknown(self, src): raise NotImplementedError('Subclass responsibility') #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ CSS Parser #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSParseError(Exception): src = None ctxsrc = None fullsrc = None inline = False srcCtxIdx = None srcFullIdx = None ctxsrcFullIdx = None def __init__(self, msg, src, ctxsrc=None): Exception.__init__(self, msg) self.src = src self.ctxsrc = ctxsrc or src if self.ctxsrc: self.srcCtxIdx = self.ctxsrc.find(self.src) if self.srcCtxIdx < 0: del self.srcCtxIdx def __str__(self): if self.ctxsrc: return Exception.__str__(self) + ':: (' + repr(self.ctxsrc[:self.srcCtxIdx]) + ', ' + repr(self.ctxsrc[self.srcCtxIdx:self.srcCtxIdx+20]) + ')' else: return Exception.__str__(self) + ':: ' + repr(self.src[:40]) def setFullCSSSource(self, fullsrc, inline=False): self.fullsrc = fullsrc if inline: self.inline = inline if self.fullsrc: self.srcFullIdx = self.fullsrc.find(self.src) if self.srcFullIdx < 0: del self.srcFullIdx self.ctxsrcFullIdx = self.fullsrc.find(self.ctxsrc) if self.ctxsrcFullIdx < 0: del self.ctxsrcFullIdx #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class CSSParser(object): """CSS-2.1 parser dependent only upon the re module. Implemented directly from http://www.w3.org/TR/CSS21/grammar.html Tested with some existing CSS stylesheets for portability. CSS Parsing API: * setCSSBuilder() To set your concrete implementation of CSSBuilderAbstract * parseFile() Use to parse external stylesheets using a file-like object >>> cssFile = open('test.css', 'r') >>> stylesheets = myCSSParser.parseFile(cssFile) * parse() Use to parse embedded stylesheets using source string >>> cssSrc = ''' body,body.body { font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif; background: White; color: Black; } a {text-decoration: underline;} ''' >>> stylesheets = myCSSParser.parse(cssSrc) * parseInline() Use to parse inline stylesheets using attribute source string >>> style = 'font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif; background: White; color: Black' >>> stylesheets = myCSSParser.parseInline(style) * parseAttributes() Use to parse attribute string values into inline stylesheets >>> stylesheets = myCSSParser.parseAttributes( font='110%, "Times New Roman", Arial, Verdana, Helvetica, serif', background='White', color='Black') * parseSingleAttr() Use to parse a single string value into a CSS expression >>> fontValue = myCSSParser.parseSingleAttr('110%, "Times New Roman", Arial, Verdana, Helvetica, serif') """ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Constants / Variables / Etc. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ParseError = CSSParseError AttributeOperators = ['=', '~=', '|=', '&=', '^=', '!=', '<>'] SelectorQualifiers = ('#', '.', '[', ':') SelectorCombiners = ['+', '>'] ExpressionOperators = ('/', '+', ',') #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Regular expressions #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if True: # makes the following code foldable _orRule = lambda *args: '|'.join(args) _reflags = re.I | re.M | re.U i_hex = '[0-9a-fA-F]' i_nonascii = u'[\200-\377]' i_unicode = '\\\\(?:%s){1,6}\s?' % i_hex i_escape = _orRule(i_unicode, u'\\\\[ -~\200-\377]') # i_nmstart = _orRule('[A-Za-z_]', i_nonascii, i_escape) i_nmstart = _orRule('\-[^0-9]|[A-Za-z_]', i_nonascii, i_escape) # XXX Added hyphen, http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier i_nmchar = _orRule('[0-9A-Za-z_-]', i_nonascii, i_escape) i_ident = '((?:%s)(?:%s)*)' % (i_nmstart,i_nmchar) re_ident = re.compile(i_ident, _reflags) i_element_name = '((?:%s)|\*)' % (i_ident[1:-1],) re_element_name = re.compile(i_element_name, _reflags) i_namespace_selector = '((?:%s)|\*|)\|(?!=)' % (i_ident[1:-1],) re_namespace_selector = re.compile(i_namespace_selector, _reflags) i_class = '\\.' + i_ident re_class = re.compile(i_class, _reflags) i_hash = '#((?:%s)+)' % i_nmchar re_hash = re.compile(i_hash, _reflags) i_rgbcolor = '(#%s{6}|#%s{3})' % (i_hex, i_hex) re_rgbcolor = re.compile(i_rgbcolor, _reflags) i_nl = u'\n|\r\n|\r|\f' i_escape_nl = u'\\\\(?:%s)' % i_nl i_string_content = _orRule(u'[\t !#$%&(-~]', i_escape_nl, i_nonascii, i_escape) i_string1 = u'\"((?:%s|\')*)\"' % i_string_content i_string2 = u'\'((?:%s|\")*)\'' % i_string_content i_string = _orRule(i_string1, i_string2) re_string = re.compile(i_string, _reflags) i_uri = u'url\\((?:(?:%s)|((?:%s)+))\\)' % (i_string, _orRule('[!#$%&*-~]', i_nonascii, i_escape)) # XXX For now # i_uri = u'(url\\(.*?\\))' re_uri = re.compile(i_uri, _reflags) i_num = u'(([-+]?[0-9]+(?:\\.[0-9]+)?)|([-+]?\\.[0-9]+))' # XXX Added out paranthesis, because e.g. .5em was not parsed correctly re_num = re.compile(i_num, _reflags) i_unit = '(%%|%s)?' % i_ident re_unit = re.compile(i_unit, _reflags) i_function = i_ident + '\\(' re_function = re.compile(i_function, _reflags) i_functionterm = u'[-+]?' + i_function re_functionterm = re.compile(i_functionterm, _reflags) i_unicoderange1 = "(?:U\\+%s{1,6}-%s{1,6})" % (i_hex, i_hex) i_unicoderange2 = "(?:U\\+\?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h}))))))" i_unicoderange = i_unicoderange1 # u'(%s|%s)' % (i_unicoderange1, i_unicoderange2) re_unicoderange = re.compile(i_unicoderange, _reflags) # i_comment = u'(?:\/\*[^*]*\*+([^/*][^*]*\*+)*\/)|(?://.*)' # gabriel: only C convention for comments is allowed in CSS i_comment = u'(?:\/\*[^*]*\*+([^/*][^*]*\*+)*\/)' re_comment = re.compile(i_comment, _reflags) i_important = u'!\s*(important)' re_important = re.compile(i_important, _reflags) del _orRule #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Public #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def __init__(self, cssBuilder=None): self.setCSSBuilder(cssBuilder) #~ CSS Builder to delegate to ~~~~~~~~~~~~~~~~~~~~~~~~ def getCSSBuilder(self): return self._cssBuilder def setCSSBuilder(self, cssBuilder): self._cssBuilder = cssBuilder cssBuilder = property(getCSSBuilder, setCSSBuilder) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Public CSS Parsing API #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def parseFile(self, srcFile, closeFile=False): """Parses CSS file-like objects using the current cssBuilder. Use for external stylesheets.""" try: result = self.parse(srcFile.read()) finally: if closeFile: srcFile.close() return result def parse(self, src): """Parses CSS string source using the current cssBuilder. Use for embedded stylesheets.""" self.cssBuilder.beginStylesheet() try: # XXX Some simple preprocessing src = cssSpecial.cleanupCSS(src) try: src, stylesheet = self._parseStylesheet(src) except self.ParseError, err: err.setFullCSSSource(src) raise finally: self.cssBuilder.endStylesheet() return stylesheet def parseInline(self, src): """Parses CSS inline source string using the current cssBuilder. Use to parse a tag's 'sytle'-like attribute.""" self.cssBuilder.beginInline() try: try: src, properties = self._parseDeclarationGroup(src.strip(), braces=False) except self.ParseError, err: err.setFullCSSSource(src, inline=True) raise result = self.cssBuilder.inline(properties) finally: self.cssBuilder.endInline() return result def parseAttributes(self, attributes={}, **kwAttributes): """Parses CSS attribute source strings, and return as an inline stylesheet. Use to parse a tag's highly CSS-based attributes like 'font'. See also: parseSingleAttr """ if attributes: kwAttributes.update(attributes) self.cssBuilder.beginInline() try: properties = [] try: for propertyName, src in kwAttributes.iteritems(): src, property = self._parseDeclarationProperty(src.strip(), propertyName) properties.append(property) except self.ParseError, err: err.setFullCSSSource(src, inline=True) raise result = self.cssBuilder.inline(properties) finally: self.cssBuilder.endInline() return result def parseSingleAttr(self, attrValue): """Parse a single CSS attribute source string, and returns the built CSS expression. Use to parse a tag's highly CSS-based attributes like 'font'. See also: parseAttributes """ results = self.parseAttributes(temp=attrValue) if 'temp' in results[1]: return results[1]['temp'] else: return results[0]['temp'] #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ Internal _parse methods #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def _parseStylesheet(self, src): """stylesheet : [ CHARSET_SYM S* STRING S* ';' ]? [S|CDO|CDC]* [ import [S|CDO|CDC]* ]* [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]* ; """ # Get rid of the comments src = self.re_comment.sub(u'', src) # [ CHARSET_SYM S* STRING S* ';' ]? src = self._parseAtCharset(src) # [S|CDO|CDC]* src = self._parseSCDOCDC(src) # [ import [S|CDO|CDC]* ]* src, stylesheetImports = self._parseAtImports(src) # [ namespace [S|CDO|CDC]* ]* src = self._parseAtNamespace(src) stylesheetElements = [] # [ [ ruleset | atkeywords ] [S|CDO|CDC]* ]* while src: # due to ending with ]* if src.startswith('@'): # @media, @page, @font-face src, atResults = self._parseAtKeyword(src) if atResults is not None: stylesheetElements.extend(atResults) else: # ruleset src, ruleset = self._parseRuleset(src) stylesheetElements.append(ruleset) # [S|CDO|CDC]* src = self._parseSCDOCDC(src) stylesheet = self.cssBuilder.stylesheet(stylesheetElements, stylesheetImports) return src, stylesheet def _parseSCDOCDC(self, src): """[S|CDO|CDC]*""" while 1: src = src.lstrip() if src.startswith(''): src = src[3:] else: break return src #~ CSS @ directives ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def _parseAtCharset(self, src): """[ CHARSET_SYM S* STRING S* ';' ]?""" if isAtRuleIdent(src, 'charset'): src = stripAtRuleIdent(src) charset, src = self._getString(src) src = src.lstrip() if src[:1] != ';': raise self.ParseError('@charset expected a terminating \';\'', src, ctxsrc) src = src[1:].lstrip() self.cssBuilder.atCharset(charset) return src def _parseAtImports(self, src): """[ import [S|CDO|CDC]* ]*""" result = [] while isAtRuleIdent(src, 'import'): ctxsrc = src src = stripAtRuleIdent(src) import_, src = self._getStringOrURI(src) if import_ is None: raise self.ParseError('Import expecting string or url', src, ctxsrc) mediums = [] medium, src = self._getIdent(src.lstrip()) while medium is not None: mediums.append(medium) if src[:1] == ',': src = src[1:].lstrip() medium, src = self._getIdent(src) else: break # XXX No medium inherits and then "all" is appropriate if not mediums: mediums = ["all"] if src[:1] != ';': raise self.ParseError('@import expected a terminating \';\'', src, ctxsrc) src = src[1:].lstrip() stylesheet = self.cssBuilder.atImport(import_, mediums, self) if stylesheet is not None: result.append(stylesheet) src = self._parseSCDOCDC(src) return src, result def _parseAtNamespace(self, src): """namespace : @namespace S* [IDENT S*]? [STRING|URI] S* ';' S* """ src = self._parseSCDOCDC(src) while isAtRuleIdent(src, 'namespace'): ctxsrc = src src = stripAtRuleIdent(src) namespace, src = self._getStringOrURI(src) if namespace is None: nsPrefix, src = self._getIdent(src) if nsPrefix is None: raise self.ParseError('@namespace expected an identifier or a URI', src, ctxsrc) namespace, src = self._getStringOrURI(src.lstrip()) if namespace is None: raise self.ParseError('@namespace expected a URI', src, ctxsrc) else: nsPrefix = None src = src.lstrip() if src[:1] != ';': raise self.ParseError('@namespace expected a terminating \';\'', src, ctxsrc) src = src[1:].lstrip() self.cssBuilder.atNamespace(nsPrefix, namespace) src = self._parseSCDOCDC(src) return src def _parseAtKeyword(self, src): """[media | page | font_face | unknown_keyword]""" ctxsrc = src if isAtRuleIdent(src, 'media'): src, result = self._parseAtMedia(src) elif isAtRuleIdent(src, 'page'): src, result = self._parseAtPage(src) elif isAtRuleIdent(src, 'font-face'): src, result = self._parseAtFontFace(src) # XXX added @import, was missing! elif isAtRuleIdent(src, 'import'): src, result = self._parseAtImports(src) elif isAtRuleIdent(src, 'frame'): src, result = self._parseAtFrame(src) elif src.startswith('@'): src, result = self._parseAtIdent(src) else: raise self.ParseError('Unknown state in atKeyword', src, ctxsrc) return src, result def _parseAtMedia(self, src): """media : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S* ; """ ctxsrc = src src = src[len('@media '):].lstrip() mediums = [] while src and src[0] != '{': medium, src = self._getIdent(src) if medium is None: raise self.ParseError('@media rule expected media identifier', src, ctxsrc) mediums.append(medium) if src[0] == ',': src = src[1:].lstrip() else: src = src.lstrip() if not src.startswith('{'): raise self.ParseError('Ruleset opening \'{\' not found', src, ctxsrc) src = src[1:].lstrip() stylesheetElements = [] #while src and not src.startswith('}'): # src, ruleset = self._parseRuleset(src) # stylesheetElements.append(ruleset) # src = src.lstrip() # Containing @ where not found and parsed while src and not src.startswith('}'): if src.startswith('@'): # @media, @page, @font-face src, atResults = self._parseAtKeyword(src) if atResults is not None: stylesheetElements.extend(atResults) else: # ruleset src, ruleset = self._parseRuleset(src) stylesheetElements.append(ruleset) src = src.lstrip() if not src.startswith('}'): raise self.ParseError('Ruleset closing \'}\' not found', src, ctxsrc) else: src = src[1:].lstrip() result = self.cssBuilder.atMedia(mediums, stylesheetElements) return src, result def _parseAtPage(self, src): """page : PAGE_SYM S* IDENT? pseudo_page? S* '{' S* declaration [ ';' S* declaration ]* '}' S* ; """ ctxsrc = src src = src[len('@page '):].lstrip() page, src = self._getIdent(src) if src[:1] == ':': pseudopage, src = self._getIdent(src[1:]) else: pseudopage = None #src, properties = self._parseDeclarationGroup(src.lstrip()) # Containing @ where not found and parsed stylesheetElements = [] src = src.lstrip() properties = [] # XXX Extended for PDF use if not src.startswith('{'): raise self.ParseError('Ruleset opening \'{\' not found', src, ctxsrc) else: src = src[1:].lstrip() while src and not src.startswith('}'): if src.startswith('@'): # @media, @page, @font-face src, atResults = self._parseAtKeyword(src) if atResults is not None: stylesheetElements.extend(atResults) else: src, nproperties = self._parseDeclarationGroup(src.lstrip(), braces=False) properties += nproperties src = src.lstrip() result = [self.cssBuilder.atPage(page, pseudopage, properties)] return src[1:].lstrip(), result def _parseAtFrame(self, src): """ XXX Proprietary for PDF """ ctxsrc = src src = src[len('@frame '):].lstrip() box, src = self._getIdent(src) src, properties = self._parseDeclarationGroup(src.lstrip()) result = [self.cssBuilder.atFrame(box, properties)] return src.lstrip(), result def _parseAtFontFace(self, src): ctxsrc = src src = src[len('@font-face '):].lstrip() src, properties = self._parseDeclarationGroup(src) result = [self.cssBuilder.atFontFace(properties)] return src, result def _parseAtIdent(self, src): ctxsrc = src atIdent, src = self._getIdent(src[1:]) if atIdent is None: raise self.ParseError('At-rule expected an identifier for the rule', src, ctxsrc) src, result = self.cssBuilder.atIdent(atIdent, self, src) if result is NotImplemented: # An at-rule consists of everything up to and including the next semicolon (;) or the next block, whichever comes first semiIdx = src.find(';') if semiIdx < 0: semiIdx = None blockIdx = src[:semiIdx].find('{') if blockIdx < 0: blockIdx = None if semiIdx is not None and semiIdx < blockIdx: src = src[semiIdx+1:].lstrip() elif blockIdx is None: # consume the rest of the content since we didn't find a block or a semicolon src = src[-1:-1] elif blockIdx is not None: # expecing a block... src = src[blockIdx:] try: # try to parse it as a declarations block src, declarations = self._parseDeclarationGroup(src) except self.ParseError: # try to parse it as a stylesheet block src, stylesheet = self._parseStylesheet(src) else: raise self.ParserError('Unable to ignore @-rule block', src, ctxsrc) return src.lstrip(), result #~ ruleset - see selector and declaration groups ~~~~ def _parseRuleset(self, src): """ruleset : selector [ ',' S* selector ]* '{' S* declaration [ ';' S* declaration ]* '}' S* ; """ src, selectors = self._parseSelectorGroup(src) src, properties = self._parseDeclarationGroup(src.lstrip()) result = self.cssBuilder.ruleset(selectors, properties) return src, result #~ selector parsing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def _parseSelectorGroup(self, src): selectors = [] while src[:1] not in ('{','}', ']','(',')', ';', ''): src, selector = self._parseSelector(src) if selector is None: break selectors.append(selector) if src.startswith(','): src = src[1:].lstrip() return src, selectors def _parseSelector(self, src): """selector : simple_selector [ combinator simple_selector ]* ; """ src, selector = self._parseSimpleSelector(src) srcLen = len(src) # XXX while src[:1] not in ('', ',', ';', '{','}', '[',']','(',')'): for combiner in self.SelectorCombiners: if src.startswith(combiner): src = src[len(combiner):].lstrip() break else: combiner = ' ' src, selectorB = self._parseSimpleSelector(src) # XXX Fix a bug that occured here e.g. : .1 {...} if len(src) >= srcLen: src = src[1:] while src and (src[:1] not in ('', ',', ';', '{','}', '[',']','(',')')): src = src[1:] return src.lstrip(), None selector = self.cssBuilder.combineSelectors(selector, combiner, selectorB) return src.lstrip(), selector def _parseSimpleSelector(self, src): """simple_selector : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S* ; """ ctxsrc = src.lstrip() nsPrefix, src = self._getMatchResult(self.re_namespace_selector, src) name, src = self._getMatchResult(self.re_element_name, src) if name: pass # already *successfully* assigned elif src[:1] in self.SelectorQualifiers: name = '*' else: raise self.ParseError('Selector name or qualifier expected', src, ctxsrc) name = self.cssBuilder.resolveNamespacePrefix(nsPrefix, name) selector = self.cssBuilder.selector(name) while src and src[:1] in self.SelectorQualifiers: hash_, src = self._getMatchResult(self.re_hash, src) if hash_ is not None: selector.addHashId(hash_) continue class_, src = self._getMatchResult(self.re_class, src) if class_ is not None: selector.addClass(class_) continue if src.startswith('['): src, selector = self._parseSelectorAttribute(src, selector) elif src.startswith(':'): src, selector = self._parseSelectorPseudo(src, selector) else: break return src.lstrip(), selector def _parseSelectorAttribute(self, src, selector): """attrib : '[' S* [ namespace_selector ]? IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* [ IDENT | STRING ] S* ]? ']' ; """ ctxsrc = src if not src.startswith('['): raise self.ParseError('Selector Attribute opening \'[\' not found', src, ctxsrc) src = src[1:].lstrip() nsPrefix, src = self._getMatchResult(self.re_namespace_selector, src) attrName, src = self._getIdent(src) if attrName is None: raise self.ParseError('Expected a selector attribute name', src, ctxsrc) if nsPrefix is not None: attrName = self.cssBuilder.resolveNamespacePrefix(nsPrefix, attrName) for op in self.AttributeOperators: if src.startswith(op): break else: op = '' src = src[len(op):].lstrip() if op: attrValue, src = self._getIdent(src) if attrValue is None: attrValue, src = self._getString(src) if attrValue is None: raise self.ParseError('Expected a selector attribute value', src, ctxsrc) else: attrValue = None if not src.startswith(']'): raise self.ParseError('Selector Attribute closing \']\' not found', src, ctxsrc) else: src = src[1:] if op: selector.addAttributeOperation(attrName, op, attrValue) else: selector.addAttribute(attrName) return src, selector def _parseSelectorPseudo(self, src, selector): """pseudo : ':' [ IDENT | function ] ; """ ctxsrc = src if not src.startswith(':'): raise self.ParseError('Selector Pseudo \':\' not found', src, ctxsrc) src = src[1:] name, src = self._getIdent(src) if not name: raise self.ParseError('Selector Pseudo identifier not found', src, ctxsrc) if src.startswith('('): # function src = src[1:].lstrip() src, term = self._parseExpression(src, True) if not src.startswith(')'): raise self.ParseError('Selector Pseudo Function closing \')\' not found', src, ctxsrc) src = src[1:] selector.addPseudoFunction(name, term) else: selector.addPseudo(name) return src, selector #~ declaration and expression parsing ~~~~~~~~~~~~~~~ def _parseDeclarationGroup(self, src, braces=True): ctxsrc = src if src.startswith('{'): src, braces = src[1:], True elif braces: raise self.ParseError('Declaration group opening \'{\' not found', src, ctxsrc) properties = [] src = src.lstrip() while src[:1] not in ('', ',', '{','}', '[',']','(',')','@'): # XXX @? src, property = self._parseDeclaration(src) # XXX Workaround for styles like "*font: smaller" if src.startswith("*"): src = "-nothing-" + src[1:] continue if property is None: break properties.append(property) if src.startswith(';'): src = src[1:].lstrip() else: break if braces: if not src.startswith('}'): raise self.ParseError('Declaration group closing \'}\' not found', src, ctxsrc) src = src[1:] return src.lstrip(), properties def _parseDeclaration(self, src): """declaration : ident S* ':' S* expr prio? | /* empty */ ; """ # property propertyName, src = self._getIdent(src) if propertyName is not None: src = src.lstrip() # S* : S* if src[:1] in (':', '='): # Note: we are being fairly flexable here... technically, the # ":" is *required*, but in the name of flexibility we # suppor a null transition, as well as an "=" transition src = src[1:].lstrip() src, property = self._parseDeclarationProperty(src, propertyName) else: property = None return src, property def _parseDeclarationProperty(self, src, propertyName): # expr src, expr = self._parseExpression(src) # prio? important, src = self._getMatchResult(self.re_important, src) src = src.lstrip() property = self.cssBuilder.property(propertyName, expr, important) return src, property def _parseExpression(self, src, returnList=False): """ expr : term [ operator term ]* ; """ src, term = self._parseExpressionTerm(src) operator = None while src[:1] not in ('', ';', '{','}', '[',']', ')'): for operator in self.ExpressionOperators: if src.startswith(operator): src = src[len(operator):] break else: operator = ' ' src, term2 = self._parseExpressionTerm(src.lstrip()) if term2 is NotImplemented: break else: term = self.cssBuilder.combineTerms(term, operator, term2) if operator is None and returnList: term = self.cssBuilder.combineTerms(term, None, None) return src, term else: return src, term def _parseExpressionTerm(self, src): """term : unary_operator? [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* | TIME S* | FREQ S* | function ] | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor ; """ ctxsrc = src result, src = self._getMatchResult(self.re_num, src) if result is not None: units, src = self._getMatchResult(self.re_unit, src) term = self.cssBuilder.termNumber(result, units) return src.lstrip(), term result, src = self._getString(src, self.re_uri) if result is not None: # XXX URL!!!! term = self.cssBuilder.termURI(result) return src.lstrip(), term result, src = self._getString(src) if result is not None: term = self.cssBuilder.termString(result) return src.lstrip(), term result, src = self._getMatchResult(self.re_functionterm, src) if result is not None: src, params = self._parseExpression(src, True) if src[0] != ')': raise self.ParseError('Terminal function expression expected closing \')\'', src, ctxsrc) src = src[1:].lstrip() term = self.cssBuilder.termFunction(result, params) return src, term result, src = self._getMatchResult(self.re_rgbcolor, src) if result is not None: term = self.cssBuilder.termRGB(result) return src.lstrip(), term result, src = self._getMatchResult(self.re_unicoderange, src) if result is not None: term = self.cssBuilder.termUnicodeRange(result) return src.lstrip(), term nsPrefix, src = self._getMatchResult(self.re_namespace_selector, src) result, src = self._getIdent(src) if result is not None: if nsPrefix is not None: result = self.cssBuilder.resolveNamespacePrefix(nsPrefix, result) term = self.cssBuilder.termIdent(result) return src.lstrip(), term return self.cssBuilder.termUnknown(src) #~ utility methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ def _getIdent(self, src, default=None): return self._getMatchResult(self.re_ident, src, default) def _getString(self, src, rexpression=None, default=None): if rexpression is None: rexpression = self.re_string result = rexpression.match(src) if result: strres = filter(None, result.groups()) if strres: strres = strres[0] else: strres = '' return strres, src[result.end():] else: return default, src def _getStringOrURI(self, src): result, src = self._getString(src, self.re_uri) if result is None: result, src = self._getString(src) return result, src def _getMatchResult(self, rexpression, src, default=None, group=1): result = rexpression.match(src) if result: return result.group(group), src[result.end():] else: return default, src PK¨“m8»~PA¦¦sx/w3c/cssParser.pyc;ò 2ÙGc@s†dZdkZdkZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd „ƒYZ d efd „ƒYZ dS( s/CSS-2.1 parser. The CSS 2.1 Specification this parser was derived from can be found at http://www.w3.org/TR/CSS21/ Primary Classes: * CSSParser Parses CSS source forms into results using a Builder Pattern. Must provide concrete implemenation of CSSBuilderAbstract. * CSSBuilderAbstract Outlines the interface between CSSParser and it's rule-builder. Compose CSSParser with a concrete implementation of the builder to get usable results from the CSS parser. Dependencies: python 2.3 (or greater) re NcCstid|d|ƒSdS(Ns^@s\s*(sresmatchsidentssrc(ssrcsident((s)build\bdist.win32\egg\sx\w3c\cssParser.pys isAtRuleIdent*scCstidd|ƒSdS(Ns ^@[a-z\-]+\s*s(sressubssrc(ssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pysstripAtRuleIdent-ssCSSSelectorAbstractcBsDtZdZd„Zd„Zd„Zd„Zd„Zd„ZRS(sOutlines the interface between CSSParser and it's rule-builder for selectors. CSSBuilderAbstract.selector and CSSBuilderAbstract.combineSelectors must return concrete implementations of this abstract. See css.CSSMutableSelector for an example implementation. cCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfshashId((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addHashId9scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsclass_((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddClass;scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsattrName((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addAttribute=scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsattrNamesops attrValue((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddAttributeOperation?scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addPseudoAscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddPseudoFunctionCs( s__name__s __module__s__doc__s addHashIdsaddClasss addAttributesaddAttributeOperations addPseudosaddPseudoFunction(((s)build\bdist.win32\egg\sx\w3c\cssParser.pysCSSSelectorAbstract0s      sCSSBuilderAbstractcBstZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zed„Zd„Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Z RS(sîOutlines the interface between CSSParser and it's rule-builder. Compose CSSParser with a concrete implementation of the builder to get usable results from the CSS parser. See css.CSSBuilder for an example implementation cCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCharsetNscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pysbeginStylesheetSscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfselements((s)build\bdist.win32\egg\sx\w3c\cssParser.pys stylesheetUscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endStylesheetWscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys beginInlineZscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfs declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysinline\scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endInline^scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfs selectorss declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysrulesetascCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysresolveNamespacePrefixfscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atCharsetkscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsimport_smediumss cssParser((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatImportmscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsuri((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atNamespaceoscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsmediumssruleset((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatMediaqscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfspages pseudopages declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatPagesscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfs declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atFontFaceuscCs|tfSdS(N(ssrcsNotImplemented(sselfsatIdents cssParserssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatIdentwscCstdƒ‚dS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfs selectorAscombiners selectorB((s)build\bdist.win32\egg\sx\w3c\cssParser.pyscombineSelectors|scCstdƒ‚dS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysselectorscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalues important((s)build\bdist.win32\egg\sx\w3c\cssParser.pysproperty…scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfstermAscombinerstermB((s)build\bdist.win32\egg\sx\w3c\cssParser.pys combineTerms‡scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termIdent‰scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvaluesunits((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termNumber‹scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermRGBscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermURIscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termString‘scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermUnicodeRange“scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termFunction•scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termUnknown—s(!s__name__s __module__s__doc__s setCharsetsbeginStylesheets stylesheets endStylesheets beginInlinesinlines endInlinesrulesetsresolveNamespacePrefixs atCharsetsatImports atNamespacesatMediasatPages atFontFacesatIdentscombineSelectorssselectorsFalsespropertys combineTermss termIdentsNones termNumberstermRGBstermURIs termStringstermUnicodeRanges termFunctions termUnknown(((s)build\bdist.win32\egg\sx\w3c\cssParser.pysCSSBuilderAbstractFs:                            s CSSParseErrorcBsStZeZeZeZeZeZeZ eZ ed„Z d„Z ed„Z RS(NcCsmti||ƒ||_|p||_|io6|ii|iƒ|_|idjo |`qindS(Ni(s Exceptions__init__sselfsmsgssrcsctxsrcsfinds srcCtxIdx(sselfsmsgssrcsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys__init__§s  cCs|ioOti|ƒdt|i|i ƒdt|i|i|id!ƒdSn#ti|ƒdt|id ƒSdS(Ns:: (s, is)s:: i((sselfsctxsrcs Exceptions__str__sreprs srcCtxIdxssrc(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys__str__°s OcCs“||_|o ||_n|ioh|ii|iƒ|_|idjo |`n|ii|iƒ|_|idjo |`qndS(Ni(sfullsrcsselfsinlinesfindssrcs srcFullIdxsctxsrcs ctxsrcFullIdx(sselfsfullsrcsinline((s)build\bdist.win32\egg\sx\w3c\cssParser.pyssetFullCSSSource¶s    (s__name__s __module__sNonessrcsctxsrcsfullsrcsFalsesinlines srcCtxIdxs srcFullIdxs ctxsrcFullIdxs__init__s__str__ssetFullCSSSource(((s)build\bdist.win32\egg\sx\w3c\cssParser.pys CSSParseErroržs s CSSParsercBsLtZdZeZdddddddgZdd d d fZd d gZdd dfZe oŠd„Z e i e i Be iBZdZdZdeZe edƒZe deeƒZe deeƒZdeefZe ieeƒZdedd!fZe ieeƒZdedd!fZe ieeƒZdeZe ieeƒZdeZe ieeƒZ deefZ!e ie!eƒZ"dZ#d e#Z$e d!e$eeƒZ%d"e%Z&d#e%Z'e e&e'ƒZ(e ie(eƒZ)d$e(e d%eeƒfZ*e ie*eƒZ+d&Z,e ie,eƒZ-d'eZ.e ie.eƒZ/ed(Z0e ie0eƒZ1d)e0Z2e ie2eƒZ3d*eefZ4d+Z5e4Z6e ie6eƒZ7d,Z8e ie8eƒZ9d-Z:e ie:eƒZ;[ ne<d.„Z=d/„Z>d0„Z?e@e>e?ƒZAeBd1„ZCd2„ZDd3„ZEhd4„ZFd5„ZGd6„ZHd7„ZId8„ZJd9„ZKd:„ZLd;„ZMd<„ZNd=„ZOd>„ZPd?„ZQd@„ZRdA„ZSdB„ZTdC„ZUdD„ZVdE„ZWdF„ZXe dG„ZYdH„ZZdI„Z[eBdJ„Z\dK„Z]e<dL„Z^e<e<dM„Z_dN„Z`e<ddO„ZaRS(PsñCSS-2.1 parser dependent only upon the re module. Implemented directly from http://www.w3.org/TR/CSS21/grammar.html Tested with some existing CSS stylesheets for portability. CSS Parsing API: * setCSSBuilder() To set your concrete implementation of CSSBuilderAbstract * parseFile() Use to parse external stylesheets using a file-like object >>> cssFile = open('test.css', 'r') >>> stylesheets = myCSSParser.parseFile(cssFile) * parse() Use to parse embedded stylesheets using source string >>> cssSrc = ''' body,body.body { font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif; background: White; color: Black; } a {text-decoration: underline;} ''' >>> stylesheets = myCSSParser.parse(cssSrc) * parseInline() Use to parse inline stylesheets using attribute source string >>> style = 'font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif; background: White; color: Black' >>> stylesheets = myCSSParser.parseInline(style) * parseAttributes() Use to parse attribute string values into inline stylesheets >>> stylesheets = myCSSParser.parseAttributes( font='110%, "Times New Roman", Arial, Verdana, Helvetica, serif', background='White', color='Black') * parseSingleAttr() Use to parse a single string value into a CSS expression >>> fontValue = myCSSParser.parseSingleAttr('110%, "Times New Roman", Arial, Verdana, Helvetica, serif') s=s~=s|=s&=s^=s!=s<>s#s.s[s:s+s>s/s,cGs di|ƒS(Ns|(sjoinsargs(sargs((s)build\bdist.win32\egg\sx\w3c\cssParser.pysss [0-9a-fA-F]u[€-ÿ]s\\(?:%s){1,6}\s?u \\[ -~€-ÿ]s\-[^0-9]|[A-Za-z_]s [0-9A-Za-z_-]s((?:%s)(?:%s)*)s ((?:%s)|\*)iiÿÿÿÿs((?:%s)|\*|)\|(?!=)s\.s #((?:%s)+)s(#%s{6}|#%s{3})u | | | u\\(?:%s)u [ !#$%&(-~]u "((?:%s|')*)"u '((?:%s|")*)'uurl\((?:(?:%s)|((?:%s)+))\)s [!#$%&*-~]u,(([-+]?[0-9]+(?:\.[0-9]+)?)|([-+]?\.[0-9]+))s(%%|%s)?s\(u[-+]?s(?:U\+%s{1,6}-%s{1,6})sO(?:U\+\?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h}))))))u"(?:\/\*[^*]*\*+([^/*][^*]*\*+)*\/)u!\s*(important)cCs|i|ƒdS(N(sselfs setCSSBuilders cssBuilder(sselfs cssBuilder((s)build\bdist.win32\egg\sx\w3c\cssParser.pys__init__>scCs |iSdS(N(sselfs _cssBuilder(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys getCSSBuilderCscCs ||_dS(N(s cssBuildersselfs _cssBuilder(sselfs cssBuilder((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCSSBuilderEscCs:z|i|iƒƒ}Wd|o|iƒnX|SdS(s`Parses CSS file-like objects using the current cssBuilder. Use for external stylesheets.N(sselfsparsessrcFilesreadsresults closeFilesclose(sselfssrcFiles closeFilesresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys parseFileMscCs}|iiƒzWti|ƒ}y|i|ƒ\}}Wn(|ij o}|i |ƒ‚nXWd|ii ƒX|SdS(s\Parses CSS string source using the current cssBuilder. Use for embedded stylesheets.N( sselfs cssBuildersbeginStylesheets cssSpecials cleanupCSSssrcs_parseStylesheets stylesheets ParseErrorserrssetFullCSSSources endStylesheet(sselfssrcs stylesheetserr((s)build\bdist.win32\egg\sx\w3c\cssParser.pysparseXs   cCs’|iiƒzly%|i|iƒdtƒ\}}Wn.|ij o}|i |dt ƒ‚nX|ii |ƒ}Wd|iiƒX|SdS(srParses CSS inline source string using the current cssBuilder. Use to parse a tag's 'sytle'-like attribute.sbracessinlineN(sselfs cssBuilders beginInlines_parseDeclarationGroupssrcsstripsFalses propertiess ParseErrorserrssetFullCSSSourcesTruesinlinesresults endInline(sselfssrcserrsresults properties((s)build\bdist.win32\egg\sx\w3c\cssParser.pys parseInlineks %c Ks×|o|i|ƒn|iiƒz™g}yLxE|iƒD]7\}}|i |i ƒ|ƒ\}}|i |ƒq>WWn.|ij o}|i|dtƒ‚nX|ii|ƒ}Wd|iiƒX|SdS(sºParses CSS attribute source strings, and return as an inline stylesheet. Use to parse a tag's highly CSS-based attributes like 'font'. See also: parseSingleAttr sinlineN(s attributess kwAttributessupdatesselfs cssBuilders beginInlines propertiess iteritemss propertyNamessrcs_parseDeclarationPropertysstripspropertysappends ParseErrorserrssetFullCSSSourcesTruesinlinesresults endInline( sselfs attributess kwAttributesssrcserrs propertiessresultspropertys propertyName((s)build\bdist.win32\egg\sx\w3c\cssParser.pysparseAttributes|s$  cCsC|id|ƒ}d|djo|ddSn |ddSdS(sÃParse a single CSS attribute source string, and returns the built CSS expression. Use to parse a tag's highly CSS-based attributes like 'font'. See also: parseAttributes stempiiN(sselfsparseAttributess attrValuesresults(sselfs attrValuesresults((s)build\bdist.win32\egg\sx\w3c\cssParser.pysparseSingleAttr–s cCs|iid|ƒ}|i|ƒ}|i|ƒ}|i|ƒ\}}|i|ƒ}g}x„|o||i dƒo7|i |ƒ\}}|t j o|i|ƒqÐn#|i|ƒ\}}|i|ƒ|i|ƒ}q`W|ii||ƒ}||fSdS(sÀstylesheet : [ CHARSET_SYM S* STRING S* ';' ]? [S|CDO|CDC]* [ import [S|CDO|CDC]* ]* [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]* ; us@N(sselfs re_commentssubssrcs_parseAtCharsets _parseSCDOCDCs_parseAtImportssstylesheetImportss_parseAtNamespacesstylesheetElementss startswiths_parseAtKeywords atResultssNonesextends _parseRulesetsrulesetsappends cssBuilders stylesheet(sselfssrcsstylesheetElementss stylesheetsrulesetsstylesheetImportss atResults((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseStylesheet§s$  cCs`xUnoM|iƒ}|idƒo|d}q|idƒo|d}qPq W|SdS(s [S|CDO|CDC]*isiN(ssrcslstrips startswith(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseSCDOCDCÐs cCs“t|dƒo{t|ƒ}|i|ƒ\}}|iƒ}|d djo|id|tƒ‚n|diƒ}|i i |ƒn|SdS(s![ CHARSET_SYM S* STRING S* ';' ]?scharsetis;s#@charset expected a terminating ';'N( s isAtRuleIdentssrcsstripAtRuleIdentsselfs _getStringscharsetslstrips ParseErrorsctxsrcs cssBuilders atCharset(sselfssrcscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtCharsetÞs  cCs‹g}xtt|dƒoc|}t|ƒ}|i|ƒ\}}|tjo|i d||ƒ‚ng}|i |i ƒƒ\}}xZ|tj oL|i|ƒ|d djo)|di ƒ}|i |ƒ\}}qŠPqŠW| o dg}n|d djo|i d||ƒ‚n|di ƒ}|ii|||ƒ}|tj o|i|ƒn|i|ƒ}q W||fSdS( s[ import [S|CDO|CDC]* ]*simportsImport expecting string or urlis,salls;s"@import expected a terminating ';'N(sresults isAtRuleIdentssrcsctxsrcsstripAtRuleIdentsselfs_getStringOrURIsimport_sNones ParseErrorsmediumss _getIdentslstripsmediumsappends cssBuildersatImports stylesheets _parseSCDOCDC(sselfssrcsmediumsimport_s stylesheetsresultsmediumssctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtImportsës8      cCsQ|i|ƒ}x7t|dƒo&|}t|ƒ}|i|ƒ\}}|tjo€|i |ƒ\}}|tjo|i d||ƒ‚n|i|i ƒƒ\}}|tjo|i d||ƒ‚qÜnt}|i ƒ}|d djo|i d||ƒ‚n|di ƒ}|i i||ƒ|i|ƒ}qW|SdS(sNnamespace : @namespace S* [IDENT S*]? [STRING|URI] S* ';' S* s namespaces*@namespace expected an identifier or a URIs@namespace expected a URIis;s%@namespace expected a terminating ';'N(sselfs _parseSCDOCDCssrcs isAtRuleIdentsctxsrcsstripAtRuleIdents_getStringOrURIs namespacesNones _getIdentsnsPrefixs ParseErrorslstrips cssBuilders atNamespace(sselfssrcs namespacesnsPrefixsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtNamespaces,     cCs|}t|dƒo|i|ƒ\}}nãt|dƒo|i|ƒ\}}nºt|dƒo|i|ƒ\}}n‘t|dƒo|i|ƒ\}}nht|dƒo|i |ƒ\}}n?|i dƒo|i |ƒ\}}n|i d||ƒ‚||fSdS( s,[media | page | font_face | unknown_keyword]smediaspages font-facesimportsframes@sUnknown state in atKeywordN( ssrcsctxsrcs isAtRuleIdentsselfs _parseAtMediasresults _parseAtPages_parseAtFontFaces_parseAtImportss _parseAtFrames startswiths _parseAtIdents ParseError(sselfssrcsctxsrcsresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtKeyword/s c Csí|}|tdƒiƒ}g}x–|o|ddjo}|i|ƒ\}}|tjo|i d||ƒ‚n|i |ƒ|ddjo|diƒ}q%|iƒ}q%W|i dƒ o|i d||ƒ‚n|diƒ}g}x’|o|i dƒ oy|i d ƒo7|i |ƒ\}}|tj o|i|ƒqn#|i|ƒ\}}|i |ƒ|iƒ}qþW|i dƒ o|i d ||ƒ‚n|diƒ}|ii||ƒ}||fSd S( s`media : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S* ; s@media is{s%@media rule expected media identifiers,isRuleset opening '{' not founds}s@sRuleset closing '}' not foundN(ssrcsctxsrcslenslstripsmediumssselfs _getIdentsmediumsNones ParseErrorsappends startswithsstylesheetElementss_parseAtKeywords atResultssextends _parseRulesetsrulesets cssBuildersatMediasresult( sselfssrcsmediumsstylesheetElementssrulesetsmediumssctxsrcs atResultssresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtMediaCs>    c Csˆ|}|tdƒiƒ}|i|ƒ\} }|d djo|i|dƒ\}}nt}g}|iƒ}g}|i dƒ o|i d||ƒ‚n|diƒ}x›|o|i dƒ o‚|i dƒo7|i |ƒ\}}|tj o|i|ƒqDn,|i|iƒdtƒ\}}||7}|iƒ}qºW|ii| ||ƒg}|diƒ|fSd S( s‚page : PAGE_SYM S* IDENT? pseudo_page? S* '{' S* declaration [ ';' S* declaration ]* '}' S* ; s@page is:s{sRuleset opening '{' not founds}s@sbracesN(ssrcsctxsrcslenslstripsselfs _getIdentspages pseudopagesNonesstylesheetElementss propertiess startswiths ParseErrors_parseAtKeywords atResultssextends_parseDeclarationGroupsFalses npropertiess cssBuildersatPagesresult( sselfssrcsstylesheetElementssctxsrcs propertiessresults npropertiess pseudopages atResultsspage((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtPagets0  ! cCsx|}|tdƒiƒ}|i|ƒ\}}|i|iƒƒ\}}|i i ||ƒg}|iƒ|fSdS(s) XXX Proprietary for PDF s@frame N( ssrcsctxsrcslenslstripsselfs _getIdentsboxs_parseDeclarationGroups propertiess cssBuildersatFramesresult(sselfssrcsboxs propertiessresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtFramežscCsT|}|tdƒiƒ}|i|ƒ\}}|ii|ƒg}||fSdS(Ns @font-face ( ssrcsctxsrcslenslstripsselfs_parseDeclarationGroups propertiess cssBuilders atFontFacesresult(sselfssrcs propertiessresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtFontFace©s c CsŸ|}|i|dƒ\}}|tjo|id||ƒ‚n|ii|||ƒ\}}|t jo|i dƒ}|djo t}n|| i dƒ}|djo t}n|tj o ||jo||di ƒ}q‹|tjo|dd!}q‹|tj oU||}y|i|ƒ\}}Wq‡|ij o|i|ƒ\}}q‡Xq‹|id||ƒ‚n|i ƒ|fSdS(Nis+At-rule expected an identifier for the rules;is{iÿÿÿÿsUnable to ignore @-rule block(ssrcsctxsrcsselfs _getIdentsatIdentsNones ParseErrors cssBuildersresultsNotImplementedsfindssemiIdxsblockIdxslstrips_parseDeclarationGroups declarationss_parseStylesheets stylesheets ParserError( sselfssrcssemiIdxs declarationssatIdents stylesheetsblockIdxsresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtIdent°s0         cCsS|i|ƒ\}}|i|iƒƒ\}}|ii||ƒ}||fSdS(s€ruleset : selector [ ',' S* selector ]* '{' S* declaration [ ';' S* declaration ]* '}' S* ; N( sselfs_parseSelectorGroupssrcs selectorss_parseDeclarationGroupslstrips propertiess cssBuildersrulesetsresult(sselfssrcsresults propertiess selectors((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseRuleset×s cCsšg}xƒ|d dddddddfjo\|i|ƒ\}}|tjoPn|i|ƒ|id ƒo|diƒ}q q W||fSdS( Nis{s}s]s(s)s;ss,( s selectorsssrcsselfs_parseSelectorsselectorsNonesappends startswithslstrip(sselfssrcsselectors selectors((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorGroupäs&  c CsQ|i|ƒ\}}t|ƒ}x|d dddddddd d f joìxB|iD]1}|i|ƒo|t|ƒi ƒ}PqZqZWd }|i|ƒ\}}t|ƒ|joc|d}xB|o)|d dddddddd d f jo|d}qÊW|i ƒt fSn|i i |||ƒ}q$W|i ƒ|fSd S( sUselector : simple_selector [ combinator simple_selector ]* ; iss,s;s{s}s[s]s(s)s N(sselfs_parseSimpleSelectorssrcsselectorslenssrcLensSelectorCombinersscombiners startswithslstrips selectorBsNones cssBuilderscombineSelectors(sselfssrcscombinersselectorssrcLens selectorB((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorïs( ,   3cCs¯|iƒ}|i|i|ƒ\}}|i|i|ƒ\}}|on4|d |i jo d}n|i d||ƒ‚|i i ||ƒ}|i i |ƒ}xñ|o|d |i joÕ|i|i|ƒ\}}|tj o|i|ƒqªn|i|i|ƒ\}}|tj o|i|ƒqªn|idƒo|i||ƒ\}}qª|idƒo|i||ƒ\}}qªPqªW|iƒ|fSdS(sysimple_selector : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S* ; is*s#Selector name or qualifier expecteds[s:N(ssrcslstripsctxsrcsselfs_getMatchResultsre_namespace_selectorsnsPrefixsre_element_namesnamesSelectorQualifierss ParseErrors cssBuildersresolveNamespacePrefixsselectorsre_hashshash_sNones addHashIdsre_classsclass_saddClasss startswiths_parseSelectorAttributes_parseSelectorPseudo(sselfssrcsnamesnsPrefixsselectorsclass_shash_sctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSimpleSelector s6      cCsà|}|idƒ o|id||ƒ‚n|diƒ}|i|i|ƒ\}}|i |ƒ\}}|t jo|id||ƒ‚n|t j o|i i ||ƒ}nx,|iD]}|i|ƒoPqÆqÆWd}|t|ƒiƒ}|oe|i |ƒ\}}|t jo?|i|ƒ\}}|t jo|id||ƒ‚qiqsnt }|idƒ o|id||ƒ‚n |d}|o|i|||ƒn|i|ƒ||fSd S( s˜attrib : '[' S* [ namespace_selector ]? IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* [ IDENT | STRING ] S* ]? ']' ; s[s(Selector Attribute opening '[' not foundis"Expected a selector attribute namess#Expected a selector attribute values]s(Selector Attribute closing ']' not foundN(ssrcsctxsrcs startswithsselfs ParseErrorslstrips_getMatchResultsre_namespace_selectorsnsPrefixs _getIdentsattrNamesNones cssBuildersresolveNamespacePrefixsAttributeOperatorssopslens attrValues _getStringsselectorsaddAttributeOperations addAttribute(sselfssrcsselectors attrValuesnsPrefixsattrNamesctxsrcsop((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorAttribute/s>      !  cCs |}|idƒ o|id||ƒ‚n|d}|i|ƒ\}}| o|id||ƒ‚n|idƒop|diƒ}|i|t ƒ\}}|idƒ o|id||ƒ‚n|d}|i ||ƒn|i |ƒ||fSdS( s<pseudo : ':' [ IDENT | function ] ; s:sSelector Pseudo ':' not foundis$Selector Pseudo identifier not founds(s)s.Selector Pseudo Function closing ')' not foundN(ssrcsctxsrcs startswithsselfs ParseErrors _getIdentsnameslstrips_parseExpressionsTruestermsselectorsaddPseudoFunctions addPseudo(sselfssrcsselectorstermsnamesctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorPseudo]s"   c Csg|}|idƒo|dtf\}}n!|o|id||ƒ‚ng}|iƒ}x¯|d ddddddd d d f jo‚|i |ƒ\}}|id ƒod |d}qen|t joPn|i |ƒ|idƒo|diƒ}qePqeW|o8|idƒ o|id||ƒ‚n|d}n|iƒ|fSdS(Ns{is'Declaration group opening '{' not foundss,s}s[s]s(s)s@s*s -nothing-s;s'Declaration group closing '}' not found( ssrcsctxsrcs startswithsTruesbracessselfs ParseErrors propertiesslstrips_parseDeclarationspropertysNonesappend(sselfssrcsbracess propertiesspropertysctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseDeclarationGroupzs0 ,  cCs‰|i|ƒ\}}|tj oS|iƒ}|d ddfjo|diƒ}n|i||ƒ\}}nt}||fSdS(sYdeclaration : ident S* ':' S* expr prio? | /* empty */ ; is:s=N(sselfs _getIdentssrcs propertyNamesNoneslstrips_parseDeclarationPropertysproperty(sselfssrcspropertys propertyName((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseDeclarationšs  cCsb|i|ƒ\}}|i|i|ƒ\}}|iƒ}|ii |||ƒ}||fSdS(N( sselfs_parseExpressionssrcsexprs_getMatchResults re_importants importantslstrips cssBuilderspropertys propertyName(sselfssrcs propertyNamesexprs importantsproperty((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseDeclarationProperty²s  cCs|i|ƒ\}}t}x¯|d dddddddfjoˆx<|iD]+}|i|ƒo|t|ƒ}PqNqNWd }|i|i ƒƒ\}}|t joPq|i i |||ƒ}qW|tjo|o&|i i |ttƒ}||fSn ||fSd S( sB expr : term [ operator term ]* ; iss;s{s}s[s]s)s N(sselfs_parseExpressionTermssrcstermsNonesoperatorsExpressionOperatorss startswithslenslstripsterm2sNotImplementeds cssBuilders combineTermss returnList(sselfssrcs returnListstermsterm2soperator((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseExpression½s&&   cCsÞ|}|i|i|ƒ\}}|tj oD|i|i|ƒ\}}|i i ||ƒ}|i ƒ|fSn|i ||iƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i |ƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i|i|ƒ\}}|tj ou|i|tƒ\}}|ddjo|id||ƒ‚n|di ƒ}|i i||ƒ}||fSn|i|i|ƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i|i|ƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i|i|ƒ\}}|i|ƒ\}}|tj oL|tj o|i i||ƒ}n|i i|ƒ}|i ƒ|fSn|i i |ƒSdS(sýterm : unary_operator? [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* | TIME S* | FREQ S* | function ] | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor ; is)s1Terminal function expression expected closing ')'iN(!ssrcsctxsrcsselfs_getMatchResultsre_numsresultsNonesre_unitsunitss cssBuilders termNumberstermslstrips _getStringsre_uristermURIs termStringsre_functionterms_parseExpressionsTruesparamss ParseErrors termFunctions re_rgbcolorstermRGBsre_unicoderangestermUnicodeRangesre_namespace_selectorsnsPrefixs _getIdentsresolveNamespacePrefixs termIdents termUnknown(sselfssrcstermsnsPrefixsparamssresultsunitssctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseExpressionTermØsN        cCs|i|i||ƒSdS(N(sselfs_getMatchResultsre_identssrcsdefault(sselfssrcsdefault((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _getIdentscCs†|tjo |i}n|i|ƒ}|oHtt|iƒƒ}|o|d}nd}|||i ƒfSn ||fSdS(Nis( s rexpressionsNonesselfs re_stringsmatchssrcsresultsfiltersgroupssstrressendsdefault(sselfssrcs rexpressionsdefaultsstrressresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _getStrings  cCsO|i||iƒ\}}|tjo|i|ƒ\}}n||fSdS(N(sselfs _getStringssrcsre_urisresultsNone(sselfssrcsresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_getStringOrURI#s cCsE|i|ƒ}|o!|i|ƒ||iƒfSn ||fSdS(N(s rexpressionsmatchssrcsresultsgroupsendsdefault(sselfs rexpressionssrcsdefaultsgroupsresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_getMatchResult)s!(bs__name__s __module__s__doc__s CSSParseErrors ParseErrorsAttributeOperatorssSelectorQualifierssSelectorCombinerssExpressionOperatorssTrues_orRulesresIsMsUs_reflagssi_hexs i_nonasciis i_unicodesi_escapes i_nmstartsi_nmcharsi_identscompilesre_identsi_element_namesre_element_namesi_namespace_selectorsre_namespace_selectorsi_classsre_classsi_hashsre_hashs i_rgbcolors re_rgbcolorsi_nls i_escape_nlsi_string_contents i_string1s i_string2si_strings re_stringsi_urisre_urisi_numsre_numsi_unitsre_units i_functions re_functionsi_functiontermsre_functiontermsi_unicoderange1si_unicoderange2si_unicoderangesre_unicoderanges i_comments re_comments i_importants re_importantsNones__init__s getCSSBuilders setCSSBuilderspropertys cssBuildersFalses parseFilesparses parseInlinesparseAttributessparseSingleAttrs_parseStylesheets _parseSCDOCDCs_parseAtCharsets_parseAtImportss_parseAtNamespaces_parseAtKeywords _parseAtMedias _parseAtPages _parseAtFrames_parseAtFontFaces _parseAtIdents _parseRulesets_parseSelectorGroups_parseSelectors_parseSimpleSelectors_parseSelectorAttributes_parseSelectorPseudos_parseDeclarationGroups_parseDeclarations_parseDeclarationPropertys_parseExpressions_parseExpressionTerms _getIdents _getStrings_getStringOrURIs_getMatchResult(((s)build\bdist.win32\egg\sx\w3c\cssParser.pys CSSParserÄs° /                   )  $  1 *  '  % .    :  ( s__doc__sres cssSpecials isAtRuleIdentsstripAtRuleIdentsobjectsCSSSelectorAbstractsCSSBuilderAbstracts Exceptions CSSParseErrors CSSParser(s CSSParsersCSSBuilderAbstractsCSSSelectorAbstractsres cssSpecials CSSParseErrorsstripAtRuleIdents isAtRuleIdent((s)build\bdist.win32\egg\sx\w3c\cssParser.pys?s    X&PK¨“m8»~PA¦¦sx/w3c/cssParser.pyo;ò 2ÙGc@s†dZdkZdkZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd „ƒYZ d efd „ƒYZ dS( s/CSS-2.1 parser. The CSS 2.1 Specification this parser was derived from can be found at http://www.w3.org/TR/CSS21/ Primary Classes: * CSSParser Parses CSS source forms into results using a Builder Pattern. Must provide concrete implemenation of CSSBuilderAbstract. * CSSBuilderAbstract Outlines the interface between CSSParser and it's rule-builder. Compose CSSParser with a concrete implementation of the builder to get usable results from the CSS parser. Dependencies: python 2.3 (or greater) re NcCstid|d|ƒSdS(Ns^@s\s*(sresmatchsidentssrc(ssrcsident((s)build\bdist.win32\egg\sx\w3c\cssParser.pys isAtRuleIdent*scCstidd|ƒSdS(Ns ^@[a-z\-]+\s*s(sressubssrc(ssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pysstripAtRuleIdent-ssCSSSelectorAbstractcBsDtZdZd„Zd„Zd„Zd„Zd„Zd„ZRS(sOutlines the interface between CSSParser and it's rule-builder for selectors. CSSBuilderAbstract.selector and CSSBuilderAbstract.combineSelectors must return concrete implementations of this abstract. See css.CSSMutableSelector for an example implementation. cCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfshashId((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addHashId9scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsclass_((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddClass;scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsattrName((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addAttribute=scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsattrNamesops attrValue((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddAttributeOperation?scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addPseudoAscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddPseudoFunctionCs( s__name__s __module__s__doc__s addHashIdsaddClasss addAttributesaddAttributeOperations addPseudosaddPseudoFunction(((s)build\bdist.win32\egg\sx\w3c\cssParser.pysCSSSelectorAbstract0s      sCSSBuilderAbstractcBstZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zed„Zd„Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Z RS(sîOutlines the interface between CSSParser and it's rule-builder. Compose CSSParser with a concrete implementation of the builder to get usable results from the CSS parser. See css.CSSBuilder for an example implementation cCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCharsetNscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pysbeginStylesheetSscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfselements((s)build\bdist.win32\egg\sx\w3c\cssParser.pys stylesheetUscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endStylesheetWscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys beginInlineZscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfs declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysinline\scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endInline^scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfs selectorss declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysrulesetascCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysresolveNamespacePrefixfscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atCharsetkscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsimport_smediumss cssParser((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatImportmscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsuri((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atNamespaceoscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsmediumssruleset((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatMediaqscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfspages pseudopages declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatPagesscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfs declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atFontFaceuscCs|tfSdS(N(ssrcsNotImplemented(sselfsatIdents cssParserssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatIdentwscCstdƒ‚dS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfs selectorAscombiners selectorB((s)build\bdist.win32\egg\sx\w3c\cssParser.pyscombineSelectors|scCstdƒ‚dS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysselectorscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalues important((s)build\bdist.win32\egg\sx\w3c\cssParser.pysproperty…scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfstermAscombinerstermB((s)build\bdist.win32\egg\sx\w3c\cssParser.pys combineTerms‡scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termIdent‰scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvaluesunits((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termNumber‹scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermRGBscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermURIscCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termString‘scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermUnicodeRange“scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termFunction•scCstdƒ‚dS(NsSubclass responsibility(sNotImplementedError(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termUnknown—s(!s__name__s __module__s__doc__s setCharsetsbeginStylesheets stylesheets endStylesheets beginInlinesinlines endInlinesrulesetsresolveNamespacePrefixs atCharsetsatImports atNamespacesatMediasatPages atFontFacesatIdentscombineSelectorssselectorsFalsespropertys combineTermss termIdentsNones termNumberstermRGBstermURIs termStringstermUnicodeRanges termFunctions termUnknown(((s)build\bdist.win32\egg\sx\w3c\cssParser.pysCSSBuilderAbstractFs:                            s CSSParseErrorcBsStZeZeZeZeZeZeZ eZ ed„Z d„Z ed„Z RS(NcCsmti||ƒ||_|p||_|io6|ii|iƒ|_|idjo |`qindS(Ni(s Exceptions__init__sselfsmsgssrcsctxsrcsfinds srcCtxIdx(sselfsmsgssrcsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys__init__§s  cCs|ioOti|ƒdt|i|i ƒdt|i|i|id!ƒdSn#ti|ƒdt|id ƒSdS(Ns:: (s, is)s:: i((sselfsctxsrcs Exceptions__str__sreprs srcCtxIdxssrc(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys__str__°s OcCs“||_|o ||_n|ioh|ii|iƒ|_|idjo |`n|ii|iƒ|_|idjo |`qndS(Ni(sfullsrcsselfsinlinesfindssrcs srcFullIdxsctxsrcs ctxsrcFullIdx(sselfsfullsrcsinline((s)build\bdist.win32\egg\sx\w3c\cssParser.pyssetFullCSSSource¶s    (s__name__s __module__sNonessrcsctxsrcsfullsrcsFalsesinlines srcCtxIdxs srcFullIdxs ctxsrcFullIdxs__init__s__str__ssetFullCSSSource(((s)build\bdist.win32\egg\sx\w3c\cssParser.pys CSSParseErroržs s CSSParsercBsLtZdZeZdddddddgZdd d d fZd d gZdd dfZe oŠd„Z e i e i Be iBZdZdZdeZe edƒZe deeƒZe deeƒZdeefZe ieeƒZdedd!fZe ieeƒZdedd!fZe ieeƒZdeZe ieeƒZdeZe ieeƒZ deefZ!e ie!eƒZ"dZ#d e#Z$e d!e$eeƒZ%d"e%Z&d#e%Z'e e&e'ƒZ(e ie(eƒZ)d$e(e d%eeƒfZ*e ie*eƒZ+d&Z,e ie,eƒZ-d'eZ.e ie.eƒZ/ed(Z0e ie0eƒZ1d)e0Z2e ie2eƒZ3d*eefZ4d+Z5e4Z6e ie6eƒZ7d,Z8e ie8eƒZ9d-Z:e ie:eƒZ;[ ne<d.„Z=d/„Z>d0„Z?e@e>e?ƒZAeBd1„ZCd2„ZDd3„ZEhd4„ZFd5„ZGd6„ZHd7„ZId8„ZJd9„ZKd:„ZLd;„ZMd<„ZNd=„ZOd>„ZPd?„ZQd@„ZRdA„ZSdB„ZTdC„ZUdD„ZVdE„ZWdF„ZXe dG„ZYdH„ZZdI„Z[eBdJ„Z\dK„Z]e<dL„Z^e<e<dM„Z_dN„Z`e<ddO„ZaRS(PsñCSS-2.1 parser dependent only upon the re module. Implemented directly from http://www.w3.org/TR/CSS21/grammar.html Tested with some existing CSS stylesheets for portability. CSS Parsing API: * setCSSBuilder() To set your concrete implementation of CSSBuilderAbstract * parseFile() Use to parse external stylesheets using a file-like object >>> cssFile = open('test.css', 'r') >>> stylesheets = myCSSParser.parseFile(cssFile) * parse() Use to parse embedded stylesheets using source string >>> cssSrc = ''' body,body.body { font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif; background: White; color: Black; } a {text-decoration: underline;} ''' >>> stylesheets = myCSSParser.parse(cssSrc) * parseInline() Use to parse inline stylesheets using attribute source string >>> style = 'font: 110%, "Times New Roman", Arial, Verdana, Helvetica, serif; background: White; color: Black' >>> stylesheets = myCSSParser.parseInline(style) * parseAttributes() Use to parse attribute string values into inline stylesheets >>> stylesheets = myCSSParser.parseAttributes( font='110%, "Times New Roman", Arial, Verdana, Helvetica, serif', background='White', color='Black') * parseSingleAttr() Use to parse a single string value into a CSS expression >>> fontValue = myCSSParser.parseSingleAttr('110%, "Times New Roman", Arial, Verdana, Helvetica, serif') s=s~=s|=s&=s^=s!=s<>s#s.s[s:s+s>s/s,cGs di|ƒS(Ns|(sjoinsargs(sargs((s)build\bdist.win32\egg\sx\w3c\cssParser.pysss [0-9a-fA-F]u[€-ÿ]s\\(?:%s){1,6}\s?u \\[ -~€-ÿ]s\-[^0-9]|[A-Za-z_]s [0-9A-Za-z_-]s((?:%s)(?:%s)*)s ((?:%s)|\*)iiÿÿÿÿs((?:%s)|\*|)\|(?!=)s\.s #((?:%s)+)s(#%s{6}|#%s{3})u | | | u\\(?:%s)u [ !#$%&(-~]u "((?:%s|')*)"u '((?:%s|")*)'uurl\((?:(?:%s)|((?:%s)+))\)s [!#$%&*-~]u,(([-+]?[0-9]+(?:\.[0-9]+)?)|([-+]?\.[0-9]+))s(%%|%s)?s\(u[-+]?s(?:U\+%s{1,6}-%s{1,6})sO(?:U\+\?{1,6}|{h}(\?{0,5}|{h}(\?{0,4}|{h}(\?{0,3}|{h}(\?{0,2}|{h}(\??|{h}))))))u"(?:\/\*[^*]*\*+([^/*][^*]*\*+)*\/)u!\s*(important)cCs|i|ƒdS(N(sselfs setCSSBuilders cssBuilder(sselfs cssBuilder((s)build\bdist.win32\egg\sx\w3c\cssParser.pys__init__>scCs |iSdS(N(sselfs _cssBuilder(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys getCSSBuilderCscCs ||_dS(N(s cssBuildersselfs _cssBuilder(sselfs cssBuilder((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCSSBuilderEscCs:z|i|iƒƒ}Wd|o|iƒnX|SdS(s`Parses CSS file-like objects using the current cssBuilder. Use for external stylesheets.N(sselfsparsessrcFilesreadsresults closeFilesclose(sselfssrcFiles closeFilesresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys parseFileMscCs}|iiƒzWti|ƒ}y|i|ƒ\}}Wn(|ij o}|i |ƒ‚nXWd|ii ƒX|SdS(s\Parses CSS string source using the current cssBuilder. Use for embedded stylesheets.N( sselfs cssBuildersbeginStylesheets cssSpecials cleanupCSSssrcs_parseStylesheets stylesheets ParseErrorserrssetFullCSSSources endStylesheet(sselfssrcs stylesheetserr((s)build\bdist.win32\egg\sx\w3c\cssParser.pysparseXs   cCs’|iiƒzly%|i|iƒdtƒ\}}Wn.|ij o}|i |dt ƒ‚nX|ii |ƒ}Wd|iiƒX|SdS(srParses CSS inline source string using the current cssBuilder. Use to parse a tag's 'sytle'-like attribute.sbracessinlineN(sselfs cssBuilders beginInlines_parseDeclarationGroupssrcsstripsFalses propertiess ParseErrorserrssetFullCSSSourcesTruesinlinesresults endInline(sselfssrcserrsresults properties((s)build\bdist.win32\egg\sx\w3c\cssParser.pys parseInlineks %c Ks×|o|i|ƒn|iiƒz™g}yLxE|iƒD]7\}}|i |i ƒ|ƒ\}}|i |ƒq>WWn.|ij o}|i|dtƒ‚nX|ii|ƒ}Wd|iiƒX|SdS(sºParses CSS attribute source strings, and return as an inline stylesheet. Use to parse a tag's highly CSS-based attributes like 'font'. See also: parseSingleAttr sinlineN(s attributess kwAttributessupdatesselfs cssBuilders beginInlines propertiess iteritemss propertyNamessrcs_parseDeclarationPropertysstripspropertysappends ParseErrorserrssetFullCSSSourcesTruesinlinesresults endInline( sselfs attributess kwAttributesssrcserrs propertiessresultspropertys propertyName((s)build\bdist.win32\egg\sx\w3c\cssParser.pysparseAttributes|s$  cCsC|id|ƒ}d|djo|ddSn |ddSdS(sÃParse a single CSS attribute source string, and returns the built CSS expression. Use to parse a tag's highly CSS-based attributes like 'font'. See also: parseAttributes stempiiN(sselfsparseAttributess attrValuesresults(sselfs attrValuesresults((s)build\bdist.win32\egg\sx\w3c\cssParser.pysparseSingleAttr–s cCs|iid|ƒ}|i|ƒ}|i|ƒ}|i|ƒ\}}|i|ƒ}g}x„|o||i dƒo7|i |ƒ\}}|t j o|i|ƒqÐn#|i|ƒ\}}|i|ƒ|i|ƒ}q`W|ii||ƒ}||fSdS(sÀstylesheet : [ CHARSET_SYM S* STRING S* ';' ]? [S|CDO|CDC]* [ import [S|CDO|CDC]* ]* [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]* ; us@N(sselfs re_commentssubssrcs_parseAtCharsets _parseSCDOCDCs_parseAtImportssstylesheetImportss_parseAtNamespacesstylesheetElementss startswiths_parseAtKeywords atResultssNonesextends _parseRulesetsrulesetsappends cssBuilders stylesheet(sselfssrcsstylesheetElementss stylesheetsrulesetsstylesheetImportss atResults((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseStylesheet§s$  cCs`xUnoM|iƒ}|idƒo|d}q|idƒo|d}qPq W|SdS(s [S|CDO|CDC]*isiN(ssrcslstrips startswith(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseSCDOCDCÐs cCs“t|dƒo{t|ƒ}|i|ƒ\}}|iƒ}|d djo|id|tƒ‚n|diƒ}|i i |ƒn|SdS(s![ CHARSET_SYM S* STRING S* ';' ]?scharsetis;s#@charset expected a terminating ';'N( s isAtRuleIdentssrcsstripAtRuleIdentsselfs _getStringscharsetslstrips ParseErrorsctxsrcs cssBuilders atCharset(sselfssrcscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtCharsetÞs  cCs‹g}xtt|dƒoc|}t|ƒ}|i|ƒ\}}|tjo|i d||ƒ‚ng}|i |i ƒƒ\}}xZ|tj oL|i|ƒ|d djo)|di ƒ}|i |ƒ\}}qŠPqŠW| o dg}n|d djo|i d||ƒ‚n|di ƒ}|ii|||ƒ}|tj o|i|ƒn|i|ƒ}q W||fSdS( s[ import [S|CDO|CDC]* ]*simportsImport expecting string or urlis,salls;s"@import expected a terminating ';'N(sresults isAtRuleIdentssrcsctxsrcsstripAtRuleIdentsselfs_getStringOrURIsimport_sNones ParseErrorsmediumss _getIdentslstripsmediumsappends cssBuildersatImports stylesheets _parseSCDOCDC(sselfssrcsmediumsimport_s stylesheetsresultsmediumssctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtImportsës8      cCsQ|i|ƒ}x7t|dƒo&|}t|ƒ}|i|ƒ\}}|tjo€|i |ƒ\}}|tjo|i d||ƒ‚n|i|i ƒƒ\}}|tjo|i d||ƒ‚qÜnt}|i ƒ}|d djo|i d||ƒ‚n|di ƒ}|i i||ƒ|i|ƒ}qW|SdS(sNnamespace : @namespace S* [IDENT S*]? [STRING|URI] S* ';' S* s namespaces*@namespace expected an identifier or a URIs@namespace expected a URIis;s%@namespace expected a terminating ';'N(sselfs _parseSCDOCDCssrcs isAtRuleIdentsctxsrcsstripAtRuleIdents_getStringOrURIs namespacesNones _getIdentsnsPrefixs ParseErrorslstrips cssBuilders atNamespace(sselfssrcs namespacesnsPrefixsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtNamespaces,     cCs|}t|dƒo|i|ƒ\}}nãt|dƒo|i|ƒ\}}nºt|dƒo|i|ƒ\}}n‘t|dƒo|i|ƒ\}}nht|dƒo|i |ƒ\}}n?|i dƒo|i |ƒ\}}n|i d||ƒ‚||fSdS( s,[media | page | font_face | unknown_keyword]smediaspages font-facesimportsframes@sUnknown state in atKeywordN( ssrcsctxsrcs isAtRuleIdentsselfs _parseAtMediasresults _parseAtPages_parseAtFontFaces_parseAtImportss _parseAtFrames startswiths _parseAtIdents ParseError(sselfssrcsctxsrcsresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtKeyword/s c Csí|}|tdƒiƒ}g}x–|o|ddjo}|i|ƒ\}}|tjo|i d||ƒ‚n|i |ƒ|ddjo|diƒ}q%|iƒ}q%W|i dƒ o|i d||ƒ‚n|diƒ}g}x’|o|i dƒ oy|i d ƒo7|i |ƒ\}}|tj o|i|ƒqn#|i|ƒ\}}|i |ƒ|iƒ}qþW|i dƒ o|i d ||ƒ‚n|diƒ}|ii||ƒ}||fSd S( s`media : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S* ; s@media is{s%@media rule expected media identifiers,isRuleset opening '{' not founds}s@sRuleset closing '}' not foundN(ssrcsctxsrcslenslstripsmediumssselfs _getIdentsmediumsNones ParseErrorsappends startswithsstylesheetElementss_parseAtKeywords atResultssextends _parseRulesetsrulesets cssBuildersatMediasresult( sselfssrcsmediumsstylesheetElementssrulesetsmediumssctxsrcs atResultssresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtMediaCs>    c Csˆ|}|tdƒiƒ}|i|ƒ\} }|d djo|i|dƒ\}}nt}g}|iƒ}g}|i dƒ o|i d||ƒ‚n|diƒ}x›|o|i dƒ o‚|i dƒo7|i |ƒ\}}|tj o|i|ƒqDn,|i|iƒdtƒ\}}||7}|iƒ}qºW|ii| ||ƒg}|diƒ|fSd S( s‚page : PAGE_SYM S* IDENT? pseudo_page? S* '{' S* declaration [ ';' S* declaration ]* '}' S* ; s@page is:s{sRuleset opening '{' not founds}s@sbracesN(ssrcsctxsrcslenslstripsselfs _getIdentspages pseudopagesNonesstylesheetElementss propertiess startswiths ParseErrors_parseAtKeywords atResultssextends_parseDeclarationGroupsFalses npropertiess cssBuildersatPagesresult( sselfssrcsstylesheetElementssctxsrcs propertiessresults npropertiess pseudopages atResultsspage((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtPagets0  ! cCsx|}|tdƒiƒ}|i|ƒ\}}|i|iƒƒ\}}|i i ||ƒg}|iƒ|fSdS(s) XXX Proprietary for PDF s@frame N( ssrcsctxsrcslenslstripsselfs _getIdentsboxs_parseDeclarationGroups propertiess cssBuildersatFramesresult(sselfssrcsboxs propertiessresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtFramežscCsT|}|tdƒiƒ}|i|ƒ\}}|ii|ƒg}||fSdS(Ns @font-face ( ssrcsctxsrcslenslstripsselfs_parseDeclarationGroups propertiess cssBuilders atFontFacesresult(sselfssrcs propertiessresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtFontFace©s c CsŸ|}|i|dƒ\}}|tjo|id||ƒ‚n|ii|||ƒ\}}|t jo|i dƒ}|djo t}n|| i dƒ}|djo t}n|tj o ||jo||di ƒ}q‹|tjo|dd!}q‹|tj oU||}y|i|ƒ\}}Wq‡|ij o|i|ƒ\}}q‡Xq‹|id||ƒ‚n|i ƒ|fSdS(Nis+At-rule expected an identifier for the rules;is{iÿÿÿÿsUnable to ignore @-rule block(ssrcsctxsrcsselfs _getIdentsatIdentsNones ParseErrors cssBuildersresultsNotImplementedsfindssemiIdxsblockIdxslstrips_parseDeclarationGroups declarationss_parseStylesheets stylesheets ParserError( sselfssrcssemiIdxs declarationssatIdents stylesheetsblockIdxsresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseAtIdent°s0         cCsS|i|ƒ\}}|i|iƒƒ\}}|ii||ƒ}||fSdS(s€ruleset : selector [ ',' S* selector ]* '{' S* declaration [ ';' S* declaration ]* '}' S* ; N( sselfs_parseSelectorGroupssrcs selectorss_parseDeclarationGroupslstrips propertiess cssBuildersrulesetsresult(sselfssrcsresults propertiess selectors((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseRuleset×s cCsšg}xƒ|d dddddddfjo\|i|ƒ\}}|tjoPn|i|ƒ|id ƒo|diƒ}q q W||fSdS( Nis{s}s]s(s)s;ss,( s selectorsssrcsselfs_parseSelectorsselectorsNonesappends startswithslstrip(sselfssrcsselectors selectors((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorGroupäs&  c CsQ|i|ƒ\}}t|ƒ}x|d dddddddd d f joìxB|iD]1}|i|ƒo|t|ƒi ƒ}PqZqZWd }|i|ƒ\}}t|ƒ|joc|d}xB|o)|d dddddddd d f jo|d}qÊW|i ƒt fSn|i i |||ƒ}q$W|i ƒ|fSd S( sUselector : simple_selector [ combinator simple_selector ]* ; iss,s;s{s}s[s]s(s)s N(sselfs_parseSimpleSelectorssrcsselectorslenssrcLensSelectorCombinersscombiners startswithslstrips selectorBsNones cssBuilderscombineSelectors(sselfssrcscombinersselectorssrcLens selectorB((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorïs( ,   3cCs¯|iƒ}|i|i|ƒ\}}|i|i|ƒ\}}|on4|d |i jo d}n|i d||ƒ‚|i i ||ƒ}|i i |ƒ}xñ|o|d |i joÕ|i|i|ƒ\}}|tj o|i|ƒqªn|i|i|ƒ\}}|tj o|i|ƒqªn|idƒo|i||ƒ\}}qª|idƒo|i||ƒ\}}qªPqªW|iƒ|fSdS(sysimple_selector : [ namespace_selector ]? element_name? [ HASH | class | attrib | pseudo ]* S* ; is*s#Selector name or qualifier expecteds[s:N(ssrcslstripsctxsrcsselfs_getMatchResultsre_namespace_selectorsnsPrefixsre_element_namesnamesSelectorQualifierss ParseErrors cssBuildersresolveNamespacePrefixsselectorsre_hashshash_sNones addHashIdsre_classsclass_saddClasss startswiths_parseSelectorAttributes_parseSelectorPseudo(sselfssrcsnamesnsPrefixsselectorsclass_shash_sctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSimpleSelector s6      cCsà|}|idƒ o|id||ƒ‚n|diƒ}|i|i|ƒ\}}|i |ƒ\}}|t jo|id||ƒ‚n|t j o|i i ||ƒ}nx,|iD]}|i|ƒoPqÆqÆWd}|t|ƒiƒ}|oe|i |ƒ\}}|t jo?|i|ƒ\}}|t jo|id||ƒ‚qiqsnt }|idƒ o|id||ƒ‚n |d}|o|i|||ƒn|i|ƒ||fSd S( s˜attrib : '[' S* [ namespace_selector ]? IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* [ IDENT | STRING ] S* ]? ']' ; s[s(Selector Attribute opening '[' not foundis"Expected a selector attribute namess#Expected a selector attribute values]s(Selector Attribute closing ']' not foundN(ssrcsctxsrcs startswithsselfs ParseErrorslstrips_getMatchResultsre_namespace_selectorsnsPrefixs _getIdentsattrNamesNones cssBuildersresolveNamespacePrefixsAttributeOperatorssopslens attrValues _getStringsselectorsaddAttributeOperations addAttribute(sselfssrcsselectors attrValuesnsPrefixsattrNamesctxsrcsop((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorAttribute/s>      !  cCs |}|idƒ o|id||ƒ‚n|d}|i|ƒ\}}| o|id||ƒ‚n|idƒop|diƒ}|i|t ƒ\}}|idƒ o|id||ƒ‚n|d}|i ||ƒn|i |ƒ||fSdS( s<pseudo : ':' [ IDENT | function ] ; s:sSelector Pseudo ':' not foundis$Selector Pseudo identifier not founds(s)s.Selector Pseudo Function closing ')' not foundN(ssrcsctxsrcs startswithsselfs ParseErrors _getIdentsnameslstrips_parseExpressionsTruestermsselectorsaddPseudoFunctions addPseudo(sselfssrcsselectorstermsnamesctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseSelectorPseudo]s"   c Csg|}|idƒo|dtf\}}n!|o|id||ƒ‚ng}|iƒ}x¯|d ddddddd d d f jo‚|i |ƒ\}}|id ƒod |d}qen|t joPn|i |ƒ|idƒo|diƒ}qePqeW|o8|idƒ o|id||ƒ‚n|d}n|iƒ|fSdS(Ns{is'Declaration group opening '{' not foundss,s}s[s]s(s)s@s*s -nothing-s;s'Declaration group closing '}' not found( ssrcsctxsrcs startswithsTruesbracessselfs ParseErrors propertiesslstrips_parseDeclarationspropertysNonesappend(sselfssrcsbracess propertiesspropertysctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseDeclarationGroupzs0 ,  cCs‰|i|ƒ\}}|tj oS|iƒ}|d ddfjo|diƒ}n|i||ƒ\}}nt}||fSdS(sYdeclaration : ident S* ':' S* expr prio? | /* empty */ ; is:s=N(sselfs _getIdentssrcs propertyNamesNoneslstrips_parseDeclarationPropertysproperty(sselfssrcspropertys propertyName((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseDeclarationšs  cCsb|i|ƒ\}}|i|i|ƒ\}}|iƒ}|ii |||ƒ}||fSdS(N( sselfs_parseExpressionssrcsexprs_getMatchResults re_importants importantslstrips cssBuilderspropertys propertyName(sselfssrcs propertyNamesexprs importantsproperty((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseDeclarationProperty²s  cCs|i|ƒ\}}t}x¯|d dddddddfjoˆx<|iD]+}|i|ƒo|t|ƒ}PqNqNWd }|i|i ƒƒ\}}|t joPq|i i |||ƒ}qW|tjo|o&|i i |ttƒ}||fSn ||fSd S( sB expr : term [ operator term ]* ; iss;s{s}s[s]s)s N(sselfs_parseExpressionTermssrcstermsNonesoperatorsExpressionOperatorss startswithslenslstripsterm2sNotImplementeds cssBuilders combineTermss returnList(sselfssrcs returnListstermsterm2soperator((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseExpression½s&&   cCsÞ|}|i|i|ƒ\}}|tj oD|i|i|ƒ\}}|i i ||ƒ}|i ƒ|fSn|i ||iƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i |ƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i|i|ƒ\}}|tj ou|i|tƒ\}}|ddjo|id||ƒ‚n|di ƒ}|i i||ƒ}||fSn|i|i|ƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i|i|ƒ\}}|tj o&|i i|ƒ}|i ƒ|fSn|i|i|ƒ\}}|i|ƒ\}}|tj oL|tj o|i i||ƒ}n|i i|ƒ}|i ƒ|fSn|i i |ƒSdS(sýterm : unary_operator? [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* | TIME S* | FREQ S* | function ] | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor ; is)s1Terminal function expression expected closing ')'iN(!ssrcsctxsrcsselfs_getMatchResultsre_numsresultsNonesre_unitsunitss cssBuilders termNumberstermslstrips _getStringsre_uristermURIs termStringsre_functionterms_parseExpressionsTruesparamss ParseErrors termFunctions re_rgbcolorstermRGBsre_unicoderangestermUnicodeRangesre_namespace_selectorsnsPrefixs _getIdentsresolveNamespacePrefixs termIdents termUnknown(sselfssrcstermsnsPrefixsparamssresultsunitssctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseExpressionTermØsN        cCs|i|i||ƒSdS(N(sselfs_getMatchResultsre_identssrcsdefault(sselfssrcsdefault((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _getIdentscCs†|tjo |i}n|i|ƒ}|oHtt|iƒƒ}|o|d}nd}|||i ƒfSn ||fSdS(Nis( s rexpressionsNonesselfs re_stringsmatchssrcsresultsfiltersgroupssstrressendsdefault(sselfssrcs rexpressionsdefaultsstrressresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _getStrings  cCsO|i||iƒ\}}|tjo|i|ƒ\}}n||fSdS(N(sselfs _getStringssrcsre_urisresultsNone(sselfssrcsresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_getStringOrURI#s cCsE|i|ƒ}|o!|i|ƒ||iƒfSn ||fSdS(N(s rexpressionsmatchssrcsresultsgroupsendsdefault(sselfs rexpressionssrcsdefaultsgroupsresult((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_getMatchResult)s!(bs__name__s __module__s__doc__s CSSParseErrors ParseErrorsAttributeOperatorssSelectorQualifierssSelectorCombinerssExpressionOperatorssTrues_orRulesresIsMsUs_reflagssi_hexs i_nonasciis i_unicodesi_escapes i_nmstartsi_nmcharsi_identscompilesre_identsi_element_namesre_element_namesi_namespace_selectorsre_namespace_selectorsi_classsre_classsi_hashsre_hashs i_rgbcolors re_rgbcolorsi_nls i_escape_nlsi_string_contents i_string1s i_string2si_strings re_stringsi_urisre_urisi_numsre_numsi_unitsre_units i_functions re_functionsi_functiontermsre_functiontermsi_unicoderange1si_unicoderange2si_unicoderangesre_unicoderanges i_comments re_comments i_importants re_importantsNones__init__s getCSSBuilders setCSSBuilderspropertys cssBuildersFalses parseFilesparses parseInlinesparseAttributessparseSingleAttrs_parseStylesheets _parseSCDOCDCs_parseAtCharsets_parseAtImportss_parseAtNamespaces_parseAtKeywords _parseAtMedias _parseAtPages _parseAtFrames_parseAtFontFaces _parseAtIdents _parseRulesets_parseSelectorGroups_parseSelectors_parseSimpleSelectors_parseSelectorAttributes_parseSelectorPseudos_parseDeclarationGroups_parseDeclarations_parseDeclarationPropertys_parseExpressions_parseExpressionTerms _getIdents _getStrings_getStringOrURIs_getMatchResult(((s)build\bdist.win32\egg\sx\w3c\cssParser.pys CSSParserÄs° /                   )  $  1 *  '  % .    :  ( s__doc__sres cssSpecials isAtRuleIdentsstripAtRuleIdentsobjectsCSSSelectorAbstractsCSSBuilderAbstracts Exceptions CSSParseErrors CSSParser(s CSSParsersCSSBuilderAbstractsCSSSelectorAbstractsres cssSpecials CSSParseErrorsstripAtRuleIdents isAtRuleIdent((s)build\bdist.win32\egg\sx\w3c\cssParser.pys?s    X&PK4‘m8‰‘$‘11sx/w3c/cssSpecial.py## Copyright by Dirk Holtwick , 2007 """ Helper for complex CSS definitons like font, margin, padding and border Optimized for use with PISA """ import types import logging log = logging.getLogger("ho.css") def toList(value): if type(value)!=types.ListType: return [value] return value _styleTable = { "normal": "", "italic": "", "oblique": "", } _variantTable = { "normal": None, "small-caps": None, } _weightTable = { "light": 300, "lighter": 300, # fake relativness for now "normal": 400, "bold": 700, "bolder": 700, # fake relativness for now "100": 100, "200": 200, "300": 300, "400": 400, "500": 500, "600": 600, "700": 700, "800": 800, "900": 900, #wx.LIGHT: 300, #wx.NORMAL: 400, #wx.BOLD: 700, } _absSizeTable = { "xx-small" : 3./5., "x-small": 3./4., "small": 8./9., "medium": 1./1., "large": 6./5., "x-large": 3./2., "xx-large": 2./1., "xxx-large": 3./1., "larger": 1.25, # XXX Not totaly CSS conform: "smaller": 0.75, # http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size } _borderStyleTable = { "none": 0, "hidden": 0, "dotted": 1, "dashed": 1, "solid": 1, "double": 1, "groove": 1, "ridge": 1, "inset": 1, "outset": 1, } ''' _relSizeTable = { 'pt': # pt: absolute point size # Note: this is 1/72th of an inch (lambda value, pt: value), 'px': # px: pixels, relative to the viewing device # Note: approximate at the size of a pt (lambda value, pt: value), 'ex': # ex: proportional to the 'x-height' of the parent font # Note: can't seem to dervie this value from wx.Font methods, # so we'll approximate by calling it 1/2 a pt (lambda value, pt: 2 * value), 'pc': # pc: 12:1 pica:point size # Note: this is 1/6th of an inch (lambda value, pt: 12*value), 'in': # in: 72 inches per point (lambda value, pt: 72*value), 'cm': # in: 72 inches per point, 2.54 cm per inch (lambda value, pt,_r=72./2.54: _r*value), 'mm': # in: 72 inches per point, 25.4 mm per inch (lambda value, pt,_r=72./25.4: _r*value), '%': # %: percentage of the parent's pointSize (lambda value, pt: 0.01 * pt * value), 'em': # em: proportional to the 'font-size' of the parent font (lambda value, pt: pt * value), } ''' def getNextPart(parts): if parts: part = parts.pop(0) else: part = None return part def isSize(value): return value and ((type(value) is types.TupleType) or value=="0") def splitBorder(parts): width = style = color = None copy_parts = parts[:] part = getNextPart(parts) # Width if isSize(part): width = part part = getNextPart(parts) # Style if part and _borderStyleTable.has_key(part.lower()): style = part part = getNextPart(parts) # Color if part: color = part if len(parts)>1: log.warn("Border not split up correctly, rest: %r", parts) # log.debug("Border styles: %r -> %r ", copy_parts, (width, style, color)) return (width, style, color) def parseSpecialRules(declarations): # print selectors, declarations # CSS MODIFY! dd = [] for d in declarations: log.debug("CSS special IN: %r", d) name, parts, last = d parts = toList(parts) # FONT if name == "font": # [ [ <'font-style'> || <'font-variant'> || <'font-weight'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | inherit ddlen = len(dd) log.debug("font (before): %r", parts) part = getNextPart(parts) # Style if part and _styleTable.has_key(part): dd.append(("font-style", part, last)) part = getNextPart(parts) # Variant if part and _variantTable.has_key(part): dd.append(("font-variant", part, last)) part = getNextPart(parts) # Weight if part and _weightTable.has_key(part): dd.append(("font-weight", part, last)) part = getNextPart(parts) # Size and Line Height if isinstance(part, tuple) and len(part) == 3: fontSize, slash, lineHeight = part assert slash == '/' dd.append(("font-size", fontSize, last)) dd.append(("line-height", lineHeight, last)) else: dd.append(("font-size", part, last)) # Face/ Family dd.append(("font-face", parts, last)) log.debug("font (after): %r", dd[ddlen:]) # BACKGROUND elif name == "background": # [<'background-color'> || <'background-image'> || <'background-repeat'> || <'background-attachment'> || <'background-position'>] | inherit part = getNextPart(parts) # Color if part and (not part.startswith("url")): dd.append(("background-color", part, last)) part = getNextPart(parts) # Background if part: dd.append(("background-url", part, last)) # XXX Incomplete! Error in url()! # MARGIN elif name == "margin": if len(parts)==1: top = bottom = left = right = parts[0] elif len(parts)==2: top = bottom = parts[0] left = right = parts[1] elif len(parts)==3: top = parts[0] left = right = parts[1] bottom = parts[2] elif len(parts)==4: top = parts[0] right = parts[1] bottom = parts[2] left = parts[3] else: continue dd.append(("margin-left", left, last)) dd.append(("margin-right", right, last)) dd.append(("margin-top", top, last)) dd.append(("margin-bottom", bottom, last)) # PADDING elif name == "padding": if len(parts)==1: top = bottom = left = right = parts[0] elif len(parts)==2: top = bottom = parts[0] left = right = parts[1] elif len(parts)==3: top = parts[0] left = right = parts[1] bottom = parts[2] elif len(parts)==4: top = parts[0] right = parts[1] bottom = parts[2] left = parts[3] else: continue dd.append(("padding-left", left, last)) dd.append(("padding-right", right, last)) dd.append(("padding-top", top, last)) dd.append(("padding-bottom", bottom, last)) # BORDER WIDTH elif name == "border-width": if len(parts)==1: top = bottom = left = right = parts[0] elif len(parts)==2: top = bottom = parts[0] left = right = parts[1] elif len(parts)==3: top = parts[0] left = right = parts[1] bottom = parts[2] elif len(parts)==4: top = parts[0] right = parts[1] bottom = parts[2] left = parts[3] else: continue dd.append(("border-left-width", left, last)) dd.append(("border-right-width", right, last)) dd.append(("border-top-width", top, last)) dd.append(("border-bottom-width", bottom, last)) # BORDER COLOR elif name == "border-color": if len(parts)==1: top = bottom = left = right = parts[0] elif len(parts)==2: top = bottom = parts[0] left = right = parts[1] elif len(parts)==3: top = parts[0] left = right = parts[1] bottom = parts[2] elif len(parts)==4: top = parts[0] right = parts[1] bottom = parts[2] left = parts[3] else: continue dd.append(("border-left-color", left, last)) dd.append(("border-right-color", right, last)) dd.append(("border-top-color", top, last)) dd.append(("border-bottom-color", bottom, last)) # BORDER STYLE elif name == "border-style": if len(parts)==1: top = bottom = left = right = parts[0] elif len(parts)==2: top = bottom = parts[0] left = right = parts[1] elif len(parts)==3: top = parts[0] left = right = parts[1] bottom = parts[2] elif len(parts)==4: top = parts[0] right = parts[1] bottom = parts[2] left = parts[3] else: continue dd.append(("border-left-style", left, last)) dd.append(("border-right-style", right, last)) dd.append(("border-top-style", top, last)) dd.append(("border-bottom-style", bottom, last)) # BORDER elif name == "border": width, style, color = splitBorder(parts) if width is not None: dd.append(("border-left-width", width, last)) dd.append(("border-right-width", width, last)) dd.append(("border-top-width", width, last)) dd.append(("border-bottom-width", width, last)) if style is not None: dd.append(("border-left-style", style, last)) dd.append(("border-right-style", style, last)) dd.append(("border-top-style", style, last)) dd.append(("border-bottom-style", style, last)) if color is not None: dd.append(("border-left-color", color, last)) dd.append(("border-right-color", color, last)) dd.append(("border-top-color", color, last)) dd.append(("border-bottom-color", color, last)) # BORDER TOP, BOTTOM, LEFT, RIGHT elif name in ("border-top", "border-bottom", "border-left", "border-right"): direction = name[7:] width, style, color = splitBorder(parts) if width is not None: dd.append(("border-" + direction + "-width", width, last)) if style is not None: dd.append(("border-" + direction + "-style", style, last)) if color is not None: dd.append(("border-" + direction + "-color", color, last)) # REST else: dd.append(d) if dd: log.debug("CSS special OUT: %r", dd) if 0: #declarations!=dd: print "###", declarations print "#->", dd # CSS MODIFY! END return dd #import re #_rxhttp = re.compile(r"url\([\'\"]?http\:\/\/[^\/]", re.IGNORECASE|re.DOTALL) def cleanupCSS(src): # src = _rxhttp.sub('url(', src) return srcPK¨“m8Ùn]”  sx/w3c/cssSpecial.pyc;ò Ô_ÙGc@sþdZdkZdkZeidƒZd„Zhdd<dd<ddd7d7, 2007 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PK¨“m8CßBxxsx/w3c/__init__.pyc;ò {{„Gc@sdS(N((((s(build\bdist.win32\egg\sx\w3c\__init__.pys?sPK¨“m8CßBxxsx/w3c/__init__.pyo;ò {{„Gc@sdS(N((((s(build\bdist.win32\egg\sx\w3c\__init__.pys?sPK¨“m8“×2¶EGG-INFO/dependency_links.txtPK¨“m8&¦]00¶<EGG-INFO/entry_points.txtPK¨“m8“×2¶£EGG-INFO/not-zip-safePK¨“m8G‘Ýï¨ ¨ ¶×EGG-INFO/PKG-INFOPK¨“m80hXò  ¶® EGG-INFO/SOURCES.txtPK¨“m8H‘Þ¶í#EGG-INFO/top_level.txtPK«*8ùRü22¶'$ho/__init__.pyPK¨“m8hh±--¶…&ho/__init__.pycPK¨“m8hh±--¶ß(ho/__init__.pyoPK7”l8OÍ…¶9+ho/pisa/__init__.pyPK¨“m8 J ""¶l-ho/pisa/__init__.pycPK¨“m8 J ""¶À/ho/pisa/__init__.pyoPK«*8ùRü22¶2sx/__init__.pyPK¨“m8O‚­Ê--¶r4sx/__init__.pycPK¨“m8O‚­Ê--¶Ì6sx/__init__.pyoPK)’m8ÐýÚ~Ñ%Ñ%¶&9sx/pisa3/pisa.pyPK¨“m8µØ # #¶%_sx/pisa3/pisa.pycPK¨“m8µØ # #¶_‚sx/pisa3/pisa.pyoPK}m8/¶ c~~¶™¥sx/pisa3/pisa_context.pyPK¨“m8ýì!îeîe¶ë#sx/pisa3/pisa_context.pycPK¨“m8ýì!îeîe¶Šsx/pisa3/pisa_context.pyoPKeym8Æï¨ 7 7¶5ðsx/pisa3/pisa_default.pyPK¨“m8·CX]D!D!¶t'sx/pisa3/pisa_default.pycPK¨“m8·CX]D!D!¶ïHsx/pisa3/pisa_default.pyoPKÄ‚l8 ÉŒ$WW¶jjsx/pisa3/pisa_document.pyPK¨“m8šq|øÞÞ¶ø€sx/pisa3/pisa_document.pycPK¨“m8šq|øÞÞ¶“sx/pisa3/pisa_document.pyoPKÏem8€3’N’N¶$¥sx/pisa3/pisa_parser.pyPK¨“m8o̳l<l<¶ëósx/pisa3/pisa_parser.pycPK¨“m8o̳l<l<¶0sx/pisa3/pisa_parser.pyoPKÊ‚l8“½CŽŽ¶/msx/pisa3/pisa_reportlab.pyPK¨“m8 ¼Š_ÍͶõ‡sx/pisa3/pisa_reportlab.pycPK¨“m8 ¼Š_ÍͶûšsx/pisa3/pisa_reportlab.pyoPKö|m8«Õ.K4K4¶®sx/pisa3/pisa_tables.pyPK¨“m8Ä4Ñå//¶âsx/pisa3/pisa_tables.pycPK¨“m8Ä4Ñå//¶Õsx/pisa3/pisa_tables.pyoPKЛl8jݤ¶`-`-¶)Asx/pisa3/pisa_tags.pyPK¨“m8ÒY¬4•P•P¶¼nsx/pisa3/pisa_tags.pycPK¨“m8ÒY¬4•P•P¶…¿sx/pisa3/pisa_tags.pyoPKÔ‚l82R®®¶Nsx/pisa3/pisa_turbogears.pyPK¨“m8ܤ¨¶5sx/pisa3/pisa_turbogears.pycPK¨“m8ܤ¨¶‡sx/pisa3/pisa_turbogears.pyoPKsm8”7¹;èè¶Ù#sx/pisa3/pisa_util.pyPK¨“m8Hý¯ÞF%F%¶ôAsx/pisa3/pisa_util.pycPK¨“m8ÇÖe“$“$¶ngsx/pisa3/pisa_util.pyoPK¤“m8«zŠŠ¶5Œsx/pisa3/pisa_version.pyPK¨“m8g™´ÑѶõŽsx/pisa3/pisa_version.pycPK¨“m8g™´ÑѶý‘sx/pisa3/pisa_version.pyoPK2„l8õE Tžž¶•sx/pisa3/__init__.pyPK¨“m8P—AL££¶Õ–sx/pisa3/__init__.pycPK¨“m8P—AL££¶«˜sx/pisa3/__init__.pyoPK¡E)8 5ú1g1g ¶šsx/w3c/css.pyPK¨“m8™ù­ˆ„§„§¶Ýsx/w3c/css.pycPK¨“m8%dQ÷T§T§¶©sx/w3c/css.pyoPK¥E)8\ T„ÖÖ ¶ Qsx/w3c/cssDOMElementInterface.pyPK¨“m8©Î3Û¶¶!¶!bsx/w3c/cssDOMElementInterface.pycPK¨“m8©Î3Û¶¶!¶{sx/w3c/cssDOMElementInterface.pyoPKÄvm8øtêCCœCœ¶ ”sx/w3c/cssParser.pyPK¨“m8»~PA¦¦¶0sx/w3c/cssParser.pycPK¨“m8»~PA¦¦¶N×sx/w3c/cssParser.pyoPK4‘m8‰‘$‘11¶~ sx/w3c/cssSpecial.pyPK¨“m8Ùn]”  ¶O¯ sx/w3c/cssSpecial.pycPK¨“m8pŒáyßß¶ŽÎ sx/w3c/cssSpecial.pyoPKE)8wwLw¿¿¶ í sx/w3c/__init__.pyPK¨“m8CßBxx¶ï sx/w3c/__init__.pycPK¨“m8CßBxx¶8ð sx/w3c/__init__.pyoPKBBáð