Test Failed
Push — master ( b264b0...0ab505 )
by Yoshihiro
03:23
created

NovelEditor.HighlightProcessing   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 152
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 13
eloc 87
dl 0
loc 152
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A HighlightProcessingClass.highlight() 0 31 3
A HighlightProcessingClass.line_highlight() 0 23 3
A HighlightProcessingClass.all_highlight() 0 13 2
A HighlightProcessingClass.__init__() 0 26 1
A HighlightProcessingClass.create_tags() 0 33 4
1
#!/usr/bin/env python3
2
import re
3
4
from janome.tokenizer import Tokenizer
5
6
from . import ProcessingMenu
7
from . import FindProcessing
8
from . import Definition
9
10
11
class HighlightProcessingClass(Definition.DefinitionClass):
12
    """ハイライトのクラス.
13
14
    ・ハイライトするためのプログラム群
15
16
    Args:
17
        app (instance): MainProcessingClass のインスタンス
18
        tokenizer (instance): Tokenizer のインスタンス
19
        locale_var (str): ロケーション
20
        master (instance): toplevel のインスタンス
21
    """
22
    def __init__(self, app, tokenizer, locale_var, master=None):
23
        super().__init__(locale_var, master)
24
        self.COLOR = [
25
            'sky blue',
26
            'yellow green',
27
            'gold',
28
            'salmon',
29
            'orange',
30
            'red',
31
            'hot pink',
32
            'dark orchid',
33
            'purple',
34
            'midnight blue',
35
            'light slate blue',
36
            'dodger blue',
37
            'dark turquoise',
38
            'cadet blue',
39
            'maroon',
40
            'tan1',
41
            'rosy brown',
42
            'indian red',
43
            'orange red',
44
            'violet red'
45
        ]
46
        self.app = app
47
        self.TOKENIZER = tokenizer
48
49
    def all_highlight(self):
50
        """全てハイライト.
51
52
        ・開く処理等の時にすべての行をハイライトする。
53
        """
54
        # 全てのテキストを取得
55
        src = self.app.NovelEditor.get('1.0', 'end - 1c')
56
        # 全てのハイライトを一度解除する
57
        for tag in self.app.NovelEditor.tag_names():
58
            self.app.NovelEditor.tag_remove(tag, '1.0', 'end')
59
60
        # ハイライトする
61
        self.highlight('1.0', src, 'end')
62
63
    def line_highlight(self):
64
        """現在行だけハイライト.
65
66
        ・入力等の変更時に現在の行のみをハイライトする。
67
        """
68
        start = 'insert linestart'
69
        end = 'insert lineend'
70
        # 現在行のテキストを取得
71
        src = self.app.NovelEditor.get(start, end)
72
        # その行のハイライトを一度解除する
73
        for tag in self.app.NovelEditor.tag_names():
74
            self.app.NovelEditor.tag_remove(tag, start, end)
75
76
        # ハイライトする
77
        self.highlight(start, src, end)
78
        # 置換処理時に選択する
79
        if FindProcessing.FindProcessingClass.replacement_check:
80
            start = FindProcessing.FindProcessingClass.next_pos
81
            end = '{0} + {1}c'.format(
82
                start,
83
                len(FindProcessing.FindProcessingClass.find_text)
84
            )
85
            self.app.NovelEditor.tag_add('sel', start, end)
86
87
    def highlight(self, start, src, end):
88
        """ハイライトの共通処理.
89
90
        ・ハイライトする文字が見つかったらハイライト処理をする。
91
        先頭の文字が全角スペースならば、一文字ずらしてハイライトする。
92
93
        Args:
94
            start (str): はじめの位置 例.(1.0)
95
            src (str): ハイライトする文章
96
            end (str): 終わりの位置
97
        """
98
        self.create_tags()
99
        self.app.NovelEditor.mark_set('range_start', start)
100
        space_count = re.match(r"\u3000*", self.app.NovelEditor.get(start, end)).end()
101
        # 形態素解析を行う
102
        for token in self.t.tokenize(src):
103
            content = token.surface
104
            self.app.NovelEditor.mark_set(
105
                'range_end', 'range_start+{0}c'
106
                .format(len(content))
107
            )
108
            # 全角スペースの時はずらす
109
            if space_count > 0:
110
                self.app.NovelEditor.tag_add(
111
                    content,
112
                    'range_start+{0}c'.format(space_count),
113
                    'range_end+{0}c'.format(space_count)
114
                )
115
            else:
116
                self.app.NovelEditor.tag_add(content, 'range_start', 'range_end')
117
            self.app.NovelEditor.mark_set('range_start', 'range_end')
118
119
    def create_tags(self):
120
        """タグの作成.
121
122
        ・キャラクターの名前をJanomeの形態素解析にかかるようにする。
123
        キャラクターの名前を色付きにする。
124
        """
125
        i = 0
126
        system_dic = u"喜寛,固有名詞,ヨシヒロ"
127
        # キャラクターから一覧を作る。
128
        children = self.app.tree.get_children('data/character')
129
        for child in children:
130
            # ユーザー定義辞書の設定
131
            reading = ""
132
            childname = self.app.tree.item(child, "text")
133
            for token in self.TOKENIZER.tokenize(childname):
134
                reading += token.phonetic
135
            system_dic += u"\n{0},固有名詞,{1}".format(childname, reading)
136
            # タグの作成
137
            self.app.NovelEditor.tag_configure(
138
                childname,
139
                foreground=self.COLOR[i % len(self.COLOR)],
140
                font=(self.app.font, ProcessingMenu.ProcessingMenuClass.font_size, "bold")
141
            )
142
            i += 1
143
144
        with open("./userdic.csv", mode='w', encoding='utf-8') as f:
145
            f.write(system_dic)
146
147
        # Janomeを使って日本語の形態素解析
148
        self.t = Tokenizer(
149
            "./userdic.csv",
150
            udic_type="simpledic",
151
            udic_enc="utf8"
152
        )
153