def read_font_metadata(self, path, fileid): with lopen(path, 'rb') as f: try: fm = FontMetadata(f) except UnsupportedFont: self.cached_fonts[fileid] = {} else: data = fm.to_dict() data['path'] = path self.cached_fonts[fileid] = data
def add_fonts(parent): from calibre.utils.fonts.metadata import FontMetadata files = choose_files(parent, 'add fonts to calibre', _('Select font files'), filters=[(_('TrueType/OpenType Fonts'), ['ttf', 'otf'])], all_files=False) if not files: return families = set() for f in files: try: with open(f, 'rb') as stream: fm = FontMetadata(stream) except: import traceback error_dialog(parent, _('Corrupt font'), _('Failed to read metadata from the font file: %s') % f, det_msg=traceback.format_exc(), show=True) return families.add(fm.font_family) families = sorted(families) dest = os.path.join(config_dir, 'fonts') for f in files: shutil.copyfile(f, os.path.join(dest, os.path.basename(f))) return families
def rule_for_font(font_file, added_name): try: fm = FontMetadata(font_file).to_dict() except UnsupportedFont: return pp = _('Change this to the relative path to: %s') % added_name rule = '''@font-face {{ src: url({pp}); font-family: "{ff}"; font-weight: {w}; font-style: {sy}; font-stretch: {st}; }}'''.format(pp=pp, ff=fm['font-family'], w=fm['font-weight'], sy=fm['font-style'], st=fm['font-stretch']) return rule
def add_fonts(self): from calibre.utils.fonts.metadata import FontMetadata files = choose_files(self, 'add fonts to calibre', _('Select font files'), filters=[(_('TrueType/OpenType Fonts'), ['ttf', 'otf'])], all_files=False) if not files: return families = set() for f in files: try: with open(f, 'rb') as stream: fm = FontMetadata(stream) except: import traceback error_dialog( self, _('Corrupt font'), _('Failed to read metadata from the font file: %s') % f, det_msg=traceback.format_exc(), show=True) return families.add(fm.font_family) families = sorted(families) dest = os.path.join(config_dir, 'fonts') for f in files: shutil.copyfile(f, os.path.join(dest, os.path.basename(f))) self.font_scanner.do_scan() self.m.beginResetModel() self.build_font_list() self.m.endResetModel() self.view.setCurrentIndex(self.m.index(0)) if families: for i, val in enumerate(self.families): if icu_lower(val) == icu_lower(families[0]): self.view.setCurrentIndex(self.m.index(i)) break info_dialog(self, _('Added fonts'), _('Added font families: %s') % (', '.join(families)), show=True)
def show_font_face_rule_for_font_file(file_data, added_name, parent=None): try: fm = FontMetadata(BytesIO(file_data)).to_dict() except UnsupportedFont: return pp = _('Change this to the relative path to: %s') % added_name rule = '''@font-face {{ src: url({pp}); font-family: "{ff}"; font-weight: {w}; font-style: {sy}; font-stretch: {st}; }}'''.format(pp=pp, ff=fm['font-family'], w=fm['font-weight'], sy=fm['font-style'], st=fm['font-stretch']) QApplication.clipboard().setText(rule) QMessageBox.information( parent, _('Font file added'), _('The font file <b>{}</b> has been added. The text for the CSS @font-face rule for this file has been copied' ' to the clipboard. You should paste it into whichever css file you want to add this font to.' ).format(added_name))