Sync to trunk.

This commit is contained in:
John Schember 2009-12-22 20:05:43 -05:00
commit a7de858de1
20 changed files with 303 additions and 302 deletions

View File

@ -3,15 +3,16 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
from calibre.web.feeds.news import BasicNewsRecipe
# http://online.wsj.com/page/us_in_todays_paper.html
class WallStreetJournal(BasicNewsRecipe):
title = 'The Wall Street Journal'
title = 'The Wall Street Journal (US)'
__author__ = 'Kovid Goyal and Sujata Raman'
description = 'News and current affairs.'
description = 'News and current affairs'
needs_subscription = True
language = 'en'
@ -60,60 +61,54 @@ class WallStreetJournal(BasicNewsRecipe):
return soup
def get_article_url(self, article):
try:
return article.feedburner_origlink.split('?')[0]
except AttributeError:
return article.link.split('?')[0]
def wsj_get_index(self):
return self.index_to_soup('http://online.wsj.com/page/us_in_todays_paper.html')
def parse_index(self):
soup = self.wsj_get_index()
left_column = soup.find(
text=lambda t: 'begin ITP Left Column' in str(t))
table = left_column.findNext('table')
current_section = None
current_articles = []
feeds = []
for x in table.findAllNext(True):
if x.name == 'td' and x.get('class', None) == 'b13':
if current_articles and current_section:
feeds.append((current_section, current_articles))
current_section = self.tag_to_string(x.a).strip()
current_articles = []
self.log('\tProcessing section:', current_section)
if current_section is not None and x.name == 'a' and \
x.get('class', None) == 'bold80':
title = self.tag_to_string(x)
url = x.get('href', False)
if not url or not title:
continue
url = url.partition('#')[0]
desc = ''
d = x.findNextSibling(True)
if d.get('class', None) == 'arialResize':
desc = self.tag_to_string(d)
desc = desc.partition(u'\u2022')[0]
self.log('\t\tFound article:', title)
self.log('\t\t\t', url)
if url.startswith('/'):
url = 'http://online.wsj.com'+url
if desc:
self.log('\t\t\t', desc)
current_articles.append({'title': title, 'url':url,
'description':desc, 'date':''})
if current_articles and current_section:
feeds.append((current_section, current_articles))
return feeds
def cleanup(self):
self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com')
feeds = [
#('Most Emailed - Day', 'http://online.wsj.com/xml/rss/3_7030.xml'),
#('Most Emailed - Week', 'http://online.wsj.com/xml/rss/3_7253.xml'),
#('Most Emailed - Month', 'http://online.wsj.com/xml/rss/3_7254.xml'),
(' Most Viewed - Day', 'http://online.wsj.com/xml/rss/3_7198.xml'),
(' Most Viewed - Week', 'http://online.wsj.com/xml/rss/3_7251.xml'),
#('Most Viewed - Month', 'http://online.wsj.com/xml/rss/3_7252.xml'),
('Today\'s Newspaper - Page One', 'http://online.wsj.com/xml/rss/3_7205.xml'),
('Today\'s Newspaper - Marketplace', 'http://online.wsj.com/xml/rss/3_7206.xml'),
('Today\'s Newspaper - Money & Investing', 'http://online.wsj.com/xml/rss/3_7207.xml'),
('Today\'s Newspaper - Personal Journal', 'http://online.wsj.com/xml/rss/3_7208.xml'),
('Today\'s Newspaper - Weekend Journal', 'http://online.wsj.com/xml/rss/3_7209.xml'),
('Opinion', 'http://online.wsj.com/xml/rss/3_7041.xml'),
('News - U.S.: What\'s News', 'http://online.wsj.com/xml/rss/3_7011.xml'),
('News - U.S. Business', 'http://online.wsj.com/xml/rss/3_7014.xml'),
('News - Europe: What\'s News', 'http://online.wsj.com/xml/rss/3_7012.xml'),
('News - Asia: What\'s News', 'http://online.wsj.com/xml/rss/3_7013.xml'),
('News - World News', 'http://online.wsj.com/xml/rss/3_7085.xml'),
('News - Economy', 'http://online.wsj.com/xml/rss/3_7086.xml'),
('News - Earnings', 'http://online.wsj.com/xml/rss/3_7088.xml'),
('News - Health', 'http://online.wsj.com/xml/rss/3_7089.xml'),
('News - Law', 'http://online.wsj.com/xml/rss/3_7091.xml'),
('News - Media & Marketing', 'http://online.wsj.com/xml/rss/3_7020.xml'),
('Technology - What\'s News', 'http://online.wsj.com/xml/rss/3_7015.xml'),
('Technology - Gadgets', 'http://online.wsj.com/xml/rss/3_7094.xml'),
('Technology - Telecommunications', 'http://online.wsj.com/xml/rss/3_7095.xml'),
('Technology - E-commerce/Media', 'http://online.wsj.com/xml/rss/3_7096.xml'),
('Technology - Asia', 'http://online.wsj.com/xml/rss/3_7097.xml'),
('Technology - Europe', 'http://online.wsj.com/xml/rss/3_7098.xml'),
('Markets - News', 'http://online.wsj.com/xml/rss/3_7031.xml'),
('Markets - Europe News', 'http://online.wsj.com/xml/rss/3_7101.xml'),
('Markets - Asia News', 'http://online.wsj.com/xml/rss/3_7102.xml'),
('Markets - Deals & Deal Makers', 'http://online.wsj.com/xml/rss/3_7099.xml'),
('Markets - Hedge Funds', 'http://online.wsj.com/xml/rss/3_7199.xml'),
('Personal Journal', 'http://online.wsj.com/xml/rss/3_7200.xml'),
('Personal Journal - Money', 'http://online.wsj.com/xml/rss/3_7104.xml'),
('Personal Journal - Health', 'http://online.wsj.com/xml/rss/3_7089.xml'),
('Personal Journal - Autos', 'http://online.wsj.com/xml/rss/3_7092.xml'),
('Personal Journal - Homes', 'http://online.wsj.com/xml/rss/3_7105.xml'),
('Personal Journal - Travel', 'http://online.wsj.com/xml/rss/3_7106.xml'),
('Personal Journal - Careers', 'http://online.wsj.com/xml/rss/3_7107.xml'),
('Weekend & Leisure', 'http://online.wsj.com/xml/rss/3_7201.xml'),
('Weekend & Leisure - Weekend Journal', 'http://online.wsj.com/xml/rss/3_7202.xml'),
('Weekend & Leisure - Arts & Entertainment', 'http://online.wsj.com/xml/rss/3_7177.xml'),
('Weekend & Leisure - Books', 'http://online.wsj.com/xml/rss/3_7203.xml'),
('Weekend & Leisure - Sports', 'http://online.wsj.com/xml/rss/3_7204.xml'),
]

