def run_searches(self): while True: x = self.search_tasks.get() if x is None: break search_query, current_name = x try: manifest = get_manifest() or {} spine = manifest.get('spine', ()) idx_map = {name: i for i, name in enumerate(spine)} spine_idx = idx_map.get(current_name, -1) except Exception: import traceback traceback.print_exc() spine_idx = -1 if spine_idx < 0: self.results_found.emit(SearchFinished(search_query)) continue num_in_spine = len(spine) result_num = 0 for n in range(num_in_spine): idx = (spine_idx + n) % num_in_spine name = spine[idx] counter = Counter() try: for i, result in enumerate( search_in_name(name, search_query)): before, text, after, offset = result q = (before or '')[-5:] + text + (after or '')[:5] result_num += 1 self.results_found.emit( SearchResult(search_query, before, text, after, q, name, idx, counter[q], offset, result_num)) counter[q] += 1 except Exception: import traceback traceback.print_exc() self.results_found.emit(SearchFinished(search_query))
def get_toc_data(): manifest = get_manifest() or {} spine = manifest.get('spine') or [] spine_toc_map = {name: [] for name in spine} def process_node(node): items = spine_toc_map.get(node['dest']) if items is not None: items.append(node) children = node.get('children') if children: for child in children: process_node(child) toc = manifest.get('toc') if toc: process_node(toc) return { 'spine': tuple(spine), 'spine_toc_map': spine_toc_map, 'spine_idx_map': {name: idx for idx, name in enumerate(spine)} }