summaryrefslogtreecommitdiff
path: root/bin/reportlab/lib/extformat.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/reportlab/lib/extformat.py')
-rw-r--r--bin/reportlab/lib/extformat.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/bin/reportlab/lib/extformat.py b/bin/reportlab/lib/extformat.py
new file mode 100644
index 00000000000..f3450596081
--- /dev/null
+++ b/bin/reportlab/lib/extformat.py
@@ -0,0 +1,81 @@
+#Copyright ReportLab Europe Ltd. 2000-2004
+#see license.txt for license details
+#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/lib/extformat.py
+from tokenize import tokenprog
+import sys
+
+def _matchorfail(text, pos):
+ match = tokenprog.match(text, pos)
+ if match is None: raise ValueError(text, pos)
+ return match, match.end()
+
+'''
+ Extended dictionary formatting
+ We allow expressions in the parentheses instead of
+ just a simple variable.
+'''
+def dictformat(_format, L={}, G={}):
+ format = _format
+
+ S = {}
+ chunks = []
+ pos = 0
+ n = 0
+
+ while 1:
+ pc = format.find("%", pos)
+ if pc < 0: break
+ nextchar = format[pc+1]
+
+ if nextchar == "(":
+ chunks.append(format[pos:pc])
+ pos, level = pc+2, 1
+ while level:
+ match, pos = _matchorfail(format, pos)
+ tstart, tend = match.regs[3]
+ token = format[tstart:tend]
+ if token == "(": level = level+1
+ elif token == ")": level = level-1
+ vname = '__superformat_%d' % n
+ n += 1
+ S[vname] = eval(format[pc+2:pos-1],L,G)
+ chunks.append('%%(%s)' % vname)
+ else:
+ nc = pc+1+(nextchar=="%")
+ chunks.append(format[pos:nc])
+ pos = nc
+
+ if pos < len(format): chunks.append(format[pos:])
+ return (''.join(chunks)) % S
+
+def magicformat(format):
+ """Evaluate and substitute the appropriate parts of the string."""
+ try: 1/0
+ except: frame = sys.exc_traceback.tb_frame
+ while frame.f_globals["__name__"] == __name__: frame = frame.f_back
+ return dictformat(format,frame.f_locals, frame.f_globals)
+
+if __name__=='__main__':
+ from reportlab.lib.formatters import DecimalFormatter
+ _DF={}
+ def df(n,dp=2,ds='.',ts=','):
+ try:
+ _df = _DF[dp,ds]
+ except KeyError:
+ _df = _DF[dp,ds] = DecimalFormatter(places=dp,decimalSep=ds,thousandSep=ts)
+ return _df(n)
+
+ from reportlab.lib.extformat import magicformat
+
+ Z={'abc': ('ab','c')}
+ x = 300000.23
+ percent=79.2
+ class dingo:
+ a=3
+ print magicformat('''
+$%%(df(x,dp=3))s --> $%(df(x,dp=3))s
+$%%(df(x,dp=2,ds=',',ts='.'))s --> $%(df(x,dp=2,ds=',',ts='.'))s
+%%(percent).2f%%%% --> %(percent).2f%%
+%%(dingo.a)s --> %(dingo.a)s
+%%(Z['abc'][0])s --> %(Z['abc'][0])s
+''')