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' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
# http://online.wsj.com/page/us_in_todays_paper.html # http://online.wsj.com/page/us_in_todays_paper.html
class WallStreetJournal(BasicNewsRecipe): class WallStreetJournal(BasicNewsRecipe):
title = 'The Wall Street Journal' title = 'The Wall Street Journal (US)'
__author__ = 'Kovid Goyal and Sujata Raman' __author__ = 'Kovid Goyal and Sujata Raman'
description = 'News and current affairs.' description = 'News and current affairs'
needs_subscription = True needs_subscription = True
language = 'en' language = 'en'
@ -60,60 +61,54 @@ class WallStreetJournal(BasicNewsRecipe):
return soup return soup
def get_article_url(self, article): def wsj_get_index(self):
try: return self.index_to_soup('http://online.wsj.com/page/us_in_todays_paper.html')
return article.feedburner_origlink.split('?')[0]
except AttributeError: def parse_index(self):
return article.link.split('?')[0] 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): def cleanup(self):
self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com') 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 from setup import isosx, iswindows, islinux
OSX_SDK = '/Developer/SDKs/MacOSX10.5.sdk' OSX_SDK = '/Developer/SDKs/MacOSX10.4u.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 NMAKE = RC = msvc = MT = win_inc = win_lib = None
if iswindows: if iswindows:
@ -117,24 +114,24 @@ if iswindows:
podofo_inc = os.path.join(sw_inc_dir, 'podofo') podofo_inc = os.path.join(sw_inc_dir, 'podofo')
podofo_lib = sw_lib_dir podofo_lib = sw_lib_dir
elif isosx: elif isosx:
fc_inc = '/Users/kovid/fontconfig/include/fontconfig' fc_inc = '/sw/include/fontconfig'
fc_lib = '/Users/kovid/fontconfig/lib' fc_lib = '/sw/lib'
poppler_inc_dirs = consolidate('POPPLER_INC_DIR', 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'] popplerqt4_inc_dirs = poppler_inc_dirs + [poppler_inc_dirs[0]+'/qt4']
poppler_lib_dirs = consolidate('POPPLER_LIB_DIR', poppler_lib_dirs = consolidate('POPPLER_LIB_DIR',
'/Volumes/sw/lib') '/sw/lib')
popplerqt4_lib_dirs = poppler_lib_dirs popplerqt4_lib_dirs = poppler_lib_dirs
poppler_libs = popplerqt4_libs = ['poppler'] poppler_libs = popplerqt4_libs = ['poppler']
podofo_inc = '/usr/local/include/podofo' podofo_inc = '/sw/podofo'
podofo_lib = '/usr/local/lib' podofo_lib = '/sw/lib'
magick_inc_dirs = consolidate('MAGICK_INC', magick_inc_dirs = consolidate('MAGICK_INC',
'/Users/kovid/ImageMagick/include/ImageMagick') '/sw/include/ImageMagick')
magick_lib_dirs = consolidate('MAGICK_LIB', magick_lib_dirs = consolidate('MAGICK_LIB',
'/Users/kovid/ImageMagick/lib') '/sw/lib')
magick_libs = ['MagickWand', 'MagickCore'] magick_libs = ['MagickWand', 'MagickCore']
png_inc_dirs = consolidate('PNG_INC_DIR', '/usr/local/include') png_inc_dirs = consolidate('PNG_INC_DIR', '/sw/include')
png_lib_dirs = consolidate('PNG_LIB_DIR', '/usr/local/lib') png_lib_dirs = consolidate('PNG_LIB_DIR', '/sw/lib')
png_libs = ['png12'] png_libs = ['png12']
else: else:
# Include directories # Include directories

View File

@ -83,7 +83,7 @@ linux_freeze2 = LinuxFreeze2()
from setup.installer.osx import OSX, OSX32 from setup.installer.osx import OSX, OSX32
osx = OSX() osx = OSX()
osx32 = OSX32() osx32 = OSX32()
from setup.installer.osx.freeze import OSX32_Freeze from setup.installer.osx.app.main import OSX32_Freeze
osx32_freeze = OSX32_Freeze() osx32_freeze = OSX32_Freeze()
from setup.installer.windows import Win, Win32 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, \ from setup.build_environment import fc_inc, fc_lib, \
fc_error, poppler_libs, poppler_lib_dirs, poppler_inc_dirs, podofo_inc, \ fc_error, poppler_libs, poppler_lib_dirs, poppler_inc_dirs, podofo_inc, \
podofo_lib, podofo_error, poppler_error, pyqt, OSX_SDK, NMAKE, \ 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_inc_dirs, magick_lib_dirs, png_lib_dirs, png_libs, \
magick_error, magick_libs, ft_lib_dirs, ft_libs, jpg_libs, jpg_lib_dirs magick_error, magick_libs, ft_lib_dirs, ft_libs, jpg_libs, jpg_lib_dirs
MT MT
@ -156,7 +156,7 @@ if islinux:
if isosx: if isosx:
x, p = ('x86_64', 'ppc64') if leopard_build else ('i386', 'ppc') x, p = ('i386', 'ppc')
archs = ['-arch', x, '-arch', p, '-isysroot', archs = ['-arch', x, '-arch', p, '-isysroot',
OSX_SDK] OSX_SDK]
cflags.append('-D_OSX') cflags.append('-D_OSX')
@ -305,7 +305,7 @@ class Build(Command):
obj_pat = 'release\\*.obj' if iswindows else '*.o' obj_pat = 'release\\*.obj' if iswindows else '*.o'
objects = glob.glob(obj_pat) objects = glob.glob(obj_pat)
if not objects or self.newer(objects, ext.sources+ext.headers): 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('''\ pro = textwrap.dedent('''\
TARGET = %s TARGET = %s
TEMPLATE = lib TEMPLATE = lib
@ -316,9 +316,6 @@ class Build(Command):
''')%(ext.name, ' '.join(ext.headers), ' '.join(ext.sources), archs) ''')%(ext.name, ' '.join(ext.headers), ' '.join(ext.sources), archs)
open(ext.name+'.pro', 'wb').write(pro) open(ext.name+'.pro', 'wb').write(pro)
subprocess.check_call([QMAKE, '-o', 'Makefile', ext.name+'.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']) subprocess.check_call([make, '-f', 'Makefile'])
objects = glob.glob(obj_pat) objects = glob.glob(obj_pat)
return list(map(self.a, objects)) return list(map(self.a, objects))
@ -354,12 +351,6 @@ class Build(Command):
makefile.extra_lflags = qt_objects makefile.extra_lflags = qt_objects
makefile.extra_include_dirs = ext.inc_dirs makefile.extra_include_dirs = ext.inc_dirs
makefile.generate() 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) subprocess.check_call([make, '-f', mf], cwd=src_dir)
shutil.copy2(module, dest) shutil.copy2(module, dest)

View File

@ -25,8 +25,9 @@ class OSX32(VMInstaller):
description = 'Build 32 bit OS X binary installer' description = 'Build 32 bit OS X binary installer'
INSTALLER_EXT = 'dmg' INSTALLER_EXT = 'dmg'
VM_NAME = 'tiger_build' VM_NAME = 'leopard_build'
VM = '/vmware/bin/%s'%VM_NAME VM = '/vmware/bin/%s'%VM_NAME
FREEZE_TEMPLATE = 'python -OO setup.py {freeze_command}'
FREEZE_COMMAND = 'osx32_freeze' FREEZE_COMMAND = 'osx32_freeze'
BUILD_PREFIX = VMInstaller.BUILD_PREFIX + ['source ~/.profile'] BUILD_PREFIX = VMInstaller.BUILD_PREFIX + ['source ~/.profile']
SHUTDOWN_CMD = ['sudo', 'halt'] 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, \ from setup import __version__ as VERSION, __appname__ as APPNAME, basenames, \
modules as main_modules, Command, SRC, functions as main_functions modules as main_modules, Command, SRC, functions as main_functions
LICENSE = open('LICENSE', 'rb').read() LICENSE = open('LICENSE', 'rb').read()
MAGICK_HOME='@executable_path/../Frameworks/ImageMagick'
ENV = dict( ENV = dict(
FC_CONFIG_DIR='@executable_path/../Resources/fonts', 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', QT_PLUGIN_PATH='@executable_path/../MacOS',
PYTHONIOENCODING='UTF-8', PYTHONIOENCODING='UTF-8',
) )
@ -46,9 +50,9 @@ def compile_launcher_lib(contents_dir, gcc, base):
src = join(base, 'util.c') src = join(base, 'util.c')
cmd = [gcc] + '-Wall -arch i386 -arch ppc -dynamiclib -std=gnu99'.split() + [src] + \ cmd = [gcc] + '-Wall -arch i386 -arch ppc -dynamiclib -std=gnu99'.split() + [src] + \
['-I'+base] + \ ['-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() + \ '-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', ['-install_name',
'@executable_path/../Frameworks/'+os.path.basename(dest)] + \ '@executable_path/../Frameworks/'+os.path.basename(dest)] + \
['-framework', 'Python', '-framework', 'CoreFoundation', '-headerpad_max_install_names'] ['-framework', 'Python', '-framework', 'CoreFoundation', '-headerpad_max_install_names']
@ -176,6 +180,8 @@ class Py2App(object):
self.create_plist() self.create_plist()
self.add_python_framework() self.add_python_framework()
self.add_site_packages()
self.add_stdlib()
self.add_qt_frameworks() self.add_qt_frameworks()
self.add_calibre_plugins() self.add_calibre_plugins()
self.add_podofo() self.add_podofo()
@ -186,8 +192,6 @@ class Py2App(object):
self.add_imagemagick() self.add_imagemagick()
self.add_misc_libraries() self.add_misc_libraries()
self.add_site_packages()
self.add_stdlib()
self.add_resources() self.add_resources()
self.compile_py_modules() self.compile_py_modules()
@ -262,8 +266,10 @@ class Py2App(object):
def get_local_dependencies(self, path_to_lib): def get_local_dependencies(self, path_to_lib):
for x in self.get_dependencies(path_to_lib): for x in self.get_dependencies(path_to_lib):
for y in (SW+'/lib/', '/usr/local/lib/', SW+'/qt/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 x.startswith(y):
if y == '/Library/Frameworks/Python.framework/':
y = '/Library/Frameworks/'
yield x, x[len(y):] yield x, x[len(y):]
break break
@ -289,7 +295,7 @@ class Py2App(object):
@flush @flush
def add_python_framework(self): def add_python_framework(self):
info('\nAdding Python framework') info('\nAdding Python framework')
src = join(SW, 'python', 'Python.framework') src = join('/Library/Frameworks', 'Python.framework')
x = join(self.frameworks_dir, 'Python.framework') x = join(self.frameworks_dir, 'Python.framework')
curr = os.path.realpath(join(src, 'Versions', 'Current')) curr = os.path.realpath(join(src, 'Versions', 'Current'))
currd = join(x, 'Versions', basename(curr)) currd = join(x, 'Versions', basename(curr))
@ -302,6 +308,7 @@ class Py2App(object):
@flush @flush
def add_qt_frameworks(self): def add_qt_frameworks(self):
info('\nAdding Qt Framework')
for f in ('QtCore', 'QtGui', 'QtXml', 'QtNetwork', 'QtSvg', 'QtWebkit', for f in ('QtCore', 'QtGui', 'QtXml', 'QtNetwork', 'QtSvg', 'QtWebkit',
'QtXmlPatterns', 'phonon'): 'QtXmlPatterns', 'phonon'):
self.add_qt_framework(f) self.add_qt_framework(f)
@ -360,7 +367,7 @@ class Py2App(object):
CFBundlePackageType='APPL', CFBundlePackageType='APPL',
CFBundleSignature='????', CFBundleSignature='????',
CFBundleExecutable='calibre', CFBundleExecutable='calibre',
LSMinimumSystemVersion='10.5.2', LSMinimumSystemVersion='10.4.2',
LSRequiresNativeExecution=True, LSRequiresNativeExecution=True,
NSAppleScriptEnabled=False, NSAppleScriptEnabled=False,
NSHumanReadableCopyright='Copyright 2008, Kovid Goyal', NSHumanReadableCopyright='Copyright 2008, Kovid Goyal',
@ -433,10 +440,7 @@ class Py2App(object):
for x in ('Wand', 'Core'): for x in ('Wand', 'Core'):
self.install_dylib(os.path.join(SW, 'lib', 'libMagick%s.2.dylib'%x)) self.install_dylib(os.path.join(SW, 'lib', 'libMagick%s.2.dylib'%x))
idir = glob.glob(os.path.join(SW, 'lib', 'ImageMagick-*'))[-1] idir = glob.glob(os.path.join(SW, 'lib', 'ImageMagick-*'))[-1]
dest = os.path.join(self.frameworks_dir, 'ImageMagick', 'lib') dest = os.path.join(self.frameworks_dir, 'ImageMagick')
if not os.path.exists(dest):
os.makedirs(dest)
dest = os.path.join(dest, os.path.basename(idir))
if os.path.exists(dest): if os.path.exists(dest):
shutil.rmtree(dest) shutil.rmtree(dest)
shutil.copytree(idir, dest, True) 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('/')])) paths = reversed(map(abspath, [x for x in sys.path if x.startswith('/')]))
upaths = [] upaths = []
for x in paths: for x in paths:
if x.endswith('/PIL') or 'site-packages' not in x: if x not in upaths and (x.endswith('.egg') or
continue x.endswith('/site-packages')):
if x not in upaths:
upaths.append(x) upaths.append(x)
upaths.append(os.path.expanduser('~/build/calibre/src')) upaths.append(os.path.expanduser('~/build/calibre/src'))
for x in upaths: for x in upaths:
info('\t', x)
tdir = None tdir = None
try: try:
if not os.path.isdir(x): if not os.path.isdir(x):
@ -536,7 +540,7 @@ class Py2App(object):
@flush @flush
def add_stdlib(self): def add_stdlib(self):
info('\nAdding python stdlib') 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 src += self.version_info
dest = join(self.resources_dir, 'Python', 'lib', 'python') dest = join(self.resources_dir, 'Python', 'lib', 'python')
dest += self.version_info dest += self.version_info

View File

@ -363,7 +363,7 @@ class NookOutput(OutputProfile):
description = _('This profile is intended for the B&N Nook.') description = _('This profile is intended for the B&N Nook.')
# Screen size is a best guess # Screen size is a best guess
screen_size = (600, 800) screen_size = (600, 770)
dpi = 167 dpi = 167
fbase = 16 fbase = 16
fsizes = [12, 12, 14, 16, 18, 20, 22, 24] 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 import os
from itertools import cycle
from calibre import islinux from calibre import islinux
from calibre.devices.usbms.driver import USBMS from calibre.devices.usbms.driver import USBMS

View File

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

View File

@ -111,7 +111,11 @@ class USBMS(CLI, Device):
paths.append(filepath) paths.append(filepath)
self.put_file(infile, filepath, replace_file=True) self.put_file(infile, filepath, replace_file=True)
self.upload_cover(os.path.dirname(filepath), os.path.splitext(os.path.basename(filepath))[0], mdata) 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...')) 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__) log('Created by:', __author__)
raise SystemExit(0) raise SystemExit(0)
if '--list-recipes' in args: 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:') log('Available recipes:')
for title in sorted(titles): titles = sorted(get_builtin_recipe_titles())
for title in titles:
try: try:
log('\t'+title) log('\t'+title)
except: except:

