PKi82EGG-INFO/dependency_links.txt PKi8x++EGG-INFO/entry_points.txt[console_scripts] pisa = sx.pisa3:command PKi82EGG-INFO/not-zip-safe PKi8atͨ EGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: pisa Version: 3.0.20 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 PKi8W`VEGG-INFO/SOURCES.txtCHANGELOG.txt LICENSE.pdf LICENSE.txt MANIFEST.in README-MAC.txt README-WINDOWS.txt README.txt TODO.txt VERSION.txt pisa.py setup.cfg setup.py setup_exe.py setup_version.py demo/README.txt 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/ezpdf.py demo/djangoproject/manage.py demo/djangoproject/settings.py demo/djangoproject/urls.py demo/djangoproject/views.py demo/djangoproject/templates/base.html demo/djangoproject/templates/entries.html 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/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/wsgi/pisawsgidemo.py doc/pisa-en.html doc/pisa-en.pdf doc/pisa.css doc/screen.css ho/__init__.py ho/pisa/__init__.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/pisa3/pisa_wsgi.py sx/pisa3/tests/__init__.py sx/pisa3/tests/runtests.py sx/pisa3/tests/test_parser.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/cookbook.html test/cookbook.py test/default.css test/helloworld.py test/pdf.css test/simple-css.html test/simple-test.html test/simple.py test/story2canvas.py test/test-align.html test/test-background.html test/test-barcode.html test/test-bidirectional-text.html test/test-blocks.html test/test-cdata.html test/test-cdata.xml 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-error.html test/test-font.html test/test-helloworld.html test/test-image.html test/test-invoice.html test/test-link.html test/test-list.html test/test-loremipsum.html test/test-margins.html test/test-page-box.html test/test-pisa-linkfont.html test/test-pisa-toc-entities.html test/test-pisa-toc.html test/test-pre.html test/test-syntax.html test/test-tables.html test/test-template.html test/test-unicode-all.html test/test-unicode-greek.html test/test-unicode-japanese.html test/test-unicode-thaana.html test/test-w3c-css.html test/unicode.css test/css/content.css test/css/reset.css test/css/test-css-media-3.css test/font/README.txt test/img/beach.jpg test/img/test.jpg test/pdf/background-sample.pdf test/pdf/test-invoice-bg.pdf PKi8HEGG-INFO/top_level.txtsx ho PKR8R22ho/__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__) PKi8EV--ho/__init__.pyc; Hc@s8dZdZdZdZdklZeeeZdS(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  PKi8EV--ho/__init__.pyo; Hc@s8dZdZdZdZdklZeeeZdS(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  PKR8Oͅ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 PKi8Mn""ho/pisa/__init__.pyc; Hc@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 PKi8Mn""ho/pisa/__init__.pyo; Hc@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 PKR8R22sx/__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__) PKi8Ƌ!--sx/__init__.pyc; Hc@s8dZdZdZdZdklZeeeZdS(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  PKi8Ƌ!--sx/__init__.pyo; Hc@s8dZdZdZdZdklZeeeZdS(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  PKe8v(.(.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 glob import urllib2 import urlparse import tempfile 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 --encoding: the character encoding of . If left empty (default) this information will be extracted from the HTML header data --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 --xml, --xhtml, -x: Force parsing in XML Mode (automatically used if file ends with ".xml") --html: Force parsing in HTML Mode (default) """).strip() COPYRIGHT = VERSION_STR LOG_FORMAT = "%(levelname)s [%(name)s] %(message)s" LOG_FORMAT_DEBUG = "%(levelname)s [%(name)s] %(pathname)s line %(lineno)d: %(message)s" #def options(): # from optparse import OptionParser # usage = "usage: %prog [options] arg" # description = """ # Converts HTML/XHTML/XML/CSS to PDF using the Reportlab Toolkit. # """.strip() # version = VERSION_STR # parser = OptionParser( # usage, # description=description, # version=version, # ) # parser.add_option( # "-c", "--css", # help="Path to default CSS file", # dest="css", # ) # parser.add_option("-q", "--quiet", # action="store_false", dest="verbose", default=True, # help="don't print status messages to stdout") # parser.set_defaults( # css=None, # ) # (options, args) = parser.parse_args() # if len(args) != 1: # parser.error("incorrect number of arguments") # # print options, args 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 temporary 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 log.exception("pisaLinkLoader.getFileName") return None def command(): # from optparse import OptionParser # # parser = OptionParser() # parser.add_option("-f", "--file", dest="filename", # help="write report to FILE", metavar="FILE") # parser.add_option("-q", "--quiet", # action="store_false", dest="verbose", default=True, # help="don't print status messages to stdout") # (options, args) = parser.parse_args() try: opts, args = getopt.getopt(sys.argv[1:], "dhqstwcx", [ "quiet", "help", "start-viewer", "start", "debug=", "copyright", "version", "warn", #"booklet=", #"multivalent=", #"multivalent-path=", "tempdir=", "format=", "css=", "css-dump", "xhtml", "xml", "html", "encoding=", ]) except getopt.GetoptError: usage() sys.exit(2) errors = 0 startviewer = 0 quiet = 0 debug = 0 warn = 0 #multivalent_path = "" #booklet = "" tempdir = None format = "pdf" css = None xhtml = None encoding = 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", "--start"): # Anzeigeprogramm starten startviewer = 1 if o in ("-q", "--quiet"): # Output unterdrcken quiet = 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 fr Booklet # multivalent_path = a # if o in ("--booklet",): # # Booklet # booklet = a if o in ("--copyright", "--version"): print COPYRIGHT sys.exit(0) # if o in ("--tempdir",): # # Tempdir # tempdir = a if o in ("-t", "--format"): # Format XXX ??? format = a if o in ("--encoding",) and a: # Encoding encoding = 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 o in ("-x", "--xml", "--xhtml"): xhtml = True elif o in ("--html",): xhtml = False 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: # If not forced to parse in a special way have a look # at the filename suffix if xhtml is None: xhtml = src.lower().endswith(".xml") lc = None wpath = None if src=="-": # Output to console fsrc = sys.stdin wpath = os.getcwd() else: # fsrc = open(src, "r") if src.startswith("http:"): 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 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, xhtml = xhtml, encoding = encoding, ) if fdestclose: fdest.close() errors += pdf.err 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 if (not pdf.err) and startviewer: if not quiet: print "Open viewer for file %s" % dest startViewer(dest) if errors: sys.exit(1) def startViewer(filename): " Helper for opening a PDF file" try: os.startfile(filename) except: # try to opan a la apple os.system('open "%s"' % filename) def showLogging(debug=False): " Shortcut for enabling log dump " try: log_level = logging.WARN log_format = LOG_FORMAT_DEBUG if debug: log_level = logging.DE logging.basicConfig( level=log_level, format=log_format) except: logging.basicConfig() if __name__=="__main__": command() PKi84 R&R&sx/pisa3/pisa.pyc; CHc@sdZdZdZdkZdkZdkZdkZdkZdkZdk Z dk Z dk Tdk Tdk lZdklZeZeZediZeZdZd Zd Zd fd YZd ZdZedZ e!djo endS(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 --encoding: the character encoding of . If left empty (default) this information will be extracted from the HTML header data --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 --xml, --xhtml, -x: Force parsing in XML Mode (automatically used if file ends with ".xml") --html: Force parsing in HTML Mode (default) s$%(levelname)s [%(name)s] %(message)ssB%(levelname)s [%(name)s] %(pathname)s line %(lineno)d: %(message)scCs tGHdS(N(sUSAGE(((s&build\bdist.win32\egg\sx\pisa3\pisa.pysusagemsspisaLinkLoadercBs/tZdZedZdZedZRS(s Helper to load page from an URL and load corresponding files to temporary files. If getFileName is called it returns the temporary 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__ys  cCs%x|iD]}ti|q WdS(N(sselfs tfileListspathsossremove(sselfspath((s&build\bdist.win32\egg\sx\pisa3\pisa.pys__del__~s c Cs`yti|p|i|}ti|didd} | 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|GHntidnXt SdS(Nis.iscsssgifsjpgspngssuffixswbis Loadingstos ERROR:spisaLinkLoader.getFileName( surlparsesurljoinsrelativesselfssrcsnamesurlsurlsplitssplitssuffixslowersNonesurllib2surlopensufilestempfilesmktempspathsfilestfilesTruesreadsdataswritescloses tfileListsappendsquiets Exceptionseslogs exception( sselfsnamesrelativesesurlsdatastfilespathsufilessuffix((s&build\bdist.win32\egg\sx\pisa3\pisa.pys getFileNames2      (s__name__s __module__s__doc__sTrues__init__s__del__sNones getFileName(((s&build\bdist.win32\egg\sx\pisa3\pisa.pyspisaLinkLoaderps   cCsyVtitiddddddddd d d d d dddddg\}} Wn*tij ottidnXd}d}d}d}d}t }d} t } t }t }ti}t}x|D]\}}|ddfjottin|dddfjo d}n|ddfjo d}n|ddfjod}t|ti}n|dd fjo*ti}t}|ot|}qn|d!d"fjotGHtidn|d#d$fjo |} n|d%fjo|o |}n|d&d'fjot |d(i!} n|d)fjo t"GHdSn|d*d+d,fjo t#}q|d-fjo t$}qqW| o2yti%d.|d/|Wqti%qXnt&| ddfjottidnt&| djo| \}}n| d}t }d0|jot)i)|}n |g}xa|D]Y}|t jo|i+i,d1}nt }t }|d2joti/}t1i2}n|i3d3oY|}t4i5|}t6|d|i7}d4i8t9i:|dd5!i;d6d2}n&t1i<i=|}}t>|d7}|t jo|} | i+i,d8p| i+i,d9o d:i8|i@d:d; } n| d:| i+} xZtBd<D]B}yt>| d=iDPWnnX| d>|| i+f} qWn|} d}| d2joLtiFd?jo)dkG}|iHtiIiJt1iKntiI}d}n_t1i<i=| } yt>| d=iDWnd@| GHtidnXt>| d=}d}| odA|| fGHntM||dB|dC|dDtiIdE|d/| dF|dG| d|dH| }|o|iDn||iO7}| o|iOodI|iOGHqn|iO o|o#| o dJ| GHntP| qnqnW|otidndS(KNisdhqstwcxsquietshelps start-viewersstartsdebug=s copyrightsversionswarnstempdir=sformat=scss=scss-dumpsxhtmlsxmlshtmls encoding=iispdfs-hs--helps-ss--start-viewers--starts-qs--quiets-ws--warns-ds--debugs --copyrights --versions-ts--formats --encodings-cs--csssrs --css-dumps-xs--xmls--xhtmls--htmlslevelsformats*s.xmls-shttp:sis/srbs.htmls.htms.ii swbs-%d.%sswin32s4File '%s' seems to be in use of another application.sConverting %s to %s...sdebugspathserroutstempdirs link_callbacks default_csssencodings*** %d ERRORS OCCUREDsOpen viewer for file %s(Qsgetoptssyssargvsoptssargss GetoptErrorsusagesexitserrorss startviewersquietsdebugswarnsNonestempdirsformatscsssxhtmlsencodingsloggingsERRORs log_levels LOG_FORMATs log_formatsosasminsWARNsDEBUGsLOG_FORMAT_DEBUGsints COPYRIGHTsfilesreads DEFAULT_CSSsTruesFalses basicConfigslensa_srcsa_destsglobssrcslowersendswithslcswpathsstdinsfsrcsossgetcwds startswithsurllib2surlopenspisaLinkLoaders getFileNamesjoinsurlparsesurlsplitsreplacespathsabspathsopens dest_partssplitsdestsrangesiscloses fdestclosesplatformsmsvcrtssetmodesstdoutsfilenosO_BINARYsfdests pisaDocumentspdfserrs startViewer(sencodings fdestclosesa_srcsmsvcrtserrorss log_levelslcstempdirsxhtmlscsss dest_partsformatsdestsargsswarnsa_dests startviewerssrcsasfdestsiswpathsquietsosfsrcsdebugspdfs log_formatsopts((s&build\bdist.win32\egg\sx\pisa3\pisa.pyscommands V                / ,  "           cCs0yti|Wntid|nXdS(s Helper for opening a PDF files open "%s"N(soss startfilesfilenamessystem(sfilename((s&build\bdist.win32\egg\sx\pisa3\pisa.pys startViewers cCsUy=ti}t}|o ti}ntid|d|WntinXdS(s Shortcut for enabling log dump slevelsformatN(sloggingsWARNs log_levelsLOG_FORMAT_DEBUGs log_formatsdebugsDEs basicConfig(sdebugs log_formats log_level((s&build\bdist.win32\egg\sx\pisa3\pisa.pys showLoggings   s__main__("s __reversion__s __author__s__date__sgetoptssyssossos.pathsglobsurllib2surlparsestempfiles pisa_versions pisa_documents pisa_utilslogs pisa_defaults DEFAULT_CSSsVERSIONs __version__s pisaDocuments CreatePDFs VERSION_STRsstripsUSAGEs COPYRIGHTs LOG_FORMATsLOG_FORMAT_DEBUGsusagespisaLinkLoaderscommands startViewersFalses showLoggings__name__(sLOG_FORMAT_DEBUGs COPYRIGHTs CreatePDFs LOG_FORMATs DEFAULT_CSSsurlparseslogstempfilesusagesgetopts __version__sglobsurllib2s __author__ssyss showLoggings startViewersUSAGEs __reversion__s__date__scommandspisaLinkLoadersos((s&build\bdist.win32\egg\sx\pisa3\pisa.pys?s6          - .  PKi84 R&R&sx/pisa3/pisa.pyo; CHc@sdZdZdZdkZdkZdkZdkZdkZdkZdk Z dk Z dk Tdk Tdk lZdklZeZeZediZeZdZd Zd Zd fd YZd ZdZedZ e!djo endS(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 --encoding: the character encoding of . If left empty (default) this information will be extracted from the HTML header data --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 --xml, --xhtml, -x: Force parsing in XML Mode (automatically used if file ends with ".xml") --html: Force parsing in HTML Mode (default) s$%(levelname)s [%(name)s] %(message)ssB%(levelname)s [%(name)s] %(pathname)s line %(lineno)d: %(message)scCs tGHdS(N(sUSAGE(((s&build\bdist.win32\egg\sx\pisa3\pisa.pysusagemsspisaLinkLoadercBs/tZdZedZdZedZRS(s Helper to load page from an URL and load corresponding files to temporary files. If getFileName is called it returns the temporary 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__ys  cCs%x|iD]}ti|q WdS(N(sselfs tfileListspathsossremove(sselfspath((s&build\bdist.win32\egg\sx\pisa3\pisa.pys__del__~s c Cs`yti|p|i|}ti|didd} | 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|GHntidnXt SdS(Nis.iscsssgifsjpgspngssuffixswbis Loadingstos ERROR:spisaLinkLoader.getFileName( surlparsesurljoinsrelativesselfssrcsnamesurlsurlsplitssplitssuffixslowersNonesurllib2surlopensufilestempfilesmktempspathsfilestfilesTruesreadsdataswritescloses tfileListsappendsquiets Exceptionseslogs exception( sselfsnamesrelativesesurlsdatastfilespathsufilessuffix((s&build\bdist.win32\egg\sx\pisa3\pisa.pys getFileNames2      (s__name__s __module__s__doc__sTrues__init__s__del__sNones getFileName(((s&build\bdist.win32\egg\sx\pisa3\pisa.pyspisaLinkLoaderps   cCsyVtitiddddddddd d d d d dddddg\}} Wn*tij ottidnXd}d}d}d}d}t }d} t } t }t }ti}t}x|D]\}}|ddfjottin|dddfjo d}n|ddfjo d}n|ddfjod}t|ti}n|dd fjo*ti}t}|ot|}qn|d!d"fjotGHtidn|d#d$fjo |} n|d%fjo|o |}n|d&d'fjot |d(i!} n|d)fjo t"GHdSn|d*d+d,fjo t#}q|d-fjo t$}qqW| o2yti%d.|d/|Wqti%qXnt&| ddfjottidnt&| djo| \}}n| d}t }d0|jot)i)|}n |g}xa|D]Y}|t jo|i+i,d1}nt }t }|d2joti/}t1i2}n|i3d3oY|}t4i5|}t6|d|i7}d4i8t9i:|dd5!i;d6d2}n&t1i<i=|}}t>|d7}|t jo|} | i+i,d8p| i+i,d9o d:i8|i@d:d; } n| d:| i+} xZtBd<D]B}yt>| d=iDPWnnX| d>|| i+f} qWn|} d}| d2joLtiFd?jo)dkG}|iHtiIiJt1iKntiI}d}n_t1i<i=| } yt>| d=iDWnd@| GHtidnXt>| d=}d}| odA|| fGHntM||dB|dC|dDtiIdE|d/| dF|dG| d|dH| }|o|iDn||iO7}| o|iOodI|iOGHqn|iO o|o#| o dJ| GHntP| qnqnW|otidndS(KNisdhqstwcxsquietshelps start-viewersstartsdebug=s copyrightsversionswarnstempdir=sformat=scss=scss-dumpsxhtmlsxmlshtmls encoding=iispdfs-hs--helps-ss--start-viewers--starts-qs--quiets-ws--warns-ds--debugs --copyrights --versions-ts--formats --encodings-cs--csssrs --css-dumps-xs--xmls--xhtmls--htmlslevelsformats*s.xmls-shttp:sis/srbs.htmls.htms.ii swbs-%d.%sswin32s4File '%s' seems to be in use of another application.sConverting %s to %s...sdebugspathserroutstempdirs link_callbacks default_csssencodings*** %d ERRORS OCCUREDsOpen viewer for file %s(Qsgetoptssyssargvsoptssargss GetoptErrorsusagesexitserrorss startviewersquietsdebugswarnsNonestempdirsformatscsssxhtmlsencodingsloggingsERRORs log_levels LOG_FORMATs log_formatsosasminsWARNsDEBUGsLOG_FORMAT_DEBUGsints COPYRIGHTsfilesreads DEFAULT_CSSsTruesFalses basicConfigslensa_srcsa_destsglobssrcslowersendswithslcswpathsstdinsfsrcsossgetcwds startswithsurllib2surlopenspisaLinkLoaders getFileNamesjoinsurlparsesurlsplitsreplacespathsabspathsopens dest_partssplitsdestsrangesiscloses fdestclosesplatformsmsvcrtssetmodesstdoutsfilenosO_BINARYsfdests pisaDocumentspdfserrs startViewer(sencodings fdestclosesa_srcsmsvcrtserrorss log_levelslcstempdirsxhtmlscsss dest_partsformatsdestsargsswarnsa_dests startviewerssrcsasfdestsiswpathsquietsosfsrcsdebugspdfs log_formatsopts((s&build\bdist.win32\egg\sx\pisa3\pisa.pyscommands V                / ,  "           cCs0yti|Wntid|nXdS(s Helper for opening a PDF files open "%s"N(soss startfilesfilenamessystem(sfilename((s&build\bdist.win32\egg\sx\pisa3\pisa.pys startViewers cCsUy=ti}t}|o ti}ntid|d|WntinXdS(s Shortcut for enabling log dump slevelsformatN(sloggingsWARNs log_levelsLOG_FORMAT_DEBUGs log_formatsdebugsDEs basicConfig(sdebugs log_formats log_level((s&build\bdist.win32\egg\sx\pisa3\pisa.pys showLoggings   s__main__("s __reversion__s __author__s__date__sgetoptssyssossos.pathsglobsurllib2surlparsestempfiles pisa_versions pisa_documents pisa_utilslogs pisa_defaults DEFAULT_CSSsVERSIONs __version__s pisaDocuments CreatePDFs VERSION_STRsstripsUSAGEs COPYRIGHTs LOG_FORMATsLOG_FORMAT_DEBUGsusagespisaLinkLoaderscommands startViewersFalses showLoggings__name__(sLOG_FORMAT_DEBUGs COPYRIGHTs CreatePDFs LOG_FORMATs DEFAULT_CSSsurlparseslogstempfilesusagesgetopts __version__sglobsurllib2s __author__ssyss showLoggings startViewersUSAGEs __reversion__s__date__scommandspisaLinkLoadersos((s&build\bdist.win32\egg\sx\pisa3\pisa.pys?s6          - .  PKZ8Hsx/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 pisa_parser import re import urlparse import types from reportlab.platypus.paraparser import ParaParser, ParaFrag, ps2tt, tt2ps, ABag from reportlab.platypus.paragraph import cleanBlockQuotedText 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 = "Times-Roman" frag.fontName, frag.bold, frag.italic = ps2tt(style.fontName) 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.bulletFontName = "Helvetica" 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", "normal")).lower() bold = fweight in ("bold", "bolder", "500", "600", "700", "800", "900") if not bold and fweight<>"normal": log.warn(self.c.warning("@fontface, unknown value font-weight '%s'", fweight)) # 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.warn(self.c.warning("@fontface"), exc_info=1) 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): log.warn(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: log.warn(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: log.warn(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 log.warn(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: log.warn(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: log.warn(self.c.warning("@page"), exc_info=1) 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.warn(self.c.warning("@frame"), exc_info=1) 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) # StringIO.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 = PmlTableOfContents() self.story = [] self.text = [] self.log = [] self.err = 0 self.warn = 0 self.text = u"" self.uidctr = 0 self.multiBuild = False 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 UID(self): self.uidctr += 1 return self.uidctr # METHODS FOR CSS def addCSS(self, value): value = value.strip() if value.startswith("", "\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: # log.exception(self.error("Error parsing CSS by cssutils")) # 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 toParagraphStyle(self, first, full=False): 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.textColor = first.textColor style.alignment = first.alignment style.bulletFontName = first.bulletFontName or 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 if full: style.fontName = tt2ps(first.fontName, first.bold, first.italic) return style def addTOC(self): # style = copy.deepcopy(self.toParagraphStyle(self.fragBlock)) #cssAttrs = copy.deepcopy(self.node.cssAttrs) frag = copy.deepcopy(self.frag) styles = [] for i in range(0, 5): self.node.attributes["class"] = "pdftoclevel%d" % i #self.node.cssAttrs = copy.deepcopy(cssAttrs) self.frag = copy.deepcopy(frag) self.cssAttr = pisa_parser.CSSCollect(self.node, self) pisa_parser.CSS2Frag(self, { "margin-top": 0, "margin-bottom": 0, "margin-left": 0, "margin-right": 0, }, True) pstyle = self.toParagraphStyle(self.frag, True) styles.append(copy.deepcopy(pstyle)) # log.warn("%r", self.fragBlock.textColor) self.toc.levelStyles = styles 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 = self.toParagraphStyle(first) # 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) bulletText = copy.copy(first.bulletText) first.bulletText = None # Add paragraph to story if force or len(self.fragAnchor + self.fragList)>0: para = PmlParagraph( self.text, style, frags=self.fragAnchor + self.fragList, bulletText=bulletText) # Mirrored and BIDI #import unicodedata #for c in self.text: # print unicodedata.bidirectional(c), # XXX ??? # print repr(para) 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 copyFrag(self, **kw): frag = copy.deepcopy(self.frag) for k, v in kw.items(): setattr(frag, k, v) return frag 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 = frag.bulletFontName = tt2ps(frag.fontName, frag.bold, frag.italic) # print frag.bulletFontName # Modify text for optimal whitespace handling # XXX Support Unicode whitespaces? # XXX What about images? # XXX Doesn't work with Reportlab > 2.1 # NBSP = '\xc2\xa0' # u"_" NBSP = u"\u00a0" # Replace ­ with empty and normalize NBSP text = (text .replace(u"\xad", u"") .replace(u"\xc2\xa0", NBSP) .replace(u"\xa0", NBSP)) # log.debug("> %r", text) if frag.whiteSpace == "pre": # Handle by lines for text in re.split(r'(\r\n|\n|\r)', text): self.text += text if ("\n" in text) or ("\r" in text): # If EOL insert a linebreak frag = copy.deepcopy(baseFrag) frag.text = "" frag.lineBreak = 1 self._appendFrag(frag) else: # Handle tabs in a simple way text = text.replace(u"\t", 8 * u" ") # Somehow for Reportlab NBSP have to be inserted # as single character fragments for text in re.split(r'(\ )', text): frag = copy.deepcopy(baseFrag) if text == " ": text = NBSP frag.text = text self._appendFrag(frag) else: for text in re.split(u'(' + NBSP + u')', text): frag = copy.deepcopy(baseFrag) if text == NBSP: frag.text = NBSP 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) # print frag.fontName, repr(frag.text), frag.bulletText 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 "%s\n%s" % ( str(msg), self._getFragment(50)) # return "line %s: %s\n%s" % ( # self._getLineNumber(), # str(msg), # self._getFragment(50)) def warning(self, msg, *args): self.warn += 1 self.log.append((pisa_default.PML_WARNING, self._getLineNumber(), str(msg), self._getFragment(50))) return self.context(msg % args) def error(self, msg, *args): self.err += 1 self.log.append((pisa_default.PML_ERROR, self._getLineNumber(), str(msg), self._getFragment(50))) return self.context(msg % args) # UTILS def getFile(self, name, relative=None): """ Returns a file name or None """ try: path = relative or self.pathDirectory if self.pathCallback is not None: nv = self.pathCallback(name, relative) else: if path is None: log.warn("Could not find main directory for getting filename. Use CWD") path = os.getcwd() nv = os.path.normpath(os.path.join(path, name)) if not(nv and os.path.isfile(nv)): nv = None if nv is None: log.warn(self.warning("File '%s' does not exist" % (name))) return nv except: log.warn(self.warning("getFile %r %r %r", name, relative, path), exc_info=1) 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] parts = src.split(".") baseName, suffix = ".".join(parts[:-1]), parts[-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: log.warn(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: log.warn(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: log.warning(self.warning("wrong attributes for ")) except Exception, e: log.warn(self.warning("Loading font '%s'", fontName), exc_info=1) PKi8ܛjjsx/pisa3/pisa_context.pyc; #CHc@sOdZdZdZdkTdkTdkZdkZdkZdkZdk Z dk l Z l Z l Z lZlZdklZdklZdkZdei_d klZd klZd klZd klZl Z dk!Td Z"dZ#dZ$dZ%dZ&dei'fdYZ(dei)fdYZ*dfdYZ+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(sParagraphStylei(s pdfmetrics(sTTFont(s addMapping(scssscssDOMElementInterfaceif0.40000000000000002cCst}d|_d|_d|_d|_d|_d|_t|_ d|_ d|_ t |i \|_ |_|_|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|_:d|_;t|_<d|_=t|_>|SdS( Niss Times-Romans150%isnormals Helveticaf1.0(?sParaFragsfragssubssupersrises underlinesstrikesgreeksNoneslinkstextsfontNamesps2ttsstylesboldsitalicsfontSizes textColorsleadings leadingSourceswhites backColors borderWidths borderPaddings borderColors spaceBefores spaceAfters leftIndents rightIndentsfirstLineIndentsFalses keepWithNextsTA_LEFTs alignmentsvAlignsborderLeftWidthsborderLeftColorsborderLeftStylesborderRightWidthsborderRightColorsborderRightStylesborderTopWidthsborderTopColorsborderTopStylesborderBottomWidthsborderBottomColorsborderBottomStyles paddingLefts paddingRights paddingTops paddingBottoms listStyleTypes whiteSpaces pageNumbersheightswidths bulletIndents bulletTextsbulletFontNameszoomsoutlines outlineLevels outlineOpen(sstylesfrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getParaFrag'sp         !                                            cCsF|o|iid o tiitii|Sn|SdS(Nshttp:(spathslowers startswithsossdirnamesabspath(spath((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getDirNamers spisaCSSBuildercBs;tZdZdZeedZdZdZRS(Nc CsX|i|idg|}y|did}|d} t|i ddi }|dddd d d d fj}| o |djo t i|iid |nt|i ddi ddfj}|ii|d}|ii| |d|d|Wn4tj o(}t i|iidddnXhhfSdS(s Embed fonts s*is font-familys font-weightsnormalsboldsbolders500s600s700s800s900s)@fontface, unknown value font-weight '%s's font-stylessitalicsobliquessrcs @fontfacesexc_infoiN(sselfsrulesetsselectors declarationssresultsvaluessdatasnamessstrsgetslowersfweightsboldslogswarnscswarningsitalicsgetFilessrcsloadFonts Exceptionse( 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 d7} | t|id d7} |t|id d8}|t|id d8}| | ||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_pisaDimensionss./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 _pisaAddFrames )cCszy5|i}h}|pd}t}|o|i|idg|}|o|di d}|i dt}xmddddd d d d d dg D]C} |i | o-|ii|i||dtd|PqqWqn|ii |oti|id|n|i do/tii t|di|i|_n|i do|d} t| tij o | g} nt}g}x| D]}t|i}t|ti$jo|it%|q|djo t}qtii |oti||_qti|idqWt&|djo ||_n|ot'|i|_qng} g}x|iD] \} }}}}}}t0|||||i\}}}}|djp |djoti|iidnt1||||d| ddddddddd|p|}|o=g|_3|g|i4i |g|i4|<|i|q| i|qW|i dt}|o|i6|}n| oti|id|i||dtd|\} }}}}}}t0|||||i\}}}}|djp |djoti|id n| it1||||d| ddddddddd|p|nt7d|d!| d"|i} || _9|| _:|i;| _;| |i|j o(}ti|iid#d$d%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@pagesexc_infoi(@sselfscsdatasnamesNones pageBorders declarationssrulesetsselectorsresultsvaluessgetspropshas_keys frameListsappends _pisaAddFramesTrues templateListslogswarnswarnings pisa_defaults PML_PAGESIZESsstrslowerspageSizessizestypestypessListTypesFalses isLandscapessizeListsvaluesvalueStrs TupleTypesgetSizeslens landscapes staticListsfnamesstaticsbordersxsyswshs getCoordssFramesframespisaStaticStorys frameStatics backgroundsgetFilesPmlPageTemplatesptspisaStaticListspisaBackgroundspisaBackgroundListstemplatesframeStaticLists Exceptionse(sselfsnames pseudopages declarationssframes staticListsstaticsresultsborderssizesptspropsfnames frameListsws pageBorders backgrounds isLandscapesdatascssizeListsvalueshsysxsvalueStrse((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatPages  % (/       ' #3'       $cCs|o|i|idg|}yH|d}|o3|id}|iii |i ||nWqt j o(}ti|iidddqXnhhfSdS(Ns*is@framesexc_infoi(s declarationssselfsrulesetsselectorsresultsdatasvaluesscs frameListsappends _pisaAddFramesnames Exceptionseslogswarnswarning(sselfsnames declarationssesresultsdata((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatFrameOs (( s__name__s __module__s atFontFaces_pisaDimensionssFalsesNones _pisaAddFramesatPagesatFrame(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspisaCSSBuilderws    s pisaCSSParsercBstZdZRS(NcCs|i}|ii|d|i}g}|io|iidot 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 parseExternalas  (s__name__s __module__s parseExternal(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaCSSParser_ss pisaContextcBstZdZddZdZdZdZdZgdZe dZ d Z e d Z d Z d Zd ZdZdedZdZdZddZdZdZdZdZedZddZgdZddddZRS(s_ Helper class for creation of reportlab story and container for varoius data. ic Cstiti|_g|_t|_t|_ g|_ g|_ g|_ d|_ d|_d|_ d|_t|_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_FONTsselfsfontListspathsNonesnodesPmlTableOfContentsstocsstorystextslogserrswarnsuidctrsFalses multiBuildsA4spageSizestemplates 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__zsN                     &        cCs|id7_|iSdS(Ni(sselfsuidctr(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysUIDscCsk|i}|ido|dd!}n|ido|dd!}n|i|id7_dS(Ns sLoading font '%s'sexc_info(*snamesssrcstypestypessListTypes fontAliassappends_[1]ssplitsxslowersstripsstrsfontNamespartssjoinsbaseNamessuffixsboldsitalics fullFontNamesselfsfontListslogswarnswarnings pdfmetricss registerFontsTTFonts addMappingsafmspfbsEmbeddedType1FacesfacesnamesfontNameOriginalsregisterTypeFacesFontsencodingsjustFonts Exceptionse(sselfsnamesssrcsencodingsboldsitalicsfontNamessuffixs fontAliassafmspartsspfbsjustFontsfontNameOriginalsesbaseNamesfaces_[1]sxs fullFontName((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysloadFont&sX G-  #            (s__name__s __module__s__doc__s__init__sUIDsaddCSSsparseCSSsaddStorys swapStorysFalsestoParagraphStylesaddTOCsaddParas clearFragscopyFragsnewFrags _appendFragsNonesaddFragspushFragspullFrags _getFragments_getLineNumberscontextswarningserrorsgetFiles getFontNames registerFontsloadFont(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaContextss4  6   7     B    P        (,s __reversion__s __author__s__date__s pisa_utilspisa_reportlabs pisa_defaults pisa_parsersresurlparsestypessreportlab.platypus.paraparsers ParaParsersParaFragsps2ttstt2pssABagsreportlab.platypus.paragraphscleanBlockQuotedTextsreportlab.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 pisa_defaults pisa_parsers addMappingscssDOMElementInterfacesps2tts__date__s reportlabsParaFrags getParaFragsres sizeDeltas superFractionscsssParagraphStylesTTFontsABags __author__s ParaParsers pdfmetricss pisaCSSParserspisaCSSBuilderstypesscleanBlockQuotedTexts __reversion__s pisaContextsurlparses getDirNames subFractionstt2ps((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys?s6     %        K PKi8ܛjjsx/pisa3/pisa_context.pyo; #CHc@sOdZdZdZdkTdkTdkZdkZdkZdkZdk Z dk l Z l Z l Z lZlZdklZdklZdkZdei_d klZd klZd klZd klZl Z dk!Td Z"dZ#dZ$dZ%dZ&dei'fdYZ(dei)fdYZ*dfdYZ+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(sParagraphStylei(s pdfmetrics(sTTFont(s addMapping(scssscssDOMElementInterfaceif0.40000000000000002cCst}d|_d|_d|_d|_d|_d|_t|_ d|_ d|_ t |i \|_ |_|_|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|_:d|_;t|_<d|_=t|_>|SdS( Niss Times-Romans150%isnormals Helveticaf1.0(?sParaFragsfragssubssupersrises underlinesstrikesgreeksNoneslinkstextsfontNamesps2ttsstylesboldsitalicsfontSizes textColorsleadings leadingSourceswhites backColors borderWidths borderPaddings borderColors spaceBefores spaceAfters leftIndents rightIndentsfirstLineIndentsFalses keepWithNextsTA_LEFTs alignmentsvAlignsborderLeftWidthsborderLeftColorsborderLeftStylesborderRightWidthsborderRightColorsborderRightStylesborderTopWidthsborderTopColorsborderTopStylesborderBottomWidthsborderBottomColorsborderBottomStyles paddingLefts paddingRights paddingTops paddingBottoms listStyleTypes whiteSpaces pageNumbersheightswidths bulletIndents bulletTextsbulletFontNameszoomsoutlines outlineLevels outlineOpen(sstylesfrag((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getParaFrag'sp         !                                            cCsF|o|iid o tiitii|Sn|SdS(Nshttp:(spathslowers startswithsossdirnamesabspath(spath((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys getDirNamers spisaCSSBuildercBs;tZdZdZeedZdZdZRS(Nc CsX|i|idg|}y|did}|d} t|i ddi }|dddd d d d fj}| o |djo t i|iid |nt|i ddi ddfj}|ii|d}|ii| |d|d|Wn4tj o(}t i|iidddnXhhfSdS(s Embed fonts s*is font-familys font-weightsnormalsboldsbolders500s600s700s800s900s)@fontface, unknown value font-weight '%s's font-stylessitalicsobliquessrcs @fontfacesexc_infoiN(sselfsrulesetsselectors declarationssresultsvaluessdatasnamessstrsgetslowersfweightsboldslogswarnscswarningsitalicsgetFilessrcsloadFonts Exceptionse( 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 d7} | t|id d7} |t|id d8}|t|id d8}| | ||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_pisaDimensionss./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 _pisaAddFrames )cCszy5|i}h}|pd}t}|o|i|idg|}|o|di d}|i dt}xmddddd d d d d dg D]C} |i | o-|ii|i||dtd|PqqWqn|ii |oti|id|n|i do/tii t|di|i|_n|i do|d} t| tij o | g} nt}g}x| D]}t|i}t|ti$jo|it%|q|djo t}qtii |oti||_qti|idqWt&|djo ||_n|ot'|i|_qng} g}x|iD] \} }}}}}}t0|||||i\}}}}|djp |djoti|iidnt1||||d| ddddddddd|p|}|o=g|_3|g|i4i |g|i4|<|i|q| i|qW|i dt}|o|i6|}n| oti|id|i||dtd|\} }}}}}}t0|||||i\}}}}|djp |djoti|id n| it1||||d| ddddddddd|p|nt7d|d!| d"|i} || _9|| _:|i;| _;| |i|j o(}ti|iid#d$d%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@pagesexc_infoi(@sselfscsdatasnamesNones pageBorders declarationssrulesetsselectorsresultsvaluessgetspropshas_keys frameListsappends _pisaAddFramesTrues templateListslogswarnswarnings pisa_defaults PML_PAGESIZESsstrslowerspageSizessizestypestypessListTypesFalses isLandscapessizeListsvaluesvalueStrs TupleTypesgetSizeslens landscapes staticListsfnamesstaticsbordersxsyswshs getCoordssFramesframespisaStaticStorys frameStatics backgroundsgetFilesPmlPageTemplatesptspisaStaticListspisaBackgroundspisaBackgroundListstemplatesframeStaticLists Exceptionse(sselfsnames pseudopages declarationssframes staticListsstaticsresultsborderssizesptspropsfnames frameListsws pageBorders backgrounds isLandscapesdatascssizeListsvalueshsysxsvalueStrse((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatPages  % (/       ' #3'       $cCs|o|i|idg|}yH|d}|o3|id}|iii |i ||nWqt j o(}ti|iidddqXnhhfSdS(Ns*is@framesexc_infoi(s declarationssselfsrulesetsselectorsresultsdatasvaluesscs frameListsappends _pisaAddFramesnames Exceptionseslogswarnswarning(sselfsnames declarationssesresultsdata((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysatFrameOs (( s__name__s __module__s atFontFaces_pisaDimensionssFalsesNones _pisaAddFramesatPagesatFrame(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pyspisaCSSBuilderws    s pisaCSSParsercBstZdZRS(NcCs|i}|ii|d|i}g}|io|iidot 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 parseExternalas  (s__name__s __module__s parseExternal(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaCSSParser_ss pisaContextcBstZdZddZdZdZdZdZgdZe dZ d Z e d Z d Z d Zd ZdZdedZdZdZddZdZdZdZdZedZddZgdZddddZRS(s_ Helper class for creation of reportlab story and container for varoius data. ic Cstiti|_g|_t|_t|_ g|_ g|_ g|_ d|_ d|_d|_ d|_t|_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_FONTsselfsfontListspathsNonesnodesPmlTableOfContentsstocsstorystextslogserrswarnsuidctrsFalses multiBuildsA4spageSizestemplates 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__zsN                     &        cCs|id7_|iSdS(Ni(sselfsuidctr(sself((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysUIDscCsk|i}|ido|dd!}n|ido|dd!}n|i|id7_dS(Ns sLoading font '%s'sexc_info(*snamesssrcstypestypessListTypes fontAliassappends_[1]ssplitsxslowersstripsstrsfontNamespartssjoinsbaseNamessuffixsboldsitalics fullFontNamesselfsfontListslogswarnswarnings pdfmetricss registerFontsTTFonts addMappingsafmspfbsEmbeddedType1FacesfacesnamesfontNameOriginalsregisterTypeFacesFontsencodingsjustFonts Exceptionse(sselfsnamesssrcsencodingsboldsitalicsfontNamessuffixs fontAliassafmspartsspfbsjustFontsfontNameOriginalsesbaseNamesfaces_[1]sxs fullFontName((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pysloadFont&sX G-  #            (s__name__s __module__s__doc__s__init__sUIDsaddCSSsparseCSSsaddStorys swapStorysFalsestoParagraphStylesaddTOCsaddParas clearFragscopyFragsnewFrags _appendFragsNonesaddFragspushFragspullFrags _getFragments_getLineNumberscontextswarningserrorsgetFiles getFontNames registerFontsloadFont(((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys pisaContextss4  6   7     B    P        (,s __reversion__s __author__s__date__s pisa_utilspisa_reportlabs pisa_defaults pisa_parsersresurlparsestypessreportlab.platypus.paraparsers ParaParsersParaFragsps2ttstt2pssABagsreportlab.platypus.paragraphscleanBlockQuotedTextsreportlab.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 pisa_defaults pisa_parsers addMappingscssDOMElementInterfacesps2tts__date__s reportlabsParaFrags getParaFragsres sizeDeltas superFractionscsssParagraphStylesTTFontsABags __author__s ParaParsers pdfmetricss pisaCSSParserspisaCSSBuilderstypesscleanBlockQuotedTexts __reversion__s pisaContextsurlparses getDirNames subFractionstt2ps((s.build\bdist.win32\egg\sx\pisa3\pisa_context.pys?s6     %        K PK\8o9797sx/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, }), } # XXX use "html" not "*" as default! 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, pdftoc { 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, }PKi8 CO!O!sx/pisa3/pisa_default.pyc; jHc@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 <de df<ddd\d]d^gd]fff<de <de f<de <de f<de d}f<dFdGdHdIdgf<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 <de df<ddd\d]d^gd]fff<de <de f<de <de f<de d}f<dFdGdHdIdg%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 pisaStory( src, path = None, link_callback = None, debug = 0, default_css = None, xhtml = False, encoding = None, **kw): # Prepare Context c = pisaContext(path, debug=debug) c.pathCallback = link_callback # Use a default set of CSS definitions to get an expected output if default_css is None: default_css = DEFAULT_CSS # Parse and fill the story pisaParser(src, c, default_css, xhtml, encoding) #if 0: # import reportlab.pdfbase.pdfmetrics as pm # pm.dumpFontData() # Avoid empty documents 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 return c def pisaDocument( src, dest, path = None, link_callback = None, debug = 0, show_error_as_pdf = False, default_css = None, xhtml = False, encoding = None, **kw): try: log.debug("pisaDocument options:\n src = %r\n dest = %s\n path = %r\n link_callback = %r\n xhtml = %r", src, dest, path, link_callback, xhtml) c = pisaStory(src, path, link_callback, debug, default_css, xhtml, encoding) # Buffer PDF into memory out = StringIO.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 " # Prepare templates and their frames 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()) # Use multibuild e.g. if a TOC has to be created if c.multiBuild: doc.multiBuild(c.story) else: 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) #StringIO.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: log.warn(c.warning("Background PDF %s doesn't exist." % bg)) output.addPage(page) ctr += 1 out = StringIO.StringIO() output.write(out) # data = sout.getvalue() except Exception: log.exception(c.error("pyPDF error")) # istream.close() # Found a background? So leave loop after first occurence break else: log.warn(c.warning("pyPDF not installed!")) # Get the resulting PDF and write it to the file object # passed from the caller data = out.getvalue() dest.write(data) except: # log.exception(c.error("Document error")) log.exception("Document error") # In web frameworks for debugging purposes maybe an output of # errors in a PDF is preferred if c.err and show_error_as_pdf: return pisaErrorDocument(dest, c) return c PKi8#ګsx/pisa3/pisa_document.pyc; CHc@sdZdZdZdklZdklZdkTdkTdk l Z dk Z dk Z dk Z dZeed eeed Zeed eeeed 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_CSSNcCsti}|id|ixQ|iD]F\}}}}|djo'|id||t i |fq*q*W|id|i xQ|iD]F\}}}}|djo'|id||t i |fqqWt |i|SdS(NsI

