File size: 1,851 Bytes
4cf88e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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