From ccc0c02c67dceca4dcfe527bf080bf08161d456b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 12 Jan 2011 16:43:47 +0000 Subject: [PATCH] Add arbitrary python function evaluation to formatter --- src/calibre/utils/formatter.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 40760bf91b..0b5f1d1f52 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -18,6 +18,24 @@ class _Parser(object): LEX_NUM = 4 LEX_EOF = 5 + def _python(self, func): + locals = {} + exec func in locals + if 'evaluate' not in locals: + self.error('no evaluate function in python') + try: + result = locals['evaluate'](self.parent.kwargs) + if isinstance(result, (float, int)): + result = unicode(result) + elif isinstance(result, list): + result = ','.join(result) + elif isinstance(result, str): + result = unicode(result) + return result + except Exception as e: + self.error('python function threw exception: ' + e.msg) + + def _strcmp(self, x, y, lt, eq, gt): v = strcmp(x, y) if v < 0: @@ -79,6 +97,7 @@ class _Parser(object): 'field' : (1, lambda s, x: s.parent.get_value(x, [], s.parent.kwargs)), 'multiply' : (2, partial(_math, op='*')), 'print' : (-1, _print), + 'python' : (1, _python), 'strcat' : (-1, _concat), 'strcmp' : (5, _strcmp), 'substr' : (3, lambda s, x, y, z: x[int(y): len(x) if int(z) == 0 else int(z)]), @@ -362,7 +381,7 @@ class TemplateFormatter(string.Formatter): (r'\'.*?((?