KG's iterim updates

This commit is contained in:
GRiker 2010-01-22 13:18:26 -07:00
commit 008ba1328a
9 changed files with 83 additions and 89 deletions

View File

@ -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]

View File

@ -312,7 +312,7 @@ class CatalogPlugin(Plugin):
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

View File

@ -85,6 +85,9 @@ class OptionRecommendation(object):
class DummyReporter(object):
def __init__(self):
self.cancel_requested = False
def __call__(self, percent, msg=''):
pass

View File

@ -153,6 +153,21 @@ class Region(object):
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,

View File

@ -13,17 +13,21 @@
<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>
<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="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -35,22 +39,8 @@
<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>
</item>
</layout>
</widget>
<resources/>
<connections/>

View File

@ -44,7 +44,6 @@ class PluginWidget(QWidget,Ui_Form):
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(',')
opts_dict[opt[0]] = opt_value

View File

@ -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)

View File

@ -1402,7 +1402,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
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:

View File

@ -5,6 +5,7 @@ from xml.sax.saxutils import escape
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 EPUB_MOBI(CatalogPlugin):
# 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 @@ class EPUB_MOBI(CatalogPlugin):
# 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 @@ class EPUB_MOBI(CatalogPlugin):
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 @@ class EPUB_MOBI(CatalogPlugin):
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