diff --git a/resources/quick_start.epub b/resources/quick_start.epub
index 7dd8d7e91c..d5aeec5457 100644
Binary files a/resources/quick_start.epub and b/resources/quick_start.epub differ
diff --git a/resources/recipes/china_press.recipe b/resources/recipes/china_press.recipe
new file mode 100644
index 0000000000..9ceea1a423
--- /dev/null
+++ b/resources/recipes/china_press.recipe
@@ -0,0 +1,71 @@
+from calibre.web.feeds.news import BasicNewsRecipe
+
+class AdvancedUserRecipe1277228948(BasicNewsRecipe):
+ title = u'China Press USA'
+ oldest_article = 7
+ max_articles_per_feed = 100
+
+ __author__ = 'rty'
+ __version__ = '1.0'
+ language = 'zh_CN'
+ pubisher = 'www.chinapressusa.com'
+ description = 'Overseas Chinese Network Newspaper in the USA'
+ category = 'News in Chinese, USA'
+ remove_javascript = True
+ use_embedded_content = False
+ no_stylesheets = True
+ #encoding = 'GB2312'
+ encoding = 'UTF-8'
+ conversion_options = {'linearize_tables':True}
+ masthead_url ='http://www.chinapressusa.com/common/images/logo.gif'
+ extra_css = '''
+ @font-face { font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\n
+ body {
+ margin-right: 8pt;
+ font-family: 'DroidFont', serif;}
+ h1 {font-family: 'DroidFont', serif, sans-serif}
+ .show {font-family: 'DroidFont', serif, sans-serif}
+ '''
+ feeds = [
+ (u'\u65b0\u95fb\u9891\u9053', u'http://news.uschinapress.com/news.xml'),
+ (u'\u534e\u4eba\u9891\u9053', u'http://chinese.uschinapress.com/chinese.xml'),
+ (u'\u8bc4\u8bba\u9891\u9053', u'http://review.uschinapress.com/review.xml'),
+ ]
+ keep_only_tags = [
+ dict(name='div', attrs={'class':'show'}),
+ ]
+ remove_tags = [
+ # dict(name='table', attrs={'class':'xle'}),
+ dict(name='div', attrs={'class':'time'}),
+ ]
+ remove_tags_after = [
+ dict(name='div', attrs={'class':'bank17'}),
+ # dict(name='a', attrs={'class':'ab12'}),
+ ]
+
+
+ def append_page(self, soup, appendtag, position):
+ pager = soup.find('div',attrs={'id':'displaypagenum'})
+ if pager:
+ nexturl = self.INDEX + pager.a['href']
+ soup2 = self.index_to_soup(nexturl)
+ texttag = soup2.find('div', attrs={'class':'show'})
+ for it in texttag.findAll(style=True):
+ del it['style']
+ newpos = len(texttag.contents)
+ self.append_page(soup2,texttag,newpos)
+ texttag.extract()
+ appendtag.insert(position,texttag)
+
+
+ def preprocess_html(self, soup):
+ mtag = '\n'
+ soup.head.insert(0,mtag)
+
+ for item in soup.findAll(style=True):
+ del item['style']
+ self.append_page(soup, soup.body, 3)
+ pager = soup.find('div',attrs={'id':'displaypagenum'})
+ if pager:
+ pager.extract()
+ return soup
diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py
index da8a2cb978..f860fc4720 100644
--- a/src/calibre/devices/interface.py
+++ b/src/calibre/devices/interface.py
@@ -372,7 +372,7 @@ class DevicePlugin(Plugin):
@classmethod
def settings(cls):
'''
- Should return an opts object. The opts object should have one attribute
+ Should return an opts object. The opts object should have at least one attribute
`format_map` which is an ordered list of formats for the device.
'''
raise NotImplementedError()
diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py
index 690cca511a..4d126fda9d 100644
--- a/src/calibre/ebooks/metadata/__init__.py
+++ b/src/calibre/ebooks/metadata/__init__.py
@@ -282,7 +282,7 @@ class MetaInformation(object):
for attr in ('author_sort', 'title_sort', 'category',
'publisher', 'series', 'series_index', 'rating',
'isbn', 'application_id', 'manifest', 'spine', 'toc',
- 'cover', 'language', 'guide', 'book_producer',
+ 'cover', 'guide', 'book_producer',
'timestamp', 'lccn', 'lcc', 'ddc', 'pubdate', 'rights',
'publication_type', 'uuid'):
if hasattr(mi, attr):
@@ -314,6 +314,11 @@ class MetaInformation(object):
if len(other_comments.strip()) > len(my_comments.strip()):
self.comments = other_comments
+ other_lang = getattr(mi, 'language', None)
+ if other_lang and other_lang.lower() != 'und':
+ self.language = other_lang
+
+
def format_series_index(self):
try:
x = float(self.series_index)
diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py
index 46924cad1f..579398d3b0 100644
--- a/src/calibre/ebooks/metadata/opf2.py
+++ b/src/calibre/ebooks/metadata/opf2.py
@@ -18,7 +18,7 @@ from calibre.constants import __appname__, __version__, filesystem_encoding
from calibre.ebooks.metadata.toc import TOC
from calibre.ebooks.metadata import MetaInformation, string_to_authors
from calibre.utils.date import parse_date, isoformat
-
+from calibre.utils.localization import get_lang
class Resource(object):
'''
@@ -1069,7 +1069,7 @@ class OPFCreator(MetaInformation):
dc_attrs={'id':__appname__+'_id'}))
if getattr(self, 'pubdate', None) is not None:
a(DC_ELEM('date', self.pubdate.isoformat()))
- a(DC_ELEM('language', self.language if self.language else 'UND'))
+ a(DC_ELEM('language', self.language if self.language else get_lang()))
if self.comments:
a(DC_ELEM('description', self.comments))
if self.publisher:
@@ -1184,7 +1184,6 @@ def metadata_to_opf(mi, as_string=True):
factory(DC('contributor'), mi.book_producer, __appname__, 'bkp')
if hasattr(mi.pubdate, 'isoformat'):
factory(DC('date'), isoformat(mi.pubdate))
- factory(DC('language'), mi.language)
if mi.category:
factory(DC('type'), mi.category)
if mi.comments:
@@ -1195,6 +1194,7 @@ def metadata_to_opf(mi, as_string=True):
factory(DC('identifier'), mi.isbn, scheme='ISBN')
if mi.rights:
factory(DC('rights'), mi.rights)
+ factory(DC('language'), mi.language if mi.language and mi.language.lower() != 'und' else get_lang())
if mi.tags:
for tag in mi.tags:
factory(DC('subject'), tag)
diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py
index c32b79fb7c..33ee25c433 100644
--- a/src/calibre/gui2/widgets.py
+++ b/src/calibre/gui2/widgets.py
@@ -957,16 +957,19 @@ class LayoutButton(QToolButton):
self.splitter = splitter
splitter.state_changed.connect(self.update_state)
+ self.setCursor(Qt.PointingHandCursor)
def set_state_to_show(self, *args):
self.setChecked(False)
label =_('Show')
self.setText(label + ' ' + self.label)
+ self.setToolTip(self.text())
def set_state_to_hide(self, *args):
self.setChecked(True)
label = _('Hide')
self.setText(label + ' ' + self.label)
+ self.setToolTip(self.text())
def update_state(self, *args):
if self.splitter.is_side_index_hidden:
diff --git a/src/calibre/manual/conf.py b/src/calibre/manual/conf.py
index b00a454237..3866008f1f 100644
--- a/src/calibre/manual/conf.py
+++ b/src/calibre/manual/conf.py
@@ -100,9 +100,8 @@ html_use_smartypants = True
html_title = 'calibre User Manual'
html_short_title = 'Start'
html_logo = 'resources/logo.png'
-epub_titlepage = 'resources/titlepage.html'
-epub_logo = 'resources/logo.png'
epub_author = 'Kovid Goyal'
+epub_cover = 'resources/epub_cover.jpg'
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
diff --git a/src/calibre/manual/custom.py b/src/calibre/manual/custom.py
index 38486cc67a..917b927086 100644
--- a/src/calibre/manual/custom.py
+++ b/src/calibre/manual/custom.py
@@ -304,9 +304,8 @@ def auto_member(dirname, arguments, options, content, lineno,
return list(node)
def setup(app):
- app.add_config_value('epub_titlepage', None, False)
+ app.add_config_value('epub_cover', None, False)
app.add_config_value('epub_author', '', False)
- app.add_config_value('epub_logo', None, False)
app.add_builder(CustomBuilder)
app.add_builder(CustomQtBuild)
app.add_builder(EPUBHelpBuilder)
diff --git a/src/calibre/manual/epub.py b/src/calibre/manual/epub.py
index 4635e334c0..d54eb99a8d 100644
--- a/src/calibre/manual/epub.py
+++ b/src/calibre/manual/epub.py
@@ -50,6 +50,7 @@ OPF = '''\
{uid}
{date}
+
{manifest}
@@ -71,6 +72,29 @@ CONTAINER='''\
'''
+
+SVG_TEMPLATE = '''\
+
+
+
+
+ Cover
+
+
+
+
+
+
+'''
+
class TOC(list):
def __init__(self, title=None, href=None):
@@ -151,8 +175,6 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder):
spine = [' '*8+''%quoteattr(x) for x in self.spine]
spine = '\n'.join(spine)
guide = ''
- if self.conf.epub_titlepage:
- guide = ' '*8 + ''
opf = OPF.format(title=escape(self.conf.html_title),
author=escape(self.conf.epub_author), uid=str(uuid.uuid4()),
@@ -162,18 +184,15 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder):
self.manifest['content.opf'] = ('application/oebps-package+xml', 'opf')
def create_titlepage(self):
- if self.conf.epub_titlepage:
- img = ''
- if self.conf.epub_logo:
- img = '_static/epub_logo'+os.path.splitext(self.conf.epub_logo)[1]
- shutil.copyfile(self.conf.epub_logo,
- os.path.join(self.html_outdir, *img.split('/')))
- raw = open(self.conf.epub_titlepage, 'rb').read()
- raw = raw%dict(title=self.conf.html_title,
- version=self.conf.version,
- img=img.split('/')[-1],
- author=self.conf.epub_author)
- open(os.path.join(self.html_outdir, '_static', 'titlepage.html'), 'wb').write(raw)
+ self.cover_image_url = None
+ if self.conf.epub_cover:
+ img = '_static/'+os.path.basename(self.conf.epub_cover)
+ shutil.copyfile(self.conf.epub_cover, os.path.join(self.html_outdir,
+ *img.split('/')))
+ self.cover_image_url = img
+ tp = SVG_TEMPLATE%img.split('/')[-1]
+ open(os.path.join(self.html_outdir, '_static', 'titlepage.html'),
+ 'wb').write(tp)
def generate_manifest(self):
self.manifest = {}
@@ -190,8 +209,12 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder):
self.manifest[url] = 'application/octet-stream'
if self.manifest[url] == 'text/html':
self.manifest[url] = 'application/xhtml+xml'
- self.manifest[url] = (self.manifest[url], 'id'+str(id))
- id += 1
+ if self.cover_image_url and url.endswith(self.cover_image_url):
+ id_ = 'cover'
+ else:
+ id_ = 'id'+str(id)
+ id += 1
+ self.manifest[url] = (self.manifest[url], id_)
def isdocnode(self, node):
if not isinstance(node, nodes.list_item):
@@ -227,7 +250,7 @@ class EPUBHelpBuilder(StandaloneHTMLBuilder):
open('toc.ncx', 'wb').write(ncx)
self.manifest['toc.ncx'] = ('application/x-dtbncx+xml', 'ncx')
self.spine.insert(0, self.manifest[self.conf.master_doc+'.html'][1])
- if self.conf.epub_titlepage:
+ if self.conf.epub_cover:
self.spine.insert(0, self.manifest['_static/titlepage.html'][1])
def add_to_spine(self, href):
diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst
index 663c918c6e..a7968fc4e1 100644
--- a/src/calibre/manual/faq.rst
+++ b/src/calibre/manual/faq.rst
@@ -160,7 +160,7 @@ Alternative for the iPad
As of |app| version 0.7.0, you can plugin your iPad into the computer using its charging cable, and |app| will detect it and show you a list of books on the iPad. You can then use the Send to device button to send books directly to iBooks on the iPad.
This method only works on Windows XP and higher and OS X 10.5 and higher. Linux is not supported (iTunes is not available in linux) and OS X 10.4 is not supported. For more details, see
-`this forum post http://www.mobileread.com/forums/showpost.php?p=944079&postcount=1`_.
+`this forum post `_.
How do I use |app| with my Android phone?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/src/calibre/manual/resources/epub_cover.jpg b/src/calibre/manual/resources/epub_cover.jpg
new file mode 100644
index 0000000000..d5aa42e775
Binary files /dev/null and b/src/calibre/manual/resources/epub_cover.jpg differ
diff --git a/src/calibre/manual/resources/titlepage.html b/src/calibre/manual/resources/titlepage.html
deleted file mode 100644
index 08f7ddf1cc..0000000000
--- a/src/calibre/manual/resources/titlepage.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
- %(title)s
-
-
-
- %(title)s
- %(version)s
-
-
s)
-
- %(author)s
-
-
-