mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix counting for collapse nodes
This commit is contained in:
parent
491cd2478c
commit
2193d50e65
@ -200,7 +200,7 @@ def get_name_components(name):
|
|||||||
components = [name]
|
components = [name]
|
||||||
return components
|
return components
|
||||||
|
|
||||||
def collapse_partition(items, category_node, idx, tag, opts, top_level_component,
|
def collapse_partition(collapse_nodes, items, category_node, idx, tag, opts, top_level_component,
|
||||||
cat_len, category_is_hierarchical, category_items, eval_formatter, is_gst,
|
cat_len, category_is_hierarchical, category_items, eval_formatter, is_gst,
|
||||||
last_idx, node_parent):
|
last_idx, node_parent):
|
||||||
# Only partition at the top level. This means that we must not do a break
|
# Only partition at the top level. This means that we must not do a break
|
||||||
@ -228,11 +228,12 @@ def collapse_partition(items, category_node, idx, tag, opts, top_level_component
|
|||||||
parent=category_node['id'], is_editable=False, is_gst=is_gst,
|
parent=category_node['id'], is_editable=False, is_gst=is_gst,
|
||||||
is_hierarchical=category_is_hierarchical, is_searchable=False)
|
is_hierarchical=category_is_hierarchical, is_searchable=False)
|
||||||
node_parent = {'id':node_id, 'children':[]}
|
node_parent = {'id':node_id, 'children':[]}
|
||||||
|
collapse_nodes.append(node_parent)
|
||||||
category_node['children'].append(node_parent)
|
category_node['children'].append(node_parent)
|
||||||
last_idx = idx # remember where we last partitioned
|
last_idx = idx # remember where we last partitioned
|
||||||
return last_idx, node_parent
|
return last_idx, node_parent
|
||||||
|
|
||||||
def collapse_first_letter(items, category_node, cl_list, idx, is_gst, category_is_hierarchical, collapse_letter, node_parent):
|
def collapse_first_letter(collapse_nodes, items, category_node, cl_list, idx, is_gst, category_is_hierarchical, collapse_letter, node_parent):
|
||||||
cl = cl_list[idx]
|
cl = cl_list[idx]
|
||||||
if cl != collapse_letter:
|
if cl != collapse_letter:
|
||||||
collapse_letter = cl
|
collapse_letter = cl
|
||||||
@ -242,9 +243,12 @@ def collapse_first_letter(items, category_node, cl_list, idx, is_gst, category_i
|
|||||||
is_hierarchical=category_is_hierarchical)
|
is_hierarchical=category_is_hierarchical)
|
||||||
node_parent = {'id':node_id, 'children':[]}
|
node_parent = {'id':node_id, 'children':[]}
|
||||||
category_node['children'].append(node_parent)
|
category_node['children'].append(node_parent)
|
||||||
|
collapse_nodes.append(node_parent)
|
||||||
return collapse_letter, node_parent
|
return collapse_letter, node_parent
|
||||||
|
|
||||||
def process_category_node(category_node, items, category_data, eval_formatter, field_metadata, opts, tag_map, hierarchical_tags, node_to_tag_map):
|
def process_category_node(
|
||||||
|
category_node, items, category_data, eval_formatter, field_metadata,
|
||||||
|
opts, tag_map, hierarchical_tags, node_to_tag_map, collapse_nodes):
|
||||||
category = items[category_node['id']]['category']
|
category = items[category_node['id']]['category']
|
||||||
category_items = category_data[category]
|
category_items = category_data[category]
|
||||||
cat_len = len(category_items)
|
cat_len = len(category_items)
|
||||||
@ -288,12 +292,12 @@ def process_category_node(category_node, items, category_data, eval_formatter, f
|
|||||||
if collapsible:
|
if collapsible:
|
||||||
if partitioned:
|
if partitioned:
|
||||||
last_idx, node_parent = collapse_partition(
|
last_idx, node_parent = collapse_partition(
|
||||||
items, category_node, idx, tag, opts, top_level_component,
|
collapse_nodes, items, category_node, idx, tag, opts, top_level_component,
|
||||||
cat_len, category_is_hierarchical, category_items,
|
cat_len, category_is_hierarchical, category_items,
|
||||||
eval_formatter, is_gst, last_idx, node_parent)
|
eval_formatter, is_gst, last_idx, node_parent)
|
||||||
else: # by 'first letter'
|
else: # by 'first letter'
|
||||||
collapse_letter, node_parent = collapse_first_letter(
|
collapse_letter, node_parent = collapse_first_letter(
|
||||||
items, category_node, cl_list, idx, is_gst, category_is_hierarchical, collapse_letter, node_parent)
|
collapse_nodes, items, category_node, cl_list, idx, is_gst, category_is_hierarchical, collapse_letter, node_parent)
|
||||||
else:
|
else:
|
||||||
node_parent = category_node
|
node_parent = category_node
|
||||||
|
|
||||||
@ -340,11 +344,16 @@ def process_category_node(category_node, items, category_data, eval_formatter, f
|
|||||||
items[node_parent['id']]['id_set'] |= tag.id_set
|
items[node_parent['id']]['id_set'] |= tag.id_set
|
||||||
node_parent = orig_node_parent
|
node_parent = orig_node_parent
|
||||||
|
|
||||||
|
def iternode_descendants(node):
|
||||||
|
for child in node['children']:
|
||||||
|
yield child
|
||||||
|
for x in iternode_descendants(child):
|
||||||
|
yield x
|
||||||
|
|
||||||
def fillout_tree(root, items, node_id_map, category_nodes, category_data, field_metadata, opts):
|
def fillout_tree(root, items, node_id_map, category_nodes, category_data, field_metadata, opts):
|
||||||
eval_formatter = EvalFormatter()
|
eval_formatter = EvalFormatter()
|
||||||
tag_map, hierarchical_tags, node_to_tag_map = {}, set(), {}
|
tag_map, hierarchical_tags, node_to_tag_map = {}, set(), {}
|
||||||
first, later = [], []
|
first, later, collapse_nodes = [], [], []
|
||||||
# User categories have to be processed after normal categories as they can
|
# User categories have to be processed after normal categories as they can
|
||||||
# reference hierarchical nodes that were created only during processing of
|
# reference hierarchical nodes that were created only during processing of
|
||||||
# normal categories
|
# normal categories
|
||||||
@ -355,7 +364,10 @@ def fillout_tree(root, items, node_id_map, category_nodes, category_data, field_
|
|||||||
|
|
||||||
for coll in (first, later):
|
for coll in (first, later):
|
||||||
for cnode in coll:
|
for cnode in coll:
|
||||||
process_category_node(cnode, items, category_data, eval_formatter, field_metadata, opts, tag_map, hierarchical_tags, node_to_tag_map)
|
process_category_node(
|
||||||
|
cnode, items, category_data, eval_formatter, field_metadata,
|
||||||
|
opts, tag_map, hierarchical_tags, node_to_tag_map,
|
||||||
|
collapse_nodes)
|
||||||
|
|
||||||
# Do not store id_set in the tag items as it is a lot of data, with not
|
# Do not store id_set in the tag items as it is a lot of data, with not
|
||||||
# much use. Instead only update the counts based on id_set
|
# much use. Instead only update the counts based on id_set
|
||||||
@ -364,6 +376,10 @@ def fillout_tree(root, items, node_id_map, category_nodes, category_data, field_
|
|||||||
if id_len:
|
if id_len:
|
||||||
item['count'] = id_len
|
item['count'] = id_len
|
||||||
|
|
||||||
|
for node in collapse_nodes:
|
||||||
|
item = items[node['id']]
|
||||||
|
item['count'] = sum(1 for _ in iternode_descendants(node))
|
||||||
|
|
||||||
def render_categories(field_metadata, opts, category_data):
|
def render_categories(field_metadata, opts, category_data):
|
||||||
items = {}
|
items = {}
|
||||||
root, node_id_map, category_nodes = create_toplevel_tree(category_data, items, field_metadata, opts)
|
root, node_id_map, category_nodes = create_toplevel_tree(category_data, items, field_metadata, opts)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user