From 8a94c2194eada809060d3918d501f7029c0947ff Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 28 Sep 2010 15:13:30 +0100 Subject: [PATCH] Fix mutually recursive fields in save_to_disk. Fix mistake in any_format template handling in save_to_disk --- src/calibre/library/save_to_disk.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index 5465150797..a2c8a62694 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -111,18 +111,31 @@ class SafeFormat(TemplateFormatter): ''' Provides a format function that substitutes '' for any missing value ''' + + composite_values = {} + def get_value(self, key, args, kwargs): try: b = self.book.get_user_metadata(key, False) key = key.lower() if b is not None and b['datatype'] == 'composite': - return self.vformat(b['display']['composite_template'], [], kwargs) + if key in self.composite_values: + return self.composite_values[key] + self.composite_values[key] = 'RECURSIVE_COMPOSITE FIELD (S2D) ' + key + self.composite_values[key] = \ + self.vformat(b['display']['composite_template'], [], kwargs) + return self.composite_values[key] if kwargs[key]: return self.sanitize(kwargs[key.lower()]) return '' except: return '' + def safe_format(self, fmt, kwargs, error_value, book, sanitize=None): + self.composite_values = {} + return TemplateFormatter.safe_format(self, fmt, kwargs, error_value, + book, sanitize) + safe_formatter = SafeFormat() def get_components(template, mi, id, timefmt='%b %Y', length=250, @@ -243,10 +256,12 @@ def save_book_to_disk(id, db, root, opts, length): cpb = None if fmt in plugboards: cpb = plugboards[fmt] - elif plugboard_any_format_value in plugboards: + if dev_name in cpb: + cpb = cpb[dev_name] + else: + cpb = None + if cpb is None and plugboard_any_format_value in plugboards: cpb = plugboards[plugboard_any_format_value] - # must find a save_to_disk entry for this format - if cpb is not None: if dev_name in cpb: cpb = cpb[dev_name] else: