Sync to trunk

This commit is contained in:
John Schember 2009-03-07 13:20:21 -05:00
commit d24c879e47
43 changed files with 765 additions and 483 deletions

View File

@ -37,6 +37,7 @@ def freeze():
'/usr/lib/libpoppler.so.4',
'/usr/lib/libxml2.so.2',
'/usr/lib/libdbus-1.so.3',
'/usr/lib/libopenjpeg.so.2',
'/usr/lib/libxslt.so.1',
'/usr/lib/libxslt.so.1',
'/usr/lib/libgthread-2.0.so.0',

View File

@ -34,8 +34,8 @@ python = os.path.join(base_dir, 'MacOS', 'python')
loader_path = os.path.join(dirpath, base_name+'.py')
loader = open(loader_path, 'w')
site_packages = glob.glob(resources_dir+'/lib/python*/site-packages.zip')[0]
print >>loader, '#!'+python
print >>loader, 'import sys'
print >>loader, 'sys.argv[0] =', repr(os.path.basename(path))
print >>loader, 'if', repr(dirpath), 'in sys.path: sys.path.remove(', repr(dirpath), ')'
print >>loader, 'sys.path.append(', repr(site_packages), ')'
print >>loader, 'sys.frozen = "macosx_app"'
@ -49,7 +49,8 @@ os.environ['PYTHONHOME'] = resources_dir
os.environ['FC_CONFIG_DIR'] = os.path.join(resources_dir, 'fonts')
os.environ['MAGICK_HOME'] = os.path.join(frameworks_dir, 'ImageMagick')
os.environ['DYLD_LIBRARY_PATH'] = os.path.join(frameworks_dir, 'ImageMagick', 'lib')
os.execv(loader_path, sys.argv)
args = [path, loader_path] + sys.argv[1:]
os.execv(python, args)
'''
CHECK_SYMLINKS_PRESCRIPT = \
r'''

View File

