Passed
Push — master ( 63399a...705b0f )
by Yoshihiro
02:57
created

HighlightProcessingClass.line_highlight()   A

Complexity

Conditions 3

Size

Total Lines 25
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3

Importance

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