diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py index 32013b34fa..6cc77725e8 100644 --- a/src/calibre/gui2/dialogs/config/__init__.py +++ b/src/calibre/gui2/dialogs/config/__init__.py @@ -758,7 +758,8 @@ class CheckIntegrity(QProgressDialog): def __init__(self, db, parent=None): QProgressDialog.__init__(self, parent) - self.setCancelButtonText('') + self.db = db + self.setCancelButton(None) self.setMinimum(0) self.setMaximum(100) self.setWindowTitle(_('Checking database integrity')) diff --git a/src/calibre/gui2/dialogs/config/add_save.py b/src/calibre/gui2/dialogs/config/add_save.py index 6d91745044..71e7c83a62 100644 --- a/src/calibre/gui2/dialogs/config/add_save.py +++ b/src/calibre/gui2/dialogs/config/add_save.py @@ -26,7 +26,8 @@ class AddSave(QTabWidget, Ui_TabWidget): self.removeTab(2) c = config() opts = c.parse() - for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf'): + for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf', + 'replace_whitespace', 'to_lowercase'): g = getattr(self, 'opt_'+x) g.setChecked(getattr(opts, x)) help = '\n'.join(textwrap.wrap(c.get_option(x).help, 75)) @@ -74,7 +75,8 @@ class AddSave(QTabWidget, Ui_TabWidget): if not self.validate(): return False c = config() - for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf'): + for x in ('asciiize', 'update_metadata', 'save_cover', 'write_opf', + 'replace_whitespace', 'to_lowercase'): c.set(x, getattr(self, 'opt_'+x).isChecked()) for x in ('formats', 'template', 'timefmt'): c.set(x, unicode(getattr(self, 'opt_'+x).text()).strip()) diff --git a/src/calibre/gui2/dialogs/config/add_save.ui b/src/calibre/gui2/dialogs/config/add_save.ui index 6faec64626..513be73e54 100644 --- a/src/calibre/gui2/dialogs/config/add_save.ui +++ b/src/calibre/gui2/dialogs/config/add_save.ui @@ -77,14 +77,14 @@ - + Save &cover separately - + Update &metadata in saved copies @@ -163,6 +163,20 @@ + + + + Replace space with &underscores + + + + + + + Change paths to &lowercase + + + diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 81d293a1cb..b5e15b4681 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -530,6 +530,12 @@ an opf file). You can get id numbers from the list command. parser.add_option(switch, default=opt.default, help=opt.help, dest=pref) + for pref in ('replace_whitespace', 'to_lowercase'): + opt = c.get_option(pref) + switch = '--'+pref.replace('_', '-') + parser.add_option(switch, default=False, action='store_true', + help=opt.help) + opts, args = parser.parse_args(sys.argv[1:]+args) if (len(args) < 2 and not opts.all): parser.print_help() diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index adaa9c8689..c404bd9223 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, traceback, cStringIO +import os, traceback, cStringIO, re from calibre.utils.config import Config, StringConfig from calibre.utils.filenames import shorten_components_to, supports_long_names, \ @@ -71,6 +71,10 @@ def config(defaults=None): x('timefmt', default='%b, %Y', help=_('The format in which to display dates. %d - day, %b - month, ' '%Y - year. Default is: %b, %Y')) + x('to_lowercase', default=False, + help=_('Convert paths to lowercase.')) + x('replace_whitespace', default=False, + help=_('Replace whitespace with underscores.')) return c def preprocess_template(template): @@ -81,7 +85,9 @@ def preprocess_template(template): template = template.decode(preferred_encoding, 'replace') return template -def get_components(template, mi, id, timefmt='%b %Y', length=250, sanitize_func=ascii_filename): +def get_components(template, mi, id, timefmt='%b %Y', length=250, + sanitize_func=ascii_filename, replace_whitespace=False, + to_lowercase=False): format_args = dict(**FORMAT_ARGS) if mi.title: format_args['title'] = mi.title @@ -113,6 +119,11 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, sanitize_func= components = [str(id)] components = [x.encode(filesystem_encoding, 'replace') if isinstance(x, unicode) else x for x in components] + if to_lowercase: + components = [x.lower() for x in components] + if replace_whitespace: + components = [re.sub(r'\s', '_', x) for x in components] + return shorten_components_to(length, components) @@ -134,7 +145,9 @@ def save_book_to_disk(id, db, root, opts, length): return True, id, mi.title components = get_components(opts.template, mi, id, opts.timefmt, length, - ascii_filename if opts.asciiize else sanitize_file_name) + ascii_filename if opts.asciiize else sanitize_file_name, + to_lowercase=opts.to_lowercase, + replace_whitespace=opts.replace_whitespace) base_path = os.path.join(root, *components) base_name = os.path.basename(base_path) dirpath = os.path.dirname(base_path)