mirror of
git://github.com/kovidgoyal/calibre.git
synced 2026-05-08 21:43:51 +02:00
KG's iterim updates
This commit is contained in:
commit
008ba1328a
9 changed files with 83 additions and 89 deletions
|
|
@ -11,9 +11,9 @@
|
|||
- title: Catalog generation
|
||||
type: major
|
||||
description: >
|
||||
"You can now easily generate a catlog of all books in your calibre library by clicking the arrow next to the convert button. The catalog can be in one of several formats: XML, CSV, EPUB and MOBI, with scope for future formats via plugins. If you generate the catalog in an e-book format, it will be automatically sent to your e-book reader the next time you connect it, allowing you to easily browse your collection on the reader itself."
|
||||
"You can now easily generate a catlog of all books in your calibre library by clicking the arrow next to the convert button. The catalog can be in one of several formats: XML, CSV, EPUB and MOBI, with scope for future formats via plugins. If you generate the catalog in an e-book format, it will be automatically sent to your e-book reader the next time you connect it, allowing you to easily browse your collection on the reader itself. This feature is in Beta (may have bugs) so feedback is appreciated."
|
||||
|
||||
- title: "RTF Input: Support for unicode characters. Needs testing."
|
||||
- title: "RTF Input: Support for unicode characters."
|
||||
type: major
|
||||
tickets: [4501]
|
||||
|
||||
|
|
|
|||
|
|
@ -312,7 +312,7 @@ def initialize(self):
|
|||
continue
|
||||
resources.close()
|
||||
|
||||
def run(self, path_to_output, opts, db, ids):
|
||||
def run(self, path_to_output, opts, db, ids, notification=None):
|
||||
'''
|
||||
Run the plugin. Must be implemented in subclasses.
|
||||
It should generate the catalog in the format specified
|
||||
|
|
|
|||
|
|
@ -85,6 +85,9 @@ def validate_parameters(self):
|
|||
|
||||
class DummyReporter(object):
|
||||
|
||||
def __init__(self):
|
||||
self.cancel_requested = False
|
||||
|
||||
def __call__(self, percent, msg=''):
|
||||
pass
|
||||
|
||||
|
|
|
|||
|
|
@ -153,6 +153,21 @@ def add_columns(self, columns):
|
|||
else:
|
||||
pass
|
||||
|
||||
def contains(self, columns):
|
||||
if not self.columns:
|
||||
return True
|
||||
if len(columns) != len(self.columns):
|
||||
return False
|
||||
for i in range(len(columns)):
|
||||
c1, c2 = self.columns[i], columns[i]
|
||||
x1 = Interval(c1.left, c1.right)
|
||||
x2 = Interval(c2.left, c2.right)
|
||||
intersection = x1.intersection(x2)
|
||||
base = min(x1.width, x2.width)
|
||||
if intersection.width/base < 0.6:
|
||||
return False
|
||||
return True
|
||||
|
||||
class Page(object):
|
||||
|
||||
# Fraction of a character width that two strings have to be apart,
|
||||
|
|
|
|||
|
|
@ -13,44 +13,34 @@
|
|||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<widget class="QListWidget" name="db_fields">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>297</x>
|
||||
<y>20</y>
|
||||
<width>256</width>
|
||||
<height>281</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string extracomment="Select all fields to be exported"/>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::MultiSelection</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>20</x>
|
||||
<y>20</y>
|
||||
<width>171</width>
|
||||
<height>17</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Fields to include in output:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Fields to include in output:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QListWidget" name="db_fields">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string extracomment="Select all fields to be exported"/>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::MultiSelection</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
|
|
|||
|
|
@ -44,8 +44,7 @@ def options(self):
|
|||
for opt in self.OPTION_FIELDS:
|
||||
opt_value = unicode(getattr(self, opt[0]).text())
|
||||
gprefs.set(self.name + '_' + opt[0], opt_value)
|
||||
if opt[0] == 'exclude_tags':
|
||||
opt_value = opt_value.split(',')
|
||||
opt_value = opt_value.split(',')
|
||||
opts_dict[opt[0]] = opt_value
|
||||
|
||||
opts_dict['output_profile'] = [load_defaults('page_setup')['output_profile']]
|
||||
|
|
|
|||
|
|
@ -53,11 +53,6 @@ def gui_catalog(fmt, title, dbspec, ids, out_file_name, fmt_options,
|
|||
|
||||
# Fetch and run the plugin for fmt
|
||||
plugin = plugin_for_catalog_format(fmt)
|
||||
plugin.run(out_file_name, opts, db)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
plugin.run(out_file_name, opts, db, notification=notification)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1402,7 +1402,7 @@ def catalog_generated(self, job):
|
|||
dynamic.set('catalogs_to_be_synced', sync)
|
||||
self.status_bar.showMessage(_('Catalog generated.'), 3000)
|
||||
self.sync_catalogs()
|
||||
if job.fmt in ['CSV','XML']:
|
||||
if job.fmt not in ['EPUB','MOBI']:
|
||||
export_dir = choose_dir(self, _('Export Catalog Directory'),
|
||||
_('Select destination for %s.%s') % (job.catalog_title, job.fmt.lower()))
|
||||
if export_dir:
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
from calibre.ebooks.BeautifulSoup import BeautifulSoup, BeautifulStoneSoup, Tag, NavigableString
|
||||
from calibre.customize import CatalogPlugin
|
||||
from calibre.ptempfile import PersistentTemporaryDirectory
|
||||
from calibre.customize.conversion import OptionRecommendation, DummyReporter
|
||||
|
||||
|
||||
FIELDS = ['all', 'author_sort', 'authors', 'comments',
|
||||
|
|
@ -44,11 +45,12 @@ class CSV_XML(CatalogPlugin):
|
|||
"Default: '%default'\n"
|
||||
"Applies to: CSV, XML output formats"))]
|
||||
|
||||
def run(self, path_to_output, opts, db):
|
||||
def run(self, path_to_output, opts, db, notification=DummyReporter()):
|
||||
from calibre.utils.logging import Log
|
||||
|
||||
log = Log()
|
||||
self.fmt = path_to_output.rpartition('.')[2]
|
||||
self.notification = notification
|
||||
|
||||
if False and opts.verbose:
|
||||
log("%s:run" % self.name)
|
||||
|
|
@ -470,12 +472,6 @@ class CatalogBuilder(object):
|
|||
# title dc:title in OPF metadata, NCX periodical
|
||||
# verbosity level of diagnostic printout
|
||||
|
||||
class DummyReporter(object):
|
||||
def __init__(self):
|
||||
self.cancelRequested = False
|
||||
|
||||
def __call__(self, percent, msg=''):
|
||||
pass
|
||||
|
||||
def __init__(self, db, opts, plugin,
|
||||
generateForMobigen=False,
|
||||
|
|
@ -667,47 +663,47 @@ def setverbose(self, value):
|
|||
|
||||
# Methods
|
||||
def buildSources(self):
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
if not self.booksByTitle:
|
||||
self.fetchBooksByTitle()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.fetchBooksByAuthor()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateHTMLDescriptions()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateHTMLByTitle()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateHTMLByAuthor()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateHTMLByTags()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateThumbnails()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateOPF()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateNCXHeader()
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateNCXDescriptions("Descriptions")
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateNCXByTitle("Titles", single_article_per_section=False)
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateNCXByAuthor("Authors", single_article_per_section=False)
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.generateNCXByTags("Genres")
|
||||
|
||||
if self.reporter.cancelRequested: return 1
|
||||
if self.reporter.cancel_requested: return 1
|
||||
self.writeNCX()
|
||||
|
||||
return 0
|
||||
|
|
@ -2523,8 +2519,7 @@ def updateProgressMicroStep(self, description, micro_step_pct):
|
|||
self.reporter(self.progressInt, self.progressString)
|
||||
return "%d%% %s" % (self.progressInt, self.progressString)
|
||||
|
||||
def run(self, path_to_output, opts, db):
|
||||
from calibre.ebooks.conversion.cli import main as ebook_convert
|
||||
def run(self, path_to_output, opts, db, notification=DummyReporter()):
|
||||
from calibre.utils.logging import Log
|
||||
|
||||
log = Log()
|
||||
|
|
@ -2551,28 +2546,25 @@ def run(self, path_to_output, opts, db):
|
|||
log(" %s: %s" % (key, opts_dict[key]))
|
||||
|
||||
# Launch the Catalog builder
|
||||
catalog = self.CatalogBuilder(db, opts, self)
|
||||
catalog = self.CatalogBuilder(db, opts, self, notification=notification)
|
||||
catalog.createDirectoryStructure()
|
||||
catalog.copyResources()
|
||||
catalog.buildSources()
|
||||
|
||||
cmd_line_args = ['ebook-convert',
|
||||
os.path.join(catalog.catalogPath,
|
||||
opts.basename + '.opf'),
|
||||
path_to_output]
|
||||
recommendations = []
|
||||
|
||||
if opts.fmt == 'mobi':
|
||||
# options
|
||||
if opts.output_profile.startswith("kindle"):
|
||||
cmd_line_args.append("--output-profile=%s" % str(opts.output_profile))
|
||||
cmd_line_args.append("--no-inline-toc")
|
||||
|
||||
|
||||
elif opts.fmt == 'epub':
|
||||
pass
|
||||
if opts.fmt == 'mobi' and opts.output_profile.startswith("kindle"):
|
||||
recommendations.append(('output_profile', opts.output_profile,
|
||||
OptionRecommendation.HIGH))
|
||||
recommendations.append(('no_inline_toc', True,
|
||||
OptionRecommendation.HIGH))
|
||||
|
||||
# Run ebook-convert
|
||||
ebook_convert(args=cmd_line_args)
|
||||
from calibre.ebooks.conversion.plumber import Plumber
|
||||
plumber = Plumber(os.path.join(catalog.catalogPath,
|
||||
opts.basename + '.opf'), path_to_output, log, report_progress=notification,
|
||||
abort_after_input_dump=False)
|
||||
plumber.merge_ui_recommendations(recommendations)
|
||||
|
||||
plumber.run()
|
||||
|
||||
return None
|
||||
|
|
|
|||
Loading…
Reference in a new issue