From 03c5a395f3f74199dbaa7968f18150e9d9aaf50b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 17:18:50 -0700 Subject: [PATCH 01/14] Fix unicode support in CSV catalog output --- src/calibre/library/catalog.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index 32f2503b2c..672fd0d295 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -41,7 +41,7 @@ class CSV_XML(CatalogPlugin): log = Log() self.fmt = path_to_output.rpartition('.')[2] - + if False and opts.verbose: log("%s:run" % self.name) log(" path_to_output: %s" % path_to_output) @@ -54,7 +54,7 @@ class CSV_XML(CatalogPlugin): log(" opts:") for key in keys: log(" %s: %s" % (key, opts_dict[key])) - + # Get the sorted, filtered database as a dictionary data = self.search_sort_db(db, opts) @@ -69,7 +69,7 @@ class CSV_XML(CatalogPlugin): outfile = open(path_to_output, 'w') # Output the field headers - outfile.write('%s\n' % ','.join(fields)) + outfile.write(u'%s\n' % u','.join(fields)) # Output the entry fields for entry in data: @@ -80,15 +80,15 @@ class CSV_XML(CatalogPlugin): item = ', '.join(item) if x < len(fields) - 1: if item is not None: - outstr += '"%s",' % str(item).replace('"','""') + outstr += u'"%s",' % unicode(item).replace('"','""') else: outstr += '"",' else: if item is not None: - outstr += '"%s"\n' % str(item).replace('"','""') + outstr += u'"%s"\n' % unicode(item).replace('"','""') else: outstr += '""\n' - outfile.write(outstr) + outfile.write(outstr.encode('utf-8')) outfile.close() elif self.fmt == 'xml': From 8f97e09d0b89b178fef9aa71964ec9620875db79 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 17:24:26 -0700 Subject: [PATCH 02/14] cleanups --- .../gui2/catalog/catalog_tab_template.py | 6 +-- src/calibre/gui2/convert/gui_conversion.py | 8 ++-- src/calibre/gui2/dialogs/catalog.py | 41 +++++++++---------- src/calibre/gui2/ui.py | 12 +++--- 4 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/calibre/gui2/catalog/catalog_tab_template.py b/src/calibre/gui2/catalog/catalog_tab_template.py index 3c24f5f45f..c8429ca078 100644 --- a/src/calibre/gui2/catalog/catalog_tab_template.py +++ b/src/calibre/gui2/catalog/catalog_tab_template.py @@ -16,11 +16,11 @@ class PluginWidget(QWidget,Ui_Form): HELP = _('Options specific to')+' '+_('output') # Indicates whether this plugin wants its output synced to the connected device sync_enabled = False - + def initialize(self): QWidget.__init__(self) self.setupUi(self) - + def options(self): # Return a dictionary with options for this Widget - return {} \ No newline at end of file + return {} diff --git a/src/calibre/gui2/convert/gui_conversion.py b/src/calibre/gui2/convert/gui_conversion.py index b951244e71..07cfffbd84 100644 --- a/src/calibre/gui2/convert/gui_conversion.py +++ b/src/calibre/gui2/convert/gui_conversion.py @@ -4,14 +4,12 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -import os from optparse import OptionParser from calibre.customize.conversion import OptionRecommendation, DummyReporter from calibre.ebooks.conversion.plumber import Plumber from calibre.customize.ui import plugin_for_catalog_format from calibre.utils.logging import Log -from calibre.gui2 import choose_dir, Application def gui_convert(input, output, recommendations, notification=DummyReporter(), abort_after_input_dump=False, log=None): @@ -36,7 +34,7 @@ def gui_catalog(fmt, title, dbspec, ids, out_file_name, fmt_options, db = LibraryDatabase2(dbpath) else: # To be implemented in the future pass - + # Create a minimal OptionParser that we can append to parser = OptionParser() args = [] @@ -56,8 +54,8 @@ def gui_catalog(fmt, title, dbspec, ids, out_file_name, fmt_options, plugin = plugin_for_catalog_format(fmt) plugin.run(out_file_name, opts, db) - - + + diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index 8407e2c426..447cab68cc 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -6,15 +6,14 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, shutil, sys, tempfile +import os, sys -from PyQt4.Qt import QDialog, QWidget +from PyQt4.Qt import QDialog from calibre.customize.ui import config from calibre.gui2.dialogs.catalog_ui import Ui_Dialog -from calibre.gui2 import gprefs, dynamic -from calibre.customize.ui import available_catalog_formats, catalog_plugins -from calibre.gui2.catalog.catalog_csv_xml import PluginWidget +from calibre.gui2 import dynamic +from calibre.customize.ui import catalog_plugins class Catalog(QDialog, Ui_Dialog): ''' Catalog Dialog builder''' @@ -23,11 +22,10 @@ class Catalog(QDialog, Ui_Dialog): def __init__(self, parent, dbspec, ids): import re, cStringIO from calibre import prints as info - from calibre.gui2 import dynamic from PyQt4.uic import compileUi - + QDialog.__init__(self, parent) - + # Run the dialog setup generated from catalog.ui self.setupUi(self) self.dbspec, self.ids = dbspec, ids @@ -43,25 +41,24 @@ class Catalog(QDialog, Ui_Dialog): # This code models #69 in calibre/gui2/dialogs/config/__init__.py self.fmts = [] - + from calibre.customize.builtins import plugins as builtin_plugins - from calibre.customize import CatalogPlugin for plugin in catalog_plugins(): if plugin.name in config['disabled_plugins']: continue - + name = plugin.name.lower().replace(' ', '_') if type(plugin) in builtin_plugins: - #info("Adding widget for builtin Catalog plugin %s" % plugin.name) + #info("Adding widget for builtin Catalog plugin %s" % plugin.name) try: catalog_widget = __import__('calibre.gui2.catalog.'+name, fromlist=[1]) pw = catalog_widget.PluginWidget() pw.initialize(name) - pw.ICON = I('forward.svg') + pw.ICON = I('forward.svg') self.widgets.append(pw) - [self.fmts.append([file_type.upper(), pw.sync_enabled,pw]) for file_type in plugin.file_types] + [self.fmts.append([file_type.upper(), pw.sync_enabled,pw]) for file_type in plugin.file_types] except ImportError: info("ImportError with %s" % name) continue @@ -73,38 +70,38 @@ class Catalog(QDialog, Ui_Dialog): if os.path.exists(form) and os.path.exists(klass): #info("Adding widget for user-installed Catalog plugin %s" % plugin.name) - + # Compile the .ui form provided in plugin.zip if not os.path.exists(compiled_form): # info('\tCompiling form', form) buf = cStringIO.StringIO() compileUi(form, buf) dat = buf.getvalue() - dat = re.compile(r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(? Date: Thu, 21 Jan 2010 17:25:59 -0700 Subject: [PATCH 03/14] more cleanups --- src/calibre/customize/__init__.py | 20 +++++++------- src/calibre/gui2/catalog/catalog_csv_xml.py | 14 +++++----- .../gui2/catalog/catalog_tab_template.py | 26 ------------------- 3 files changed, 17 insertions(+), 43 deletions(-) delete mode 100644 src/calibre/gui2/catalog/catalog_tab_template.py diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 5ab9ac6d1c..5f35a38e12 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -2,7 +2,7 @@ from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import atexit, os, shutil, sys, tempfile, zipfile +import os, sys, zipfile from calibre.constants import numeric_version from calibre.ptempfile import PersistentTemporaryFile @@ -226,7 +226,7 @@ class MetadataWriterPlugin(Plugin): ''' pass - + class CatalogPlugin(Plugin): ''' A plugin that implements a catalog generator. @@ -251,7 +251,7 @@ class CatalogPlugin(Plugin): #: '%default' + "'"))] cli_options = [] - + def search_sort_db(self, db, opts): @@ -262,7 +262,7 @@ class CatalogPlugin(Plugin): if opts.sort_by: # 2nd arg = ascending db.sort(opts.sort_by, True) - + return db.get_data_as_dict(ids=opts.ids) def get_output_fields(self, opts): @@ -289,29 +289,29 @@ class CatalogPlugin(Plugin): ''' If plugin is not a built-in, copy the plugin's .ui and .py files from the zip file to $TMPDIR. - Tab will be dynamically generated and added to the Catalog Options dialog in + Tab will be dynamically generated and added to the Catalog Options dialog in calibre.gui2.dialogs.catalog.py:Catalog ''' from calibre.customize.builtins import plugins as builtin_plugins from calibre.customize.ui import config from calibre.ptempfile import PersistentTemporaryDirectory - + if not type(self) in builtin_plugins and \ not self.name in config['disabled_plugins']: files_to_copy = ["%s.%s" % (self.name.lower(),ext) for ext in ["ui","py"]] resources = zipfile.ZipFile(self.plugin_path,'r') - + if self.resources_path is None: self.resources_path = PersistentTemporaryDirectory('_plugin_resources', prefix='') - + for file in files_to_copy: try: resources.extract(file, self.resources_path) except: print " customize:__init__.initialize(): %s not found in %s" % (file, os.path.basename(self.plugin_path)) continue - resources.close() - + resources.close() + def run(self, path_to_output, opts, db, ids): ''' Run the plugin. Must be implemented in subclasses. diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.py b/src/calibre/gui2/catalog/catalog_csv_xml.py index f20a97ce2f..b44f2d4c6a 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.py +++ b/src/calibre/gui2/catalog/catalog_csv_xml.py @@ -9,20 +9,20 @@ __docformat__ = 'restructuredtext en' from calibre.gui2 import gprefs from calibre.gui2.catalog.catalog_csv_xml_ui import Ui_Form -from PyQt4.Qt import QDialog, QWidget, SIGNAL +from PyQt4.Qt import QWidget class PluginWidget(QWidget,Ui_Form): TITLE = _('CSV/XML Output') HELP = _('Options specific to')+' CSV/XML '+_('output') sync_enabled = False - + def initialize(self, name): QWidget.__init__(self) self.setupUi(self) self.name = name # Restore the activated fields from last use - for x in range(self.db_fields.count()): + for x in range(self.db_fields.count()): pref = '%s_db_fields_%s' % (self.name, self.db_fields.item(x).text()) activated = gprefs[pref] if pref in gprefs else False self.db_fields.item(x).setSelected(activated) @@ -31,10 +31,10 @@ class PluginWidget(QWidget,Ui_Form): # Save the currently activated fields for x in range(self.db_fields.count()): pref = '%s_db_fields_%s' % (self.name, self.db_fields.item(x).text()) - gprefs[pref] = self.db_fields.item(x).isSelected() - - # Return a dictionary with current options for this widget + gprefs[pref] = self.db_fields.item(x).isSelected() + + # Return a dictionary with current options for this widget if len(self.db_fields.selectedItems()): return {'fields':[str(item.text()) for item in self.db_fields.selectedItems()]} else: - return {'fields':['all']} \ No newline at end of file + return {'fields':['all']} diff --git a/src/calibre/gui2/catalog/catalog_tab_template.py b/src/calibre/gui2/catalog/catalog_tab_template.py deleted file mode 100644 index c8429ca078..0000000000 --- a/src/calibre/gui2/catalog/catalog_tab_template.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai -from __future__ import with_statement - -__license__ = 'GPL v3' -__copyright__ = '2009, Kovid Goyal ' -__docformat__ = 'restructuredtext en' - - -from import Ui_Form -from PyQt4.Qt import QDialog, QWidget - -class PluginWidget(QWidget,Ui_Form): - - TITLE = _(' Output') - HELP = _('Options specific to')+' '+_('output') - # Indicates whether this plugin wants its output synced to the connected device - sync_enabled = False - - def initialize(self): - QWidget.__init__(self) - self.setupUi(self) - - def options(self): - # Return a dictionary with options for this Widget - return {} From 223e115f42775960adcdcd3fa4afe093313b47a2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 18:02:23 -0700 Subject: [PATCH 04/14] Fix crash when instantiating pluginwidget multiple times --- src/calibre/gui2/catalog/catalog_csv_xml.py | 8 +++++--- src/calibre/gui2/dialogs/catalog.py | 7 +++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.py b/src/calibre/gui2/catalog/catalog_csv_xml.py index b44f2d4c6a..3b2b25a800 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.py +++ b/src/calibre/gui2/catalog/catalog_csv_xml.py @@ -11,15 +11,17 @@ from calibre.gui2 import gprefs from calibre.gui2.catalog.catalog_csv_xml_ui import Ui_Form from PyQt4.Qt import QWidget -class PluginWidget(QWidget,Ui_Form): +class PluginWidget(QWidget, Ui_Form): TITLE = _('CSV/XML Output') HELP = _('Options specific to')+' CSV/XML '+_('output') sync_enabled = False - def initialize(self, name): - QWidget.__init__(self) + def __init__(self, parent=None): + QWidget.__init__(self, parent) self.setupUi(self) + + def initialize(self, name): self.name = name # Restore the activated fields from last use for x in range(self.db_fields.count()): diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index 447cab68cc..9c004d9b07 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -17,7 +17,6 @@ from calibre.customize.ui import catalog_plugins class Catalog(QDialog, Ui_Dialog): ''' Catalog Dialog builder''' - widgets = [] def __init__(self, parent, dbspec, ids): import re, cStringIO @@ -40,7 +39,7 @@ class Catalog(QDialog, Ui_Dialog): # GwR *** Add option tabs for built-in formats # This code models #69 in calibre/gui2/dialogs/config/__init__.py - self.fmts = [] + self.fmts, self.widgets = [], [] from calibre.customize.builtins import plugins as builtin_plugins @@ -99,9 +98,9 @@ class Catalog(QDialog, Ui_Dialog): else: info("No dynamic tab resources found for %s" % name) - self.widgets = sorted(self.widgets, key=lambda x:(x.TITLE, x.TITLE)) + self.widgets = sorted(self.widgets, cmp=lambda x,y:cmp(x.TITLE, y.TITLE)) for pw in self.widgets: - self.tabs.addTab(pw,pw.TITLE) + self.tabs.addTab(pw, pw.TITLE) # Generate a sorted list of installed catalog formats/sync_enabled pairs fmts = sorted([x[0] for x in self.fmts]) From dea55f5f09d07330183a0d2d9263ba8868c256c9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 18:32:25 -0700 Subject: [PATCH 05/14] Make the selection of db fields to add to the CSV/xML catalog in the GUI more intuitive --- src/calibre/gui2/catalog/catalog_csv_xml.py | 23 ++++-- src/calibre/gui2/catalog/catalog_csv_xml.ui | 85 --------------------- src/calibre/gui2/dialogs/catalog.py | 1 + src/calibre/library/catalog.py | 13 ++-- src/calibre/library/cli.py | 2 +- 5 files changed, 26 insertions(+), 98 deletions(-) diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.py b/src/calibre/gui2/catalog/catalog_csv_xml.py index 3b2b25a800..6bd5d2c082 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.py +++ b/src/calibre/gui2/catalog/catalog_csv_xml.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' from calibre.gui2 import gprefs from calibre.gui2.catalog.catalog_csv_xml_ui import Ui_Form -from PyQt4.Qt import QWidget +from PyQt4.Qt import QWidget, QListWidgetItem class PluginWidget(QWidget, Ui_Form): @@ -20,23 +20,32 @@ class PluginWidget(QWidget, Ui_Form): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) + from calibre.library.catalog import FIELDS + self.all_fields = [] + for x in FIELDS: + if x != 'all': + self.all_fields.append(x) + QListWidgetItem(x, self.db_fields) def initialize(self, name): self.name = name + fields = gprefs.get(name+'_db_fields', self.all_fields) # Restore the activated fields from last use for x in range(self.db_fields.count()): - pref = '%s_db_fields_%s' % (self.name, self.db_fields.item(x).text()) - activated = gprefs[pref] if pref in gprefs else False - self.db_fields.item(x).setSelected(activated) + item = self.db_fields.item(x) + item.setSelected(unicode(item.text()) in fields) def options(self): # Save the currently activated fields + fields = [] for x in range(self.db_fields.count()): - pref = '%s_db_fields_%s' % (self.name, self.db_fields.item(x).text()) - gprefs[pref] = self.db_fields.item(x).isSelected() + item = self.db_fields.item(x) + if item.isSelected(): + fields.append(unicode(item.text())) + gprefs.set(self.name+'_db_fields', fields) # Return a dictionary with current options for this widget if len(self.db_fields.selectedItems()): - return {'fields':[str(item.text()) for item in self.db_fields.selectedItems()]} + return {'fields':[unicode(item.text()) for item in self.db_fields.selectedItems()]} else: return {'fields':['all']} diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.ui b/src/calibre/gui2/catalog/catalog_csv_xml.ui index 76ad414539..1548a622e5 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.ui +++ b/src/calibre/gui2/catalog/catalog_csv_xml.ui @@ -34,91 +34,6 @@ QAbstractItemView::MultiSelection - - - author_sort - - - - - authors - - - - - comments - - - - - cover - - - - - formats - - - - - id - - - - - isbn - - - - - pubdate - - - - - publisher - - - - - rating - - - - - series_index - - - - - series - - - - - size - - - - - tags - - - - - timestamp - - - - - title - - - - - uuid - - diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index 9c004d9b07..2e81042467 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -17,6 +17,7 @@ from calibre.customize.ui import catalog_plugins class Catalog(QDialog, Ui_Dialog): ''' Catalog Dialog builder''' + widgets = [] def __init__(self, parent, dbspec, ids): import re, cStringIO diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index 672fd0d295..19e00b6488 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -2,6 +2,11 @@ import os from calibre.customize import CatalogPlugin +FIELDS = ['all', 'author_sort', 'authors', 'comments', + 'cover', 'formats', 'id', 'isbn', 'pubdate', 'publisher', 'rating', + 'series_index', 'series', 'size', 'tags', 'timestamp', 'title', + 'uuid'] + class CSV_XML(CatalogPlugin): 'CSV/XML catalog generator' @@ -22,11 +27,9 @@ class CSV_XML(CatalogPlugin): dest = 'fields', help = _('The fields to output when cataloging books in the ' 'database. Should be a comma-separated list of fields.\n' - 'Available fields: all, author_sort, authors, comments, ' - 'cover, formats, id, isbn, pubdate, publisher, rating, ' - 'series_index, series, size, tags, timestamp, title, uuid.\n' - "Default: '%default'\n" - "Applies to: CSV, XML output formats")), + 'Available fields: %s.\n' + "Default: '%%default'\n" + "Applies to: CSV, XML output formats")%', '.join(FIELDS)), Option('--sort-by', default = 'id', diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index ddfb96704c..cf29106684 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -673,7 +673,7 @@ def command_catalog(args, dbpath): if opts.verbose: log("library.cli:command_catalog dispatching to plugin %s" % plugin.name) if opts.ids: - opts.ids = [int(id) for id in opts.ids.split(',')] + opts.ids = [int(id) for id in opts.ids.split(',')] with plugin: plugin.run(args[1], opts, get_db(dbpath, opts)) From 57a59d2798d18b3498262651d721f1d2b386e44d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 18:54:30 -0700 Subject: [PATCH 06/14] Catalog dialog: Only show options tab for currently selected output format --- src/calibre/gui2/catalog/catalog_csv_xml.py | 1 + src/calibre/gui2/dialogs/catalog.py | 23 +++++++++++++++++++-- src/calibre/gui2/tools.py | 13 ++---------- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.py b/src/calibre/gui2/catalog/catalog_csv_xml.py index 6bd5d2c082..69eda732da 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.py +++ b/src/calibre/gui2/catalog/catalog_csv_xml.py @@ -16,6 +16,7 @@ class PluginWidget(QWidget, Ui_Form): TITLE = _('CSV/XML Output') HELP = _('Options specific to')+' CSV/XML '+_('output') sync_enabled = False + formats = set(['csv', 'xml']) def __init__(self, parent=None): QWidget.__init__(self, parent) diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index 2e81042467..d792707670 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -100,8 +100,6 @@ class Catalog(QDialog, Ui_Dialog): info("No dynamic tab resources found for %s" % name) self.widgets = sorted(self.widgets, cmp=lambda x,y:cmp(x.TITLE, y.TITLE)) - for pw in self.widgets: - self.tabs.addTab(pw, pw.TITLE) # Generate a sorted list of installed catalog formats/sync_enabled pairs fmts = sorted([x[0] for x in self.fmts]) @@ -125,6 +123,19 @@ class Catalog(QDialog, Ui_Dialog): if self.sync.isEnabled(): self.sync.setChecked(dynamic.get('catalog_sync_to_device', True)) + self.format.currentIndexChanged.connect(self.format_changed) + self.show_plugin_tab(None) + + + def show_plugin_tab(self, idx): + cf = unicode(self.format.currentText()).lower() + while self.tabs.count() > 1: + self.tabs.remove(1) + for pw in self.widgets: + if cf in pw.formats: + self.tabs.addTab(pw, pw.TITLE) + break + def format_changed(self, idx): cf = unicode(self.format.currentText()) if cf in self.sync_enabled_formats: @@ -133,6 +144,14 @@ class Catalog(QDialog, Ui_Dialog): self.sync.setDisabled(True) self.sync.setChecked(False) + @property + def fmt_options(self): + ans = {} + if self.tabs.count() > 1: + w = self.tabs.widget(1) + ans = w.options() + return ans + def accept(self): self.catalog_format = unicode(self.format.currentText()) dynamic.set('catalog_preferred_format', self.catalog_format) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index b23e0b6259..7dc83baf32 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -238,7 +238,7 @@ def fetch_scheduled_recipe(arg): def generate_catalog(parent, dbspec, ids): from calibre.gui2.dialogs.catalog import Catalog - + # Build the Catalog dialog in gui2.dialogs.catalog d = Catalog(parent, dbspec, ids) @@ -248,22 +248,13 @@ def generate_catalog(parent, dbspec, ids): # Create the output file out = PersistentTemporaryFile(suffix='_catalog_out.'+d.catalog_format.lower()) - # Retrieve plugin options - fmt_options = {} - for x in range(d.tabs.count()): - if str(d.tabs.tabText(x)).find(str(d.catalog_format)) > -1: - for fmt in d.fmts: - if fmt[0] == d.catalog_format: - fmt_options = fmt[2].options() - # print "gui2.tools:generate_catalog(): options for %s: %s" % (fmt[0], fmt_options) - args = [ d.catalog_format, d.catalog_title, dbspec, ids, out.name, - fmt_options + d.fmt_options ] out.close() From 6b9bf086db43a6ad3d6a446f42f4d9424a66f44e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 20:01:29 -0700 Subject: [PATCH 07/14] ... --- resources/recipes/globe_and_mail.recipe | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/recipes/globe_and_mail.recipe b/resources/recipes/globe_and_mail.recipe index 0ef8bd9dd8..b2a9915250 100644 --- a/resources/recipes/globe_and_mail.recipe +++ b/resources/recipes/globe_and_mail.recipe @@ -44,8 +44,9 @@ class GlobeAndMail(BasicNewsRecipe): dict(name='div', attrs={'id':'blog-header'}), dict(name='div', attrs={'id':'right-rail'}), dict(name='div', attrs={'id':'group-footer-container'}), - dict(name=['iframe']) + dict(name=['iframe', 'style']) ] + remove_attributes = ['style'] remove_tags_after = [{'id':['article-content']}, {'class':['pull','inline-img'] }, dict(name='img', attrs={'class':'inline-media-embed'}), From 3a77cca412f433e3c1686bdc866596401dd64bf5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 20:05:37 -0700 Subject: [PATCH 08/14] Updated translatable strings --- src/calibre/gui2/catalog/catalog_csv_xml.py | 2 +- src/calibre/translations/calibre.pot | 624 ++++++++++---------- 2 files changed, 321 insertions(+), 305 deletions(-) diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.py b/src/calibre/gui2/catalog/catalog_csv_xml.py index 69eda732da..7ccb5e017e 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.py +++ b/src/calibre/gui2/catalog/catalog_csv_xml.py @@ -13,7 +13,7 @@ from PyQt4.Qt import QWidget, QListWidgetItem class PluginWidget(QWidget, Ui_Form): - TITLE = _('CSV/XML Output') + TITLE = _('CSV/XML Options') HELP = _('Options specific to')+' CSV/XML '+_('output') sync_enabled = False formats = set(['csv', 'xml']) diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 0f34cbc615..142bb500b3 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.6.34\n" -"POT-Creation-Date: 2010-01-16 13:38+MST\n" -"PO-Revision-Date: 2010-01-16 13:38+MST\n" +"POT-Creation-Date: 2010-01-21 20:05+MST\n" +"PO-Revision-Date: 2010-01-21 20:05+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -15,11 +15,11 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:42 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 msgid "Does absolutely nothing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:45 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:54 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 @@ -54,8 +54,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:894 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:22 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:48 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/topaz.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:14 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:44 @@ -63,8 +63,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:597 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:787 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:607 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:797 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896 @@ -95,10 +95,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:29 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:217 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:219 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:279 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:233 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:280 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:21 @@ -127,11 +127,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/database2.py:1180 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1547 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1549 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1660 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1665 #: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:764 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 @@ -140,23 +140,23 @@ msgstr "" msgid "Unknown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:63 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:64 msgid "Base" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:149 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:150 msgid "File type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:184 msgid "Metadata reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:214 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:215 msgid "Metadata writer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:238 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:241 msgid "Catalog generator" msgstr "" @@ -410,7 +410,7 @@ msgstr "" msgid "Communicate with the Cybook Gen 3 / Opus eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:23 +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24 msgid "Communicate with the EB600 eBook reader." msgstr "" @@ -583,8 +583,8 @@ msgstr "" msgid "There is insufficient free space on the storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:792 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:815 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:799 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:822 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:232 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1068 @@ -1027,9 +1027,9 @@ msgstr "" msgid "Normally, if the input file has no cover and you don't specify one, a default cover is generated with the title, authors, etc. This option disables the generation of this cover." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:143 -#: /home/kovid/work/calibre/src/calibre/ebooks/pml/pmlml.py:128 -#: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:101 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/pml/pmlml.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 msgid "Table of Contents:" msgstr "" @@ -1443,27 +1443,27 @@ msgstr "" msgid "Set the BookID in LRF files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:148 msgid "No file specified" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:163 msgid "Original metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:176 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:180 msgid "Changed metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:188 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:192 msgid "OPF created in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:194 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:198 msgid "Cover saved to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:196 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:200 msgid "No cover found" msgstr "" @@ -1653,30 +1653,6 @@ msgstr "" msgid "Main Text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/factory.py:53 -msgid "Options to control e-book conversion." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/factory.py:60 -msgid "Character encoding for input. Default is to auto detect." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/factory.py:62 -msgid "Output file. Default is derived from input filename." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/factory.py:64 -msgid "Produce more human-readable XML output." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/factory.py:66 -msgid "Useful for debugging." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/factory.py:71 -msgid "Usage: ebook-convert INFILE OUTFILE [OPTIONS..]" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/iterator.py:39 msgid "%s format books are not supported" msgstr "" @@ -1943,7 +1919,7 @@ msgstr "" msgid "Specify the character encoding of the output document. The default is cp1252." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:183 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:199 msgid "This RTF file has a feature calibre does not support. Convert it to HTML first and then try it." msgstr "" @@ -1979,116 +1955,116 @@ msgstr "" msgid "Force splitting on the max-line-length value when no space is present. Also allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:28 msgid "Send file to storage card instead of main memory by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:30 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:32 msgid "Toolbar icon size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:34 msgid "Show button labels in the toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:36 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:38 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:40 msgid "Use Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:42 msgid "Sort tags list by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:44 msgid "Number of covers to show in the cover browsing mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:46 msgid "Defaults for conversion to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:48 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:51 msgid "Formats that are viewed using the internal viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:53 msgid "Columns to be displayed in the book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54 msgid "Automatically launch content server on application startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55 msgid "Oldest news kept in database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:56 msgid "Show system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:58 msgid "Upload downloaded news to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:60 msgid "Delete books from library after uploading to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:62 msgid "Show the cover flow in a separate window instead of in the main calibre window" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:64 msgid "Disable notifications from the system tray icon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:66 msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:88 msgid "Maximum number of waiting worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:90 msgid "Download social metadata (tags/rating/etc.)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:92 msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:130 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:439 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:164 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:164 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:395 msgid "Choose Files" msgstr "" @@ -2153,23 +2129,11 @@ msgstr "" msgid "Saved" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 -msgid "For settings that cannot be specified in this dialog, use the values saved in a previous conversion (if they exist) instead of using the defaults specified in the Preferences" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:67 -msgid "Bulk Convert" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 -msgid "Options specific to the output format." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:15 -msgid "Comic Input" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 +msgid "CSV/XML Options" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 @@ -2186,14 +2150,20 @@ msgstr "" msgid "Options specific to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input.py:13 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:13 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input.py:13 -msgid "input" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17 +msgid "output" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:41 @@ -2223,6 +2193,40 @@ msgstr "" msgid "Form" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:35 +msgid "Fields to include in output:" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 +msgid "Tab template for catalog.ui" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 +msgid "For settings that cannot be specified in this dialog, use the values saved in a previous conversion (if they exist) instead of using the defaults specified in the Preferences" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:67 +msgid "Bulk Convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 +msgid "Options specific to the output format." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:15 +msgid "Comic Input" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input.py:13 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:13 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input.py:13 +msgid "input" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:94 msgid "&Number of Colors:" @@ -2352,17 +2356,6 @@ msgstr "" msgid "EPUB Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:15 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17 -msgid "output" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:42 msgid "Do not &split on page breaks" msgstr "" @@ -2806,7 +2799,7 @@ msgid "RB Output" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1609 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1633 msgid "Choose the format to view" msgstr "" @@ -3338,32 +3331,32 @@ msgstr "" msgid "&Next" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:38 msgid "My Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:262 msgid "Generate catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:68 msgid "Catalog &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:69 msgid "Catalog &title (existing catalog with the same title will be replaced):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:70 msgid "&Send catalog to device automatically" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:71 msgid "Catalog options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:72 msgid "Generate catalog for {0} books" msgstr "" @@ -3464,7 +3457,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:477 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1229 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 msgid "Error" msgstr "" @@ -3534,12 +3527,12 @@ msgid "Access log:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:676 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:659 msgid "Failed to start content server" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:700 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:550 msgid "Select location for books" msgstr "" @@ -4141,7 +4134,7 @@ msgid "Choose formats for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:990 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1004 msgid "Books" msgstr "" @@ -5320,11 +5313,11 @@ msgstr "" msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:274 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:275 msgid "The following books have already been converted to %s format. Do you wish to reconvert them?" msgstr "" @@ -5405,7 +5398,7 @@ msgid "Save to disk in a single directory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1717 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1741 msgid "Save only %s format to disk" msgstr "" @@ -5438,7 +5431,7 @@ msgid "Bulk convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:360 -msgid "Create catalog of the books in your calibre library" +msgid "Create catalog of books in your calibre library" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:376 @@ -5455,36 +5448,40 @@ msgid "Bad database location" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:475 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:558 msgid "Calibre Library" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1873 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1897 msgid "Choose a location for your ebook library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:689 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:523 +msgid "Calibre Quick Start Guide" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:703 msgid "Browse by covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:837 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:851 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:839 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:853 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:863 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:877 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:889 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:890 msgid "" "\n" "

