src/reportlab/lib/extformat.py
author rptlab
Tue, 30 Apr 2013 14:28:14 +0100
branchpy33
changeset 3723 99aa837b6703
parent 3721 0c93dd8ff567
child 3783 b4d048dad7e6
permissions -rw-r--r--
second stage of port to Python 3.3; working hello world
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3617
ae5744e97c42 reportlab: copyright date changes
robin
parents: 3331
diff changeset
     1
#Copyright ReportLab Europe Ltd. 2000-2012
2280
c1bedbc21804 Added header lines
rgbecker
parents: 2278
diff changeset
     2
#see license.txt for license details
3331
8eb7bb3d5872 extformat.py: compatibilty fixes
rgbecker
parents: 3029
diff changeset
     3
__version__='''$Id$'''
3029
eded59f94021 adding docstrings to lib
andy
parents: 2964
diff changeset
     4
__doc__='''Apparently not used anywhere, purpose unknown!'''
2278
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
     5
from tokenize import tokenprog
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
     6
import sys
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
     7
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
     8
def _matchorfail(text, pos):
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
     9
	match = tokenprog.match(text, pos)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    10
	if match is None: raise ValueError(text, pos)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    11
	return match, match.end()
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    12
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    13
'''
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    14
	Extended dictionary formatting
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    15
	We allow expressions in the parentheses instead of
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    16
	just a simple variable.
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    17
'''
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    18
def dictformat(_format, L={}, G={}):
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    19
	format = _format
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    20
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    21
	S = {}
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    22
	chunks = []
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    23
	pos = 0
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    24
	n = 0
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    25
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    26
	while 1:
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    27
		pc = format.find("%", pos)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    28
		if pc < 0: break
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    29
		nextchar = format[pc+1]
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    30
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    31
		if nextchar == "(":
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    32
			chunks.append(format[pos:pc])
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    33
			pos, level = pc+2, 1
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    34
			while level:
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    35
				match, pos = _matchorfail(format, pos)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    36
				tstart, tend = match.regs[3]
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    37
				token = format[tstart:tend]
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    38
				if token == "(": level = level+1
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    39
				elif token == ")": level = level-1
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    40
			vname = '__superformat_%d' % n
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    41
			n += 1
2825
9bcf7ef27be3 extformat.py: fix bad bug in dictformat
rgbecker
parents: 2332
diff changeset
    42
			S[vname] = eval(format[pc+2:pos-1],G,L)
2278
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    43
			chunks.append('%%(%s)' % vname)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    44
		else:
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    45
			nc = pc+1+(nextchar=="%")
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    46
			chunks.append(format[pos:nc])
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    47
			pos = nc
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    48
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    49
	if pos < len(format): chunks.append(format[pos:])
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    50
	return (''.join(chunks)) % S
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    51
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    52
def magicformat(format):
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    53
	"""Evaluate and substitute the appropriate parts of the string."""
3331
8eb7bb3d5872 extformat.py: compatibilty fixes
rgbecker
parents: 3029
diff changeset
    54
	frame = sys._getframe(1)
2278
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    55
	return dictformat(format,frame.f_locals, frame.f_globals)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    56
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    57
if __name__=='__main__':
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    58
	from reportlab.lib.formatters import DecimalFormatter
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    59
	_DF={}
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    60
	def df(n,dp=2,ds='.',ts=','):
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    61
		try:
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    62
			_df = _DF[dp,ds]
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    63
		except KeyError:
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    64
			_df = _DF[dp,ds] = DecimalFormatter(places=dp,decimalSep=ds,thousandSep=ts)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    65
		return _df(n)
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    66
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    67
	from reportlab.lib.extformat import magicformat
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    68
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    69
	Z={'abc': ('ab','c')}
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    70
	x = 300000.23
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    71
	percent=79.2
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    72
	class dingo:
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    73
		a=3
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3617
diff changeset
    74
	print((magicformat('''
2278
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    75
$%%(df(x,dp=3))s --> $%(df(x,dp=3))s
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    76
$%%(df(x,dp=2,ds=',',ts='.'))s --> $%(df(x,dp=2,ds=',',ts='.'))s
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    77
%%(percent).2f%%%% --> %(percent).2f%%
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    78
%%(dingo.a)s --> %(dingo.a)s
fcdaeea386f2 Added for better formatting
rgbecker
parents:
diff changeset
    79
%%(Z['abc'][0])s --> %(Z['abc'][0])s
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3617
diff changeset
    80
''')))
3331
8eb7bb3d5872 extformat.py: compatibilty fixes
rgbecker
parents: 3029
diff changeset
    81
	def func0(aa=1):
8eb7bb3d5872 extformat.py: compatibilty fixes
rgbecker
parents: 3029
diff changeset
    82
		def func1(bb=2):
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3617
diff changeset
    83
			print((magicformat('bb=%(bb)s Z=%(Z)r')))
3331
8eb7bb3d5872 extformat.py: compatibilty fixes
rgbecker
parents: 3029
diff changeset
    84
		func1('BB')
8eb7bb3d5872 extformat.py: compatibilty fixes
rgbecker
parents: 3029
diff changeset
    85
	func0('AA')