diff --git a/recipes/hbr.recipe b/recipes/hbr.recipe index cd7dcd2061..1152a48784 100644 --- a/recipes/hbr.recipe +++ b/recipes/hbr.recipe @@ -1,5 +1,6 @@ from calibre.web.feeds.news import BasicNewsRecipe import re +from datetime import date, timedelta class HBR(BasicNewsRecipe): @@ -12,13 +13,14 @@ class HBR(BasicNewsRecipe): no_stylesheets = True LOGIN_URL = 'http://hbr.org/login?request_url=/' - INDEX = 'http://hbr.org/current' + INDEX = 'http://hbr.org/archive-toc/BR' keep_only_tags = [dict(name='div', id='pageContainer')] remove_tags = [dict(id=['mastheadContainer', 'magazineHeadline', 'articleToolbarTopRD', 'pageRightSubColumn', 'pageRightColumn', 'todayOnHBRListWidget', 'mostWidget', 'keepUpWithHBR', 'mailingListTout', 'partnerCenter', 'pageFooter', + 'superNavHeadContainer', 'hbrDisqus', 'articleToolbarTop', 'articleToolbarBottom', 'articleToolbarRD']), dict(name='iframe')] extra_css = ''' @@ -55,9 +57,14 @@ class HBR(BasicNewsRecipe): def hbr_get_toc(self): - soup = self.index_to_soup(self.INDEX) - url = soup.find('a', text=lambda t:'Full Table of Contents' in t).parent.get('href') - return self.index_to_soup('http://hbr.org'+url) + today = date.today() + future = today + timedelta(days=30) + for x in [x.strftime('%y%m') for x in (future, today)]: + url = self.INDEX + x + soup = self.index_to_soup(url) + if not soup.find(text='Issue Not Found'): + return soup + raise Exception('Could not find current issue') def hbr_parse_section(self, container, feeds): current_section = None diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 2ec4ed83ea..186821b0c3 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -474,20 +474,13 @@ def serialize_user_metadata(metadata_elem, all_user_metadata, tail='\n'+(' '*8)) metadata_elem.append(meta) -def dump_user_categories(cats): +def dump_dict(cats): if not cats: cats = {} from calibre.ebooks.metadata.book.json_codec import object_to_unicode return json.dumps(object_to_unicode(cats), ensure_ascii=False, skipkeys=True) -def dump_author_links(links): - if not links: - links = {} - from calibre.ebooks.metadata.book.json_codec import object_to_unicode - return json.dumps(object_to_unicode(links), ensure_ascii=False, - skipkeys=True) - class OPF(object): # {{{ MIMETYPE = 'application/oebps-package+xml' @@ -544,9 +537,9 @@ class OPF(object): # {{{ formatter=parse_date, renderer=isoformat) user_categories = MetadataField('user_categories', is_dc=False, formatter=json.loads, - renderer=dump_user_categories) + renderer=dump_dict) author_link_map = MetadataField('author_link_map', is_dc=False, - formatter=json.loads, renderer=dump_author_links) + formatter=json.loads, renderer=dump_dict) def __init__(self, stream, basedir=os.getcwdu(), unquote_urls=True, populate_spine=True): @@ -1345,7 +1338,7 @@ def metadata_to_opf(mi, as_string=True): factory(DC('subject'), tag) meta = lambda n, c: factory('meta', name='calibre:'+n, content=c) if getattr(mi, 'author_link_map', None) is not None: - meta('author_link_map', dump_author_links(mi.author_link_map)) + meta('author_link_map', dump_dict(mi.author_link_map)) if mi.series: meta('series', mi.series) if mi.series_index is not None: @@ -1359,7 +1352,7 @@ def metadata_to_opf(mi, as_string=True): if mi.title_sort: meta('title_sort', mi.title_sort) if mi.user_categories: - meta('user_categories', dump_user_categories(mi.user_categories)) + meta('user_categories', dump_dict(mi.user_categories)) serialize_user_metadata(metadata, mi.get_all_user_metadata(False)) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 88c5653ee7..c9550dd01e 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -83,13 +83,14 @@ gprefs.defaults['tags_browser_partition_method'] = 'first letter' gprefs.defaults['tags_browser_collapse_at'] = 100 gprefs.defaults['edit_metadata_single_layout'] = 'default' gprefs.defaults['book_display_fields'] = [ - ('title', False), ('authors', False), ('formats', True), + ('title', False), ('authors', True), ('formats', True), ('series', True), ('identifiers', True), ('tags', True), ('path', True), ('publisher', False), ('rating', False), ('author_sort', False), ('sort', False), ('timestamp', False), ('uuid', False), ('comments', True), ('id', False), ('pubdate', False), ('last_modified', False), ('size', False), ] +gprefs.defaults['default_author_link'] = 'http://en.wikipedia.org/w/index.php?search={author}' # }}} @@ -181,14 +182,6 @@ def _config(): # {{{ help=_('Show the average rating per item indication in the tag browser')) c.add_opt('disable_animations', default=False, help=_('Disable UI animations')) - c.add_opt('default_author_link', - default='http://en.wikipedia.org/w/index.php?search={author}', - help='

' + - _('Enter a template to be used to create a link for' - 'an author in the books information dialog. This template will ' - 'be used when no link has been provided for the author using ' - 'Manage Authors. You can use the values {author} and ' - '{author_sort}, and any template function.') + '

') # This option is no longer used. It remains for compatibility with upgrades # so the value can be migrated diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 1927b1448e..2d7b3b1479 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -129,14 +129,14 @@ def render_data(mi, use_roman_numbers=True, all_fields=False): for aut in mi.authors: if mi.author_link_map[aut]: link = mi.author_link_map[aut] - elif config.get('default_author_link'): + elif gprefs.get('default_author_link'): vals = {'author': aut} try: vals['author_sort'] = mi.author_sort_map[aut] except: vals['author_sort'] = aut link = formatter.safe_format( - config.get('default_author_link'), vals, '', vals) + gprefs.get('default_author_link'), vals, '', vals) if link: authors.append(u'%s'%(urllib2.quote(link), aut)) else: diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index b3cba27bc9..8cbc2e1979 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -90,7 +90,6 @@ class BooksModel(QAbstractTableModel): # {{{ self.ids_to_highlight_set = set() self.current_highlighted_idx = None self.highlight_only = False - self.current_row = -1 self.colors = frozenset([unicode(c) for c in QColor.colorNames()]) self.formatter = SafeFormat() self.read_config() @@ -174,7 +173,6 @@ class BooksModel(QAbstractTableModel): # {{{ self.color_cache = defaultdict(dict) for row in rows: if row == current_row: - self.current_row = row self.new_bookdisplay_data.emit( self.get_book_display_info(row)) self.dataChanged.emit(self.index(row, 0), self.index(row, @@ -332,8 +330,6 @@ class BooksModel(QAbstractTableModel): # {{{ def refresh(self, reset=True): self.db.refresh(field=None) self.resort(reset=reset) - if self.current_row >= 0: - self.new_bookdisplay_data.emit(self.get_book_display_info(self.current_row)) def reset(self): self.color_cache = defaultdict(dict) @@ -373,14 +369,12 @@ class BooksModel(QAbstractTableModel): # {{{ def current_changed(self, current, previous, emit_signal=True): if current.isValid(): - self.current_row = idx = current.row() + idx = current.row() data = self.get_book_display_info(idx) if emit_signal: self.new_bookdisplay_data.emit(data) else: return data - else: - self.current_row = -1 def get_book_info(self, index): if isinstance(index, int): diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 841193373b..a0f4953c9a 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -138,7 +138,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): (_('Partitioned'), 'partition')] r('tags_browser_partition_method', gprefs, choices=choices) r('tags_browser_collapse_at', gprefs) - r('default_author_link', config) + r('default_author_link', gprefs) choices = set([k for k in db.field_metadata.all_field_keys() if db.field_metadata[k]['is_category'] and diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui index f8dc9dc782..07d533fdef 100644 --- a/src/calibre/gui2/preferences/look_feel.ui +++ b/src/calibre/gui2/preferences/look_feel.ui @@ -246,7 +246,7 @@ - + Default author link template: @@ -256,7 +256,15 @@ - + + + <p>Enter a template to be used to create a link for +an author in the books information dialog. This template will +be used when no link has been provided for the author using +Manage Authors. You can use the values {author} and +{author_sort}, and any template function. + +