Finish OPF23

This commit is contained in:
Kovid Goyal 2018-04-11 19:48:54 +05:30
parent a359127473
commit e64afede00
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 37 additions and 3 deletions

View File

@ -837,7 +837,7 @@ def deserialize_user_metadata(val):
read_user_metadata3 = dict_reader('user_metadata', load=deserialize_user_metadata, try2=False) read_user_metadata3 = dict_reader('user_metadata', load=deserialize_user_metadata, try2=False)
def read_user_metadata2(root): def read_user_metadata2(root, remove_tags=False):
ans = {} ans = {}
for meta in XPath('./opf:metadata/opf:meta[starts-with(@name, "calibre:user_metadata:")]')(root): for meta in XPath('./opf:metadata/opf:meta[starts-with(@name, "calibre:user_metadata:")]')(root):
name = meta.get('name') name = meta.get('name')
@ -845,6 +845,8 @@ def read_user_metadata2(root):
if not name or not name.startswith('#'): if not name or not name.startswith('#'):
continue continue
fm = meta.get('content') fm = meta.get('content')
if remove_tags:
meta.getparent().remove(meta)
try: try:
fm = json.loads(fm, object_hook=from_json) fm = json.loads(fm, object_hook=from_json)
decode_is_multiple(fm) decode_is_multiple(fm)

View File

@ -7,8 +7,9 @@ from __future__ import absolute_import, division, print_function, unicode_litera
from lxml import etree from lxml import etree
from calibre.ebooks.metadata.opf3 import ( from calibre.ebooks.metadata.opf3 import (
DC, OPF, XPath, create_rating, create_series, create_timestamp, ensure_id, DC, OPF, XPath, create_rating, create_series, create_timestamp,
parse_date, read_prefixes, read_refines, refdef, remove_element, set_refines encode_is_multiple, ensure_id, parse_date, read_prefixes, read_refines,
read_user_metadata2, refdef, remove_element, set_refines, set_user_metadata3
) )
from calibre.ebooks.metadata.utils import parse_opf, pretty_print_opf from calibre.ebooks.metadata.utils import parse_opf, pretty_print_opf
@ -132,6 +133,35 @@ def upgrade_series(root, data):
create_series(root, data.refines, series, series_index) create_series(root, data.refines, series, series_index)
def upgrade_custom(root, data):
m = read_user_metadata2(root, remove_tags=True)
if m:
for fm in m.itervalues():
encode_is_multiple(fm)
set_user_metadata3(root, data.prefixes, data.refines, m)
def upgrade_meta(root, data):
for meta in XPath('./opf:metadata/opf:meta[@name]')(root):
name, content = meta.get('name'), meta.get('content') or ''
if name.startswith('rendition:'):
name = name.partition(':')[-1]
prop = None
if name in ('orientation', 'layout', 'spread'):
prop = 'rendition:' + name
elif name == 'fixed-layout':
prop = 'rendition:layout'
content = {'true': 'pre-paginated'}.get(content.lower(), 'reflowable')
elif name == 'orientation-lock':
prop = 'rendition:orientation'
content = {'portrait': 'portrait', 'landscape': 'landscape'}.get(content.lower(), 'auto')
if prop:
del meta.attrib['name']
del meta.attrib['content']
meta.set('property', prop)
meta.text = content
def remove_invalid_attrs_in_dc_metadata(root, data): def remove_invalid_attrs_in_dc_metadata(root, data):
for tag in XPath('//*[namespace-uri() = "{}"]'.format(DC('')[1:-1]))(root): for tag in XPath('//*[namespace-uri() = "{}"]'.format(DC('')[1:-1]))(root):
for k in tuple(tag.attrib): for k in tuple(tag.attrib):
@ -152,6 +182,8 @@ def upgrade_metadata(root):
upgrade_date(root, data) upgrade_date(root, data)
upgrade_rating(root, data) upgrade_rating(root, data)
upgrade_series(root, data) upgrade_series(root, data)
upgrade_custom(root, data)
upgrade_meta(root, data)
remove_invalid_attrs_in_dc_metadata(root, data) remove_invalid_attrs_in_dc_metadata(root, data)
pretty_print_opf(root) pretty_print_opf(root)