summaryrefslogtreecommitdiff
path: root/bin/reportlab/pdfbase/pdfpattern.py
diff options
context:
space:
mode:
authorpinky <>2006-12-07 13:41:40 +0000
committerpinky <>2006-12-07 13:41:40 +0000
commit004a0b996ff8f269451e07346f71a129a1f3fbaf (patch)
tree48f43c1fc2ca4c1f4d5648e7e73553d3f4ccae06 /bin/reportlab/pdfbase/pdfpattern.py
New trunk
bzr revid: pinky-3f10ee12cea3c4c75cef44ab04ad33ef47432907
Diffstat (limited to 'bin/reportlab/pdfbase/pdfpattern.py')
-rw-r--r--bin/reportlab/pdfbase/pdfpattern.py59
1 files changed, 59 insertions, 0 deletions
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, "")
+
+