NovelEditor.HighlightProcessing   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 152
Duplicated Lines 0 %

Importance

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

5 Methods

Rating   Name   Duplication   Size   Complexity  
A HighlightProcessingClass.highlight() 0 30 3
A HighlightProcessingClass.line_highlight() 0 22 3
A HighlightProcessingClass.all_highlight() 0 13 2
A HighlightProcessingClass.__init__() 0 26 1
A HighlightProcessingClass.create_tags() 0 34 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
23
    def __init__(self, app, tokenizer, locale_var, master=None):
24
        super().__init__(locale_var, master)
25
        self.COLOR = [
26
            "sky blue",
27
            "yellow green",
28
            "gold",
29
            "salmon",
30
            "orange",
31
            "red",
32
            "hot pink",
33
            "dark orchid",
34
            "purple",
35
            "midnight blue",
36
            "light slate blue",
37
            "dodger blue",
38
            "dark turquoise",
39
            "cadet blue",
40
            "maroon",
41
            "tan1",
42
            "rosy brown",
43
            "indian red",
44
            "orange red",
45
            "violet red",
46
        ]
47
        self.app = app
48
        self.TOKENIZER = tokenizer
49
50
    def all_highlight(self):
51
        """全てハイライト.
52
53
        ・開く処理等の時にすべての行をハイライトする。
54
        """
55
        # 全てのテキストを取得
56
        src = self.app.NovelEditor.get("1.0", "end - 1c")
57
        # 全てのハイライトを一度解除する
58
        for tag in self.app.NovelEditor.tag_names():
59
            self.app.NovelEditor.tag_remove(tag, "1.0", "end")
60
61
        # ハイライトする
62
        self.highlight("1.0", src, "end")
63
64
    def line_highlight(self):
65
        """現在行だけハイライト.
66
67
        ・入力等の変更時に現在の行のみをハイライトする。
68
        """
69
        start = "insert linestart"
70
        end = "insert lineend"
71
        # 現在行のテキストを取得
72
        src = self.app.NovelEditor.get(start, end)
73
        # その行のハイライトを一度解除する
74
        for tag in self.app.NovelEditor.tag_names():
75
            self.app.NovelEditor.tag_remove(tag, start, end)
76
77
        # ハイライトする
78
        self.highlight(start, src, end)
79
        # 置換処理時に選択する
80
        if FindProcessing.FindProcessingClass.replacement_check:
81
            start = FindProcessing.FindProcessingClass.next_pos
82
            end = "{0} + {1}c".format(
83
                start, 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".format(len(content))
106
            )
107
            # 全角スペースの時はずらす
108
            if space_count > 0:
109
                self.app.NovelEditor.tag_add(
110
                    content,
111
                    "range_start+{0}c".format(space_count),
112
                    "range_end+{0}c".format(space_count),
113
                )
114
            else:
115
                self.app.NovelEditor.tag_add(content, "range_start", "range_end")
116
            self.app.NovelEditor.mark_set("range_start", "range_end")
117
118
    def create_tags(self):
119
        """タグの作成.
120
121
        ・キャラクターの名前をJanomeの形態素解析にかかるようにする。
122
        キャラクターの名前を色付きにする。
123
        """
124
        i = 0
125
        system_dic = "喜寛,固有名詞,ヨシヒロ"
126
        # キャラクターから一覧を作る。
127
        children = self.app.tree.get_children("data/character")
128
        for child in children:
129
            # ユーザー定義辞書の設定
130
            reading = ""
131
            childname = self.app.tree.item(child, "text")
132
            for token in self.TOKENIZER.tokenize(childname):
133
                reading += token.phonetic
134
            system_dic += "\n{0},固有名詞,{1}".format(childname, reading)
135
            # タグの作成
136
            self.app.NovelEditor.tag_configure(
137
                childname,
138
                foreground=self.COLOR[i % len(self.COLOR)],
139
                font=(
140
                    self.app.font,
141
                    ProcessingMenu.ProcessingMenuClass.font_size,
142
                    "bold",
143
                ),
144
            )
145
            i += 1
146
147
        with open("./userdic.csv", mode="w", encoding="utf-8") as f:
148
            f.write(system_dic)
149
150
        # Janomeを使って日本語の形態素解析
151
        self.t = Tokenizer("./userdic.csv", udic_type="simpledic", udic_enc="utf8")
152