Spaces:
Runtime error
Runtime error
| from .paragraph import Paragraph | |
| from .block import Block | |
| INFINITE = 99999 | |
| class Container: | |
| def __init__(self, paragraphs : [Paragraph], title : Paragraph=None, level: int = 0, index: [int] = None , father=None, id_ = 0): | |
| if index is None: | |
| index = [] | |
| self.level = level | |
| self.title = title | |
| self.paragraphs = [] | |
| self.children = [] | |
| self.index = index | |
| self.father = father | |
| self.id_ = int(str(1) + str(father.id_) + str(id_)) | |
| if paragraphs: | |
| self.paragraphs, self.children = self.create_children(paragraphs, level, index) | |
| self.containers = [self] | |
| for child in self.children: | |
| self.containers += child.containers | |
| self.blocks = self.get_blocks() | |
| def get_blocks(self): | |
| block = Block(level=self.level, index=self.index) | |
| if self.title: | |
| self.title.text = self.title.text.replace('\r', '').replace('\n', '') | |
| block.title = self.title.text | |
| block.content = self.title.text + '/' | |
| temp_father = self.father | |
| while temp_father and type(temp_father) == Container: | |
| if temp_father.title: | |
| temp_father.title.text = temp_father.title.text.replace('\r', '').replace('\n', '') | |
| block.content = temp_father.title.text + '/' + block.content | |
| temp_father = temp_father.father | |
| block.content += " :\n\n" | |
| i = 0 | |
| for p in self.paragraphs: | |
| if not p.blank: | |
| i = 1 | |
| block.content += p.text | |
| if i == 0: | |
| blocks = [] | |
| else: | |
| blocks = [block] | |
| for child in self.children: | |
| blocks += child.blocks | |
| return blocks | |
| def create_children(self, paragraphs, level, rank) -> ([], []): | |
| """ | |
| creates children containers or directly attached content | |
| and returns the list of containers and contents of level+1 | |
| :return: | |
| [Content or Container] | |
| """ | |
| attached_paragraphs = [] | |
| container_paragraphs = [] | |
| container_title = None | |
| children = [] | |
| in_children = False | |
| level = INFINITE | |
| child_id = 0 | |
| while paragraphs: | |
| p = paragraphs.pop(0) | |
| if not in_children and not p.is_structure: | |
| attached_paragraphs.append(p) | |
| else: | |
| in_children = True | |
| if p.blank: | |
| continue | |
| if p.is_structure and p.level <= level: # if p is higher or equal in hierarchy | |
| if container_paragraphs or container_title: | |
| children.append(Container(container_paragraphs, container_title, level, rank, self, child_id)) | |
| child_id += 1 | |
| container_paragraphs = [] | |
| container_title = p | |
| level = p.level | |
| else: # p is strictly lower in hierarchy | |
| container_paragraphs.append(p) | |
| if container_paragraphs or container_title: | |
| children.append(Container(container_paragraphs, container_title, level, rank, self, child_id)) | |
| child_id += 1 | |
| return attached_paragraphs, children | |
| def structure(self): | |
| self_structure = {str(self.id_): { | |
| 'index': str(self.id_), | |
| 'canMove': True, | |
| 'isFolder': True, | |
| 'children': [p.id_ for p in self.paragraphs] + [child.id_ for child in self.children], | |
| 'canRename': True, | |
| 'data': {}, | |
| 'level': self.level, | |
| 'rank': self.rank, | |
| 'title': self.title.text if self.title else 'root' | |
| }} | |
| paragraphs_structure = [p.structure for p in self.paragraphs] | |
| structure = [self_structure] + paragraphs_structure | |
| for child in self.children: | |
| structure += child.structure | |
| return structure |