diff --git a/src/calibre/ebooks/metadata/__init__.py b/src/calibre/ebooks/metadata/__init__.py index 8a08817450..1b80da5d09 100644 --- a/src/calibre/ebooks/metadata/__init__.py +++ b/src/calibre/ebooks/metadata/__init__.py @@ -395,7 +395,7 @@ def check_doi(doi): return None def rating_to_stars(value, allow_half_stars=False, star=u'★', half=u'½'): - r = max(0, min(int(value), 10)) + r = max(0, min(int(value or 0), 10)) if allow_half_stars: ans = u'★' * (r // 2) if r % 2: diff --git a/src/calibre/ebooks/metadata/book/render.py b/src/calibre/ebooks/metadata/book/render.py index b0f07ec24c..b930b080a2 100644 --- a/src/calibre/ebooks/metadata/book/render.py +++ b/src/calibre/ebooks/metadata/book/render.py @@ -11,7 +11,7 @@ from functools import partial from binascii import hexlify from calibre import prepare_string_for_xml, force_unicode -from calibre.ebooks.metadata import fmt_sidx +from calibre.ebooks.metadata import fmt_sidx, rating_to_stars from calibre.ebooks.metadata.sources.identify import urls_from_identifiers from calibre.constants import filesystem_encoding from calibre.library.comments import comments_to_html, markdown @@ -106,12 +106,7 @@ def mi_to_html(mi, field_list=None, default_author_link=None, use_roman_numbers= elif metadata['datatype'] == 'rating': val = getattr(mi, field) if val: - if disp.get('allow_half_stars'): - val = max(0, min(int(val), 10)) - star_string = u'\u2605' * (val // 2) + (u'\u00bd' if val % 2 else '') - else: - val = max(0, min(int(val/2.0), 5)) - star_string = u'\u2605' * val + star_string = rating_to_stars(val, disp.get('allow_half_stars', False)) ans.append((field, u'%s%s'%( diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index 5c19934e87..1a22c2c685 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -13,6 +13,7 @@ from PyQt5.Qt import (QImage, QSizePolicy, QTimer, QDialog, Qt, QSize, QAction, QStackedLayout, QLabel, QByteArray, pyqtSignal, QKeySequence, QFont) from calibre import plugins +from calibre.ebooks.metadata import rating_to_stars from calibre.constants import islinux from calibre.gui2 import (config, available_height, available_width, gprefs, rating_font) @@ -125,7 +126,7 @@ if pictureflow is not None: def subtitle(self, index): if gprefs['show_rating_in_cover_browser']: try: - return u'\u2605'*self.model.rating(index) + return rating_to_stars(self.model.rating(index) * 2) except: pass return '' diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index ace9ad5de3..b8083e3a54 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -23,7 +23,7 @@ from PyQt5.Qt import ( from calibre import fit_image, prints, prepare_string_for_xml, human_readable from calibre.constants import DEBUG, config_dir -from calibre.ebooks.metadata import fmt_sidx +from calibre.ebooks.metadata import fmt_sidx, rating_to_stars from calibre.utils import join_with_timeout from calibre.gui2 import gprefs, config from calibre.gui2.library.caches import CoverCache, ThumbnailCache @@ -392,7 +392,7 @@ class CoverDelegate(QStyledItemDelegate): mi = db.get_proxy_metadata(book_id) display_name, ans, val, fm = mi.format_field_extended(field) if fm and fm['datatype'] == 'rating': - ans = u'\u2605' * int(val/2.0) if val is not None else '' + ans = rating_to_stars(val, fm['display'].get('allow_half_stars', False)) return '' if ans is None else unicode(ans) except Exception: if DEBUG: diff --git a/src/calibre/utils/fonts/utils.py b/src/calibre/utils/fonts/utils.py index 11154057fd..f3b2709e95 100644 --- a/src/calibre/utils/fonts/utils.py +++ b/src/calibre/utils/fonts/utils.py @@ -418,7 +418,7 @@ def test_glyph_ids(): def test_supports_text(): data = P('fonts/calibreSymbols.otf', data=True) - if not supports_text(data, '.\u2605★'): + if not supports_text(data, '.★½'): raise RuntimeError('Incorrectly returning that text is not supported') if supports_text(data, 'abc'): raise RuntimeError('Incorrectly claiming that text is supported')