File size: 5,103 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import RGBColor


class Styles:

    def __init__(self, xstyles, doc_id=0, id_=0):

        self.id_ = int(str(doc_id)+str(id_))
        self.xstyles = xstyles
        self.names = [s.name for s in xstyles]

    @staticmethod
    def copy_style(src=None, dest=None) -> {}:
        modified_style = set()
        if src.type == WD_STYLE_TYPE.PARAGRAPH:
            same_color = True
            if src.font.color.rgb:
                dest_rgb = RGBColor(src.font.color.rgb[0], src.font.color.rgb[1], src.font.color.rgb[2])
                if dest.font.color.rgb:
                    for i in range(3):
                        same_color *= dest.font.color.rgb[i] == dest_rgb[i]
                else:
                    same_color = False
                dest.font.color.rgb = dest_rgb
            else:
                if dest.font.color.rgb:
                    same_color = False
            if not same_color:
                modified_style.add(('color', True))

            if dest.font.size != src.font.size:
                dest.font.size = src.font.size
                modified_style.add(('font size', (src.font.size, dest.font.size)))

            if dest.font.name != src.font.name:
                dest.font.name = src.font.name
                modified_style.add(('font', (src.font.name, dest.font.name)))

            if dest.font.all_caps != src.font.all_caps:
                dest.font.all_caps = src.font.all_caps
                modified_style.add(('all_caps', (src.font.all_caps, dest.font.all_caps)))

            if dest.font.bold != src.font.bold:
                dest.font.bold = src.font.bold
                modified_style.add(('bold', (src.font.bold, dest.font.bold)))

            dest.font.complex_script = src.font.complex_script
            dest.font.cs_bold = src.font.cs_bold
            dest.font.cs_italic = src.font.cs_italic
            dest.font.double_strike = src.font.double_strike
            dest.font.emboss = src.font.emboss
            dest.font.hidden = src.font.hidden
            dest.font.highlight_color = src.font.highlight_color
            dest.font.imprint = src.font.imprint
            dest.font.italic = src.font.italic
            dest.font.math = src.font.math
            dest.font.no_proof = src.font.no_proof
            dest.font.outline = src.font.outline
            dest.font.rtl = src.font.rtl
            dest.font.shadow = src.font.shadow
            dest.font.small_caps = src.font.small_caps
            dest.font.snap_to_grid = src.font.snap_to_grid
            dest.font.spec_vanish = src.font.spec_vanish
            dest.font.strike = src.font.strike
            dest.font.subscript = src.font.subscript
            dest.font.superscript = src.font.superscript
            dest.font.underline = src.font.underline
            dest.font.web_hidden = src.font.web_hidden
            dest.base_style = src.base_style
            dest.hidden = src.hidden
            dest.locked = src.locked
            dest.name = src.name
            dest.priority = src.priority
            dest.quick_style = src.quick_style
            dest.unhide_when_used = src.unhide_when_used
        return modified_style

    def apply_from(self, template_styles):

        log = {'suppressed_styles': [], 'modified_styles': [], 'added_styles': []}

        for s in self.xstyles:
            if s.name not in template_styles.names:
                log['suppressed_styles'].append(s.name)
                s.delete()
            else:
                src_style = template_styles.get_style_from_name(s.name)
                log_s = self.copy_style(src=src_style, dest=s)
                if log_s:
                    log['modified_styles'].append((s.name, log_s))

        for s in template_styles.xstyles:
            if not self.contains_style(s):
                log['added_styles'].append(s.name)
                self.xstyles.add_style(s.name, s.type)
                self.copy_style(src=s, dest=self.xstyles[s.name])
        return log

    def get_different_styles(self, other_styles) -> [str]:
        different_styles_names = [s.name for s in self.xstyles if s.name not in other_styles.names]
        return different_styles_names

    def copy_one_style(self, src_style, dest_style) -> {}:
        log_msg = \
            f"le style {src_style.name} a été mappé sur le style {dest_style.name} du template"
        log_dict = {'style_mapping': log_msg}
        self.copy_style(src_style, dest_style)
        return log_dict

    def get_style_from_name(self, name: str):
        try:
            s = self.xstyles[name]
        except:
            try:
                s = self.xstyles[name[1:]]
            except:
                s = self.get_style_from_name(self.names[0])
                print('??')
        return s

    def contains_style(self, style):
        resp = True
        try:
            s = self.xstyles[style.name]
        except:
            try:
                s = self.xstyles[style.name[1:]]
            except:
                resp = False
        return resp