Test Failed
Push — master ( 705b0f...728f1f )
by Yoshihiro
03:24
created

neditor.hp   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 147
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 86
dl 0
loc 147
rs 10
c 0
b 0
f 0
wmc 12

5 Methods

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