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

NovelEditor.HP   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 146
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 82
dl 0
loc 146
ccs 50
cts 50
cp 1
rs 10
c 0
b 0
f 0
wmc 12

5 Methods

Rating   Name   Duplication   Size   Complexity  
A HighlightProcessingClass.all_highlight() 0 13 2
A HighlightProcessingClass.highlight() 0 31 3
A HighlightProcessingClass.create_tags() 0 32 3
A HighlightProcessingClass.__init__() 0 25 1
A HighlightProcessingClass.line_highlight() 0 25 3
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