Loading src/coliverter/steps/md_to_html.py +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ def _get_table_of_contents(document: Pandoc) -> BulletList: offset = 1 if document_type == DocumentType.MEETING_MINUTES else 0 table_of_contents = make_toc( (level, content) for (level, attrs, content) in headers[offset:] Node(level, content) for (level, attrs, content) in headers[offset:] ) def make_bullet_list(node: Node[list[Block]]) -> BulletList: Loading src/coliverter/toc/Node.py +10 −31 Original line number Diff line number Diff line Loading @@ -9,38 +9,17 @@ class Node[T]: level: int | float content: T | None parent: Node[T] | None = field(repr=False) children: list[Node[T]] = field(default_factory=list) parent: Node[T] | None = field(default=None, repr=False, init=False) children: list[Node[T]] = field(default_factory=list, init=False) def can_nurse_at(self, level: int) -> bool: """Return if the given level is greater than one's own level, i.e., if content with this level could be a child of this node. """ return level > self.level def _nurse(self, level: int, content: T) -> Node[T]: """ Append the given content with the given level as child of this node, without looking at the level. You probably want to use `append` instead, which takes care of inserting at the correct level (and doesn't just mindlessly append whatever you give it). """ node = Node(level, content, self) def append(self, node: Node[T]) -> Node[T]: if node.level > self.level: self.children.append(node) node.parent = self return node def append(self, level: int, content: T) -> Node[T]: """ If this node can nurse this entry (consisting of a level and content), nurse it. Otherwise, find a parent among this node's parents who can nurse the entry. :return: the newly nursed node """ if self.can_nurse_at(level): return self._nurse(level, content) else: return self.parent.append(level, content) return self.parent.append(node) @classmethod def new_root(cls) -> Node[T]: return cls(-inf, None, None) return cls(-inf, None) src/coliverter/toc/make_toc.py +3 −7 Original line number Diff line number Diff line from collections.abc import Iterable from functools import reduce from coliverter.toc.Node import Node type Level = int type Entry[T] = tuple[Level, T] def make_toc[T](entries: Iterable[Entry[T]]) -> Node[T]: def make_toc[T](nodes: Iterable[Node[T]]) -> Node[T]: root = Node.new_root() prime_possible_parent = root for entry in entries: prime_possible_parent = prime_possible_parent.append(*entry) reduce(Node.append, nodes, root) return root uv.lock +1 −1 Original line number Diff line number Diff line Loading @@ -104,7 +104,7 @@ wheels = [ [[package]] name = "coliverter" version = "0.3.3" version = "0.3.4" source = { editable = "." } dependencies = [ { name = "pandoc" }, Loading Loading
src/coliverter/steps/md_to_html.py +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ def _get_table_of_contents(document: Pandoc) -> BulletList: offset = 1 if document_type == DocumentType.MEETING_MINUTES else 0 table_of_contents = make_toc( (level, content) for (level, attrs, content) in headers[offset:] Node(level, content) for (level, attrs, content) in headers[offset:] ) def make_bullet_list(node: Node[list[Block]]) -> BulletList: Loading
src/coliverter/toc/Node.py +10 −31 Original line number Diff line number Diff line Loading @@ -9,38 +9,17 @@ class Node[T]: level: int | float content: T | None parent: Node[T] | None = field(repr=False) children: list[Node[T]] = field(default_factory=list) parent: Node[T] | None = field(default=None, repr=False, init=False) children: list[Node[T]] = field(default_factory=list, init=False) def can_nurse_at(self, level: int) -> bool: """Return if the given level is greater than one's own level, i.e., if content with this level could be a child of this node. """ return level > self.level def _nurse(self, level: int, content: T) -> Node[T]: """ Append the given content with the given level as child of this node, without looking at the level. You probably want to use `append` instead, which takes care of inserting at the correct level (and doesn't just mindlessly append whatever you give it). """ node = Node(level, content, self) def append(self, node: Node[T]) -> Node[T]: if node.level > self.level: self.children.append(node) node.parent = self return node def append(self, level: int, content: T) -> Node[T]: """ If this node can nurse this entry (consisting of a level and content), nurse it. Otherwise, find a parent among this node's parents who can nurse the entry. :return: the newly nursed node """ if self.can_nurse_at(level): return self._nurse(level, content) else: return self.parent.append(level, content) return self.parent.append(node) @classmethod def new_root(cls) -> Node[T]: return cls(-inf, None, None) return cls(-inf, None)
src/coliverter/toc/make_toc.py +3 −7 Original line number Diff line number Diff line from collections.abc import Iterable from functools import reduce from coliverter.toc.Node import Node type Level = int type Entry[T] = tuple[Level, T] def make_toc[T](entries: Iterable[Entry[T]]) -> Node[T]: def make_toc[T](nodes: Iterable[Node[T]]) -> Node[T]: root = Node.new_root() prime_possible_parent = root for entry in entries: prime_possible_parent = prime_possible_parent.append(*entry) reduce(Node.append, nodes, root) return root
uv.lock +1 −1 Original line number Diff line number Diff line Loading @@ -104,7 +104,7 @@ wheels = [ [[package]] name = "coliverter" version = "0.3.3" version = "0.3.4" source = { editable = "." } dependencies = [ { name = "pandoc" }, Loading