From 7eaddf96097ac2d64058f4df8050730948edb703 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 9 Nov 2010 12:41:28 -0700 Subject: [PATCH 01/11] Fix not enough vertical space for text in the preferences dialog --- src/calibre/gui2/preferences/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/preferences/main.py b/src/calibre/gui2/preferences/main.py index 6653fe2b67..c82ddcc022 100644 --- a/src/calibre/gui2/preferences/main.py +++ b/src/calibre/gui2/preferences/main.py @@ -101,9 +101,9 @@ class Category(QWidget): # {{{ ac.setStatusTip(p.description) self.actions.append(ac) w = self.bar.widgetForAction(ac) - w.setStyleSheet('QToolButton { margin-right: 20px; min-width: 100px }') w.setCursor(Qt.PointingHandCursor) w.setAutoRaise(True) + w.setMinimumWidth(100) def triggered(self, plugin, *args): self.plugin_activated.emit(plugin) From 4c1a60d62d2430d737b169c359fe2195f7810a5e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 9 Nov 2010 13:17:13 -0700 Subject: [PATCH 02/11] Fix #7472 (Problems adding mobipocket books) --- src/calibre/ebooks/mobi/reader.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index dbe6854006..2ab1e75af8 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -221,7 +221,10 @@ class MetadataHeader(BookHeader): else: end = self.section_offset(number + 1) self.stream.seek(start) - return self.stream.read(end - start) + try: + return self.stream.read(end - start) + except OverflowError: + return self.stream.read(os.stat(self.stream.name).st_size - start) class MobiReader(object): From 77efdeaa53f0d07101f1745b0b85d7d96a8e5b20 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 9 Nov 2010 13:30:22 -0700 Subject: [PATCH 03/11] Fix #7478 (Suggested modification for Irish Times news feed) --- resources/recipes/irish_times.recipe | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/resources/recipes/irish_times.recipe b/resources/recipes/irish_times.recipe index ab37271638..14f31cf45f 100644 --- a/resources/recipes/irish_times.recipe +++ b/resources/recipes/irish_times.recipe @@ -33,13 +33,14 @@ class IrishTimes(BasicNewsRecipe): ('Letters', 'http://www.irishtimes.com/feeds/rss/newspaper/letters.rss'), ] - def print_version(self, url): - if url.count('rss.feedsportal.com'): - u = url.replace('0Bhtml/story01.htm','_pf0Bhtml/story01.htm') - else: - u = url.replace('.html','_pf.html') - return u + if url.count('rss.feedsportal.com'): + u = 'http://www.irishtimes.com' + \ + (((url[69:].replace('0C','/')).replace('0A','0'))).replace('0Bhtml/story01..htm','_pf.html') + else: + u = url.replace('.html','_pf.html') + return u + def get_article_url(self, article): return article.link From e9a8666518fceab572756de5d3ac2bbc1f6937af Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 9 Nov 2010 17:36:36 -0700 Subject: [PATCH 04/11] Fix #7481 (Creating EPUBs with non-standard internal html split names) --- src/calibre/ebooks/mobi/reader.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 2ab1e75af8..f0ccc93c9c 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -401,6 +401,8 @@ class MobiReader(object): elem.getparent().remove(elem) fname = self.name.encode('ascii', 'replace') fname = re.sub(r'[\x08\x15\0]+', '', fname) + if not fname: + fname = 'dummy' htmlfile = os.path.join(output_dir, ascii_filename(fname) + '.html') try: From 94277e1d7eeebc08b8579f7f4943597e2da9501d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 10 Nov 2010 07:16:13 -0700 Subject: [PATCH 05/11] Switch windows binaries to Qt 4.7 --- setup/extensions.py | 4 +++- setup/installer/windows/freeze.py | 2 +- setup/installer/windows/notes.rst | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/setup/extensions.py b/setup/extensions.py index d520cbf622..893ce1be39 100644 --- a/setup/extensions.py +++ b/setup/extensions.py @@ -348,8 +348,10 @@ class Build(Command): VERSION = 1.0.0 CONFIG += %s ''')%(ext.name, ' '.join(ext.headers), ' '.join(ext.sources), archs) + pro = pro.replace('\\', '\\\\') open(ext.name+'.pro', 'wb').write(pro) - subprocess.check_call([QMAKE, '-o', 'Makefile', ext.name+'.pro']) + subprocess.check_call([QMAKE, '-o', 'Makefile', '-spec', + 'win32-msvc2008', ext.name+'.pro']) subprocess.check_call([make, '-f', 'Makefile']) objects = glob.glob(obj_pat) return list(map(self.a, objects)) diff --git a/setup/installer/windows/freeze.py b/setup/installer/windows/freeze.py index 29809907ab..35fe78b13b 100644 --- a/setup/installer/windows/freeze.py +++ b/setup/installer/windows/freeze.py @@ -13,7 +13,7 @@ from setup import Command, modules, functions, basenames, __version__, \ from setup.build_environment import msvc, MT, RC from setup.installer.windows.wix import WixMixIn -QT_DIR = 'C:\\Qt\\4.6.3' +QT_DIR = 'Q:\\Qt\\4.7.0' QT_DLLS = ['Core', 'Gui', 'Network', 'Svg', 'WebKit', 'Xml', 'XmlPatterns'] LIBUSB_DIR = 'C:\\libusb' LIBUNRAR = 'C:\\Program Files\\UnrarDLL\\unrar.dll' diff --git a/setup/installer/windows/notes.rst b/setup/installer/windows/notes.rst index 545070f7ff..46aabecfa0 100644 --- a/setup/installer/windows/notes.rst +++ b/setup/installer/windows/notes.rst @@ -37,8 +37,7 @@ Qt Extract Qt sourcecode to C:\Qt\4.x.x. Run configure and make:: - configure -opensource -qt-zlib -qt-gif -qt-libmng -qt-libpng -qt-libtiff -qt-libjpeg -release -platform win32-msvc -no-qt3support -webkit -xmlpatterns -no-phonon - nmake + configure -opensource -release -qt-zlib -qt-gif -qt-libmng -qt-libpng -qt-libtiff -qt-libjpeg -release -platform win32-msvc2008 -no-qt3support -webkit -xmlpatterns -no-phonon -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -no-declarative -no-scripttools -no-audio-backend -no-multimedia -no-dbus -no-openvg -no-opengl -no-qt3support -confirm-license && nmake SIP ----- From 7ed2aa75e85bdcc176b9d1794e7f8d740ff3cd29 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 10 Nov 2010 07:16:38 -0700 Subject: [PATCH 06/11] Updated translation template --- resources/images/format-text-bold.png | Bin 0 -> 5093 bytes resources/images/format-text-italic.png | Bin 0 -> 4158 bytes .../images/format-text-strikethrough.png | Bin 0 -> 6033 bytes resources/images/format-text-underline.png | Bin 0 -> 4510 bytes src/calibre/gui2/comments_editor.py | 45 +++- src/calibre/translations/calibre.pot | 237 +++++++++++------- 6 files changed, 188 insertions(+), 94 deletions(-) create mode 100644 resources/images/format-text-bold.png create mode 100644 resources/images/format-text-italic.png create mode 100644 resources/images/format-text-strikethrough.png create mode 100644 resources/images/format-text-underline.png diff --git a/resources/images/format-text-bold.png b/resources/images/format-text-bold.png new file mode 100644 index 0000000000000000000000000000000000000000..55aeed8684613668ca17a4dc6244708f61ebf3f0 GIT binary patch literal 5093 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 literal 0 HcmV?d00001 diff --git a/resources/images/format-text-italic.png b/resources/images/format-text-italic.png new file mode 100644 index 0000000000000000000000000000000000000000..35f75e81eaab0335ef515d1c78d2ac4545e60e47 GIT binary patch literal 4158 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 can destroy your library using this feature. Changes are permanent. There is no undo function. This feature is experimental, and there may be bugs. You are strongly encouraged to back up your library before proceeding.

