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
|
|
|
|