View File

@ -13,12 +13,9 @@ from PyQt4 import pyqtconfig
from setup import isosx, iswindows, islinux
OSX_SDK = '/Developer/SDKs/MacOSX10.5.sdk'
if not os.path.exists(OSX_SDK):
OSX_SDK = '/Developer/SDKs/MacOSX10.4u.sdk'
leopard_build = '10.5' in OSX_SDK
os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.5' if leopard_build else '10.4'
os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.4'
NMAKE = RC = msvc = MT = win_inc = win_lib = None
if iswindows:
@ -117,24 +114,24 @@ if iswindows:
podofo_inc = os.path.join(sw_inc_dir, 'podofo')
podofo_lib = sw_lib_dir
elif isosx:
fc_inc = '/Users/kovid/fontconfig/include/fontconfig'
fc_lib = '/Users/kovid/fontconfig/lib'
fc_inc = '/sw/include/fontconfig'
fc_lib = '/sw/lib'
poppler_inc_dirs = consolidate('POPPLER_INC_DIR',
'/Volumes/sw/build/poppler-0.12.0/poppler:/Volumes/sw/build/poppler-0.12.0')
'/sw/build/poppler-0.12.2/poppler:/sw/build/poppler-0.12.2')
popplerqt4_inc_dirs = poppler_inc_dirs + [poppler_inc_dirs[0]+'/qt4']
poppler_lib_dirs = consolidate('POPPLER_LIB_DIR',
'/Volumes/sw/lib')
'/sw/lib')
popplerqt4_lib_dirs = poppler_lib_dirs
poppler_libs = popplerqt4_libs = ['poppler']
podofo_inc = '/usr/local/include/podofo'
podofo_lib = '/usr/local/lib'
podofo_inc = '/sw/podofo'
podofo_lib = '/sw/lib'
magick_inc_dirs = consolidate('MAGICK_INC',
'/Users/kovid/ImageMagick/include/ImageMagick')
'/sw/include/ImageMagick')
magick_lib_dirs = consolidate('MAGICK_LIB',
'/Users/kovid/ImageMagick/lib')
'/sw/lib')
magick_libs = ['MagickWand', 'MagickCore']
png_inc_dirs = consolidate('PNG_INC_DIR', '/usr/local/include')
png_lib_dirs = consolidate('PNG_LIB_DIR', '/usr/local/lib')
png_inc_dirs = consolidate('PNG_INC_DIR', '/sw/include')
png_lib_dirs = consolidate('PNG_LIB_DIR', '/sw/lib')
png_libs = ['png12']
else:
# Include directories

View File

@ -83,7 +83,7 @@ linux_freeze2 = LinuxFreeze2()
from setup.installer.osx import OSX, OSX32
osx = OSX()
osx32 = OSX32()
from setup.installer.osx.freeze import OSX32_Freeze
from setup.installer.osx.app.main import OSX32_Freeze
osx32_freeze = OSX32_Freeze()
from setup.installer.windows import Win, Win32

View File

@ -15,7 +15,7 @@ from setup import Command, islinux, isosx, SRC, iswindows
from setup.build_environment import fc_inc, fc_lib, \
fc_error, poppler_libs, poppler_lib_dirs, poppler_inc_dirs, podofo_inc, \
podofo_lib, podofo_error, poppler_error, pyqt, OSX_SDK, NMAKE, \
leopard_build, QMAKE, msvc, MT, win_inc, win_lib, png_inc_dirs, \
QMAKE, msvc, MT, win_inc, win_lib, png_inc_dirs, \
magick_inc_dirs, magick_lib_dirs, png_lib_dirs, png_libs, \
magick_error, magick_libs, ft_lib_dirs, ft_libs, jpg_libs, jpg_lib_dirs
MT
@ -156,7 +156,7 @@ if islinux:
if isosx:
x, p = ('x86_64', 'ppc64') if leopard_build else ('i386', 'ppc')
x, p = ('i386', 'ppc')
archs = ['-arch', x, '-arch', p, '-isysroot',
OSX_SDK]
cflags.append('-D_OSX')
@ -305,7 +305,7 @@ class Build(Command):
obj_pat = 'release\\*.obj' if iswindows else '*.o'
objects = glob.glob(obj_pat)
if not objects or self.newer(objects, ext.sources+ext.headers):
archs = 'x86_64 ppc64' if leopard_build else 'x86 ppc'
archs = 'x86 ppc'
pro = textwrap.dedent('''\
TARGET = %s
TEMPLATE = lib
@ -316,9 +316,6 @@ class Build(Command):
''')%(ext.name, ' '.join(ext.headers), ' '.join(ext.sources), archs)
open(ext.name+'.pro', 'wb').write(pro)
subprocess.check_call([QMAKE, '-o', 'Makefile', ext.name+'.pro'])
if leopard_build:
raw = open('Makefile', 'rb').read()
open('Makefile', 'wb').write(raw.replace('ppc64', 'x86_64'))
subprocess.check_call([make, '-f', 'Makefile'])
objects = glob.glob(obj_pat)
return list(map(self.a, objects))
@ -354,12 +351,6 @@ class Build(Command):
makefile.extra_lflags = qt_objects
makefile.extra_include_dirs = ext.inc_dirs
makefile.generate()
if leopard_build:
raw = open(mf, 'rb').read()
raw = raw.replace('ppc64 x86_64', 'x86_64')
for x in ('ppc64', 'ppc', 'i386'):
raw = raw.replace(x, 'x86_64')
open(mf, 'wb').write(raw)
subprocess.check_call([make, '-f', mf], cwd=src_dir)
shutil.copy2(module, dest)

View File

@ -25,8 +25,9 @@ class OSX32(VMInstaller):
description = 'Build 32 bit OS X binary installer'
INSTALLER_EXT = 'dmg'
VM_NAME = 'tiger_build'
VM_NAME = 'leopard_build'
VM = '/vmware/bin/%s'%VM_NAME
FREEZE_TEMPLATE = 'python -OO setup.py {freeze_command}'
FREEZE_COMMAND = 'osx32_freeze'
BUILD_PREFIX = VMInstaller.BUILD_PREFIX + ['source ~/.profile']
SHUTDOWN_CMD = ['sudo', 'halt']

View File

