diff --git a/recipes/icons/novilist_novine_hr.png b/recipes/icons/novilist_novine_hr.png
new file mode 100644
index 0000000000..05842007b5
Binary files /dev/null and b/recipes/icons/novilist_novine_hr.png differ
diff --git a/recipes/njp.recipe b/recipes/njp.recipe
index 996aef2fdf..da5e8d66ee 100644
--- a/recipes/njp.recipe
+++ b/recipes/njp.recipe
@@ -1,14 +1,25 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-__license__ = 'GPL v3'
+##
+## Title: New Journal of Physics
+## License: GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html
+## Copyright: Chema Cort\xe9s
+##
+## Written: Jan 2011
+## Last Edited: Jan 2012 - by Kiavash
+##
+
+__license__ = 'GNU General Public License v3 - http://www.gnu.org/copyleft/gpl.html'
__copyright__ = u'Chema Cort\xe9s - 2011-01-05'
-__version__ = 'v0.01'
-__date__ = '2011-01-05'
+__version__ = 'v0.5.0'
+__date__ = '2012-01-13'
+
'''
njp.org
'''
+import re # Import the regular expressions module.
from calibre.web.feeds.news import BasicNewsRecipe
class NewJournalOfPhysics(BasicNewsRecipe):
@@ -18,15 +29,61 @@ class NewJournalOfPhysics(BasicNewsRecipe):
publisher = u'IOP (Institute of Physics)'
category = 'physics, journal, science'
language = 'en'
-
- oldest_article = 30
- max_articles_per_feed = 100
-
- keep_only_tags = [dict(id=['fulltextContainer'])]
- no_stylesheets=True
- use_embedded_content=False
-
+
feeds = [(u'Latest Papers', u'http://iopscience.iop.org/1367-2630/?rss=1')]
+
+ cover_url = 'http://images.iop.org/journals_icons/Info/1367-2630/cover.gif'
+
+ oldest_article = 7
+ max_articles_per_feed = 30
+ timeout = 30
+
+ no_stylesheets = True
+ use_embedded_content = False
+ remove_javascript = True
+ remove_empty_feeds = True
+ asciiize = True # Converts all none ascii characters to their ascii equivalents
+
+ keep_only_tags = [
+ dict(id=['articleEvoContainer']),
+ ]
+
+ remove_tags = [
+ dict(name='div', attrs={'class':'affiliations'}), # Removes Shoow Affiliations
+ dict(name='div', attrs={'class':'abst-icon-links'}), # Removes Tags and PDF export
+ dict(name='p', attrs={'class':'studyimage'}), # remove Studay image
+ dict(name='a', attrs={'class':'icon powerpoint'}), # remove Export to PowerPoint Slide
+ dict(name='a', attrs={'title':'CrossRef'}), # remove CrossRef icon
+ dict(name='a', attrs={'title':'PubMed'}), # remove PubMed icon
+ dict(name='a', attrs={'e4f5426941':'true'}), # remove cross ref image
+ dict(name='img', attrs={'src':''}), # remove empty image
+ dict(name='a', attrs={'class':'closeChap'}), # remove 'Close'
+ dict(name='ul', attrs={'class':'breadcrumbs'}), # remove Top breadcrumbs
+ ]
+
+ extra_css = 'body { font-family: verdana, helvetica, sans-serif; } \
+ .introduction, .first { font-weight: bold; } \
+ .cross-head { font-weight: bold; font-size: 125%; } \
+ .cap, .caption { display: block; font-size: 80%; font-style: italic; } \
+ .cap, .caption, .caption img, .caption span { display: block; margin: 5px auto; } \
+ .byl, .byd, .byline img, .byline-name, .byline-title, .author-name, .author-position, \
+ .correspondent-portrait img, .byline-lead-in, .name, .bbc-role { display: block; \
+ font-size: 80%; font-style: italic; margin: 1px auto; } \
+ .story-date, .published { font-size: 80%; } \
+ table { width: 100%; } \
+ td img { display: block; margin: 5px auto; } \
+ ul { padding-top: 10px; } \
+ ol { padding-top: 10px; } \
+ li { padding-top: 5px; padding-bottom: 5px; } \
+ h1 { font-size: 175%; font-weight: bold; } \
+ h2 { font-size: 150%; font-weight: bold; } \
+ h3 { font-size: 125%; font-weight: bold; } \
+ h4, h5, h6 { font-size: 100%; font-weight: bold; }'
+
+ # Remove the line breaks.
+ preprocess_regexps = [(re.compile(r'
', re.IGNORECASE), lambda m: ''),
+ (re.compile(r'
', re.IGNORECASE), lambda m: ''),
+ ]
def print_version(self, url):
- return url+"/fulltext"
+ return url+"/article"
\ No newline at end of file
diff --git a/recipes/novilist_novine_hr.recipe b/recipes/novilist_novine_hr.recipe
new file mode 100644
index 0000000000..b0ff97711a
--- /dev/null
+++ b/recipes/novilist_novine_hr.recipe
@@ -0,0 +1,101 @@
+__license__ = 'GPL v3'
+__copyright__ = '2012, Darko Miletic '
+'''
+novine.novilist.hr
+'''
+
+import re
+from calibre import strftime
+from calibre.web.feeds.news import BasicNewsRecipe
+
+class NoviList_hr(BasicNewsRecipe):
+ title = 'Novi List'
+ __author__ = 'Darko Miletic'
+ description = 'Vijesti iz Hrvatske'
+ publisher = 'NOVI LIST d.d.'
+ category = 'Novi list, politika, hrvatski dnevnik, Novine, Hrvatska, Croatia, News, newspaper, Hrvatski,Primorje, dnevni list, Rijeka'
+ oldest_article = 2
+ max_articles_per_feed = 200
+ no_stylesheets = True
+ encoding = 'cp1250'
+ use_embedded_content = False
+ language = 'hr'
+ remove_empty_feeds = True
+ publication_type = 'newspaper'
+ needs_subscription = 'required'
+ masthead_url = 'http://novine.novilist.hr/images/system/novilist-logo.jpg'
+ extra_css = """
+ body{font-family: Geneva,Arial,Helvetica,Swiss,sans-serif }
+ img{display:block; margin-bottom: 0.4em; margin-top: 0.4em}
+ .nadnaslov,.podnaslov{font-size: small; text-align: center}
+ .naslov{font-size: x-large; color: maroon; font-weight: bold}
+ """
+
+ preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
+
+ conversion_options = {
+ 'comment' : description
+ , 'tags' : category
+ , 'publisher' : publisher
+ , 'language' : language
+ , 'linearize_tables' : True
+ }
+
+ keep_only_tags = [
+ dict(name='td', attrs={'class':['nadnaslov', 'naslov', 'podnaslov']}),
+ dict(name='font', attrs={'face':'Geneva,Arial,Helvetica,Swiss'})
+ ]
+
+ remove_tags = [dict(name=['meta', 'link', 'iframe', 'embed', 'object'])]
+ remove_attributes=['border', 'lang']
+
+ def get_browser(self):
+ br = BasicNewsRecipe.get_browser()
+ if self.username is not None and self.password is not None:
+ br.open('http://novine.novilist.hr/loginnow.asp')
+ br.select_form(nr=0)
+ br['username'] = self.username
+ br['password'] = self.password
+ br.submit()
+ return br
+
+ def parse_index(self):
+ articles = []
+ count = 0
+ soup = self.index_to_soup('http://novine.novilist.hr/')
+ #cover url
+ for alink in soup.findAll('a'):
+ if alink['href'].startswith('images/clanci/DOC_'):
+ self.cover_url = 'http://novine.novilist.hr/' + alink['href']
+ #feeds
+ for item in soup.findAll('td',attrs={'class':'tocrubrika'}):
+ count = count +1
+ if self.test and count > 2:
+ return articles
+ aitem = item.a
+ section = self.tag_to_string(aitem)
+ feedlink = 'http://novine.novilist.hr/' + aitem['href']
+ feedpage = self.index_to_soup(feedlink)
+ self.report_progress(0, _('Fetching feed')+' %s...'%(section))
+ inarts = []
+ for alink in feedpage.findAll('a',attrs={'class':'naslovlinkdesno'}):
+ url = 'http://novine.novilist.hr/' + alink['href']
+ title = self.tag_to_string(alink)
+ date = strftime(self.timefmt)
+ description = ''
+ inarts.append({
+ 'title' :title
+ ,'date' :date
+ ,'url' :url
+ ,'description':description
+ })
+ articles.append((section,inarts))
+ return articles
+
+ def print_version(self, url):
+ return url.replace('?WCI=Rubrike&','?WCI=Pretrazivac&')
+
+ def preprocess_html(self, soup):
+ for item in soup.findAll(style=True):
+ del item['style']
+ return soup
diff --git a/recipes/tagesspiegel.recipe b/recipes/tagesspiegel.recipe
index 5af065ce53..92d88d56ae 100644
--- a/recipes/tagesspiegel.recipe
+++ b/recipes/tagesspiegel.recipe
@@ -14,6 +14,7 @@ class TagesspiegelRSS(BasicNewsRecipe):
language = 'de'
oldest_article = 7
max_articles_per_feed = 100
+ publication_type = 'newspaper'
extra_css = '''
.hcf-overline{color:#990000; font-family:Arial,Helvetica,sans-serif;font-size:xx-small;display:block}
@@ -33,13 +34,16 @@ class TagesspiegelRSS(BasicNewsRecipe):
no_javascript = True
remove_empty_feeds = True
encoding = 'utf-8'
- remove_tags = [{'class':'hcf-header'}]
+ remove_tags = [{'class':'hcf-header'}, {'class':'hcf-atlas'}, {'class':'hcf-date hcf-separate'}]
def print_version(self, url):
url = url.split('/')
url[-1] = 'v_print,%s?p='%url[-1]
return '/'.join(url)
+ def get_masthead_url(self):
+ return 'http://www.tagesspiegel.de/images/tsp_logo/3114/6.png'
+
def parse_index(self):
soup = self.index_to_soup('http://www.tagesspiegel.de/zeitung/')
@@ -51,7 +55,7 @@ class TagesspiegelRSS(BasicNewsRecipe):
ans = []
maincol = soup.find('div', attrs={'class':re.compile('hcf-main-col')})
- for div in maincol.findAll(True, attrs={'class':['hcf-teaser', 'hcf-header', 'story headline']}):
+ for div in maincol.findAll(True, attrs={'class':['hcf-teaser', 'hcf-header', 'story headline', 'hcf-teaser hcf-last']}):
if div['class'] == 'hcf-header':
try:
@@ -61,7 +65,7 @@ class TagesspiegelRSS(BasicNewsRecipe):
except:
continue
- elif div['class'] == 'hcf-teaser' and getattr(div.contents[0],'name','') == 'h2':
+ elif div['class'] in ['hcf-teaser', 'hcf-teaser hcf-last'] and getattr(div.contents[0],'name','') == 'h2':
a = div.find('a', href=True)
if not a:
continue
diff --git a/setup/iso_639/de.po b/setup/iso_639/de.po
index 0f26dd90b8..dbb5613d60 100644
--- a/setup/iso_639/de.po
+++ b/setup/iso_639/de.po
@@ -6167,7 +6167,7 @@ msgstr ""
#. name for deu
msgid "German"
-msgstr ""
+msgstr "Deutsch"
#. name for dev
msgid "Domung"
diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py
index 70032bb027..4cd43d9973 100644
--- a/src/calibre/customize/builtins.py
+++ b/src/calibre/customize/builtins.py
@@ -550,7 +550,7 @@ from calibre.devices.cybook.driver import CYBOOK, ORIZON
from calibre.devices.eb600.driver import (EB600, COOL_ER, SHINEBOOK,
POCKETBOOK360, GER2, ITALICA, ECLICTO, DBOOK, INVESBOOK,
BOOQ, ELONEX, POCKETBOOK301, MENTOR, POCKETBOOK602,
- POCKETBOOK701, POCKETBOOK360P)
+ POCKETBOOK701, POCKETBOOK360P, PI2)
from calibre.devices.iliad.driver import ILIAD
from calibre.devices.irexdr.driver import IREXDR1000, IREXDR800
from calibre.devices.jetbook.driver import JETBOOK, MIBUK, JETBOOK_MINI
@@ -657,6 +657,7 @@ plugins += [
MIBUK,
SHINEBOOK,
POCKETBOOK360, POCKETBOOK301, POCKETBOOK602, POCKETBOOK701, POCKETBOOK360P,
+ PI2,
KINDLE, KINDLE2, KINDLE_DX, KINDLE_FIRE,
NOOK, NOOK_COLOR,
PRS505, PRST1,
diff --git a/src/calibre/devices/eb600/driver.py b/src/calibre/devices/eb600/driver.py
index ea2a41c0b7..49a648f3ac 100644
--- a/src/calibre/devices/eb600/driver.py
+++ b/src/calibre/devices/eb600/driver.py
@@ -286,3 +286,21 @@ class POCKETBOOK701(USBMS):
drives['carda'] = main
return drives
+class PI2(EB600):
+
+ name = 'Infibeam Pi2 Device Interface'
+ gui_name = 'Infibeam Pi2'
+ author = 'Michael Scalet'
+ description = _('Communicate with the Infibeam Pi2 reader.')
+ version = (1,0,1)
+
+ # Ordered list of supported formats
+ FORMATS = ['epub', 'mobi', 'prc', 'html', 'htm', 'doc', 'pdf', 'rtf',
+ 'txt']
+
+ VENDOR_NAME = 'INFIBEAM'
+ WINDOWS_MAIN_MEM = 'INFIBEAM_PI'
+ WINDOWS_CARD_A_MEM = 'INFIBEAM_PI'
+
+ DELETE_EXTS = ['.rec']
+
diff --git a/src/calibre/devices/hanvon/driver.py b/src/calibre/devices/hanvon/driver.py
index c2e9f7249c..defa5bf477 100644
--- a/src/calibre/devices/hanvon/driver.py
+++ b/src/calibre/devices/hanvon/driver.py
@@ -61,7 +61,7 @@ class LIBREAIR(N516):
FORMATS = ['epub', 'mobi', 'prc', 'fb2', 'rtf', 'txt', 'pdf']
BCD = [0x399]
- VENDOR_NAME = 'ALURATEK'
+ VENDOR_NAME = ['ALURATEK', 'LINUX']
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'FILE-STOR_GADGET'
EBOOK_DIR_MAIN = 'Books'
diff --git a/src/calibre/ebooks/metadata/fb2.py b/src/calibre/ebooks/metadata/fb2.py
index 8d2a9996a8..f5ba06e81f 100644
--- a/src/calibre/ebooks/metadata/fb2.py
+++ b/src/calibre/ebooks/metadata/fb2.py
@@ -67,10 +67,10 @@ def get_metadata(stream):
_parse_pubdate(root, mi)
except:
pass
- try:
- _parse_timestamp(root, mi)
- except:
- pass
+ #try:
+ # _parse_timestamp(root, mi)
+ #except:
+ # pass
try:
_parse_language(root, mi)
diff --git a/src/calibre/ebooks/oeb/display/cfi.coffee b/src/calibre/ebooks/oeb/display/cfi.coffee
index 75509be9b8..ef8401deb8 100644
--- a/src/calibre/ebooks/oeb/display/cfi.coffee
+++ b/src/calibre/ebooks/oeb/display/cfi.coffee
@@ -557,6 +557,13 @@ class CanonicalFragmentIdentifier
null
# }}}
+ current_cfi: () -> # {{{
+ [winx, winy] = window_scroll_pos()
+ [winw, winh] = [window.innerWidth, window.innerHeight]
+ winw = max(winw, 400)
+ winh = max(winh, 600)
+ # }}}
+
if window?
window.cfi = new CanonicalFragmentIdentifier()
else if process?
diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py
index eb85432816..efc6659f8c 100644
--- a/src/calibre/gui2/dialogs/scheduler.py
+++ b/src/calibre/gui2/dialogs/scheduler.py
@@ -375,7 +375,7 @@ class SchedulerDialog(QDialog, Ui_Dialog):
author=recipe.get('author', _('Unknown')),
description=recipe.get('description', '')))
self.download_button.setToolTip(
- _('Downlod %s now')%recipe.get('title'))
+ _('Download %s now')%recipe.get('title'))
scheduled = schedule_info is not None
self.schedule.setChecked(scheduled)
self.toggle_schedule_info()
diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py
index 787d31caf7..4c5ade37b0 100644
--- a/src/calibre/library/custom_columns.py
+++ b/src/calibre/library/custom_columns.py
@@ -279,12 +279,7 @@ class CustomColumns(object):
def is_item_used_in_multiple(self, item, label=None, num=None):
existing_tags = self.all_custom(label=label, num=num)
- lt = [t.lower() for t in existing_tags]
- try:
- lt.index(item.lower())
- return True
- except ValueError:
- return False
+ return item.lower() in {t.lower() for t in existing_tags}
def delete_item_from_multiple(self, item, label=None, num=None):
if label is not None:
@@ -302,10 +297,10 @@ class CustomColumns(object):
books_affected = []
if idx > -1:
table, lt = self.custom_table_names(data['num'])
- id_ = self.conn.get('SELECT id FROM %s where value = ?'%table,
+ id_ = self.conn.get('SELECT id FROM %s WHERE value = ?'%table,
(existing_tags[idx],), all=False)
if id_:
- books = self.conn.get('SELECT book FROM %s where value = ?'%lt, (id_,))
+ books = self.conn.get('SELECT book FROM %s WHERE value = ?'%lt, (id_,))
if books:
books_affected = [b[0] for b in books]
self.conn.execute('DELETE FROM %s WHERE value=?'%lt, (id_,))
diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py
index 5b7d732820..6de6fad726 100644
--- a/src/calibre/library/server/browse.py
+++ b/src/calibre/library/server/browse.py
@@ -669,10 +669,15 @@ class BrowseServer(object):
args = {'id':id_, 'mi':mi,
}
ccache = self.categories_cache() if add_category_links else {}
+ ftitle = fauthors = ''
for key in mi.all_field_keys():
val = mi.format_field(key)[1]
if not val:
val = ''
+ if key == 'title':
+ ftitle = xml(val, True)
+ elif key == 'authors':
+ fauthors = xml(val, True)
if add_category_links:
added_key = False
fm = mi.metadata_for_field(key)
@@ -710,8 +715,8 @@ class BrowseServer(object):
args[key] = xml(val, True)
else:
args[key] = xml(val, True)
- fname = quote(ascii_filename(args['title']) + ' - ' +
- ascii_filename(args['authors']))
+ fname = quote(ascii_filename(ftitle) + ' - ' +
+ ascii_filename(fauthors))
return args, fmt, fmts, fname
@Endpoint(mimetype='application/json; charset=utf-8')
diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot
index 1d3be9471f..a550e4e784 100644
--- a/src/calibre/translations/calibre.pot
+++ b/src/calibre/translations/calibre.pot
@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: calibre 0.8.35\n"
-"POT-Creation-Date: 2012-01-13 09:36+IST\n"
-"PO-Revision-Date: 2012-01-13 09:36+IST\n"
+"POT-Creation-Date: 2012-01-13 17:39+IST\n"
+"PO-Revision-Date: 2012-01-13 17:39+IST\n"
"Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
@@ -9012,7 +9012,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:378
#, python-format
-msgid "Downlod %s now"
+msgid "Download %s now"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:382