mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Merge from trunk
This commit is contained in:
commit
161d39e13f
@ -19,9 +19,93 @@
|
|||||||
# new recipes:
|
# new recipes:
|
||||||
# - title:
|
# - title:
|
||||||
|
|
||||||
# - title: "Launch of a new website that catalogues DRM free books. http://drmfree.calibre-ebook.com"
|
- version: 0.7.48
|
||||||
# description: "A growing catalogue of DRM free books. Books that you actually own after buying instead of renting."
|
date: 2011-03-04
|
||||||
# type: major
|
|
||||||
|
new features:
|
||||||
|
- title: "Changes to the internal database structure used by calibre"
|
||||||
|
description: >
|
||||||
|
"These changes will allow calibre, in the future, to support book language, arbitrary book identifiers and keep track of when the metadata for a book was last modified. WARNING: Because of these changes, if you downgrade calibre versions after upgrading to 0.7.48, you will lose any changes you make to the ISBN of book entries in your calibre database, so do not downgrade unless you really have to. Also note that the first time you start calibre after this update, the startup will be slow as the database structure is being changed."
|
||||||
|
|
||||||
|
- title: "Launch of a new website that catalogues DRM free ebooks. http://drmfree.calibre-ebook.com"
|
||||||
|
description: "A growing catalogue of DRM free ebooks. Ebooks that you actually own after paying, instead of just renting."
|
||||||
|
type: major
|
||||||
|
|
||||||
|
- title: "News download: Add an option to keep at most x issues of a particular periodical in the calibre library. Use the Advanced tab in the Fetch news dialog for your news source to set this option."
|
||||||
|
tickets: [9168]
|
||||||
|
|
||||||
|
- title: "You can now right click on the cover in the book details panel to copy/paste a new cover."
|
||||||
|
tickets: [9255]
|
||||||
|
|
||||||
|
- title: "Add an entry to the add books drop down menu to easily add formats to an existing book record"
|
||||||
|
|
||||||
|
- title: "Tag browser: Clicking on a nested category now searches for the category alone. Clicking twice searches for the category and all its descendants and so on."
|
||||||
|
tickets: [9166, 9169]
|
||||||
|
|
||||||
|
- title: "Add a button to the Manage authors dialog to copy author sort values to author"
|
||||||
|
|
||||||
|
- title: "Decrease startup times on large libraries by using a faster algorithm to parse stored dates"
|
||||||
|
|
||||||
|
- title: "Add quick create links to easily create custom columns of commonly used types to the add custom column dialog"
|
||||||
|
|
||||||
|
- title: "Allow drag drop of images to change cover in book details window."
|
||||||
|
tickets: [9226]
|
||||||
|
|
||||||
|
- title: "Device susbsytem: Create a drive info file named driveinfo.calibre in the root of each device drive for USB connected devices. This file contains various useful data. API Change: The open method of the device plugins now accepts an extra parameter library_uuid which is the id of the calibre library connected tot eh device"
|
||||||
|
|
||||||
|
bug fixes:
|
||||||
|
- title: "Conversion pipeline: Fix regression in 0.7.46 that caused loss of some CSS information when converting HTML produced by Microsoft Word. Also remove empty tags from microsoft namespaces when parsing HTML"
|
||||||
|
|
||||||
|
- title: "Try harder to ensure that the worker log temporary files are deleted in windows"
|
||||||
|
|
||||||
|
- title: "CHM Input: Handle CHM files that dont specify a topics file."
|
||||||
|
tickets: [9253]
|
||||||
|
|
||||||
|
- title: "Fix regression that caused memory leak in Tag Browser. This would show up as the memory usage of calibre increasing when switching libraries."
|
||||||
|
tickets: [9246]
|
||||||
|
|
||||||
|
- title: "Fix bug that caused preferences->behavior to not show the output format set by the welcome wizard, and instead default to showing EPUB"
|
||||||
|
|
||||||
|
- title: "Fix bug that caused wrong books to be deleted from library if you choose 'delete from library and device' while the library is sorted by the On device column"
|
||||||
|
|
||||||
|
- title: "MOBI Input: Ignore all ASCII control codes except CR, NL and Tab."
|
||||||
|
tickets: [9219]
|
||||||
|
|
||||||
|
improved recipes:
|
||||||
|
- Credit Slips
|
||||||
|
- Seattle Times
|
||||||
|
- MacWorld
|
||||||
|
- Austin Statesman
|
||||||
|
- EPL Talk
|
||||||
|
- Gawker
|
||||||
|
- Deadspin
|
||||||
|
|
||||||
|
new recipes:
|
||||||
|
- title: "Thai Post Today and Daily Post"
|
||||||
|
author: "Chotechai P."
|
||||||
|
|
||||||
|
- title: "RBC.ru"
|
||||||
|
author: Chewi
|
||||||
|
|
||||||
|
- title: Helsingin Sanomat
|
||||||
|
author: oneillpt
|
||||||
|
|
||||||
|
- title: "LWN Weekly"
|
||||||
|
author: David Cavalca
|
||||||
|
|
||||||
|
- title: "New York Times Sports and Technology Blogs"
|
||||||
|
author: rylsfan
|
||||||
|
|
||||||
|
- title: "Historia and Buctaras"
|
||||||
|
author: Silviu Coatara
|
||||||
|
|
||||||
|
- title: "Buffalo News"
|
||||||
|
author: ChappyOnIce
|
||||||
|
|
||||||
|
- title: "Dotpod"
|
||||||
|
author: Federico Escalada
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- version: 0.7.47
|
- version: 0.7.47
|
||||||
date: 2011-02-25
|
date: 2011-02-25
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"test": "def evaluate(self, formatter, kwargs, mi, locals, val, value_if_set, value_not_set):\n if val:\n return value_if_set\n else:\n return value_not_set\n",
|
"test": "def evaluate(self, formatter, kwargs, mi, locals, val, value_if_set, value_not_set):\n if val:\n return value_if_set\n else:\n return value_not_set\n",
|
||||||
"eval": "def evaluate(self, formatter, kwargs, mi, locals, template):\n from formatter import eval_formatter\n template = template.replace('[[', '{').replace(']]', '}')\n return eval_formatter.safe_format(template, locals, 'EVAL', None)\n",
|
"eval": "def evaluate(self, formatter, kwargs, mi, locals, template):\n from formatter import eval_formatter\n template = template.replace('[[', '{').replace(']]', '}')\n return eval_formatter.safe_format(template, locals, 'EVAL', None)\n",
|
||||||
"multiply": "def evaluate(self, formatter, kwargs, mi, locals, x, y):\n x = float(x if x else 0)\n y = float(y if y else 0)\n return unicode(x * y)\n",
|
"multiply": "def evaluate(self, formatter, kwargs, mi, locals, x, y):\n x = float(x if x else 0)\n y = float(y if y else 0)\n return unicode(x * y)\n",
|
||||||
"format_date": "def evaluate(self, formatter, kwargs, mi, locals, val, format_string):\n print val\n if not val:\n return ''\n try:\n dt = parse_date(val)\n s = format_date(dt, format_string)\n except:\n s = 'BAD DATE'\n return s\n",
|
"format_date": "def evaluate(self, formatter, kwargs, mi, locals, val, format_string):\n if not val:\n return ''\n try:\n dt = parse_date(val)\n s = format_date(dt, format_string)\n except:\n s = 'BAD DATE'\n return s\n",
|
||||||
"capitalize": "def evaluate(self, formatter, kwargs, mi, locals, val):\n return capitalize(val)\n",
|
"capitalize": "def evaluate(self, formatter, kwargs, mi, locals, val):\n return capitalize(val)\n",
|
||||||
"count": "def evaluate(self, formatter, kwargs, mi, locals, val, sep):\n return unicode(len(val.split(sep)))\n",
|
"count": "def evaluate(self, formatter, kwargs, mi, locals, val, sep):\n return unicode(len(val.split(sep)))\n",
|
||||||
"lowercase": "def evaluate(self, formatter, kwargs, mi, locals, val):\n return val.lower()\n",
|
"lowercase": "def evaluate(self, formatter, kwargs, mi, locals, val):\n return val.lower()\n",
|
||||||
|
@ -2,7 +2,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
__appname__ = 'calibre'
|
__appname__ = 'calibre'
|
||||||
__version__ = '0.7.47'
|
__version__ = '0.7.48'
|
||||||
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
@ -59,20 +59,34 @@ class OEBOutput(OutputFormatPlugin):
|
|||||||
def workaround_nook_cover_bug(self, root): # {{{
|
def workaround_nook_cover_bug(self, root): # {{{
|
||||||
cov = root.xpath('//*[local-name() = "meta" and @name="cover" and'
|
cov = root.xpath('//*[local-name() = "meta" and @name="cover" and'
|
||||||
' @content != "cover"]')
|
' @content != "cover"]')
|
||||||
|
|
||||||
|
def manifest_items_with_id(id_):
|
||||||
|
return root.xpath('//*[local-name() = "manifest"]/*[local-name() = "item" '
|
||||||
|
' and @id="%s"]'%id_)
|
||||||
|
|
||||||
if len(cov) == 1:
|
if len(cov) == 1:
|
||||||
manpath = ('//*[local-name() = "manifest"]/*[local-name() = "item" '
|
|
||||||
' and @id="%s" and @media-type]')
|
|
||||||
cov = cov[0]
|
cov = cov[0]
|
||||||
covid = cov.get('content')
|
covid = cov.get('content', '')
|
||||||
manifest_item = root.xpath(manpath%covid)
|
|
||||||
has_cover = root.xpath(manpath%'cover')
|
if covid:
|
||||||
if len(manifest_item) == 1 and not has_cover and \
|
manifest_item = manifest_items_with_id(covid)
|
||||||
manifest_item[0].get('media-type',
|
if len(manifest_item) == 1 and \
|
||||||
'').startswith('image/'):
|
manifest_item[0].get('media-type',
|
||||||
self.log.warn('The cover image has an id != "cover". Renaming'
|
'').startswith('image/'):
|
||||||
' to work around Nook Color bug')
|
self.log.warn('The cover image has an id != "cover". Renaming'
|
||||||
manifest_item = manifest_item[0]
|
' to work around bug in Nook Color')
|
||||||
manifest_item.set('id', 'cover')
|
|
||||||
cov.set('content', 'cover')
|
import uuid
|
||||||
|
newid = str(uuid.uuid4())
|
||||||
|
|
||||||
|
for item in manifest_items_with_id('cover'):
|
||||||
|
item.set('id', newid)
|
||||||
|
|
||||||
|
for x in root.xpath('//*[@idref="cover"]'):
|
||||||
|
x.set('idref', newid)
|
||||||
|
|
||||||
|
manifest_item = manifest_item[0]
|
||||||
|
manifest_item.set('id', 'cover')
|
||||||
|
cov.set('content', 'cover')
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
@ -1586,6 +1586,7 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
else:
|
else:
|
||||||
prefix = ''
|
prefix = ''
|
||||||
category = tag.category if key != 'news' else 'tag'
|
category = tag.category if key != 'news' else 'tag'
|
||||||
|
add_colon = False
|
||||||
if self.db.field_metadata[tag.category]['is_csp']:
|
if self.db.field_metadata[tag.category]['is_csp']:
|
||||||
add_colon = True
|
add_colon = True
|
||||||
|
|
||||||
|
@ -336,12 +336,14 @@ With all this flexibility, it is possible to have |app| manage your author names
|
|||||||
* After you have changed all the authors, press the `Recalculate all author sort values` button.
|
* After you have changed all the authors, press the `Recalculate all author sort values` button.
|
||||||
* Press OK, at which point |app| will change the authors in all your books. This can take a while.
|
* Press OK, at which point |app| will change the authors in all your books. This can take a while.
|
||||||
|
|
||||||
**Note**: when changing from FN LN to LN, FN, it is often the case that the values in author_sort are already in LN, FN format. If this is your case, then do the following:
|
.. note::
|
||||||
* set the ``author_sort_copy_method`` tweak to ``copy`` as described above.
|
|
||||||
* restart calibre. Do not change any book metadata before doing the remaining steps.
|
When changing from FN LN to LN, FN, it is often the case that the values in author_sort are already in LN, FN format. If this is your case, then do the following:
|
||||||
* open the Manage authors dialog. Press the ``copy all author sort values to author`` button.
|
* set the ``author_sort_copy_method`` tweak to ``copy`` as described above.
|
||||||
* Check through the authors to be sure you are happy. You can still press Cancel to abandon the changes. Once you press OK, there is no undo.
|
* restart calibre. Do not change any book metadata before doing the remaining steps.
|
||||||
* Press OK, at which point |app| will change the authors in all your books. This can take a while.
|
* open the Manage authors dialog. Press the ``copy all author sort values to author`` button.
|
||||||
|
* Check through the authors to be sure you are happy. You can still press Cancel to abandon the changes. Once you press OK, there is no undo.
|
||||||
|
* Press OK, at which point |app| will change the authors in all your books. This can take a while.
|
||||||
|
|
||||||
|
|
||||||
Why doesn't |app| let me store books in my own directory structure?
|
Why doesn't |app| let me store books in my own directory structure?
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -40,8 +40,6 @@ speedup_parse_date(PyObject *self, PyObject *args) {
|
|||||||
|
|
||||||
second = strtol(raw, &end, 10);
|
second = strtol(raw, &end, 10);
|
||||||
if ((end - raw) != 2) Py_RETURN_NONE;
|
if ((end - raw) != 2) Py_RETURN_NONE;
|
||||||
raw += 3;
|
|
||||||
|
|
||||||
|
|
||||||
tz = orig + len - 6;
|
tz = orig + len - 6;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user