@ -13,9 +13,13 @@ abspath, join, basename = os.path.abspath, os.path.join, os.path.basename
from setup import __version__ as VERSION, __appname__ as APPNAME, basenames, \
modules as main_modules, Command, SRC, functions as main_functions
LICENSE = open('LICENSE', 'rb').read()
MAGICK_HOME='@executable_path/../Frameworks/ImageMagick'
ENV = dict(
FC_CONFIG_DIR='@executable_path/../Resources/fonts',
MAGICK_HOME='@executable_path/../Frameworks/ImageMagick',
FC_CONFIG_FILE='@executable_path/../Resources/fonts/fonts.conf',
MAGICK_CONFIGURE_PATH=MAGICK_HOME+'/config',
MAGICK_CODER_MODULE_PATH=MAGICK_HOME+'/modules-Q16/coders',
MAGICK_CODER_FILTER_PATH=MAGICK_HOME+'/modules-Q16/filter',
QT_PLUGIN_PATH='@executable_path/../MacOS',
PYTHONIOENCODING='UTF-8',
)
@ -46,9 +50,9 @@ def compile_launcher_lib(contents_dir, gcc, base):
src = join(base, 'util.c')
cmd = [gcc] + '-Wall -arch i386 -arch ppc -dynamiclib -std=gnu99'.split() + [src] + \
['-I'+base] + \
['-I%s/python/Python.framework/Headers'%SW] + \
['-I/Library/Frameworks/Python.framework/Versions/Current/Headers'] + \
'-current_version 1.0 -compatibility_version 1.0'.split() + \
'-fvisibility=hidden -o'.split() + [dest, '-F%s/python'%SW] + \
'-fvisibility=hidden -o'.split() + [dest] + \
['-install_name',
'@executable_path/../Frameworks/'+os.path.basename(dest)] + \
['-framework', 'Python', '-framework', 'CoreFoundation', '-headerpad_max_install_names']
@ -176,6 +180,8 @@ class Py2App(object):
self.create_plist()
self.add_python_framework()
self.add_site_packages()
self.add_stdlib()
self.add_qt_frameworks()
self.add_calibre_plugins()
self.add_podofo()
@ -186,8 +192,6 @@ class Py2App(object):
self.add_imagemagick()
self.add_misc_libraries()
self.add_site_packages()
self.add_stdlib()
self.add_resources()
self.compile_py_modules()
@ -262,8 +266,10 @@ class Py2App(object):
def get_local_dependencies(self, path_to_lib):
for x in self.get_dependencies(path_to_lib):
for y in (SW+'/lib/', '/usr/local/lib/', SW+'/qt/lib/',
SW+'/python/', SW+'/freetype/lib/'):
'/Library/Frameworks/Python.framework/', SW+'/freetype/lib/'):
if x.startswith(y):
if y == '/Library/Frameworks/Python.framework/':
y = '/Library/Frameworks/'
yield x, x[len(y):]
break
@ -289,7 +295,7 @@ class Py2App(object):
@flush
def add_python_framework(self):
info('\nAdding Python framework')
src = join(SW, 'python', 'Python.framework')
src = join('/Library/Frameworks', 'Python.framework')
x = join(self.frameworks_dir, 'Python.framework')
curr = os.path.realpath(join(src, 'Versions', 'Current'))
currd = join(x, 'Versions', basename(curr))
@ -302,6 +308,7 @@ class Py2App(object):
@flush
def add_qt_frameworks(self):
info('\nAdding Qt Framework')
for f in ('QtCore', 'QtGui', 'QtXml', 'QtNetwork', 'QtSvg', 'QtWebkit',
'QtXmlPatterns', 'phonon'):
self.add_qt_framework(f)
@ -360,7 +367,7 @@ class Py2App(object):
CFBundlePackageType='APPL',
CFBundleSignature='????',
CFBundleExecutable='calibre',
LSMinimumSystemVersion='10.5.2',
LSMinimumSystemVersion='10.4.2',
LSRequiresNativeExecution=True,
NSAppleScriptEnabled=False,
NSHumanReadableCopyright='Copyright 2008, Kovid Goyal',
@ -433,10 +440,7 @@ class Py2App(object):
for x in ('Wand', 'Core'):
self.install_dylib(os.path.join(SW, 'lib', 'libMagick%s.2.dylib'%x))
idir = glob.glob(os.path.join(SW, 'lib', 'ImageMagick-*'))[-1]
dest = os.path.join(self.frameworks_dir, 'ImageMagick', 'lib')
if not os.path.exists(dest):
os.makedirs(dest)
dest = os.path.join(dest, os.path.basename(idir))
dest = os.path.join(self.frameworks_dir, 'ImageMagick')
if os.path.exists(dest):
shutil.rmtree(dest)
shutil.copytree(idir, dest, True)
@ -461,12 +465,12 @@ class Py2App(object):
paths = reversed(map(abspath, [x for x in sys.path if x.startswith('/')]))
upaths = []
for x in paths:
if x.endswith('/PIL') or 'site-packages' not in x:
continue
if x not in upaths:
if x not in upaths and (x.endswith('.egg') or
x.endswith('/site-packages')):
upaths.append(x)
upaths.append(os.path.expanduser('~/build/calibre/src'))
for x in upaths:
info('\t', x)
tdir = None
try:
if not os.path.isdir(x):
@ -536,7 +540,7 @@ class Py2App(object):
@flush
def add_stdlib(self):
info('\nAdding python stdlib')
src = join(SW, 'python/Python.framework/Versions/Current/lib/python')
src = '/Library/Frameworks/Python.framework/Versions/Current/lib/python'
src += self.version_info
dest = join(self.resources_dir, 'Python', 'lib', 'python')
dest += self.version_info

View File

@ -363,7 +363,7 @@ class NookOutput(OutputProfile):
description = _('This profile is intended for the B&N Nook.')
# Screen size is a best guess
screen_size = (600, 800)
screen_size = (600, 770)
dpi = 167
fbase = 16
fsizes = [12, 12, 14, 16, 18, 20, 22, 24]

View File