%d error(s) occured:

serrors

%s in line %d: %s
s-

%d warning(s) occured:

swarnings

%s in line %d: %s

(sStringIOsoutswritescserrslogsmodeslinesmsgscodescgisescapeswarns pisaDocumentsgetvaluesdest(sdestscscodesmodesmsgslinesout((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pyspisaErrorDocuments   +  +ic Kst|d|} || _|tjo t}nt || |||| i o| idtnx4| iD])\}} | | ijo t|_qqqqW| SdS(Nsdebugsforce(s pisaContextspathsdebugscs link_callbacks pathCallbacks default_csssNones DEFAULT_CSSs pisaParserssrcsxhtmlsencodingsstorysaddParasTrues anchorFragsfragsanchors anchorNameslink( ssrcspaths link_callbacksdebugs default_csssxhtmlsencodingskwsfragscsanchor((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys pisaStory#s      c KsyQtid|||||t|||||||}t i } t | d|id|idid|ididgi}|idiidD]!}|o||iqq~d|ididd d d }|iid o|id }|id =nmtd |i\}}}}tdd dt||||dd dd dd dd dd gd|i}|i|g|ii |i!o|i!|i"n|i#|i"t$oDxW|i%D]2} | o$| }yt$i(} t$i*|} d }x|i%D]}| i.|}|oot0ii1|o>t$i*t2|d}|i.d }|i5||}qti6|i7d|n| i8||d 7}q(Wt i } | i9| Wqt:j oti;|i<dqXnPqWnti6|i7d| i=}|i9|Wnti;dnX|i?o|otA||Sn|SdS(NsZpisaDocument options: src = %r dest = %s path = %r link_callback = %r xhtml = %rspagesizesauthorssubjectskeywordss,stitles showBoundaryisallowSplittingisbodys1cm 1cm -1cm -1cmsidsframess leftPaddings rightPaddings bottomPaddings topPaddingsrbs Background PDF %s doesn't exist.s pyPDF errorspyPDF not installed!sDocument error(Bslogsdebugssrcsdestspaths link_callbacksxhtmls pisaStorys default_csssencodingscsStringIOsouts PmlBaseDocspageSizesmetasstripsappends_[1]ssplitsxsdocs templateListshas_keysbodysgetBoxsyswshsPmlPageTemplatesFramesaddPageTemplatessvaluess multiBuildsstorysbuildspyPdfspisaBackgroundListsbgoutersistreams PdfFileWritersoutputs PdfFileReadersinput1sctrsbgsgetPagespagesossexistssopensbginputspagebgs mergePageswarnswarningsaddPageswrites Exceptions exceptionserrorsgetvaluesdataserrsshow_error_as_pdfspisaErrorDocument(ssrcsdestspaths link_callbacksdebugsshow_error_as_pdfs default_csssxhtmlsencodingskwsbgoutersinput1soutsoutputsdatasistreamsbodysbgscsctrsdocsbginputs_[1]swshsysxspagebgspage((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys pisaDocumentGs    N              (s __reversion__s __author__s__date__s pisa_contexts pisaContexts pisa_parsers pisaParsers pisa_utilspisa_reportlabs pisa_defaults DEFAULT_CSSsosstypesscgispisaErrorDocumentsNonesFalses pisaStorys pisaDocument( scgisoss pisaParsers __reversion__s pisaContexts __author__s__date__spisaErrorDocuments pisaDocuments pisaStorys DEFAULT_CSSstypes((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys?s       $PKi8#ګsx/pisa3/pisa_document.pyo; CHc@sdZdZdZdklZdklZdkTdkTdk l Z dk Z dk Z dk Z dZeed eeed Zeed eeeed 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_CSSNcCsti}|id|ixQ|iD]F\}}}}|djo'|id||t i |fq*q*W|id|i xQ|iD]F\}}}}|djo'|id||t i |fqqWt |i|SdS(NsI

%d error(s) occured:

serrors

%s in line %d: %s
s-

%d warning(s) occured:

swarnings

%s in line %d: %s

(sStringIOsoutswritescserrslogsmodeslinesmsgscodescgisescapeswarns pisaDocumentsgetvaluesdest(sdestscscodesmodesmsgslinesout((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pyspisaErrorDocuments   +  +ic Kst|d|} || _|tjo t}nt || |||| i o| idtnx4| iD])\}} | | ijo t|_qqqqW| SdS(Nsdebugsforce(s pisaContextspathsdebugscs link_callbacks pathCallbacks default_csssNones DEFAULT_CSSs pisaParserssrcsxhtmlsencodingsstorysaddParasTrues anchorFragsfragsanchors anchorNameslink( ssrcspaths link_callbacksdebugs default_csssxhtmlsencodingskwsfragscsanchor((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys pisaStory#s      c KsyQtid|||||t|||||||}t i } t | d|id|idid|ididgi}|idiidD]!}|o||iqq~d|ididd d d }|iid o|id }|id =nmtd |i\}}}}tdd dt||||dd dd dd dd dd gd|i}|i|g|ii |i!o|i!|i"n|i#|i"t$oDxW|i%D]2} | o$| }yt$i(} t$i*|} d }x|i%D]}| i.|}|oot0ii1|o>t$i*t2|d}|i.d }|i5||}qti6|i7d|n| i8||d 7}q(Wt i } | i9| Wqt:j oti;|i<dqXnPqWnti6|i7d| i=}|i9|Wnti;dnX|i?o|otA||Sn|SdS(NsZpisaDocument options: src = %r dest = %s path = %r link_callback = %r xhtml = %rspagesizesauthorssubjectskeywordss,stitles showBoundaryisallowSplittingisbodys1cm 1cm -1cm -1cmsidsframess leftPaddings rightPaddings bottomPaddings topPaddingsrbs Background PDF %s doesn't exist.s pyPDF errorspyPDF not installed!sDocument error(Bslogsdebugssrcsdestspaths link_callbacksxhtmls pisaStorys default_csssencodingscsStringIOsouts PmlBaseDocspageSizesmetasstripsappends_[1]ssplitsxsdocs templateListshas_keysbodysgetBoxsyswshsPmlPageTemplatesFramesaddPageTemplatessvaluess multiBuildsstorysbuildspyPdfspisaBackgroundListsbgoutersistreams PdfFileWritersoutputs PdfFileReadersinput1sctrsbgsgetPagespagesossexistssopensbginputspagebgs mergePageswarnswarningsaddPageswrites Exceptions exceptionserrorsgetvaluesdataserrsshow_error_as_pdfspisaErrorDocument(ssrcsdestspaths link_callbacksdebugsshow_error_as_pdfs default_csssxhtmlsencodingskwsbgoutersinput1soutsoutputsdatasistreamsbodysbgscsctrsdocsbginputs_[1]swshsysxspagebgspage((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys pisaDocumentGs    N              (s __reversion__s __author__s__date__s pisa_contexts pisaContexts pisa_parsers pisaParsers pisa_utilspisa_reportlabs pisa_defaults DEFAULT_CSSsosstypesscgispisaErrorDocumentsNonesFalses pisaStorys pisaDocument( scgisoss pisaParsers __reversion__s pisaContexts __author__s__date__spisaErrorDocuments pisaDocuments pisaStorys DEFAULT_CSSstypes((s/build\bdist.win32\egg\sx\pisa3\pisa_document.pys?s       $PKh89|UUsx/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 html5lib from html5lib import treebuilders, serializer, treewalkers, inputstream 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 * import sx.w3c.css as css import sx.w3c.cssDOMElementInterface as 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): log.warn(c.warning("Attribute '%s' must be set!" % (k))) nattrs[k] = None continue 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)) log.warn(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: log.warn(c.warning("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: log.exception(c.error("Tag handling")) #else: # c.warning("tag <%s> is not supported" % tag) return AttrContainer(nattrs) 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 getCSSAttr(self, cssCascade, attrName, default=NotImplemented): if attrName in self.cssAttrs: return self.cssAttrs[attrName] try: result = cssCascade.findStyleFor(self.cssElement, attrName, default) except LookupError: result = None # XXX Workaround for inline styles try: style = self.cssStyle except: style = self.cssStyle = cssCascade.parser.parseInline(self.cssElement.getStyleAttr() or '')[0] if style.has_key(attrName): result = style[attrName] 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,)) if result is not None: self.cssAttrs[attrName] = result return result xml.dom.minidom.Element.getCSSAttr = getCSSAttr def CSSCollect(node, c): 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 LookupError: # pass except Exception: log.debug("CSS error '%s'", cssAttrName, exc_info=1) return node.cssAttrs def CSS2Frag(c, kw, isBlock): # 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"): # log.debug(c.cssAttr["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"]) def pisaPreLoop(node, c, collect=False): """ Collect all CSS definitions """ data = u"" if node.nodeType == Node.TEXT_NODE and collect: data = 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.get("type", "").lower() in ("", "text/css") and ( not media or "all" in media or "print" in media or "pdf" in media)): if name=="style": for node in node.childNodes: data += pisaPreLoop(node, c, collect=True) c.addCSS(data) return u"" #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: result = pisaPreLoop(node, c, collect=collect) if collect: data += result return data 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) # log.debug(indent + "<%s %s>" % (node.tagName, attr) + repr(node.attributes.items())) #, path # Calculate styles c.cssAttr = CSSCollect(node, c) c.node = node # Block? PAGE_BREAK=1 PAGE_BREAK_RIGHT=2 PAGE_BREAK_LEFT=3 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 str(c.cssAttr["page-break-before"]).lower() == "right": c.addStory(PageBreak()) c.addStory(PmlRightPageBreak()) if str(c.cssAttr["page-break-before"]).lower() == "left": c.addStory(PageBreak()) c.addStory(PmlLeftPageBreak()) if c.cssAttr.has_key("page-break-after"): if str(c.cssAttr["page-break-after"]).lower() == "always": pageBreakAfter = PAGE_BREAK if str(c.cssAttr["page-break-after"]).lower() == "right": pageBreakAfter = PAGE_BREAK_RIGHT if str(c.cssAttr["page-break-after"]).lower() == "left": pageBreakAfter = PAGE_BREAK_LEFT if display == "none": # print "none!" return # Translate CSS to frags # Save previous frag styles c.pushFrag() # Map styles to Reportlab fragment properties CSS2Frag(c, kw, isBlock) # 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 pageBreakAfter==PAGE_BREAK_RIGHT: c.addStory(PmlRightPageBreak()) if pageBreakAfter==PAGE_BREAK_LEFT: c.addStory(PmlLeftPageBreak()) 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=False, encoding=None): """ - 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")) if type(src) in types.StringTypes: if type(src) is types.UnicodeType: encoding = "utf8" src = src.encode(encoding) src = StringIO.StringIO(src) # Test for the restrictions of HTML5 lib if encoding: if encoding.strip().lower() == "utf8": encoding = "utf-8" if not inputstream.isValidEncoding(encoding): log.error("%r is not a valid encoding e.g. 'utf8' is not valid but 'utf-8' is!", encoding) document = parser.parse( src, encoding=encoding, parseMeta = not encoding) # 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 # Shortcuts HTML2PDF = pisaParser def XHTML2PDF(*a, **kw): kw["xhtml"] = True return HTML2PDF(*a, **kw) XML2PDF = XHTML2PDF PKi8CCsx/pisa3/pisa_parser.pyc; CHc@sdZdZdZdkZdkZdkZdkZdkZdkZdk Z dk l Z l Z l Z l Z dklZdkZdkTdkTdkTdkTdkiiZdkiiZeideieiBZdefd YZ d Z!d i"i#Z$e%d Z&e&ei'i(i)_&d Z*dZ+e,dZ-gdZ.de,e/dZ0e0Z1dZ2e2Z3dS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $N(s treebuilderss serializers treewalkerss inputstream(sNode(s*shttp://[^/]+(.*)s AttrContainercBstZdZRS(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 Csqh}|oOxL|iD]:\}} yt| |t|(sselfscanvs_docsinfosproducer(sself((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys beforePagescCsRt|dto;|id|ititi |i d|i fndS(NsoutlinesTOCEntryi( sgetattrsflowablesFalsesselfsnotifys outlineLevelscgisescapescopysdeepcopystextspage(sselfsflowable((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys afterFlowable4s(s__name__s __module__s__doc__s beforePages afterFlowable(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys PmlBaseDocs  sPmlPageTemplatecBstZdZdZRS(NcKs/g|_g|_t|_ti||dS(N(sselfspisaStaticListspisaBackgroundListsNonespisaBackgrounds PageTemplates__init__skw(sselfskw((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__>s   c Cs|izyt|i}x|iD]~}ti |}|i }xM|D]E}t |to/x,|iD]}|io ||_qqqqWqQqQW|i||q,WWn(tj o}tidddnXy|ii|iWn|iitnXWd|iXdS(NsPmlPageTemplatesexc_infoi(scanvass saveStatesstrs getPageNumbers pagenumbersselfspisaStaticListsframescopysdeepcopyspisaStaticStorysstorysobjs isinstances PmlParagraphsfragssfrags pageNumberstexts addFromLists ExceptionseslogsdebugspisaBackgroundListsappendspisaBackgroundsNones restoreState( sselfscanvassdocsfragsobjsstorys pagenumbersesframe((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysbeforeDrawPageDs0     (s__name__s __module__s__init__sbeforeDrawPage(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlPageTemplate<s sPmlImagecBstZdZRS(NcCsUt|i|}t||i}|i||_||_ti |||SdS(N( sminsselfs drawWidths availWidthswidthsfloatsfactors drawHeightsImageswraps availHeight(sselfs availWidths availHeightsfactorswidth((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswrapls  (s__name__s __module__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlImagejss PmlParagraphcBstZdZRS(NcCst|dtot|iddd}xa||ijoPt}|ii||ii t i |i |||i |d7}q/W|i|i_t}|ii||ii t i |i ||i|i |d7}nti|dS(sl 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: log.debug("PmlParagraph", exc_info=1) soutlines outlineLastiiN(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 PmlParagraphyssPmlTableOfContentscBstZdZRS(Nc Cs||i|if} t|idjodddfg} n |i} d} d}g} dddfddfdfdddfddfdfdddfddfdfdddfddfdfd ddfddfdfg}x| D]\} }}|i| }| o5|idd| fd| ft||ifn|i}td d | d |d ddt}t||}tt||}| i||g| d7} qWt| d| dt||_|ii|i||\|_!|_"|i!|i"fSdS(s,All table properties should be known by now.is!Placeholder for table of contentssVALIGNisTOPs LEFTPADDINGs RIGHTPADDINGs TOPPADDINGs BOTTOMPADDINGsnamesleftColLevel%dsparents leftIndents alignmentis colWidthssstyleN(#s availWidthsselfsrightColumnWidthswidthsslens _lastEntriess _tempEntriessis lastMargins tableDatas tableStyleslevelstextspageNums levelStyless leftColStylesappendsmaxs spaceBefores spaceAftersParagraphStylesTA_RIGHTs rightColStyles ParagraphsleftParasstrs rightParasTables TableStyles_tableswrapOnscanvs availHeightswidthsheight(sselfs availWidths availHeights rightColStylestextspageNumsleftParas tableStyles leftColStyles _tempEntriesslevelsiswidthss tableDatas lastMargins rightPara((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswraps8  5   '(s__name__s __module__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlTableOfContentsssPmlRightPageBreakcBstZdZdZRS(NcCsdS(N((sself((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__scCsZd|iidjo ||_||_||fSnd|_d|_ddfSdS(Nii(sselfscanvs getPageNumbers availWidthswidths availHeightsheight(sselfs availWidths availHeight((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswraps    (s__name__s __module__s__init__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlRightPageBreaks sPmlLeftPageBreakcBstZdZdZRS(NcCsdS(N((sself((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__scCsZd|iidjo ||_||_||fSnd|_d|_ddfSdS(Niii(sselfscanvs getPageNumbers availWidthswidths availHeightsheight(sselfs availWidths availHeight((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswraps    (s__name__s __module__s__init__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlLeftPageBreaks (s __reversion__s __author__s__date__s pisa_utils pisa_defaultsTAGSsSTRINGscopyscgisBaseDocTemplates PmlBaseDocs PageTemplatesPmlPageTemplatesImagesPmlImages Paragraphs PmlParagraphsTableOfContentssPmlTableOfContentss CondPageBreaksPmlRightPageBreaksPmlLeftPageBreak(scgisPmlPageTemplatesSTRINGsTAGSs PmlBaseDocsPmlImages PmlParagraphs __author__s__date__sPmlLeftPageBreaksPmlRightPageBreakscopys __reversion__sPmlTableOfContents((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys?s  +.16PKi8vYL"L"sx/pisa3/pisa_reportlab.pyo; KCHc@sdZdZdZdkTdklZlZdkZdkZde fdYZ de fd YZ d e fd YZd efd YZdefdYZdefdYZdefdYZdS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $(s*(sTAGSsSTRINGNs PmlBaseDoccBs tZdZdZdZRS(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 beforePagescCsRt|dto;|id|ititi |i d|i fndS(NsoutlinesTOCEntryi( sgetattrsflowablesFalsesselfsnotifys outlineLevelscgisescapescopysdeepcopystextspage(sselfsflowable((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys afterFlowable4s(s__name__s __module__s__doc__s beforePages afterFlowable(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys PmlBaseDocs  sPmlPageTemplatecBstZdZdZRS(NcKs/g|_g|_t|_ti||dS(N(sselfspisaStaticListspisaBackgroundListsNonespisaBackgrounds PageTemplates__init__skw(sselfskw((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__>s   c Cs|izyt|i}x|iD]~}ti |}|i }xM|D]E}t |to/x,|iD]}|io ||_qqqqWqQqQW|i||q,WWn(tj o}tidddnXy|ii|iWn|iitnXWd|iXdS(NsPmlPageTemplatesexc_infoi(scanvass saveStatesstrs getPageNumbers pagenumbersselfspisaStaticListsframescopysdeepcopyspisaStaticStorysstorysobjs isinstances PmlParagraphsfragssfrags pageNumberstexts addFromLists ExceptionseslogsdebugspisaBackgroundListsappendspisaBackgroundsNones restoreState( sselfscanvassdocsfragsobjsstorys pagenumbersesframe((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysbeforeDrawPageDs0     (s__name__s __module__s__init__sbeforeDrawPage(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlPageTemplate<s sPmlImagecBstZdZRS(NcCsUt|i|}t||i}|i||_||_ti |||SdS(N( sminsselfs drawWidths availWidthswidthsfloatsfactors drawHeightsImageswraps availHeight(sselfs availWidths availHeightsfactorswidth((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswrapls  (s__name__s __module__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlImagejss PmlParagraphcBstZdZRS(NcCst|dtot|iddd}xa||ijoPt}|ii||ii t i |i |||i |d7}q/W|i|i_t}|ii||ii t i |i ||i|i |d7}nti|dS(sl 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: log.debug("PmlParagraph", exc_info=1) soutlines outlineLastiiN(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 PmlParagraphyssPmlTableOfContentscBstZdZRS(Nc Cs||i|if} t|idjodddfg} n |i} d} d}g} dddfddfdfdddfddfdfdddfddfdfdddfddfdfd ddfddfdfg}x| D]\} }}|i| }| o5|idd| fd| ft||ifn|i}td d | d |d ddt}t||}tt||}| i||g| d7} qWt| d| dt||_|ii|i||\|_!|_"|i!|i"fSdS(s,All table properties should be known by now.is!Placeholder for table of contentssVALIGNisTOPs LEFTPADDINGs RIGHTPADDINGs TOPPADDINGs BOTTOMPADDINGsnamesleftColLevel%dsparents leftIndents alignmentis colWidthssstyleN(#s availWidthsselfsrightColumnWidthswidthsslens _lastEntriess _tempEntriessis lastMargins tableDatas tableStyleslevelstextspageNums levelStyless leftColStylesappendsmaxs spaceBefores spaceAftersParagraphStylesTA_RIGHTs rightColStyles ParagraphsleftParasstrs rightParasTables TableStyles_tableswrapOnscanvs availHeightswidthsheight(sselfs availWidths availHeights rightColStylestextspageNumsleftParas tableStyles leftColStyles _tempEntriesslevelsiswidthss tableDatas lastMargins rightPara((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswraps8  5   '(s__name__s __module__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlTableOfContentsssPmlRightPageBreakcBstZdZdZRS(NcCsdS(N((sself((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__scCsZd|iidjo ||_||_||fSnd|_d|_ddfSdS(Nii(sselfscanvs getPageNumbers availWidthswidths availHeightsheight(sselfs availWidths availHeight((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswraps    (s__name__s __module__s__init__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlRightPageBreaks sPmlLeftPageBreakcBstZdZdZRS(NcCsdS(N((sself((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys__init__scCsZd|iidjo ||_||_||fSnd|_d|_ddfSdS(Niii(sselfscanvs getPageNumbers availWidthswidths availHeightsheight(sselfs availWidths availHeight((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pyswraps    (s__name__s __module__s__init__swrap(((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pysPmlLeftPageBreaks (s __reversion__s __author__s__date__s pisa_utils pisa_defaultsTAGSsSTRINGscopyscgisBaseDocTemplates PmlBaseDocs PageTemplatesPmlPageTemplatesImagesPmlImages Paragraphs PmlParagraphsTableOfContentssPmlTableOfContentss CondPageBreaksPmlRightPageBreaksPmlLeftPageBreak(scgisPmlPageTemplatesSTRINGsTAGSs PmlBaseDocsPmlImages PmlParagraphs __author__s__date__sPmlLeftPageBreaksPmlRightPageBreakscopys __reversion__sPmlTableOfContents((s0build\bdist.win32\egg\sx\pisa3\pisa_reportlab.pys?s  +.16PKkU8N: 344sx/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 Table, TableStyle # from reportlab.platypus.flowables import * from reportlab.platypus.flowables import KeepInFrame from pisa_tags import * from pisa_util 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 if 0: 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: log.warn(c.warning(" is empty")) except: log.warn(c.warning("
"), exc_info=1) # 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): c.tableData.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 hinzufgen 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)) '''PKi8..sx/pisa3/pisa_tables.pyc; T)Hc@sdZdZdZdkZdklZlZdklZdk Tdk TdefdYZ e d Z d fd YZd efd YZdefdYZdefdYZdefdYZdS(s$Revision: 20 $s$Author: holtwick $s4$Date: 2007-10-09 12:58:24 +0200 (Di, 09 Okt 2007) $N(sTables TableStyle(s KeepInFrame(s*sPmlTablecBstZdZdZRS(NcCsjt|tdjo|dt|d }n%|tjp |djo |}nt||SdS(s$ Helper for calculating percentages sf100.0is*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
sexc_info(scs tableDatastdatasget_datasdatasPmlTablescolwsrowhsrepeatsaligns TableStylesstylessts_widthswidths totalWidthsfrags spaceBefores spaceAftersaddStoryslogswarnswarnings clearFragsselfsNone(sselfscstdatastsdata((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 pisaTagTABLEs 8s pisaTagTRcBstZdZdZRS(NcCs||i}|i}d|f}d|f}|i|||d|ii p |i i |i _ d|_ |i igdS(Niistr(scs tableDatastdatasrowsbeginsendsadd_cell_stylessselfsattrsvalignsfragsvAlignscolsdatasappend(sselfscsbeginsendstdatasrow((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysstarts     cCs|iid7_dS(Ni(scs tableDatasrow(sselfsc((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 pisaTagTRs s pisaTagTDcBstZdZdZRS(NcCs |iitj ot|ii|i_n|i|i |_ |i} |i }| i} | i}|i}|i}x^noVxN|iD]C\} } | |jo | |jo|d7}|id7_qqWPqW||f}||f}| o |d| d|df}n|o |d|d|df}n||jo|id||fxt|d|ddD]b} xYt|d|ddD]<} | |djp| |djo|i| | qqWqWn|i|||d|dt|ijo/|i|dt|itg|_n| oA|ii p |ii }|tj ot||i| is emptys
sexc_info(scs tableDatastdatasget_datasdatasPmlTablescolwsrowhsrepeatsaligns TableStylesstylessts_widthswidths totalWidthsfrags spaceBefores spaceAftersaddStoryslogswarnswarnings clearFragsselfsNone(sselfscstdatastsdata((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 pisaTagTABLEs 8s pisaTagTRcBstZdZdZRS(NcCs||i}|i}d|f}d|f}|i|||d|ii p |i i |i _ d|_ |i igdS(Niistr(scs tableDatastdatasrowsbeginsendsadd_cell_stylessselfsattrsvalignsfragsvAlignscolsdatasappend(sselfscsbeginsendstdatasrow((s-build\bdist.win32\egg\sx\pisa3\pisa_tables.pysstarts     cCs|iid7_dS(Ni(scs tableDatasrow(sselfsc((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 pisaTagTRs s pisaTagTDcBstZdZdZRS(NcCs |iitj ot|ii|i_n|i|i |_ |i} |i }| i} | i}|i}|i}x^noVxN|iD]C\} } | |jo | |jo|d7}|id7_qqWPqW||f}||f}| o |d| d|df}n|o |d|d|df}n||jo|id||fxt|d|ddD]b} xYt|d|ddD]<} | |djp| |djo|i| | qqWqWn|i|||d|dt|ijo/|i|dt|itg|_n| oA|ii p |ii }|tj ot||i| is deprecated!", DeprecationWarning, stacklevel=2) class pisaTag: """ The default class for a tag definition """ def __init__(self, node, attr): self.node = node self.tag = node.tagName self.attr = attr def start(self, c): pass def end(self, c): pass class pisaTagTITLE(pisaTag): def end(self, c): c.meta["title"] = c.text c.clearFrag() class pisaTagSTYLE(pisaTag): def start(self, c): c.addPara() def end(self, c): c.clearFrag() class pisaTagMETA(pisaTag): def start(self, c): name = self.attr.name.lower() if name in ("author" , "subject", "keywords"): c.meta[name] = self.attr.content class pisaTagSUP(pisaTag): def start(self, c): c.frag.super = 1 class pisaTagSUB(pisaTag): def start(self, c): c.frag.sub = 1 class pisaTagA(pisaTag): rxLink = re.compile("^(#|[a-z]+\:).*") def start(self, c): attr = self.attr # XXX Also support attr.id ? if attr.name: # Important! Make sure that cbDefn is not inherited by other # fragments because of a bug in Reportlab! afrag = copy.deepcopy(c.frag) afrag.cbDefn = ABag( kind = "anchor", name = attr.name, label = "anchor") c.fragAnchor.append(afrag) c.anchorName.append(attr.name) if attr.href and self.rxLink.match(attr.href): c.frag.link = attr.href def end(self, c): pass class pisaTagP(pisaTag): def start(self, c): # save the type of tag; it's used in PmlBaseDoc.afterFlowable() # to check if we need to add an outline-entry # c.frag.tag = self.tag if self.attr.align is not None: #print self.attr.align, getAlign(self.attr.align) c.frag.alignment = getAlign(self.attr.align) class pisaTagDIV(pisaTagP): pass class pisaTagH1(pisaTagP): pass class pisaTagH2(pisaTagP): pass class pisaTagH3(pisaTagP): pass class pisaTagH4(pisaTagP): pass class pisaTagH5(pisaTagP): pass class pisaTagH6(pisaTagP): pass def listDecimal(c): c.listCounter += 1 return unicode("%d." % c.listCounter) _bullet = u"\u2022" _list_style_type = { "none": u"", "disc": _bullet, "circle": _bullet, # XXX PDF has no equivalent "square": _bullet, # XXX PDF has no equivalent "decimal": listDecimal, "decimal-leading-zero": listDecimal, "lower-roman": listDecimal, "upper-roman": listDecimal, "hebrew": listDecimal, "georgian": listDecimal, "armenian": listDecimal, "cjk-ideographic": listDecimal, "hiragana": listDecimal, "katakana": listDecimal, "hiragana-iroha": listDecimal, "katakana-iroha": listDecimal, "lower-latin": listDecimal, "lower-alpha": listDecimal, "upper-latin": listDecimal, "upper-alpha": listDecimal, "lower-greek": listDecimal, } class pisaTagUL(pisaTagP): def start(self, c): self.counter, c.listCounter = c.listCounter, 0 def end(self, c): c.addPara() # XXX Simulate margin for the moment c.addStory(Spacer(width=1, height=c.fragBlock.spaceAfter)) c.listCounter = self.counter class pisaTagOL(pisaTagUL): pass class pisaTagLI(pisaTag): def start(self, c): lst = _list_style_type.get(c.frag.listStyleType or "disc", _bullet) #log.debug("frag %r", c.copyFrag( # text=lst, # bulletFontName=c.getFontName("helvetica"), # fontName=c.getFontName("helvetica"))) # c.addFrag("") #frag = ParaFrag() #frag.fontName = frag.bulletFontName = c.getFontName("helvetica") #frag.fontSize = c.frag.fontSize #c.frag.fontName = c.getFontName("helvetica") frag = copy.copy(c.frag) #print "###", c.frag.fontName #frag.fontName = "au_00" # c.getFontName("helvetica") #frag.bulletFontName = "au_00" # c.getFontName("helvetica") if type(lst) == type(u""): frag.text = lst else: # XXX This should be the recent font, but it throws errors in Reportlab! frag.text = lst(c) # XXX This should usually be done in the context!!! frag.fontName = frag.bulletFontName = tt2ps(frag.fontName, frag.bold, frag.italic) c.frag.bulletText = [frag] #def end(self, c): #c.fragBlock.bulletText = self.bulletText #print 999, self.bulletText # c.addPara() class pisaTagBR(pisaTag): def start(self, c): # print "BR", c.text[-40:] c.frag.lineBreak = 1 c.addFrag() c.fragStrip = True del c.frag.lineBreak class pisaTagIMG(pisaTag): def start(self, c): c.addPara() attr = self.attr if attr.src: if attr.src.lower().endswith("svg"): # self.next_para() # XXX SVG is missing! img = PmlSVG(attr.src, attr.width, attr.height) img.hAlign = string.upper(attr.align) img.spaceBefore = c.frag.spaceBefore img.spaceAfter = c.frag.spaceAfter c.addStory(img) else: try: # oldnextstyle = self.nextstyle # self.next_para(style="img") _width = attr.width _height = attr.height _img = PmlImage(attr.src, _width, _height) #, kind="proportional") #, lazy=2) # _img.hAlign = attr.align.upper() _img.hAlign = "LEFT" _img.pisaZoom = c.frag.zoom if (_width is None) and (_height is not None): factor = float(_height) / _img.imageHeight _img.drawWidth = _img.imageWidth * factor elif (_height is None) and (_width is not None): factor = float(_width) / _img.imageWidth _img.drawHeight = _img.imageHeight * factor elif (_width is None) and (_height is None): _img.drawWidth = _img.drawWidth * dpi96 _img.drawHeight = _img.drawHeight * dpi96 # print 888, _img.drawWidth, c.frag.zoom, _img.drawHeight _img.drawWidth *= _img.pisaZoom _img.drawHeight *= _img.pisaZoom _img.spaceBefore = c.frag.spaceBefore _img.spaceAfter = c.frag.spaceAfter c.addStory(_img) except Exception, e: log.warn(c.warning("Error in handling image '%s': %s" % (attr.src, str(e)))) else: log.warn(c.warning("Need a valid file name!")) c.addPara() class pisaTagHR(pisaTag): def start(self, c): c.addPara() c.addStory(HRFlowable( color = self.attr.color, thickness = self.attr.size, width = "100%", spaceBefore = c.frag.spaceBefore, spaceAfter = c.frag.spaceAfter )) # ============================================ class pisaTagPDFNEXTPAGE(pisaTag): """ """ 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 end(self, c): c.multiBuild = True c.addTOC() class pisaTagPDFFRAME(pisaTag): """ """ def start(self, c): deprecation("pdf:frame") 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): deprecation("pdf:template") 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: log.warn(c.warning("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): deprecation("pdf:font") 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() PKi8W\$S$Ssx/pisa3/pisa_tags.pyc; {CHc@s*dZdZdZdklZdkTdkTdklZdk l Z dk Tdk l Z dklZlZlZlZlZd kZd kZd kZd kZd Zd fd YZd efdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZ de fdYZ!de fdYZ"de fd YZ#d!e fd"YZ$d#e fd$YZ%d%e fd&YZ&d'e fd(YZ'd)Z(d*Z)hd+d,<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(<d@e( is deprecated!s stackleveli(swarningsswarnsmessagesDeprecationWarning(smessage((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys deprecationsspisaTagcBs)tZdZdZdZdZRS(s0 The default class for a tag definition cCs"||_|i|_||_dS(N(snodesselfstagNamestagsattr(sselfsnodesattr((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys__init__"s  cCsdS(N((sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart'scCsdS(N((sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend*s(s__name__s __module__s__doc__s__init__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTags   s pisaTagTITLEcBstZdZRS(NcCs|i|id<|idS(Nstitle(scstextsmetas clearFrag(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend.s(s__name__s __module__send(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagTITLE-ss pisaTagSTYLEcBstZdZdZRS(NcCs|idS(N(scsaddPara(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart3scCs|idS(N(scs clearFrag(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend5s(s__name__s __module__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagSTYLE2s s pisaTagMETAcBstZdZRS(NcCsC|iii}|dddfjo|ii|i|ss pisaTagSUBcBstZdZRS(NcCsd|i_dS(Ni(scsfragssub(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartCs(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagSUBBsspisaTagAcBs)tZeidZdZdZRS(Ns^(#|[a-z]+\:).*cCs|i}|ioZti|i}tddd|idd|_ |i i ||i i |in|i o|ii|i o|i |i_ndS(Nskindsanchorsnameslabel(sselfsattrsnamescopysdeepcopyscsfragsafragsABagscbDefns fragAnchorsappends anchorNameshrefsrxLinksmatchslink(sselfscsafragsattr((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartJs     cCsdS(N((sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysendZs(s__name__s __module__srescompilesrxLinksstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagAFs spisaTagPcBstZdZRS(NcCs3|iitj ot|ii|i_ndS(N(sselfsattrsalignsNonesgetAlignscsfrags alignment(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart^s(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagP]ss pisaTagDIVcBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagDIVfss pisaTagH1cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH1gss pisaTagH2cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH2hss pisaTagH3cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH3iss pisaTagH4cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH4jss pisaTagH5cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH5kss pisaTagH6cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH6lscCs$|id7_td|iSdS(Nis%d.(scs listCountersunicode(sc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys listDecimalnsu•snoneusdiscscirclessquaresdecimalsdecimal-leading-zeros lower-romans upper-romanshebrewsgeorgiansarmenianscjk-ideographicshiraganaskatakanashiragana-irohaskatakana-irohas lower-latins lower-alphas upper-latins upper-alphas lower-greeks pisaTagULcBstZdZdZRS(NcCs|idf\|_|_dS(Ni(scs listCountersselfscounter(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartscCs<|i|itddd|ii|i|_dS(Nswidthisheight( scsaddParasaddStorysSpacers fragBlocks spaceAftersselfscounters listCounter(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysends "(s__name__s __module__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagULs s pisaTagOLcBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagOLss pisaTagLIcBstZdZRS(NcCsti|iipdt}ti|i}t|tdjo ||_ n|||_ t |i |i |i |_ |_|g|i_dS(Nsdiscu(s_list_style_typesgetscsfrags listStyleTypes_bulletslstscopystypestextstt2pssfontNamesboldsitalicsbulletFontNames bulletText(sselfscsfragslst((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts  %(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagLIss pisaTagBRcBstZdZRS(NcCs,d|i_|it|_|i`dS(Ni(scsfrags lineBreaksaddFragsTrues fragStrip(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts   (s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagBRss pisaTagIMGcBstZdZRS(Nc CsP|i|i}|io|iiido_t|i|i|i }t i |i |_|ii|_|ii|_|i|qByR|i}|i }t|i||}d|_|ii|_|tjo |tj o't||i}|i||_n|tjo |tj o't||i}|i||_n?|tjo |tjo$|it |_|it |_n|i|i9_|i|i9_|ii|_|ii|_|i|WqBt!j o2}t#i$|i%d|it&|fqBXnt#i$|i%d|idS(NssvgsLEFTs Error in handling image '%s': %ssNeed a valid file name!('scsaddParasselfsattrssrcslowersendswithsPmlSVGswidthsheightsimgsstringsuppersalignshAlignsfrags spaceBefores spaceAftersaddStorys_widths_heightsPmlImages_imgszoomspisaZoomsNonesfloats imageHeightsfactors imageWidths drawWidths drawHeightsdpi96s Exceptionseslogswarnswarningsstr( sselfscsesimgs_heights_widths_imgsfactorsattr((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartsB      2(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagIMGss pisaTagHRcBstZdZRS(Nc CsT|i|itd|iid|iiddd|ii d|ii dS(Nscolors thicknessswidths100%s spaceBefores spaceAfter( scsaddParasaddStorys HRFlowablesselfsattrscolorssizesfrags spaceBefores spaceAfter(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts    (s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagHRsspisaTagPDFNEXTPAGEcBstZdZdZRS(s" cCsH|i|iio|it|iin|itdS(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.pyspisaTagPDFNEXTPAGEs spisaTagPDFNEXTTEMPLATEcBstZdZdZRS(s& cCs|it|iddS(Nsname(scsaddStorysNextPageTemplatesselfsattr(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.pyspisaTagPDFNEXTTEMPLATEs spisaTagPDFNEXTFRAMEcBstZdZdZRS(s# cCs|i|itdS(N(scsaddParasaddStorys FrameBreak(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.pyspisaTagPDFNEXTFRAMEs spisaTagPDFSPACERcBstZdZdZRS(s" cCs*|i|itd|iidS(Ni(scsaddParasaddStorysSpacersselfsattrsheight(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.pyspisaTagPDFSPACERs spisaTagPDFPAGENUMBERcBstZdZdZRS(s' cCs/t|i_|i|iit|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.pyspisaTagPDFPAGENUMBER&s s pisaTagPDFTOCcBstZdZdZRS(s cCst|_|idS(N(sTruescs multiBuildsaddTOC(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend3s (s__name__s __module__s__doc__send(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagPDFTOC/s spisaTagPDFFRAMEcBs tZdZdZdZRS(s- cCstd|i}|d}|tjod|i}n|i\}}}}t ||||d|ddddddd dd |i|_t|_|iio&t|_|i|i|_n|ii|idS( Ns pdf:framesnamesframe%dsids leftPaddingis rightPaddings bottomPaddings topPaddings showBoundary(s deprecationsselfsattrsattrssnamesNonescsUIDsboxsxsyswshsFramesbordersframesFalsesstaticsTruesaddParas swapStorysstorys frameListsappend(sselfscsnameshsattrsswsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart;s&        cCsN|io@|i|i|i_|ii|i|i |indS(N( sselfsstaticscsaddParasstorysframespisaStaticStorysframeStaticListsappends swapStory(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysendVs   (s__name__s __module__s__doc__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFFRAME7s  spisaTagPDFTEMPLATEcBs tZdZdZdZRS(sZ cCs[td|i}|d}g|_g|_|ii |o|i d|ndS(Ns pdf:templatesnames&template '%s' has already been defined( s deprecationsselfsattrsattrssnamescs frameListsframeStaticLists templateListshas_keyswarning(sselfscsnamesattrs((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartcs      cCs|i}|d}t|idjoti|i dnt d|d|idt }|i |_|i|_|ii|_||i| cCs3td|i|ii|ii|iidS(Nspdf:font(s deprecationscsloadFontsselfsattrsnamessrcsencoding(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.pyspisaTagPDFFONTs spisaTagPDFBARCODEcBstZdZdZRS(s) cCst|i|i}t}|i|_dt|_d|_ d|_ |i i |_ |i||idS(Nf0.5i(scsaddParasselfsattrs Standard39sbcsvaluesinchs barHeightslquietsrquietsalignsuppershAlignsaddStory(sselfscsattrsbc((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.pyspisaTagPDFBARCODEs (;s __reversion__s __author__s__date__s pisa_defaults DEFAULT_CSSspisa_reportlabs pisa_utils!reportlab.graphics.barcode.code39s Standard39sreportlab.lib.stylessParagraphStylesreportlab.platypus.flowablessreportlab.platypus.paragraphscleanBlockQuotedTextsreportlab.platypus.paraparsers ParaParsersParaFragsps2ttstt2pssABagsosspprintsreswarningss deprecationspisaTags pisaTagTITLEs pisaTagSTYLEs pisaTagMETAs pisaTagSUPs pisaTagSUBspisaTagAspisaTagPs pisaTagDIVs pisaTagH1s pisaTagH2s pisaTagH3s pisaTagH4s pisaTagH5s pisaTagH6s listDecimals_bullets_list_style_types pisaTagULs pisaTagOLs pisaTagLIs pisaTagBRs pisaTagIMGs pisaTagHRspisaTagPDFNEXTPAGEspisaTagPDFNEXTTEMPLATEspisaTagPDFNEXTFRAMEspisaTagPDFSPACERspisaTagPDFPAGENUMBERs pisaTagPDFTOCspisaTagPDFFRAMEspisaTagPDFTEMPLATEspisaTagPDFFONTspisaTagPDFBARCODE(3s pisaTagSUPsoss pisaTagMETAspisaTagPDFNEXTPAGEspisaTagPDFBARCODEspisaTagPDFSPACERs pisaTagTITLEs DEFAULT_CSSsps2tts_list_style_types Standard39spisaTags pisaTagULsParaFragspprintspisaTagPDFNEXTFRAMEs pisaTagLIsres pisaTagSTYLEs listDecimals pisaTagDIVs pisaTagHRs pisaTagSUBs pisaTagPDFTOCsParagraphStyles deprecationsABagswarningss pisaTagIMGs __author__s ParaParserspisaTagPDFFRAMEs pisaTagH2s pisaTagH3s pisaTagBRs pisaTagH1s pisaTagH6s pisaTagH4s pisaTagH5spisaTagAspisaTagPDFPAGENUMBERscleanBlockQuotedTextstt2pss_bulletspisaTagPDFTEMPLATEs__date__spisaTagPs pisaTagOLspisaTagPDFFONTs __reversion__spisaTagPDFNEXTTEMPLATE((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys?sb    %        $ 1  &9PKi8W\$S$Ssx/pisa3/pisa_tags.pyo; {CHc@s*dZdZdZdklZdkTdkTdklZdk l Z dk Tdk l Z dklZlZlZlZlZd kZd kZd kZd kZd Zd fd YZd efdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZ de fdYZ!de fdYZ"de fd YZ#d!e fd"YZ$d#e fd$YZ%d%e fd&YZ&d'e fd(YZ'd)Z(d*Z)hd+d,<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(<d@e( is deprecated!s stackleveli(swarningsswarnsmessagesDeprecationWarning(smessage((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys deprecationsspisaTagcBs)tZdZdZdZdZRS(s0 The default class for a tag definition cCs"||_|i|_||_dS(N(snodesselfstagNamestagsattr(sselfsnodesattr((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys__init__"s  cCsdS(N((sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart'scCsdS(N((sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend*s(s__name__s __module__s__doc__s__init__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTags   s pisaTagTITLEcBstZdZRS(NcCs|i|id<|idS(Nstitle(scstextsmetas clearFrag(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend.s(s__name__s __module__send(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagTITLE-ss pisaTagSTYLEcBstZdZdZRS(NcCs|idS(N(scsaddPara(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart3scCs|idS(N(scs clearFrag(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend5s(s__name__s __module__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagSTYLE2s s pisaTagMETAcBstZdZRS(NcCsC|iii}|dddfjo|ii|i|ss pisaTagSUBcBstZdZRS(NcCsd|i_dS(Ni(scsfragssub(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartCs(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagSUBBsspisaTagAcBs)tZeidZdZdZRS(Ns^(#|[a-z]+\:).*cCs|i}|ioZti|i}tddd|idd|_ |i i ||i i |in|i o|ii|i o|i |i_ndS(Nskindsanchorsnameslabel(sselfsattrsnamescopysdeepcopyscsfragsafragsABagscbDefns fragAnchorsappends anchorNameshrefsrxLinksmatchslink(sselfscsafragsattr((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartJs     cCsdS(N((sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysendZs(s__name__s __module__srescompilesrxLinksstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagAFs spisaTagPcBstZdZRS(NcCs3|iitj ot|ii|i_ndS(N(sselfsattrsalignsNonesgetAlignscsfrags alignment(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart^s(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagP]ss pisaTagDIVcBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagDIVfss pisaTagH1cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH1gss pisaTagH2cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH2hss pisaTagH3cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH3iss pisaTagH4cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH4jss pisaTagH5cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH5kss pisaTagH6cBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagH6lscCs$|id7_td|iSdS(Nis%d.(scs listCountersunicode(sc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys listDecimalnsu•snoneusdiscscirclessquaresdecimalsdecimal-leading-zeros lower-romans upper-romanshebrewsgeorgiansarmenianscjk-ideographicshiraganaskatakanashiragana-irohaskatakana-irohas lower-latins lower-alphas upper-latins upper-alphas lower-greeks pisaTagULcBstZdZdZRS(NcCs|idf\|_|_dS(Ni(scs listCountersselfscounter(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartscCs<|i|itddd|ii|i|_dS(Nswidthisheight( scsaddParasaddStorysSpacers fragBlocks spaceAftersselfscounters listCounter(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysends "(s__name__s __module__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagULs s pisaTagOLcBstZRS(N(s__name__s __module__(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagOLss pisaTagLIcBstZdZRS(NcCsti|iipdt}ti|i}t|tdjo ||_ n|||_ t |i |i |i |_ |_|g|i_dS(Nsdiscu(s_list_style_typesgetscsfrags listStyleTypes_bulletslstscopystypestextstt2pssfontNamesboldsitalicsbulletFontNames bulletText(sselfscsfragslst((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts  %(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagLIss pisaTagBRcBstZdZRS(NcCs,d|i_|it|_|i`dS(Ni(scsfrags lineBreaksaddFragsTrues fragStrip(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts   (s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagBRss pisaTagIMGcBstZdZRS(Nc CsP|i|i}|io|iiido_t|i|i|i }t i |i |_|ii|_|ii|_|i|qByR|i}|i }t|i||}d|_|ii|_|tjo |tj o't||i}|i||_n|tjo |tj o't||i}|i||_n?|tjo |tjo$|it |_|it |_n|i|i9_|i|i9_|ii|_|ii|_|i|WqBt!j o2}t#i$|i%d|it&|fqBXnt#i$|i%d|idS(NssvgsLEFTs Error in handling image '%s': %ssNeed a valid file name!('scsaddParasselfsattrssrcslowersendswithsPmlSVGswidthsheightsimgsstringsuppersalignshAlignsfrags spaceBefores spaceAftersaddStorys_widths_heightsPmlImages_imgszoomspisaZoomsNonesfloats imageHeightsfactors imageWidths drawWidths drawHeightsdpi96s Exceptionseslogswarnswarningsstr( sselfscsesimgs_heights_widths_imgsfactorsattr((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartsB      2(s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagIMGss pisaTagHRcBstZdZRS(Nc CsT|i|itd|iid|iiddd|ii d|ii dS(Nscolors thicknessswidths100%s spaceBefores spaceAfter( scsaddParasaddStorys HRFlowablesselfsattrscolorssizesfrags spaceBefores spaceAfter(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstarts    (s__name__s __module__sstart(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagHRsspisaTagPDFNEXTPAGEcBstZdZdZRS(s" cCsH|i|iio|it|iin|itdS(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.pyspisaTagPDFNEXTPAGEs spisaTagPDFNEXTTEMPLATEcBstZdZdZRS(s& cCs|it|iddS(Nsname(scsaddStorysNextPageTemplatesselfsattr(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.pyspisaTagPDFNEXTTEMPLATEs spisaTagPDFNEXTFRAMEcBstZdZdZRS(s# cCs|i|itdS(N(scsaddParasaddStorys FrameBreak(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.pyspisaTagPDFNEXTFRAMEs spisaTagPDFSPACERcBstZdZdZRS(s" cCs*|i|itd|iidS(Ni(scsaddParasaddStorysSpacersselfsattrsheight(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.pyspisaTagPDFSPACERs spisaTagPDFPAGENUMBERcBstZdZdZRS(s' cCs/t|i_|i|iit|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.pyspisaTagPDFPAGENUMBER&s s pisaTagPDFTOCcBstZdZdZRS(s cCst|_|idS(N(sTruescs multiBuildsaddTOC(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysend3s (s__name__s __module__s__doc__send(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys pisaTagPDFTOC/s spisaTagPDFFRAMEcBs tZdZdZdZRS(s- cCstd|i}|d}|tjod|i}n|i\}}}}t ||||d|ddddddd dd |i|_t|_|iio&t|_|i|i|_n|ii|idS( Ns pdf:framesnamesframe%dsids leftPaddingis rightPaddings bottomPaddings topPaddings showBoundary(s deprecationsselfsattrsattrssnamesNonescsUIDsboxsxsyswshsFramesbordersframesFalsesstaticsTruesaddParas swapStorysstorys frameListsappend(sselfscsnameshsattrsswsysx((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstart;s&        cCsN|io@|i|i|i_|ii|i|i |indS(N( sselfsstaticscsaddParasstorysframespisaStaticStorysframeStaticListsappends swapStory(sselfsc((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysendVs   (s__name__s __module__s__doc__sstartsend(((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pyspisaTagPDFFRAME7s  spisaTagPDFTEMPLATEcBs tZdZdZdZRS(sZ cCs[td|i}|d}g|_g|_|ii |o|i d|ndS(Ns pdf:templatesnames&template '%s' has already been defined( s deprecationsselfsattrsattrssnamescs frameListsframeStaticLists templateListshas_keyswarning(sselfscsnamesattrs((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pysstartcs      cCs|i}|d}t|idjoti|i dnt d|d|idt }|i |_|i|_|ii|_||i| cCs3td|i|ii|ii|iidS(Nspdf:font(s deprecationscsloadFontsselfsattrsnamessrcsencoding(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.pyspisaTagPDFFONTs spisaTagPDFBARCODEcBstZdZdZRS(s) cCst|i|i}t}|i|_dt|_d|_ d|_ |i i |_ |i||idS(Nf0.5i(scsaddParasselfsattrs Standard39sbcsvaluesinchs barHeightslquietsrquietsalignsuppershAlignsaddStory(sselfscsattrsbc((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.pyspisaTagPDFBARCODEs (;s __reversion__s __author__s__date__s pisa_defaults DEFAULT_CSSspisa_reportlabs pisa_utils!reportlab.graphics.barcode.code39s Standard39sreportlab.lib.stylessParagraphStylesreportlab.platypus.flowablessreportlab.platypus.paragraphscleanBlockQuotedTextsreportlab.platypus.paraparsers ParaParsersParaFragsps2ttstt2pssABagsosspprintsreswarningss deprecationspisaTags pisaTagTITLEs pisaTagSTYLEs pisaTagMETAs pisaTagSUPs pisaTagSUBspisaTagAspisaTagPs pisaTagDIVs pisaTagH1s pisaTagH2s pisaTagH3s pisaTagH4s pisaTagH5s pisaTagH6s listDecimals_bullets_list_style_types pisaTagULs pisaTagOLs pisaTagLIs pisaTagBRs pisaTagIMGs pisaTagHRspisaTagPDFNEXTPAGEspisaTagPDFNEXTTEMPLATEspisaTagPDFNEXTFRAMEspisaTagPDFSPACERspisaTagPDFPAGENUMBERs pisaTagPDFTOCspisaTagPDFFRAMEspisaTagPDFTEMPLATEspisaTagPDFFONTspisaTagPDFBARCODE(3s pisaTagSUPsoss pisaTagMETAspisaTagPDFNEXTPAGEspisaTagPDFBARCODEspisaTagPDFSPACERs pisaTagTITLEs DEFAULT_CSSsps2tts_list_style_types Standard39spisaTags pisaTagULsParaFragspprintspisaTagPDFNEXTFRAMEs pisaTagLIsres pisaTagSTYLEs listDecimals pisaTagDIVs pisaTagHRs pisaTagSUBs pisaTagPDFTOCsParagraphStyles deprecationsABagswarningss pisaTagIMGs __author__s ParaParserspisaTagPDFFRAMEs pisaTagH2s pisaTagH3s pisaTagBRs pisaTagH1s pisaTagH6s pisaTagH4s pisaTagH5spisaTagAspisaTagPDFPAGENUMBERscleanBlockQuotedTextstt2pss_bulletspisaTagPDFTEMPLATEs__date__spisaTagPs pisaTagOLspisaTagPDFFONTs __reversion__spisaTagPDFNEXTTEMPLATE((s+build\bdist.win32\egg\sx\pisa3\pisa_tags.pys?sb    %        $ 1  &9PK(v8Qsx/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 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 PKi8f  sx/pisa3/pisa_turbogears.pyc; L_Hc@sVdZdZdZdklZdkiZdkZdk Z e ddZ 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/pdfcsd}t|SdS(Ncsd}|SdS(Ncs|||}ti}titi||}|i o?t i i d<odt i i d="1"): raise ImportError("Reportlab Version 2.1+ is needed!") log = logging.getLogger("ho.pisa") try: import cStringIO as StringIO except: import StringIO 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 (types.ListType, types.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 == types.StringType: C = getAllNamedColors() s = arg.lower() 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): # log.debug(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.warn("getSize %r %r", original, relative, exc_info=1) # 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() PKi8^beF&F&sx/pisa3/pisa_util.pyc; CHc@sdZdZdZdklZlZdkTdkTdkTdk Tdk l Z dk Tdk lZdklZdkZdkZdkZdkZdkZdkZdkZdkZdkZeid d joeid d j oed neidZy dkZWndkZnXy dk Z Wn e!Z nXydk"l#Z#Wn e!Z#nXydk"l$Z$Wn e!Z$nXdZ%dZ&e!dZ'e!dZ(dZ)edZ*ddeZ+hddd<ddd<ddd <d!dd<d"d#d<d$dd%<d&d%d<d'dd<d(d)<d*d+ 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.pysgetBoxs   cCs^ti|}t|djo tdntt|\}}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.pysgetPoss  cCs&t|iddddfjSdS(s Is it a boolean? sysyess1strueN(sstrssslower(ss((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBoolscCstd7attSdS(s Unique ID iN(s_uidsstr(((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetUIDs sleftscentersmiddlesrightsjustifycCsti|itSdS(N(s _alignmentssgetsvalueslowersTA_LEFT(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetAlignscCs|iSdS(N(svaluesupper(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys getVAligns(;s __reversion__s __author__s__date__sreportlab.lib.unitssinchscmsreportlab.lib.stylessreportlab.lib.enumssreportlab.lib.colorssreportlab.lib.pagesizessreportlab.pdfbases pdfmetricssreportlab.platypussreportlab.platypus.flowablessFlowables"reportlab.platypus.tableofcontentssTableOfContentss reportlabscopystypessossos.pathspprintssyssloggingsstringsVersions ImportErrors getLoggerslogs cStringIOsStringIOspyPdfsNonesreportlab.graphicssrenderPMs renderSVGsErrorMsgstoLists_toColorsgetColorsgetBorderStylesmmsdpi96s _absSizeTablesgetSizes getCoordssgetBoxsgetPossgetBools_uidsgetUIDsTA_LEFTs TA_CENTERsTA_RIGHTs TA_JUSTIFYs _alignmentssgetAligns getVAlign(&sgetPosscms getCoordssFlowablespyPdfsgetSizesdpi96s_toColors _absSizeTablestoLists reportlabsgetBorderStyleslogspprintsTableOfContentssrenderPMsinchsgetUIDs renderSVGsstringsgetColorsgetBools _alignmentss __author__ssyss pdfmetricsscopystypessgetAlignsloggingsStringIOsmms __reversion__s getVAligns__date__sgetBoxsErrorMsgsos((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys?sr            )            3   3 PKi8F%%sx/pisa3/pisa_util.pyo; CHc@sdZdZdZdklZlZdkTdkTdkTdk Tdk l Z dk Tdk lZdklZdkZdkZdkZdkZdkZdkZdkZdkZdkZeid d joeid d j oed neidZy dkZWndkZnXy dk Z Wn e!Z nXydk"l#Z#Wn e!Z#nXydk"l$Z$Wn e!Z$nXdZ%dZ&e!dZ'e!dZ(dZ)edZ*ddeZ+hddd<ddd<ddd <d!dd<d"d#d<d$dd%<d&d%d<d'dd<d(d)<d*d+ 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.pysgetBoxs   cCs^ti|}t|djo tdntt|\}}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.pysgetPoss  cCs&t|iddddfjSdS(s Is it a boolean? sysyess1strueN(sstrssslower(ss((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetBoolscCstd7attSdS(s Unique ID iN(s_uidsstr(((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetUIDs sleftscentersmiddlesrightsjustifycCsti|itSdS(N(s _alignmentssgetsvalueslowersTA_LEFT(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pysgetAlignscCs|iSdS(N(svaluesupper(svalue((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys getVAligns(;s __reversion__s __author__s__date__sreportlab.lib.unitssinchscmsreportlab.lib.stylessreportlab.lib.enumssreportlab.lib.colorssreportlab.lib.pagesizessreportlab.pdfbases pdfmetricssreportlab.platypussreportlab.platypus.flowablessFlowables"reportlab.platypus.tableofcontentssTableOfContentss reportlabscopystypessossos.pathspprintssyssloggingsstringsVersions ImportErrors getLoggerslogs cStringIOsStringIOspyPdfsNonesreportlab.graphicssrenderPMs renderSVGsErrorMsgstoLists_toColorsgetColorsgetBorderStylesmmsdpi96s _absSizeTablesgetSizes getCoordssgetBoxsgetPossgetBools_uidsgetUIDsTA_LEFTs TA_CENTERsTA_RIGHTs TA_JUSTIFYs _alignmentssgetAligns getVAlign(&sgetPosscms getCoordssFlowablespyPdfsgetSizesdpi96s_toColors _absSizeTablestoLists reportlabsgetBorderStyleslogspprintsTableOfContentssrenderPMsinchsgetUIDs renderSVGsstringsgetColorsgetBools _alignmentss __author__ssyss pdfmetricsscopystypessgetAlignsloggingsStringIOsmms __reversion__s getVAligns__date__sgetBoxsErrorMsgsos((s+build\bdist.win32\egg\sx\pisa3\pisa_util.pys?sr            )            3   3 PKi8mQsx/pisa3/pisa_version.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2008 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 223 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2008-06-02 10:57:23 +0200 (Mo, 02 Jun 2008) $" __version__ = VERSION = "VERSION{3.0.20}VERSION"[8:-8] __build__ = BUILD = "BUILD{2008-06-02 13:14}BUILD"[6:-6] VERSION_STR = "pisa %s (Build %s)\n(c) Dirk Holtwick , Germany\nWebsite http:www.htmltopdf.org" % ( VERSION, BUILD, ) PKi8U?sx/pisa3/pisa_version.pyc; %CHc@sHdZdZdZddd!ZZddd!ZZd eefZd S( s$Revision: 223 $s$Author: holtwick $s4$Date: 2008-06-02 10:57:23 +0200 (Mo, 02 Jun 2008) $sVERSION{3.0.20}VERSIONiisBUILD{2008-06-02 13:14}BUILDiisfpisa %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 PKi8U?sx/pisa3/pisa_version.pyo; %CHc@sHdZdZdZddd!ZZddd!ZZd eefZd S( s$Revision: 223 $s$Author: holtwick $s4$Date: 2008-06-02 10:57:23 +0200 (Mo, 02 Jun 2008) $sVERSION{3.0.20}VERSIONiisBUILD{2008-06-02 13:14}BUILDiisfpisa %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*v8 p4 4 sx/pisa3/pisa_wsgi.py# -*- coding: UTF-8 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2008 ## ## All rights reserved ## ############################################# __version__ = "$Revision: 103 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2007-10-31 17:08:54 +0100 (Mi, 31 Okt 2007) $" __svnid__ = "$Id: pisa.py 103 2007-10-31 16:08:54Z holtwick $" import ho.pisa as pisa import StringIO import logging log = logging.getLogger("ho.pisa.wsgi") class Filter(object): def __init__(self, app): self.app = app def __call__(self, environ, start_response): script_name = environ.get('SCRIPT_NAME', '') path_info = environ.get('PATH_INFO', '') sent = [] written_response = StringIO.StringIO() def replacement_start_response(status, headers, exc_info=None): if not self.should_filter(status, headers): return start_response(status, headers, exc_info) else: sent[:] = [status, headers, exc_info] return written_response.write app_iter = self.app(environ, replacement_start_response) if not sent: return app_iter status, headers, exc_info = sent try: for chunk in app_iter: written_response.write(chunk) finally: if hasattr(app_iter, 'close'): app_iter.close() body = written_response.getvalue() status, headers, body = self.filter( script_name, path_info, environ, status, headers, body) start_response(status, headers, exc_info) return [body] def should_filter(self, status, headers): print headers def filter(self, status, headers, body): raise NotImplementedError class HTMLFilter(Filter): def should_filter(self, status, headers): if not status.startswith('200'): return False for name, value in headers: if name.lower() == 'content-type': return value.startswith('text/html') return False class PisaMiddleware(HTMLFilter): def filter(self, script_name, path_info, environ, status, headers, body): topdf = environ.get("pisa.topdf", "") if topdf: dst = StringIO.StringIO() result = pisa.CreatePDF( body, dst, show_error_as_pdf=True, ) headers = [ ("content-type", "application/pdf"), ("content-disposition", "attachment; filename=" + topdf) ] body = dst.getvalue() return status, headers, body PKi8umtoosx/pisa3/pisa_wsgi.pyc; Q_Hc@sdZdZdZdZdkiZdkZdkZeidZ de fdYZ de fd YZ d e fd YZ dS( s$Revision: 103 $s$Author: holtwick $s4$Date: 2007-10-31 17:08:54 +0100 (Mi, 31 Okt 2007) $s0$Id: pisa.py 103 2007-10-31 16:08:54Z holtwick $Ns ho.pisa.wsgisFiltercBs,tZdZdZdZdZRS(NcCs ||_dS(N(sappsself(sselfsapp((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys__init__sc s|idd}|idd} gtitd}i ||} o|Sn\}} } z"x|D]} i| qWWdt|do|inXi}i|| ||| |\}} }|| | |gSdS(Ns SCRIPT_NAMEss PATH_INFOcsCi|| o|||Sn|||g(iSdS(N( sselfs should_filtersstatussheaderssstart_responsesexc_infossentswritten_responseswrite(sstatussheaderssexc_info(swritten_responsesstart_responsesselfssent(s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysreplacement_start_responsessclose(senvironsgets script_names path_infossentsStringIOswritten_responsesNonesreplacement_start_responsesselfsappsapp_itersstatussheaderssexc_infoschunkswriteshasattrsclosesgetvaluesbodysfiltersstart_response(sselfsenvironsstart_responsesstatussbodysreplacement_start_responseswritten_responsesapp_iters script_namesheaderss path_infosexc_infoschunkssent((sselfsstart_responseswritten_responsessents+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys__call__s(  'cCs |GHdS(N(sheaders(sselfsstatussheaders((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys should_filter1scCs tdS(N(sNotImplementedError(sselfsstatussheaderssbody((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysfilter4s(s__name__s __module__s__init__s__call__s should_filtersfilter(((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysFilters   s HTMLFiltercBstZdZRS(NcCs\|id otSnx8|D]0\}}|idjo|idSq q WtSdS(Ns200s content-types text/html(sstatuss startswithsFalsesheaderssnamesvalueslower(sselfsstatussheaderssnamesvalue((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys should_filter:s (s__name__s __module__s should_filter(((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys HTMLFilter8ssPisaMiddlewarecBstZdZRS(Nc Csz|idd}|oPti}ti||dt} ddfdd|fg}|i }n|||fSdS(Ns pisa.topdfssshow_error_as_pdfs content-typesapplication/pdfscontent-dispositionsattachment; filename=( senvironsgetstopdfsStringIOsdstspisas CreatePDFsbodysTruesresultsheaderssgetvaluesstatus( sselfs script_names path_infosenvironsstatussheaderssbodysdststopdfsresult((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysfilterDs   (s__name__s __module__sfilter(((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysPisaMiddlewareBs(s __version__s __author__s__date__s __svnid__sho.pisaspisasStringIOsloggings getLoggerslogsobjectsFilters HTMLFiltersPisaMiddleware( sFiltersloggingslogsStringIOsPisaMiddlewarespisas __author__s__date__s __svnid__s HTMLFilters __version__((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys?s   ' PKi8umtoosx/pisa3/pisa_wsgi.pyo; Q_Hc@sdZdZdZdZdkiZdkZdkZeidZ de fdYZ de fd YZ d e fd YZ dS( s$Revision: 103 $s$Author: holtwick $s4$Date: 2007-10-31 17:08:54 +0100 (Mi, 31 Okt 2007) $s0$Id: pisa.py 103 2007-10-31 16:08:54Z holtwick $Ns ho.pisa.wsgisFiltercBs,tZdZdZdZdZRS(NcCs ||_dS(N(sappsself(sselfsapp((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys__init__sc s|idd}|idd} gtitd}i ||} o|Sn\}} } z"x|D]} i| qWWdt|do|inXi}i|| ||| |\}} }|| | |gSdS(Ns SCRIPT_NAMEss PATH_INFOcsCi|| o|||Sn|||g(iSdS(N( sselfs should_filtersstatussheaderssstart_responsesexc_infossentswritten_responseswrite(sstatussheaderssexc_info(swritten_responsesstart_responsesselfssent(s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysreplacement_start_responsessclose(senvironsgets script_names path_infossentsStringIOswritten_responsesNonesreplacement_start_responsesselfsappsapp_itersstatussheaderssexc_infoschunkswriteshasattrsclosesgetvaluesbodysfiltersstart_response(sselfsenvironsstart_responsesstatussbodysreplacement_start_responseswritten_responsesapp_iters script_namesheaderss path_infosexc_infoschunkssent((sselfsstart_responseswritten_responsessents+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys__call__s(  'cCs |GHdS(N(sheaders(sselfsstatussheaders((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys should_filter1scCs tdS(N(sNotImplementedError(sselfsstatussheaderssbody((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysfilter4s(s__name__s __module__s__init__s__call__s should_filtersfilter(((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysFilters   s HTMLFiltercBstZdZRS(NcCs\|id otSnx8|D]0\}}|idjo|idSq q WtSdS(Ns200s content-types text/html(sstatuss startswithsFalsesheaderssnamesvalueslower(sselfsstatussheaderssnamesvalue((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys should_filter:s (s__name__s __module__s should_filter(((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys HTMLFilter8ssPisaMiddlewarecBstZdZRS(Nc Csz|idd}|oPti}ti||dt} ddfdd|fg}|i }n|||fSdS(Ns pisa.topdfssshow_error_as_pdfs content-typesapplication/pdfscontent-dispositionsattachment; filename=( senvironsgetstopdfsStringIOsdstspisas CreatePDFsbodysTruesresultsheaderssgetvaluesstatus( sselfs script_names path_infosenvironsstatussheaderssbodysdststopdfsresult((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysfilterDs   (s__name__s __module__sfilter(((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pysPisaMiddlewareBs(s __version__s __author__s__date__s __svnid__sho.pisaspisasStringIOsloggings getLoggerslogsobjectsFilters HTMLFiltersPisaMiddleware( sFiltersloggingslogsStringIOsPisaMiddlewarespisas __author__s__date__s __svnid__s HTMLFilters __version__((s+build\bdist.win32\egg\sx\pisa3\pisa_wsgi.pys?s   ' PK\8zݶsx/pisa3/__init__.py# -*- coding: ISO-8859-1 -*- ############################################# ## (C)opyright by Dirk Holtwick, 2002-2007 ## ## All rights reserved ## ############################################# __reversion__ = "$Revision: 221 $" __author__ = "$Author: holtwick $" __date__ = "$Date: 2008-05-31 18:56:27 +0200 (Sa, 31 Mai 2008) $" REQUIRED_INFO = """ **************************************************** IMPORT ERROR! %s **************************************************** The following Python packages are required for PISA: - ReportlabToolkit>=2.1 - HTML5lib Optional packages: - pyPDF - PIL """.lstrip() try: from pisa import * except ImportError, e: import sys sys.stderr.write(REQUIRED_INFO % e) raise __version__ = VERSION PKi8d*sx/pisa3/__init__.pyc; CHc@skdZdZdZdiZy dkTWn5ej o)ZdkZei i eenXe Z dS(s$Revision: 221 $s$Author: holtwick $s4$Date: 2008-05-31 18:56:27 +0200 (Sa, 31 Mai 2008) $s **************************************************** IMPORT ERROR! %s **************************************************** The following Python packages are required for PISA: - ReportlabToolkit>=2.1 - HTML5lib Optional packages: - pyPDF - PIL (s*N( s __reversion__s __author__s__date__slstrips REQUIRED_INFOspisas ImportErrorsessyssstderrswritesVERSIONs __version__(ssyss REQUIRED_INFOses __author__s__date__s __version__s __reversion__((s*build\bdist.win32\egg\sx\pisa3\__init__.pys?s   PKi8d*sx/pisa3/__init__.pyo; CHc@skdZdZdZdiZy dkTWn5ej o)ZdkZei i eenXe Z dS(s$Revision: 221 $s$Author: holtwick $s4$Date: 2008-05-31 18:56:27 +0200 (Sa, 31 Mai 2008) $s **************************************************** IMPORT ERROR! %s **************************************************** The following Python packages are required for PISA: - ReportlabToolkit>=2.1 - HTML5lib Optional packages: - pyPDF - PIL (s*N( s __reversion__s __author__s__date__slstrips REQUIRED_INFOspisas ImportErrorsessyssstderrswritesVERSIONs __version__(ssyss REQUIRED_INFOses __author__s__date__s __version__s __reversion__((s*build\bdist.win32\egg\sx\pisa3\__init__.pys?s   PK\8p6g6g 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-2008 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """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) PKi8|`sx/w3c/css.pyc; kHc@sdZdkZdkZdkZdkZeiZdefdYZdefdYZdefdYZ de fd YZ d e ei fd YZ d e fd YZ defdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZd efd!YZd"eefd#YZd$eifd%YZd&eifd'YZdS((sCSS-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) NsCSSElementInterfaceAbstractcBsVtZedZdZdZdZdZfdZdZ dZ RS( NcCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnamesdefault((s#build\bdist.win32\egg\sx\w3c\css.pysgetAttr7scCs|iddSdS(Nsids(sselfsgetAttr(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getIdAttr9scCs|iddSdS(Nsclasss(sselfsgetAttr(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getClassAttr;scCstddS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetInlineStyle>scCstddS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pys matchesNodeAscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys inPseudoStateDscCstddS(s;Results must be compatible with CSSElementInterfaceAbstractsSubclass responsibilityN(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysiterXMLParentsGscCstddS(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       sCSSCascadeStrategycBstZeZeZeZeeedZeeedZedZe dZ e dZ dZ dZ e dZRS( 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}|iD]+\}}|||i |||fq&~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.pysfindStylesForEachscCsTg}|i}x-|i|D]}||i||7}q"W|i |SdS(N( srulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesetsfindCSSRuleForsattrNamessort(sselfselementsattrNamesrulessrulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesFors  c Cstgi}|D]}||gfq~}|i} xJ|i | D]9}x0|i D]"\}}||i||7}qbWqOWx|iD]}|iqW|SdS(N(sdictsappends_[1]s attrNamessnamesrulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesets iteritemssattrNames attrRulessfindCSSRuleFors itervaluesssort( sselfselements attrNamessattrNamesnames attrRulessruless_[1]srulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesForEachs3   cCsP|o|dd}||Sn,|tj o|Sntd||fdS(Niis#Could not find style for '%s' in %r(srulesstylesattrNamesdefaultsNotImplementeds LookupError(sselfsrulesattrNamesdefaultsstyle((s#build\bdist.win32\egg\sx\w3c\css.pys_extractStyleForRules   (s__name__s __module__sNonesauthorsusers userAgenrs__init__scopyWithUpdatesiterCSSRulesetssNotImplementeds findStyleForsfindStylesForEachsfindCSSRulesForsfindCSSRulesForEachs_extractStyleForRule(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSCascadeStrategyPs  sCSSSelectorBasecBstZeZeZeZddZdZdZ dZ e e Z dZ e e ZdZe eZdZe eZd Zd Zd Zd Zd ZedZdZRS(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 _updateHashscCs,|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 getNSPrefixscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetNamescCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getNamespacescCs|idd!SdS(Nii(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getFullNamescCs2|iif|i|if}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|iSdS(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 specificityscCsd}d}t|idj}x|iD]}|io|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_calcSpecificitys(        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   cCsg}|itj o!|id|i|ifn|i|ixK|iD]@}|io|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.pysCSSSelectorBases*                sCSSInlineSelectorcBstZeZRS(N(s__name__s __module__sTruesinline(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSInlineSelector ssCSSMutableSelectorcBsttZgZdZdZeeZdZdZdZdZ dZ dZ d Z d Z RS( NcCs>t|igi}|iD]}||iq~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,tZdfdZdZeeZRS(Ns*cCs-t||_ti|||idS(N(stuples qualifierssselfsCSSSelectorBases__init__s completeNames _updateHash(sselfs completeNames qualifiers((s#build\bdist.win32\egg\sx\w3c\css.pys__init__JscCs||i|iSdS(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 sCSSSelectorQualifierBasecBsGtZdZdZdZdZdZdZdZRS(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|iSdS(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      sCSSSelectorHashQualifiercBs5tZdZdZdZdZdZRS(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|ifSdS(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     sCSSSelectorClassQualifiercBs5tZdZdZdZdZdZRS(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|ifSdS(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|iijSdS(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\ZZZeedZdZdZ dZ dZ 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.pysisAttrscCs t|i|i|ifSdS(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|ittjSn|djo |i|i|itjSn|djo&|i|i|idijSnP|djo)|i|i|ididjSnt d|i|fdS(Ns=s~=ss|=s-sUnknown operator %r for %r( sselfsopsNoneselementsgetAttrsnamesNotImplementedsvaluessplits RuntimeError(sselfselementsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess     & )( s__name__s __module__sNonesNotImplementedsnamesopsvalues__init__sisAttrs__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorAttributeQualifiers    sCSSSelectorPseudoQualifiercBs8tZfdZdZdZdZdZRS(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.pysisPseudoscCst|i|ifSdS(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.pysasStrings cCs|i|i|iSdS(N(selements inPseudoStatesselfsnamesparams(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess(s__name__s __module__s__init__sisPseudos__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorPseudoQualifiers     sCSSSelectorCombinationQualifiercBs>tZdZdZdZdZdZdZRS(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 isCombinerscCst|i|ifSdS(N(shashsselfsopsselector(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__scCs |i|i|iiSdS(N(sselfs __class__sopsselectors asImmutable(sself((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutablescCsd|ii|ifSdS(Ns%s%s(sselfsselectorsasStringsop(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringscCs|i|if\}}|djo7x|iD]}|i|otSq2q2WtSni|djo7xX|iD]"}|i|otSqvtSqvWn%|djo|i|i SndS(Ns s>s+( sselfsopsselectorselementsiterXMLParentssparentsmatchessTruesFalsesgetPreviousSibling(sselfselementsparentsselectorsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess       (s__name__s __module__s__init__s isCombiners__hash__s asImmutablesasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorCombinationQualifiers      sCSSTerminalFunctioncBstZdZdZRS(NcCs||_||_dS(N(snamesselfsparams(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys__init__s cCs!d|idi|ifSdS(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.pysCSSTerminalFunctions sCSSTerminalOperatorcBstZdZdZRS(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.pysCSSTerminalOperators sCSSDeclarationscBstZRS(N(s__name__s __module__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSDeclarationsss CSSRulesetcBs#tZdZdZdZRS(NcCsig}xN|iD]@\}}||jo |i|o|i||fqqW|i |SdS(N( s ruleResultssselfs iteritemss nodeFilters declarationssattrNamesmatchesselementsappendssort(sselfselementsattrNames nodeFilters declarationss ruleResults((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesFors  cOs|i||dSdS(Ni(sselfsfindCSSRulesForsargsskw(sselfsargsskw((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRuleForscCsrxk|iD]]\}}|i|o||o,ti||||<||i|q |||scCstddS(NsSubclass responsibility(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pys matchesNodeAscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys inPseudoStateDscCstddS(s;Results must be compatible with CSSElementInterfaceAbstractsSubclass responsibilityN(sNotImplementedError(sself((s#build\bdist.win32\egg\sx\w3c\css.pysiterXMLParentsGscCstddS(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       sCSSCascadeStrategycBstZeZeZeZeeedZeeedZedZe dZ e dZ dZ dZ e dZRS( 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}|iD]+\}}|||i |||fq&~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.pysfindStylesForEachscCsTg}|i}x-|i|D]}||i||7}q"W|i |SdS(N( srulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesetsfindCSSRuleForsattrNamessort(sselfselementsattrNamesrulessrulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesFors  c Cstgi}|D]}||gfq~}|i} xJ|i | D]9}x0|i D]"\}}||i||7}qbWqOWx|iD]}|iqW|SdS(N(sdictsappends_[1]s attrNamessnamesrulesselementsgetInlineStylesinlinesselfsiterCSSRulesetssrulesets iteritemssattrNames attrRulessfindCSSRuleFors itervaluesssort( sselfselements attrNamessattrNamesnames attrRulessruless_[1]srulesetsinline((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesForEachs3   cCsP|o|dd}||Sn,|tj o|Sntd||fdS(Niis#Could not find style for '%s' in %r(srulesstylesattrNamesdefaultsNotImplementeds LookupError(sselfsrulesattrNamesdefaultsstyle((s#build\bdist.win32\egg\sx\w3c\css.pys_extractStyleForRules   (s__name__s __module__sNonesauthorsusers userAgenrs__init__scopyWithUpdatesiterCSSRulesetssNotImplementeds findStyleForsfindStylesForEachsfindCSSRulesForsfindCSSRulesForEachs_extractStyleForRule(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSCascadeStrategyPs  sCSSSelectorBasecBstZeZeZeZddZdZdZ dZ e e Z dZ e e ZdZe eZdZe eZd Zd Zd Zd Zd ZedZdZRS(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 _updateHashscCs,|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 getNSPrefixscCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pysgetNamescCs|idSdS(Ni(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getNamespacescCs|idd!SdS(Nii(sselfs completeName(sself((s#build\bdist.win32\egg\sx\w3c\css.pys getFullNamescCs2|iif|i|if}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|iSdS(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 specificityscCsd}d}t|idj}x|iD]}|io|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_calcSpecificitys(        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   cCsg}|itj o!|id|i|ifn|i|ixK|iD]@}|io|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.pysCSSSelectorBases*                sCSSInlineSelectorcBstZeZRS(N(s__name__s __module__sTruesinline(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSInlineSelector ssCSSMutableSelectorcBsttZgZdZdZeeZdZdZdZdZ dZ dZ d Z d Z RS( NcCs>t|igi}|iD]}||iq~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,tZdfdZdZeeZRS(Ns*cCs-t||_ti|||idS(N(stuples qualifierssselfsCSSSelectorBases__init__s completeNames _updateHash(sselfs completeNames qualifiers((s#build\bdist.win32\egg\sx\w3c\css.pys__init__JscCs||i|iSdS(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 sCSSSelectorQualifierBasecBsGtZdZdZdZdZdZdZdZRS(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|iSdS(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      sCSSSelectorHashQualifiercBs5tZdZdZdZdZdZRS(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|ifSdS(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     sCSSSelectorClassQualifiercBs5tZdZdZdZdZdZRS(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|ifSdS(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|iijSdS(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\ZZZeedZdZdZ dZ dZ 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.pysisAttrscCs t|i|i|ifSdS(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|ittjSn|djo |i|i|itjSn|djo&|i|i|idijSnP|djo)|i|i|ididjSnt d|i|fdS(Ns=s~=ss|=s-sUnknown operator %r for %r( sselfsopsNoneselementsgetAttrsnamesNotImplementedsvaluessplits RuntimeError(sselfselementsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess     & )( s__name__s __module__sNonesNotImplementedsnamesopsvalues__init__sisAttrs__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorAttributeQualifiers    sCSSSelectorPseudoQualifiercBs8tZfdZdZdZdZdZRS(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.pysisPseudoscCst|i|ifSdS(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.pysasStrings cCs|i|i|iSdS(N(selements inPseudoStatesselfsnamesparams(sselfselement((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess(s__name__s __module__s__init__sisPseudos__hash__sasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorPseudoQualifiers     sCSSSelectorCombinationQualifiercBs>tZdZdZdZdZdZdZRS(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 isCombinerscCst|i|ifSdS(N(shashsselfsopsselector(sself((s#build\bdist.win32\egg\sx\w3c\css.pys__hash__scCs |i|i|iiSdS(N(sselfs __class__sopsselectors asImmutable(sself((s#build\bdist.win32\egg\sx\w3c\css.pys asImmutablescCsd|ii|ifSdS(Ns%s%s(sselfsselectorsasStringsop(sself((s#build\bdist.win32\egg\sx\w3c\css.pysasStringscCs|i|if\}}|djo7x|iD]}|i|otSq2q2WtSni|djo7xX|iD]"}|i|otSqvtSqvWn%|djo|i|i SndS(Ns s>s+( sselfsopsselectorselementsiterXMLParentssparentsmatchessTruesFalsesgetPreviousSibling(sselfselementsparentsselectorsop((s#build\bdist.win32\egg\sx\w3c\css.pysmatchess       (s__name__s __module__s__init__s isCombiners__hash__s asImmutablesasStringsmatches(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSSelectorCombinationQualifiers      sCSSTerminalFunctioncBstZdZdZRS(NcCs||_||_dS(N(snamesselfsparams(sselfsnamesparams((s#build\bdist.win32\egg\sx\w3c\css.pys__init__s cCs!d|idi|ifSdS(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.pysCSSTerminalFunctions sCSSTerminalOperatorcBstZdZdZRS(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.pysCSSTerminalOperators sCSSDeclarationscBstZRS(N(s__name__s __module__(((s#build\bdist.win32\egg\sx\w3c\css.pysCSSDeclarationsss CSSRulesetcBs#tZdZdZdZRS(NcCsig}xN|iD]@\}}||jo |i|o|i||fqqW|i |SdS(N( s ruleResultssselfs iteritemss nodeFilters declarationssattrNamesmatchesselementsappendssort(sselfselementsattrNames nodeFilters declarationss ruleResults((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRulesFors  cOs|i||dSdS(Ni(sselfsfindCSSRulesForsargsskw(sselfsargsskw((s#build\bdist.win32\egg\sx\w3c\css.pysfindCSSRuleForscCsrxk|iD]]\}}|i|o||o,ti||||<||i|q |||, 2007-2008 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #~ 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 PKi8I\V !sx/w3c/cssDOMElementInterface.pyc; kHc@s&dkZdeifdYZdS(NsCSSDOMElementInterfacecBstZdZeZhdd<dd<dd<dd<d d <d d !ssnot-first-childcCst|iS(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|iS(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|ipt|iS(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|iddSdS(Nsids(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getIdAttrUscCs|iddSdS(Nsclasss(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getClassAttrWscCs|idtSdS(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 PKi8I\V !sx/w3c/cssDOMElementInterface.pyo; kHc@s&dkZdeifdYZdS(NsCSSDOMElementInterfacecBstZdZeZhdd<dd<dd<dd<d d <d d !ssnot-first-childcCst|iS(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|iS(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|ipt|iS(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|iddSdS(Nsids(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getIdAttrUscCs|iddSdS(Nsclasss(sselfsgetAttr(sself((s6build\bdist.win32\egg\sx\w3c\cssDOMElementInterface.pys getClassAttrWscCs|idtSdS(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\8pU՜՜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-2008 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """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): """A concrete instance implementing CSSBuilderAbstract""" return self._cssBuilder def setCSSBuilder(self, cssBuilder): """A concrete instance implementing CSSBuilderAbstract""" 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 PKi8˸-sx/w3c/cssParser.pyc; kHc@sdZdkZdkZdZdZdefdYZdefdYZdefd 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-ssCSSSelectorAbstractcBsDtZdZdZdZdZdZdZdZRS(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. cCstddS(NsSubclass responsibility(sNotImplementedError(sselfshashId((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addHashId9scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsclass_((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddClass;scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsattrName((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addAttribute=scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsattrNamesops attrValue((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddAttributeOperation?scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addPseudoAscCstddS(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      sCSSBuilderAbstractcBstZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZedZdZdZedZdZdZdZdZdZdZ RS(sOutlines 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 cCstddS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCharsetNscCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pysbeginStylesheetSscCstddS(NsSubclass responsibility(sNotImplementedError(sselfselements((s)build\bdist.win32\egg\sx\w3c\cssParser.pys stylesheetUscCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endStylesheetWscCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys beginInlineZscCstddS(NsSubclass responsibility(sNotImplementedError(sselfs declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysinline\scCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endInline^scCstddS(NsSubclass responsibility(sNotImplementedError(sselfs selectorss declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysrulesetascCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysresolveNamespacePrefixfscCstddS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atCharsetkscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsimport_smediumss cssParser((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatImportmscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsuri((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atNamespaceoscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsmediumssruleset((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatMediaqscCstddS(NsSubclass responsibility(sNotImplementedError(sselfspages pseudopages declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatPagesscCstddS(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.pysatIdentwscCstddS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfs selectorAscombiners selectorB((s)build\bdist.win32\egg\sx\w3c\cssParser.pyscombineSelectors|scCstddS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysselectorscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalues important((s)build\bdist.win32\egg\sx\w3c\cssParser.pyspropertyscCstddS(NsSubclass responsibility(sNotImplementedError(sselfstermAscombinerstermB((s)build\bdist.win32\egg\sx\w3c\cssParser.pys combineTermsscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termIdentscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvaluesunits((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termNumberscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermRGBscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermURIscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termStringscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermUnicodeRangescCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termFunctionscCstddS(NsSubclass responsibility(sNotImplementedError(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termUnknowns(!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 edZ dZ edZ 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.pyssetFullCSSSources    (s__name__s __module__sNonessrcsctxsrcsfullsrcsFalsesinlines srcCtxIdxs srcFullIdxs ctxsrcFullIdxs__init__s__str__ssetFullCSSSource(((s)build\bdist.win32\egg\sx\w3c\cssParser.pys CSSParseErrors s CSSParsercBsLtZdZeZdddddddgZdd d d fZd d gZdd dfZe odZ e i e i Be iBZdZdZdeZe edZe deeZe deeZdeefZe ieeZdedd!fZe ieeZdedd!fZe ieeZdeZe ieeZdeZe ieeZ deefZ!e ie!eZ"dZ#d e#Z$e d!e$eeZ%d"e%Z&d#e%Z'e e&e'Z(e ie(eZ)d$e(e d%eefZ*e ie*eZ+d&Z,e ie,eZ-d'eZ.e ie.eZ/ed(Z0e ie0eZ1d)e0Z2e ie2eZ3d*eefZ4d+Z5e4Z6e ie6eZ7d,Z8e ie8eZ9d-Z:e ie:eZ;[ ne<d.Z=d/Z>d0Z?e@e>e?ZAeBd1ZCd2ZDd3ZEhd4ZFd5ZGd6ZHd7ZId8ZJd9ZKd:ZLd;ZMd<ZNd=ZOd>ZPd?ZQd@ZRdAZSdBZTdCZUdDZVdEZWdFZXe dGZYdHZZdIZ[eBdJZ\dKZ]e<dLZ^e<e<dMZ_dNZ`e<ddOZaRS(PsCSS-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)|\*)iis((?:%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(s3A concrete instance implementing CSSBuilderAbstractN(sselfs _cssBuilder(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys getCSSBuilderCscCs ||_dS(s3A concrete instance implementing CSSBuilderAbstractN(s cssBuildersselfs _cssBuilder(sselfs cssBuilder((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCSSBuilderFscCs:z|i|i}Wd|o|inX|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 parseFileOscCs}|iizWti|}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.pysparseZs   cCs|iizly%|i|idt\}}Wn.|ij o}|i |dt nX|ii |}Wd|iiX|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 parseInlinems %c Ks|o|i|n|iizg}yLxE|iD]7\}}|i |i |\}}|i |q>WWn.|ij o}|i|dtnX|ii|}Wd|iiX|SdS(sParses 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(sParse 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.pysparseSingleAttrs cCs|iid|}|i|}|i|}|i|\}}|i|}g}x|o||i do7|i |\}}|t j o|i|qn#|i|\}}|i||i|}q`W|ii||}||fSdS(sstylesheet : [ 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_parseStylesheets$  cCs`xUnoM|i}|ido|d}q|ido|d}qPq W|SdS(s [S|CDO|CDC]*isiN(ssrcslstrips startswith(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseSCDOCDCs cCst|do{t|}|i|\}}|i}|d djo|id|tn|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_parseAtCharsets  cCsg}xtt|doc|}t|}|i|\}}|tjo|i d||ng}|i |i \}}xZ|tj oL|i||d djo)|di }|i |\}}qPqW| 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_parseAtImportss8      cCsQ|i|}x7t|do&|}t|}|i|\}}|tjo|i |\}}|tjo|i d||n|i|i \}}|tjo|i d||qnt}|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|do|i|\}}nt|do|i|\}}nt|do|i|\}}nt|do|i|\}}nht|do|i |\}}n?|i do|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_parseAtKeyword1s c Cs|}|tdi}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}qW|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 _parseAtMediaEs>    c Cs|}|tdi}|i|\} }|d djo|i|d\}}nt}g}|i}g}|i d o|i d||n|di}x|o|i d o|i do7|i |\}}|tj o|i|qDn,|i|idt\}}||7}|i}qW|ii| ||g}|di|fSd S( spage : 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 _parseAtPagevs0  ! cCsx|}|tdi}|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 _parseAtFramescCsT|}|tdi}|i|\}}|ii|g}||fSdS(Ns @font-face ( ssrcsctxsrcslenslstripsselfs_parseDeclarationGroups propertiess cssBuilders atFontFacesresult(sselfssrcs propertiessresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtFontFaces 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|\}}qXq|id||n|i |fSdS(Nis+At-rule expected an identifier for the rules;is{isUnable 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 _parseAtIdents0         cCsS|i|\}}|i|i\}}|ii||}||fSdS(sruleset : 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 _parseRulesets cCsg}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_parseSelectorGroups&  c CsQ|i|\}}t|}x|d dddddddd d f joxB|iD]1}|i|o|t|i }PqZqZWd }|i|\}}t||joc|d}xB|o)|d dddddddd d f jo|d}qW|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_parseSelectors( ,   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|qn|i|i|\}}|tj o|i|qn|ido|i||\}}q|ido|i||\}}qPqW|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|oPqqWd}|t|i}|oe|i |\}}|t jo?|i|\}}|t jo|id||qiqsnt }|id o|id||n |d}|o|i|||n|i|||fSd S( sattrib : '[' 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_parseSelectorAttribute1s>      !  cCs |}|id o|id||n|d}|i|\}}| o|id||n|idop|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|}|ido|dtf\}}n!|o|id||ng}|i}x|d ddddddd d d f jo|i |\}}|id od |d}qen|t joPn|i ||ido|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_parseDeclarationGroup|s0 ,  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_parseDeclarations  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_parseDeclarationPropertys  cCs|i|\}}t}x|d dddddddfjox<|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_parseExpressions&&   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(sterm : 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_parseExpressionTermsN        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|||ifSn ||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 CSSParsers /                   )  $  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&PKi8˸-sx/w3c/cssParser.pyo; kHc@sdZdkZdkZdZdZdefdYZdefdYZdefd 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-ssCSSSelectorAbstractcBsDtZdZdZdZdZdZdZdZRS(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. cCstddS(NsSubclass responsibility(sNotImplementedError(sselfshashId((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addHashId9scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsclass_((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddClass;scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsattrName((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addAttribute=scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsattrNamesops attrValue((s)build\bdist.win32\egg\sx\w3c\cssParser.pysaddAttributeOperation?scCstddS(NsSubclass responsibility(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pys addPseudoAscCstddS(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      sCSSBuilderAbstractcBstZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZedZdZdZedZdZdZdZdZdZdZ RS(sOutlines 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 cCstddS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCharsetNscCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pysbeginStylesheetSscCstddS(NsSubclass responsibility(sNotImplementedError(sselfselements((s)build\bdist.win32\egg\sx\w3c\cssParser.pys stylesheetUscCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endStylesheetWscCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys beginInlineZscCstddS(NsSubclass responsibility(sNotImplementedError(sselfs declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysinline\scCstddS(NsSubclass responsibility(sNotImplementedError(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys endInline^scCstddS(NsSubclass responsibility(sNotImplementedError(sselfs selectorss declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysrulesetascCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysresolveNamespacePrefixfscCstddS(NsSubclass responsibility(sNotImplementedError(sselfscharset((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atCharsetkscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsimport_smediumss cssParser((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatImportmscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnsPrefixsuri((s)build\bdist.win32\egg\sx\w3c\cssParser.pys atNamespaceoscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsmediumssruleset((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatMediaqscCstddS(NsSubclass responsibility(sNotImplementedError(sselfspages pseudopages declarations((s)build\bdist.win32\egg\sx\w3c\cssParser.pysatPagesscCstddS(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.pysatIdentwscCstddS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfs selectorAscombiners selectorB((s)build\bdist.win32\egg\sx\w3c\cssParser.pyscombineSelectors|scCstddS(s/Return value must implement CSSSelectorAbstractsSubclass responsibilityN(sNotImplementedError(sselfsname((s)build\bdist.win32\egg\sx\w3c\cssParser.pysselectorscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalues important((s)build\bdist.win32\egg\sx\w3c\cssParser.pyspropertyscCstddS(NsSubclass responsibility(sNotImplementedError(sselfstermAscombinerstermB((s)build\bdist.win32\egg\sx\w3c\cssParser.pys combineTermsscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termIdentscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvaluesunits((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termNumberscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermRGBscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermURIscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termStringscCstddS(NsSubclass responsibility(sNotImplementedError(sselfsvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pystermUnicodeRangescCstddS(NsSubclass responsibility(sNotImplementedError(sselfsnamesvalue((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termFunctionscCstddS(NsSubclass responsibility(sNotImplementedError(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys termUnknowns(!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 edZ dZ edZ 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.pyssetFullCSSSources    (s__name__s __module__sNonessrcsctxsrcsfullsrcsFalsesinlines srcCtxIdxs srcFullIdxs ctxsrcFullIdxs__init__s__str__ssetFullCSSSource(((s)build\bdist.win32\egg\sx\w3c\cssParser.pys CSSParseErrors s CSSParsercBsLtZdZeZdddddddgZdd d d fZd d gZdd dfZe odZ e i e i Be iBZdZdZdeZe edZe deeZe deeZdeefZe ieeZdedd!fZe ieeZdedd!fZe ieeZdeZe ieeZdeZe ieeZ deefZ!e ie!eZ"dZ#d e#Z$e d!e$eeZ%d"e%Z&d#e%Z'e e&e'Z(e ie(eZ)d$e(e d%eefZ*e ie*eZ+d&Z,e ie,eZ-d'eZ.e ie.eZ/ed(Z0e ie0eZ1d)e0Z2e ie2eZ3d*eefZ4d+Z5e4Z6e ie6eZ7d,Z8e ie8eZ9d-Z:e ie:eZ;[ ne<d.Z=d/Z>d0Z?e@e>e?ZAeBd1ZCd2ZDd3ZEhd4ZFd5ZGd6ZHd7ZId8ZJd9ZKd:ZLd;ZMd<ZNd=ZOd>ZPd?ZQd@ZRdAZSdBZTdCZUdDZVdEZWdFZXe dGZYdHZZdIZ[eBdJZ\dKZ]e<dLZ^e<e<dMZ_dNZ`e<ddOZaRS(PsCSS-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)|\*)iis((?:%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(s3A concrete instance implementing CSSBuilderAbstractN(sselfs _cssBuilder(sself((s)build\bdist.win32\egg\sx\w3c\cssParser.pys getCSSBuilderCscCs ||_dS(s3A concrete instance implementing CSSBuilderAbstractN(s cssBuildersselfs _cssBuilder(sselfs cssBuilder((s)build\bdist.win32\egg\sx\w3c\cssParser.pys setCSSBuilderFscCs:z|i|i}Wd|o|inX|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 parseFileOscCs}|iizWti|}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.pysparseZs   cCs|iizly%|i|idt\}}Wn.|ij o}|i |dt nX|ii |}Wd|iiX|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 parseInlinems %c Ks|o|i|n|iizg}yLxE|iD]7\}}|i |i |\}}|i |q>WWn.|ij o}|i|dtnX|ii|}Wd|iiX|SdS(sParses 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(sParse 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.pysparseSingleAttrs cCs|iid|}|i|}|i|}|i|\}}|i|}g}x|o||i do7|i |\}}|t j o|i|qn#|i|\}}|i||i|}q`W|ii||}||fSdS(sstylesheet : [ 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_parseStylesheets$  cCs`xUnoM|i}|ido|d}q|ido|d}qPq W|SdS(s [S|CDO|CDC]*isiN(ssrcslstrips startswith(sselfssrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys _parseSCDOCDCs cCst|do{t|}|i|\}}|i}|d djo|id|tn|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_parseAtCharsets  cCsg}xtt|doc|}t|}|i|\}}|tjo|i d||ng}|i |i \}}xZ|tj oL|i||d djo)|di }|i |\}}qPqW| 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_parseAtImportss8      cCsQ|i|}x7t|do&|}t|}|i|\}}|tjo|i |\}}|tjo|i d||n|i|i \}}|tjo|i d||qnt}|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|do|i|\}}nt|do|i|\}}nt|do|i|\}}nt|do|i|\}}nht|do|i |\}}n?|i do|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_parseAtKeyword1s c Cs|}|tdi}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}qW|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 _parseAtMediaEs>    c Cs|}|tdi}|i|\} }|d djo|i|d\}}nt}g}|i}g}|i d o|i d||n|di}x|o|i d o|i do7|i |\}}|tj o|i|qDn,|i|idt\}}||7}|i}qW|ii| ||g}|di|fSd S( spage : 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 _parseAtPagevs0  ! cCsx|}|tdi}|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 _parseAtFramescCsT|}|tdi}|i|\}}|ii|g}||fSdS(Ns @font-face ( ssrcsctxsrcslenslstripsselfs_parseDeclarationGroups propertiess cssBuilders atFontFacesresult(sselfssrcs propertiessresultsctxsrc((s)build\bdist.win32\egg\sx\w3c\cssParser.pys_parseAtFontFaces 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|\}}qXq|id||n|i |fSdS(Nis+At-rule expected an identifier for the rules;is{isUnable 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 _parseAtIdents0         cCsS|i|\}}|i|i\}}|ii||}||fSdS(sruleset : 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 _parseRulesets cCsg}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_parseSelectorGroups&  c CsQ|i|\}}t|}x|d dddddddd d f joxB|iD]1}|i|o|t|i }PqZqZWd }|i|\}}t||joc|d}xB|o)|d dddddddd d f jo|d}qW|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_parseSelectors( ,   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|qn|i|i|\}}|tj o|i|qn|ido|i||\}}q|ido|i||\}}qPqW|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|oPqqWd}|t|i}|oe|i |\}}|t jo?|i|\}}|t jo|id||qiqsnt }|id o|id||n |d}|o|i|||n|i|||fSd S( sattrib : '[' 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_parseSelectorAttribute1s>      !  cCs |}|id o|id||n|d}|i|\}}| o|id||n|idop|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|}|ido|dtf\}}n!|o|id||ng}|i}x|d ddddddd d d f jo|i |\}}|id od |d}qen|t joPn|i ||ido|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_parseDeclarationGroup|s0 ,  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_parseDeclarations  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_parseDeclarationPropertys  cCs|i|\}}t}x|d dddddddfjox<|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_parseExpressions&&   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(sterm : 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_parseExpressionTermsN        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|||ifSn ||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 CSSParsers /                   )  $  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&PKY8{[22sx/w3c/cssSpecial.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) $" """ 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, debug=0): # print selectors, declarations # CSS MODIFY! dd = [] for d in declarations: if debug: 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) 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)) # 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 debug and dd: log.debug("CSS special OUT:\n%s", "\n".join([repr(d) for d in 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 srcPKi8 !sx/w3c/cssSpecial.pyc; eHc@s dZdZdZdkZdkZeidZdZhdd<dd<d dd9<d?d9<d@d9d9<d?d9<d@d9, 2007 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PKi8^@xxsx/w3c/__init__.pyc; Hc@sdS(N((((s(build\bdist.win32\egg\sx\w3c\__init__.pys?sPKi8^@xxsx/w3c/__init__.pyo; Hc@sdS(N((((s(build\bdist.win32\egg\sx\w3c\__init__.pys?sPKi82EGG-INFO/dependency_links.txtPKi8x++<EGG-INFO/entry_points.txtPKi82EGG-INFO/not-zip-safePKi8atͨ EGG-INFO/PKG-INFOPKi8W`V EGG-INFO/SOURCES.txtPKi8HEGG-INFO/top_level.txtPKR8R22ho/__init__.pyPKi8EV--!ho/__init__.pycPKi8EV--{ho/__init__.pyoPKR8Oͅ!ho/pisa/__init__.pyPKi8Mn""$ho/pisa/__init__.pycPKi8Mn""\&ho/pisa/__init__.pyoPKR8R22(sx/__init__.pyPKi8Ƌ!--+sx/__init__.pycPKi8Ƌ!--h-sx/__init__.pyoPKe8v(.(./sx/pisa3/pisa.pyPKi84 R&R&^sx/pisa3/pisa.pycPKi84 R&R&sx/pisa3/pisa.pyoPKZ8Hsx/pisa3/pisa_context.pyPKi8ܛjjP2sx/pisa3/pisa_context.pycPKi8ܛjj"sx/pisa3/pisa_context.pyoPK\8o9797sx/pisa3/pisa_default.pyPKi8 CO!O!c?sx/pisa3/pisa_default.pycPKi8 CO!O!`sx/pisa3/pisa_default.pyoPKh8Gccosx/pisa3/pisa_document.pyPKi8#ګ sx/pisa3/pisa_document.pycPKi8#ګAsx/pisa3/pisa_document.pyoPKh89|UUysx/pisa3/pisa_parser.pyPKi8CCsx/pisa3/pisa_parser.pycPKi8CC]sx/pisa3/pisa_parser.pyoPKcX8@ ܡsx/pisa3/pisa_reportlab.pyPKi8vYL"L"sx/pisa3/pisa_reportlab.pycPKi8vYL"L":sx/pisa3/pisa_reportlab.pyoPKkU8N: 344sx/pisa3/pisa_tables.pyPKi8..<sx/pisa3/pisa_tables.pycPKi8..Gksx/pisa3/pisa_tables.pyoPK{X8K\s622sx/pisa3/pisa_tags.pyPKi8W\$S$Ssx/pisa3/pisa_tags.pycPKi8W\$S$Sh sx/pisa3/pisa_tags.pyoPK(v8Qssx/pisa3/pisa_turbogears.pyPKi8f  xsx/pisa3/pisa_turbogears.pycPKi8f  sx/pisa3/pisa_turbogears.pyoPKU8E"sx/pisa3/pisa_util.pyPKi8^beF&F&sx/pisa3/pisa_util.pycPKi8F%%{sx/pisa3/pisa_util.pyoPKi8mQBsx/pisa3/pisa_version.pyPKi8U?sx/pisa3/pisa_version.pycPKi8U? sx/pisa3/pisa_version.pyoPK*v8 p4 4 sx/pisa3/pisa_wsgi.pyPKi8umtooysx/pisa3/pisa_wsgi.pycPKi8umtoosx/pisa3/pisa_wsgi.pyoPK\8zݶ)sx/pisa3/__init__.pyPKi8d*-sx/pisa3/__init__.pycPKi8d*1sx/pisa3/__init__.pyoPK\8p6g6g 5sx/w3c/css.pyPKi8|`Dsx/w3c/css.pycPKi8BTTDsx/w3c/css.pyoPK\8Rײ tsx/w3c/cssDOMElementInterface.pyPKi8I\V !sx/w3c/cssDOMElementInterface.pycPKi8I\V !sx/w3c/cssDOMElementInterface.pyoPK\8pU՜՜v/sx/w3c/cssParser.pyPKi8˸-|sx/w3c/cssParser.pycPKi8˸-s sx/w3c/cssParser.pyoPKY8{[22 sx/w3c/cssSpecial.pyPKi8 !CM sx/w3c/cssSpecial.pycPKi8]ddm sx/w3c/cssSpecial.pyoPKR8wwLw sx/w3c/__init__.pyPKi8^@xx sx/w3c/__init__.pycPKi8^@xx6 sx/w3c/__init__.pyoPKEEJߏ