diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index e4f8bf99bf..8b4544ffcb 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -451,6 +451,10 @@ class CatalogPlugin(Plugin): # {{{ 'series_index','series','size','tags','timestamp', 'title_sort','title','uuid','languages']) all_custom_fields = set(db.custom_field_keys()) + for field in list(all_custom_fields): + fm = db.field_metadata[field] + if fm['datatype'] == 'series': + all_custom_fields.add(field+'_index') all_fields = all_std_fields.union(all_custom_fields) if opts.fields != 'all': diff --git a/src/calibre/gui2/catalog/catalog_bibtex.py b/src/calibre/gui2/catalog/catalog_bibtex.py index 0fe641403b..58dae47a90 100644 --- a/src/calibre/gui2/catalog/catalog_bibtex.py +++ b/src/calibre/gui2/catalog/catalog_bibtex.py @@ -35,7 +35,10 @@ class PluginWidget(QWidget, Ui_Form): self.all_fields = [x for x in FIELDS if x != 'all'] #add custom columns - self.all_fields.extend([x for x in sorted(db.custom_field_keys())]) + for x in sorted(db.custom_field_keys()): + self.all_fields.append(x) + if db.field_metadata[x]['datatype'] == 'series': + self.all_fields.append(x+'_index') #populate for x in self.all_fields: QListWidgetItem(x, self.db_fields) diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.py b/src/calibre/gui2/catalog/catalog_csv_xml.py index a64816cf98..ef322f2db9 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.py +++ b/src/calibre/gui2/catalog/catalog_csv_xml.py @@ -33,6 +33,9 @@ class PluginWidget(QWidget, Ui_Form): self.all_fields.append(x) QListWidgetItem(x, self.db_fields) + fm = db.field_metadata[x] + if fm['datatype'] == 'series': + QListWidgetItem(x+'_index', self.db_fields) def initialize(self, name, db): self.name = name diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index a9c4b1a309..e2552b3a82 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -347,7 +347,9 @@ class BIBTEX(CatalogPlugin): # {{{ for field in fields: if field.startswith('#'): - item = db.get_field(entry['id'],field,index_is_id=True) + item = db.get_field(entry['id'],field,index_is_id=True) + if isinstance(item, (bool, float, int)): + item = repr(item) elif field == 'title_sort': item = entry['sort'] else: @@ -391,7 +393,7 @@ class BIBTEX(CatalogPlugin): # {{{ elif field == 'isbn' : # Could be 9, 10 or 13 digits - bibtex_entry.append(u'isbn = "%s"' % re.sub(u'[\D]', u'', item)) + bibtex_entry.append(u'isbn = "%s"' % re.sub(u'[0-9xX]', u'', item)) elif field == 'formats' : #Add file path if format is selected @@ -413,7 +415,8 @@ class BIBTEX(CatalogPlugin): # {{{ bibtex_entry.append(u'month = "%s"' % bibtexdict.utf8ToBibtex(strftime("%b", item))) elif field.startswith('#') : - bibtex_entry.append(u'%s = "%s"' % (field[1:], bibtexdict.utf8ToBibtex(item))) + bibtex_entry.append(u'custom_%s = "%s"' % (field[1:], + bibtexdict.utf8ToBibtex(item))) else: # elif field in ['title', 'publisher', 'cover', 'uuid', 'ondevice', diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 86f8a070f3..ff9011050c 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -64,8 +64,17 @@ def do_list(db, fields, afields, sort_by, ascending, search_text, line_width, se data = db.get_data_as_dict(prefix, authors_as_string=True) fields = ['id'] + fields title_fields = fields - fields = [db.custom_column_label_map[x[1:]]['num'] if x[0]=='*' - else x for x in fields] + def field_name(f): + ans = f + if f[0] == '*': + if f.endswith('_index'): + fkey = f[1:-len('_index')] + num = db.custom_column_label_map[fkey]['num'] + ans = '%d_index'%num + else: + ans = db.custom_column_label_map[f[1:]]['num'] + return ans + fields = list(map(field_name, fields)) for f in data: fmts = [x for x in f['formats'] if x is not None] @@ -121,8 +130,10 @@ def do_list(db, fields, afields, sort_by, ascending, search_text, line_width, se def list_option_parser(db=None): fields = set(FIELDS) if db is not None: - for f in db.custom_column_label_map: + for f, data in db.custom_column_label_map.iteritems(): fields.add('*'+f) + if data['datatype'] == 'series': + fields.add('*'+f+'_index') parser = get_parser(_( '''\ @@ -161,8 +172,10 @@ def command_list(args, dbpath): opts, args = parser.parse_args(sys.argv[:1] + args) afields = set(FIELDS) if db is not None: - for f in db.custom_column_label_map: + for f, data in db.custom_column_label_map.iteritems(): afields.add('*'+f) + if data['datatype'] == 'series': + afields.add('*'+f+'_index') fields = [str(f.strip().lower()) for f in opts.fields.split(',')] if 'all' in fields: fields = sorted(list(afields)) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index f99830ca5a..02dda6622e 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -3376,11 +3376,15 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): ''' if prefix is None: prefix = self.library_path - FIELDS = set(['title', 'sort', 'authors', 'author_sort', 'publisher', 'rating', - 'timestamp', 'size', 'tags', 'comments', 'series', 'series_index', - 'uuid', 'pubdate', 'last_modified', 'identifiers', 'languages']) - for x in self.custom_column_num_map: - FIELDS.add(x) + fdata = self.custom_column_num_map + + FIELDS = set(['title', 'sort', 'authors', 'author_sort', 'publisher', + 'rating', 'timestamp', 'size', 'tags', 'comments', 'series', + 'series_index', 'uuid', 'pubdate', 'last_modified', 'identifiers', + 'languages']).union(set(fdata)) + for x, data in fdata.iteritems(): + if data['datatype'] == 'series': + FIELDS.add('%d_index'%x) data = [] for record in self.data: if record is None: continue