@ -9,7 +9,6 @@ Device driver for Bookeen's Cybook Gen 3
'''
import os
from itertools import cycle
from calibre import islinux
from calibre.devices.usbms.driver import USBMS

View File

@ -8,10 +8,7 @@ __docformat__ = 'restructuredtext en'
Device driver for Barns and Nobel's Nook
'''
try:
from PIL import Image, ImageDraw
except ImportError:
import Image, ImageDraw
import os
import cStringIO
@ -47,6 +44,13 @@ class NOOK(USBMS):
SUPPORTS_SUB_DIRS = True
def upload_cover(self, path, filename, metadata):
try:
from PIL import Image, ImageDraw
Image, ImageDraw
except ImportError:
import Image, ImageDraw
coverdata = metadata.get('cover', None)
if coverdata:
cover = Image.open(cStringIO.StringIO(coverdata[2]))

View File

@ -111,7 +111,11 @@ class USBMS(CLI, Device):
paths.append(filepath)
self.put_file(infile, filepath, replace_file=True)
try:
self.upload_cover(os.path.dirname(filepath), os.path.splitext(os.path.basename(filepath))[0], mdata)
except: # Failure to upload cover is not catastrophic
import traceback
traceback.print_exc()
self.report_progress((i+1) / float(len(files)), _('Transferring books to device...'))

View File

@ -203,9 +203,10 @@ def create_option_parser(args, log):
log('Created by:', __author__)
raise SystemExit(0)
if '--list-recipes' in args:
from calibre.web.feeds.recipes import titles
from calibre.web.feeds.recipes.collection import get_builtin_recipe_titles
log('Available recipes:')
for title in sorted(titles):
titles = sorted(get_builtin_recipe_titles())
for title in titles:
try:
log('\t'+title)
except:

View File

@ -155,17 +155,19 @@ class EPUBOutput(OutputFormatPlugin):
def convert(self, oeb, output_path, input_plugin, opts, log):
self.log, self.opts, self.oeb = log, opts, oeb
self.workaround_ade_quirks()
self.workaround_webkit_quirks()
self.workaround_sony_quirks()
from calibre.ebooks.oeb.transforms.rescale import RescaleImages
RescaleImages()(oeb, opts)
from calibre.ebooks.oeb.transforms.split import Split
split = Split(not self.opts.dont_split_on_page_breaks,
max_flow_size=self.opts.flow_size*1024
)
split(self.oeb, self.opts)
self.workaround_ade_quirks()
self.workaround_webkit_quirks()
self.workaround_sony_quirks()
from calibre.ebooks.oeb.transforms.rescale import RescaleImages
RescaleImages()(oeb, opts)
self.insert_cover()
with TemporaryDirectory('_epub_output') as tdir:

View File

@ -381,9 +381,9 @@ class FlowSplitter(object):
p[i:i+1] = new_pres
split_point, before = self.find_split_point(root)
self.log.debug('\t\t\tSplit point:', split_point.tag, tree.getpath(split_point))
if split_point is None:
raise SplitError(self.item.href, root)
self.log.debug('\t\t\tSplit point:', split_point.tag, tree.getpath(split_point))
for t in self.do_split(tree, split_point, before):
r = t.getroot()

View File

@ -693,6 +693,9 @@ class BooksView(TableView):
self._model.current_changed)
self.connect(self._model, SIGNAL('columns_sorted()'),
self.columns_sorted, Qt.QueuedConnection)
hv = self.verticalHeader()
hv.setClickable(True)
hv.setCursor(Qt.PointingHandCursor)
def columns_sorted(self):
for i in range(self.model().columnCount(None)):

View File

@ -552,6 +552,11 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.connect(self.scheduler,
SIGNAL('start_recipe_fetch(PyQt_PyObject)'),
self.download_scheduled_recipe, Qt.QueuedConnection)
self.library_view.verticalHeader().sectionClicked.connect(self.view_specific_book)
for view in ('library', 'memory', 'card_a', 'card_b'):
view = getattr(self, view+'_view')
view.verticalHeader().sectionDoubleClicked.connect(self.view_specific_book)
self.location_view.setCurrentIndex(self.location_view.model().index(0))
@ -921,7 +926,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
'''
Add books from the local filesystem to either the library or the device.
'''
books = choose_files(self, 'add books dialog dir', 'Select books',
filters = [
(_('Books'), BOOK_EXTENSIONS),
(_('EPUB Books'), ['epub']),
@ -933,10 +937,15 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
(_('PDF Books'), ['pdf']),
(_('Comics'), ['cbz', 'cbr', 'cbc']),
(_('Archives'), ['zip', 'rar']),
])
]
to_device = self.stack.currentIndex() != 0
if to_device:
filters = [(_('Supported books'), self.device_manager.device.FORMATS)]
books = choose_files(self, 'add books dialog dir', 'Select books',
filters=filters)
if not books:
return
to_device = self.stack.currentIndex() != 0
self._add_books(books, to_device)
@ -1442,7 +1451,12 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
def view_book(self, triggered):
rows = self.current_view().selectionModel().selectedRows()
self._view_books(rows)
def view_specific_book(self, index):
self._view_books([index])
def _view_books(self, rows):
if not rows or len(rows) == 0:
self._launch_viewer()
return
@ -1458,6 +1472,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
if self.current_view() is self.library_view:
for row in rows:
if hasattr(row, 'row'):
row = row.row()
formats = self.library_view.model().db.formats(row)