Search and replace in text fields using character matching or regular expressions. " +msgid "You can destroy your library using this feature. Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding.

Search and replace in text fields using character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See this reference for more information on python's regular expressions, and in particular the 'sub' function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6071,7 +6086,7 @@ msgid "Your test:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -6570,56 +6585,92 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "Find entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "&All these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "This exact &phrase:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "&One or more of these words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "But dont show entries that have..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 msgid "Any of these &unwanted words:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 msgid "Contains: the word or phrase matches anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 msgid "Equals: the word or phrase must match an entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 msgid "Regular expression: the expression must match anywhere in the metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:129 -msgid " " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 +msgid "See the User Manual for more help" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 -msgid "See the User Manual for more help" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 @@ -7231,35 +7282,39 @@ msgstr "" msgid "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "

Search the list of books by title, author, publisher, tags, comments, etc.

Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "" @@ -7316,47 +7371,47 @@ msgstr "" msgid "Double click to edit me

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Dropping onto a device is not supported. First add the book to the calibre library." msgstr "" @@ -9027,7 +9082,7 @@ msgid "Options to customize the ebook viewer" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "" @@ -9197,63 +9252,63 @@ msgstr "" msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

This book is protected by DRM" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 msgid "If specified, viewer window will try to come to the front when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" From 4ecd8d2c6da296dd5413e96267d885778f5eeca3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 10 Nov 2010 08:29:32 -0700 Subject: [PATCH 07/11] ... --- Changelog.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.yaml b/Changelog.yaml index ae553522b9..9e11bddc58 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -44,6 +44,7 @@ tickets: [7356] - title: "News download: Workaround lack of thread safety in python mechanize, causing corrupted network packets (degrading network performance) on Ubuntu Maverick 64bit kernels" + tickets: [7321] - title: "Convert comments to HTML for book details panel in separate thread to make scrolling through the book list faster when large comments are present" From e8928c804679cc67608780478a245373090f5012 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 10 Nov 2010 11:54:27 -0700 Subject: [PATCH 08/11] European Voice by malfi and Fix #7487 (Updated recipe for Pagina12) --- resources/recipes/european_voice.recipe | 51 +++++++++++++++++++++++++ resources/recipes/pagina12.recipe | 25 +++++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 resources/recipes/european_voice.recipe diff --git a/resources/recipes/european_voice.recipe b/resources/recipes/european_voice.recipe new file mode 100644 index 0000000000..caaca6d306 --- /dev/null +++ b/resources/recipes/european_voice.recipe @@ -0,0 +1,51 @@ + +from calibre.web.feeds.news import BasicNewsRecipe + +class EuropeanVoice(BasicNewsRecipe): + title = u'European Voice' + __author__ = 'malfi' + oldest_article = 14 + max_articles_per_feed = 100 + no_stylesheets = True + cover_url = 'http://www.europeanvoice.com/Css/images/logo.gif' + language = 'en' + keep_only_tags = [dict(name='div', attrs={'id':'articleLeftColumn'})] + remove_tags = [dict(name='div', attrs={'id':'BreadCrump'})] + feeds = [ + (u'Whole site ',u'http://www.europeanvoice.com/Rss/2.xml'), + (u'News and analysis',u'http://www.europeanvoice.com/Rss/6.xml'), + (u'Comment',u'http://www.europeanvoice.com/Rss/7.xml'), + (u'Special reports',u'http://www.europeanvoice.com/Rss/5.xml'), + (u'People',u'http://www.europeanvoice.com/Rss/8.xml'), + (u'Career',u'http://www.europeanvoice.com/Rss/11.xml'), + (u'Policies',u'http://www.europeanvoice.com/Rss/4.xml'), + (u'EVents',u'http://www.europeanvoice.com/Rss/10.xml'), + (u'Policies - Economics',u'http://www.europeanvoice.com/Rss/31.xml'), + (u'Policies - Business',u'http://www.europeanvoice.com/Rss/19.xml'), + (u'Policies - Trade',u'http://www.europeanvoice.com/Rss/25.xml'), + (u'Policies - Information society',u'http://www.europeanvoice.com/Rss/20.xml'), + (u'Policies - Energy',u'http://www.europeanvoice.com/Rss/15.xml'), + (u'Policies - Transport',u'http://www.europeanvoice.com/Rss/18.xml'), + (u'Policies - Climate change',u'http://www.europeanvoice.com/Rss/16.xml'), + (u'Policies - Environment',u'http://www.europeanvoice.com/Rss/17.xml'), + (u'Policies - Farming & food',u'http://www.europeanvoice.com/Rss/23.xml'), + (u'Policies - Health & society',u'http://www.europeanvoice.com/Rss/24.xml'), + (u'Policies - Justice',u'http://www.europeanvoice.com/Rss/29.xml'), + (u'Policies - Foreign affairs',u'http://www.europeanvoice.com/Rss/27.xml') + ] + extra_css = ''' + h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;} + h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;} + p{font-family:Arial,Helvetica,sans-serif;font-size:small;} + body{font-family:Helvetica,Arial,sans-serif;font-size:small;} + ''' + + def print_version(self, url): + return url + '?bPrint=1' + + def preprocess_html(self, soup): + denied = soup.findAll(True,text='Subscribers') + if denied: + raise Exception('Article skipped, because content can only be seen with subscription') + return soup + diff --git a/resources/recipes/pagina12.recipe b/resources/recipes/pagina12.recipe index da16c1697b..2809e87e2a 100644 --- a/resources/recipes/pagina12.recipe +++ b/resources/recipes/pagina12.recipe @@ -21,8 +21,16 @@ class Pagina12(BasicNewsRecipe): use_embedded_content = False language = 'es' remove_empty_feeds = True + publication_type = 'newspaper' masthead_url = 'http://www.pagina12.com.ar/commons/imgs/logo-home.gif' - extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} #autor{font-weight: bold} #fecha,#epigrafe{font-size: 0.9em; margin: 5px} #imagen{border: 1px solid black; margin: 0 0 1.25em 1.25em; width: 232px } ' + extra_css = """ + body{font-family: Arial,Helvetica,sans-serif } + img{margin-bottom: 0.4em; display:block} + #autor{font-weight: bold} + #fecha,#epigrafe{font-size: 0.9em; margin: 5px} + #imagen{border: 1px solid black; margin: 0 0 1.25em 1.25em; width: 232px } + .fgprincipal{font-size: large; font-weight: bold} + """ conversion_options = { 'comment' : description @@ -31,7 +39,11 @@ class Pagina12(BasicNewsRecipe): , 'language' : language } - remove_tags = [dict(name='div', attrs={'id':['volver','logo','logo_suple','fin','permalink']})] + remove_tags = [ + dict(name=['meta','link']) + ,dict(name='div', attrs={'id':['volver','logo','logo_suple','fin','permalink']}) + ] + remove_attributes=['lang'] feeds = [ @@ -65,4 +77,13 @@ class Pagina12(BasicNewsRecipe): def preprocess_html(self, soup): for item in soup.findAll(style=True): del item['style'] + for item in soup.findAll('span', attrs={'id':'seccion'}): + it = item.a + it.name='span' + del it['href'] + del it['title'] + for item in soup.findAll('p'): + it = item.find('h3') + if it: + it.name='span' return soup \ No newline at end of file From 53b677d82c71bb1b0ad00ffe193f114175a2c213 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 10 Nov 2010 11:59:00 -0700 Subject: [PATCH 09/11] Content Server: Add day to displayed date in /mobile book listing --- src/calibre/library/server/mobile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index d66e6d842f..d38c2f206e 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -235,7 +235,7 @@ class MobileServer(object): no_tag_count=True) book['title'] = record[FM['title']] for x in ('timestamp', 'pubdate'): - book[x] = strftime('%b, %Y', record[FM[x]]) + book[x] = strftime('%d %b, %Y', record[FM[x]]) book['id'] = record[FM['id']] books.append(book) for key in CKEYS: From 247723eacab116d8d13c0a4f98ab685f61259319 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 10 Nov 2010 14:28:42 -0700 Subject: [PATCH 10/11] Rolling Stone by DM. Fix #7490 (New recipe for US edition of Rolling Stone Magazine - free content) --- resources/images/news/rollingstone.png | Bin 0 -> 1318 bytes resources/recipes/rollingstone.recipe | 69 +++++++++++++++++++++++++ setup/extensions.py | 6 ++- setup/installer/windows/freeze.py | 2 +- 4 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 resources/images/news/rollingstone.png create mode 100644 resources/recipes/rollingstone.recipe diff --git a/resources/images/news/rollingstone.png b/resources/images/news/rollingstone.png new file mode 100644 index 0000000000000000000000000000000000000000..4f847d1dad0d0dc4c13942aa901c250352ae4f39 GIT binary patch literal 1318 zcmV+>1=;$EP)C@EI zUw;8WtL1qdFB}F?sU(wwgG7}|GMUK`wcE?fD=S3ZE|D=rt~)<}=MGV&GBB`b50Tcc z>v;^2)NTRw!J&NMua2*=Vp2BBFM?R4SE--n~nw_wFTn|2~<_ zW{IQ_+-&;`I8HncNNK^~-*7mSNv8oJ948hFAn^UQwKs1VX(52Ety1avbD-6F`gCcD zAp(HDz9UBtA7%(F)KUT=OEw{ZPzc!Eyn6M<4Iq&?efq=+z;&NISy}>mdvm$rVYXuj z?D*HOa(Q)?(-DHn+wF28J9h?l7JFN$F@V-UNJ?g<@AHS@aILnn0et5{1IKbDR(WG#ZZ{6^m?Vj3qu0@_l|Ggss3B ztvOT9m?#_uB9UBf|NcLz<~S1*lao9h!^1!%GBT3O1^1p;EEbDEvpGM1_bvxk3eZ~0 zP6r6tmMFy-{+GpC|87-iU?7ghRj=-@%CjRC1Toz>OXuUQ$10MA=oeEc}D z+p!~`KXnRFDw9bj`K{JKIBbkktfa;OQV71VEVd5qiAIkf=kXDOxxu%cPOVm}1*~o~ z78Vv40Uax-QYjkNNzWGb}7aLqzrZ#KiP8{c$!ouUxr)JrE)*T%uCRWCjO09~LAQ zn%>@A?!bZV`c9c+>(=ZnAnY~_b^=2o1kZJ_&4l3bu{7nQlob{RQV3?d*4*kuVr*=DoT0dR6A&Vi z=<5S~zh2+i0L1z_Lm.*?', re.DOTALL|re.IGNORECASE),lambda match: 'xml:lang="en">\n\n') + ,(re.compile(r'.*?' , re.DOTALL|re.IGNORECASE),lambda match: '\n\n' ) + ] + + keep_only_tags=[ + dict(attrs={'class':['headerImgHolder','headerContent']}) + ,dict(name='div',attrs={'id':['teaser','storyTextContainer']}) + ,dict(name='div',attrs={'class':'blogDetailModule clearfix'}) + ] + + remove_tags = [ + dict(name=['meta','iframe','object','embed']) + ,dict(attrs={'id':'mpStoryHeader'}) + ,dict(attrs={'class':'relatedTopics'}) + ] + remove_attributes=['lang','onclick','width','height','name'] + remove_tags_before=dict(attrs={'class':'bloggerInfo'}) + remove_tags_after=dict(attrs={'class':'relatedTopics'}) + + + feeds = [ + (u'All News' , u'http://www.rollingstone.com/siteServices/rss/allNews' ) + ,(u'All Blogs' , u'http://www.rollingstone.com/siteServices/rss/allBlogs' ) + ,(u'Movie Reviews' , u'http://www.rollingstone.com/siteServices/rss/movieReviews' ) + ,(u'Album Reviews' , u'http://www.rollingstone.com/siteServices/rss/albumReviews' ) + ,(u'Song Reviews' , u'http://www.rollingstone.com/siteServices/rss/songReviews' ) + ] + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return soup diff --git a/setup/extensions.py b/setup/extensions.py index 893ce1be39..531107d3cb 100644 --- a/setup/extensions.py +++ b/setup/extensions.py @@ -350,8 +350,10 @@ class Build(Command): ''')%(ext.name, ' '.join(ext.headers), ' '.join(ext.sources), archs) pro = pro.replace('\\', '\\\\') open(ext.name+'.pro', 'wb').write(pro) - subprocess.check_call([QMAKE, '-o', 'Makefile', '-spec', - 'win32-msvc2008', ext.name+'.pro']) + qmc = [QMAKE, '-o', 'Makefile'] + if iswindows: + qmc += ['-spec', 'win32-msvc2008'] + subprocess.check_call(qmc + [ext.name+'.pro']) subprocess.check_call([make, '-f', 'Makefile']) objects = glob.glob(obj_pat) return list(map(self.a, objects)) diff --git a/setup/installer/windows/freeze.py b/setup/installer/windows/freeze.py index 35fe78b13b..dc3dd33604 100644 --- a/setup/installer/windows/freeze.py +++ b/setup/installer/windows/freeze.py @@ -13,7 +13,7 @@ from setup import Command, modules, functions, basenames, __version__, \ from setup.build_environment import msvc, MT, RC from setup.installer.windows.wix import WixMixIn -QT_DIR = 'Q:\\Qt\\4.7.0' +QT_DIR = 'Q:\\Qt\\4.7.1' QT_DLLS = ['Core', 'Gui', 'Network', 'Svg', 'WebKit', 'Xml', 'XmlPatterns'] LIBUSB_DIR = 'C:\\libusb' LIBUNRAR = 'C:\\Program Files\\UnrarDLL\\unrar.dll' From f40f555d130c02be00a10644dce24b4eab25c1f1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 10 Nov 2010 23:20:17 -0700 Subject: [PATCH 11/11] Fix #7491 (Error after subscribing to TidBITS: Mac News... news source) --- src/calibre/gui2/device.py | 8 +++++++- src/calibre/library/caches.py | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 4e93335af6..8d84f69249 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -1014,7 +1014,13 @@ class DeviceMixin(object): # {{{ self.status_bar.show_message(_('Sent by email:') + ', '.join(good), 5000) if remove: - self.library_view.model().delete_books_by_id(remove) + try: + self.library_view.model().delete_books_by_id(remove) + except: + # Probably the user deleted the files, in any case, failing + # to delete the book is not catastrophic + traceback.print_exc() + def cover_to_thumbnail(self, data): ht = self.device_manager.device.THUMBNAIL_HEIGHT \ diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 03383ee7dd..5f3e66beef 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -625,7 +625,11 @@ class ResultCache(SearchQueryParser): # {{{ # }}} def remove(self, id): - self._data[id] = None + try: + self._data[id] = None + except IndexError: + # id is out of bounds, no point setting it to None anyway + pass try: self._map.remove(id) except ValueError: