diff --git a/ebook_converter/__init__.py b/ebook_converter/__init__.py index 3664289..96bc492 100644 --- a/ebook_converter/__init__.py +++ b/ebook_converter/__init__.py @@ -4,6 +4,7 @@ __copyright__ = '2008, Kovid Goyal ' __docformat__ = 'restructuredtext en' import sys, os, re, time, random, warnings +import pkg_resources from ebook_converter.polyglot.builtins import codepoint_to_chr, unicode_type, range, hasenv, native_string_type from math import floor from functools import partial @@ -34,7 +35,8 @@ _mt_inited = False def _init_mimetypes(): global _mt_inited import mimetypes - mimetypes.init([P('mime.types')]) + mimetypes.init([pkg_resources.resource_filename('ebook_converter', + 'data/mime.types')]) _mt_inited = True diff --git a/ebook_converter/ebooks/conversion/plugins/rtf_input.py b/ebook_converter/ebooks/conversion/plugins/rtf_input.py index 3917335..c26a917 100644 --- a/ebook_converter/ebooks/conversion/plugins/rtf_input.py +++ b/ebook_converter/ebooks/conversion/plugins/rtf_input.py @@ -3,6 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import os, glob, re, textwrap +import pkg_resources from ebook_converter.customize.conversion import InputFormatPlugin, OptionRecommendation from ebook_converter.polyglot.builtins import iteritems, filter, getcwd, as_bytes @@ -282,7 +283,9 @@ class RTFInput(InputFormatPlugin): self.log('Converting XML to HTML...') inline_class = InlineClass(self.log) - styledoc = safe_xml_fromstring(P('templates/rtf.xsl', data=True), recover=False) + with open(pkg_resources.resource_filename('ebook_converter', + 'data/rtf.xsl')) as fobj: + styledoc = safe_xml_fromstring(fobj.read()) extensions = {('calibre', 'inline-class') : inline_class} transform = etree.XSLT(styledoc, extensions=extensions) result = transform(doc) diff --git a/ebook_converter/ebooks/oeb/stylizer.py b/ebook_converter/ebooks/oeb/stylizer.py index 26cb61c..0a2a553 100644 --- a/ebook_converter/ebooks/oeb/stylizer.py +++ b/ebook_converter/ebooks/oeb/stylizer.py @@ -9,6 +9,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' import os, re, logging, copy, unicodedata, numbers +import pkg_resources from operator import itemgetter from weakref import WeakKeyDictionary from xml.dom import SyntaxErr as CSSSyntaxError @@ -32,7 +33,8 @@ _html_css_stylesheet = None def html_css_stylesheet(): global _html_css_stylesheet if _html_css_stylesheet is None: - with open(P('templates/html.css'), 'rb') as f: + with open(pkg_resources.resource_filename('ebook_converter', + 'data/html.css'), 'rb') as f: html_css = f.read().decode('utf-8') _html_css_stylesheet = parseString(html_css, validate=False) return _html_css_stylesheet diff --git a/ebook_converter/utils/localization.py b/ebook_converter/utils/localization.py index 3f2de4c..b1e86dc 100644 --- a/ebook_converter/utils/localization.py +++ b/ebook_converter/utils/localization.py @@ -3,7 +3,9 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os, locale, re, io, sys +import json from gettext import GNUTranslations, NullTranslations +import pkg_resources from ebook_converter.polyglot.builtins import is_py3, iteritems, unicode_type @@ -361,12 +363,53 @@ for k in _extra_lang_codes: def _load_iso639(): global _iso639 + + # NOTE(gryf): msgpacked data was originally added for speed purposes. In + # my tests, I cannot see any speed gain either on python2 or python3. It + # is even slower (around 4-8 times), than just using code below (which is + # excerpt form Calibre transform code which is executed during Calibre + # build). if _iso639 is None: - ip = P('localization/iso639.calibre_msgpack', allow_user_override=False, data=True) - from ebook_converter.utils.serialize import msgpack_loads - _iso639 = msgpack_loads(ip) - if 'by_3' not in _iso639: - _iso639['by_3'] = _iso639['by_3t'] + src = pkg_resources.resource_filename('ebook_converter', + 'data/iso_639-3.json') + + with open(src, 'rb') as f: + root = json.load(f) + + entries = root['639-3'] + by_2 = {} + by_3 = {} + m2to3 = {} + m3to2 = {} + nm = {} + codes2, codes3 = set(), set() + for x in entries: + two = x.get('alpha_2') + threeb = x.get('alpha_3') + if threeb is None: + continue + name = x.get('inverted_name') or x.get('name') + if not name or name[0] in '!~=/\'"': + continue + + if two is not None: + by_2[two] = name + codes2.add(two) + m2to3[two] = threeb + m3to2[threeb] = two + codes3.add(threeb) + by_3[threeb] = name + base_name = name.lower() + nm[base_name] = threeb + + _iso639 = {'by_2': by_2, + 'by_3': by_3, + 'codes2': codes2, + 'codes3': codes3, + '2to3': m2to3, + '3to2': m3to2, + 'name_map': nm} + return _iso639