mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
Merge from trunk
This commit is contained in:
commit
87555b2c4d
@ -4,6 +4,61 @@
|
||||
# for important features/bug fixes.
|
||||
# Also, each release can have new and improved recipes.
|
||||
|
||||
- version: 0.7.7
|
||||
date: 2010-07-02
|
||||
|
||||
new features:
|
||||
- title: "Support for the Nokia E52"
|
||||
|
||||
- title: "Searching on the size column"
|
||||
|
||||
- title: "iTunes driver: Add option to disable cover fetching for speeding up the fetching of large book collections"
|
||||
|
||||
bug fixes:
|
||||
- title: "SONY driver: Only update metadata when books are sent to device."
|
||||
|
||||
- title: "TXT Input: Ensure the generated html is splittable"
|
||||
tickets: [5904]
|
||||
|
||||
- title: "Fix infinite loop in default cover generation."
|
||||
tickets: [6061]
|
||||
|
||||
- title: "HTML Input: Fix a parsing bug that was triggered in rare conditions"
|
||||
tickets: [6064]
|
||||
|
||||
- title: "HTML2Zip plugin: Do not replace ligatures"
|
||||
tickets: [6019]
|
||||
|
||||
- title: "iTunes driver: Fix transmission of non integral series numbers"
|
||||
tickets: [6046]
|
||||
|
||||
- title: "Simplify implementation of cover caching and ensure cover browser is updated when covers are changed"
|
||||
|
||||
- title: "PDF metadata: Fix last character corrupted when setting metadata in encrypted files."
|
||||
|
||||
- title: "PDF metadata: Update the version of PoDoFo used to set metadata to 0.8.1. Hopefully that means more PDF files will work"
|
||||
|
||||
- title: "Device drivers: Speedup for dumping metadata cache to devices on Windows XP"
|
||||
|
||||
- title: "EPUB Output: Ensure that language setting is conformant to the specs"
|
||||
|
||||
- title: "MOBI Output: Fix a memory leak and a crash in the palmdoc compression routine"
|
||||
|
||||
- title: "Metadata download: Fix a regressiont at resulted in a failed download for some books"
|
||||
|
||||
new recipes:
|
||||
- title: "Foreign Policy and Alo!"
|
||||
author: Darko Miletic
|
||||
|
||||
- title: Statesman and ifzm
|
||||
author: rty
|
||||
|
||||
improved recipes:
|
||||
- Akter
|
||||
- The Old New Thing
|
||||
|
||||
|
||||
|
||||
- version: 0.7.6
|
||||
date: 2010-06-28
|
||||
|
||||
|
39
resources/recipes/bbc_chinese.recipe
Normal file
39
resources/recipes/bbc_chinese.recipe
Normal file
@ -0,0 +1,39 @@
|
||||
from calibre.web.feeds.news import BasicNewsRecipe
|
||||
|
||||
class AdvancedUserRecipe1277443634(BasicNewsRecipe):
|
||||
title = u'BBC Chinese'
|
||||
oldest_article = 7
|
||||
max_articles_per_feed = 100
|
||||
|
||||
feeds = [
|
||||
(u'\u4e3b\u9875', u'http://www.bbc.co.uk/zhongwen/simp/index.xml'),
|
||||
(u'\u56fd\u9645\u65b0\u95fb', u'http://www.bbc.co.uk/zhongwen/simp/world/index.xml'),
|
||||
(u'\u4e24\u5cb8\u4e09\u5730', u'http://www.bbc.co.uk/zhongwen/simp/china/index.xml'),
|
||||
(u'\u91d1\u878d\u8d22\u7ecf', u'http://www.bbc.co.uk/zhongwen/simp/business/index.xml'),
|
||||
(u'\u7f51\u4e0a\u4e92\u52a8', u'http://www.bbc.co.uk/zhongwen/simp/interactive/index.xml'),
|
||||
(u'\u97f3\u89c6\u56fe\u7247', u'http://www.bbc.co.uk/zhongwen/simp/multimedia/index.xml'),
|
||||
(u'\u5206\u6790\u8bc4\u8bba', u'http://www.bbc.co.uk/zhongwen/simp/indepth/index.xml')
|
||||
]
|
||||
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;}\n
|
||||
h1 {font-family: 'DroidFont', serif;}\n
|
||||
.articledescription {font-family: 'DroidFont', serif;}
|
||||
'''
|
||||
__author__ = 'rty'
|
||||
__version__ = '1.0'
|
||||
language = 'zh'
|
||||
pubisher = 'British Broadcasting Corporation'
|
||||
description = 'BBC news in Chinese'
|
||||
category = 'News, Chinese'
|
||||
remove_javascript = True
|
||||
use_embedded_content = False
|
||||
no_stylesheets = True
|
||||
encoding = 'UTF-8'
|
||||
conversion_options = {'linearize_tables':True}
|
||||
masthead_url = 'http://wscdn.bbc.co.uk/zhongwen/simp/images/1024/brand.jpg'
|
||||
keep_only_tags = [
|
||||
dict(name='h1'),
|
||||
dict(name='p', attrs={'class':['primary-topic','summary']}),
|
||||
dict(name='div', attrs={'class':['bodytext','datestamp']}),
|
||||
]
|
39
resources/recipes/china_economic_net.recipe
Normal file
39
resources/recipes/china_economic_net.recipe
Normal file
@ -0,0 +1,39 @@
|
||||
from calibre.web.feeds.news import BasicNewsRecipe
|
||||
|
||||
class AdvancedUserRecipe1278162597(BasicNewsRecipe):
|
||||
__author__ = 'rty'
|
||||
title = u'China Economic Net'
|
||||
oldest_article = 7
|
||||
max_articles_per_feed = 100
|
||||
|
||||
pubisher = 'www.ce.cn - China Economic net - Beijing'
|
||||
description = 'China Economic Net Magazine'
|
||||
category = 'Economic News Magazine, Chinese, China'
|
||||
feeds = [
|
||||
(u'Stock Market 股市', u'http://finance.ce.cn/stock/index_6304.xml'),
|
||||
(u'Money 理财', u'http://finance.ce.cn/money/index_6301.xml'),
|
||||
(u'Health 健康', u'http://www.ce.cn/health/index_6294.xml'),
|
||||
(u'Technology 科技', u'http://sci.ce.cn/mainpage/index_6307.xml'),
|
||||
(u'Domestic Politics 国内时政', u'http://www.ce.cn/xwzx/gnsz/index_6273.xml')
|
||||
]
|
||||
masthead_url = 'http://finance.ce.cn/images/08mdy_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;}\n
|
||||
h1 {font-family: 'DroidFont', serif;}\n
|
||||
.articledescription {font-family: 'DroidFont', serif;}
|
||||
'''
|
||||
remove_javascript = True
|
||||
use_embedded_content = False
|
||||
no_stylesheets = True
|
||||
language = 'zh-cn'
|
||||
encoding = 'gb2312'
|
||||
conversion_options = {'linearize_tables':True}
|
||||
|
||||
|
||||
keep_only_tags = [
|
||||
|
||||
dict(name='h1', attrs={'id':'articleTitle'}),
|
||||
dict(name='div', attrs={'class':'laiyuan'}),
|
||||
dict(name='div', attrs={'id':'articleText'}),
|
||||
]
|
73
resources/recipes/singtao_daily.recipe
Normal file
73
resources/recipes/singtao_daily.recipe
Normal file
@ -0,0 +1,73 @@
|
||||
from calibre.web.feeds.recipes import BasicNewsRecipe
|
||||
|
||||
class AdvancedUserRecipe1278063072(BasicNewsRecipe):
|
||||
title = u'Singtao Daily - Canada'
|
||||
oldest_article = 7
|
||||
max_articles_per_feed = 100
|
||||
__author__ = 'rty'
|
||||
description = 'Toronto Canada Chinese Newspaper'
|
||||
publisher = 'news.singtao.ca'
|
||||
category = 'Chinese, News, Canada'
|
||||
remove_javascript = True
|
||||
use_embedded_content = False
|
||||
no_stylesheets = True
|
||||
language = 'zh'
|
||||
conversion_options = {'linearize_tables':True}
|
||||
masthead_url = 'http://news.singtao.ca/i/site_2009/logo.jpg'
|
||||
extra_css = '''
|
||||
@font-face {font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\
|
||||
|
||||
body {text-align: justify; margin-right: 8pt; font-family: 'DroidFont', serif;}\
|
||||
|
||||
h1 {font-family: 'DroidFont', serif;}\
|
||||
|
||||
.articledescription {font-family: 'DroidFont', serif;}
|
||||
'''
|
||||
keep_only_tags = [
|
||||
dict(name='div', attrs={'id':['title','storybody']}),
|
||||
dict(name='div', attrs={'class':'content'})
|
||||
]
|
||||
|
||||
def parse_index(self):
|
||||
feeds = []
|
||||
for title, url in [
|
||||
('Editorial', 'http://news.singtao.ca/toronto/editorial.html'),
|
||||
('Toronto \xe5\x9f\x8e\xe5\xb8\x82/\xe7\xa4\xbe\xe5\x8d\x80', 'http://news.singtao.ca/toronto/city.html'),
|
||||
('Canada \xe5\x8a\xa0\xe5\x9c\x8b', 'http://news.singtao.ca/toronto/canada.html'),
|
||||
('Entertainment', 'http://news.singtao.ca/toronto/entertainment.html'),
|
||||
('World', 'http://news.singtao.ca/toronto/world.html'),
|
||||
('Finance \xe5\x9c\x8b\xe9\x9a\x9b\xe8\xb2\xa1\xe7\xb6\x93', 'http://news.singtao.ca/toronto/finance.html'),
|
||||
('Sports', 'http://news.singtao.ca/toronto/sports.html'),
|
||||
]:
|
||||
articles = self.parse_section(url)
|
||||
if articles:
|
||||
feeds.append((title, articles))
|
||||
return feeds
|
||||
|
||||
def parse_section(self, url):
|
||||
soup = self.index_to_soup(url)
|
||||
div = soup.find(attrs={'class': ['newslist paddingL10T10','newslist3 paddingL10T10']})
|
||||
#date = div.find(attrs={'class': 'underlineBLK'})
|
||||
current_articles = []
|
||||
for li in div.findAll('li'):
|
||||
a = li.find('a', href = True)
|
||||
if a is None:
|
||||
continue
|
||||
title = self.tag_to_string(a)
|
||||
url = a.get('href', False)
|
||||
if not url or not title:
|
||||
continue
|
||||
if url.startswith('/'):
|
||||
url = 'http://news.singtao.ca'+url
|
||||
# self.log('\ \ Found article:', title)
|
||||
# self.log('\ \ \ ', url)
|
||||
current_articles.append({'title': title, 'url': url, 'description':''})
|
||||
|
||||
return current_articles
|
||||
|
||||
def preprocess_html(self, soup):
|
||||
for item in soup.findAll(style=True):
|
||||
del item['style']
|
||||
for item in soup.findAll(width=True):
|
||||
del item['width']
|
||||
return soup
|
@ -2,7 +2,7 @@ __license__ = 'GPL v3'
|
||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||
__docformat__ = 'restructuredtext en'
|
||||
__appname__ = 'calibre'
|
||||
__version__ = '0.7.6'
|
||||
__version__ = '0.7.7'
|
||||
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
||||
|
||||
import re
|
||||
|
@ -106,6 +106,7 @@ class BOOX(HANLINV3):
|
||||
description = _('Communicate with the BOOX eBook reader.')
|
||||
author = 'Jesus Manuel Marinho Valcarce'
|
||||
supported_platforms = ['windows', 'osx', 'linux']
|
||||
METADATA_CACHE = '.metadata.calibre'
|
||||
|
||||
# Ordered list of supported formats
|
||||
FORMATS = ['epub', 'fb2', 'djvu', 'pdf', 'html', 'txt', 'rtf', 'mobi', 'prc', 'chm']
|
||||
|
@ -808,7 +808,8 @@ class Manifest(object):
|
||||
pat = re.compile(r'&(%s);'%('|'.join(user_entities.keys())))
|
||||
data = pat.sub(lambda m:user_entities[m.group(1)], data)
|
||||
|
||||
parser = etree.XMLParser(no_network=True, huge_tree=True)
|
||||
# Setting huge_tree=True causes crashes in windows with large files
|
||||
parser = etree.XMLParser(no_network=True)
|
||||
# Try with more & more drastic measures to parse
|
||||
def first_pass(data):
|
||||
try:
|
||||
|
@ -25,10 +25,17 @@ from calibre.ebooks.oeb.base import XHTML, XHTML_NS, CSS_MIME, OEB_STYLES
|
||||
from calibre.ebooks.oeb.base import XPNSMAP, xpath, urlnormalize
|
||||
from calibre.ebooks.oeb.profile import PROFILES
|
||||
|
||||
html_css = open(P('templates/html.css'), 'rb').read()
|
||||
_html_css_stylesheet = None
|
||||
|
||||
def html_css_stylesheet():
|
||||
global _html_css_stylesheet
|
||||
if _html_css_stylesheet is None:
|
||||
html_css = open(P('templates/html.css'), 'rb').read()
|
||||
_html_css_stylesheet = cssutils.parseString(html_css)
|
||||
_html_css_stylesheet.namespaces['h'] = XHTML_NS
|
||||
return _html_css_stylesheet
|
||||
|
||||
XHTML_CSS_NAMESPACE = '@namespace "%s";\n' % XHTML_NS
|
||||
HTML_CSS_STYLESHEET = cssutils.parseString(html_css)
|
||||
HTML_CSS_STYLESHEET.namespaces['h'] = XHTML_NS
|
||||
|
||||
INHERITED = set(['azimuth', 'border-collapse', 'border-spacing',
|
||||
'caption-side', 'color', 'cursor', 'direction', 'elevation',
|
||||
@ -120,7 +127,7 @@ class Stylizer(object):
|
||||
item = oeb.manifest.hrefs[path]
|
||||
basename = os.path.basename(path)
|
||||
cssname = os.path.splitext(basename)[0] + '.css'
|
||||
stylesheets = [HTML_CSS_STYLESHEET]
|
||||
stylesheets = [html_css_stylesheet()]
|
||||
head = xpath(tree, '/h:html/h:head')
|
||||
if head:
|
||||
head = head[0]
|
||||
|
@ -501,8 +501,9 @@ class DeviceBooksView(BooksView): # {{{
|
||||
|
||||
def contextMenuEvent(self, event):
|
||||
self.edit_collections_menu.setVisible(
|
||||
self._model.db.supports_collections() and \
|
||||
prefs['preserve_user_collections'])
|
||||
callable(getattr(self._model.db, 'supports_collections', None)) and \
|
||||
self._model.db.supports_collections() and \
|
||||
prefs['preserve_user_collections'])
|
||||
self.context_menu.popup(event.globalPos())
|
||||
event.accept()
|
||||
|
||||
|
@ -84,6 +84,7 @@ typedef unsigned short QRgb565;
|
||||
#define REFLECTION_FACTOR 1.5
|
||||
|
||||
#define MAX(x, y) ((x > y) ? x : y)
|
||||
#define MIN(x, y) ((x < y) ? x : y)
|
||||
|
||||
#define RGB565_RED_MASK 0xF800
|
||||
#define RGB565_GREEN_MASK 0x07E0
|
||||
@ -800,7 +801,7 @@ QRect PictureFlowPrivate::renderCenterSlide(const SlideInfo &slide) {
|
||||
QRect rect(buffer.width()/2 - sw/2, 0, sw, h-1);
|
||||
int left = rect.left();
|
||||
|
||||
for(int x = 0; x < sh-1; x++)
|
||||
for(int x = 0; x < MIN(h-1, sh-1); x++)
|
||||
for(int y = 0; y < sw; y++)
|
||||
buffer.setPixel(left + y, 1+x, src->pixel(x, y));
|
||||
|
||||
|
@ -267,10 +267,10 @@ class LocationModel(QAbstractListModel):
|
||||
QVariant(QIcon(I('reader.svg'))),
|
||||
QVariant(QIcon(I('sd.svg'))),
|
||||
QVariant(QIcon(I('sd.svg')))]
|
||||
self.text = [_('Library\n%d\nbooks'),
|
||||
_('Reader\n%s\navailable'),
|
||||
_('Card A\n%s\navailable'),
|
||||
_('Card B\n%s\navailable')]
|
||||
self.text = [_('Library\n%d books'),
|
||||
_('Reader\n%s'),
|
||||
_('Card A\n%s'),
|
||||
_('Card B\n%s')]
|
||||
self.free = [-1, -1, -1]
|
||||
self.count = 0
|
||||
self.highlight_row = 0
|
||||
@ -309,7 +309,12 @@ class LocationModel(QAbstractListModel):
|
||||
elif role == Qt.DecorationRole:
|
||||
data = self.icons[drow]
|
||||
elif role == Qt.ToolTipRole:
|
||||
data = QVariant(self.tooltips[drow])
|
||||
ans = self.tooltips[row]
|
||||
if row > 0:
|
||||
fs = self.free[drow-1]
|
||||
if fs > -1:
|
||||
ans += '\n\n%s '%(human_readable(fs)) + _('free')
|
||||
data = QVariant(ans)
|
||||
elif role == Qt.SizeHintRole:
|
||||
data = QVariant(QSize(155, 90))
|
||||
elif role == Qt.FontRole:
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user