The database of books on the reader is corrupted. Try the following:\n" @@ -5495,294 +5492,294 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:938 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:952 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:939 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:953 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:983 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1030 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1043 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:991 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1005 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:992 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1006 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:993 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1007 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:994 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1008 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:995 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1009 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:996 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1010 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1011 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1012 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:999 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1013 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1003 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1017 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1039 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1052 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1040 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1053 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1072 msgid "Cannot delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1062 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1603 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1622 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1072 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1085 msgid "Choose formats to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1101 msgid "Choose formats not to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1137 msgid "The selected books will be permanently deleted and the files removed from your computer. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1151 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1164 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1182 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1195 msgid "Cannot download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1183 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1240 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1273 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1298 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1356 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1459 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1253 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1286 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1311 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1370 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1483 msgid "No books selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1198 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211 msgid "social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 msgid "covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 msgid "metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1202 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1215 msgid "Downloading %s for %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1224 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1237 msgid "Failed to download some metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1225 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1238 msgid "Failed to download metadata for the following:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1228 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241 msgid "Failed to download metadata:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1239 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1272 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1252 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1297 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1310 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1300 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1313 msgid "Choose destination directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1327 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1340 msgid "Error while saving" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1328 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1341 msgid "There was an error while saving." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1335 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1336 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1348 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1349 msgid "Could not save some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1337 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1350 msgid "Click the show details button to see which ones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1357 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1371 msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1369 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1388 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1380 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1399 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1393 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1417 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1407 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 msgid " fetched." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1458 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1482 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1487 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1511 msgid "Starting conversion of %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1603 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1659 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1683 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1643 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1667 msgid "Multiple Books Selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1644 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1668 msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1660 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1684 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1701 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1725 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1702 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1726 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1745 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1769 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1746 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1770 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1801 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1825 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1802 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1826 msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1825 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1853 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1849 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1877 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1826 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850 msgid "

Could not convert: %s

It is a DRMed book. You must first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1839 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1863 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1854 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1878 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1882 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1906 msgid "Invalid library location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1883 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1907 msgid "Could not access %s. Using %s as the library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1933 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1957 msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1958 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1982 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1961 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1985 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1965 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2017 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2041 msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2036 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2060 msgid "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2044 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2068 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2045 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2069 msgid "%s has been updated to version %s. See the new features. Visit the download page?" msgstr "" @@ -5842,89 +5839,93 @@ msgstr "" msgid "Import" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:154 msgid "Configure Ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:155 msgid "&Font options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:156 msgid "Se&rif family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:157 msgid "&Sans family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:158 msgid "&Monospace family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:159 msgid "&Default font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:157 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:159 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:168 msgid " px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:161 msgid "Monospace &font size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:163 msgid "S&tandard font:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:164 msgid "Serif" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:165 msgid "Sans-serif" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:166 msgid "Monospace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:167 msgid "Remember last used &window size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:169 msgid "Maximum &view width:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:170 msgid "H&yphenate (break line in the middle of large words)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:171 msgid "The default language to use for hyphenation rules. If the book does not specify a language, this will be used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:172 msgid "Default &language for hyphenation:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:173 +msgid "&Resize images larger than the viewer window (needs restart)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:174 msgid "&User stylesheet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:175 msgid "&General" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:176 msgid "Double click to change a keyboard shortcut" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:177 msgid "&Keyboard shortcuts" msgstr "" @@ -5942,7 +5943,7 @@ msgid "Remember last used window size" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:79 msgid "Set the user CSS stylesheet. This can be used to customize the look of all books." msgstr "" @@ -5950,43 +5951,47 @@ msgstr "" msgid "Maximum width of the viewer window, in pixels." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:45 -msgid "Hyphenate text" +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:46 +msgid "Resize images larger than the viewer window to fit inside it" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:47 -msgid "Default language for hyphenation rules" +msgid "Hyphenate text" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 -msgid "Font options" +msgid "Default language for hyphenation rules" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51 -msgid "The serif font family" +msgid "Font options" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:53 -msgid "The sans-serif font family" +msgid "The serif font family" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:55 -msgid "The monospaced font family" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:56 -msgid "The standard font size in px" +msgid "The sans-serif font family" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 -msgid "The monospaced font size in px" +msgid "The monospaced font family" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:58 +msgid "The standard font size in px" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 +msgid "The monospaced font size in px" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 msgid "The standard font type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:407 msgid "&Lookup in dictionary" msgstr "" @@ -6294,7 +6299,7 @@ msgstr "" msgid "Could not move library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:624 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:625 msgid "welcome wizard" msgstr "" @@ -6519,15 +6524,15 @@ msgstr "" msgid "The maximum number of matches to return per OPDS query. This affects Stanza, WordPlayer, etc. integration." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:23 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:28 msgid "" "The fields to output when cataloging books in the database. Should be a comma-separated list of fields.\n" -"Available fields: all, author_sort, authors, comments, cover, formats, id, isbn, pubdate, publisher, rating, series_index, series, size, tags, timestamp, title, uuid.\n" -"Default: '%default'\n" +"Available fields: %s.\n" +"Default: '%%default'\n" "Applies to: CSV, XML output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:34 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:37 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -6731,20 +6736,27 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:648 msgid "" +"Comma-separated list of database IDs to catalog.\n" +"If declared, --search is ignored.\n" +"Default: all" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/cli.py:652 +msgid "" "Filter the results by the search query. For the format of the search query, please see the search-related documentation in the User Manual.\n" "Default: no filtering" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:654 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:658 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:692 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:671 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:707 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:689 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -6761,27 +6773,27 @@ msgstr "" msgid "Catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1686 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1691 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1715 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1732 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1737 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1825 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1830 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1862 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1867 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1884 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 msgid "Checked id" msgstr "" @@ -6909,47 +6921,47 @@ msgstr "" msgid "Whenever you pass arguments to %prog that have spaces in them, enclose the arguments in quotation marks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:631 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:650 msgid "Path to the database in which books are stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:633 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:652 msgid "Pattern to guess metadata from filenames" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:635 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:654 msgid "Access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:637 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:656 msgid "Default timeout for network operations (seconds)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:639 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:658 msgid "Path to directory in which your library of books is stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:641 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:660 msgid "The language in which to display the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:643 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:662 msgid "The default output format for ebook conversions." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:647 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:666 msgid "Ordered list of formats to prefer for input." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:649 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:668 msgid "Read metadata from files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:651 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:670 msgid "The priority of worker processes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:653 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:672 msgid "Swap author first and last names when reading metadata" msgstr "" @@ -7026,14 +7038,18 @@ msgid "English (Singapore)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107 -msgid "German (AT)" +msgid "English (Yemen)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 -msgid "Dutch (NL)" +msgid "German (AT)" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 +msgid "Dutch (NL)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:110 msgid "Dutch (BE)" msgstr "" @@ -7091,75 +7107,75 @@ msgstr "" msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:520 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:528 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:606 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:614 msgid "Download finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:608 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:616 msgid "Failed to download the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:614 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:622 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:616 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:624 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:618 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:626 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:699 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:707 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:720 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:728 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:725 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:733 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:731 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:739 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:789 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:797 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:805 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:813 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:815 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:823 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:827 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:835 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:970 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:978 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1041 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1049 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1052 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1060 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1069 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1077 msgid "Fetching feed" msgstr "" From 98c717625c7b4ee9e6c97fae57c80f3a5705f1b6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 20:25:21 -0700 Subject: [PATCH 09/14] MOBI Output: Don't die when converting EPUB files with SVG covers --- src/calibre/ebooks/oeb/stylizer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index 26fb4ca980..3e7cca981e 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -119,7 +119,11 @@ class Stylizer(object): basename = os.path.basename(path) cssname = os.path.splitext(basename)[0] + '.css' stylesheets = [HTML_CSS_STYLESHEET] - head = xpath(tree, '/h:html/h:head')[0] + head = xpath(tree, '/h:html/h:head') + if head: + head = head[0] + else: + head = [] parser = cssutils.CSSParser(fetcher=self._fetch_css_file, log=logging.getLogger('calibre.css')) self.font_face_rules = [] From adb332fd37617d4baf7c421a30994371a8ac06cc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 21:58:27 -0700 Subject: [PATCH 10/14] ... --- src/calibre/gui2/dialogs/catalog.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index d792707670..b53f6d3043 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -17,7 +17,6 @@ from calibre.customize.ui import catalog_plugins class Catalog(QDialog, Ui_Dialog): ''' Catalog Dialog builder''' - widgets = [] def __init__(self, parent, dbspec, ids): import re, cStringIO From 13fbcfeb00a7ff21b11bc5856e1292dbdb37f111 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 22:27:42 -0700 Subject: [PATCH 11/14] Fix #4632 (Number of books with a given format not updated when dropping to zero) --- src/calibre/gui2/ui.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 796d58a3a5..889ad75645 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -1092,6 +1092,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): self.library_view.model().refresh_ids(ids) self.library_view.model().current_changed(self.library_view.currentIndex(), self.library_view.currentIndex()) + if ids: + self.tags_view.recount() def delete_all_but_selected_formats(self, *args): ids = self._get_selected_ids() @@ -1113,6 +1115,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): self.library_view.model().refresh_ids(ids) self.library_view.model().current_changed(self.library_view.currentIndex(), self.library_view.currentIndex()) + if ids: + self.tags_view.recount() def delete_covers(self, *args): @@ -1399,8 +1403,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): self.status_bar.showMessage(_('Catalog generated.'), 3000) self.sync_catalogs() if job.fmt in ['CSV','XML']: - export_dir = choose_dir(self, 'Export Catalog Directory', - 'Select destination for %s.%s' % (job.catalog_title, job.fmt.lower())) + export_dir = choose_dir(self, _('Export Catalog Directory'), + _('Select destination for %s.%s') % (job.catalog_title, job.fmt.lower())) if export_dir: destination = os.path.join(export_dir, '%s.%s' % (job.catalog_title, job.fmt.lower())) shutil.copyfile(job.catalog_file_path, destination) From 414eec34e0ef65948ddfc02563529805644ea571 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 23:29:31 -0700 Subject: [PATCH 12/14] Add section on E-book viewer to the User Manual --- src/calibre/manual/develop.rst | 2 +- src/calibre/manual/images/bookmark.png | Bin 0 -> 1649 bytes src/calibre/manual/images/font_size.png | Bin 0 -> 1770 bytes src/calibre/manual/images/full_screen.png | Bin 0 -> 1239 bytes src/calibre/manual/images/nav_pos.png | Bin 0 -> 1628 bytes src/calibre/manual/images/pref_button.png | Bin 0 -> 1334 bytes src/calibre/manual/images/prev_next.png | Bin 0 -> 2581 bytes src/calibre/manual/images/ref_mode.png | Bin 0 -> 49434 bytes src/calibre/manual/images/ref_mode_button.png | Bin 0 -> 733 bytes src/calibre/manual/images/toc.png | Bin 0 -> 628 bytes src/calibre/manual/index.rst | 1 + src/calibre/manual/viewer.rst | 105 ++++++++++++++++++ 12 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/calibre/manual/images/bookmark.png create mode 100644 src/calibre/manual/images/font_size.png create mode 100644 src/calibre/manual/images/full_screen.png create mode 100644 src/calibre/manual/images/nav_pos.png create mode 100644 src/calibre/manual/images/pref_button.png create mode 100644 src/calibre/manual/images/prev_next.png create mode 100644 src/calibre/manual/images/ref_mode.png create mode 100644 src/calibre/manual/images/ref_mode_button.png create mode 100644 src/calibre/manual/images/toc.png create mode 100644 src/calibre/manual/viewer.rst diff --git a/src/calibre/manual/develop.rst b/src/calibre/manual/develop.rst index efab5a1cac..e7f3103fce 100644 --- a/src/calibre/manual/develop.rst +++ b/src/calibre/manual/develop.rst @@ -194,7 +194,7 @@ You can insert the following two lines of code to start an interactive python se When running from the command line, this will start an interactive python interpreter with access to all locally defined variables (variables in the local scope). The interactive prompt even has TAB completion for object properties and you can use the various python facilities for introspection, such as -:function:`dir`, :function:`type`, :function:`repr`, etc. +:func:`dir`, :func:`type`, :func:`repr`, etc. Using print statements ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/calibre/manual/images/bookmark.png b/src/calibre/manual/images/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..c6671a2541d2d6223718f470d00b8c9567bcf099 GIT binary patch literal 1649 zcmV-%29EiOP)K0q9Axs@F3#FgNo=u)`K8=7j3A)?cJ>Ava z)m>lNl^+rDJXG~|J2U-dk28CicSw@V$p8Nr@m@wmCSAYw1|D|s!v+8zL2QS<4;tc! z{ND{V+w^`*)rSL7?EDgIKhA8oI`_r(;6+cR!zvs#9V&iJt^QC)GtuNH^7_Rg`RD&2 zax@6Z!liGiXlCT`FOQtL5LC{Z_9f%%4-~>QeyTN~fC!a;@)dDR)Ac%0~JHhZ1<*84R>q0UhhubLD&VzI*{S%4( zzeDKOZ%le6ntaxjPQW*T9FoDOOj11dacTdh%>O!s+TqN_s^qF}|K7AOM$?}u);>)6 z5|D!kAP6D35tXL0p(l9b6^y(TyD85@`>N933z&#k$#qWtp?cRjyQzIs1*57sV=CuL zwP!S^unm9#flrXHLNe$vt7qf->-pxJDy-!+YRxH&YU+o)nK~QKDGD9k;s34+z5qSe}kQ^?C>w*LzfS{+Oa3)XMHf`FZ;d)CV7Cz6@b{;;N z7M`(Y?m!UX!dG^Y3`=S`!(KYtm-uRG~6~3kQN2`-0lIm^H6v)ssO0U>zWUK?E>B zkOaQBV>G3Ve4k82zLW27Mh6MBo7ALFrcRw3xa0_Fvocm;Sx%E9bt; zIyxK#favsv#;rQl|47`c%tR#D`key;PzVYJG$0@Z8z32!Ef~a5Q}ObZ&io(dZzscN ze_+DO-4^>yR{d}`N)=IS!;I;__fCV-o>u`&pBB%^10X)zf99T8p+O!J)%|dxeoT({T>v8;FQuzcR>KVdlTG+Lfj=qESvtmKp8< zowU~sjLEx`-35v!H_CI&#sV3j*%-wnc?(B}kaR(8$LCd>6p|I`-6q>JaWAWHct8At zu6;nV4QgHw-pqG??Cg_{ v{sT(wQC0UL-W7jp9zkryBZ#edS3vv+rYO$I9(c&k00000NkvXXu0mjfFM}!# literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/font_size.png b/src/calibre/manual/images/font_size.png new file mode 100644 index 0000000000000000000000000000000000000000..59ba041d83974ffe5f9f1fee004155942ebca1c6 GIT binary patch literal 1770 zcmVK3gw6wT_EGQ)IhSr|oQ2qoY91O}@ zDX2G1bmJOalO>+mgL_$zo^}toaSsGwBO6-h03I=1cirjl=d34Zv?T!Ek4hvGvDs`w(zMxZkw}EtO)M6B z{P?lKU@)0XqobosOG^Y4F5RfCM;RO(2rVzO36@Q;%gf7ywm~9_+wG3W<7TtjY<o z=W@BoQArC0VI+QGc6MfHXehz5;x%Nq&(6-Ke#_x-06=|xeM3WoLZJ{orv6BTQ94mU zSe%~y{r&NHoJ}OyL_!#&`0DD78~u`>yRfj}^?LX3-@kkJ?!v-CqtQ4uHRbpFrBT5f z%@vsx2Wxqyr{_oF*Cbg-n5T7hbwYW4ef{|OxWnN%efqSde1xfP?$8nb~UAlPjqNH5Vc63+E@obGVT>_em&#tec%ji~bUNMW=x8d+$jFE=I?08?M@g=GKS0tRg^N5_D2n2f zHqg6w?>09#(=>hW-o5JT>g38S%RYMa2mo&0ym{-^t>jSyfG1C$oI7_;tyYUIr?&?Q zlUzi3`}VEJ9i>#LB{iJ#pg1p+kox?Kqvz-rioP)7jYA zD7L&oUiruXu`D}0Jj^gmcXu}ca2&U?vU2j|NtH?k0HIK5Y-~)WQZ+O*@F^#v+S=N_ zzCN$l8w>{ZdOZMO%%wR%Nhof&TdUPxy?RwVEPA84Ase*Jej{ET(}{C5bU->&^id`dpWNfz^FY2#BI zc`;LvEtIskLxqCc7RPLwrnOpaHlm`{YD1xSa!(1{p~+;_>x+Co-{x}od_KLt$Yhdz zXCSN~zdvBR^CtjAqtQ?(#4wCTqhT0Eyb=GZ)oLNvu`C;ZuUIS=i^U{2g@uI$1qA?L zZU3gCVlNSe5S5CGy~jI`F^op?&YV1C;=PzcHV#QR9L~>Yj&~lD;~+<6tF(<=ryL4N zITVt%5lYTjCy8w6BE(GxX6EKM*FxS?{$(jm=gFZE4wMM<;b@%6-*gLEyAo$tSCQO- zk`R^G{%M9O$dZM;5{(+Fz9QBkS;&9;vT7lxfs$yh4M^d4ty880v zpE5v6+v-6{uLx()e#>YyDy34q7>(x4nX?&iz-L;>Wo2cpt*y!=me#|E%gV}#?}Ayk zkge7Zold7xs#HpqUZ?M{cF4V!X5B(AC@8SDTZNFcx3}l#=M%g6FDzu9=bM@imY0{8 zmzOs+9h3`6)-B|uzBMVuo>|4lW)g8cr#oj?A9 z>{!U{$J)}fkUKjpS+I~bogJ2qEacRvY?Zc=>y$$wDThK*4uzzD0qJ>x@uy@x=Kufz M07*qoM6N<$f;bpiBme*a literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/full_screen.png b/src/calibre/manual/images/full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1e283194b0570fb2caf4cf0c6c4ecfb92be90e GIT binary patch literal 1239 zcmV;|1StE7P)#lm)X z>89TR*?byE#3o;$yGn*ov9TaoG%0;BNbLqhhCG0U9ou7UJonMX1&0KC7(0=gMgEdK z=ia%G-#zy+X9oZM=WqBj#Qtx9_xg&`OJ5KQKbuvpzT4Pvgb<&N+vIdMcHti z2S5H4iS)SjiK^9VOH04pzc(2cMfid-Y`2f3l#DR|K*TUTDJ20A5dky+YONTfw&Nf| z)UpBK=%^!w>{q?_(1nnm*Nnx!iAFC}tM3?NhzNj;nVt-p*82Uw5F(L?6H%p7C8Eoh zzi%`ejo*K}@ZvcFG-~zOojbvk-Va4E#+psf_dCWnT5A9;`wj^JpkA*tMy7hbUT?RL zcxvSJ+63EjH0!U$KyZWy?beVd~|a1`qWg?vXBjSG;5_Qj`O-)e!I3--`;+(zHT<#U?@hH z#>Zc+th`!Tc>xehrR>>RyI2g#;mplB^Yg9!eUluUo`#cs-%mjU9i9B(Sj=RzAvpjb zoz23jj!&8z7UlZXRM)0x6!`#;0v3r-G}=vGo0@`8@k-LNVyRRtm5Qg+p6f2<^9|Px z!_jcvrF`Do-HoTyv8z|V9T`bl762$U>{>y_?Ah5&HjA7u<@28FuFlNl78lP&S)G~j zTsNM{A1_wh^Vz5-YWoL7mMHBx|K+$v!&9=#KgTvkIv-)fO`)gj!aDCN~QSN z*rnUI?Lxui55I#>E0Ioz@yBuD8#j6u)lfmb3&LM5e6kbHkK=u z%xTm*I5^zft88wbTPq0Vb-CQNWxFjqLD9xXlAVrhx4X$V*ulZno{d7+7S=m!b%Su|7Rh&hH!^0M11A2vX-e}Y}HY%rHF0|I5PXxzi7w%(5 z1nAC&xga7UR;yLwGysZiTYvree9-7RjEKm#t$ueg%%>g`yPx>zAk3@{c zBN0y2dyaab5D_ABPEvBEl$1(JA*E8v5GX07)=DX@lrp|CqbFjBjEERxoD*Y2#E3W% zW9&Ge^^eti?;ul$4-!Fsy1t-KJzr6J=_^Vv{ReaOR18n(k!%0}002ovPDHLkV1g5a BQ@Q{E literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/nav_pos.png b/src/calibre/manual/images/nav_pos.png new file mode 100644 index 0000000000000000000000000000000000000000..2b99182176e268cf61a796f6b16170a1acae98b5 GIT binary patch literal 1628 zcmV-i2BZ0jP)GDjO5gMB^nJ4J0D8#HK-RUXn&MB*hm)eOL)=NKQ4=Iz*yVL}Gu zqc)5wi)nUtZeVaoBuYt0NLZsw_Ko3kxoox>iDbuSfq?R`0APH4A|oSn%a$!%E^l4i zTQ>*-M^SWqd?H_xM|oHPz(f#{NW|yIuWN5>fyrdj>-9>dGB-Cj(9h?`i$o%)bB^{f z0RTn$JRZ8%J+3)ct5u;;w6(SE-@o5xvjvUvcxd3vh}AkhH8qu&mlvbrUx3Hsxp3hE zj^h}HVHif)5#nQ|i`i_>&(Duh@zvt<`I?)X78kuaIoogDx|x&ni`R?aym`a#_lHY~ zl`e1IyphRdF)F@VIy(NCowa9YXEil79XV23U*C|GmHFX=t+TTuTuQ8TdHwozK|w)` zimwWf$J5u>3joKD|F&)0&u+InCnr~_JPrUaUv_)FM98cV``y&kRLVdQWO8zHWq{A; z(`vN_gJE%T@!-LO_4V~Ay6mw{lH~C4@Xnn(|FbMX5LH!GPoF-Gi;FvP;zUJ71+@)L zPfz#xd{oS)O`G1mdl#(?E8z3_Cr_3GFm~l^XJdk)zxVsN&zBJQ5kU|R zhau14;};s z7z_r5LJ^^vXuxrN5cBi%^r+cv4ve3ho9pW8I&k1XxbCAwuh;AK`hXW`AW5>dwY9CSEnG?n zT_z?b1_uWl8X5)$1}Z8lRt5-#!qL%D%ATH{PESt{9QFBpMx!xkLm94YadGkG%a<({ z3y$Nht*r=x1g11JG@LzqmdX68#lh)xR##V7S6AP?dzW_VbUL+Kef8>9`lB42bdiAQTtSrj1G&qjmzI|Jz zQcG!v9-#&l-XGX@>+}s__%{Rh{0wHyAxm-r0vAw;0 zbaa%yn9+7yqc7`pI{W(i8XFs>QfYBIjPw05B|*W20k#XJ>!jZpdUZfk04NT3TLS&f#$Wug=1imCNPH$;oA9Wk-)5 zjj(C@dYDY+($eCK7k};D`zwMVK`%#3OH1S9V?SkYrA`@^$uY~+KO#{omm7NL_dS6i z2#?3Zah%>v(+~tvpJvsN7+!23kzN@hZ%Txe|)BJx$F&a8-;_xb6ni_8yQLi0nH a(EJPbNEt*zPNdBM000020FTbR?7ywjNMHt)D(ijGfOg}kGK+xUYqpGl|s3;zf zQvi)pgiv;N7S9W!D4I;B2Pa6N2Z3OFMn*)ttb{N#hD zhcP-)QIueN7yvgmHv0X3Ns@YcdQ???bM@+HOG`CMqmhWu_m?LteR498fFKs@yMCi> z?%era@0FUG8mrav`fIOxJeiUt`&<7u8dBVunMOe{TV`Iq+>+^bJP5@73C^57KW|?C zwQIh*x;nrAMs?LLm&ZW;zdK#0{|hM%VqDp*(ocE*!xdW(c*B&Elty=lE7}a6)$}<8jW~7?lo)P7#Tna zaXM_F&XBCCVo&$ug$uWB+gV<|DHe-Olwd4P?CcC%EUAJZj256MO7vEbJHx$o>(&bm z4T2yL!c|m!>2f+pTQbtdIy|S-F-Cd-U|BZJZuxZ6XTM*#fDqz1E*@9bu3hi-UY#0( z@fgD}1_RG9j35Z2D6%YTFc>y`@bT$0XOlz#02@Et@JO0nk|aS8`uh4Q3d7ft&CJ< zeA!6xo?-$3m@{X#)jIR&v0sfwBOydl6ha84w4*b8@#3XtRy;inV(JM1ATMveIn{jP z#7RO3!!Q_QmSr)`{VzF3SS}qR_o8+Bo{16Pw?B2Zx01O6$BuS#! zyZ76#lScpmt6qMI5K>W5t*WY`DEsz)Giz2(QV9Uy#g)(7ZMNFF`nT7x`CP@gb;$k8eoi(t_m143^Tk8 s3Hm@UrH(XqPx# literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/prev_next.png b/src/calibre/manual/images/prev_next.png new file mode 100644 index 0000000000000000000000000000000000000000..cc761704e7b248a4f1cc45f268899ec92b920171 GIT binary patch literal 2581 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 rgqW&o3rUiNB*`pUfGbt5YqLq~%b7uue!$ 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

-#<;>KSto z%A6S#72^7}E7>pr@O{76>*+#>7!Fd{F>0k!v2Vhh!lA+{=G6qGu+v~6&vBf7zn@gm zRH;;IG#V)j5}g5n>$;F-%jz$mGb_W&8>Pb;uvm#Cj5XSPu<%L8aeUuTT3{9}m&?s& za~x-g=(?_H(W)3AcV=K~CSxoU7S4#!SO4@kh}Pv(yE*4mJ3jnqK+qA7>GBZDE zE35wE@`or1#>&jz#^^VxPr=ot_r46Gr16xNnT9Pce_HwZXL1r`9#;Ucbz{j&DlD_; z_}IcUW0nRKmYGQ{M2WD%NnmXw=Ug9D5D6~`g6Nv?Hr!KeK?Y1IMMTwV_0q))L?nr1 zUy>pzr6MIsDpI7BE{cepF)lb~oO8|v7hDJ-xZr|wA;jFSIi*xAY>fVaS4wFl5lKlz zq|{(QL_wgG3Y1a+Fg#c^iVMLR8w|Ac(UaCjy+Vkz_s%5xfB$)|!wS(~DdgFKUup1g P00000NkvXXu0mjff*M#6 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/toc.png b/src/calibre/manual/images/toc.png new file mode 100644 index 0000000000000000000000000000000000000000..462b6b6c32ec48ee5634282761e19598d9850d3c GIT binary patch literal 628 zcmV-)0*n2LP)eR zx(7*hR~~r?3fA_dFgVtFKg{xV1^;5P*kykIneo~N-(LT~?L;?Z-|@G_%cdL5yxIKK z+MLc{wogxArL18!;#2AbWjdYicDtsg#u?{%zFx0S#e33Xu|Pyu^Y9uDQqnyR4^gRW9rR;&<3n~O z-SFB2oP>|vREhxr%-mxARJ_AXCX=!(o2Fi@^GrSOV6|G&L180Oe%_+)vtImKpNriS ze=c@6{&L_Xe3Pdu;Xh*b*TZAo=5{?ioVC+^@E29bswbs%XIWo^$_n4K;3q!Qh$o`q zaQOWEig?@+?mBNgvWwEsmqT_1bdx#REnOX(k2tg8b=%|adk O0000Advanced). + +Navigating around an e-book +----------------------------- + +.. |pni| image:: images/prev_next.png + +.. |bookmi| image:: images/bookmark.png + +.. |toci| image:: images/toc.png + +.. |navposi| image:: images/nav_pos.png + +.. |refmi| image:: images/ref_mode_button.png + + +You can "turn pages" in a book by using the :guilabel:`Page Next` and :guilabel:`Page Previous` buttons |pni|, or by pressing +the Page Down/Page Up keys. Unlike most e-book viewers, |app| does not force you to view books in paged mode. You can +scroll by amounts less than a page by using the scroll bar or various customizable keyboard shortcuts. + +Bookmarks +^^^^^^^^^^^^ + +When you are in the middle of a book and close the viewer, it will remember where you stopped reading and return there +the next time you open the book. You can also set bookmarks in the book by using the Bookmark button |bookmi|. When viewing EPUB format +books, these bookmarks are actually saved in the EPUB file itself, so you can add bookmarks, then send the file to a friend and +when they open the file, they will be able to see your bookmarks. + +Table of Contents +^^^^^^^^^^^^^^^^^^^^ + +If the book you are reading defines a Table of Contents, you can access it by pressing the Table of Contents button |toci|. +This will bring up a list of sections in the book and you can click on any of them to jump to that portion of the book. + +Navigating by location +^^^^^^^^^^^^^^^^^^^^^^^^ + +E-books, unlike paper books have no concept of pages. Instead, +as you read through the book, you will notice that your position in the book is displayed in the upper left corner in a box +like this |navposi|. This is both your current position and the total length of the book. These numbers are independent of the screen size and font +size you are viewing the boko at, and they play a similar role to page numbers in paper books. +You can enter any number you like to go to the corresponding location in the book. + +|app| also has a very handy +reference mode. You can turn it on by clicking the Reference Mode button |refmi|. Once you do this, every time you move your +mouse over a paragraph, calibre will display a unique number made up of the section and paragraph numbers. + +.. image:: images/ref_mode.png + +You can use this number to unambiguously refer to parts of the books when discussing it with friends or referring to it +in other works. You can enter these numbers in the box marked Go to at the top of the window to go to a particular +reference location. + +If you click on links inside the e-book to take you to different parts of the book, like an endnote, you can use the back and forward buttons +in the top left corner to return to where you were. These button behave just like those in a web browser. + +Customizing the look and feel of your reading experience +------------------------------------------------------------ + +.. |fontsizei| image:: images/font_size.png + +.. |fsi| image:: images/full_screen.png + +.. |prefbi| image:: images/pref_button.png + +You can change font sizes on the fly by using the font size buttons |fontsizei|. You can also make the viewer full screen +by pressing the Full Screen button |fsi|. By clicking the Preferences button |prefbi|, you can change the default fonts used +by the viewer to ones you like as well as the default font size when the viewer starts up. + +More advanced customization can be achieved by the User Stylesheet setting. This is a stylesheet you can set that will be applied +to every book. Using it you can do things like have white text on a black background, change paragraph styles, text justification, etc. +For examples if custom stylesheets used by |app|'s users, see `http://www.mobileread.com/forums/showthread.php?t=51500`_. + +Dictionary lookup +------------------- + +You can lookup the meaning of words in the current book by right clicking on a word. |app| uses the publicly available dictionary +server at ``dict.org`` to lookup words. The definition is displayed in a small box at the bottom of the screen. + +Copying text and images +------------------------- + +You can select text and images by dragging the content with your mouse and then right click to copy to the clipboard. +The copied material can be pasted into another application as plain text and images. + From d11f2a1f6151f9b3c087a4739eb40aa78916ca0c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 23:31:20 -0700 Subject: [PATCH 13/14] ... --- src/calibre/manual/viewer.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/manual/viewer.rst b/src/calibre/manual/viewer.rst index 40ef71918b..70bf98412a 100644 --- a/src/calibre/manual/viewer.rst +++ b/src/calibre/manual/viewer.rst @@ -89,7 +89,7 @@ by the viewer to ones you like as well as the default font size when the viewer More advanced customization can be achieved by the User Stylesheet setting. This is a stylesheet you can set that will be applied to every book. Using it you can do things like have white text on a black background, change paragraph styles, text justification, etc. -For examples if custom stylesheets used by |app|'s users, see `http://www.mobileread.com/forums/showthread.php?t=51500`_. +For examples if custom stylesheets used by |app|'s users, see `the forums `_. Dictionary lookup ------------------- From 083b9972133fb1646b588006f0fd362b637511ea Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 21 Jan 2010 23:37:03 -0700 Subject: [PATCH 14/14] ... --- src/calibre/manual/develop.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/calibre/manual/develop.rst b/src/calibre/manual/develop.rst index e7f3103fce..b9cebcab3d 100644 --- a/src/calibre/manual/develop.rst +++ b/src/calibre/manual/develop.rst @@ -204,4 +204,18 @@ terminal. For example, you can start the GUI from the terminal as:: calibre-debug -g +Executing arbitrary scripts in the calibre python environment +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :command:`calibre-debug` command provides a couple of handy switches to execute your own +code, with access to the calibre modules:: + + calibre-debug -c "some python code" + +is great for testing a little snippet of code on the command line. It works in the same way as the -c switch to the python interpreter:: + + calibre-debug -e myscript.py + +can be used to execute your own python script. It works in the same way as passing the script to the python interpreter, except +that the calibre environment is fully initialized, so you can use all the calibre code in your script.