View File

@ -155,17 +155,19 @@ class EPUBOutput(OutputFormatPlugin):
def convert(self, oeb, output_path, input_plugin, opts, log): def convert(self, oeb, output_path, input_plugin, opts, log):
self.log, self.opts, self.oeb = log, opts, oeb 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 from calibre.ebooks.oeb.transforms.split import Split
split = Split(not self.opts.dont_split_on_page_breaks, split = Split(not self.opts.dont_split_on_page_breaks,
max_flow_size=self.opts.flow_size*1024 max_flow_size=self.opts.flow_size*1024
) )
split(self.oeb, self.opts) 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() self.insert_cover()
with TemporaryDirectory('_epub_output') as tdir: with TemporaryDirectory('_epub_output') as tdir:

View File

@ -381,9 +381,9 @@ class FlowSplitter(object):
p[i:i+1] = new_pres p[i:i+1] = new_pres
split_point, before = self.find_split_point(root) 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: if split_point is None:
raise SplitError(self.item.href, root) 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): for t in self.do_split(tree, split_point, before):
r = t.getroot() r = t.getroot()

View File

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

View File

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

View File

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

View File

@ -473,7 +473,7 @@ class LibraryDatabase2(LibraryDatabase):
def upgrade_version_2(self): def upgrade_version_2(self):
''' Fix Foreign key constraints for deleting from link tables. ''' ''' Fix Foreign key constraints for deleting from link tables. '''
script = textwrap.dedent('''\ 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 CREATE TRIGGER fkc_delete_on_%(table)s
BEFORE DELETE ON %(table)s BEFORE DELETE ON %(table)s
BEGIN BEGIN

View File

@ -5,8 +5,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.6.29\n" "Project-Id-Version: calibre 0.6.29\n"
"POT-Creation-Date: 2009-12-18 12:30+MST\n" "POT-Creation-Date: 2009-12-21 21:13+MST\n"
"PO-Revision-Date: 2009-12-18 12:30+MST\n" "PO-Revision-Date: 2009-12-21 21:13+MST\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n" "Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\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/customize/__init__.py:44
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:94 #: /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:58
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 #: /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:767
#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:770 #: /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/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:67
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319 #: /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/dialogs/scheduler.py:170
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 #: /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:405
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:877 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:880
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1003 #: /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/gui2/viewer/main.py:179
#: /home/kovid/work/calibre/src/calibre/library/cli.py:281 #: /home/kovid/work/calibre/src/calibre/library/cli.py:281
#: /home/kovid/work/calibre/src/calibre/library/database.py:913 #: /home/kovid/work/calibre/src/calibre/library/database.py:913
@ -380,12 +380,15 @@ msgid "Communicate with the Blackberry smart phone."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13 #: /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/nuut2/driver.py:18
#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:88 #: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:88
msgid "Kovid Goyal" msgid "Kovid Goyal"
msgstr "" 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 #: /home/kovid/work/calibre/src/calibre/devices/cybookg3/driver.py:22
msgid "Communicate with the Cybook Gen 3 eBook reader." msgid "Communicate with the Cybook Gen 3 eBook reader."
msgstr "" msgstr ""
@ -439,19 +442,15 @@ msgstr ""
msgid "Communicate with the JetBook eBook reader." msgid "Communicate with the JetBook eBook reader."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:23 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:22
msgid "James Ralston"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21
msgid "Communicate with the Kindle eBook reader." msgid "Communicate with the Kindle eBook reader."
msgstr "" 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." msgid "Communicate with the Kindle 2 eBook reader."
msgstr "" 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." msgid "Communicate with the Kindle DX eBook reader."
msgstr "" msgstr ""
@ -605,71 +604,71 @@ msgstr ""
msgid "Removing books from device metadata listing..." msgid "Removing books from device metadata listing..."
msgstr "" 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" msgid "Rendered %s"
msgstr "" 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" msgid "Failed %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:256 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:260
msgid "" msgid ""
"Failed to process comic: \n" "Failed to process comic: \n"
"\n" "\n"
"%s" "%s"
msgstr "" 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." 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 "" 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" msgid "Disable normalize (improve contrast) color range for pictures. Default: False"
msgstr "" 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." msgid "Maintain picture aspect ratio. Default is to fill the screen."
msgstr "" 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." msgid "Disable sharpening."
msgstr "" 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." msgid "Disable trimming of comic pages. For some comics, trimming might remove content as well as borders."
msgstr "" 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" msgid "Don't split landscape images into two portrait images"
msgstr "" 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." msgid "Keep aspect ratio and scale image using screen height as image width for viewing in landscape mode."
msgstr "" 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." msgid "Used for right-to-left publications like manga. Causes landscape pages to be split into portrait pages from right to left."
msgstr "" 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." msgid "Enable Despeckle. Reduces speckle noise. May greatly increase processing time."
msgstr "" 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." msgid "Don't sort the files found in the comic alphabetically by name. Instead use the order they were added to the comic."
msgstr "" 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." 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 "" 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" msgid "Apply no processing to the image"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:434 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:438
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:445 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:449
msgid "Page" msgid "Page"
msgstr "" msgstr ""
@ -728,7 +727,7 @@ msgstr ""
msgid "List builtin recipes" msgid "List builtin recipes"
msgstr "" 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" msgid "Output saved to"
msgstr "" 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/dialogs/fetch_metadata.py:56
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:159 #: /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:389
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1069 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:1072
msgid "Title" msgid "Title"
msgstr "" 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/dialogs/fetch_metadata.py:57
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:160 #: /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:394
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1070 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:1073
msgid "Author(s)" msgid "Author(s)"
msgstr "" msgstr ""
@ -1319,8 +1318,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:370 #: /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:166
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:339 #: /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:1016
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1073 #: /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/status.py:96
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:125
msgid "Tags" msgid "Tags"
@ -1339,7 +1338,7 @@ msgid "Language"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 #: /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" msgid "Timestamp"
msgstr "" 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/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/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/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 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107
msgid "Form" msgid "Form"
msgstr "" msgstr ""
@ -2773,7 +2772,7 @@ msgid "RB Output"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 #: /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" msgid "Choose the format to view"
msgstr "" 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:85
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:86 #: /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: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 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:92
msgid "Path" msgid "Path"
msgstr "" 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:475
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:819 #: /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: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 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error" msgid "Error"
msgstr "" msgstr ""
@ -3451,7 +3450,7 @@ msgid "Access log:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:674 #: /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" msgid "Failed to start content server"
msgstr "" msgstr ""
@ -4037,7 +4036,7 @@ msgid "Choose formats for "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 #: /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" msgid "Books"
msgstr "" msgstr ""
@ -4456,7 +4455,7 @@ msgid "Send test mail from %s to:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52 #: /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" msgid "&Test"
msgstr "" msgstr ""
@ -4632,7 +4631,7 @@ msgstr ""
msgid "Recipe source code (python)" msgid "Recipe source code (python)"
msgstr "" 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 "" msgid ""
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<!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" "<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>" "<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 "" 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" msgid "Regular &expression"
msgstr "" 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:" msgid "File &name:"
msgstr "" 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" msgid "Test"
msgstr "" 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:" msgid "Title:"
msgstr "" 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;)" msgid "Regular expression (?P&lt;title&gt;)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:123
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:126
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:129
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 #: /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:78
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:82
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:87
@ -4676,35 +4675,35 @@ msgstr ""
msgid "No match" msgid "No match"
msgstr "" 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:" msgid "Authors:"
msgstr "" 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>)" msgid "Regular expression (?P<author>)"
msgstr "" 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:" msgid "Series:"
msgstr "" 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>)" msgid "Regular expression (?P<series>)"
msgstr "" 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:" msgid "Series index:"
msgstr "" 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>)" msgid "Regular expression (?P<series_index>)"
msgstr "" 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:" msgid "ISBN:"
msgstr "" 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>)" msgid "Regular expression (?P<isbn>)"
msgstr "" msgstr ""
@ -4760,12 +4759,12 @@ msgid " - Jobs"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:161 #: /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)" msgid "Size (MB)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:162 #: /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" msgid "Date"
msgstr "" msgstr ""
@ -4779,7 +4778,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:46 #: /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:72
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:77 #: /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" msgid "None"
msgstr "" msgstr ""
@ -4787,19 +4786,19 @@ msgstr ""
msgid "Book <font face=\"serif\">%s</font> of %s." msgid "Book <font face=\"serif\">%s</font> of %s."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:835 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:838
msgid "Not allowed" msgid "Not allowed"
msgstr "" 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." msgid "Dropping onto a device is not supported. First add the book to the calibre library."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1007 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:1010
msgid "Format" msgid "Format"
msgstr "" 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>" msgid "Double click to <b>edit</b> me<br><br>"
msgstr "" msgstr ""
@ -5284,7 +5283,7 @@ msgid "Save to disk in a single directory"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306 #: /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" msgid "Save only %s format to disk"
msgstr "" msgstr ""
@ -5319,31 +5318,31 @@ msgid "Calibre Library"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:464 #: /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." msgid "Choose a location for your ebook library."
msgstr "" 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" msgid "Browse by covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:773 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:778
msgid "Device: " msgid "Device: "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:775 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:780
msgid " detected." msgid " detected."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:798 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:804
msgid "Connected " msgid "Connected "
msgstr "" 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" msgid "Device database corrupted"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:811 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:817
msgid "" msgid ""
"\n" "\n"
" <p>The database of books on the reader is corrupted. Try the following:\n" " <p>The database of books on the reader is corrupted. Try the following:\n"
@ -5354,260 +5353,264 @@ msgid ""
" " " "
msgstr "" 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?" msgid "How many empty books?"
msgstr "" 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?" msgid "How many empty books should be added?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:917 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:923
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:960 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:970
msgid "Uploading books to device." msgid "Uploading books to device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:926 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:931
msgid "EPUB Books" msgid "EPUB Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:932
msgid "LRF Books" msgid "LRF Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:928 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:933
msgid "HTML Books" msgid "HTML Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:929 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:934
msgid "LIT Books" msgid "LIT Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:930 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:935
msgid "MOBI Books" msgid "MOBI Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:931 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:936
msgid "Text books" msgid "Text books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:932 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:937
msgid "PDF Books" msgid "PDF Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:933 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:938
msgid "Comics" msgid "Comics"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:934 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:939
msgid "Archives" msgid "Archives"
msgstr "" 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" msgid "Failed to read metadata"
msgstr "" 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" msgid "Failed to read metadata from the following"
msgstr "" 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?" msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?"
msgstr "" 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." msgid "Deleting books from device."
msgstr "" 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" msgid "Cannot download metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1048 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1058
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1105 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1115
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1138 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1148
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1163 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1173
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1276 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1286
msgid "No books selected" msgid "No books selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1063 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1073
msgid "social metadata" msgid "social metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1065 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075
msgid "covers" msgid "covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1065 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075
msgid "metadata" msgid "metadata"
msgstr "" 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)" msgid "Downloading %s for %d book(s)"
msgstr "" 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" msgid "Failed to download some metadata"
msgstr "" 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:" msgid "Failed to download metadata for the following:"
msgstr "" 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:" msgid "Failed to download metadata:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1104 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1114
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1137 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1147
msgid "Cannot edit metadata" msgid "Cannot edit metadata"
msgstr "" 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" msgid "Cannot save to disk"
msgstr "" 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" msgid "Choose destination directory"
msgstr "" 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" msgid "Error while saving"
msgstr "" 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." msgid "There was an error while saving."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1200 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1210
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1201 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211
msgid "Could not save some books" msgid "Could not save some books"
msgstr "" 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." msgid "Click the show details button to see which ones."
msgstr "" 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 " msgid "Fetching news from "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1235 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1245
msgid " fetched." msgid " fetched."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1275 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285
msgid "Cannot convert" msgid "Cannot convert"
msgstr "" 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)" msgid "Starting conversion of %d book(s)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1415 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1425
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1434 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1444
msgid "No book selected" msgid "No book selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1415 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1425
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1465 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1481
msgid "Cannot view" msgid "Cannot view"
msgstr "" 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" msgid "Cannot open folder"
msgstr "" 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" msgid "Multiple Books Selected"
msgstr "" 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?" 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 "" 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." msgid "%s has no available formats."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1507 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1523
msgid "Cannot configure" msgid "Cannot configure"
msgstr "" 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." msgid "Cannot configure while there are running jobs."
msgstr "" 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" msgid "No detailed info available"
msgstr "" 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." msgid "No detailed information is available for books on the device."
msgstr "" 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" msgid "Error talking to device"
msgstr "" 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." msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1628 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1644
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1662
msgid "Conversion Error" msgid "Conversion Error"
msgstr "" 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." 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 "" 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>" msgid "<b>Failed</b>"
msgstr "" 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" msgid "Invalid library location"
msgstr "" 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." msgid "Could not access %s. Using %s as the library."
msgstr "" 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." 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 "" 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?" msgid "There are active jobs. Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1752 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1768
msgid "" msgid ""
" is communicating with the device!<br>\n" " is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n" " Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?" " Are you sure you want to quit?"
msgstr "" 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" msgid "WARNING: Active jobs"
msgstr "" 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." msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray."
msgstr "" 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>" msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1835 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1851
msgid "Update available" msgid "Update available"
msgstr "" 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?" 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 "" msgstr ""
@ -6042,23 +6045,23 @@ msgstr ""
msgid "Click to see the books on storage card B in your reader" msgid "Click to see the books on storage card B in your reader"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:496 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:500
msgid "Change Case" msgid "Change Case"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:497 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:501
msgid "Upper Case" msgid "Upper Case"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:498 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:502
msgid "Lower Case" msgid "Lower Case"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:499 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:503
msgid "Swap Case" msgid "Swap Case"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:500 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:504
msgid "Title Case" msgid "Title Case"
msgstr "" msgstr ""
@ -6643,16 +6646,16 @@ msgid ""
"Start the calibre content server." "Start the calibre content server."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:49 #: /home/kovid/work/calibre/src/calibre/utils/config.py:48
msgid "" msgid ""
"%sUsage%s: %s\n" "%sUsage%s: %s\n"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:93 #: /home/kovid/work/calibre/src/calibre/utils/config.py:92
msgid "Created by " msgid "Created by "
msgstr "" 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." msgid "Whenever you pass arguments to %prog that have spaces in them, enclose the arguments in quotation marks."
msgstr "" msgstr ""

View File

@ -11,7 +11,6 @@ from copy import deepcopy
from functools import partial from functools import partial
from optparse import OptionParser as _OptionParser from optparse import OptionParser as _OptionParser
from optparse import IndentedHelpFormatter from optparse import IndentedHelpFormatter
from PyQt4.QtCore import QString
from calibre.constants import terminal_controller, iswindows, isosx, \ from calibre.constants import terminal_controller, iswindows, isosx, \
__appname__, __version__, __author__, plugins __appname__, __version__, __author__, plugins
from calibre.utils.lock import LockError, ExclusiveFile 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 \ if val is val is True or val is False or val is None or \
isinstance(val, (int, float, long, basestring)): isinstance(val, (int, float, long, basestring)):
return repr(val) return repr(val)
from PyQt4.QtCore import QString
if isinstance(val, QString): if isinstance(val, QString):
return repr(unicode(val)) return repr(unicode(val))
pickle = cPickle.dumps(val, -1) pickle = cPickle.dumps(val, -1)
@ -722,26 +722,4 @@ def migrate():
p.set('migrated', True) 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 return parsed_feeds
@classmethod @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 Convenience method to take a
`BeautifulSoup <http://www.crummy.com/software/BeautifulSoup/documentation.html>`_ `BeautifulSoup <http://www.crummy.com/software/BeautifulSoup/documentation.html>`_
@ -1090,7 +1090,10 @@ class BasicNewsRecipe(Recipe):
strings.append(res) strings.append(res)
elif use_alt and item.has_key('alt'): elif use_alt and item.has_key('alt'):
strings.append(item['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 @classmethod
def soup(cls, raw): def soup(cls, raw):