Passed
Push — master ( acaf9b...fbbf97 )
by Yoshihiro
44s queued 10s
created

HP   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 152
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 82
dl 0
loc 152
rs 10
c 0
b 0
f 0
wmc 12

5 Methods

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