mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Workaround for dictionaries that use incorrect relative paths in their .xcu files. Fixes #1477561 [Unable to import italian dictionary](https://bugs.launchpad.net/calibre/+bug/1477561)
This commit is contained in:
parent
8f75f2d5ad
commit
5edd84e213
@ -104,6 +104,19 @@ def import_from_oxt(source_path, name, dest_dir=None, prefix='dic-'):
|
|||||||
os.makedirs(dest_dir)
|
os.makedirs(dest_dir)
|
||||||
num = 0
|
num = 0
|
||||||
with ZipFile(source_path) as zf:
|
with ZipFile(source_path) as zf:
|
||||||
|
|
||||||
|
def read_file(key):
|
||||||
|
try:
|
||||||
|
return zf.open(key).read()
|
||||||
|
except KeyError:
|
||||||
|
# Some dictionaries apparently put the xcu in a sub-directory
|
||||||
|
# and incorrectly make paths relative to that directory instead
|
||||||
|
# of the root, for example:
|
||||||
|
# http://extensions.libreoffice.org/extension-center/italian-dictionary-thesaurus-hyphenation-patterns/releases/4.1/dict-it.oxt
|
||||||
|
while key.startswith('../'):
|
||||||
|
key = key[3:]
|
||||||
|
return zf.open(key.lstrip('/')).read()
|
||||||
|
|
||||||
root = etree.fromstring(zf.open('META-INF/manifest.xml').read())
|
root = etree.fromstring(zf.open('META-INF/manifest.xml').read())
|
||||||
xcu = XPath('//manifest:file-entry[@manifest:media-type="application/vnd.sun.star.configuration-data"]')(root)[0].get(
|
xcu = XPath('//manifest:file-entry[@manifest:media-type="application/vnd.sun.star.configuration-data"]')(root)[0].get(
|
||||||
'{%s}full-path' % NS_MAP['manifest'])
|
'{%s}full-path' % NS_MAP['manifest'])
|
||||||
@ -116,7 +129,7 @@ def import_from_oxt(source_path, name, dest_dir=None, prefix='dic-'):
|
|||||||
metadata = [name] + list(locales)
|
metadata = [name] + list(locales)
|
||||||
with open(os.path.join(d, 'locales'), 'wb') as f:
|
with open(os.path.join(d, 'locales'), 'wb') as f:
|
||||||
f.write(('\n'.join(metadata)).encode('utf-8'))
|
f.write(('\n'.join(metadata)).encode('utf-8'))
|
||||||
dd, ad = convert_to_utf8(zf.open(dic).read(), zf.open(aff).read())
|
dd, ad = convert_to_utf8(read_file(dic), read_file(aff))
|
||||||
with open(os.path.join(d, '%s.dic' % locales[0]), 'wb') as f:
|
with open(os.path.join(d, '%s.dic' % locales[0]), 'wb') as f:
|
||||||
f.write(dd)
|
f.write(dd)
|
||||||
with open(os.path.join(d, '%s.aff' % locales[0]), 'wb') as f:
|
with open(os.path.join(d, '%s.aff' % locales[0]), 'wb') as f:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user