mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Table of Contents tool: Generate shorter ids
This commit is contained in:
parent
a560c22452
commit
46418b6afb
@ -318,15 +318,23 @@ def get_landmarks(container):
|
|||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
|
||||||
def ensure_id(elem):
|
def ensure_id(elem, all_ids):
|
||||||
|
elem_id = elem.get('id')
|
||||||
|
if elem_id:
|
||||||
|
return False, elem_id
|
||||||
if elem.tag == XHTML('a'):
|
if elem.tag == XHTML('a'):
|
||||||
anchor = elem.get('name', None)
|
anchor = elem.get('name', None)
|
||||||
if anchor:
|
if anchor:
|
||||||
|
elem.set('id', anchor)
|
||||||
return False, anchor
|
return False, anchor
|
||||||
elem_id = elem.get('id', None)
|
c = 0
|
||||||
if elem_id:
|
while True:
|
||||||
return False, elem_id
|
c += 1
|
||||||
elem.set('id', uuid_id())
|
q = 'toc_{}'.format(c)
|
||||||
|
if q not in all_ids:
|
||||||
|
elem.set('id', q)
|
||||||
|
all_ids.add(q)
|
||||||
|
break
|
||||||
return True, elem.get('id')
|
return True, elem.get('id')
|
||||||
|
|
||||||
|
|
||||||
@ -412,6 +420,7 @@ def from_xpaths(container, xpaths):
|
|||||||
root = container.parsed(name)
|
root = container.parsed(name)
|
||||||
item_level_map = {e:i for i, elems in level_item_map.iteritems() for e in elems}
|
item_level_map = {e:i for i, elems in level_item_map.iteritems() for e in elems}
|
||||||
item_dirtied = False
|
item_dirtied = False
|
||||||
|
all_ids = set(root.xpath('//*/@id'))
|
||||||
|
|
||||||
for item in root.iterdescendants(etree.Element):
|
for item in root.iterdescendants(etree.Element):
|
||||||
lvl = item_level_map.get(item, None)
|
lvl = item_level_map.get(item, None)
|
||||||
@ -422,7 +431,7 @@ def from_xpaths(container, xpaths):
|
|||||||
if item_at_top(item):
|
if item_at_top(item):
|
||||||
dirtied, elem_id = False, None
|
dirtied, elem_id = False, None
|
||||||
else:
|
else:
|
||||||
dirtied, elem_id = ensure_id(item)
|
dirtied, elem_id = ensure_id(item, all_ids)
|
||||||
item_dirtied = dirtied or item_dirtied
|
item_dirtied = dirtied or item_dirtied
|
||||||
toc = parent.add(text, name, elem_id)
|
toc = parent.add(text, name, elem_id)
|
||||||
node_level_map[toc] = lvl
|
node_level_map[toc] = lvl
|
||||||
@ -530,7 +539,8 @@ def add_id(container, name, loc, totals=None):
|
|||||||
' before editing.') % name)
|
' before editing.') % name)
|
||||||
container.replace(name, root)
|
container.replace(name, root)
|
||||||
|
|
||||||
node.set('id', node.get('id', uuid_id()))
|
if not node.get('id'):
|
||||||
|
ensure_id(node, set(root.xpath('//*/@id')))
|
||||||
container.commit_item(name, keep_parsed=True)
|
container.commit_item(name, keep_parsed=True)
|
||||||
return node.get('id')
|
return node.get('id')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user