mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Finish OPF23
This commit is contained in:
parent
a359127473
commit
e64afede00
@ -837,7 +837,7 @@ def deserialize_user_metadata(val):
|
||||
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 = {}
|
||||
for meta in XPath('./opf:metadata/opf:meta[starts-with(@name, "calibre:user_metadata:")]')(root):
|
||||
name = meta.get('name')
|
||||
@ -845,6 +845,8 @@ def read_user_metadata2(root):
|
||||
if not name or not name.startswith('#'):
|
||||
continue
|
||||
fm = meta.get('content')
|
||||
if remove_tags:
|
||||
meta.getparent().remove(meta)
|
||||
try:
|
||||
fm = json.loads(fm, object_hook=from_json)
|
||||
decode_is_multiple(fm)
|
||||
|
@ -7,8 +7,9 @@ from __future__ import absolute_import, division, print_function, unicode_litera
|
||||
from lxml import etree
|
||||
|
||||
from calibre.ebooks.metadata.opf3 import (
|
||||
DC, OPF, XPath, create_rating, create_series, create_timestamp, ensure_id,
|
||||
parse_date, read_prefixes, read_refines, refdef, remove_element, set_refines
|
||||
DC, OPF, XPath, create_rating, create_series, create_timestamp,
|
||||
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
|
||||
|
||||
@ -132,6 +133,35 @@ def upgrade_series(root, data):
|
||||
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):
|
||||
for tag in XPath('//*[namespace-uri() = "{}"]'.format(DC('')[1:-1]))(root):
|
||||
for k in tuple(tag.attrib):
|
||||
@ -152,6 +182,8 @@ def upgrade_metadata(root):
|
||||
upgrade_date(root, data)
|
||||
upgrade_rating(root, data)
|
||||
upgrade_series(root, data)
|
||||
upgrade_custom(root, data)
|
||||
upgrade_meta(root, data)
|
||||
|
||||
remove_invalid_attrs_in_dc_metadata(root, data)
|
||||
pretty_print_opf(root)
|
||||
|
Loading…
x
Reference in New Issue
Block a user