@ -2,7 +2,7 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
__appname__ = 'calibre'
__version__ = '0.4.142'
__version__ = '0.4.143'
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
'''
Various run time constants.

View File

@ -196,8 +196,8 @@ to auto-generate a Table of Contents.
'an overview of the NCX format.'))
toc('use_auto_toc', ['--use-auto-toc'], default=False,
help=_('Normally, if the source file already has a Table of Contents, '
'it is used in preference to the autodetected one. '
'With this option, the autodetected one is always used.'))
'it is used in preference to the auto-generated one. '
'With this option, the auto-generated one is always used.'))
layout = c.add_group('page layout', _('Control page layout'))
layout('margin_top', ['--margin-top'], default=5.0,

View File

@ -640,7 +640,7 @@ class Processor(Parser):
name = self.htmlfile_map[self.htmlfile.path]
href = 'content/'+name
# Add level 1 and level 2 TOC items
# Add level* TOC items
counter = 0
def elem_to_link(elem, href, counter):
@ -711,6 +711,8 @@ class Processor(Parser):
if len(toc) > 0:
# Detected TOC entries using --level* options
# so aborting all other toc processing
return
# Add chapters to TOC
if not self.opts.no_chapters_in_toc:
@ -795,7 +797,8 @@ class Processor(Parser):
self.external_stylesheets, self.stylesheet = [], self.css_parser.parseString('')
self.specified_override_css = []
for link in self.root.xpath('//link'):
if 'css' in link.get('type', 'text/css').lower():
ltype = link.get('type', link.get('rel', 'text/css')).lower()
if 'css' in ltype or 'style' in ltype:
file = os.path.join(self.tdir, *(link.get('href', '').split('/')))
if file and not 'http:' in file:
if not parsed_sheets.has_key(file):
@ -845,7 +848,12 @@ class Processor(Parser):
except:
size = '3'
if size and size.strip() and size.strip()[0] in ('+', '-'):
size = 3 + float(size) # Hack assumes basefont=3
size = re.search(r'[+-]{0,1}[\d\.]+', size)
try:
size = float(size.group())
except:
size = 0
size += 3 # Hack assumes basefont=3
try:
setting = 'font-size: %d%%;'%int((float(size)/3) * 100)
except ValueError:

View File

@ -479,7 +479,7 @@ class HTMLConverter(object, LoggingInterface):
pprop.update(self.pseudo_css[tagname])
if tag.has_key("class"):
cls = tag["class"].lower()
for cls in cls.split():
for cls in cls.split():
for classname in ["."+cls, tagname+"."+cls]:
if self.css.has_key(classname):
prop.update(self.css[classname])

View File

@ -6,8 +6,6 @@ from __future__ import with_statement
__license__ = 'GPL v3'
__copyright__ = '2008, Marshall T. Vandegrift <llasram@gmail.cam>'
import sys
import os
import copy
import re
from lxml import etree
@ -187,7 +185,7 @@ class MobiMLizer(object):
while vspace > 0:
wrapper.addprevious(etree.Element(XHTML('br')))
vspace -= 1
if istate.halign != 'auto':
if istate.halign != 'auto' and isinstance(istate.halign, (str, unicode)):
para.attrib['align'] = istate.halign
pstate = bstate.istate
if tag in CONTENT_TAGS:

View File

@ -22,7 +22,7 @@ from calibre.ebooks.mobi.huffcdic import HuffReader
from calibre.ebooks.mobi.palmdoc import decompress_doc
from calibre.ebooks.mobi.langcodes import main_language, sub_language
from calibre.ebooks.metadata import MetaInformation
from calibre.ebooks.metadata.opf2 import OPFCreator
from calibre.ebooks.metadata.opf2 import OPFCreator, OPF
from calibre.ebooks.metadata.toc import TOC
from calibre import sanitize_file_name
@ -126,6 +126,8 @@ class BookHeader(object):
self.exth_flag, = struct.unpack('>L', raw[0x80:0x84])
self.exth = None
if not isinstance(self.title, unicode):
self.title = self.title.decode(self.codec, 'replace')
if self.exth_flag & 0x40:
self.exth = EXTHHeader(raw[16+self.length:], self.codec, self.title)
self.exth.mi.uid = self.unique_id
@ -138,6 +140,8 @@ class MobiReader(object):
def __init__(self, filename_or_stream, verbose=False):
self.verbose = verbose
self.embedded_mi = None
if hasattr(filename_or_stream, 'read'):
stream = filename_or_stream
stream.seek(0)
@ -213,7 +217,10 @@ class MobiReader(object):
self.upshift_markup(root)
guides = root.xpath('//guide')
guide = guides[0] if guides else None
for elem in guides + root.xpath('//metadata'):
metadata_elems = root.xpath('//metadata')
if metadata_elems and self.book_header.exth is None:
self.read_embedded_metadata(root, metadata_elems[0], guide)
for elem in guides + metadata_elems:
elem.getparent().remove(elem)
htmlfile = os.path.join(output_dir,
sanitize_file_name(self.name)+'.html')
@ -233,7 +240,7 @@ class MobiReader(object):
f.write(raw)
self.htmlfile = htmlfile
if self.book_header.exth is not None:
if self.book_header.exth is not None or self.embedded_mi is not None:
if self.verbose:
print 'Creating OPF...'
ncx = cStringIO.StringIO()
@ -242,7 +249,33 @@ class MobiReader(object):
ncx = ncx.getvalue()
if ncx:
open(os.path.splitext(htmlfile)[0]+'.ncx', 'wb').write(ncx)
def read_embedded_metadata(self, root, elem, guide):
raw = '<package>'+html.tostring(elem, encoding='utf-8')+'</package>'
stream = cStringIO.StringIO(raw)
opf = OPF(stream)
self.embedded_mi = MetaInformation(opf)
if guide is not None:
for ref in guide.xpath('descendant::reference'):
if 'cover' in ref.get('type', '').lower():
href = ref.get('href', '')
if href.startswith('#'):
href = href[1:]
anchors = root.xpath('//*[@id="%s"]'%href)
if anchors:
cpos = anchors[0]
reached = False
for elem in root.iter():
if elem is cpos:
reached = True
if reached and elem.tag == 'img':
cover = elem.get('src', None)
self.embedded_mi.cover = cover
elem.getparent().remove(elem)
break
break
def cleanup_html(self):
if self.verbose:
print 'Cleaning up HTML...'
@ -331,10 +364,12 @@ class MobiReader(object):
pass
def create_opf(self, htmlfile, guide=None, root=None):
mi = self.book_header.exth.mi
mi = getattr(self.book_header.exth, 'mi', self.embedded_mi)
opf = OPFCreator(os.path.dirname(htmlfile), mi)
if hasattr(self.book_header.exth, 'cover_offset'):
opf.cover = 'images/%05d.jpg'%(self.book_header.exth.cover_offset+1)
elif mi.cover is not None:
opf.cover = mi.cover
manifest = [(htmlfile, 'text/x-oeb1-document')]
bp = os.path.dirname(htmlfile)
for i in getattr(self, 'image_names', []):
@ -361,7 +396,7 @@ class MobiReader(object):
continue
if reached and x.tag == 'a':
href = x.get('href', '')
if href:
if href and re.match('\w+://', href) is None:
try:
text = u' '.join([t.strip() for t in \
x.xpath('descendant::text()')])
@ -370,6 +405,8 @@ class MobiReader(object):
text = ent_pat.sub(entity_to_unicode, text)
tocobj.add_item(toc.partition('#')[0], href[1:],
text)
if reached and x.get('class', None) == 'mbp_pagebreak':
break
if tocobj is not None:
opf.set_toc(tocobj)
@ -435,7 +472,7 @@ class MobiReader(object):
def replace_page_breaks(self):
self.processed_html = self.PAGE_BREAK_PAT.sub(
'<div style="page-break-after: always; margin: 0; display: block" />',
'<div class="mbp_pagebreak" style="page-break-after: always; margin: 0; display: block" />',
self.processed_html)
def add_anchors(self):
@ -477,7 +514,11 @@ class MobiReader(object):
os.makedirs(output_dir)
image_index = 0
self.image_names = []
for i in range(self.book_header.first_image_index, self.num_sections):
start = self.book_header.first_image_index
if start > self.num_sections or start < 0:
# BAEN PRC files have bad headers
start=0
for i in range(start, self.num_sections):
if i in processed_records:
continue
processed_records.append(i)
@ -521,7 +562,7 @@ def option_parser():
parser = OptionParser(usage=_('%prog [options] myebook.mobi'))
parser.add_option('-o', '--output-dir', default='.',
help=_('Output directory. Defaults to current directory.'))
parser.add_option('--verbose', default=False, action='store_true',
parser.add_option('-v', '--verbose', default=False, action='store_true',
help='Useful for debugging.')
return parser

View File

@ -561,6 +561,7 @@ CYRILLIC SMALL LETTER YA:'FF:1103:&#x044F;
</ansicpg1251>
<ansicpg1252>
LATIN SMALL LETTER Y WITH DIAERESIS:'00:00:&#x00FF;
EURO SIGN:'80:8364:&#x20ac;
SINGLE LOW-9 QUOTATION MARK:'82:8218:&#x201A;
LATIN SMALL LETTER F WITH HOOK:'83:402:&#x0192;
DOUBLE LOW-9 QUOTATION MARK:'84:8222:&#x201E;

View File

@ -46,7 +46,7 @@ class AddFiles(Add):
def metadata_delivered(self, id, mi):
if self.is_canceled():
self.reading.wakeAll()
self.wake_up()
return
if not mi.title:
mi.title = os.path.splitext(self.names[id])[0]
@ -163,7 +163,7 @@ class AddRecursive(Add):
def metadata_delivered(self, id, mi):
if self.is_canceled():
self.reading.wakeAll()
self.wake_up()
return
self.emit(SIGNAL('processed(PyQt_PyObject,PyQt_PyObject)'),
mi.title, id)

View File

@ -320,11 +320,17 @@ class ConfigDialog(QDialog, Ui_Dialog):
layout.addWidget(QLabel(_('Error log:')))
el = QPlainTextEdit(d)
layout.addWidget(el)
el.setPlainText(open(log_error_file, 'rb').read().decode('utf8', 'replace'))
try:
el.setPlainText(open(log_error_file, 'rb').read().decode('utf8', 'replace'))
except IOError:
el.setPlainText('No error log found')
layout.addWidget(QLabel(_('Access log:')))
al = QPlainTextEdit(d)
layout.addWidget(al)
al.setPlainText(open(log_access_file, 'rb').read().decode('utf8', 'replace'))
try:
al.setPlainText(open(log_access_file, 'rb').read().decode('utf8', 'replace'))
except IOError:
el.setPlainText('No access log found')
d.show()
def set_server_options(self):

View File

@ -366,9 +366,14 @@ class SchedulerDialog(QDialog, Ui_Dialog):
def show_recipe(self, index):
recipe = self._model.data(index, Qt.UserRole)
self.current_recipe = recipe
self.title.setText(recipe.title)
self.author.setText(_('Created by: ') + recipe.author)
self.description.setText(recipe.description if recipe.description else '')
self.blurb.setText('''
<p>
<b>%(title)s</b><br>
%(cb)s %(author)s<br/>
%(description)s
</p>
'''%dict(title=recipe.title, cb=_('Created by: '), author=recipe.author,
description=recipe.description if recipe.description else ''))
self.allow_scheduling = False
schedule = -1 if recipe.schedule is None else recipe.schedule
if schedule < 1e5 and schedule >= 0:

View File

@ -55,252 +55,221 @@
<item row="0" column="1" >
<layout class="QVBoxLayout" name="verticalLayout_3" >
<item>
<widget class="QGroupBox" name="detail_box" >
<property name="title" >
<string>Schedule for download</string>
<widget class="QScrollArea" name="scrollArea" >
<property name="frameShape" >
<enum>QFrame::NoFrame</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4" >
<item>
<widget class="QLabel" name="title" >
<property name="font" >
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text" >
<string>title</string>
</property>
<property name="textFormat" >
<enum>Qt::PlainText</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="description" >
<property name="text" >
<string>description</string>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="author" >
<property name="text" >
<string>author</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="schedule" >
<property name="text" >
<string>&amp;Schedule for download:</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" native="1" name="widget" >
<property name="enabled" >
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2" >
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2" >
<item>
<widget class="QRadioButton" name="daily_button" >
<property name="text" >
<string>Every </string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="day" />
</item>
<item>
<widget class="QLabel" name="label_4" >
<property name="text" >
<string>at</string>
</property>
</widget>
</item>
<item>
<widget class="QTimeEdit" name="time" />
</item>
<item>
<spacer name="horizontalSpacer" >
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout" >
<item>
<widget class="QRadioButton" name="interval_button" >
<property name="text" >
<string>Every </string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="interval" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip" >
<string>Interval at which to download this recipe. A value of zero means that the recipe will be downloaded every hour.</string>
</property>
<property name="suffix" >
<string> days</string>
</property>
<property name="decimals" >
<number>1</number>
</property>
<property name="minimum" >
<double>0.000000000000000</double>
</property>
<property name="maximum" >
<double>365.100000000000023</double>
</property>
<property name="singleStep" >
<double>1.000000000000000</double>
</property>
<property name="value" >
<double>1.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="last_downloaded" >
<property name="text" >
<string/>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="account" >
<property name="title" >
<string>&amp;Account</string>
</property>
<layout class="QGridLayout" name="gridLayout_2" >
<item row="0" column="1" >
<widget class="QLineEdit" name="username" />
</item>
<item row="0" column="0" >
<widget class="QLabel" name="label_2" >
<property name="text" >
<string>&amp;Username:</string>
</property>
<property name="buddy" >
<cstring>username</cstring>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="label_3" >
<property name="text" >
<string>&amp;Password:</string>
</property>
<property name="buddy" >
<cstring>password</cstring>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QLineEdit" name="password" >
<property name="echoMode" >
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="2" column="0" >
<widget class="QCheckBox" name="show_password" >
<property name="text" >
<string>&amp;Show password</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label" >
<property name="text" >
<string>For the scheduling to work, you must leave calibre running.</string>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="download" >
<property name="text" >
<string>&amp;Download now</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
<property name="widgetResizable" >
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>361</width>
<height>500</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5" >
<property name="margin" >
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="detail_box" >
<property name="title" >
<string>Schedule for download</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4" >
<item>
<widget class="QLabel" name="blurb" >
<property name="text" >
<string>blurb</string>
</property>
<property name="textFormat" >
<enum>Qt::RichText</enum>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
<property name="openExternalLinks" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="schedule" >
<property name="text" >
<string>&amp;Schedule for download:</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" native="1" name="widget" >
<property name="enabled" >
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2" >
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2" >
<item>
<widget class="QRadioButton" name="daily_button" >
<property name="text" >
<string>Every </string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="day" />
</item>
<item>
<widget class="QLabel" name="label_4" >
<property name="text" >
<string>at</string>
</property>
</widget>
</item>
<item>
<widget class="QTimeEdit" name="time" />
</item>
<item>
<spacer name="horizontalSpacer" >
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout" >
<item>
<widget class="QRadioButton" name="interval_button" >
<property name="text" >
<string>Every </string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="interval" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip" >
<string>Interval at which to download this recipe. A value of zero means that the recipe will be downloaded every hour.</string>
</property>
<property name="suffix" >
<string> days</string>
</property>
<property name="decimals" >
<number>1</number>
</property>
<property name="minimum" >
<double>0.000000000000000</double>
</property>
<property name="maximum" >
<double>365.100000000000023</double>
</property>
<property name="singleStep" >
<double>1.000000000000000</double>
</property>
<property name="value" >
<double>1.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="last_downloaded" >
<property name="text" >
<string/>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="account" >
<property name="title" >
<string>&amp;Account</string>
</property>
<layout class="QGridLayout" name="gridLayout_2" >
<item row="0" column="1" >
<widget class="QLineEdit" name="username" />
</item>
<item row="0" column="0" >
<widget class="QLabel" name="label_2" >
<property name="text" >
<string>&amp;Username:</string>
</property>
<property name="buddy" >
<cstring>username</cstring>
</property>
</widget>
</item>
<item row="1" column="0" >
<widget class="QLabel" name="label_3" >
<property name="text" >
<string>&amp;Password:</string>
</property>
<property name="buddy" >
<cstring>password</cstring>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QLineEdit" name="password" >
<property name="echoMode" >
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="2" column="0" >
<widget class="QCheckBox" name="show_password" >
<property name="text" >
<string>&amp;Show password</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="label" >
<property name="text" >
<string>For the scheduling to work, you must leave calibre running.</string>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="download" >
<property name="text" >
<string>&amp;Download now</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1016 B

View File

@ -1568,6 +1568,8 @@ def main(args=sys.argv):
QCoreApplication.setApplicationName(APP_UID)
single_instance = None if SingleApplication is None else SingleApplication('calibre GUI')
if not singleinstance('calibre GUI'):
if len(args) > 1:
args[1] = os.path.abspath(args[1])
if single_instance is not None and single_instance.is_running() and \
single_instance.send_message('launched:'+repr(args)):
return 0

View File

@ -157,6 +157,7 @@ class ResultCache(SearchQueryParser):
def __init__(self):
self._map = self._map_filtered = self._data = []
self.first_sort = True
SearchQueryParser.__init__(self)
def __getitem__(self, row):
@ -269,24 +270,28 @@ class ResultCache(SearchQueryParser):
if ans != 0: return ans
return cmp(self._data[x][10], self._data[y][10])
def cmp(self, loc, x, y, str=True):
def cmp(self, loc, x, y, str=True, subsort=False):
try:
ans = cmp(self._data[x][loc].lower(), self._data[y][loc].lower()) if str else\
cmp(self._data[x][loc], self._data[y][loc])
except AttributeError: # Some entries may be None
ans = cmp(self._data[x][loc], self._data[y][loc])
if ans != 0: return ans
return cmp(self._data[x][11].lower(), self._data[y][11].lower())
if subsort and ans == 0:
return cmp(self._data[x][11].lower(), self._data[y][11].lower())
return ans
def sort(self, field, ascending):
def sort(self, field, ascending, subsort=False):
field = field.lower().strip()
if field in ('author', 'tag', 'comment'):
field += 's'
if field == 'date': field = 'timestamp'
elif field == 'title': field = 'sort'
elif field == 'authors': field = 'author_sort'
if self.first_sort:
subsort = True
self.first_sort = False
fcmp = self.seriescmp if field == 'series' else \
functools.partial(self.cmp, FIELD_MAP[field],
functools.partial(self.cmp, FIELD_MAP[field], subsort=subsort,
str=field not in ('size', 'rating', 'timestamp'))
self._map.sort(cmp=fcmp, reverse=not ascending)

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"

View File

@ -17,7 +17,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-02-26 19:09+0000\n"
"PO-Revision-Date: 2009-03-03 16:00+0000\n"
"PO-Revision-Date: 2009-03-04 20:00+0000\n"
"Last-Translator: Plazec <Unknown>\n"
"Language-Team: Czech <cs@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41
@ -2810,6 +2810,8 @@ msgstr ""
msgid ""
"Adjust the look of the generated ebook by specifying things like font sizes."
msgstr ""
"Upraví vzhled vytvořené elektronické knihy, například určením velikosti "
"písma."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:99
msgid "Specify the page layout settings like margins."
@ -2847,7 +2849,7 @@ msgstr "Chyba při čtení souboru"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:184
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:69
msgid "<p>There was an error reading from file: <br /><b>"
msgstr "<p>Chyba při čtení souboru: <br/><b>"
msgstr "<p>Chyba při čtení souboru: <br /><b>"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:129
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:190
@ -2905,7 +2907,7 @@ msgstr "Změnit &obálku:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368
msgid "Browse for an image to use as the cover of this book."
msgstr ""
msgstr "Vybete obrázkový soubor . který se použije jako obálka této knihy."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:472
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500
@ -2938,11 +2940,13 @@ msgid ""
"Change the author(s) of this book. Multiple authors should be separated by "
"an &. If the author name contains an &, use && to represent it."
msgstr ""
"Autor(ři) této knihy. Více autorů by mělo být odďeleno znakem & (ampersand). "
"Pokud jméno autora obsahuje znak &, zadejte ho jako &&."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:477
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505
msgid "Author So&rt:"
msgstr ""
msgstr "Autor ve tvaru \"&příjmení, jméno\"."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:478
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506
@ -3124,7 +3128,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:518
msgid "Automatic &chapter detection"
msgstr ""
msgstr "Automatické rozpoznávání &kapitol"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:519
msgid ""
@ -3136,71 +3140,71 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:520
msgid "&XPath:"
msgstr ""
msgstr "Výraz &XPath:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:521
msgid "Chapter &mark:"
msgstr ""
msgstr "&Značka kapitol:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:522
msgid "Automatic &Table of Contents"
msgstr ""
msgstr "Automatický &Obsah"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:523
msgid "Number of &links to add to Table of Contents"
msgstr ""
msgstr "&Počet odkazů, které budou přidány do Obsahu"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:524
msgid "Do not add &detected chapters to the Table of Contents"
msgstr ""
msgstr "&Nepřidávat automaticky rozpoznané kapitoly do Obsahu"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:525
msgid "Chapter &threshold"
msgstr ""
msgstr "Prahová úroveň &kapitol"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:526
msgid "&Force use of auto-generated Table of Contents"
msgstr ""
msgstr "&Vždy použít automaticky generovaný obsah"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:527
msgid "Level &1 TOC"
msgstr ""
msgstr "Obsah úrovně &1"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:528
msgid "Level &2 TOC"
msgstr ""
msgstr "Obsah úrovně &2"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:529
msgid "&Title for generated TOC"
msgstr ""
msgstr "Název vygenerovaného &Obsahu"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:530
msgid "Level &3 TOC"
msgstr ""
msgstr "Obsah úrovně &3"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:38
msgid "Author Sort"
msgstr ""
msgstr "Autor (seřadit jako)"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:40
msgid "ISBN"
msgstr ""
msgstr "ISBN"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:104
msgid "Cannot connect"
msgstr ""
msgstr "Spojení selhalo"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:105
msgid "You must specify a valid access key for isbndb.com"
msgstr ""
msgstr "Musíte zadat platný přístupový kód pro isbndb.com"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:139
msgid "Error fetching metadata"
msgstr ""
msgstr "Chyba přebírání metadat"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144
msgid "No metadata found"
msgstr ""
msgstr "Nenalezeny žádné metadata"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:144
msgid ""

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -17,7 +17,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

File diff suppressed because it is too large Load Diff

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -15,7 +15,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: de\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-02-26 19:09+0000\n"
"PO-Revision-Date: 2009-02-26 22:22+0000\n"
"Last-Translator: S. Dorscht <Unknown>\n"
"PO-Revision-Date: 2009-03-03 17:38+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"
@ -3209,11 +3209,11 @@ msgid ""
msgstr ""
"<p>Sie können mit Hilfe eines XPath Ausdrucks einstellen, wie Calibre "
"Seitenbegrenzungen erkennt. Zum Gebrauch von XPath Ausdrücken sehen Sie sich "
"das <a href=\\\"http://calibre.kovidgoyal.net/user_manual/xpath.html\\"
"\">XPath Tutorial</a> an. Die Seitenbegrenzungen sind nur hilfreich, wenn "
"eine Zuordnung von Seiten eines Papierbuches auf Punkte im eBook erfolgen "
"soll. Dies stellt ein, wo Adobe Digital Editions die Seitenzahlen am rechten "
"Rand darstellt.</p>"
"das <a href=\"http://calibre.kovidgoyal.net/user_manual/xpath.html\">XPath "
"Tutorial</a> an. Die Seitenbegrenzungen sind nur hilfreich, wenn eine "
"Zuordnung von Seiten eines Papierbuches auf Punkte im eBook erfolgen soll. "
"Dies stellt ein, wo Adobe Digital Editions die Seitenzahlen am rechten Rand "
"darstellt.</p>"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:516
msgid "&Boundary XPath:"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"X-Poedit-Country: RUSSIAN FEDERATION\n"
"X-Poedit-Language: Russian\n"

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-02-26 19:09+0000\n"
"PO-Revision-Date: 2009-02-18 20:47+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"PO-Revision-Date: 2009-03-05 12:30+0000\n"
"Last-Translator: Stano Sitar <Unknown>\n"
"Language-Team: Slovak <sk@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41
@ -356,6 +356,9 @@ msgid ""
"XPath expression to detect page boundaries for building a custom pagination "
"map, as used by AdobeDE. Default is not to build an explicit pagination map."
msgstr ""
"Výraz XPath pre rozoznanie hranice strany pre vytvorenie mapy strán, tak ako "
"je použitý v AdobeDE. Prednastavená hodnota je nevytvárať explicitnú mapu "
"strán."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:161
msgid ""
@ -363,6 +366,8 @@ msgid ""
"relative to its boundary element. Default is to number all pages staring "
"with 1."
msgstr ""
"Výraz XPath pre zistenie mena každej strany v mape strán vo vzťahu k jej "
"hraničnému prvku. Prednastavená hodnota je číslovať všetky strany od 1."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:165
msgid ""
@ -422,6 +427,9 @@ msgid ""
"of Contents at level three. Each entry is added under the previous level two "
"entry."
msgstr ""
"Výraz XPath ktorý špecifikuje všetky návestia (tagy) ktoré majú byť pridané "
"do Obsahu na úrovni tri. Každá hodnota je zadaná pod existujúcou hodnotou "
"úrovne tri."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:192
msgid ""
@ -3134,14 +3142,20 @@ msgid ""
"pages in a paper book, to locations in the e-book. This controls where Adobe "
"Digital Editions displays the page numbers in the right margin.</p>"
msgstr ""
"<p>Pomocou XPath výrazu môžte ovplyvniť ako Calibre určuje hranice strán. "
"Aby ste sa dozvedeli o použití XPath výrazov, navštívte <a "
"href=\"http://calibre.kovidgoyal.net/user_manual/xpath.html\">XPath "
"tutorial</a>. Hranice strán sú užitočné iba keď chcete namapovať strany z "
"papierovej knihy na presné umiestnenie v e-knihe. Toto určí kde Adobe "
"Digital Editions zobrazí čísla strán na pravom okraji strany.</p>"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:516
msgid "&Boundary XPath:"
msgstr ""
msgstr "&Hraničná XPath:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:517
msgid "&Name XPath:"
msgstr ""
msgstr "&Názov XPath:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:518
msgid "Automatic &chapter detection"
@ -3154,6 +3168,10 @@ msgid ""
"href=\"http://calibre.kovidgoyal.net/user_manual/xpath.html\">XPath "
"tutorial</a></p>"
msgstr ""
"<p>Pomocou XPath výrazu môžte ovplyvniť ako Calibre určuje hranice strán. "
"Aby ste sa dozvedeli o použití XPath výrazov, navštívte <a "
"href=\"http://calibre.kovidgoyal.net/user_manual/xpath.html\">XPath "
"tutorial</a>.</p>"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:520
msgid "&XPath:"
@ -3299,7 +3317,7 @@ msgstr "Štandardné nastavenie prevodu"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:258
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:341
msgid "No preprocessing"
msgstr ""
msgstr "Žiaden pre-processing."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:261
msgid ""
@ -3833,7 +3851,7 @@ msgstr "Každých "
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:173
msgid "at"
msgstr ""
msgstr "na"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:175
msgid ""
@ -3876,7 +3894,7 @@ msgstr "Mazať správy staršie ako "
#: /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
msgid "Form"
msgstr ""
msgstr "Z"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36
msgid "contains"
@ -4196,6 +4214,26 @@ msgid ""
"expression on a few sample filenames. The group names for the various "
"metadata entries are documented in tooltips.</p></body></html>"
msgstr ""
"<!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"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'DejaVu Sans'; font-size:10pt; "
"font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-"
"right:0px; -qt-block-indent:0; text-indent:0px;\">Zadajte Regulárny výraz "
"ktorý sa použije na odhadnutie metadát z e-knihy z názvu súboru. </p>\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-"
"right:0px; -qt-block-indent:0; text-indent:0px;\">K dispozícii je <a "
"href=\"http://docs.python.org/lib/re-syntax.html\"><span style=\" text-"
"decoration: underline; color:#0000ff;\">Referencia</span></a> na syntax "
"Regulárnych výrazov.</p>\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-"
"right:0px; -qt-block-indent:0; text-indent:0px;\">Použite <span style=\" "
"font-weight:600;\">Test</span> test funkcionalitu tu dole aby ste otestovali "
"váš relulárny výraz na vzorke niekoľkých názvov súborov. Skupinové mená pre "
"jednotlivé metadáta sú dokumentované v bublinovej nápovede</p></body></html>"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:104
msgid "Regular &expression"
@ -4698,7 +4736,7 @@ msgstr "Odosielam správy do zariadenia."
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:900
msgid "Choose format to send to device"
msgstr ""
msgstr "Vyberte formát na poslanie do zariadenia"
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:954
msgid "Sending books to device."
@ -5050,7 +5088,7 @@ msgstr "Knihy s rovnakými tagmi"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:372
msgid "Send specific format to device"
msgstr ""
msgstr "Pošlite konkrétny formát do zariadenia"
#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:18
msgid ""
@ -5250,7 +5288,7 @@ msgstr "Pozícia v knihe"
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:208
msgid "/Unknown"
msgstr ""
msgstr "/Neznámy"
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:213
msgid "Go to a reference. To get reference numbers, use the reference mode."
@ -5329,7 +5367,7 @@ msgstr "Prehliadač elektronických kníh"
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:153
msgid "toolBar"
msgstr ""
msgstr "Panel nástrojov"
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:156
msgid "Next page"
@ -5708,6 +5746,13 @@ msgid ""
"(in\n"
"an opf file). You can get id numbers from the list command.\n"
msgstr ""
"%prog export [options] ids\n"
"\n"
"Exportujte knihy špecifikované pomocou ids (zoznam oddelený čiarkami) na "
"súborový systém.\n"
"Operácia exportu uloží všetky formáty knihy, obrázok obalu knihy a metadáta "
"\n"
"(v súbore opf). ID čísla môžte distiť pomocou príkazu list.\n"
#: /home/kovid/work/calibre/src/calibre/library/cli.py:496
msgid "Export all books in database, ignoring the list of ids."
@ -5939,11 +5984,16 @@ msgid ""
"If you specify this option, any argument to %prog is ignored and a default "
"recipe is used to download the feeds."
msgstr ""
"Zadajte zoznam \"feedov\" na stiahnutie. Napríklad:\n"
"\"['http://feeds.newsweek.com/newsweek/TopNews', "
"'http://feeds.newsweek.com/headlines/politics']\"\n"
"Ak využijetre túto voľbu, akýkoľvek argument pre %prog je ignorovaný a "
"prednastavený recept je určený aby stiahol \"feed-y\""
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:37
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:94
msgid "Be more verbose while processing."
msgstr ""
msgstr "Použi viac hlášok pri spracovaní"
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:39
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:96
@ -5969,6 +6019,8 @@ msgid ""
"Number of levels of links to follow on webpages that are linked to from "
"feeds. Defaul %default"
msgstr ""
"Počet úrovní odkazov ktoré sa budú nasledovať na stránkach, ktoré sú "
"prilinkované vo feedoch. Prednastavená hodnota %default"
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:53
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:103
@ -5976,6 +6028,8 @@ msgid ""
"The directory in which to store the downloaded feeds. Defaults to the "
"current directory."
msgstr ""
"Adresár kam sa ukladajú stiahnuté feedy. Prednastavená hodnota je aktuálny "
"adresár."
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:55
msgid "Don't show the progress bar"
@ -5992,6 +6046,8 @@ msgid ""
"Useful for recipe development. Forces max_articles_per_feed to 2 and "
"downloads at most 2 feeds."
msgstr ""
"Užitečné na vývoj (testovanie pri vývoji) receptov. Natvrdo nastaví hodnotu "
"max_articles_per_feed (max. článkov pre feed) na 2 a stiahne najviac 2 feedy."
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:63
msgid ""
@ -6013,6 +6069,23 @@ msgid ""
"Available builtin recipes are:\n"
"%s\n"
msgstr ""
"%%prog [options] ARG\n"
"\n"
"%%prog spracuje on-line zdroj článkov, ako napríklad RSS alebo ATOM feed a\n"
"stiahne obsah článku zorganizovaný v peknej hierarchii.\n"
"\n"
"ARG môže byť jeden z:\n"
"\n"
"názov súboru - %%prog sa pokúsi načítať recept zo súboru\n"
"\n"
"názov receptu zabudovaného v Calibre - %%prog načíta zabudovaný recept a "
"použije ho n astiahnutie feedu.. Pre napr. Newsweek alebo \"The BBC\" alebo "
"\"The New York Times\"\n"
"\n"
"recept ako reťazac - %%prog načíta recept priamo z reťazca.\n"
"\n"
"K dispozícii sú nasledujúce zabudované recepty:\n"
"%s\n"
#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:87
msgid ""
@ -6277,7 +6350,7 @@ msgstr "Nemčina"
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_hindu.py:12
msgid "Kovid Goyal"
msgstr ""
msgstr "Kovid Goyal"
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_jutarnji.py:22
msgid "Croatian"
@ -6285,15 +6358,15 @@ msgstr "Chorvátština"
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_la_republica.py:6
msgid "Italian"
msgstr ""
msgstr "Taliančina"
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_le_monde.py:83
msgid "Skipping duplicated article: %s"
msgstr ""
msgstr "Preskakujem duplicitný článok: %s"
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_le_monde.py:88
msgid "Skipping filtered article: %s"
msgstr ""
msgstr "Preskakujem odfiltrovaný článok: %s"
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:454
msgid ""

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-03-03 17:04+0000\n"
"X-Launchpad-Export-Date: 2009-03-06 17:12+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41

View File

@ -7,7 +7,7 @@ Builtin recipes.
recipe_modules = ['recipe_' + r for r in (
'newsweek', 'atlantic', 'economist', 'portfolio',
'nytimes', 'usatoday', 'outlook_india', 'bbc', 'greader', 'wsj',
'wired', 'globe_and_mail', 'smh', 'espn', 'business_week',
'wired', 'globe_and_mail', 'smh', 'espn', 'business_week', 'miami_herald',
'ars_technica', 'upi', 'new_yorker', 'irish_times', 'iht', 'lanacion',
'discover_magazine', 'scientific_american', 'new_york_review_of_books',
'daily_telegraph', 'guardian', 'el_pais', 'new_scientist', 'b92',

View File

@ -0,0 +1,53 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
'''
miamiherald.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class TheMiamiHerald(BasicNewsRecipe):
title = 'The Miami Herald'
__author__ = 'Darko Miletic'
description = "Miami-Dade and Broward's source for the latest breaking local news on sports, weather, business, jobs, real estate, shopping, health, travel, entertainment, & more."
oldest_article = 1
max_articles_per_feed = 100
publisher = u'The Miami Herald'
category = u'miami herald, weather, dolphins, news, miami news, local news, miamiherald, miami newspaper, miamiherald.com, miami, the miami herald, broward, miami-dade'
language = _('English')
no_stylesheets = True
use_embedded_content = False
encoding = 'cp1252'
remove_javascript = True
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
html2lrf_options = [
'--comment' , description
, '--category' , category
, '--publisher' , publisher
]
keep_only_tags = [dict(name='div', attrs={'id':'pageContainer'})]
feeds = [
(u'Breaking News' , u'http://www.miamiherald.com/416/index.xml' )
,(u'Miami-Dade' , u'http://www.miamiherald.com/460/index.xml' )
,(u'Broward' , u'http://www.miamiherald.com/467/index.xml' )
,(u'Florida Keys' , u'http://www.miamiherald.com/505/index.xml' )
,(u'Florida' , u'http://www.miamiherald.com/569/index.xml' )
,(u'Nation' , u'http://www.miamiherald.com/509/index.xml' )
,(u'World' , u'http://www.miamiherald.com/578/index.xml' )
,(u'Americas' , u'http://www.miamiherald.com/579/index.xml' )
,(u'Cuba' , u'http://www.miamiherald.com/581/index.xml' )
,(u'Haiti' , u'http://www.miamiherald.com/582/index.xml' )
,(u'Politics' , u'http://www.miamiherald.com/515/index.xml' )
,(u'Education' , u'http://www.miamiherald.com/295/index.xml' )
,(u'Environment' , u'http://www.miamiherald.com/573/index.xml' )
]
def print_version(self, url):
return url.replace('/story/','/v-print/story/')

