Module: Narou

Extended by:
Memoist
Defined in:
lib/web/settingmessages.rb,
lib/input.rb,
lib/narou.rb,
lib/logger.rb,
lib/narou/api.rb,
lib/web/pushserver.rb,
lib/web/streaminginput.rb

Overview

Copyright 2013 whiteleaf. All rights reserved.

Defined Under Namespace

Modules: 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"
UPDATE_SORT_KEYS =
{
  "id" => "ID", "last_update" => "更新日", "title" => "タイトル", "author" => "作者名",
  "new_arrivals_date" => "新着日", "general_lastup" => "最新話掲載日"
}
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" => "一括送信時に凍結された小説は対象外にする。(個別送信時は凍結済みでも送信可能)"
}
@@is_web =
false

Class Method Summary collapse

Class Method Details

.alias_to_id(target) ⇒ Object

target が alias だった場合はIDに変換する

全てのtarget照合系はこのメソッドを通過するので、ここで小文字にしてしまう



104
105
106
107
108
109
110
# File 'lib/narou.rb', line 104

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)


88
89
90
# File 'lib/narou.rb', line 88

def already_init?
  !!get_root_dir
end

.aozoraepub3_directory?(path) ⇒ Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/narou.rb', line 126

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

.commit_versionObject



302
303
304
305
# File 'lib/narou.rb', line 302

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



122
123
124
# File 'lib/narou.rb', line 122

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 カラムが必須



200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/narou.rb', line 200

def create_novel_filename(novel_data, ext = "")
  filename_to_ncode = Inventory.load("local_setting")["convert.filename-to-ncode"]
  if 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, title = %w(author title).map { |k|
      Helper.replace_filename_special_chars(novel_data[k], true)
    }
    "[#{author}] #{title}#{ext}"
  end
end

.economy?(mode) ⇒ Boolean

Returns:

  • (Boolean)


280
281
282
283
# File 'lib/narou.rb', line 280

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



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/narou.rb', line 177

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



240
241
242
243
244
245
246
# File 'lib/narou.rb', line 240

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_path(target, ext) ⇒ Object



227
228
229
230
231
232
# File 'lib/narou.rb', line 227

def get_ebook_file_path(target, ext)
  data = Downloader.get_data_by_target(target)
  return nil unless data
  dir = Downloader.get_novel_data_dir_by_target(target)
  File.join(dir, create_novel_filename(data, ext))
end

.get_misc_dirObject



234
235
236
# File 'lib/narou.rb', line 234

def get_misc_dir
  File.join(get_root_dir, MISC_DIR)
end

.get_mobi_path(target) ⇒ Object



223
224
225
# File 'lib/narou.rb', line 223

def get_mobi_path(target)
  get_ebook_file_path(target, ".mobi")
end

.get_preset_dirObject



117
118
119
# File 'lib/narou.rb', line 117

def get_preset_dir
  File.expand_path(File.join(get_script_dir, PRESET_DIR))
end

.get_root_dirObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/narou.rb', line 41

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



83
84
85
# File 'lib/narou.rb', line 83

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

.get_themeObject



264
265
266
# File 'lib/narou.rb', line 264

def get_theme
  Inventory.load("local_setting")["theme"]
end

.get_theme_dir(name = nil) ⇒ Object



268
269
270
# File 'lib/narou.rb', line 268

def get_theme_dir(name = nil)
  File.join([get_script_dir, "lib/web/public/theme", name].compact)
end

.get_theme_namesObject



272
273
274
275
276
277
# File 'lib/narou.rb', line 272

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



161
162
163
# File 'lib/narou.rb', line 161

def global_replace_pattern
  @@global_replace_pattern_pairs ||= load_global_replace_pattern
end

.global_setting_dirObject



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

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



92
93
94
95
96
97
# File 'lib/narou.rb', line 92

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

.kindlegen_pathObject



308
309
310
311
# File 'lib/narou.rb', line 308

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

.last_commit_yearObject



37
38
39
# File 'lib/narou.rb', line 37

def last_commit_year
  2016
end

.latest_versionObject

Narou.rb gem の最新バージョン番号を取得する

rubygems公式APIによる取得は、WindowsでのSSL証明書問題で取得出来ない 環境があるため、gemコマンド経由で取得する



295
296
297
298
299
300
# File 'lib/narou.rb', line 295

def latest_version
  response = `gem search ^narou$`.split("\n")
  if response.last =~ /\Anarou \((.+?)\)\z/
    $1
  end
end

.load_global_replace_patternObject



148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/narou.rb', line 148

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



61
62
63
64
65
66
67
68
# File 'lib/narou.rb', line 61

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)


112
113
114
115
# File 'lib/narou.rb', line 112

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



285
286
287
# File 'lib/narou.rb', line 285

def novel_type_text(type)
  type == 2 ? "短編" : "連載"
end

.parse_replace_txt(text) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/narou.rb', line 130

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



165
166
167
168
# File 'lib/narou.rb', line 165

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



256
257
258
259
260
261
262
# File 'lib/narou.rb', line 256

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



248
249
250
# File 'lib/narou.rb', line 248

def web=(bool)
  @@is_web = bool
end

.web?Boolean

Returns:

  • (Boolean)


252
253
254
# File 'lib/narou.rb', line 252

def web?
  @@is_web
end

.write_replace_txt(path, pairs) ⇒ Object



143
144
145
146
# File 'lib/narou.rb', line 143

def write_replace_txt(path, pairs)
  buffer = pairs.each_with_object("\t").map(&:join).join("\n")
  File.write(path, buffer)
end