View File

@ -96,6 +96,7 @@ class Nook(Sony505):
id = 'nook'
name = 'Nook'
manufacturer = 'Barnes & Noble'
output_profile = 'nook'
class CybookG3(Device):

View File

@ -473,7 +473,7 @@ class LibraryDatabase2(LibraryDatabase):
def upgrade_version_2(self):
''' Fix Foreign key constraints for deleting from link tables. '''
script = textwrap.dedent('''\
DROP TRIGGER fkc_delete_books_%(ltable)s_link;
DROP TRIGGER IF EXISTS fkc_delete_books_%(ltable)s_link;
CREATE TRIGGER fkc_delete_on_%(table)s
BEFORE DELETE ON %(table)s
BEGIN

View File

@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: calibre 0.6.29\n"
"POT-Creation-Date: 2009-12-18 12:30+MST\n"
"PO-Revision-Date: 2009-12-18 12:30+MST\n"
"POT-Creation-Date: 2009-12-21 21:13+MST\n"
"PO-Revision-Date: 2009-12-21 21:13+MST\n"
"Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
@ -21,13 +21,13 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:44
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:94
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:53
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:54
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199
#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:767
#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:770
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:193
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:410
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:414
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319
@ -115,8 +115,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:405
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:877
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1003
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:880
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1006
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:179
#: /home/kovid/work/calibre/src/calibre/library/cli.py:281
#: /home/kovid/work/calibre/src/calibre/library/database.py:913
@ -380,12 +380,15 @@ msgid "Communicate with the Blackberry smart phone."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13
#: /home/kovid/work/calibre/src/calibre/devices/iriver/driver.py:16
#: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18
#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:88
msgid "Kovid Goyal"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/boox/driver.py:17
msgid "Communicate with the BOOX eBook reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/cybookg3/driver.py:22
msgid "Communicate with the Cybook Gen 3 eBook reader."
msgstr ""
@ -439,19 +442,15 @@ msgstr ""
msgid "Communicate with the JetBook eBook reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:23
msgid "James Ralston"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:22
msgid "Communicate with the Kindle eBook reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:66
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:67
msgid "Communicate with the Kindle 2 eBook reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:77
msgid "Communicate with the Kindle DX eBook reader."
msgstr ""
@ -605,71 +604,71 @@ msgstr ""
msgid "Removing books from device metadata listing..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:196
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:200
msgid "Rendered %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:199
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:203
msgid "Failed %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:256
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:260
msgid ""
"Failed to process comic: \n"
"\n"
"%s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:274
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:278
msgid "Number of colors for grayscale image conversion. Default: %default. Values of less than 256 may result in blurred text on your device if you are creating your comics in EPUB format."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:278
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:282
msgid "Disable normalize (improve contrast) color range for pictures. Default: False"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:281
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:285
msgid "Maintain picture aspect ratio. Default is to fill the screen."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:283
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:287
msgid "Disable sharpening."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:285
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:289
msgid "Disable trimming of comic pages. For some comics, trimming might remove content as well as borders."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:288
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:292
msgid "Don't split landscape images into two portrait images"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:290
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:294
msgid "Keep aspect ratio and scale image using screen height as image width for viewing in landscape mode."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:293
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:297
msgid "Used for right-to-left publications like manga. Causes landscape pages to be split into portrait pages from right to left."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:297
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:301
msgid "Enable Despeckle. Reduces speckle noise. May greatly increase processing time."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:300
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:304
msgid "Don't sort the files found in the comic alphabetically by name. Instead use the order they were added to the comic."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:304
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:308
msgid "The format that images in the created ebook are converted to. You can experiment to see which format gives you optimal size and look on your device."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:308
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:312
msgid "Apply no processing to the image"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:434
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:445
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:438
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:449
msgid "Page"
msgstr ""
@ -728,7 +727,7 @@ msgstr ""
msgid "List builtin recipes"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:251
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:252
msgid "Output saved to"
msgstr ""
@ -1284,7 +1283,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:56
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:159
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:389
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1069
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1072
msgid "Title"
msgstr ""
@ -1292,7 +1291,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:57
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:160
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:394
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1070
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1073
msgid "Author(s)"
msgstr ""
@ -1319,8 +1318,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:370
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:166
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:339
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1013
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1073
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1016
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1076
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:96
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:125
msgid "Tags"
@ -1339,7 +1338,7 @@ msgid "Language"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1012
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1015
msgid "Timestamp"
msgstr ""
@ -2186,7 +2185,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:67
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
msgid "Form"
msgstr ""
@ -2773,7 +2772,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:1421
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431
msgid "Choose the format to view"
msgstr ""
@ -3266,7 +3265,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:86
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:346
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1008
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1011
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:92
msgid "Path"
msgstr ""
@ -3381,7 +3380,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:475
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:819
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1094
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1104
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error"
msgstr ""
@ -3451,7 +3450,7 @@ msgid "Access log:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:674
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:613
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:618
msgid "Failed to start content server"
msgstr ""
@ -4037,7 +4036,7 @@ msgid "Choose formats for "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:925
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:930
msgid "Books"
msgstr ""
@ -4456,7 +4455,7 @@ msgid "Send test mail from %s to:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:105
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115
msgid "&Test"
msgstr ""
@ -4632,7 +4631,7 @@ msgstr ""
msgid "Recipe source code (python)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:97
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107
msgid ""
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
@ -4643,31 +4642,31 @@ msgid ""
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Use the <span style=\" font-weight:600;\">Test</span> functionality below to test your regular expression on a few sample filenames. The group names for the various metadata entries are documented in tooltips.</p></body></html>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:104
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114
msgid "Regular &expression"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
msgid "File &name:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117
msgid "Test"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:108
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:118
msgid "Title:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
msgid "Regular expression (?P&lt;title&gt;)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:110
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:113
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:123
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:126
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:129
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:132
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:78
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:82
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87
@ -4676,35 +4675,35 @@ msgstr ""
msgid "No match"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:111
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121
msgid "Authors:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
msgid "Regular expression (?P<author>)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:124
msgid "Series:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:125
msgid "Regular expression (?P<series>)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:127
msgid "Series index:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:118
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:128
msgid "Regular expression (?P<series_index>)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:130
msgid "ISBN:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:131
msgid "Regular expression (?P<isbn>)"
msgstr ""
@ -4760,12 +4759,12 @@ msgid " - Jobs"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:161
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1071
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1074
msgid "Size (MB)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:162
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1072
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1075
msgid "Date"
msgstr ""
@ -4779,7 +4778,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:46
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:72
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:406
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:410
msgid "None"
msgstr ""
@ -4787,19 +4786,19 @@ msgstr ""
msgid "Book <font face=\"serif\">%s</font> of %s."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:835
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:838
msgid "Not allowed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:836
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:839
msgid "Dropping onto a device is not supported. First add the book to the calibre library."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1007
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1010
msgid "Format"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1061
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1064
msgid "Double click to <b>edit</b> me<br><br>"
msgstr ""
@ -5284,7 +5283,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:1523
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1539
msgid "Save only %s format to disk"
msgstr ""
@ -5319,31 +5318,31 @@ msgid "Calibre Library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:464
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1666
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1682
msgid "Choose a location for your ebook library."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:656
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:661
msgid "Browse by covers"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:773
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:778
msgid "Device: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:775
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:780
msgid " detected."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:798
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:804
msgid "Connected "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:810
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:816
msgid "Device database corrupted"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:811
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:817
msgid ""
"\n"
" <p>The database of books on the reader is corrupted. Try the following:\n"
@ -5354,260 +5353,264 @@ msgid ""
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:872
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:878
msgid "How many empty books?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:873
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:879
msgid "How many empty books should be added?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:917
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:960
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:923
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:970
msgid "Uploading books to device."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:926
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:931
msgid "EPUB Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:927
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:932
msgid "LRF Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:928
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:933
msgid "HTML Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:929
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:934
msgid "LIT Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:930
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:935
msgid "MOBI Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:931
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:936
msgid "Text books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:932
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:937
msgid "PDF Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:933
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:938
msgid "Comics"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:934
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:939
msgid "Archives"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:969
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:943
msgid "Supported books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:979
msgid "Failed to read metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:970
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:980
msgid "Failed to read metadata from the following"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:989
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:999
msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1016
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1026
msgid "Deleting books from device."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1047
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1057
msgid "Cannot download metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1048
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1105
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1138
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1163
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1276
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1058
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1115
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1148
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1173
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1286
msgid "No books selected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1063
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1073
msgid "social metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1065
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075
msgid "covers"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1065
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075
msgid "metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1067
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1077
msgid "Downloading %s for %d book(s)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1089
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1099
msgid "Failed to download some metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1090
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1100
msgid "Failed to download metadata for the following:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1093
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1103
msgid "Failed to download metadata:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1104
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1137
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1114
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1147
msgid "Cannot edit metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1162
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1172
msgid "Cannot save to disk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1165
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1175
msgid "Choose destination directory"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1192
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1202
msgid "Error while saving"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1193
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1203
msgid "There was an error while saving."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1200
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1201
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1210
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211
msgid "Could not save some books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1202
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1212
msgid "Click the show details button to see which ones."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1221
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1231
msgid "Fetching news from "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1235
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1245
msgid " fetched."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1275
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285
msgid "Cannot convert"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1304
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1314
msgid "Starting conversion of %d book(s)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1415
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1434
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1425
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1444
msgid "No book selected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1415
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1465
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1425
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1481
msgid "Cannot view"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1433
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1443
msgid "Cannot open folder"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1450
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1465
msgid "Multiple Books Selected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1451
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1466
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:1466
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1482
msgid "%s has no available formats."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1507
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1523
msgid "Cannot configure"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1508
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1524
msgid "Cannot configure while there are running jobs."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1551
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1567
msgid "No detailed info available"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1552
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1568
msgid "No detailed information is available for books on the device."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1604
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1620
msgid "Error talking to device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1605
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1621
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:1628
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1644
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1662
msgid "Conversion Error"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1629
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645
msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using third party tools."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1647
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1663
msgid "<b>Failed</b>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1675
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1691
msgid "Invalid library location"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1676
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1692
msgid "Could not access %s. Using %s as the library."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1724
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1740
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:1749
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1765
msgid "There are active jobs. Are you sure you want to quit?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1752
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1768
msgid ""
" is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1756
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1772
msgid "WARNING: Active jobs"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1808
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1824
msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1827
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1843
msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1835
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1851
msgid "Update available"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1836
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1852
msgid "%s has been updated to version %s. See the <a href=\"http://calibre-ebook.com/whats-new\">new features</a>. Visit the download page?"
msgstr ""
@ -6042,23 +6045,23 @@ msgstr ""
msgid "Click to see the books on storage card B in your reader"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:496
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:500
msgid "Change Case"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:497
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:501
msgid "Upper Case"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:498
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:502
msgid "Lower Case"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:499
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:503
msgid "Swap Case"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:500
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:504
msgid "Title Case"
msgstr ""
@ -6643,16 +6646,16 @@ msgid ""
"Start the calibre content server."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:49
#: /home/kovid/work/calibre/src/calibre/utils/config.py:48
msgid ""
"%sUsage%s: %s\n"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:93
#: /home/kovid/work/calibre/src/calibre/utils/config.py:92
msgid "Created by "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:94
#: /home/kovid/work/calibre/src/calibre/utils/config.py:93
msgid "Whenever you pass arguments to %prog that have spaces in them, enclose the arguments in quotation marks."
msgstr ""

View File

@ -11,7 +11,6 @@ from copy import deepcopy
from functools import partial
from optparse import OptionParser as _OptionParser
from optparse import IndentedHelpFormatter
from PyQt4.QtCore import QString
from calibre.constants import terminal_controller, iswindows, isosx, \
__appname__, __version__, __author__, plugins
from calibre.utils.lock import LockError, ExclusiveFile
@ -365,6 +364,7 @@ class OptionSet(object):
if val is val is True or val is False or val is None or \
isinstance(val, (int, float, long, basestring)):
return repr(val)
from PyQt4.QtCore import QString
if isinstance(val, QString):
return repr(unicode(val))
pickle = cPickle.dumps(val, -1)
@ -722,26 +722,4 @@ def migrate():
p.set('migrated', True)
if __name__ == '__main__':
import subprocess
from PyQt4.Qt import QByteArray
c = Config('test', 'test config')
c.add_opt('one', ['-1', '--one'], help="This is option #1")
c.set('one', u'345')
c.add_opt('two', help="This is option #2")
c.set('two', 345)
c.add_opt('three', help="This is option #3")
c.set('three', QString(u'aflatoon'))
c.add_opt('four', help="This is option #4")
c.set('four', QByteArray('binary aflatoon'))
subprocess.call(['pygmentize', os.path.expanduser('~/.config/calibre/test.py')])
opts = c.parse()
for i in ('one', 'two', 'three', 'four'):
print i, repr(getattr(opts, i))

View File

@ -1063,7 +1063,7 @@ class BasicNewsRecipe(Recipe):
return parsed_feeds
@classmethod
def tag_to_string(self, tag, use_alt=True):
def tag_to_string(self, tag, use_alt=True, normalize_whitespace=True):
'''
Convenience method to take a
`BeautifulSoup <http://www.crummy.com/software/BeautifulSoup/documentation.html>`_
@ -1090,7 +1090,10 @@ class BasicNewsRecipe(Recipe):
strings.append(res)
elif use_alt and item.has_key('alt'):
strings.append(item['alt'])
return u''.join(strings)
ans = u''.join(strings)
if normalize_whitespace:
ans = re.sub(r'\s+', ' ', ans)
return ans
@classmethod
def soup(cls, raw):