View File

@ -68,10 +68,9 @@ class Newsweek(BasicNewsRecipe):
def parse_index(self):
ci = self.get_current_issue()
if not ci:
soup = self.get_current_issue()
if not soup:
raise RuntimeError('Unable to connect to newsweek.com. Try again later.')
soup = self.index_to_soup(ci)
img = soup.find(alt='Cover')
if img is not None and img.has_key('src'):
small = img['src']
@ -119,10 +118,10 @@ class Newsweek(BasicNewsRecipe):
return soup
def get_current_issue(self):
from urllib2 import urlopen # For some reason mechanize fails
home = urlopen('http://www.newsweek.com').read()
soup = BeautifulSoup(home)
#from urllib2 import urlopen # For some reason mechanize fails
#home = urlopen('http://www.newsweek.com').read()
soup = self.index_to_soup('http://www.newsweek.com')#BeautifulSoup(home)
img = soup.find('img', alt='Current Magazine')
if img and img.parent.has_key('href'):
return urlopen(img.parent['href']).read()
return self.index_to_soup(img.parent['href'])

View File

@ -3,7 +3,7 @@
__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
'''
nin.co.yu
nin.co.rs
'''
import re, urllib
@ -19,14 +19,17 @@ class Nin(BasicNewsRecipe):
oldest_article = 15
simultaneous_downloads = 1
delay = 1
encoding = 'utf8'
encoding = 'utf-8'
needs_subscription = True
PREFIX = 'http://www.nin.co.yu'
PREFIX = 'http://www.nin.co.rs'
INDEX = PREFIX + '/?change_lang=ls'
LOGIN = PREFIX + '/?logout=true'
FEED = PREFIX + '/misc/rss.php?feed=RSS2.0'
remove_javascript = True
use_embedded_content = False
language = _('Serbian')
language = _('Serbian')
lang = 'sr-RS'
direction = 'ltr'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{text-align: justify; font-family: serif1, serif} .article_description{font-family: sans1, sans-serif}'
html2lrf_options = [
@ -54,7 +57,7 @@ class Nin(BasicNewsRecipe):
keep_only_tags =[dict(name='td', attrs={'width':'520'})]
remove_tags_after =dict(name='html')
feeds =[(u'NIN', u'http://www.nin.co.yu/misc/rss.php?feed=RSS2.0')]
feeds =[(u'NIN', FEED)]
def get_cover_url(self):
cover_url = None
@ -65,8 +68,16 @@ class Nin(BasicNewsRecipe):
return cover_url
def preprocess_html(self, soup):
mtag = '<meta http-equiv="Content-Language" content="sr-Latn-RS"/>'
soup.html['lang'] = self.lang
soup.html['dir' ] = self.direction
mtag = '<meta http-equiv="Content-Language" content="' + self.lang + '"/>'
mtag += '\n<meta http-equiv="Content-Type" content="text/html; charset=' + self.encoding + '"/>'
soup.head.insert(0,mtag)
for item in soup.findAll(style=True):
del item['style']
del item['style']
return soup
def get_article_url(self, article):
raw = article.get('link', None)
return raw.replace('.co.yu','.co.rs')