|
import string |
|
|
|
INFINITE = 10000 |
|
|
|
|
|
class Paragraph: |
|
|
|
def __init__(self, xparagraph, doc_id: int, id_: int): |
|
|
|
self.xparagraph = xparagraph |
|
self.id_ = int(str(2) + str(doc_id) + str(id_)) |
|
style_name = self.xparagraph.style.name |
|
self.level = self.get_level_from_name(style_name) |
|
self.is_structure = self.level < INFINITE |
|
self.text = self.xparagraph.text |
|
self.type, self.parsed_text = self.parse_text() |
|
|
|
|
|
@property |
|
def structure(self): |
|
structure = {str(self.id_): { |
|
'index': str(self.id_), |
|
'canMove': True, |
|
'isFolder': False, |
|
'children': [], |
|
'title': self.text, |
|
'canRename': True, |
|
'data': {}, |
|
'level': self.level, |
|
}} |
|
return structure |
|
|
|
@property |
|
def blank(self): |
|
""" |
|
checks if the paragraph is blank: i.e. it brings some signal (it may otherwise be ignored) |
|
""" |
|
text = self.text.replace('\n', '') |
|
return set(text).isdisjoint(string.ascii_letters) |
|
|
|
@staticmethod |
|
def get_level_from_name(style_name: str) -> int: |
|
level = INFINITE |
|
if '.Titre' in style_name: |
|
suffix = style_name[-1] |
|
try: |
|
level = int(suffix) |
|
except: |
|
pass |
|
return level |
|
|
|
def parse_text(self) -> (str, str): |
|
|
|
if self.is_structure: |
|
return 'structure', self.text |
|
|
|
startswith = {"?? ": "task", "++ ": "comment"} |
|
for start in startswith.keys(): |
|
split = self.text.rsplit(start) |
|
if 1 < len(split): |
|
return startswith[start], split[1] |
|
|
|
return "normal", self.text |
|
|
|
def set_text(self, text: str): |
|
self.text = text |
|
self.xparagraph.text = text |
|
return self |
|
|
|
|
|
|