mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 10:44:09 -04:00
Setting of application_id
Also when deleting elements, remove all refines that refer to them
This commit is contained in:
parent
1d7eaaafac
commit
9e6ee404b9
@ -43,6 +43,12 @@ def regex(r, flags=0):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
_re_cache[(r, flags)] = ans = re.compile(r, flags)
|
_re_cache[(r, flags)] = ans = re.compile(r, flags)
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
def remove_element(e, refines):
|
||||||
|
e.getparent().remove(e)
|
||||||
|
for x in refines[e.get('id')]:
|
||||||
|
x.getparent().remove(x)
|
||||||
|
refines.pop(e.get('id'), None)
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Prefixes {{{
|
# Prefixes {{{
|
||||||
@ -133,7 +139,7 @@ def set_identifiers(root, prefixes, refines, new_identifiers, force_identifiers=
|
|||||||
continue
|
continue
|
||||||
scheme, val = parse_identifier(ident, val, refines)
|
scheme, val = parse_identifier(ident, val, refines)
|
||||||
if not scheme or not val or force_identifiers or scheme in new_identifiers:
|
if not scheme or not val or force_identifiers or scheme in new_identifiers:
|
||||||
ident.getparent().remove(ident)
|
remove_element(ident, refines)
|
||||||
continue
|
continue
|
||||||
metadata = XPath('./opf:metadata')(root)[0]
|
metadata = XPath('./opf:metadata')(root)[0]
|
||||||
for scheme, val in new_identifiers.iteritems():
|
for scheme, val in new_identifiers.iteritems():
|
||||||
@ -145,6 +151,26 @@ def set_identifiers(root, prefixes, refines, new_identifiers, force_identifiers=
|
|||||||
p = package_identifier.getparent()
|
p = package_identifier.getparent()
|
||||||
p.insert(p.index(package_identifier), ident)
|
p.insert(p.index(package_identifier), ident)
|
||||||
|
|
||||||
|
def set_application_id(root, refines, new_application_id=None):
|
||||||
|
uid = root.get('unique-identifier')
|
||||||
|
package_identifier = None
|
||||||
|
for ident in XPath('./opf:metadata/dc:identifier')(root):
|
||||||
|
is_package_id = uid is not None and uid == ident.get('id')
|
||||||
|
if is_package_id:
|
||||||
|
package_identifier = ident
|
||||||
|
val = (ident.text or '').strip()
|
||||||
|
if val.startswith('calibre:') and not is_package_id:
|
||||||
|
remove_element(ident, refines)
|
||||||
|
metadata = XPath('./opf:metadata')(root)[0]
|
||||||
|
if new_application_id:
|
||||||
|
ident = metadata.makeelement(DC('identifier'))
|
||||||
|
ident.text = 'calibre:%s' % new_application_id
|
||||||
|
if package_identifier is None:
|
||||||
|
metadata.append(ident)
|
||||||
|
else:
|
||||||
|
p = package_identifier.getparent()
|
||||||
|
p.insert(p.index(package_identifier), ident)
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
def read_metadata(root):
|
def read_metadata(root):
|
||||||
|
@ -11,7 +11,7 @@ from lxml import etree
|
|||||||
|
|
||||||
from calibre.ebooks.metadata.opf3 import (
|
from calibre.ebooks.metadata.opf3 import (
|
||||||
parse_prefixes, reserved_prefixes, expand_prefix, read_identifiers,
|
parse_prefixes, reserved_prefixes, expand_prefix, read_identifiers,
|
||||||
read_metadata, set_identifiers, XPath
|
read_metadata, set_identifiers, XPath, set_application_id
|
||||||
)
|
)
|
||||||
|
|
||||||
TEMPLATE = '''<package xmlns="http://www.idpf.org/2007/opf" version="3.0" unique-identifier="uid"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">{metadata}</metadata></package>''' # noqa
|
TEMPLATE = '''<package xmlns="http://www.idpf.org/2007/opf" version="3.0" unique-identifier="uid"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">{metadata}</metadata></package>''' # noqa
|
||||||
@ -51,9 +51,12 @@ class TestOPF3(unittest.TestCase):
|
|||||||
(idt('a:1')+idt('a:2'), {'a':['1', '2']}),
|
(idt('a:1')+idt('a:2'), {'a':['1', '2']}),
|
||||||
):
|
):
|
||||||
self.ae(result, ri(self.get_opf(m)))
|
self.ae(result, ri(self.get_opf(m)))
|
||||||
mi = read_metadata(self.get_opf(
|
root = self.get_opf(metadata=idt('a:1')+idt('a:2')+idt('calibre:x')+idt('uuid:y'))
|
||||||
metadata=idt('a:1')+idt('a:2')+idt('calibre:x')+idt('uuid:y')))
|
mi = read_metadata(root)
|
||||||
self.ae(mi.application_id, 'x')
|
self.ae(mi.application_id, 'x')
|
||||||
|
set_application_id(root, default_refines, 'y')
|
||||||
|
mi = read_metadata(root)
|
||||||
|
self.ae(mi.application_id, 'y')
|
||||||
|
|
||||||
root = self.get_opf(metadata=idt('i:1', iid='uid') + idt('r:1') + idt('o:1'))
|
root = self.get_opf(metadata=idt('i:1', iid='uid') + idt('r:1') + idt('o:1'))
|
||||||
set_identifiers(root, reserved_prefixes, default_refines, {'i':'2', 'o':'2'})
|
set_identifiers(root, reserved_prefixes, default_refines, {'i':'2', 'o':'2'})
|
||||||
@ -62,6 +65,10 @@ class TestOPF3(unittest.TestCase):
|
|||||||
root = self.get_opf(metadata=idt('i:1', iid='uid') + idt('r:1') + idt('o:1'))
|
root = self.get_opf(metadata=idt('i:1', iid='uid') + idt('r:1') + idt('o:1'))
|
||||||
set_identifiers(root, reserved_prefixes, default_refines, {'i':'2', 'o':'2'}, force_identifiers=True)
|
set_identifiers(root, reserved_prefixes, default_refines, {'i':'2', 'o':'2'}, force_identifiers=True)
|
||||||
self.ae({'i':['2', '1'], 'o':['2']}, ri(root))
|
self.ae({'i':['2', '1'], 'o':['2']}, ri(root))
|
||||||
|
root = self.get_opf(metadata=idt('i:1', iid='uid') + idt('r:1') + idt('o:1'))
|
||||||
|
set_application_id(root, default_refines, 'y')
|
||||||
|
mi = read_metadata(root)
|
||||||
|
self.ae(mi.application_id, 'y')
|
||||||
|
|
||||||
class TestRunner(unittest.main):
|
class TestRunner(unittest.main):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user