Module: Narou
- Extended by:
- Memoist
- Defined in:
- lib/version.rb,
lib/input.rb,
lib/narou.rb,
lib/narou/api.rb,
lib/backtracer.rb,
lib/narou_logger.rb,
lib/web/pushserver.rb,
lib/web/streaminginput.rb,
lib/web/settingmessages.rb
Overview
Copyright 2013 whiteleaf. All rights reserved.
Defined Under Namespace
Modules: Backtracer, Eventable, Input, LoggerModule, ServerHelpers
Classes: API, AppServer, Logger, LoggerError, PushServer, StreamingLogger, Worker
Constant Summary
collapse
- LOCAL_SETTING_DIR_NAME =
".narou"
- GLOBAL_SETTING_DIR_NAME =
".narousetting"
- AOZORAEPUB3_JAR_NAME =
"AozoraEpub3.jar"
- AOZORAEPUB3_DIR =
"AozoraEpub3"
- PRESET_DIR =
"preset"
- MISC_DIR =
"misc"
- GLOBAL_REPLACE_NAME =
"replace.txt"
- EXIT_ERROR_CODE =
127
- EXIT_INTERRUPT =
126
- EXIT_REQUEST_REBOOT =
125
- MODIFIED_TAG =
"modified"
- LINE_HEIGHT_DEFAULT =
1.6
- UPDATE_SORT_KEYS =
{
"id" => "ID", "last_update" => "更新日", "title" => "タイトル", "author" => "作者名",
"new_arrivals_date" => "新着日", "general_lastup" => "最新話掲載日"
}
- VERSION =
"3.2.3"
- SETTING_VARIABLES_WEBUI_MESSAGES =
WEB UI > 環境設定画面で表示する各項目の説明 ここになければ元々の説明が表示される
{
"convert.multi-device" => "複数の端末用に同時に変換する。deviceよりも優先される。\nただのEPUBを出力したい場合はepubを指定",
"device" => "変換、送信対象の端末",
"difftool" => "Diffで使うツールのパスを指定する\n※WEB UIでは使われません",
"update.sort-by" => "アップデートを指定した項目順で行う",
"default.title_date_align" => "enable_add_date_to_title で付与する日付の位置",
"force.title_date_align" => "enable_add_date_to_title で付与する日付の位置",
"difftool.arg" => "difftoolで使う引数(指定しなければ単純に新旧ファイルを引数に呼び出す)\n" \
"特殊な変数\n" \
"<b>%NEW</b> : 最新データの差分用ファイルパス\n" \
"<b>%OLD</b> : 古い方の差分用ファイルパス",
"no-color" => "コンソールのカラー表示を無効にする\n※要WEB UIサーバ再起動",
"economy" => "容量節約に関する設定",
"send.without-freeze" => "一括送信時に凍結された小説は対象外にする。(個別送信時は凍結済みでも送信可能)",
"server-digest-auth.enable" => "WEBサーバでDigest認証を使用するかどうか\n" \
"※digest-auth関連の設定を変更した場合WEB UIサーバの再起動が必要",
"server-digest-auth.hashed-password" => "WEBサーバのDigest認証のパスワードを、Realmを\"narou.rb\"としてハッシュにしたもの。\n" \
"https://tgws.plus/app/digest/ などで生成できる",
}
- @@is_web =
false
Class Method Summary
collapse
Class Method Details
.alias_to_id(target) ⇒ Object
target が alias だった場合はIDに変換する
全てのtarget照合系はこのメソッドを通過するので、ここで小文字にしてしまう
106
107
108
109
110
111
112
|
# File 'lib/narou.rb', line 106
def alias_to_id(target)
aliases = Inventory.load("alias")
if aliases[target]
return aliases[target]
end
target.kind_of?(Numeric) ? target : target.downcase
end
|
.already_init? ⇒ Boolean
90
91
92
|
# File 'lib/narou.rb', line 90
def already_init?
!!get_root_dir
end
|
.aozoraepub3_directory?(path) ⇒ Boolean
128
129
130
|
# File 'lib/narou.rb', line 128
def aozoraepub3_directory?(path)
File.exist?(create_aozoraepub3_jar_path(path))
end
|
.commit_version ⇒ Object
329
330
331
332
|
# File 'lib/narou.rb', line 329
def commit_version
cv_path = File.expand_path("commitversion", get_script_dir)
File.read(cv_path) if File.exist?(cv_path)
end
|
.create_aozoraepub3_jar_path(*paths) ⇒ Object
124
125
126
|
# File 'lib/narou.rb', line 124
def create_aozoraepub3_jar_path(*paths)
File.expand_path(File.join(*paths, AOZORAEPUB3_JAR_NAME))
end
|
.create_novel_filename(novel_data, ext = "") ⇒ Object
書籍ファイル名を生成する convert.filename-to-ncode を設定している場合に novel_data に ncode、domain を 設定しない場合は id カラムが必須
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
|
# File 'lib/narou.rb', line 202
def create_novel_filename(novel_data, ext = "")
filename_to_ncode = Inventory.load("local_setting")["convert.filename-to-ncode"]
novel_setting =
if novel_data["id"]
NovelSetting.load(novel_data["id"])
else
OpenStruct.new
end
if novel_setting.output_filename.present?
%!#{novel_setting.output_filename}#{ext}!
elsif filename_to_ncode
ncode, domain = novel_data["ncode"], novel_data["domain"]
if !ncode || !domain
id = novel_data["id"]
unless id
raise ArgumentError, %!novel_data["id"] を設定して下さい!
end
site_setting = Downloader.get_sitesetting_by_target(id)
ncode = site_setting["ncode"]
domain = site_setting["domain"]
end
serialized_domain = domain.to_s.gsub(".", "_")
%!#{serialized_domain}_#{ncode}#{ext}!
else
author = Helper.replace_filename_special_chars(
novel_setting.novel_author.presence || novel_data["author"],
true
)
title = Helper.replace_filename_special_chars(
novel_setting.novel_title.presence || novel_data["title"],
true
)
"[#{author}] #{title}#{ext}"
end
end
|
.economy?(mode) ⇒ Boolean
307
308
309
310
|
# File 'lib/narou.rb', line 307
def economy?(mode)
eco_modes = Inventory.load("local_setting")["economy"].to_s.split(",").map(&:strip)
eco_modes.include?(mode)
end
|
.get_aozoraepub3_path ⇒ Object
AozoraEpub3 の実行ファイル(.jar)のフルパス取得 検索順序
-
グローバルセッティング (global_setting aozoraepub3dir)
-
小説保存ディレクトリ(Narou.get_root_dir) 直下の AozoraEpub3
-
スクリプト保存ディレクトリ(Narou.get_script_dir) 直下の AozoraEpub3
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
# File 'lib/narou.rb', line 179
def get_aozoraepub3_path
global_setting_aozora_path = Inventory.load("global_setting", :global)["aozoraepub3dir"]
if global_setting_aozora_path
aozora_jar_path = create_aozoraepub3_jar_path(global_setting_aozora_path)
if File.exist?(aozora_jar_path)
return aozora_jar_path
end
end
[Narou.get_root_dir, Narou.get_script_dir].each do |dir|
aozora_jar_path = create_aozoraepub3_jar_path(dir, AOZORAEPUB3_DIR)
if File.exist?(aozora_jar_path)
return aozora_jar_path
end
end
nil
end
|
.get_device(device_name = nil) ⇒ Object
267
268
269
270
271
272
273
|
# File 'lib/narou.rb', line 267
def get_device(device_name = nil)
device_name = Inventory.load("local_setting")["device"] unless device_name
if device_name && Device.exists?(device_name)
return Device.create(device_name)
end
nil
end
|
.get_ebook_file_paths(target, ext) ⇒ Object
242
243
244
245
246
247
248
249
|
# File 'lib/narou.rb', line 242
def get_ebook_file_paths(target, ext)
data = Downloader.get_data_by_target(target)
return nil unless data
dir = Downloader.get_novel_data_dir_by_target(target)
fname = create_novel_filename(data, ext)
base = File.basename(fname, ext)
get_ebook_file_paths_from_components(dir, base, ext)
end
|
.get_ebook_file_paths_from_components(dir, base, ext) ⇒ Object
251
252
253
254
255
256
257
258
259
|
# File 'lib/narou.rb', line 251
def get_ebook_file_paths_from_components(dir, base, ext)
paths = [File.join(dir, "#{base}#{ext}")]
index = 2
while File.exist?(path = File.join(dir, "#{base}_#{index}#{ext}"))
paths.push(path)
index += 1
end
paths
end
|
.get_misc_dir ⇒ Object
261
262
263
|
# File 'lib/narou.rb', line 261
def get_misc_dir
File.join(get_root_dir, MISC_DIR)
end
|
.get_mobi_paths(target) ⇒ Object
238
239
240
|
# File 'lib/narou.rb', line 238
def get_mobi_paths(target)
get_ebook_file_paths(target, ".mobi")
end
|
.get_preset_dir ⇒ Object
119
120
121
|
# File 'lib/narou.rb', line 119
def get_preset_dir
File.expand_path(File.join(get_script_dir, PRESET_DIR))
end
|
.get_root_dir ⇒ Object
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/narou.rb', line 43
def get_root_dir
root_dir = nil
path = Dir.pwd
drive_letter = ""
if Helper.os_windows?
path.encode!(Encoding::UTF_8)
path.gsub!(/^[a-z]:/i, "")
drive_letter = $&
end
while path != ""
if File.directory?("#{drive_letter}#{path}/#{LOCAL_SETTING_DIR_NAME}")
root_dir = drive_letter + path
break
end
path.gsub!(%r!/[^/]*$!, "")
end
root_dir
end
|
.get_script_dir ⇒ Object
85
86
87
|
# File 'lib/narou.rb', line 85
def get_script_dir
File.expand_path(File.join(File.dirname(__FILE__), ".."))
end
|
.get_theme ⇒ Object
291
292
293
|
# File 'lib/narou.rb', line 291
def get_theme
Inventory.load("local_setting")["webui.theme"]
end
|
.get_theme_dir(name = nil) ⇒ Object
295
296
297
|
# File 'lib/narou.rb', line 295
def get_theme_dir(name = nil)
File.join([get_script_dir, "lib/web/public/theme", name].compact)
end
|
.get_theme_names ⇒ Object
299
300
301
302
303
304
|
# File 'lib/narou.rb', line 299
def get_theme_names
Dir.glob(get_theme_dir("*")).map do |path|
name = File.basename(path)
name == "fonts" ? nil : name
end.compact
end
|
.global_replace_pattern ⇒ Object
163
164
165
|
# File 'lib/narou.rb', line 163
def global_replace_pattern
@@global_replace_pattern_pairs ||= load_global_replace_pattern
end
|
.global_setting_dir ⇒ Object
.last_commit_year ⇒ Object
39
40
41
|
# File 'lib/narou.rb', line 39
def last_commit_year
2018
end
|
.latest_version ⇒ Object
Narou.rb gem の最新バージョン番号を取得する
rubygems公式APIによる取得は、WindowsでのSSL証明書問題で取得出来ない 環境があるため、gemコマンド経由で取得する
322
323
324
325
326
327
|
# File 'lib/narou.rb', line 322
def latest_version
response = `gem search ^narou$`.split("\n")
if response.last =~ /\Anarou \(([0-9.]+).*?\)\z/
$1
end
end
|
.line_height ⇒ Object
341
342
343
344
|
# File 'lib/narou.rb', line 341
def line_height
global_setting = Inventory.load("global_setting", :global)
global_setting["line-height"] || LINE_HEIGHT_DEFAULT
end
|
.load_global_replace_pattern ⇒ Object
150
151
152
153
154
155
156
157
158
159
160
161
|
# File 'lib/narou.rb', line 150
def load_global_replace_pattern
path = File.join(get_root_dir, GLOBAL_REPLACE_NAME)
if File.exist?(path)
pairs = Helper::CacheLoader.memo(path) do |text|
parse_replace_txt(text)
end
else
pairs = []
end
@@global_replace_pattern_pairs = pairs
pairs
end
|
.local_setting_dir ⇒ Object
63
64
65
66
67
68
69
70
|
# File 'lib/narou.rb', line 63
def local_setting_dir
local_setting_dir = nil
root_dir = get_root_dir
if root_dir
local_setting_dir = File.join(root_dir, LOCAL_SETTING_DIR_NAME)
end
local_setting_dir
end
|
.novel_frozen?(target) ⇒ Boolean
.novel_type_text(type) ⇒ Object
312
313
314
|
# File 'lib/narou.rb', line 312
def novel_type_text(type)
type == 2 ? "短編" : "連載"
end
|
.parse_replace_txt(text) ⇒ Object
132
133
134
135
136
137
138
139
140
141
142
143
|
# File 'lib/narou.rb', line 132
def parse_replace_txt(text)
pattern = []
text.each_line do |line|
line.sub!(/[\r\n]+\z/, "")
next if line[0] == ";" pair = line.split("\t", 2)
if pair.length == 2 && pair[0]
pattern << pair
end
end
pattern
end
|
.save_global_replace_pattern ⇒ Object
167
168
169
170
|
# File 'lib/narou.rb', line 167
def save_global_replace_pattern
path = File.join(get_root_dir, GLOBAL_REPLACE_NAME)
write_replace_txt(path, @@global_replace_pattern_pairs)
end
|
.update_sort_key_summaries(left_space = 28) ⇒ Object
283
284
285
286
287
288
289
|
# File 'lib/narou.rb', line 283
def update_sort_key_summaries(left_space = 28)
summaries = { "KEY" => " 対象" }.merge(UPDATE_SORT_KEYS)
key_max_width = summaries.keys.max_by(&:length).length
summaries.map do |(key, summary)|
"#{" " * left_space}| #{key.center(key_max_width)} | #{summary}"
end.join("\n")
end
|
.web=(bool) ⇒ Object
275
276
277
|
# File 'lib/narou.rb', line 275
def web=(bool)
@@is_web = bool
end
|
.web? ⇒ Boolean
279
280
281
|
# File 'lib/narou.rb', line 279
def web?
@@is_web
end
|
.write_replace_txt(path, pairs) ⇒ Object
145
146
147
148
|
# File 'lib/narou.rb', line 145
def write_replace_txt(path, pairs)
buffer = pairs.each_with_object("\t").map(&:join).join("\n")
File.write(path, buffer)
end
|