From 87b2a6bebceba02de5b98c2bd963cbb2e363c453 Mon Sep 17 00:00:00 2001 From: pinky <> Date: Sun, 7 Jan 2007 23:35:02 +0000 Subject: RL2 bzr revid: pinky-9ee609e92f665d717ac2a51b921e52f7f73390c4 --- bin/reportlab/pdfbase/pdfpattern.py | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 bin/reportlab/pdfbase/pdfpattern.py (limited to 'bin/reportlab/pdfbase/pdfpattern.py') diff --git a/bin/reportlab/pdfbase/pdfpattern.py b/bin/reportlab/pdfbase/pdfpattern.py new file mode 100644 index 00000000000..0ba62c9bed6 --- /dev/null +++ b/bin/reportlab/pdfbase/pdfpattern.py @@ -0,0 +1,59 @@ +""" +helper for importing pdf structures into a ReportLab generated document +""" +from reportlab.pdfbase.pdfdoc import format + +import string + +class PDFPattern: + __RefOnly__ = 1 + def __init__(self, pattern_sequence, **keywordargs): + """ + Description of a kind of PDF object using a pattern. + + Pattern sequence should contain strings or singletons of form [string]. + Strings are literal strings to be used in the object. + Singletons are names of keyword arguments to include. + Keyword arguments can be non-instances which are substituted directly in string conversion, + or they can be object instances in which case they should be pdfdoc.* style + objects with a x.format(doc) method. + Keyword arguments may be set on initialization or subsequently using __setitem__, before format. + "constant object" instances can also be inserted in the patterns. + """ + self.pattern = pattern_sequence + self.arguments = keywordargs + from types import StringType, InstanceType + toptypes = (StringType, InstanceType) + for x in pattern_sequence: + if type(x) not in toptypes: + if len(x)!=1: + raise ValueError, "sequence elts must be strings or singletons containing strings: "+repr(x) + if type(x[0]) is not StringType: + raise ValueError, "Singletons must contain strings or instances only: "+repr(x[0]) + def __setitem__(self, item, value): + self.arguments[item] = value + def __getitem__(self, item): + return self.arguments[item] + def format(self, document): + L = [] + arguments = self.arguments + from types import StringType, InstanceType + for x in self.pattern: + tx = type(x) + if tx is StringType: + L.append(x) + elif tx is InstanceType: + L.append( x.format(document) ) + else: + name = x[0] + value = arguments.get(name, None) + if value is None: + raise ValueError, "%s value not defined" % repr(name) + if type(value) is InstanceType: + #L.append( value.format(document) ) + L.append(format(value, document)) + else: + L.append( str(value) ) + return string.join(L, "") + + -- cgit v1.2.3