diff --git a/Changelog.yaml b/Changelog.yaml
index 129285a6b1..f27843ad1f 100644
--- a/Changelog.yaml
+++ b/Changelog.yaml
@@ -1,3 +1,4 @@
+# vim:fileencoding=UTF-8:ts=2:sw=2:sta:et:sts=2:ai
# Each release can have new features and bug fixes. Each of which
# must have a title and can optionally have linked tickets and a description.
# In addition they can have a type field which defaults to minor, but should be major
@@ -19,6 +20,49 @@
# new recipes:
# - title:
+- version: 0.9.25
+ date: 2013-03-29
+
+ new features:
+ - title: "Automatic adding: When checking for duplicates is enabled, use the same duplicates found dialog as is used during manual adding."
+ tickets: [1160914]
+
+ - title: "ToC Editor: Allow searching to find a location quickly when browsing through the book to select a location for a ToC item"
+
+ - title: "ToC Editor: Add a button to quickly flatten the entire table of contents"
+
+ - title: "Conversion: When converting a single book to EPUB or AZW3, add an option to automatically launch the Table of Contents editor after the conversion completes. Found under the Table of Contents section of the conversion dialog."
+
+ bug fixes:
+ - title: "calibredb: Nicer error messages when user provides invalid input"
+ tickets: [1160452,1160631]
+
+ - title: "News download: Always use the .jpg extension for jpeg images as apparently Moon+ Reader cannot handle .jpeg"
+
+ - title: "Fix Book Details popup keyboard navigation doesn't work on a Mac"
+ tickets: [1159610]
+
+ - title: "Fix a regression that caused the case of the book files to not be changed when changing the case of the title/author on case insensitive filesystems"
+
+ improved recipes:
+ - RTE news
+ - Various Polish news sources
+ - Psychology Today
+ - Foreign Affairs
+ - History Today
+ - Harpers Magazine (printed edition)
+ - Business Week Magazine
+ - The Hindu
+ - Irish Times
+ - Le Devoir
+
+ new recipes:
+ - title: Fortune Magazine
+ author: Rick Shang
+
+ - title: Eclipse Online
+ author: Jim DeVona
+
- version: 0.9.24
date: 2013-03-22
diff --git a/manual/conversion.rst b/manual/conversion.rst
index 817821a9b1..bf451d0980 100644
--- a/manual/conversion.rst
+++ b/manual/conversion.rst
@@ -434,6 +434,18 @@ a number of older formats either do not support a metadata based Table of Conten
documents do not have one. In these cases, the options in this section can help you automatically
generate a Table of Contents in the converted ebook, based on the actual content in the input document.
+.. note:: Using these options can be a little challenging to get exactly right.
+ If you prefer creating/editing the Table of Contents by hand, convert to
+ the EPUB or AZW3 formats and select the checkbox at the bottom of the
+ screen that says
+ :guilabel:`Manually fine-tune the Table of Contents after conversion`.
+ This will launch the ToC Editor tool after the conversion. It allows you to
+ create entries in the Table of Contents by simply clicking the place in the
+ book where you want the entry to point. You can also use the ToC Editor by
+ itself, without doing a conversion. Go to :guilabel:`Preferences->Toolbars`
+ and add the ToC Editor to the main toolbar. Then just select the book you
+ want to edit and click the ToC Editor button.
+
The first option is :guilabel:`Force use of auto-generated Table of Contents`. By checking this option
you can have |app| override any Table of Contents found in the metadata of the input document with the
auto generated one.
@@ -456,7 +468,7 @@ For example, to remove all entries titles "Next" or "Previous" use::
Next|Previous
-Finally, the :guilabel:`Level 1,2,3 TOC` options allow you to create a sophisticated multi-level Table of Contents.
+The :guilabel:`Level 1,2,3 TOC` options allow you to create a sophisticated multi-level Table of Contents.
They are XPath expressions that match tags in the intermediate XHTML produced by the conversion pipeline. See the
:ref:`conversion-introduction` for how to get access to this XHTML. Also read the :ref:`xpath-tutorial`, to learn
how to construct XPath expressions. Next to each option is a button that launches a wizard to help with the creation
diff --git a/manual/faq.rst b/manual/faq.rst
index ba11c865f3..ceaa2bc735 100644
--- a/manual/faq.rst
+++ b/manual/faq.rst
@@ -87,7 +87,9 @@ this bug.
How do I convert a collection of HTML files in a specific order?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-In order to convert a collection of HTML files in a specific oder, you have to create a table of contents file. That is, another HTML file that contains links to all the other files in the desired order. Such a file looks like::
+In order to convert a collection of HTML files in a specific oder, you have to
+create a table of contents file. That is, another HTML file that contains links
+to all the other files in the desired order. Such a file looks like::
@@ -102,19 +104,36 @@ In order to convert a collection of HTML files in a specific oder, you have to c
-Then just add this HTML file to the GUI and use the convert button to create your ebook.
+Then, just add this HTML file to the GUI and use the convert button to create
+your ebook. You can use the option in the Table of Contents section in the
+conversion dialog to control how the Table of Contents is generated.
-.. note:: By default, when adding HTML files, |app| follows links in the files in *depth first* order. This means that if file A.html links to B.html and C.html and D.html, but B.html also links to D.html, then the files will be in the order A.html, B.html, D.html, C.html. If instead you want the order to be A.html, B.html, C.html, D.html then you must tell |app| to add your files in *breadth first* order. Do this by going to Preferences->Plugins and customizing the HTML to ZIP plugin.
+.. note:: By default, when adding HTML files, |app| follows links in the files
+ in *depth first* order. This means that if file A.html links to B.html and
+ C.html and D.html, but B.html also links to D.html, then the files will be
+ in the order A.html, B.html, D.html, C.html. If instead you want the order
+ to be A.html, B.html, C.html, D.html then you must tell |app| to add your
+ files in *breadth first* order. Do this by going to Preferences->Plugins
+ and customizing the HTML to ZIP plugin.
The EPUB I produced with |app| is not valid?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-|app| does not guarantee that an EPUB produced by it is valid. The only guarantee it makes is that if you feed it valid XHTML 1.1 + CSS 2.1 it will output a valid EPUB. |app| is designed for ebook consumers, not producers. It tries hard to ensure that EPUBs it produces actually work as intended on a wide variety of devices, a goal that is incompatible with producing valid EPUBs, and one that is far more important to the vast majority of its users. If you need a tool that always produces valid EPUBs, |app| is not for you.
+|app| does not guarantee that an EPUB produced by it is valid. The only
+guarantee it makes is that if you feed it valid XHTML 1.1 + CSS 2.1 it will
+output a valid EPUB. |app| is designed for ebook consumers, not producers. It
+tries hard to ensure that EPUBs it produces actually work as intended on a wide
+variety of devices, a goal that is incompatible with producing valid EPUBs, and
+one that is far more important to the vast majority of its users. If you need a
+tool that always produces valid EPUBs, |app| is not for you.
How do I use some of the advanced features of the conversion tools?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- You can get help on any individual feature of the converters by mousing over it in the GUI or running ``ebook-convert dummy.html .epub -h`` at a terminal. A good place to start is to look at the following demo files that demonstrate some of the advanced features:
- * `html-demo.zip `_
+You can get help on any individual feature of the converters by mousing over
+it in the GUI or running ``ebook-convert dummy.html .epub -h`` at a terminal.
+A good place to start is to look at the following demo file that demonstrates
+some of the advanced features
+`html-demo.zip `_
Device Integration
@@ -126,11 +145,11 @@ Device Integration
What devices does |app| support?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-|app| can directly connect to all the major (and most of the minor) ebook reading devices,
-smarthphones, tablets, etc.
-In addition, using the :guilabel:`Connect to folder` function you can use it with any ebook reader that exports itself as a USB disk.
-You can even connect to Apple devices (via iTunes), using the :guilabel:`Connect to iTunes`
-function.
+|app| can directly connect to all the major (and most of the minor) ebook
+reading devices, smarthphones, tablets, etc. In addition, using the
+:guilabel:`Connect to folder` function you can use it with any ebook reader
+that exports itself as a USB disk. You can even connect to Apple devices (via
+iTunes), using the :guilabel:`Connect to iTunes` function.
.. _devsupport:
diff --git a/recipes/astroflesz.recipe b/recipes/astroflesz.recipe
index 11a56ec6b5..676aedfd3a 100644
--- a/recipes/astroflesz.recipe
+++ b/recipes/astroflesz.recipe
@@ -2,12 +2,12 @@
from calibre.web.feeds.news import BasicNewsRecipe
class Astroflesz(BasicNewsRecipe):
- title = u'Astroflesz'
+ title = u'Astroflesz'
oldest_article = 7
- __author__ = 'fenuks'
- description = u'astroflesz.pl - to portal poświęcony astronomii. Informuje zarówno o aktualnych wydarzeniach i odkryciach naukowych, jak również zapowiada ciekawe zjawiska astronomiczne'
- category = 'astronomy'
- language = 'pl'
+ __author__ = 'fenuks'
+ description = u'astroflesz.pl - to portal poświęcony astronomii. Informuje zarówno o aktualnych wydarzeniach i odkryciach naukowych, jak również zapowiada ciekawe zjawiska astronomiczne'
+ category = 'astronomy'
+ language = 'pl'
cover_url = 'http://www.astroflesz.pl/templates/astroflesz/images/logo/logo.png'
ignore_duplicate_articles = {'title', 'url'}
max_articles_per_feed = 100
@@ -17,7 +17,7 @@ class Astroflesz(BasicNewsRecipe):
keep_only_tags = [dict(id="k2Container")]
remove_tags_after = dict(name='div', attrs={'class':'itemLinks'})
remove_tags = [dict(name='div', attrs={'class':['itemLinks', 'itemToolbar', 'itemRatingBlock']})]
- feeds = [(u'Wszystkie', u'http://astroflesz.pl/?format=feed')]
+ feeds = [(u'Wszystkie', u'http://astroflesz.pl/?format=feed')]
def postprocess_html(self, soup, first_fetch):
t = soup.find(attrs={'class':'itemIntroText'})
diff --git a/recipes/badania_net.recipe b/recipes/badania_net.recipe
index 01499f6369..c47e9b6f54 100644
--- a/recipes/badania_net.recipe
+++ b/recipes/badania_net.recipe
@@ -1,17 +1,20 @@
from calibre.web.feeds.news import BasicNewsRecipe
+import re
class BadaniaNet(BasicNewsRecipe):
- title = u'badania.net'
+ title = u'badania.net'
__author__ = 'fenuks'
- description = u'chcesz wiedzieć więcej?'
- category = 'science'
- language = 'pl'
+ description = u'chcesz wiedzieć więcej?'
+ category = 'science'
+ language = 'pl'
cover_url = 'http://badania.net/wp-content/badanianet_green_transparent.png'
+ extra_css = '.alignleft {float:left; margin-right:5px;} .alignright {float:right; margin-left:5px;}'
oldest_article = 7
max_articles_per_feed = 100
no_stylesheets = True
+ preprocess_regexps = [(re.compile(r"Tekst sponsoruje
", re.IGNORECASE), lambda m: ''),]
remove_empty_feeds = True
use_embedded_content = False
remove_tags = [dict(attrs={'class':['omc-flex-category', 'omc-comment-count', 'omc-single-tags']})]
remove_tags_after = dict(attrs={'class':'omc-single-tags'})
keep_only_tags = [dict(id='omc-full-article')]
- feeds = [(u'Psychologia', u'http://badania.net/category/psychologia/feed/'), (u'Technologie', u'http://badania.net/category/technologie/feed/'), (u'Biologia', u'http://badania.net/category/biologia/feed/'), (u'Chemia', u'http://badania.net/category/chemia/feed/'), (u'Zdrowie', u'http://badania.net/category/zdrowie/'), (u'Seks', u'http://badania.net/category/psychologia-ewolucyjna-tematyka-seks/feed/')]
+ feeds = [(u'Psychologia', u'http://badania.net/category/psychologia/feed/'), (u'Technologie', u'http://badania.net/category/technologie/feed/'), (u'Biologia', u'http://badania.net/category/biologia/feed/'), (u'Chemia', u'http://badania.net/category/chemia/feed/'), (u'Zdrowie', u'http://badania.net/category/zdrowie/'), (u'Seks', u'http://badania.net/category/psychologia-ewolucyjna-tematyka-seks/feed/')]
\ No newline at end of file
diff --git a/recipes/bwmagazine2.recipe b/recipes/bwmagazine2.recipe
index cba255afa8..608c046d07 100644
--- a/recipes/bwmagazine2.recipe
+++ b/recipes/bwmagazine2.recipe
@@ -11,8 +11,8 @@ class BusinessWeekMagazine(BasicNewsRecipe):
category = 'news'
encoding = 'UTF-8'
keep_only_tags = [
- dict(name='div', attrs={'id':'article_body_container'}),
- ]
+ dict(name='div', attrs={'id':'article_body_container'}),
+ ]
remove_tags = [dict(name='ui'),dict(name='li'),dict(name='div', attrs={'id':['share-email']})]
no_javascript = True
no_stylesheets = True
@@ -25,6 +25,7 @@ class BusinessWeekMagazine(BasicNewsRecipe):
#Find date
mag=soup.find('h2',text='Magazine')
+ self.log(mag)
dates=self.tag_to_string(mag.findNext('h3'))
self.timefmt = u' [%s]'%dates
@@ -32,7 +33,7 @@ class BusinessWeekMagazine(BasicNewsRecipe):
div0 = soup.find ('div', attrs={'class':'column left'})
section_title = ''
feeds = OrderedDict()
- for div in div0.findAll('h4'):
+ for div in div0.findAll(['h4','h5']):
articles = []
section_title = self.tag_to_string(div.findPrevious('h3')).strip()
title=self.tag_to_string(div.a).strip()
@@ -48,7 +49,7 @@ class BusinessWeekMagazine(BasicNewsRecipe):
feeds[section_title] += articles
div1 = soup.find ('div', attrs={'class':'column center'})
section_title = ''
- for div in div1.findAll('h5'):
+ for div in div1.findAll(['h4','h5']):
articles = []
desc=self.tag_to_string(div.findNext('p')).strip()
section_title = self.tag_to_string(div.findPrevious('h3')).strip()
diff --git a/recipes/eclipseonline.recipe b/recipes/eclipseonline.recipe
new file mode 100644
index 0000000000..6d98120470
--- /dev/null
+++ b/recipes/eclipseonline.recipe
@@ -0,0 +1,38 @@
+from calibre.web.feeds.news import BasicNewsRecipe
+class EclipseOnline(BasicNewsRecipe):
+
+ #
+ # oldest_article specifies the maximum age, in days, of posts to retrieve.
+ # The default of 32 is intended to work well with a "days of month = 1"
+ # recipe schedule to download "monthly issues" of Eclipse Online.
+ # Increase this value to include additional posts. However, the RSS feed
+ # currently only includes the 10 most recent posts, so that's the max.
+ #
+ oldest_article = 32
+
+ title = u'Eclipse Online'
+ description = u'"Where strange and wonderful things happen, where reality is eclipsed for a little while with something magical and new." Eclipse Online is edited by Jonathan Strahan and published online by Night Shade Books. http://www.nightshadebooks.com/category/eclipse/'
+ publication_type = 'magazine'
+ language = 'en'
+
+ __author__ = u'Jim DeVona'
+ __version__ = '1.0'
+
+ # For now, use this Eclipse Online logo as the ebook cover image.
+ # (Disable the cover_url line to let Calibre generate a default cover, including date.)
+ cover_url = 'http://www.nightshadebooks.com/wp-content/uploads/2012/10/Eclipse-Logo.jpg'
+
+ # Extract the "post" div containing the story (minus redundant metadata) from each page.
+ keep_only_tags = [dict(name='div', attrs={'class':lambda x: x and 'post' in x})]
+ remove_tags = [dict(name='span', attrs={'class': ['post-author', 'post-category', 'small']})]
+
+ # Nice plain markup (like Eclipse's) works best for most e-readers.
+ # Disregard any special styling rules, but center illustrations.
+ auto_cleanup = False
+ no_stylesheets = True
+ remove_attributes = ['style', 'align']
+ extra_css = '.wp-caption {text-align: center;} .wp-caption-text {font-size: small; font-style: italic;}'
+
+ # Tell Calibre where to look for article links. It will proceed to retrieve
+ # these posts and format them into an ebook according to the above rules.
+ feeds = ['http://www.nightshadebooks.com/category/eclipse/feed/']
diff --git a/recipes/film_org_pl.recipe b/recipes/film_org_pl.recipe
index fa0a69912b..4d4ba23e88 100644
--- a/recipes/film_org_pl.recipe
+++ b/recipes/film_org_pl.recipe
@@ -1,20 +1,54 @@
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from calibre.web.feeds.news import BasicNewsRecipe
+from calibre.ebooks.BeautifulSoup import Comment
import re
class FilmOrgPl(BasicNewsRecipe):
- title = u'Film.org.pl'
- __author__ = 'fenuks'
- description = u"Recenzje, analizy, artykuły, rankingi - wszystko o filmie dla miłośników kina. Opisy efektów specjalnych, wersji reżyserskich, remake'ów, sequeli. No i forum filmowe. Jedne z największych w Polsce."
- category = 'film'
- language = 'pl'
- extra_css = '.alignright {float:right; margin-left:5px;} .alignleft {float:left; margin-right:5px;}'
+ title = u'Film.org.pl'
+ __author__ = 'fenuks'
+ description = u"Recenzje, analizy, artykuły, rankingi - wszystko o filmie dla miłośników kina. Opisy efektów specjalnych, wersji reżyserskich, remake'ów, sequeli. No i forum filmowe. Jedne z największych w Polsce."
+ category = 'film'
+ language = 'pl'
+ extra_css = '.alignright {float:right; margin-left:5px;} .alignleft {float:left; margin-right:5px;} .recenzja-title {font-size: 150%; margin-top: 5px; margin-bottom: 5px;}'
cover_url = 'http://film.org.pl/wp-content/themes/KMF/images/logo_kmf10.png'
ignore_duplicate_articles = {'title', 'url'}
oldest_article = 7
max_articles_per_feed = 100
no_stylesheets = True
+ remove_javascript = True
remove_empty_feeds = True
- use_embedded_content = True
- preprocess_regexps = [(re.compile(ur'Przeczytaj także:
.*', re.IGNORECASE|re.DOTALL), lambda m: '