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 =

単位em

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

Returns:

  • (Boolean)


90
91
92
# File 'lib/narou.rb', line 90

def already_init?
  !!get_root_dir
end

.aozoraepub3_directory?(path) ⇒ Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/narou.rb', line 128

def aozoraepub3_directory?(path)
  File.exist?(create_aozoraepub3_jar_path(path))
end

.commit_versionObject



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

Returns:

  • (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_pathObject

AozoraEpub3 の実行ファイル(.jar)のフルパス取得 検索順序

  1. グローバルセッティング (global_setting aozoraepub3dir)

  2. 小説保存ディレクトリ(Narou.get_root_dir) 直下の AozoraEpub3

  3. スクリプト保存ディレクトリ(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_dirObject



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_dirObject



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_dirObject



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_dirObject



85
86
87
# File 'lib/narou.rb', line 85

def get_script_dir
  File.expand_path(File.join(File.dirname(__FILE__), ".."))
end

.get_themeObject



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_namesObject



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_patternObject



163
164
165
# File 'lib/narou.rb', line 163

def global_replace_pattern
  @@global_replace_pattern_pairs ||= load_global_replace_pattern
end

.global_setting_dirObject



73
74
75
76
77
78
79
80
81
82
# File 'lib/narou.rb', line 73

def global_setting_dir
  root_dir = get_root_dir
  if root_dir
    dir = File.join(root_dir, GLOBAL_SETTING_DIR_NAME)
    return dir if File.directory?(dir)
  end
  dir = File.expand_path(GLOBAL_SETTING_DIR_NAME, "~")
  FileUtils.mkdir(dir) unless File.exist?(dir)
  dir
end

.initObject



94
95
96
97
98
99
# File 'lib/narou.rb', line 94

def init
  return nil if already_init?
  FileUtils.mkdir(LOCAL_SETTING_DIR_NAME)
  puts "#{LOCAL_SETTING_DIR_NAME}/ を作成しました"
  Database.init
end

.kindlegen_pathObject



335
336
337
338
# File 'lib/narou.rb', line 335

def kindlegen_path
  postfix = Helper.os_windows? ? ".exe" : ""
  File.join(File.dirname(Narou.get_aozoraepub3_path), "kindlegen#{postfix}")
end

.last_commit_yearObject



39
40
41
# File 'lib/narou.rb', line 39

def last_commit_year
  2018
end

.latest_versionObject

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_heightObject



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_patternObject



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_dirObject



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

Returns:

  • (Boolean)


114
115
116
117
# File 'lib/narou.rb', line 114

def novel_frozen?(target)
  id = Downloader.get_id_by_target(target) or return false
  Inventory.load("freeze").include?(id)
end

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



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

Returns:

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