From d720400d77fb8a3e7450b18842c02d91cff99b5a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 18 May 2021 09:57:03 +0530 Subject: [PATCH] Port TOCOffsetMap to rapydscript --- src/pyj/read_book/search_worker.pyj | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/pyj/read_book/search_worker.pyj b/src/pyj/read_book/search_worker.pyj index b2963c2c45..3fed4ea76e 100644 --- a/src/pyj/read_book/search_worker.pyj +++ b/src/pyj/read_book/search_worker.pyj @@ -51,6 +51,40 @@ def text_to_regex(text): return ans.join('') +class ToCOffsetMap: + + def __init__(self, toc_nodes, offset_map, previous_toc_node, parent_map): + self.toc_nodes = toc_nodes or v'[]' + self.offset_map = offset_map or {} + self.previous_toc_node = previous_toc_node or None + self.parent_map = parent_map or {} + + def toc_nodes_for_offset(self, offset): + matches = v'[]' + for node in self.toc_nodes: + q = self.offset_map[node.id] + if q?: + if q > offset: + break + matches.push(node) + if not matches and self.previous_toc_node: + matches.push(self.previous_toc_node) + ans = v'[]' + if matches: + ancestors = v'[]' + node = matches[-1] + parent = self.parent_map[node.id] + while parent?: + ancestors.push(parent) + parent = self.parent_map[parent.id] + if len(ancestors) > 1: + ancestors.pop() # root node + for v'var i = ancestors.length; i-- > 0;': + ans.push(ancestors[i]) + ans.push(node) + return ans + + class Worker: def __init__(self):